From 95a423f03c598bd9a18aa5001397ebbb57d6f4d5 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Fri, 22 May 2026 13:38:15 +0800 Subject: [PATCH] auto-sync: 2026-05-22 13:38:15 --- src/daemon/spawner.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/daemon/spawner.py b/src/daemon/spawner.py index aaab7ba..50e8228 100644 --- a/src/daemon/spawner.py +++ b/src/daemon/spawner.py @@ -452,7 +452,7 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ agent_id, session_id, outcome, exit_code, task_status) if cls["release_counter"]: - self._do_on_complete(on_complete, agent_id, outcome) + await self._do_on_complete_async(on_complete, agent_id, outcome) elif cls["should_retry"]: # 续杯:不 release counter,直接再 spawn await self._do_retry( @@ -484,7 +484,7 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ agent_id, session_id) self._mark_task(db_path, task_id, "failed", {"reason": "session_stuck", "diagnostics": state}) - self._do_on_complete(on_complete, agent_id, "session_stuck") + self._do_on_complete_async(on_complete, agent_id, "session_stuck") return # B2/B3/B4: 进程还活着 @@ -498,7 +498,7 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ "elapsed_seconds": monitor_timeout_count * int(self.agent_timeout), "diagnostics": state, }) - self._do_on_complete(on_complete, agent_id, "max_monitor_timeouts") + self._do_on_complete_async(on_complete, agent_id, "max_monitor_timeouts") return # 未超限:继续等(不 release counter) @@ -524,7 +524,7 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ self._mark_task(db_path, task_id, "failed", { "reason": f"max_{retry_field}", "count": count, }) - self._do_on_complete(on_complete, agent_id, "max_retries") + self._do_on_complete_async(on_complete, agent_id, "max_retries") return logger.info("Agent %s retry %s=%d/%d (session=%s)", @@ -557,7 +557,7 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ ) except Exception: logger.exception("Retry spawn failed for %s", agent_id) - self._do_on_complete(on_complete, agent_id, "retry_spawn_failed") + self._do_on_complete_async(on_complete, agent_id, "retry_spawn_failed") # ── 辅助方法 ── @@ -824,6 +824,7 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ outcome: str, exit_code: Optional[int] = None, error: Optional[str] = None, + metadata: Optional[dict] = None, ) -> None: """记录 task_attempt""" if not task_id or not self.db_path: @@ -833,20 +834,21 @@ curl -X POST http://{api_host}:{api_port}/api/projects/{project_id}/tasks/{task_ conn = get_connection(self.db_path) try: conn.execute("BEGIN IMMEDIATE") - # 获取 attempt_number row = conn.execute( "SELECT MAX(attempt_number) as max_a FROM task_attempts WHERE task_id=?", (task_id,), ).fetchone() attempt_number = (row["max_a"] or 0) + 1 - metadata = {"error": error} if error else {} + meta = metadata or {} + if error: + meta["error"] = error conn.execute( "INSERT INTO task_attempts " "(task_id, attempt_number, agent, outcome, exit_code, metadata, completed_at) " "VALUES (?,?,?,?,?,?,datetime('now'))", (task_id, attempt_number, agent_id, outcome, - exit_code, json.dumps(metadata)), + exit_code, json.dumps(meta)), ) conn.execute( "INSERT INTO events (task_id, agent, event_type, detail) VALUES (?,?,?,?)",