diff --git a/adapters/feishu/index.ts b/adapters/feishu/index.ts index 3fac0f9a..a688a8b3 100644 --- a/adapters/feishu/index.ts +++ b/adapters/feishu/index.ts @@ -333,6 +333,16 @@ async function handleServerMessage(chatId: string, msg: ServerMessage): Promise< case 'message_complete': await buf.complete() + // Ensure state is always cleaned up even if buffer was already empty + if (state.replyMessageId) { + const text = accumulatedText.get(chatId) + if (text?.trim()) { + await patchMessage(state.replyMessageId, text) + } + accumulatedText.delete(chatId) + chatStates.delete(chatId) + buffers.get(chatId)?.reset() + } break case 'error': diff --git a/adapters/telegram/index.ts b/adapters/telegram/index.ts index 3fc62385..b6fc8c11 100644 --- a/adapters/telegram/index.ts +++ b/adapters/telegram/index.ts @@ -236,6 +236,22 @@ async function handleServerMessage(chatId: string, msg: ServerMessage): Promise< case 'message_complete': await buf.complete() + // Ensure placeholder is always cleaned up even if buffer was already empty + if (placeholders.has(chatId)) { + const text = accumulatedText.get(chatId) + if (text?.trim()) { + try { + const chunks = splitMessage(text, TELEGRAM_TEXT_LIMIT) + await bot.api.editMessageText(numericChatId, placeholders.get(chatId)!.messageId, chunks[0]!) + for (let i = 1; i < chunks.length; i++) { + await bot.api.sendMessage(numericChatId, chunks[i]!) + } + } catch { /* ignore */ } + } + placeholders.delete(chatId) + accumulatedText.delete(chatId) + buffers.get(chatId)?.reset() + } break case 'error':