From 97a1355037b2ceca1aa55a0454674adb0536d18e Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza Date: Sun, 9 Aug 2026 09:51:37 -0300 Subject: [PATCH] fix(types): validate default executor pool config (#9849) Co-authored-by: backryun --- open-sse/executors/default.ts | 5 ++- open-sse/executors/default/poolConfig.ts | 33 +++++++++++++++++++ .../unit/default-pool-config-contract.test.ts | 31 +++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 open-sse/executors/default/poolConfig.ts create mode 100644 tests/unit/default-pool-config-contract.test.ts diff --git a/open-sse/executors/default.ts b/open-sse/executors/default.ts index 8836b79dfb..8814c4262a 100644 --- a/open-sse/executors/default.ts +++ b/open-sse/executors/default.ts @@ -61,12 +61,11 @@ import { } from "@/lib/providers/validation/urlHelpers"; import { forwardOpencodeClientHeaders } from "../utils/opencodeHeaders.ts"; import { resolveZaiUrl } from "./default/zaiFormatOverride.ts"; +import { normalizePoolConfig } from "./default/poolConfig.ts"; import { acquireNvidiaConcurrencySlot } from "./default/nvidiaConcurrencyGate.ts"; import { resolveAlibabaProviderBaseUrl } from "@/shared/constants/alibabaProviderRegions"; import { usesCcWireImage } from "../services/ccWireImageBuiltins.ts"; -import type { PoolConfig } from "../services/sessionPool/types.ts"; - const NVIDIA_TOOL_CALL_ID_PATTERN = /^[A-Za-z0-9]{9}$/; function normalizeNvidiaToolCallId(id: unknown): unknown { @@ -146,7 +145,7 @@ export class DefaultExecutor extends BaseExecutor { super(provider, PROVIDERS[provider] || PROVIDERS.openai); const registryEntry = getRegistryEntry(provider); if (registryEntry?.poolConfig) { - this.poolConfig = registryEntry.poolConfig as PoolConfig; + this.poolConfig = normalizePoolConfig(registryEntry.poolConfig) ?? undefined; } } diff --git a/open-sse/executors/default/poolConfig.ts b/open-sse/executors/default/poolConfig.ts new file mode 100644 index 0000000000..5cb781a3d6 --- /dev/null +++ b/open-sse/executors/default/poolConfig.ts @@ -0,0 +1,33 @@ +import type { PoolConfig } from "../../services/sessionPool/types.ts"; + +export function normalizePoolConfig(value: Record): PoolConfig | null { + const { + minSessions, + maxSessions, + cooldownBase, + cooldownMax, + cooldownJitter, + requestTimeout, + requestJitter, + } = value; + if ( + typeof minSessions !== "number" || + typeof maxSessions !== "number" || + typeof cooldownBase !== "number" || + typeof cooldownMax !== "number" || + typeof cooldownJitter !== "number" || + typeof requestTimeout !== "number" || + typeof requestJitter !== "number" + ) { + return null; + } + return { + minSessions, + maxSessions, + cooldownBase, + cooldownMax, + cooldownJitter, + requestTimeout, + requestJitter, + }; +} diff --git a/tests/unit/default-pool-config-contract.test.ts b/tests/unit/default-pool-config-contract.test.ts new file mode 100644 index 0000000000..a520d00071 --- /dev/null +++ b/tests/unit/default-pool-config-contract.test.ts @@ -0,0 +1,31 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { normalizePoolConfig } from "../../open-sse/executors/default/poolConfig.ts"; + +test("normalizePoolConfig preserves a complete registry pool contract", () => { + assert.deepEqual( + normalizePoolConfig({ + minSessions: 1, + maxSessions: 3, + cooldownBase: 2000, + cooldownMax: 5000, + cooldownJitter: 100, + requestTimeout: 30000, + requestJitter: 50, + }), + { + minSessions: 1, + maxSessions: 3, + cooldownBase: 2000, + cooldownMax: 5000, + cooldownJitter: 100, + requestTimeout: 30000, + requestJitter: 50, + } + ); +}); + +test("normalizePoolConfig rejects incomplete registry values", () => { + assert.equal(normalizePoolConfig({ minSessions: 1, maxSessions: 3 }), null); +});