From 80819ad1506fdafb359d31c3efe6ab35b4c4e008 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Mon, 10 Nov 2025 19:31:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(message=5Fmanager):=20=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=85=9C=E5=BA=95=E4=BF=9D?= =?UTF-8?q?=E6=8A=A4=E4=BB=A5=E7=A1=AE=E4=BF=9D=E6=89=80=E6=9C=89=E6=9C=AA?= =?UTF-8?q?=E8=AF=BB=E6=B6=88=E6=81=AF=E8=A2=AB=E6=A0=87=E8=AE=B0=E4=B8=BA?= =?UTF-8?q?=E5=B7=B2=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/message_manager/message_manager.py | 27 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/chat/message_manager/message_manager.py b/src/chat/message_manager/message_manager.py index 12f22468a..609d203aa 100644 --- a/src/chat/message_manager/message_manager.py +++ b/src/chat/message_manager/message_manager.py @@ -436,7 +436,11 @@ class MessageManager: logger.error(f"清除未读消息时发生错误: {e}") async def clear_stream_unread_messages(self, stream_id: str): - """清除指定聊天流的所有未读消息""" + """清除指定聊天流的所有未读消息 + + 此方法会标记剩余的未读消息为已读(移到历史),作为兜底保护。 + 正常情况下,action_manager 应该已经标记了所有消息,这里只是确保没有遗漏。 + """ try: chat_manager = get_chat_manager() chat_stream = await chat_manager.get_stream(stream_id) @@ -446,10 +450,25 @@ class MessageManager: context = chat_stream.context_manager.context if hasattr(context, "unread_messages") and context.unread_messages: - logger.debug(f"正在为流 {stream_id} 清除 {len(context.unread_messages)} 条未读消息") - context.unread_messages.clear() + unread_count = len(context.unread_messages) + + # 如果还有未读消息,说明 action_manager 可能遗漏了,标记它们 + if unread_count > 0: + logger.debug(f"🧹 [兜底清理] stream={stream_id[:8]}, 发现 {unread_count} 条剩余未读消息,标记为已读") + + # 获取所有未读消息的 ID + message_ids = [msg.message_id for msg in context.unread_messages] + + # 标记为已读(会移到历史消息) + success = chat_stream.context_manager.mark_messages_as_read(message_ids) + + if success: + logger.debug(f"✅ [兜底清理] stream={stream_id[:8]}, 成功标记 {unread_count} 条消息为已读") + else: + logger.warning(f"⚠️ [兜底清理] stream={stream_id[:8]}, 标记失败,直接清空") + context.unread_messages.clear() else: - logger.debug(f"流 {stream_id} 没有需要清除的未读消息") + logger.debug(f"流 {stream_id[:8]} 没有剩余未读消息,无需清理") except Exception as e: logger.error(f"清除流 {stream_id} 的未读消息时发生错误: {e}")