auto-sync: 2026-05-22 13:38:15
This commit is contained in:
+10
-8
@@ -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 (?,?,?,?)",
|
||||
|
||||
Reference in New Issue
Block a user