From 5719f34c72e71ebcddf22a732eb58164e667fd17 Mon Sep 17 00:00:00 2001 From: Sweets Sweetman Date: Mon, 4 May 2026 11:52:51 -0500 Subject: [PATCH] =?UTF-8?q?fix(sandbox):=20bump=20@vercel/sandbox=20to=20v?= =?UTF-8?q?2=20=E2=80=94=20production=20incident?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Production sandbox runs were failing with "Status code 404 is not ok" after api PR #503 bumped @vercel/sandbox from 1.x to 2.0.0-beta.11. Sandboxes created by api with v2-style names (e.g. gray-common-whale-eGd9JS) could no longer be reconnected from tasks (v1.8.0) — v1's Sandbox.get expects v1-style identifiers and returns 404 for the new format. Failing run for reference: https://cloud.trigger.dev/orgs/recoup-8a7d/projects/recoup-chat-bQni/env/prod/runs/run_cmorfev4q72dv0olrfwo1ysgc Mirrors api's PR #503: bump dep + minimal v1 -> v2 surface fixes: package.json "@vercel/sandbox": "^1.8.0" -> "2.0.0-beta.11" v1 -> v2 API rename: { sandboxId } -> { name } at the v2 boundary. api keeps "sandboxId" as its public vocabulary (HTTP responses, payloads, internal variables) — translation only happens at the SDK call. Production code (4 files): sandboxes/getOrCreateSandbox.ts:30 Sandbox.get({ sandboxId, ... }) -> Sandbox.get({ name: sandboxId, ... }) tasks/runSandboxCommandTask.ts:46 same pattern tasks/codingAgentTask.ts:83 sandbox.sandboxId -> sandbox.name (log) tasks/setupSandboxTask.ts:40,50 sandbox.sandboxId -> sandbox.name (×2) tasks/updatePRTask.ts:38,86 sandbox.sandboxId -> sandbox.name (×2) Tests (1 file): sandboxes/__tests__/getOrCreateSandbox.test.ts mock Sandbox.get return: { sandboxId } -> { name } Sandbox.get call assertion: { sandboxId } -> { name } Verification: - pnpm install: clean - pnpm test: 356/356 pass - SDK-related typecheck errors: 0 (pre-existing unrelated typecheck issues in this repo are out of scope and predate this fix) Cross-repo coordination note: api is on @vercel/sandbox 2.0.0-beta.11 since PR #503 (merged 2026-05-02). Tasks needs to match. Without this fix, prod sandbox runs created via the new api code path are unreachable. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/sandboxes/__tests__/getOrCreateSandbox.test.ts | 6 +++--- src/sandboxes/getOrCreateSandbox.ts | 2 +- src/tasks/codingAgentTask.ts | 2 +- src/tasks/runSandboxCommandTask.ts | 2 +- src/tasks/setupSandboxTask.ts | 4 ++-- src/tasks/updatePRTask.ts | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 49c7863..20ea0e5 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "dependencies": { "@fal-ai/client": "^1.9.4", "@trigger.dev/sdk": "4.3.3", - "@vercel/sandbox": "^1.8.0", + "@vercel/sandbox": "2.0.0-beta.11", "ai": "^6.0.143", "ms": "^2.1.3", "trigger.dev": "4.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eaba86a..8b6b09e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: 4.3.3 version: 4.3.3(ai@6.0.143(zod@4.3.6))(typescript@5.9.3)(zod@4.3.6) '@vercel/sandbox': - specifier: ^1.8.0 - version: 1.8.0 + specifier: 2.0.0-beta.11 + version: 2.0.0-beta.11 ai: specifier: ^6.0.143 version: 6.0.143(zod@4.3.6) @@ -865,8 +865,8 @@ packages: resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} engines: {node: '>= 20'} - '@vercel/sandbox@1.8.0': - resolution: {integrity: sha512-SbXkg8Fmp8i+I9IdyD4PAAVtxM/KS4ULV4eiEfY/9tab1AF1MPvmEA8/ebvCn7QTWQQ7twwtpJNSPlUVmOBp3w==} + '@vercel/sandbox@2.0.0-beta.11': + resolution: {integrity: sha512-92B4b3cgUIR9CTGsGlIgy7UIrdyqIqQQom8U8YD10m5lXbjbZrf/tU7Rt+S+Vy0hlI94hKVjPkx7U+fPyBtpNA==} '@vitest/expect@4.0.18': resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} @@ -2949,7 +2949,7 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vercel/sandbox@1.8.0': + '@vercel/sandbox@2.0.0-beta.11': dependencies: '@vercel/oidc': 3.2.0 async-retry: 1.3.3 diff --git a/src/sandboxes/__tests__/getOrCreateSandbox.test.ts b/src/sandboxes/__tests__/getOrCreateSandbox.test.ts index eabcd2a..c2dab3a 100644 --- a/src/sandboxes/__tests__/getOrCreateSandbox.test.ts +++ b/src/sandboxes/__tests__/getOrCreateSandbox.test.ts @@ -8,7 +8,7 @@ vi.mock("@trigger.dev/sdk/v3", () => ({ vi.mock("@vercel/sandbox", () => ({ Sandbox: { get: vi.fn().mockResolvedValue({ - sandboxId: "sbx_123", + name: "sbx_123", status: "running", }), }, @@ -53,7 +53,7 @@ describe("getOrCreateSandbox", () => { await getOrCreateSandbox("acc_1"); expect(Sandbox.get).toHaveBeenCalledWith( - expect.objectContaining({ sandboxId: "sbx_123" }), + expect.objectContaining({ name: "sbx_123" }), ); }); @@ -62,7 +62,7 @@ describe("getOrCreateSandbox", () => { expect(result.sandboxId).toBe("sbx_123"); expect(result.sandbox).toEqual( - expect.objectContaining({ sandboxId: "sbx_123" }), + expect.objectContaining({ name: "sbx_123" }), ); }); diff --git a/src/sandboxes/getOrCreateSandbox.ts b/src/sandboxes/getOrCreateSandbox.ts index 8eb716b..d90f438 100644 --- a/src/sandboxes/getOrCreateSandbox.ts +++ b/src/sandboxes/getOrCreateSandbox.ts @@ -28,7 +28,7 @@ export async function getOrCreateSandbox( } const sandbox = await Sandbox.get({ - sandboxId: created.sandboxId, + name: created.sandboxId, token, teamId, projectId, diff --git a/src/tasks/codingAgentTask.ts b/src/tasks/codingAgentTask.ts index 18e1f92..fc49430 100644 --- a/src/tasks/codingAgentTask.ts +++ b/src/tasks/codingAgentTask.ts @@ -80,7 +80,7 @@ export const codingAgentTask = schemaTask({ return { branch, snapshotId, prs, stdout: agentResult.stdout, stderr: agentResult.stderr }; } finally { - logStep("Stopping sandbox", false, { sandboxId: sandbox.sandboxId }); + logStep("Stopping sandbox", false, { sandboxId: sandbox.name }); await sandbox.stop(); } }, diff --git a/src/tasks/runSandboxCommandTask.ts b/src/tasks/runSandboxCommandTask.ts index d873545..673d27c 100644 --- a/src/tasks/runSandboxCommandTask.ts +++ b/src/tasks/runSandboxCommandTask.ts @@ -43,7 +43,7 @@ export const runSandboxCommandTask = schemaTask({ accountId, }); - const sandbox = await Sandbox.get({ sandboxId, token, teamId, projectId }); + const sandbox = await Sandbox.get({ name: sandboxId, token, teamId, projectId }); logStep("Connected to sandbox"); diff --git a/src/tasks/setupSandboxTask.ts b/src/tasks/setupSandboxTask.ts index 71e0d65..1f8365a 100644 --- a/src/tasks/setupSandboxTask.ts +++ b/src/tasks/setupSandboxTask.ts @@ -37,7 +37,7 @@ export const setupSandboxTask = schemaTask({ ); logStep("Sandbox setup complete", true, { - sandboxId: sandbox.sandboxId, + sandboxId: sandbox.name, githubRepo: githubRepo ?? null, snapshotId: snapshotResult.snapshotId, }); @@ -47,7 +47,7 @@ export const setupSandboxTask = schemaTask({ snapshotId: snapshotResult.snapshotId, }; } finally { - logStep("Stopping sandbox", false, { sandboxId: sandbox.sandboxId }); + logStep("Stopping sandbox", false, { sandboxId: sandbox.name }); await sandbox.stop(); } }, diff --git a/src/tasks/updatePRTask.ts b/src/tasks/updatePRTask.ts index 8aa1464..8649a70 100644 --- a/src/tasks/updatePRTask.ts +++ b/src/tasks/updatePRTask.ts @@ -35,7 +35,7 @@ export const updatePRTask = schemaTask({ timeout: 30 * 60 * 1000, }); - logStep("Sandbox resumed", false, { sandboxId: sandbox.sandboxId, snapshotId }); + logStep("Sandbox resumed", false, { sandboxId: sandbox.name, snapshotId }); try { await configureGitAuth(sandbox); @@ -83,7 +83,7 @@ export const updatePRTask = schemaTask({ return { snapshotId: newSnapshot.snapshotId }; } finally { - logStep("Stopping sandbox", false, { sandboxId: sandbox.sandboxId }); + logStep("Stopping sandbox", false, { sandboxId: sandbox.name }); await sandbox.stop(); } },