diff --git a/src/daemon/dispatcher.py b/src/daemon/dispatcher.py index 82d30f9..cc35ebb 100644 --- a/src/daemon/dispatcher.py +++ b/src/daemon/dispatcher.py @@ -433,17 +433,14 @@ class Dispatcher: return "pangtong-fujunshi" async def _legacy_dispatch(self, task, action_type="", project_config=None): - """旧版 dispatch(兼容过渡用)""" + """旧版 dispatch(兼容过渡用) + + v2.7.2: counter acquire/release 移到 spawn_full_agent 内部。 + """ decision = self._legacy_decide(task, action_type) level = decision["level"] agent_id = decision["agent_id"] - if self.counter and level in (DispatchLevel.FULL_AGENT, DispatchLevel.ESCALATE): - if not await self.counter.can_acquire(agent_id): - return {"level": level.value, "agent_id": agent_id, - "session_id": None, "status": "skipped", - "reason": "Agent busy (concurrent limit)"} - if level == DispatchLevel.LOCAL: return {"level": level.value, "agent_id": "daemon", "session_id": None, "status": "dispatched", @@ -455,16 +452,11 @@ class Dispatcher: "session_id": None, "status": "error", "reason": "No spawner configured"} try: - if self.counter: - await self.counter.acquire(agent_id) - # [v2.7.1] Mail: spawn 前系统标 working is_mail_legacy = project_config.get("project_id") == "_mail" if project_config else False if is_mail_legacy: db_path_legacy = Path(project_config["db_path"]) if project_config and "db_path" in project_config else None if not db_path_legacy or not self._mail_auto_working(task.id, db_path_legacy): - if self.counter: - self.counter.release(agent_id) return {"level": level.value, "agent_id": agent_id, "session_id": None, "status": "error", "reason": "mail_auto_working_failed"} @@ -484,28 +476,21 @@ class Dispatcher: ) else: message = f"Task: {task.title}" - # [v2.7.1] Mail: on_complete 增强 + + # v2.7.2: on_complete 只含业务逻辑 on_complete_legacy = None if is_mail_legacy: _t_id = task.id - _a_id = agent_id _m_db = db_path_legacy _m_mh = task.must_haves or "" - _ct = self.counter _disp = self def _mail_oc_legacy(aid, outcome): - if _ct: - _ct.release(aid) try: _disp._mail_auto_complete(_t_id, aid, _m_db, _m_mh) except Exception as e: logger.error("Mail %s: legacy on_complete error: %s", _t_id, e) on_complete_legacy = _mail_oc_legacy - else: - on_complete_legacy = ( - lambda aid, _outcome: self.counter.release(aid) - ) if self.counter else None session_id = await self.spawner.spawn_full_agent( agent_id=agent_id, message=message, @@ -518,9 +503,11 @@ class Dispatcher: return {"level": level.value, "agent_id": agent_id, "session_id": session_id, "status": "dispatched", "reason": decision["reason"]} + except AgentBusyError: + return {"level": level.value, "agent_id": agent_id, + "session_id": None, "status": "skipped", + "reason": "Agent busy (concurrent limit or cooling down)"} except Exception as e: - if self.counter: - self.counter.release(agent_id) return {"level": level.value, "agent_id": agent_id, "session_id": None, "status": "error", "reason": str(e)}