From b56105f608e1999cc0190d53d55a20686c5017bd Mon Sep 17 00:00:00 2001 From: thejavadude Date: Wed, 18 Mar 2026 20:48:56 -0400 Subject: [PATCH 1/2] fix: prevent ghost media from debounce buffer flatMap When multiple messages arrive within the debounce window, the flush handler was using entries.flatMap(e => e.allMedia) which merged media from ALL buffered entries. This caused images from a previous photo message to ghost-attach to subsequent text-only messages. Fix: Use only the last entry's allMedia, matching how last.ctx is already used as the authoritative context for the flushed message. Fixes #46655 --- extensions/telegram/src/bot-handlers.buffers.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/telegram/src/bot-handlers.buffers.ts b/extensions/telegram/src/bot-handlers.buffers.ts index 41dcee18aa4..5089a7c5cdc 100644 --- a/extensions/telegram/src/bot-handlers.buffers.ts +++ b/extensions/telegram/src/bot-handlers.buffers.ts @@ -305,8 +305,11 @@ export function createTelegramInboundBufferRuntime(params: { const combinedText = entries .map((entry) => entry.msg.text ?? entry.msg.caption ?? "") .filter(Boolean) - .join("\n"); - const combinedMedia = entries.flatMap((entry) => entry.allMedia); + .join(" +"); + // Fix: only use last entry's media to prevent ghost attachments from debounce buffer + // See: https://github.com/openclaw/openclaw/issues/46655 + const combinedMedia = entries.at(-1)?.allMedia ?? []; if (!combinedText.trim() && combinedMedia.length === 0) { return; } From ffd6b65651159706422f5c90e106ec9d0698b8de Mon Sep 17 00:00:00 2001 From: thejavadude Date: Wed, 18 Mar 2026 20:49:43 -0400 Subject: [PATCH 2/2] fix: apply same ghost media fix to runtime handler --- extensions/telegram/src/bot-handlers.runtime.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/telegram/src/bot-handlers.runtime.ts b/extensions/telegram/src/bot-handlers.runtime.ts index e3a9be85d18..acb7538c200 100644 --- a/extensions/telegram/src/bot-handlers.runtime.ts +++ b/extensions/telegram/src/bot-handlers.runtime.ts @@ -227,7 +227,9 @@ export const registerTelegramHandlers = ({ .map((entry) => entry.msg.text ?? entry.msg.caption ?? "") .filter(Boolean) .join("\n"); - const combinedMedia = entries.flatMap((entry) => entry.allMedia); + // Fix: only use last entry's media to prevent ghost attachments from debounce buffer + // See: https://github.com/openclaw/openclaw/issues/46655 + const combinedMedia = entries.at(-1)?.allMedia ?? []; if (!combinedText.trim() && combinedMedia.length === 0) { return; }