diff --git a/nanobot/agent/subagent.py b/nanobot/agent/subagent.py index e64dc8f97..8b9463b89 100644 --- a/nanobot/agent/subagent.py +++ b/nanobot/agent/subagent.py @@ -114,6 +114,7 @@ class SubagentManager: origin_channel: str = "cli", origin_chat_id: str = "direct", session_key: str | None = None, + origin_message_id: str | None = None, ) -> str: """Spawn a subagent to execute a task in the background.""" task_id = str(uuid.uuid4())[:8] @@ -129,7 +130,7 @@ class SubagentManager: self._task_statuses[task_id] = status bg_task = asyncio.create_task( - self._run_subagent(task_id, task, display_label, origin, status) + self._run_subagent(task_id, task, display_label, origin, status, origin_message_id) ) self._running_tasks[task_id] = bg_task if session_key: @@ -155,6 +156,7 @@ class SubagentManager: label: str, origin: dict[str, str], status: SubagentStatus, + origin_message_id: str | None = None, ) -> None: """Execute the subagent task and announce the result.""" logger.info("Subagent [{}] starting task: {}", task_id, label) @@ -224,24 +226,24 @@ class SubagentManager: await self._announce_result( task_id, label, task, self._format_partial_progress(result), - origin, "error", + origin, "error", origin_message_id, ) elif result.stop_reason == "error": await self._announce_result( task_id, label, task, result.error or "Error: subagent execution failed.", - origin, "error", + origin, "error", origin_message_id, ) else: final_result = result.final_content or "Task completed but no final response was generated." logger.info("Subagent [{}] completed successfully", task_id) - await self._announce_result(task_id, label, task, final_result, origin, "ok") + await self._announce_result(task_id, label, task, final_result, origin, "ok", origin_message_id) except Exception as e: status.phase = "error" status.error = str(e) logger.error("Subagent [{}] failed: {}", task_id, e) - await self._announce_result(task_id, label, task, f"Error: {e}", origin, "error") + await self._announce_result(task_id, label, task, f"Error: {e}", origin, "error", origin_message_id) async def _announce_result( self, @@ -251,6 +253,7 @@ class SubagentManager: result: str, origin: dict[str, str], status: str, + origin_message_id: str | None = None, ) -> None: """Announce the subagent result to the main agent via the message bus.""" status_text = "completed successfully" if status == "ok" else "failed" @@ -269,16 +272,19 @@ class SubagentManager: # routed to the correct pending queue (mid-turn injection) instead of # being dispatched as a competing independent task. override = origin.get("session_key") or f"{origin['channel']}:{origin['chat_id']}" + metadata: dict[str, Any] = { + "injected_event": "subagent_result", + "subagent_task_id": task_id, + } + if origin_message_id: + metadata["origin_message_id"] = origin_message_id msg = InboundMessage( channel="system", sender_id="subagent", chat_id=f"{origin['channel']}:{origin['chat_id']}", content=announce_content, session_key_override=override, - metadata={ - "injected_event": "subagent_result", - "subagent_task_id": task_id, - }, + metadata=metadata, ) await self.bus.publish_inbound(msg)