From 3d56415411bf98002689ef107ee322bece25be38 Mon Sep 17 00:00:00 2001 From: Sidney Swift <158200036+sidneyswift@users.noreply.github.com> Date: Fri, 23 Jan 2026 12:44:50 -0500 Subject: [PATCH 1/4] feat: add Google Drive and Google Docs to enabled toolkits (#153) (#154) * feat: add Google Drive and Google Docs to enabled toolkits - Add googledrive and googledocs to ENABLED_TOOLKITS array - Enables Tool Router access to Google Drive and Google Docs tools * docs: update JSDoc to mention all Google integrations --- lib/chat/setupToolsForRequest.ts | 2 +- lib/composio/toolRouter/createSession.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/chat/setupToolsForRequest.ts b/lib/chat/setupToolsForRequest.ts index b20261cc..4944b1c8 100644 --- a/lib/chat/setupToolsForRequest.ts +++ b/lib/chat/setupToolsForRequest.ts @@ -8,7 +8,7 @@ import { getComposioTools } from "@/lib/composio/toolRouter"; * Sets up and filters tools for a chat request. * Aggregates tools from: * - MCP server (via HTTP transport to /api/mcp for proper auth) - * - Composio Tool Router (Google Sheets and other connectors) + * - Composio Tool Router (Google Sheets, Google Drive, Google Docs) * * @param body - The chat request body * @returns Filtered tool set ready for use diff --git a/lib/composio/toolRouter/createSession.ts b/lib/composio/toolRouter/createSession.ts index 1be944af..f5fad9b1 100644 --- a/lib/composio/toolRouter/createSession.ts +++ b/lib/composio/toolRouter/createSession.ts @@ -5,7 +5,7 @@ import { getCallbackUrl } from "../getCallbackUrl"; * Toolkits available in Tool Router sessions. * Add more toolkits here as we expand Composio integration. */ -const ENABLED_TOOLKITS = ["googlesheets"]; +const ENABLED_TOOLKITS = ["googlesheets", "googledrive", "googledocs"]; /** * Create a Composio Tool Router session for a user. From a314b24d8465a0ec994bb67bc187dc7cccdedf1f Mon Sep 17 00:00:00 2001 From: Sweets Sweetman Date: Fri, 23 Jan 2026 14:19:05 -0500 Subject: [PATCH 2/4] feat: add POST /api/sandbox endpoint Create ephemeral sandbox environments using Vercel Sandbox SDK. - Add route handler with CORS and API key authentication - Add createSandbox function using @vercel/sandbox - Returns sandboxId, status, timeout, createdAt Co-Authored-By: Claude Opus 4.5 --- app/api/sandbox/route.ts | 38 +++++++ lib/sandbox/createSandbox.ts | 28 ++++++ lib/sandbox/createSandboxPostHandler.ts | 29 ++++++ package.json | 5 +- pnpm-lock.yaml | 126 ++++++++++++++++++++++++ 5 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 app/api/sandbox/route.ts create mode 100644 lib/sandbox/createSandbox.ts create mode 100644 lib/sandbox/createSandboxPostHandler.ts diff --git a/app/api/sandbox/route.ts b/app/api/sandbox/route.ts new file mode 100644 index 00000000..427f3f3b --- /dev/null +++ b/app/api/sandbox/route.ts @@ -0,0 +1,38 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getCorsHeaders } from "@/lib/networking/getCorsHeaders"; +import { createSandboxPostHandler } from "@/lib/sandbox/createSandboxPostHandler"; + +/** + * OPTIONS handler for CORS preflight requests. + * + * @returns A NextResponse with CORS headers. + */ +export async function OPTIONS() { + return new NextResponse(null, { + status: 200, + headers: getCorsHeaders(), + }); +} + +/** + * POST /api/sandbox + * + * Creates a new ephemeral sandbox environment. + * Sandboxes are isolated Linux microVMs that can be used to evaluate + * account-generated code, run AI agent output safely, or execute reproducible tasks. + * + * Request: + * - No request body required + * - Authentication via x-api-key header + * + * Response: + * - 200: { sandboxId: string, status: string, timeout: number, createdAt: string } + * - 400: { error: "Failed to create sandbox" } + * - 401: { status: "error", error: "x-api-key header required" or "Invalid API key" } + * + * @param request - The request object + * @returns A NextResponse with the created sandbox data or error + */ +export async function POST(request: NextRequest) { + return createSandboxPostHandler(request); +} diff --git a/lib/sandbox/createSandbox.ts b/lib/sandbox/createSandbox.ts new file mode 100644 index 00000000..895715db --- /dev/null +++ b/lib/sandbox/createSandbox.ts @@ -0,0 +1,28 @@ +import { Sandbox } from "@vercel/sandbox"; + +/** + * Response from creating a sandbox. + */ +export interface SandboxCreatedResponse { + sandboxId: string; + status: "pending" | "running" | "stopping" | "stopped" | "failed"; + timeout: number; + createdAt: string; +} + +/** + * Creates a new ephemeral sandbox environment using Vercel Sandbox SDK. + * + * @returns The created sandbox details + * @throws Error if sandbox creation fails + */ +export async function createSandbox(): Promise { + const sandbox = await Sandbox.create(); + + return { + sandboxId: sandbox.sandboxId, + status: sandbox.status, + timeout: sandbox.timeout, + createdAt: sandbox.createdAt.toISOString(), + }; +} diff --git a/lib/sandbox/createSandboxPostHandler.ts b/lib/sandbox/createSandboxPostHandler.ts new file mode 100644 index 00000000..1c301200 --- /dev/null +++ b/lib/sandbox/createSandboxPostHandler.ts @@ -0,0 +1,29 @@ +import { NextRequest, NextResponse } from "next/server"; +import { getCorsHeaders } from "@/lib/networking/getCorsHeaders"; +import { getApiKeyAccountId } from "@/lib/auth/getApiKeyAccountId"; +import { createSandbox } from "@/lib/sandbox/createSandbox"; + +/** + * Handler for POST /api/sandbox. + * + * Creates a new ephemeral sandbox environment. Requires authentication via x-api-key header. + * No request body is required. + * + * @param request - The request object + * @returns A NextResponse with sandbox data or error + */ +export async function createSandboxPostHandler(request: NextRequest): Promise { + const accountIdOrError = await getApiKeyAccountId(request); + if (accountIdOrError instanceof NextResponse) { + return accountIdOrError; + } + + try { + const sandbox = await createSandbox(); + + return NextResponse.json(sandbox, { status: 200, headers: getCorsHeaders() }); + } catch (error) { + const message = error instanceof Error ? error.message : "Failed to create sandbox"; + return NextResponse.json({ error: message }, { status: 400, headers: getCorsHeaders() }); + } +} diff --git a/package.json b/package.json index d26f5869..a049e0c0 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,6 @@ }, "dependencies": { "@ai-sdk/anthropic": "^3.0.13", - "autoevals": "^0.0.129", - "braintrust": "^0.4.9", "@ai-sdk/gateway": "^3.0.14", "@ai-sdk/google": "^3.0.8", "@ai-sdk/mcp": "^0.0.12", @@ -31,9 +29,12 @@ "@privy-io/node": "^0.6.2", "@supabase/supabase-js": "^2.86.0", "@trigger.dev/sdk": "^4.2.0", + "@vercel/sandbox": "^1.3.1", "ai": "6.0.0-beta.122", "apify-client": "^2.20.0", "arweave": "^1.15.7", + "autoevals": "^0.0.129", + "braintrust": "^0.4.9", "bullmq": "^5.65.1", "googleapis": "^168.0.0", "ioredis": "^5.8.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0686ba0..f92d135c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,9 @@ importers: '@trigger.dev/sdk': specifier: ^4.2.0 version: 4.2.0(ai@6.0.0-beta.122(zod@4.1.13))(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.1.13) + '@vercel/sandbox': + specifier: ^1.3.1 + version: 1.3.1 ai: specifier: 6.0.0-beta.122 version: 6.0.0-beta.122(zod@4.1.13) @@ -2346,6 +2349,9 @@ packages: resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} engines: {node: '>= 20'} + '@vercel/sandbox@1.3.1': + resolution: {integrity: sha512-FFeeJgb4mcm89LSS2ta5kUlAbJ4FsjBbi6otK6Au50GJh9ubzdZuaxiVhWas9NlQ9EnE3FZsIslLLLvjN7Onlw==} + '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} @@ -2749,9 +2755,25 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} @@ -3506,6 +3528,9 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -3568,6 +3593,9 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -4193,6 +4221,9 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsonlines@0.1.1: + resolution: {integrity: sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==} + jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} @@ -4650,6 +4681,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + ow@0.28.2: resolution: {integrity: sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==} engines: {node: '>=12'} @@ -5348,6 +5383,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -5465,9 +5503,15 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} @@ -5630,6 +5674,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.19.0: + resolution: {integrity: sha512-Heho1hJD81YChi+uS2RkSjcVO+EQLmLSyUlHyp7Y/wFbxQaGb4WXVKD073JytrjXJVkSZVzoE2MCSOKugFGtOQ==} + engines: {node: '>=20.18.1'} + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -6015,6 +6063,14 @@ packages: x402@0.7.3: resolution: {integrity: sha512-8CIZsdMTOn52PjMH/ErVke9ebeZ7ErwiZ5FL3tN3Wny7Ynxs3LkuB/0q7IoccRLdVXA7f2lueYBJ2iDrElhXnA==} + xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + xmlhttprequest-ssl@2.0.0: resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} engines: {node: '>=0.4.0'} @@ -6067,6 +6123,9 @@ packages: zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -8891,6 +8950,21 @@ snapshots: '@vercel/oidc@3.1.0': {} + '@vercel/sandbox@1.3.1': + dependencies: + '@vercel/oidc': 3.1.0 + async-retry: 1.3.3 + jsonlines: 0.1.1 + ms: 2.1.3 + picocolors: 1.1.1 + tar-stream: 3.1.7 + undici: 7.19.0 + xdg-app-paths: 5.1.0 + zod: 3.24.4 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.3 @@ -9853,8 +9927,12 @@ snapshots: axobject-query@4.1.0: {} + b4a@1.7.3: {} + balanced-match@1.0.2: {} + bare-events@2.8.2: {} + base-x@3.0.11: dependencies: safe-buffer: 5.2.1 @@ -10835,6 +10913,12 @@ snapshots: eventemitter3@5.0.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} eventsource-parser@1.1.2: {} @@ -10953,6 +11037,8 @@ snapshots: fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.1: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -11616,6 +11702,8 @@ snapshots: dependencies: minimist: 1.2.8 + jsonlines@0.1.1: {} + jsprim@1.4.2: dependencies: assert-plus: 1.0.0 @@ -12070,6 +12158,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + os-paths@4.4.0: {} + ow@0.28.2: dependencies: '@sindresorhus/is': 4.6.0 @@ -12965,6 +13055,15 @@ snapshots: stream-shift@1.0.3: {} + streamx@2.23.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + strict-uri-encode@2.0.0: {} string-width@4.2.3: @@ -13131,10 +13230,25 @@ snapshots: - tsx - yaml + tar-stream@3.1.7: + dependencies: + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + tdigest@0.1.2: dependencies: bintrees: 1.0.2 + text-decoder@1.2.3: + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + text-encoding-utf-8@1.0.2: {} thenify-all@1.6.0: @@ -13302,6 +13416,8 @@ snapshots: undici-types@7.16.0: {} + undici@7.19.0: {} + universalify@0.2.0: {} unpipe@1.0.0: {} @@ -13857,6 +13973,14 @@ snapshots: - utf-8-validate - ws + xdg-app-paths@5.1.0: + dependencies: + xdg-portable: 7.3.0 + + xdg-portable@7.3.0: + dependencies: + os-paths: 4.4.0 + xmlhttprequest-ssl@2.0.0: {} xmlhttprequest-ssl@2.1.2: {} @@ -13908,6 +14032,8 @@ snapshots: zod@3.22.4: {} + zod@3.24.4: {} + zod@3.25.76: {} zod@4.1.13: {} From 7ef36d51f32fc8e95b44b51d62d2aaa4a461861a Mon Sep 17 00:00:00 2001 From: Sweets Sweetman Date: Fri, 23 Jan 2026 14:25:28 -0500 Subject: [PATCH 3/4] fix: add snapshotting status to SandboxCreatedResponse The Vercel Sandbox SDK includes "snapshotting" as a valid status. Co-Authored-By: Claude Opus 4.5 --- lib/sandbox/createSandbox.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sandbox/createSandbox.ts b/lib/sandbox/createSandbox.ts index 895715db..4d047e1c 100644 --- a/lib/sandbox/createSandbox.ts +++ b/lib/sandbox/createSandbox.ts @@ -5,7 +5,7 @@ import { Sandbox } from "@vercel/sandbox"; */ export interface SandboxCreatedResponse { sandboxId: string; - status: "pending" | "running" | "stopping" | "stopped" | "failed"; + status: "pending" | "running" | "stopping" | "stopped" | "failed" | "snapshotting"; timeout: number; createdAt: string; } From c96bac3ae531dc8c5e43818693b2bf5906d183ae Mon Sep 17 00:00:00 2001 From: Sweets Sweetman Date: Fri, 23 Jan 2026 14:56:01 -0500 Subject: [PATCH 4/4] refactor: use Sandbox SDK types for SandboxCreatedResponse DRY - reference types from @vercel/sandbox instead of duplicating. Co-Authored-By: Claude Opus 4.5 --- lib/sandbox/createSandbox.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/sandbox/createSandbox.ts b/lib/sandbox/createSandbox.ts index 4d047e1c..53082fb4 100644 --- a/lib/sandbox/createSandbox.ts +++ b/lib/sandbox/createSandbox.ts @@ -2,11 +2,12 @@ import { Sandbox } from "@vercel/sandbox"; /** * Response from creating a sandbox. + * Uses Sandbox class types from @vercel/sandbox SDK. */ export interface SandboxCreatedResponse { - sandboxId: string; - status: "pending" | "running" | "stopping" | "stopped" | "failed" | "snapshotting"; - timeout: number; + sandboxId: Sandbox["sandboxId"]; + status: Sandbox["status"]; + timeout: Sandbox["timeout"]; createdAt: string; }