From 62abfd3dcb9a45ec10eb127807bf3659f658ff22 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 30 May 2026 01:31:57 -0400 Subject: [PATCH] fix(codex): cap app-server idle timers --- .../src/app-server/attempt-timeouts.test.ts | 22 +++++++++++++++++++ .../codex/src/app-server/attempt-timeouts.ts | 7 +++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/extensions/codex/src/app-server/attempt-timeouts.test.ts b/extensions/codex/src/app-server/attempt-timeouts.test.ts index 78443a746b6..d148a58aeaf 100644 --- a/extensions/codex/src/app-server/attempt-timeouts.test.ts +++ b/extensions/codex/src/app-server/attempt-timeouts.test.ts @@ -1,3 +1,4 @@ +import { MAX_TIMER_TIMEOUT_MS } from "openclaw/plugin-sdk/number-runtime"; import { afterEach, describe, expect, it, vi } from "vitest"; import { CODEX_APP_SERVER_STARTUP_TIMEOUT_FLOOR_MS, @@ -28,6 +29,15 @@ describe("Codex app-server attempt timeouts", () => { CODEX_APP_SERVER_STARTUP_TIMEOUT_FLOOR_MS, ); expect(resolveCodexStartupTimeoutMs({ timeoutMs: 500, timeoutFloorMs: Number.NaN })).toBe(500); + expect(resolveCodexStartupTimeoutMs({ timeoutMs: Number.MAX_SAFE_INTEGER })).toBe( + MAX_TIMER_TIMEOUT_MS, + ); + expect( + resolveCodexStartupTimeoutMs({ + timeoutMs: Number.MAX_SAFE_INTEGER, + timeoutFloorMs: Number.MAX_SAFE_INTEGER, + }), + ).toBe(MAX_TIMER_TIMEOUT_MS); expect( resolveCodexStartupTimeoutMs({ timeoutMs: Number.NaN, @@ -50,6 +60,9 @@ describe("Codex app-server attempt timeouts", () => { ); expect(resolveCodexTurnCompletionIdleTimeoutMs(2.9)).toBe(2); expect(resolveCodexTurnCompletionIdleTimeoutMs(0)).toBe(1); + expect(resolveCodexTurnCompletionIdleTimeoutMs(Number.MAX_SAFE_INTEGER)).toBe( + MAX_TIMER_TIMEOUT_MS, + ); expect(resolveCodexTurnAssistantCompletionIdleTimeoutMs(undefined)).toBe( CODEX_TURN_ASSISTANT_COMPLETION_IDLE_TIMEOUT_MS, @@ -77,6 +90,12 @@ describe("Codex app-server attempt timeouts", () => { ); expect(resolveCodexPostToolRawAssistantCompletionIdleTimeoutMs(7.9, 123)).toBe(7); expect(resolveCodexPostToolRawAssistantCompletionIdleTimeoutMs(0, 123)).toBe(1); + expect( + resolveCodexPostToolRawAssistantCompletionIdleTimeoutMs( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER, + ), + ).toBe(MAX_TIMER_TIMEOUT_MS); expect(resolveCodexTurnTerminalIdleTimeoutMs(undefined)).toBe( CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS, @@ -86,6 +105,9 @@ describe("Codex app-server attempt timeouts", () => { ); expect(resolveCodexTurnTerminalIdleTimeoutMs(3.7)).toBe(3); expect(resolveCodexTurnTerminalIdleTimeoutMs(-1)).toBe(1); + expect(resolveCodexTurnTerminalIdleTimeoutMs(Number.MAX_SAFE_INTEGER)).toBe( + MAX_TIMER_TIMEOUT_MS, + ); }); it("returns the startup operation result before timeout", async () => { diff --git a/extensions/codex/src/app-server/attempt-timeouts.ts b/extensions/codex/src/app-server/attempt-timeouts.ts index 16b5c8494e5..5d8bfd2a448 100644 --- a/extensions/codex/src/app-server/attempt-timeouts.ts +++ b/extensions/codex/src/app-server/attempt-timeouts.ts @@ -1,4 +1,4 @@ -import { parseFiniteNumber } from "openclaw/plugin-sdk/number-runtime"; +import { resolveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime"; export const CODEX_APP_SERVER_STARTUP_TIMEOUT_FLOOR_MS = 100; export const CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS = 60_000; @@ -11,9 +11,8 @@ export const CODEX_POST_REASONING_SOURCE_REPLY_IDLE_TIMEOUT_MS = 5 * 60_000; export const CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS = 30 * 60_000; function resolvePositiveIntegerTimeoutMs(value: number | undefined, fallbackMs: number): number { - const fallback = parseFiniteNumber(fallbackMs) ?? 1; - const candidate = parseFiniteNumber(value) ?? fallback; - return Math.max(1, Math.floor(candidate)); + const fallback = resolveTimerTimeoutMs(fallbackMs, 1); + return resolveTimerTimeoutMs(value, fallback); } export async function withCodexStartupTimeout(params: {