diff --git a/scripts/test-parallel.mjs b/scripts/test-parallel.mjs index ecc5e55617..0c5757baca 100644 --- a/scripts/test-parallel.mjs +++ b/scripts/test-parallel.mjs @@ -165,6 +165,20 @@ const WARNING_SUPPRESSION_FLAGS = [ "--disable-warning=MaxListenersExceededWarning", ]; +const DEFAULT_CI_MAX_OLD_SPACE_SIZE_MB = 4096; +const maxOldSpaceSizeMb = (() => { + // CI can hit Node heap limits (especially on large suites). Allow override, default to 4GB. + const raw = process.env.OPENCLAW_TEST_MAX_OLD_SPACE_SIZE_MB ?? ""; + const parsed = Number.parseInt(raw, 10); + if (Number.isFinite(parsed) && parsed > 0) { + return parsed; + } + if (isCI && !isWindows) { + return DEFAULT_CI_MAX_OLD_SPACE_SIZE_MB; + } + return null; +})(); + function resolveReportDir() { const raw = process.env.OPENCLAW_VITEST_REPORT_DIR?.trim(); if (!raw) { @@ -224,11 +238,18 @@ const runOnce = (entry, extraArgs = []) => (acc, flag) => (acc.includes(flag) ? acc : `${acc} ${flag}`.trim()), nodeOptions, ); + const heapFlag = + maxOldSpaceSizeMb && !nextNodeOptions.includes("--max-old-space-size=") + ? `--max-old-space-size=${maxOldSpaceSizeMb}` + : null; + const resolvedNodeOptions = heapFlag + ? `${nextNodeOptions} ${heapFlag}`.trim() + : nextNodeOptions; let child; try { child = spawn(pnpm, args, { stdio: "inherit", - env: { ...process.env, VITEST_GROUP: entry.name, NODE_OPTIONS: nextNodeOptions }, + env: { ...process.env, VITEST_GROUP: entry.name, NODE_OPTIONS: resolvedNodeOptions }, shell: isWindows, }); } catch (err) {