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";
@@ -84,7 +84,6 @@ console.log(JSON.stringify({ apiVersion: manifest.apiVersion, kind: manifest.kin
(error) => error instanceof Error && error.message.includes("not pending"),
);
await client.patch(`/api/v1/commands/${dispatched.command.id}/status`, { terminalStatus: "completed", failureKind: null, failureMessage: null });
await client.patch(`/api/v1/runs/${dispatched.run.id}/status`, { terminalStatus: "completed", failureKind: null, failureMessage: null });
const refreshed = await client.post(`/api/v1/queue/tasks/${created.id}/refresh`, {}) as QueueTaskRecord;
assert.equal(refreshed.state, "completed");
assert.equal(refreshed.latestAttempt?.state, "completed");