From 439f28d4560f30febb1a7e00104fb248c20ea8b2 Mon Sep 17 00:00:00 2001 From: KooshaPari <42529354+KooshaPari@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:05:15 -0700 Subject: [PATCH] fix(ci): harden provider translate-path golden across CI runners (#6076) Normalize OS/arch-derived request headers (X-Stainless-Os/Arch, (OS;arch) UAs, and Antigravity's os.platform()-derived platform substring) in the golden so the test is runner-independent. Fixes the Mac-literal Antigravity UA that would have failed on Linux CI. Supersedes stale #6002. Co-authored-by: diegosouzapw --- tests/snapshots/provider/translate-path.json | 78 +++++++++---------- .../provider-translate-path-golden.test.ts | 16 ++++ 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/tests/snapshots/provider/translate-path.json b/tests/snapshots/provider/translate-path.json index 434627e149..6fe22b4d39 100644 --- a/tests/snapshots/provider/translate-path.json +++ b/tests/snapshots/provider/translate-path.json @@ -33,10 +33,10 @@ "Content-Type": "application/json", "User-Agent": "claude-cli/2.1.195 (external, cli)", "X-App": "cli", - "X-Stainless-Arch": "x64", + "X-Stainless-Arch": "", "X-Stainless-Helper-Method": "stream", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", @@ -51,10 +51,10 @@ "Content-Type": "application/json", "User-Agent": "claude-cli/2.1.195 (external, cli)", "X-App": "cli", - "X-Stainless-Arch": "x64", + "X-Stainless-Arch": "", "X-Stainless-Helper-Method": "stream", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", @@ -70,10 +70,10 @@ "Content-Type": "application/json", "User-Agent": "claude-cli/2.1.195 (external, cli)", "X-App": "cli", - "X-Stainless-Arch": "x64", + "X-Stainless-Arch": "", "X-Stainless-Helper-Method": "stream", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", @@ -94,18 +94,18 @@ "Accept": "text/event-stream", "Authorization": "Bearer ", "Content-Type": "application/json", - "User-Agent": "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/142.0.7444.175 Electron/39.2.3" + "User-Agent": "Antigravity/4.2.0 () Chrome/142.0.7444.175 Electron/39.2.3" }, "nonStream": { "Authorization": "Bearer ", "Content-Type": "application/json", - "User-Agent": "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/142.0.7444.175 Electron/39.2.3" + "User-Agent": "Antigravity/4.2.0 () Chrome/142.0.7444.175 Electron/39.2.3" }, "oauth": { "Accept": "text/event-stream", "Authorization": "Bearer ", "Content-Type": "application/json", - "User-Agent": "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/142.0.7444.175 Electron/39.2.3" + "User-Agent": "Antigravity/4.2.0 () Chrome/142.0.7444.175 Electron/39.2.3" } }, "url": { @@ -241,18 +241,18 @@ "Accept": "text/event-stream", "Authorization": "Bearer ", "Content-Type": "application/json", - "User-Agent": "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/142.0.7444.175 Electron/39.2.3" + "User-Agent": "Antigravity/4.2.0 () Chrome/142.0.7444.175 Electron/39.2.3" }, "nonStream": { "Authorization": "Bearer ", "Content-Type": "application/json", - "User-Agent": "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/142.0.7444.175 Electron/39.2.3" + "User-Agent": "Antigravity/4.2.0 () Chrome/142.0.7444.175 Electron/39.2.3" }, "oauth": { "Accept": "text/event-stream", "Authorization": "Bearer ", "Content-Type": "application/json", - "User-Agent": "Antigravity/4.2.0 (X11; Linux x86_64) Chrome/142.0.7444.175 Electron/39.2.3" + "User-Agent": "Antigravity/4.2.0 () Chrome/142.0.7444.175 Electron/39.2.3" } }, "url": { @@ -714,10 +714,10 @@ "Content-Type": "application/json", "User-Agent": "claude-cli/2.1.195 (external, cli)", "X-App": "cli", - "X-Stainless-Arch": "x64", + "X-Stainless-Arch": "", "X-Stainless-Helper-Method": "stream", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", @@ -732,10 +732,10 @@ "Content-Type": "application/json", "User-Agent": "claude-cli/2.1.195 (external, cli)", "X-App": "cli", - "X-Stainless-Arch": "x64", + "X-Stainless-Arch": "", "X-Stainless-Helper-Method": "stream", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", @@ -751,10 +751,10 @@ "Content-Type": "application/json", "User-Agent": "claude-cli/2.1.195 (external, cli)", "X-App": "cli", - "X-Stainless-Arch": "x64", + "X-Stainless-Arch": "", "X-Stainless-Helper-Method": "stream", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "0.94.0", "X-Stainless-Retry-Count": "0", "X-Stainless-Runtime": "node", @@ -965,7 +965,7 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "Openai-Beta": "responses=experimental", - "User-Agent": "codex-cli/0.142.0 (Windows 10.0.26200; x64)", + "User-Agent": "codex-cli/0.142.0 (; )", "Version": "0.142.0", "X-Codex-Beta-Features": "responses_websockets" }, @@ -973,7 +973,7 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "Openai-Beta": "responses=experimental", - "User-Agent": "codex-cli/0.142.0 (Windows 10.0.26200; x64)", + "User-Agent": "codex-cli/0.142.0 (; )", "Version": "0.142.0", "X-Codex-Beta-Features": "responses_websockets" }, @@ -982,7 +982,7 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "Openai-Beta": "responses=experimental", - "User-Agent": "codex-cli/0.142.0 (Windows 10.0.26200; x64)", + "User-Agent": "codex-cli/0.142.0 (; )", "Version": "0.142.0", "X-Codex-Beta-Features": "responses_websockets" } @@ -1754,14 +1754,14 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "HTTP-Referer": "https://github.com/Gitlawb/openclaude", - "User-Agent": "OpenClaude/1.0 (linux; x86_64)", + "User-Agent": "OpenClaude/1.0 (; )", "X-Title": "OpenClaude CLI" }, "nonStream": { "Authorization": "Bearer ", "Content-Type": "application/json", "HTTP-Referer": "https://github.com/Gitlawb/openclaude", - "User-Agent": "OpenClaude/1.0 (linux; x86_64)", + "User-Agent": "OpenClaude/1.0 (; )", "X-Title": "OpenClaude CLI" }, "oauth": { @@ -1769,7 +1769,7 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "HTTP-Referer": "https://github.com/Gitlawb/openclaude", - "User-Agent": "OpenClaude/1.0 (linux; x86_64)", + "User-Agent": "OpenClaude/1.0 (; )", "X-Title": "OpenClaude CLI" } }, @@ -1786,14 +1786,14 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "HTTP-Referer": "https://github.com/Gitlawb/openclaude", - "User-Agent": "OpenClaude/1.0 (linux; x86_64)", + "User-Agent": "OpenClaude/1.0 (; )", "X-Title": "OpenClaude CLI" }, "nonStream": { "Authorization": "Bearer ", "Content-Type": "application/json", "HTTP-Referer": "https://github.com/Gitlawb/openclaude", - "User-Agent": "OpenClaude/1.0 (linux; x86_64)", + "User-Agent": "OpenClaude/1.0 (; )", "X-Title": "OpenClaude CLI" }, "oauth": { @@ -1801,7 +1801,7 @@ "Authorization": "Bearer ", "Content-Type": "application/json", "HTTP-Referer": "https://github.com/Gitlawb/openclaude", - "User-Agent": "OpenClaude/1.0 (linux; x86_64)", + "User-Agent": "OpenClaude/1.0 (; )", "X-Title": "OpenClaude CLI" } }, @@ -3516,13 +3516,13 @@ "Connection": "keep-alive", "Content-Type": "application/json", "Sec-Fetch-Mode": "cors", - "User-Agent": "QwenCode/0.19.3 (linux; x64)", + "User-Agent": "QwenCode/0.19.3 (; )", "X-Dashscope-AuthType": "qwen-oauth", "X-Dashscope-CacheControl": "enable", - "X-Dashscope-UserAgent": "QwenCode/0.19.3 (linux; x64)", - "X-Stainless-Arch": "x64", + "X-Dashscope-UserAgent": "QwenCode/0.19.3 (; )", + "X-Stainless-Arch": "", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "5.11.0", "X-Stainless-Retry-Count": "1", "X-Stainless-Runtime": "node", @@ -3534,13 +3534,13 @@ "Connection": "keep-alive", "Content-Type": "application/json", "Sec-Fetch-Mode": "cors", - "User-Agent": "QwenCode/0.19.3 (linux; x64)", + "User-Agent": "QwenCode/0.19.3 (; )", "X-Dashscope-AuthType": "qwen-oauth", "X-Dashscope-CacheControl": "enable", - "X-Dashscope-UserAgent": "QwenCode/0.19.3 (linux; x64)", - "X-Stainless-Arch": "x64", + "X-Dashscope-UserAgent": "QwenCode/0.19.3 (; )", + "X-Stainless-Arch": "", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "5.11.0", "X-Stainless-Retry-Count": "1", "X-Stainless-Runtime": "node", @@ -3553,13 +3553,13 @@ "Connection": "keep-alive", "Content-Type": "application/json", "Sec-Fetch-Mode": "cors", - "User-Agent": "QwenCode/0.19.3 (linux; x64)", + "User-Agent": "QwenCode/0.19.3 (; )", "X-Dashscope-AuthType": "qwen-oauth", "X-Dashscope-CacheControl": "enable", - "X-Dashscope-UserAgent": "QwenCode/0.19.3 (linux; x64)", - "X-Stainless-Arch": "x64", + "X-Dashscope-UserAgent": "QwenCode/0.19.3 (; )", + "X-Stainless-Arch": "", "X-Stainless-Lang": "js", - "X-Stainless-Os": "Linux", + "X-Stainless-Os": "", "X-Stainless-Package-Version": "5.11.0", "X-Stainless-Retry-Count": "1", "X-Stainless-Runtime": "node", diff --git a/tests/unit/provider-translate-path-golden.test.ts b/tests/unit/provider-translate-path-golden.test.ts index e9eec891b9..0aecd8e90f 100644 --- a/tests/unit/provider-translate-path-golden.test.ts +++ b/tests/unit/provider-translate-path-golden.test.ts @@ -48,9 +48,25 @@ function sanitize(headers: Record): Record { out[k] = v; continue; } + if (k === "X-Stainless-Arch") { + out[k] = ""; + continue; + } + if (k === "X-Stainless-Os") { + out[k] = ""; + continue; + } let s = v .replace(/Bearer .+/, "Bearer ") .replace(/sk-test-APIKEY|tok-test-ACCESS/g, "") + .replace(/\(([A-Za-z0-9_. -]+); (?:arm64|x64|x86_64|amd64|ia32)\)/g, "(; )") + // Antigravity's User-Agent embeds an os.platform()-derived platform string + // (getAntigravityPlatformInfo) that the (OS; arch) rule above does not cover, + // so normalize the three known values to keep the golden runner-independent. + .replace( + /Macintosh; Intel Mac OS X 10_15_7|Windows NT 10\.0; Win64; x64|X11; Linux x86_64/g, + "" + ) .replace(/kimi-\d{10,}/g, "kimi-") .replace(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, ""); if (NODE_VERSION) s = s.split(NODE_VERSION).join("");