auto-sync: 2026-06-01 18:42:49

This commit is contained in:
cfdaily
2026-06-01 18:42:49 +08:00
parent 711665c56b
commit 08dcb305e0
2 changed files with 64 additions and 101 deletions
+30 -28
View File
@@ -229,7 +229,7 @@ class Dispatcher:
_dispatcher = self
_is_review = action_type == "review"
# v2.8.1 Fix-2: 明确需要回退 current_agent 的 outcome
# #07.2: executor/review 统一 crash 回退
ROLLBACK_CURRENT_AGENT_OUTCOMES = frozenset({
"crashed", "compact_failed", "process_crash",
"session_stuck", "compact_hanging",
@@ -237,35 +237,19 @@ class Dispatcher:
def _task_on_complete(aid, outcome):
try:
# #07.2: 统一 crash 回退——executor 和 review 都回退 current_agent
if outcome in ROLLBACK_CURRENT_AGENT_OUTCOMES and _task_db:
_dispatcher._rollback_current_agent(_task_db, _task_id, aid)
if _is_review:
# 审查 Agent 完成 > 检查 outcome
# 只有正常完成才标 donecrash/error 保持 review
if _task_db:
if outcome in ("completed", "session_revived"):
_dispatcher._mark_task_status(_task_db, _task_id, "done")
logger.info("Task %s: review complete (%s), marking done", _task_id, outcome)
else:
logger.warning("Task %s: review agent %s (%s), NOT marking done", _task_id, aid, outcome)
# v2.8.1 Fix-2: crash 后回退 current_agent,避免 exclude_current 卡死
if outcome in ROLLBACK_CURRENT_AGENT_OUTCOMES:
try:
conn = get_connection(_task_db)
try:
conn.execute(
"UPDATE tasks SET current_agent = "
"(SELECT assignee FROM tasks WHERE id=?) "
"WHERE id=? AND current_agent=?",
(_task_id, _task_id, aid)
)
conn.commit()
finally:
conn.close()
logger.info("Task %s: rolled back current_agent from %s to assignee",
_task_id, aid)
except Exception as e:
logger.warning("Task %s: failed to rollback current_agent: %s",
_task_id, e)
# review: 正常完成标 donecrash/error 保持 review 等 ticker 处理
if _task_db and outcome in ("completed", "session_revived"):
_dispatcher._mark_task_status(_task_db, _task_id, "done")
logger.info("Task %s: review complete (%s), marking done", _task_id, outcome)
else:
logger.warning("Task %s: review agent %s (%s), NOT marking done", _task_id, aid, outcome)
else:
# executor: 三信号验证 → 标 review
_dispatcher._task_auto_complete(_task_id, _task_db)
except Exception as e:
logger.error("Task %s: on_complete error: %s", _task_id, e)
@@ -772,6 +756,24 @@ class Dispatcher:
logger.error("Task %s: verify error: %s", task_id, e)
return True
def _rollback_current_agent(self, db_path: Path, task_id: str, agent_id: str) -> None:
"""#07.2: crash 后回退 current_agent 到 assignee,避免 exclude_current 卡死"""
try:
conn = get_connection(db_path)
try:
conn.execute(
"UPDATE tasks SET current_agent = "
"(SELECT assignee FROM tasks WHERE id=?) "
"WHERE id=? AND current_agent=?",
(task_id, task_id, agent_id)
)
conn.commit()
finally:
conn.close()
logger.info("Task %s: rolled back current_agent from %s to assignee", task_id, agent_id)
except Exception as e:
logger.warning("Task %s: failed to rollback current_agent: %s", task_id, e)
def _mark_task_status(self, db_path: Path, task_id: str, status: str) -> None:
"""更新任务状态 + 写审计事件"""
try: