From 4e24470ced97ad11f5e9732102d2c47db76ef186 Mon Sep 17 00:00:00 2001
From: Alix-007
Date: Wed, 15 Jul 2026 11:47:49 +0800
Subject: [PATCH] fix(qa-lab): prevent Multipass Node download hangs (#107702)
---
extensions/qa-lab/src/multipass.runtime.test.ts | 6 ++++++
extensions/qa-lab/src/multipass.runtime.ts | 4 ++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/extensions/qa-lab/src/multipass.runtime.test.ts b/extensions/qa-lab/src/multipass.runtime.test.ts
index 4056c51417ad..fdc79401eab1 100644
--- a/extensions/qa-lab/src/multipass.runtime.test.ts
+++ b/extensions/qa-lab/src/multipass.runtime.test.ts
@@ -141,6 +141,12 @@ describe("qa multipass runtime", () => {
expect(script).toContain("pnpm install --frozen-lockfile");
expect(script).toContain("pnpm build");
expect(script).toContain("corepack prepare 'pnpm@");
+ expect(script).toContain(
+ 'curl -fsSL --connect-timeout 10 --max-time 120 --retry 2 --retry-delay 2 "${base_url}/SHASUMS256.txt" -o "${node_tmp_dir}/SHASUMS256.txt"',
+ );
+ expect(script).toContain(
+ 'curl -fsSL --connect-timeout 10 --max-time 120 --retry 2 --retry-delay 2 "${base_url}/${tarball_name}" -o "${node_tmp_dir}/${tarball_name}"',
+ );
expect(script).toContain("'pnpm' 'openclaw' 'qa' 'suite' '--transport' 'qa-channel'");
expect(script).toContain("'--provider-mode' 'live-frontier'");
expect(script).toContain("'--scenario' 'channel-chat-baseline'");
diff --git a/extensions/qa-lab/src/multipass.runtime.ts b/extensions/qa-lab/src/multipass.runtime.ts
index b71040583337..7f562c7fd20d 100644
--- a/extensions/qa-lab/src/multipass.runtime.ts
+++ b/extensions/qa-lab/src/multipass.runtime.ts
@@ -410,10 +410,10 @@ function renderQaMultipassGuestScript(
' node_tmp_dir="$(mktemp -d)"',
" trap 'rm -rf \"${node_tmp_dir}\"' RETURN",
' base_url="https://nodejs.org/dist/latest-v22.x"',
- ' curl -fsSL "${base_url}/SHASUMS256.txt" -o "${node_tmp_dir}/SHASUMS256.txt" >>"$BOOTSTRAP_LOG" 2>&1',
+ ' curl -fsSL --connect-timeout 10 --max-time 120 --retry 2 --retry-delay 2 "${base_url}/SHASUMS256.txt" -o "${node_tmp_dir}/SHASUMS256.txt" >>"$BOOTSTRAP_LOG" 2>&1',
' tarball_name="$(awk \'/linux-\'"${node_arch}"\'\\.tar\\.xz$/ { print $2; exit }\' "${node_tmp_dir}/SHASUMS256.txt")"',
' [ -n "${tarball_name}" ] || { echo "unable to resolve node tarball for ${node_arch}" >&2; return 1; }',
- ' curl -fsSL "${base_url}/${tarball_name}" -o "${node_tmp_dir}/${tarball_name}" >>"$BOOTSTRAP_LOG" 2>&1',
+ ' curl -fsSL --connect-timeout 10 --max-time 120 --retry 2 --retry-delay 2 "${base_url}/${tarball_name}" -o "${node_tmp_dir}/${tarball_name}" >>"$BOOTSTRAP_LOG" 2>&1',
' (cd "${node_tmp_dir}" && grep " ${tarball_name}$" SHASUMS256.txt | sha256sum -c -) >>"$BOOTSTRAP_LOG" 2>&1',
' extract_dir="${tarball_name%.tar.xz}"',
' sudo mkdir -p /usr/local/lib/nodejs >>"$BOOTSTRAP_LOG" 2>&1',