diff --git a/src/agents/sandbox/config.test.ts b/src/agents/sandbox/config.test.ts new file mode 100644 index 00000000000..0810808dd8f --- /dev/null +++ b/src/agents/sandbox/config.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from "vitest"; +import type { OpenClawConfig } from "../../config/config.js"; +import { MAX_TIMER_TIMEOUT_MS } from "../../shared/number-coercion.js"; +import { resolveSandboxConfigForAgent } from "./config.js"; + +describe("sandbox config", () => { + it("caps browser autostart timeout to a timer-safe delay", () => { + const cfg: OpenClawConfig = { + agents: { + defaults: { + sandbox: { + browser: { + autoStartTimeoutMs: Number.MAX_SAFE_INTEGER, + }, + }, + }, + }, + }; + + expect(resolveSandboxConfigForAgent(cfg, "main").browser.autoStartTimeoutMs).toBe( + MAX_TIMER_TIMEOUT_MS, + ); + }); +}); diff --git a/src/agents/sandbox/config.ts b/src/agents/sandbox/config.ts index d8688a801ff..7556afea7a0 100644 --- a/src/agents/sandbox/config.ts +++ b/src/agents/sandbox/config.ts @@ -1,6 +1,7 @@ import type { OpenClawConfig } from "../../config/types.openclaw.js"; import type { SandboxSshSettings } from "../../config/types.sandbox.js"; import { normalizeSecretInputString } from "../../config/types.secrets.js"; +import { resolveTimerTimeoutMs } from "../../shared/number-coercion.js"; import { normalizeOptionalString } from "../../shared/string-coerce.js"; import { resolveAgentConfig } from "../agent-scope.js"; import { @@ -40,6 +41,10 @@ const DEFAULT_SANDBOX_SSH_WORKSPACE_ROOT = "/tmp/openclaw-sandboxes"; type DangerousSandboxDockerBooleanKey = (typeof DANGEROUS_SANDBOX_DOCKER_BOOLEAN_KEYS)[number]; type DangerousSandboxDockerBooleans = Pick; +function resolveSandboxBrowserAutoStartTimeoutMs(value: number | undefined): number { + return resolveTimerTimeoutMs(value, DEFAULT_SANDBOX_BROWSER_AUTOSTART_TIMEOUT_MS); +} + function resolveDangerousSandboxDockerBooleans( agentDocker?: Partial, globalDocker?: Partial, @@ -154,10 +159,9 @@ export function resolveSandboxBrowserConfig(params: { enableNoVnc: agentBrowser?.enableNoVnc ?? globalBrowser?.enableNoVnc ?? true, allowHostControl: agentBrowser?.allowHostControl ?? globalBrowser?.allowHostControl ?? false, autoStart: agentBrowser?.autoStart ?? globalBrowser?.autoStart ?? true, - autoStartTimeoutMs: - agentBrowser?.autoStartTimeoutMs ?? - globalBrowser?.autoStartTimeoutMs ?? - DEFAULT_SANDBOX_BROWSER_AUTOSTART_TIMEOUT_MS, + autoStartTimeoutMs: resolveSandboxBrowserAutoStartTimeoutMs( + agentBrowser?.autoStartTimeoutMs ?? globalBrowser?.autoStartTimeoutMs, + ), binds: bindsConfigured ? binds : undefined, }; }