diff --git a/src/daemon/spawner.py b/src/daemon/spawner.py index 89f9d3d..824b75c 100644 --- a/src/daemon/spawner.py +++ b/src/daemon/spawner.py @@ -188,9 +188,13 @@ class AgentSpawner: message: str, new_session: bool = False, task_id: Optional[str] = None, + on_complete: Optional[Any] = None, ) -> str: """Spawn Full Agent(异步非阻塞) + Args: + on_complete: async callback(agent_id, outcome) — Agent 完成后调用 + Returns: session_id """ @@ -221,7 +225,8 @@ class AgentSpawner: # Schedule timeout + cleanup asyncio.create_task( - self._monitor_process(session_id, proc, agent_id, task_id) + self._monitor_process(session_id, proc, agent_id, task_id, + on_complete=on_complete) ) return session_id @@ -259,6 +264,7 @@ class AgentSpawner: proc: asyncio.subprocess.Process, agent_id: str, task_id: Optional[str], + on_complete: Optional[Any] = None, ) -> None: """监控子进程,超时 kill,完成后记录""" try: @@ -283,6 +289,14 @@ class AgentSpawner: logger.info("Agent %s finished (session=%s, outcome=%s, exit=%d)", agent_id, session_id, outcome, exit_code) + # 完成回调(释放 counter 等) + if on_complete: + try: + await on_complete(agent_id, outcome) + except Exception: + logger.warning("on_complete callback failed for %s", + agent_id, exc_info=True) + def _register_session( self, session_id: str,