Files
openclaw/src/agents/code-mode-deadline.ts
Peter Steinberger d9d2d2482d fix(agents): prevent Code Mode resume loss and unbounded preparation (#115314)
* fix(agents): harden code mode lifecycle and deadlines

* fix(agents): retain narrowed headless settlement frontier
2026-07-28 13:35:37 -04:00

41 lines
1.2 KiB
TypeScript

/** Race preparation and bridge work against the same guest-owned deadline. */
export async function awaitCodeModeDeadline<T>(params: {
operation: () => Promise<T>;
deadlineMs: number;
signal?: AbortSignal;
createTimeoutError: () => Error;
createAbortError: (signal: AbortSignal) => Error;
}): Promise<T> {
const remainingMs = params.deadlineMs - Date.now();
if (remainingMs <= 0) {
throw params.createTimeoutError();
}
if (params.signal?.aborted) {
throw params.createAbortError(params.signal);
}
let timer: ReturnType<typeof setTimeout> | undefined;
let onAbort: (() => void) | undefined;
try {
const deadline = new Promise<never>((_resolve, reject) => {
timer = setTimeout(() => reject(params.createTimeoutError()), remainingMs);
const signal = params.signal;
if (signal) {
onAbort = () => reject(params.createAbortError(signal));
signal.addEventListener("abort", onAbort, { once: true });
if (signal.aborted) {
onAbort();
}
}
});
return await Promise.race([params.operation(), deadline]);
} finally {
if (timer) {
clearTimeout(timer);
}
if (params.signal && onAbort) {
params.signal.removeEventListener("abort", onAbort);
}
}
}