diff --git a/extensions/telegram/src/channel-actions.ts b/extensions/telegram/src/channel-actions.ts index a0351aaac62..8cb8ac43934 100644 --- a/extensions/telegram/src/channel-actions.ts +++ b/extensions/telegram/src/channel-actions.ts @@ -214,7 +214,11 @@ export const telegramMessageActions: ChannelMessageActionAdapter = { if (action === "delete") { const chatId = readTelegramChatIdParam(params); + const hasMessageIdParam = Object.hasOwn(params, "messageId"); const messageId = readTelegramMessageIdParam(params, { required: false }); + if (hasMessageIdParam && typeof messageId !== "number") { + throw new Error("messageId must be a valid number for action=delete."); + } if (typeof messageId === "number") { return await handleTelegramAction( { diff --git a/src/channels/plugins/actions/actions.test.ts b/src/channels/plugins/actions/actions.test.ts index 21f1e720e0e..45b35ac7738 100644 --- a/src/channels/plugins/actions/actions.test.ts +++ b/src/channels/plugins/actions/actions.test.ts @@ -869,6 +869,29 @@ describe("telegramMessageActions", () => { expect(handleTelegramAction).not.toHaveBeenCalled(); }); + it("rejects invalid delete messageId instead of falling back to topic deletion", async () => { + const cfg = telegramCfg(); + const handleAction = telegramMessageActions.handleAction; + if (!handleAction) { + throw new Error("telegram handleAction unavailable"); + } + + await expect( + handleAction({ + channel: "telegram", + action: "delete", + params: { + to: "-1001234567890", + messageId: "oops", + topicId: 271, + }, + cfg, + }), + ).rejects.toThrow(/messageId must be a valid number for action=delete/i); + + expect(handleTelegramAction).not.toHaveBeenCalled(); + }); + it("rejects topic-delete when threadId/topicId is missing", async () => { const cfg = telegramCfg(); const handleAction = telegramMessageActions.handleAction;