feat: 更新消息处理逻辑,仅接受带有匹配 subagent_task_id 的消息
This commit is contained in:
parent
ea6fabe41d
commit
9f2eedf313
@ -459,12 +459,13 @@ async fn handle_inbound(
|
|||||||
}
|
}
|
||||||
// 加载子智能体任务消息
|
// 加载子智能体任务消息
|
||||||
if let Some(task_session_id) = response.metadata.get("task_session_id") {
|
if let Some(task_session_id) = response.metadata.get("task_session_id") {
|
||||||
if let Err(e) = send_task_messages(&store, task_session_id, sender).await {
|
// 提前提取 task_id,用于给历史消息打标记
|
||||||
|
let task_id = response.metadata.get("task_id").cloned().unwrap_or_default();
|
||||||
|
if let Err(e) = send_task_messages(&store, task_session_id, sender, Some(task_id.clone())).await {
|
||||||
tracing::warn!(error = %e, task_session_id = %task_session_id, "Failed to send task messages");
|
tracing::warn!(error = %e, task_session_id = %task_session_id, "Failed to send task messages");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送 TaskMessagesLoaded 元数据
|
// 发送 TaskMessagesLoaded 元数据
|
||||||
let task_id = response.metadata.get("task_id").cloned().unwrap_or_default();
|
|
||||||
let description = response.metadata.get("task_description").cloned().unwrap_or_default();
|
let description = response.metadata.get("task_description").cloned().unwrap_or_default();
|
||||||
let subagent_type = response.metadata.get("task_subagent_type").cloned().unwrap_or_default();
|
let subagent_type = response.metadata.get("task_subagent_type").cloned().unwrap_or_default();
|
||||||
let status = response.metadata.get("task_status").cloned().unwrap_or_default();
|
let status = response.metadata.get("task_status").cloned().unwrap_or_default();
|
||||||
@ -496,7 +497,7 @@ async fn handle_inbound(
|
|||||||
&load_chat_channel,
|
&load_chat_channel,
|
||||||
load_chat_id,
|
load_chat_id,
|
||||||
);
|
);
|
||||||
if let Err(e) = send_task_messages(&store, &session_id, sender).await {
|
if let Err(e) = send_task_messages(&store, &session_id, sender, None).await {
|
||||||
tracing::warn!(
|
tracing::warn!(
|
||||||
error = %e,
|
error = %e,
|
||||||
channel = %load_chat_channel,
|
channel = %load_chat_channel,
|
||||||
@ -591,13 +592,19 @@ async fn send_task_messages(
|
|||||||
store: &Arc<crate::storage::SessionStore>,
|
store: &Arc<crate::storage::SessionStore>,
|
||||||
session_id: &str,
|
session_id: &str,
|
||||||
sender: &mpsc::Sender<WsOutbound>,
|
sender: &mpsc::Sender<WsOutbound>,
|
||||||
|
subagent_task_id: Option<String>,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let messages = store.load_messages(session_id)?;
|
let messages = store.load_messages(session_id)?;
|
||||||
|
|
||||||
tracing::info!(session_id = %session_id, message_count = messages.len(), "Sending task messages");
|
tracing::info!(session_id = %session_id, message_count = messages.len(), "Sending task messages");
|
||||||
|
|
||||||
for msg in messages {
|
for msg in messages {
|
||||||
let outbound = chat_message_to_ws_outbound(&msg);
|
let mut outbound = chat_message_to_ws_outbound(&msg);
|
||||||
|
if let Some(ref task_id) = subagent_task_id {
|
||||||
|
if let Some(ref mut ob) = outbound {
|
||||||
|
set_subagent_task_id(ob, task_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(outbound) = outbound {
|
if let Some(outbound) = outbound {
|
||||||
let _ = sender.send(outbound).await;
|
let _ = sender.send(outbound).await;
|
||||||
}
|
}
|
||||||
@ -606,6 +613,27 @@ async fn send_task_messages(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 给 WsOutbound 消息注入 subagent_task_id(仅对有该字段的变体生效)
|
||||||
|
fn set_subagent_task_id(outbound: &mut WsOutbound, task_id: &str) {
|
||||||
|
match outbound {
|
||||||
|
WsOutbound::AssistantResponse {
|
||||||
|
subagent_task_id, ..
|
||||||
|
}
|
||||||
|
| WsOutbound::ToolCall {
|
||||||
|
subagent_task_id, ..
|
||||||
|
}
|
||||||
|
| WsOutbound::ToolResult {
|
||||||
|
subagent_task_id, ..
|
||||||
|
}
|
||||||
|
| WsOutbound::ToolPending {
|
||||||
|
subagent_task_id, ..
|
||||||
|
} => {
|
||||||
|
*subagent_task_id = Some(task_id.to_string());
|
||||||
|
}
|
||||||
|
_ => {} // 其他变体没有 subagent_task_id 字段
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// 将 ChatMessage 转换为 WsOutbound
|
/// 将 ChatMessage 转换为 WsOutbound
|
||||||
fn chat_message_to_ws_outbound(msg: &crate::bus::ChatMessage) -> Option<WsOutbound> {
|
fn chat_message_to_ws_outbound(msg: &crate::bus::ChatMessage) -> Option<WsOutbound> {
|
||||||
use crate::bus::message::ToolMessageState;
|
use crate::bus::message::ToolMessageState;
|
||||||
|
|||||||
@ -251,11 +251,11 @@ export function useChat(): UseChatReturn {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route messages to sub-agent view:
|
// Only accept messages explicitly tagged with matching subagent_task_id.
|
||||||
// - Messages without subagent_task_id = loaded history, always accept
|
// History messages are now tagged by the backend (send_task_messages),
|
||||||
// - Messages with subagent_task_id = live emitter, only accept if matching
|
// and live sub-agent messages are tagged by SubAgentEmitter.
|
||||||
const msgSubagentTaskId = getSubagentTaskId(message)
|
const msgSubagentTaskId = getSubagentTaskId(message)
|
||||||
if (!msgSubagentTaskId || msgSubagentTaskId === currentSubAgentView.taskId) {
|
if (msgSubagentTaskId && msgSubagentTaskId === currentSubAgentView.taskId) {
|
||||||
appendToSubAgentViewMessage(message)
|
appendToSubAgentViewMessage(message)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user