From a40f57fb22bfa6b35c742b1d083810a0f21007b9 Mon Sep 17 00:00:00 2001 From: oudecheng <13802883547@139.com> Date: Thu, 25 Jun 2026 14:10:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B3=A8=E5=86=8C=20save=5Ftopic=20?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8=E5=B9=B6=E4=BC=98=E5=8C=96=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E6=B6=88=E6=81=AF=E6=B8=B2=E6=9F=93=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gateway/ws.rs | 7 +++++++ web/src/components/Chat/MessageBubble.tsx | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/gateway/ws.rs b/src/gateway/ws.rs index 5f5bba1..0cb8d85 100644 --- a/src/gateway/ws.rs +++ b/src/gateway/ws.rs @@ -21,6 +21,7 @@ use crate::command::handlers::load_chat_messages::LoadChatMessagesCommandHandler use crate::command::handlers::load_task_messages::LoadTaskMessagesCommandHandler; use crate::command::handlers::load_topic::LoadTopicCommandHandler; use crate::command::handlers::save_session::SaveSessionCommandHandler; +use crate::command::handlers::save_topic::SaveTopicCommandHandler; use crate::command::handlers::session::SessionCommandHandler; use crate::command::handlers::stop_execution::StopExecutionCommandHandler; use crate::command::handlers::switch_topic::SwitchTopicCommandHandler; @@ -411,6 +412,12 @@ async fn handle_inbound( state.task_repository.clone(), system_prompt_provider.clone(), ))); + // 注册 save_topic 处理器 + router.register(Box::new(SaveTopicCommandHandler::new( + store.clone(), + state.task_repository.clone(), + system_prompt_provider.clone(), + ).with_session_manager(state.session_manager.clone()))); // 注册 delete_topic 处理器 router.register(Box::new( DeleteTopicCommandHandler::new(store.clone()) diff --git a/web/src/components/Chat/MessageBubble.tsx b/web/src/components/Chat/MessageBubble.tsx index e780ab6..e75d69a 100644 --- a/web/src/components/Chat/MessageBubble.tsx +++ b/web/src/components/Chat/MessageBubble.tsx @@ -606,8 +606,9 @@ export function MessageBubble({ message, onNavigateToSubAgent, showThinking = tr ) } - // 隐藏思考且无实质内容时,不渲染空的助手消息气泡 - if (!isUser && !isTool && !isMergedTool && !showThinking && !message.content.trim() && message.reasoningContent) { + // 隐藏无可见内容的助手消息(无文本,且无思考或思考被关闭) + const hasVisibleContent = !!(message.content && message.content.trim()) || (showThinking && message.reasoningContent) + if (!isUser && !isTool && !isMergedTool && !hasVisibleContent) { return null }