fix: preserve task stop intent and guard remote execution boundaries

This commit is contained in:
Xin Wang
2026-10-23 19:53:17 +08:00
parent 8ac75a1873
commit 89c3bad58e
16 changed files with 199 additions and 20 deletions
@@ -51,11 +51,11 @@ class OpenCodeExecutor:
item.get("info", {}).get("parentID") == handle["message_id"]]
errors = [item["info"]["error"] for item in matched if item["info"].get("error")]
if errors:
return {"status": "failed", "summary": "远端执行失败", "result": json.dumps(errors[-1], ensure_ascii=False)[:8000]}
return {"status": "failed", "summary": "远端执行失败", "result": json.dumps(errors, ensure_ascii=False)}
completed = [item for item in matched if item["info"].get("time", {}).get("completed")]
if remote_status.get("type") == "idle" and completed:
text = "\n".join(part.get("text", "") for item in completed for part in item.get("parts", []) if part.get("type") == "text")
return {"status": "succeeded", "summary": "任务已完成", "result": text[-16000:]}
return {"status": "succeeded", "summary": "任务已完成", "result": text}
return {"status": "running", "summary": "远端任务执行中", "result": ""}
async def snapshot(self, handle: dict) -> dict:
+1 -1
View File
@@ -60,7 +60,7 @@ class TaskRepository:
return from_row(row) if row else None
async def list(self, assistant_id: str | None = None, *, active=False) -> list[TaskRecord]:
statement = select(BackgroundTask).order_by(BackgroundTask.created_at.desc())
statement = select(BackgroundTask).order_by(BackgroundTask.status.in_(ACTIVE).desc(), BackgroundTask.created_at.desc())
if not active:
statement = statement.limit(100)
if assistant_id:
@@ -101,10 +101,17 @@ class TaskService:
task_id = message.payload["task_id"]
self._jobs[message.job_id] = task_id
record = await self.get(task_id)
if record.status == "cancel_requested":
await self._stop_record(record)
return {"task_id": task_id}
executor = self.executor_factory(record.connection, record.secrets)
resume = bool(record.remote_handle)
try:
if not resume:
outstanding = await self.repository.list(active=True)
if any(other.id != task_id and other.remote_handle for other in outstanding):
await self.repository.patch(task_id, status="failed", summary="另一远端任务尚未结束,请先核查或停止该任务;本任务未提交到远端")
return {"task_id": task_id}
handle = await executor.prepare()
record = await self.repository.patch(task_id, remote_handle=handle)
last_event = None