fix: Queue refresh 按 command 终态收敛

This commit is contained in:
Codex
2026-06-02 00:40:54 +08:00
parent 159b99e763
commit f34312c424
2 changed files with 6 additions and 4 deletions
+6 -3
View File
@@ -1,5 +1,5 @@
import { AgentRunError } from "../common/errors.js";
import type { CreateRunInput, JsonRecord, JsonValue, QueueAttemptRef, QueueDispatchResult, QueueTaskRecord, QueueTaskState, RunRecord } from "../common/types.js";
import type { CommandRecord, CreateRunInput, JsonRecord, JsonValue, QueueAttemptRef, QueueDispatchResult, QueueTaskRecord, QueueTaskState, RunRecord } from "../common/types.js";
import { asRecord } from "../common/validation.js";
import type { AgentRunStore } from "./store.js";
import { isTerminalQueueTaskState } from "./store.js";
@@ -66,7 +66,7 @@ export async function refreshQueueTaskFromCore(store: AgentRunStore, taskId: str
if (!latestAttempt?.runId || !latestAttempt.commandId) throw new AgentRunError("schema-invalid", `queue task ${taskId} has no Core attempt to refresh`, { httpStatus: 409 });
const [run, command] = await Promise.all([store.getRun(latestAttempt.runId), store.getCommand(latestAttempt.commandId)]);
if (command.runId !== run.id) throw new AgentRunError("schema-invalid", `queue task ${taskId} attempt references mismatched run and command`, { httpStatus: 409 });
const state = queueStateFromRun(run);
const state = queueStateFromCore(run, command);
const sessionId = run.sessionRef?.sessionId ?? latestAttempt.sessionId ?? null;
const sessionPath = sessionId ? `/api/v1/sessions/${encodeURIComponent(sessionId)}` : latestAttempt.sessionPath ?? null;
const nextAttempt: QueueAttemptRef = { ...latestAttempt, state, sessionId, sessionPath };
@@ -81,7 +81,10 @@ function assertDispatchable(task: QueueTaskRecord): void {
if (!task.executionPolicy) throw new AgentRunError("schema-invalid", "queue dispatch requires executionPolicy", { httpStatus: 400 });
}
function queueStateFromRun(run: RunRecord): QueueTaskState {
function queueStateFromCore(run: RunRecord, command: CommandRecord): QueueTaskState {
if (command.state === "completed") return "completed";
if (command.state === "failed") return "failed";
if (command.state === "cancelled") return "cancelled";
if (run.status === "completed") return "completed";
if (run.status === "failed") return "failed";
if (run.status === "blocked") return "blocked";