diff --git a/src/tools/task/runtime.rs b/src/tools/task/runtime.rs index e111dac..8e3192f 100644 --- a/src/tools/task/runtime.rs +++ b/src/tools/task/runtime.rs @@ -342,7 +342,7 @@ impl DefaultSubAgentRuntime { sender_id: None, chat_id: Some(session.parent_chat_id.clone()), session_id: Some(session.session_id.clone()), - topic_id: None, + topic_id: session.parent_topic_id.clone(), message_id: None, message_seq: None, subagent_description: Some(session.description.clone()), diff --git a/src/tools/todo_write.rs b/src/tools/todo_write.rs index 1656be6..6195e48 100644 --- a/src/tools/todo_write.rs +++ b/src/tools/todo_write.rs @@ -328,11 +328,17 @@ impl Tool for TodoWriteTool { // ── 辅助函数 ────────────────────────────────────────────── -/// 计算 scope_key:优先 topic_id,否则 session_id +/// 计算 scope_key: +/// - 主代理 (nesting_depth == 0):优先 topic_id,否则 session_id +/// - 子/孙代理 (nesting_depth > 0):使用 session_id 隔离,避免污染父代理 todo pub(crate) fn scope_key_from_context(context: &ToolContext) -> Option { - let tid = context.topic_id.as_deref().filter(|t| !t.is_empty()); - let sid = context.session_id.as_deref().filter(|s| !s.is_empty()); - tid.or(sid).map(str::to_string) + if context.nesting_depth > 0 { + context.session_id.clone().filter(|s| !s.is_empty()) + } else { + let tid = context.topic_id.as_deref().filter(|t| !t.is_empty()); + let sid = context.session_id.as_deref().filter(|s| !s.is_empty()); + tid.or(sid).map(str::to_string) + } } /// 校验状态转换合法性