fix(codex): keep run lane timeout progress-aware

This commit is contained in:
Peter Steinberger
2026-05-16 14:12:35 +01:00
parent a641a27bd4
commit 21c5f8dc6d
7 changed files with 134 additions and 6 deletions

View File

@@ -63,6 +63,7 @@ type QueueEntry = {
enqueuedAt: number;
warnAfterMs: number;
taskTimeoutMs?: number;
taskTimeoutProgressAtMs?: () => number | undefined;
onWait?: (waitMs: number, queuedAhead: number) => void;
};
@@ -210,14 +211,33 @@ async function runQueueEntryTask(lane: string, entry: QueueEntry): Promise<unkno
return await taskPromise;
}
const startedAtMs = Date.now();
const readLastProgressAtMs = () => {
let value: number | undefined;
try {
value = entry.taskTimeoutProgressAtMs?.();
} catch (err) {
diag.warn(`lane task timeout progress callback failed: lane=${lane} error="${String(err)}"`);
}
return typeof value === "number" && Number.isFinite(value) && value > 0
? Math.max(startedAtMs, Math.floor(value))
: startedAtMs;
};
let timeoutHandle: ReturnType<typeof setTimeout> | undefined;
let timedOut = false;
const timeoutPromise = new Promise<never>((_, reject) => {
timeoutHandle = setTimeout(() => {
timedOut = true;
reject(new CommandLaneTaskTimeoutError(lane, taskTimeoutMs));
}, taskTimeoutMs);
timeoutHandle.unref?.();
const armTimeout = () => {
const elapsedMs = Math.max(0, Date.now() - readLastProgressAtMs());
const remainingMs = taskTimeoutMs - elapsedMs;
if (remainingMs <= 0) {
timedOut = true;
reject(new CommandLaneTaskTimeoutError(lane, taskTimeoutMs));
return;
}
timeoutHandle = setTimeout(armTimeout, remainingMs);
timeoutHandle.unref?.();
};
armTimeout();
});
try {
@@ -349,6 +369,7 @@ export function enqueueCommandInLane<T>(
enqueuedAt: Date.now(),
warnAfterMs,
taskTimeoutMs: normalizeTaskTimeoutMs(opts?.taskTimeoutMs),
taskTimeoutProgressAtMs: opts?.taskTimeoutProgressAtMs,
onWait: opts?.onWait,
});
logLaneEnqueue(cleaned, getLaneDepth(state));