From df4475d232d536a51d759b60d6d199c4cddac7d0 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 28 May 2026 13:38:19 -0400 Subject: [PATCH] fix: parse embedded abort settle timeout strictly --- .../run/attempt.abort-settle-timeout.test.ts | 29 +++++++++++++++++++ .../run/attempt.abort-settle-timeout.ts | 14 +++++++++ .../run/attempt.sessions-yield.ts | 10 ++----- .../run/attempt.subscription-cleanup.ts | 9 +----- 4 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.test.ts create mode 100644 src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.ts diff --git a/src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.test.ts b/src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.test.ts new file mode 100644 index 00000000000..d8fd77c31bd --- /dev/null +++ b/src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, it } from "vitest"; +import { resolveEmbeddedAbortSettleTimeoutMs } from "./attempt.abort-settle-timeout.js"; + +describe("resolveEmbeddedAbortSettleTimeoutMs", () => { + it("uses a positive decimal integer override", () => { + expect( + resolveEmbeddedAbortSettleTimeoutMs({ + OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS: "1250", + }), + ).toBe(1250); + }); + + it.each(["0x10", "1e3", "12.5"])("ignores non-decimal-integer overrides: %s", (value) => { + expect( + resolveEmbeddedAbortSettleTimeoutMs({ + OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS: value, + }), + ).toBe(2_000); + }); + + it("keeps the fast-test fallback when the override is invalid", () => { + expect( + resolveEmbeddedAbortSettleTimeoutMs({ + OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS: "10ms", + OPENCLAW_TEST_FAST: "1", + }), + ).toBe(250); + }); +}); diff --git a/src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.ts b/src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.ts new file mode 100644 index 00000000000..febf78e29f9 --- /dev/null +++ b/src/agents/embedded-agent-runner/run/attempt.abort-settle-timeout.ts @@ -0,0 +1,14 @@ +import { parseStrictPositiveInteger } from "../../../infra/parse-finite-number.js"; + +export function resolveEmbeddedAbortSettleTimeoutMs( + env: Pick< + NodeJS.ProcessEnv, + "OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS" | "OPENCLAW_TEST_FAST" + > = process.env, +): number { + const override = parseStrictPositiveInteger(env.OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS); + if (override !== undefined) { + return override; + } + return env.OPENCLAW_TEST_FAST === "1" ? 250 : 2_000; +} diff --git a/src/agents/embedded-agent-runner/run/attempt.sessions-yield.ts b/src/agents/embedded-agent-runner/run/attempt.sessions-yield.ts index df4938a09b0..890165e245c 100644 --- a/src/agents/embedded-agent-runner/run/attempt.sessions-yield.ts +++ b/src/agents/embedded-agent-runner/run/attempt.sessions-yield.ts @@ -1,17 +1,11 @@ import type { AgentMessage } from "../../runtime/index.js"; import { log } from "../logger.js"; +import { resolveEmbeddedAbortSettleTimeoutMs } from "./attempt.abort-settle-timeout.js"; const SESSIONS_YIELD_INTERRUPT_CUSTOM_TYPE = "openclaw.sessions_yield_interrupt"; const SESSIONS_YIELD_CONTEXT_CUSTOM_TYPE = "openclaw.sessions_yield"; -function resolveSessionsYieldAbortSettleTimeoutMs(): number { - const override = Number(process.env.OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS); - if (Number.isFinite(override) && override > 0) { - return override; - } - return process.env.OPENCLAW_TEST_FAST === "1" ? 250 : 2_000; -} -const SESSIONS_YIELD_ABORT_SETTLE_TIMEOUT_MS = resolveSessionsYieldAbortSettleTimeoutMs(); +const SESSIONS_YIELD_ABORT_SETTLE_TIMEOUT_MS = resolveEmbeddedAbortSettleTimeoutMs(); // Persist a hidden context reminder so the next turn knows why the runner stopped. function buildSessionsYieldContextMessage(message: string): string { diff --git a/src/agents/embedded-agent-runner/run/attempt.subscription-cleanup.ts b/src/agents/embedded-agent-runner/run/attempt.subscription-cleanup.ts index b5ed905cca6..1167b76a636 100644 --- a/src/agents/embedded-agent-runner/run/attempt.subscription-cleanup.ts +++ b/src/agents/embedded-agent-runner/run/attempt.subscription-cleanup.ts @@ -1,13 +1,6 @@ import type { SubscribeEmbeddedAgentSessionParams } from "../../embedded-agent-subscribe.types.js"; import { log } from "../logger.js"; - -function resolveEmbeddedAbortSettleTimeoutMs(): number { - const override = Number(process.env.OPENCLAW_EMBEDDED_ABORT_SETTLE_TIMEOUT_MS); - if (Number.isFinite(override) && override > 0) { - return override; - } - return process.env.OPENCLAW_TEST_FAST === "1" ? 250 : 2_000; -} +import { resolveEmbeddedAbortSettleTimeoutMs } from "./attempt.abort-settle-timeout.js"; export const EMBEDDED_ABORT_SETTLE_TIMEOUT_MS = resolveEmbeddedAbortSettleTimeoutMs();