From 433cf95d71b261b574d02fa6511d306ea05ba6bd Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 25 Aug 2026 07:20:39 -0700 Subject: [PATCH] fix(telegram): preserve sent replies when required pins fail (#129342) --- .../telegram/src/bot/delivery.replies.ts | 4 ++++ extensions/telegram/src/bot/delivery.test.ts | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/extensions/telegram/src/bot/delivery.replies.ts b/extensions/telegram/src/bot/delivery.replies.ts index 33c7b388399e..fc62c7ef879b 100644 --- a/extensions/telegram/src/bot/delivery.replies.ts +++ b/extensions/telegram/src/bot/delivery.replies.ts @@ -588,6 +588,9 @@ async function maybePinFirstDeliveredMessage(params: { disable_notification: !notify, }); } catch (err) { + if (typeof params.pin === "object" && params.pin.required === true) { + throw err; + } logVerbose( `telegram pinChatMessage failed chat=${params.chatId} message=${params.firstDeliveredMessageId}: ${formatErrorMessage(err)}`, ); @@ -912,6 +915,7 @@ export async function deliverReplies(params: { replyToId, replyToMode: params.replyToMode, progress, + acceptedMessageIds, recordMessageId, onPlatformSendDispatch: params.onPlatformSendDispatch, }); diff --git a/extensions/telegram/src/bot/delivery.test.ts b/extensions/telegram/src/bot/delivery.test.ts index c39bf8e67351..8cbd98f4b01b 100644 --- a/extensions/telegram/src/bot/delivery.test.ts +++ b/extensions/telegram/src/bot/delivery.test.ts @@ -3121,6 +3121,25 @@ describe("deliverReplies", () => { expect(pinChatMessage).toHaveBeenCalledTimes(1); }); + it("preserves accepted text delivery when a required pin fails", async () => { + const sendMessage = vi.fn().mockResolvedValue({ message_id: 201, chat: { id: "123" } }); + const pinChatMessage = vi.fn().mockRejectedValue(new Error("pin failed")); + + await expect( + deliverWith({ + replies: [{ text: "hello", delivery: { pin: { enabled: true, required: true } } }], + runtime: createRuntime(), + bot: createBot({ sendMessage, pinChatMessage }), + }), + ).rejects.toMatchObject({ + code: "CHANNEL_PARTIAL_DELIVERY", + deliveryResult: { messageIds: ["201"], visibleReplySent: true }, + }); + + expect(sendMessage).toHaveBeenCalledTimes(1); + expect(pinChatMessage).toHaveBeenCalledTimes(1); + }); + it("rethrows VOICE_MESSAGES_FORBIDDEN when no text fallback is available", async () => { const { runtime, sendVoice, sendMessage, bot } = createVoiceFailureHarness({ voiceError: createVoiceMessagesForbiddenError(),