fix: keep events wait while a command is active

This commit is contained in:
AgentRun Codex
2026-07-15 06:55:39 +02:00
parent 73f987e4a5
commit c564b4b47c
2 changed files with 14 additions and 2 deletions
+2 -2
View File
@@ -1484,12 +1484,12 @@ async function waitForEventsPage(input: { store: AgentRunStore; runId: string; a
input.store.countEvents(input.runId, input.afterSeq),
input.store.listCommands(input.runId, 0, 500),
]);
const latestCommand = commands.at(-1) ?? null;
const allCommandsTerminal = commands.length > 0 && commands.every((command) => isTerminalCommandState(command.state));
let completionReason: "expect-reached" | "run-terminal" | "command-terminal" | "timeout" | null = null;
let timedOut = false;
if (observed >= input.expect) completionReason = "expect-reached";
else if (isTerminalRunStatus(run.status)) completionReason = "run-terminal";
else if (latestCommand !== null && isTerminalCommandState(latestCommand.state)) completionReason = "command-terminal";
else if (allCommandsTerminal) completionReason = "command-terminal";
else if (Date.now() >= deadline) {
completionReason = "timeout";
timedOut = true;
+12
View File
@@ -90,6 +90,18 @@ async function assertEventsLongPolling(client: ManagerClient, store: MemoryAgent
assert.equal(commandPage.timedOut, false);
assert.equal(commandPage.completionReason, "command-terminal");
const mixedCommandRun = createLongPollRun(store, "memory-mixed-command-state");
store.createCommand(mixedCommandRun.id, { type: "turn", payload: { prompt: "still active" }, idempotencyKey: "memory-active-command" });
const completedCommand = store.createCommand(mixedCommandRun.id, { type: "steer", payload: { prompt: "completed steer" }, idempotencyKey: "memory-completed-steer" });
store.finishCommand(completedCommand.id, { terminalStatus: "completed", failureKind: null, failureMessage: null });
const mixedAfterSeq = store.listEvents(mixedCommandRun.id, 0, 500).at(-1)?.seq ?? 0;
const mixedWait = client.get(`/api/v1/runs/${encodeURIComponent(mixedCommandRun.id)}/events?afterSeq=${mixedAfterSeq}&expect=1&timeoutMs=1000&limit=20`) as Promise<JsonRecord>;
setTimeout(() => store.appendEvent(mixedCommandRun.id, "backend_status", { phase: "active-command-still-running" }), 10);
const mixedPage = await mixedWait;
assert.equal(mixedPage.timedOut, false);
assert.equal(mixedPage.observed, 1);
assert.equal(mixedPage.completionReason, "expect-reached");
const runTerminal = createLongPollRun(store, "memory-run-terminal");
const runAfterSeq = store.listEvents(runTerminal.id, 0, 500).at(-1)?.seq ?? 0;
const runWait = client.get(`/api/v1/runs/${encodeURIComponent(runTerminal.id)}/events?afterSeq=${runAfterSeq}&expect=10&timeoutMs=1000&limit=20`) as Promise<JsonRecord>;