Sign In

@vercel/sandbox

Package Overview
Dependencies
Maintainers
4
Versions
106
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vercel/sandbox - npm Package Compare versions

Comparing version
2.9.2
to
2.10.0-beta.0
+194
dist/drive.cjs
const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
const require_api_client = require('./api-client/api-client.cjs');
require('./api-client/index.cjs');
const require_get_credentials = require('./utils/get-credentials.cjs');
const require_paginator = require('./utils/paginator.cjs');
let __workflow_serde = require("@workflow/serde");
//#region src/drive.ts
/**
* A Drive is a persistent, bottomless storage that can be attached and detached to Sandboxes.
* Drives can be mounted as read-write or read-only, at a configurable path with `Sandbox.create()`.
*
* Use {@link Drive.getOrCreate} to construct.
* @hideconstructor
*/
var Drive = class Drive {
/**
* Lazily resolve credentials and construct an API client.
* @internal
*/
async ensureClient() {
"use step";
if (this._client) return this._client;
const credentials = await require_get_credentials.getCredentials();
this._client = new require_api_client.APIClient({
teamId: credentials.teamId,
token: credentials.token
});
return this._client;
}
/**
* The name of the drive.
*/
get name() {
return this.drive.name;
}
/**
* The project ID that owns the drive.
*/
get projectId() {
return this._projectId;
}
/**
* The maximum drive size in bytes.
*/
get maxSize() {
return this.drive.maxSizeBytes;
}
/**
* Current session ID the drive is attached to, if any.
*/
get currentSessionId() {
return this.drive.currentSessionId;
}
/**
* Current sandbox name the drive is attached to, if any.
*/
get currentSandboxName() {
return this.drive.currentSandboxName;
}
/**
* Timestamp when the drive was created.
*/
get createdAt() {
return new Date(this.drive.createdAt);
}
/**
* Timestamp when the drive was last updated.
*/
get updatedAt() {
return new Date(this.drive.updatedAt);
}
/**
* Serialize a Drive instance to plain data for @workflow/serde.
*
* @param instance - The Drive instance to serialize
* @returns A plain object containing drive metadata
*/
static [__workflow_serde.WORKFLOW_SERIALIZE](instance) {
return {
drive: instance.drive,
projectId: instance._projectId
};
}
/**
* Deserialize a Drive from serialized data.
*
* The deserialized instance uses the serialized metadata synchronously and
* lazily creates an API client only when methods perform API requests.
*
* @param data - The serialized drive data
* @returns The reconstructed Drive instance
*/
static [__workflow_serde.WORKFLOW_DESERIALIZE](data) {
return new Drive({
drive: data.drive,
projectId: data.projectId
});
}
constructor({ client, drive, projectId }) {
this._client = null;
this._client = client ?? null;
this.drive = drive;
this._projectId = projectId ?? drive.projectId;
}
/**
* Allow to get a list of drives for a team narrowed to the given params.
* It returns both the drives and the pagination metadata to allow getting
* the next page of results.
*
* The returned object is async-iterable to auto-paginate through all pages:
*
* ```ts
* const result = await Drive.list({ limit: 10 });
* for await (const drive of result) { ... }
* // or: await result.toArray();
* // or: for await (const page of result.pages()) { ... }
* ```
*/
static async list(params) {
"use step";
const credentials = await require_get_credentials.getCredentials(params);
const client = new require_api_client.APIClient({
teamId: credentials.teamId,
token: credentials.token,
fetch: params?.fetch
});
const fetchPage = async (cursor) => {
const response = await client.listDrives({
...credentials,
...params,
...cursor !== void 0 && { cursor }
});
return {
...response.json,
drives: response.json.drives.map((drive) => new Drive({
client,
drive,
projectId: credentials.projectId
}))
};
};
return require_paginator.attachPaginator(await fetchPage(params?.cursor ?? params?.until), {
itemsKey: "drives",
fetchNext: fetchPage,
signal: params?.signal
});
}
/**
* Retrieve an existing drive, or create a new one if it doesn't exists.
*
* @param params - Get/create parameters and optional credentials.
* @returns A promise resolving to the {@link Drive}.
*/
static async getOrCreate(params) {
"use step";
const credentials = await require_get_credentials.getCredentials(params);
const client = new require_api_client.APIClient({
teamId: credentials.teamId,
token: credentials.token,
fetch: params.fetch
});
return new Drive({
client,
drive: (await client.getOrCreateDrive({
projectId: credentials.projectId,
name: params.name,
maxSizeBytes: params.maxSize,
signal: params.signal
})).json.drive,
projectId: credentials.projectId
});
}
/**
* Delete this drive. The drive must not be attached to any sandbox.
* This operation is irreversible and will delete all data stored in the drive.
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel the operation.
* @returns A promise that resolves once the drive has been deleted.
*/
async delete(opts) {
"use step";
this.drive = (await (await this.ensureClient()).deleteDrive({
projectId: this._projectId,
name: this.drive.name,
signal: opts?.signal
})).json.drive;
}
};
//#endregion
exports.Drive = Drive;
//# sourceMappingURL=drive.cjs.map
{"version":3,"file":"drive.cjs","names":["getCredentials","APIClient","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","attachPaginator"],"sources":["../src/drive.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport type { WithFetchOptions } from \"./api-client/api-client.js\";\nimport type { DriveMetadata } from \"./api-client/index.js\";\nimport { APIClient } from \"./api-client/index.js\";\nimport { type Credentials, getCredentials } from \"./utils/get-credentials.js\";\nimport { attachPaginator } from \"./utils/paginator.js\";\n\nexport interface SerializedDrive {\n drive: DriveMetadata;\n projectId?: string;\n}\n\n/** @inline */\ninterface GetOrCreateDriveParams {\n /**\n * The name of the drive to get or create. Must be unique within the project.\n */\n name: string;\n /**\n * Maximum drive size in bytes. If omitted, a default of 100 GiB is used.\n */\n maxSize?: number;\n /**\n * An AbortSignal to cancel the operation.\n */\n signal?: AbortSignal;\n}\n\n/**\n * A Drive is a persistent, bottomless storage that can be attached and detached to Sandboxes.\n * Drives can be mounted as read-write or read-only, at a configurable path with `Sandbox.create()`.\n *\n * Use {@link Drive.getOrCreate} to construct.\n * @hideconstructor\n */\nexport class Drive {\n private _client: APIClient | null = null;\n private drive: DriveMetadata;\n private readonly _projectId: string;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n private async ensureClient(): Promise<APIClient> {\n \"use step\";\n if (this._client) return this._client;\n const credentials = await getCredentials();\n this._client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n });\n return this._client;\n }\n\n /**\n * The name of the drive.\n */\n public get name(): string {\n return this.drive.name;\n }\n\n /**\n * The project ID that owns the drive.\n */\n public get projectId(): string {\n return this._projectId;\n }\n\n /**\n * The maximum drive size in bytes.\n */\n public get maxSize(): number {\n return this.drive.maxSizeBytes;\n }\n\n /**\n * Current session ID the drive is attached to, if any.\n */\n public get currentSessionId(): string | undefined {\n return this.drive.currentSessionId;\n }\n\n /**\n * Current sandbox name the drive is attached to, if any.\n */\n public get currentSandboxName(): string | undefined {\n return this.drive.currentSandboxName;\n }\n\n /**\n * Timestamp when the drive was created.\n */\n public get createdAt(): Date {\n return new Date(this.drive.createdAt);\n }\n\n /**\n * Timestamp when the drive was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.drive.updatedAt);\n }\n\n /**\n * Serialize a Drive instance to plain data for @workflow/serde.\n *\n * @param instance - The Drive instance to serialize\n * @returns A plain object containing drive metadata\n */\n static [WORKFLOW_SERIALIZE](instance: Drive): SerializedDrive {\n return {\n drive: instance.drive,\n projectId: instance._projectId,\n };\n }\n\n /**\n * Deserialize a Drive from serialized data.\n *\n * The deserialized instance uses the serialized metadata synchronously and\n * lazily creates an API client only when methods perform API requests.\n *\n * @param data - The serialized drive data\n * @returns The reconstructed Drive instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedDrive): Drive {\n return new Drive({\n drive: data.drive,\n projectId: data.projectId,\n });\n }\n\n constructor({\n client,\n drive,\n projectId,\n }: {\n client?: APIClient;\n drive: DriveMetadata;\n projectId?: string;\n }) {\n this._client = client ?? null;\n this.drive = drive;\n this._projectId = projectId ?? drive.projectId;\n }\n\n /**\n * Allow to get a list of drives for a team narrowed to the given params.\n * It returns both the drives and the pagination metadata to allow getting\n * the next page of results.\n *\n * The returned object is async-iterable to auto-paginate through all pages:\n *\n * ```ts\n * const result = await Drive.list({ limit: 10 });\n * for await (const drive of result) { ... }\n * // or: await result.toArray();\n * // or: for await (const page of result.pages()) { ... }\n * ```\n */\n static async list(\n params?: Partial<Parameters<APIClient[\"listDrives\"]>[0]> &\n Partial<Credentials> &\n WithFetchOptions,\n ) {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n const fetchPage = async (cursor?: string | number) => {\n const response = await client.listDrives({\n ...credentials,\n ...params,\n ...(cursor !== undefined && { cursor }),\n });\n return {\n ...response.json,\n drives: response.json.drives.map(\n (drive) =>\n new Drive({\n client,\n drive,\n projectId: credentials.projectId,\n }),\n ),\n };\n };\n const firstPage = await fetchPage(params?.cursor ?? params?.until);\n return attachPaginator(firstPage, {\n itemsKey: \"drives\",\n fetchNext: fetchPage,\n signal: params?.signal,\n });\n }\n\n /**\n * Retrieve an existing drive, or create a new one if it doesn't exists.\n *\n * @param params - Get/create parameters and optional credentials.\n * @returns A promise resolving to the {@link Drive}.\n */\n static async getOrCreate(\n params: (\n | GetOrCreateDriveParams\n | (GetOrCreateDriveParams & Credentials)\n ) &\n WithFetchOptions,\n ): Promise<Drive> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params.fetch,\n });\n\n const response = await client.getOrCreateDrive({\n projectId: credentials.projectId,\n name: params.name,\n maxSizeBytes: params.maxSize,\n signal: params.signal,\n });\n\n return new Drive({\n client,\n drive: response.json.drive,\n projectId: credentials.projectId,\n });\n }\n\n /**\n * Delete this drive. The drive must not be attached to any sandbox.\n * This operation is irreversible and will delete all data stored in the drive.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves once the drive has been deleted.\n */\n async delete(opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.deleteDrive({\n projectId: this._projectId,\n name: this.drive.name,\n signal: opts?.signal,\n });\n\n this.drive = response.json.drive;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmCA,IAAa,QAAb,MAAa,MAAM;;;;;CASjB,MAAc,eAAmC;AAC/C;AACA,MAAI,KAAK,QAAS,QAAO,KAAK;EAC9B,MAAM,cAAc,MAAMA,wCAAgB;AAC1C,OAAK,UAAU,IAAIC,6BAAU;GAC3B,QAAQ,YAAY;GACpB,OAAO,YAAY;GACpB,CAAC;AACF,SAAO,KAAK;;;;;CAMd,IAAW,OAAe;AACxB,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,YAAoB;AAC7B,SAAO,KAAK;;;;;CAMd,IAAW,UAAkB;AAC3B,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,mBAAuC;AAChD,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,qBAAyC;AAClD,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,YAAkB;AAC3B,SAAO,IAAI,KAAK,KAAK,MAAM,UAAU;;;;;CAMvC,IAAW,YAAkB;AAC3B,SAAO,IAAI,KAAK,KAAK,MAAM,UAAU;;;;;;;;CASvC,QAAQC,qCAAoB,UAAkC;AAC5D,SAAO;GACL,OAAO,SAAS;GAChB,WAAW,SAAS;GACrB;;;;;;;;;;;CAYH,QAAQC,uCAAsB,MAA8B;AAC1D,SAAO,IAAI,MAAM;GACf,OAAO,KAAK;GACZ,WAAW,KAAK;GACjB,CAAC;;CAGJ,YAAY,EACV,QACA,OACA,aAKC;OAzGK,UAA4B;AA0GlC,OAAK,UAAU,UAAU;AACzB,OAAK,QAAQ;AACb,OAAK,aAAa,aAAa,MAAM;;;;;;;;;;;;;;;;CAiBvC,aAAa,KACX,QAGA;AACA;EACA,MAAM,cAAc,MAAMH,uCAAe,OAAO;EAChD,MAAM,SAAS,IAAIC,6BAAU;GAC3B,QAAQ,YAAY;GACpB,OAAO,YAAY;GACnB,OAAO,QAAQ;GAChB,CAAC;EACF,MAAM,YAAY,OAAO,WAA6B;GACpD,MAAM,WAAW,MAAM,OAAO,WAAW;IACvC,GAAG;IACH,GAAG;IACH,GAAI,WAAW,UAAa,EAAE,QAAQ;IACvC,CAAC;AACF,UAAO;IACL,GAAG,SAAS;IACZ,QAAQ,SAAS,KAAK,OAAO,KAC1B,UACC,IAAI,MAAM;KACR;KACA;KACA,WAAW,YAAY;KACxB,CAAC,CACL;IACF;;AAGH,SAAOG,kCADW,MAAM,UAAU,QAAQ,UAAU,QAAQ,MAAM,EAChC;GAChC,UAAU;GACV,WAAW;GACX,QAAQ,QAAQ;GACjB,CAAC;;;;;;;;CASJ,aAAa,YACX,QAKgB;AAChB;EACA,MAAM,cAAc,MAAMJ,uCAAe,OAAO;EAChD,MAAM,SAAS,IAAIC,6BAAU;GAC3B,QAAQ,YAAY;GACpB,OAAO,YAAY;GACnB,OAAO,OAAO;GACf,CAAC;AASF,SAAO,IAAI,MAAM;GACf;GACA,QATe,MAAM,OAAO,iBAAiB;IAC7C,WAAW,YAAY;IACvB,MAAM,OAAO;IACb,cAAc,OAAO;IACrB,QAAQ,OAAO;IAChB,CAAC,EAIgB,KAAK;GACrB,WAAW,YAAY;GACxB,CAAC;;;;;;;;;;CAWJ,MAAM,OAAO,MAAgD;AAC3D;AAQA,OAAK,SANY,OADF,MAAM,KAAK,cAAc,EACV,YAAY;GACxC,WAAW,KAAK;GAChB,MAAM,KAAK,MAAM;GACjB,QAAQ,MAAM;GACf,CAAC,EAEoB,KAAK"}
import { Paginator } from "./utils/paginator.cjs";
import { DriveMetadata } from "./api-client/validators.cjs";
import { APIClient, WithFetchOptions } from "./api-client/api-client.cjs";
import { Credentials } from "./utils/get-credentials.cjs";
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@workflow/serde";
//#region src/drive.d.ts
interface SerializedDrive {
drive: DriveMetadata;
projectId?: string;
}
/** @inline */
interface GetOrCreateDriveParams {
/**
* The name of the drive to get or create. Must be unique within the project.
*/
name: string;
/**
* Maximum drive size in bytes. If omitted, a default of 100 GiB is used.
*/
maxSize?: number;
/**
* An AbortSignal to cancel the operation.
*/
signal?: AbortSignal;
}
/**
* A Drive is a persistent, bottomless storage that can be attached and detached to Sandboxes.
* Drives can be mounted as read-write or read-only, at a configurable path with `Sandbox.create()`.
*
* Use {@link Drive.getOrCreate} to construct.
* @hideconstructor
*/
declare class Drive {
private _client;
private drive;
private readonly _projectId;
/**
* Lazily resolve credentials and construct an API client.
* @internal
*/
private ensureClient;
/**
* The name of the drive.
*/
get name(): string;
/**
* The project ID that owns the drive.
*/
get projectId(): string;
/**
* The maximum drive size in bytes.
*/
get maxSize(): number;
/**
* Current session ID the drive is attached to, if any.
*/
get currentSessionId(): string | undefined;
/**
* Current sandbox name the drive is attached to, if any.
*/
get currentSandboxName(): string | undefined;
/**
* Timestamp when the drive was created.
*/
get createdAt(): Date;
/**
* Timestamp when the drive was last updated.
*/
get updatedAt(): Date;
/**
* Serialize a Drive instance to plain data for @workflow/serde.
*
* @param instance - The Drive instance to serialize
* @returns A plain object containing drive metadata
*/
static [WORKFLOW_SERIALIZE](instance: Drive): SerializedDrive;
/**
* Deserialize a Drive from serialized data.
*
* The deserialized instance uses the serialized metadata synchronously and
* lazily creates an API client only when methods perform API requests.
*
* @param data - The serialized drive data
* @returns The reconstructed Drive instance
*/
static [WORKFLOW_DESERIALIZE](data: SerializedDrive): Drive;
constructor({
client,
drive,
projectId
}: {
client?: APIClient;
drive: DriveMetadata;
projectId?: string;
});
/**
* Allow to get a list of drives for a team narrowed to the given params.
* It returns both the drives and the pagination metadata to allow getting
* the next page of results.
*
* The returned object is async-iterable to auto-paginate through all pages:
*
* ```ts
* const result = await Drive.list({ limit: 10 });
* for await (const drive of result) { ... }
* // or: await result.toArray();
* // or: for await (const page of result.pages()) { ... }
* ```
*/
static list(params?: Partial<Parameters<APIClient["listDrives"]>[0]> & Partial<Credentials> & WithFetchOptions): Promise<Paginator<{
drives: Drive[];
pagination: {
count: number;
next: string | null;
};
}, "drives">>;
/**
* Retrieve an existing drive, or create a new one if it doesn't exists.
*
* @param params - Get/create parameters and optional credentials.
* @returns A promise resolving to the {@link Drive}.
*/
static getOrCreate(params: (GetOrCreateDriveParams | (GetOrCreateDriveParams & Credentials)) & WithFetchOptions): Promise<Drive>;
/**
* Delete this drive. The drive must not be attached to any sandbox.
* This operation is irreversible and will delete all data stored in the drive.
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel the operation.
* @returns A promise that resolves once the drive has been deleted.
*/
delete(opts?: {
signal?: AbortSignal;
}): Promise<void>;
}
//#endregion
export { Drive, SerializedDrive };
//# sourceMappingURL=drive.d.cts.map
import { Paginator } from "./utils/paginator.js";
import { DriveMetadata } from "./api-client/validators.js";
import { APIClient, WithFetchOptions } from "./api-client/api-client.js";
import "./api-client/index.js";
import { Credentials } from "./utils/get-credentials.js";
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@workflow/serde";
//#region src/drive.d.ts
interface SerializedDrive {
drive: DriveMetadata;
projectId?: string;
}
/** @inline */
interface GetOrCreateDriveParams {
/**
* The name of the drive to get or create. Must be unique within the project.
*/
name: string;
/**
* Maximum drive size in bytes. If omitted, a default of 100 GiB is used.
*/
maxSize?: number;
/**
* An AbortSignal to cancel the operation.
*/
signal?: AbortSignal;
}
/**
* A Drive is a persistent, bottomless storage that can be attached and detached to Sandboxes.
* Drives can be mounted as read-write or read-only, at a configurable path with `Sandbox.create()`.
*
* Use {@link Drive.getOrCreate} to construct.
* @hideconstructor
*/
declare class Drive {
private _client;
private drive;
private readonly _projectId;
/**
* Lazily resolve credentials and construct an API client.
* @internal
*/
private ensureClient;
/**
* The name of the drive.
*/
get name(): string;
/**
* The project ID that owns the drive.
*/
get projectId(): string;
/**
* The maximum drive size in bytes.
*/
get maxSize(): number;
/**
* Current session ID the drive is attached to, if any.
*/
get currentSessionId(): string | undefined;
/**
* Current sandbox name the drive is attached to, if any.
*/
get currentSandboxName(): string | undefined;
/**
* Timestamp when the drive was created.
*/
get createdAt(): Date;
/**
* Timestamp when the drive was last updated.
*/
get updatedAt(): Date;
/**
* Serialize a Drive instance to plain data for @workflow/serde.
*
* @param instance - The Drive instance to serialize
* @returns A plain object containing drive metadata
*/
static [WORKFLOW_SERIALIZE](instance: Drive): SerializedDrive;
/**
* Deserialize a Drive from serialized data.
*
* The deserialized instance uses the serialized metadata synchronously and
* lazily creates an API client only when methods perform API requests.
*
* @param data - The serialized drive data
* @returns The reconstructed Drive instance
*/
static [WORKFLOW_DESERIALIZE](data: SerializedDrive): Drive;
constructor({
client,
drive,
projectId
}: {
client?: APIClient;
drive: DriveMetadata;
projectId?: string;
});
/**
* Allow to get a list of drives for a team narrowed to the given params.
* It returns both the drives and the pagination metadata to allow getting
* the next page of results.
*
* The returned object is async-iterable to auto-paginate through all pages:
*
* ```ts
* const result = await Drive.list({ limit: 10 });
* for await (const drive of result) { ... }
* // or: await result.toArray();
* // or: for await (const page of result.pages()) { ... }
* ```
*/
static list(params?: Partial<Parameters<APIClient["listDrives"]>[0]> & Partial<Credentials> & WithFetchOptions): Promise<Paginator<{
drives: Drive[];
pagination: {
count: number;
next: string | null;
};
}, "drives">>;
/**
* Retrieve an existing drive, or create a new one if it doesn't exists.
*
* @param params - Get/create parameters and optional credentials.
* @returns A promise resolving to the {@link Drive}.
*/
static getOrCreate(params: (GetOrCreateDriveParams | (GetOrCreateDriveParams & Credentials)) & WithFetchOptions): Promise<Drive>;
/**
* Delete this drive. The drive must not be attached to any sandbox.
* This operation is irreversible and will delete all data stored in the drive.
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel the operation.
* @returns A promise that resolves once the drive has been deleted.
*/
delete(opts?: {
signal?: AbortSignal;
}): Promise<void>;
}
//#endregion
export { Drive, SerializedDrive };
//# sourceMappingURL=drive.d.ts.map
import { APIClient } from "./api-client/api-client.js";
import "./api-client/index.js";
import { getCredentials } from "./utils/get-credentials.js";
import { attachPaginator } from "./utils/paginator.js";
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "@workflow/serde";
//#region src/drive.ts
/**
* A Drive is a persistent, bottomless storage that can be attached and detached to Sandboxes.
* Drives can be mounted as read-write or read-only, at a configurable path with `Sandbox.create()`.
*
* Use {@link Drive.getOrCreate} to construct.
* @hideconstructor
*/
var Drive = class Drive {
/**
* Lazily resolve credentials and construct an API client.
* @internal
*/
async ensureClient() {
"use step";
if (this._client) return this._client;
const credentials = await getCredentials();
this._client = new APIClient({
teamId: credentials.teamId,
token: credentials.token
});
return this._client;
}
/**
* The name of the drive.
*/
get name() {
return this.drive.name;
}
/**
* The project ID that owns the drive.
*/
get projectId() {
return this._projectId;
}
/**
* The maximum drive size in bytes.
*/
get maxSize() {
return this.drive.maxSizeBytes;
}
/**
* Current session ID the drive is attached to, if any.
*/
get currentSessionId() {
return this.drive.currentSessionId;
}
/**
* Current sandbox name the drive is attached to, if any.
*/
get currentSandboxName() {
return this.drive.currentSandboxName;
}
/**
* Timestamp when the drive was created.
*/
get createdAt() {
return new Date(this.drive.createdAt);
}
/**
* Timestamp when the drive was last updated.
*/
get updatedAt() {
return new Date(this.drive.updatedAt);
}
/**
* Serialize a Drive instance to plain data for @workflow/serde.
*
* @param instance - The Drive instance to serialize
* @returns A plain object containing drive metadata
*/
static [WORKFLOW_SERIALIZE](instance) {
return {
drive: instance.drive,
projectId: instance._projectId
};
}
/**
* Deserialize a Drive from serialized data.
*
* The deserialized instance uses the serialized metadata synchronously and
* lazily creates an API client only when methods perform API requests.
*
* @param data - The serialized drive data
* @returns The reconstructed Drive instance
*/
static [WORKFLOW_DESERIALIZE](data) {
return new Drive({
drive: data.drive,
projectId: data.projectId
});
}
constructor({ client, drive, projectId }) {
this._client = null;
this._client = client ?? null;
this.drive = drive;
this._projectId = projectId ?? drive.projectId;
}
/**
* Allow to get a list of drives for a team narrowed to the given params.
* It returns both the drives and the pagination metadata to allow getting
* the next page of results.
*
* The returned object is async-iterable to auto-paginate through all pages:
*
* ```ts
* const result = await Drive.list({ limit: 10 });
* for await (const drive of result) { ... }
* // or: await result.toArray();
* // or: for await (const page of result.pages()) { ... }
* ```
*/
static async list(params) {
"use step";
const credentials = await getCredentials(params);
const client = new APIClient({
teamId: credentials.teamId,
token: credentials.token,
fetch: params?.fetch
});
const fetchPage = async (cursor) => {
const response = await client.listDrives({
...credentials,
...params,
...cursor !== void 0 && { cursor }
});
return {
...response.json,
drives: response.json.drives.map((drive) => new Drive({
client,
drive,
projectId: credentials.projectId
}))
};
};
return attachPaginator(await fetchPage(params?.cursor ?? params?.until), {
itemsKey: "drives",
fetchNext: fetchPage,
signal: params?.signal
});
}
/**
* Retrieve an existing drive, or create a new one if it doesn't exists.
*
* @param params - Get/create parameters and optional credentials.
* @returns A promise resolving to the {@link Drive}.
*/
static async getOrCreate(params) {
"use step";
const credentials = await getCredentials(params);
const client = new APIClient({
teamId: credentials.teamId,
token: credentials.token,
fetch: params.fetch
});
return new Drive({
client,
drive: (await client.getOrCreateDrive({
projectId: credentials.projectId,
name: params.name,
maxSizeBytes: params.maxSize,
signal: params.signal
})).json.drive,
projectId: credentials.projectId
});
}
/**
* Delete this drive. The drive must not be attached to any sandbox.
* This operation is irreversible and will delete all data stored in the drive.
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel the operation.
* @returns A promise that resolves once the drive has been deleted.
*/
async delete(opts) {
"use step";
this.drive = (await (await this.ensureClient()).deleteDrive({
projectId: this._projectId,
name: this.drive.name,
signal: opts?.signal
})).json.drive;
}
};
//#endregion
export { Drive };
//# sourceMappingURL=drive.js.map
{"version":3,"file":"drive.js","names":[],"sources":["../src/drive.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport type { WithFetchOptions } from \"./api-client/api-client.js\";\nimport type { DriveMetadata } from \"./api-client/index.js\";\nimport { APIClient } from \"./api-client/index.js\";\nimport { type Credentials, getCredentials } from \"./utils/get-credentials.js\";\nimport { attachPaginator } from \"./utils/paginator.js\";\n\nexport interface SerializedDrive {\n drive: DriveMetadata;\n projectId?: string;\n}\n\n/** @inline */\ninterface GetOrCreateDriveParams {\n /**\n * The name of the drive to get or create. Must be unique within the project.\n */\n name: string;\n /**\n * Maximum drive size in bytes. If omitted, a default of 100 GiB is used.\n */\n maxSize?: number;\n /**\n * An AbortSignal to cancel the operation.\n */\n signal?: AbortSignal;\n}\n\n/**\n * A Drive is a persistent, bottomless storage that can be attached and detached to Sandboxes.\n * Drives can be mounted as read-write or read-only, at a configurable path with `Sandbox.create()`.\n *\n * Use {@link Drive.getOrCreate} to construct.\n * @hideconstructor\n */\nexport class Drive {\n private _client: APIClient | null = null;\n private drive: DriveMetadata;\n private readonly _projectId: string;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n private async ensureClient(): Promise<APIClient> {\n \"use step\";\n if (this._client) return this._client;\n const credentials = await getCredentials();\n this._client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n });\n return this._client;\n }\n\n /**\n * The name of the drive.\n */\n public get name(): string {\n return this.drive.name;\n }\n\n /**\n * The project ID that owns the drive.\n */\n public get projectId(): string {\n return this._projectId;\n }\n\n /**\n * The maximum drive size in bytes.\n */\n public get maxSize(): number {\n return this.drive.maxSizeBytes;\n }\n\n /**\n * Current session ID the drive is attached to, if any.\n */\n public get currentSessionId(): string | undefined {\n return this.drive.currentSessionId;\n }\n\n /**\n * Current sandbox name the drive is attached to, if any.\n */\n public get currentSandboxName(): string | undefined {\n return this.drive.currentSandboxName;\n }\n\n /**\n * Timestamp when the drive was created.\n */\n public get createdAt(): Date {\n return new Date(this.drive.createdAt);\n }\n\n /**\n * Timestamp when the drive was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.drive.updatedAt);\n }\n\n /**\n * Serialize a Drive instance to plain data for @workflow/serde.\n *\n * @param instance - The Drive instance to serialize\n * @returns A plain object containing drive metadata\n */\n static [WORKFLOW_SERIALIZE](instance: Drive): SerializedDrive {\n return {\n drive: instance.drive,\n projectId: instance._projectId,\n };\n }\n\n /**\n * Deserialize a Drive from serialized data.\n *\n * The deserialized instance uses the serialized metadata synchronously and\n * lazily creates an API client only when methods perform API requests.\n *\n * @param data - The serialized drive data\n * @returns The reconstructed Drive instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedDrive): Drive {\n return new Drive({\n drive: data.drive,\n projectId: data.projectId,\n });\n }\n\n constructor({\n client,\n drive,\n projectId,\n }: {\n client?: APIClient;\n drive: DriveMetadata;\n projectId?: string;\n }) {\n this._client = client ?? null;\n this.drive = drive;\n this._projectId = projectId ?? drive.projectId;\n }\n\n /**\n * Allow to get a list of drives for a team narrowed to the given params.\n * It returns both the drives and the pagination metadata to allow getting\n * the next page of results.\n *\n * The returned object is async-iterable to auto-paginate through all pages:\n *\n * ```ts\n * const result = await Drive.list({ limit: 10 });\n * for await (const drive of result) { ... }\n * // or: await result.toArray();\n * // or: for await (const page of result.pages()) { ... }\n * ```\n */\n static async list(\n params?: Partial<Parameters<APIClient[\"listDrives\"]>[0]> &\n Partial<Credentials> &\n WithFetchOptions,\n ) {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n const fetchPage = async (cursor?: string | number) => {\n const response = await client.listDrives({\n ...credentials,\n ...params,\n ...(cursor !== undefined && { cursor }),\n });\n return {\n ...response.json,\n drives: response.json.drives.map(\n (drive) =>\n new Drive({\n client,\n drive,\n projectId: credentials.projectId,\n }),\n ),\n };\n };\n const firstPage = await fetchPage(params?.cursor ?? params?.until);\n return attachPaginator(firstPage, {\n itemsKey: \"drives\",\n fetchNext: fetchPage,\n signal: params?.signal,\n });\n }\n\n /**\n * Retrieve an existing drive, or create a new one if it doesn't exists.\n *\n * @param params - Get/create parameters and optional credentials.\n * @returns A promise resolving to the {@link Drive}.\n */\n static async getOrCreate(\n params: (\n | GetOrCreateDriveParams\n | (GetOrCreateDriveParams & Credentials)\n ) &\n WithFetchOptions,\n ): Promise<Drive> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params.fetch,\n });\n\n const response = await client.getOrCreateDrive({\n projectId: credentials.projectId,\n name: params.name,\n maxSizeBytes: params.maxSize,\n signal: params.signal,\n });\n\n return new Drive({\n client,\n drive: response.json.drive,\n projectId: credentials.projectId,\n });\n }\n\n /**\n * Delete this drive. The drive must not be attached to any sandbox.\n * This operation is irreversible and will delete all data stored in the drive.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves once the drive has been deleted.\n */\n async delete(opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.deleteDrive({\n projectId: this._projectId,\n name: this.drive.name,\n signal: opts?.signal,\n });\n\n this.drive = response.json.drive;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAmCA,IAAa,QAAb,MAAa,MAAM;;;;;CASjB,MAAc,eAAmC;AAC/C;AACA,MAAI,KAAK,QAAS,QAAO,KAAK;EAC9B,MAAM,cAAc,MAAM,gBAAgB;AAC1C,OAAK,UAAU,IAAI,UAAU;GAC3B,QAAQ,YAAY;GACpB,OAAO,YAAY;GACpB,CAAC;AACF,SAAO,KAAK;;;;;CAMd,IAAW,OAAe;AACxB,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,YAAoB;AAC7B,SAAO,KAAK;;;;;CAMd,IAAW,UAAkB;AAC3B,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,mBAAuC;AAChD,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,qBAAyC;AAClD,SAAO,KAAK,MAAM;;;;;CAMpB,IAAW,YAAkB;AAC3B,SAAO,IAAI,KAAK,KAAK,MAAM,UAAU;;;;;CAMvC,IAAW,YAAkB;AAC3B,SAAO,IAAI,KAAK,KAAK,MAAM,UAAU;;;;;;;;CASvC,QAAQ,oBAAoB,UAAkC;AAC5D,SAAO;GACL,OAAO,SAAS;GAChB,WAAW,SAAS;GACrB;;;;;;;;;;;CAYH,QAAQ,sBAAsB,MAA8B;AAC1D,SAAO,IAAI,MAAM;GACf,OAAO,KAAK;GACZ,WAAW,KAAK;GACjB,CAAC;;CAGJ,YAAY,EACV,QACA,OACA,aAKC;OAzGK,UAA4B;AA0GlC,OAAK,UAAU,UAAU;AACzB,OAAK,QAAQ;AACb,OAAK,aAAa,aAAa,MAAM;;;;;;;;;;;;;;;;CAiBvC,aAAa,KACX,QAGA;AACA;EACA,MAAM,cAAc,MAAM,eAAe,OAAO;EAChD,MAAM,SAAS,IAAI,UAAU;GAC3B,QAAQ,YAAY;GACpB,OAAO,YAAY;GACnB,OAAO,QAAQ;GAChB,CAAC;EACF,MAAM,YAAY,OAAO,WAA6B;GACpD,MAAM,WAAW,MAAM,OAAO,WAAW;IACvC,GAAG;IACH,GAAG;IACH,GAAI,WAAW,UAAa,EAAE,QAAQ;IACvC,CAAC;AACF,UAAO;IACL,GAAG,SAAS;IACZ,QAAQ,SAAS,KAAK,OAAO,KAC1B,UACC,IAAI,MAAM;KACR;KACA;KACA,WAAW,YAAY;KACxB,CAAC,CACL;IACF;;AAGH,SAAO,gBADW,MAAM,UAAU,QAAQ,UAAU,QAAQ,MAAM,EAChC;GAChC,UAAU;GACV,WAAW;GACX,QAAQ,QAAQ;GACjB,CAAC;;;;;;;;CASJ,aAAa,YACX,QAKgB;AAChB;EACA,MAAM,cAAc,MAAM,eAAe,OAAO;EAChD,MAAM,SAAS,IAAI,UAAU;GAC3B,QAAQ,YAAY;GACpB,OAAO,YAAY;GACnB,OAAO,OAAO;GACf,CAAC;AASF,SAAO,IAAI,MAAM;GACf;GACA,QATe,MAAM,OAAO,iBAAiB;IAC7C,WAAW,YAAY;IACvB,MAAM,OAAO;IACb,cAAc,OAAO;IACrB,QAAQ,OAAO;IAChB,CAAC,EAIgB,KAAK;GACrB,WAAW,YAAY;GACxB,CAAC;;;;;;;;;;CAWJ,MAAM,OAAO,MAAgD;AAC3D;AAQA,OAAK,SANY,OADF,MAAM,KAAK,cAAc,EACV,YAAY;GACxC,WAAW,KAAK;GAChB,MAAM,KAAK,MAAM;GACjB,QAAQ,MAAM;GACf,CAAC,EAEoB,KAAK"}
+34
-0

@@ -105,2 +105,3 @@ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');

keepLastSnapshots: params.keepLastSnapshots,
mounts: params.mounts,
...privateParams

@@ -274,2 +275,27 @@ }),

}
async listDrives(params) {
return require_base_client.parseOrThrow(require_validators.DrivesResponse, await this.request(`/v2/sandboxes/drives`, {
query: {
projectId: params.projectId,
limit: params.limit,
cursor: params.cursor ?? params.until,
since: params.since,
sortBy: params.sortBy,
sortOrder: params.sortOrder,
namePrefix: params.namePrefix
},
method: "GET",
signal: params.signal
}));
}
async getOrCreateDrive(params) {
return require_base_client.parseOrThrow(require_validators.DriveResponse, await this.request(`/v2/sandboxes/drives/${encodeURIComponent(params.name)}`, {
method: "POST",
body: JSON.stringify({
projectId: params.projectId,
maxSizeBytes: params.maxSizeBytes
}),
signal: params.signal
}));
}
async writeFiles(params) {

@@ -434,2 +460,10 @@ const { writer, response } = this.getFileWriter({

}
async deleteDrive(params) {
const url = `/v2/sandboxes/drives/${encodeURIComponent(params.name)}`;
return require_base_client.parseOrThrow(require_validators.DriveResponse, await this.request(url, {
method: "DELETE",
query: { projectId: params.projectId },
signal: params.signal
}));
}
async updateSandbox(params) {

@@ -436,0 +470,0 @@ return require_base_client.parseOrThrow(require_validators.UpdateSandboxResponse, await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"api-client.cjs","names":["BaseClient","VERSION","getPrivateParams","parseOrThrow","SessionAndRoutesResponse","SandboxAndSessionResponse","toAPINetworkPolicy","z","APIError","StreamError","CommandResponse","CommandFinishedResponse","command","LogLine","InteractiveSessionResponse","EmptyResponse","FileWriter","consumeReadable","SessionsResponse","SnapshotsResponse","SnapshotTreeResponse","normalizePath","json: unknown","Readable","StopSessionResponse","SessionResponse","CreateSnapshotResponse","SnapshotResponse","query: Record<string, string | undefined>","SandboxesPaginationResponse","UpdateSandboxResponse"],"sources":["../../src/api-client/api-client.ts"],"sourcesContent":["import {\n BaseClient,\n parseOrThrow,\n type Parsed,\n type RequestParams,\n} from \"./base-client.js\";\nimport {\n type CommandFinishedData,\n SessionAndRoutesResponse,\n SessionResponse,\n InteractiveSessionResponse,\n StopSessionResponse,\n SessionsResponse,\n CommandResponse,\n CommandFinishedResponse,\n EmptyResponse,\n LogLine,\n type LogOutputLine,\n SnapshotsResponse,\n SnapshotTreeResponse,\n SnapshotResponse,\n CreateSnapshotResponse,\n SandboxAndSessionResponse,\n SandboxesPaginationResponse,\n UpdateSandboxResponse,\n type CommandData,\n} from \"./validators.js\";\nimport { APIError, StreamError } from \"./api-error.js\";\nimport { FileWriter } from \"./file-writer.js\";\nimport { VERSION } from \"../version.js\";\nimport { consumeReadable } from \"../utils/consume-readable.js\";\nimport { z } from \"zod\";\nimport jsonlines from \"jsonlines\";\nimport os from \"os\";\nimport { Readable } from \"stream\";\nimport { normalizePath } from \"../utils/normalizePath.js\";\nimport { getVercelOidcToken } from \"@vercel/oidc\";\nimport { NetworkPolicy } from \"../network-policy.js\";\nimport { toAPINetworkPolicy } from \"../utils/network-policy.js\";\nimport { getPrivateParams, WithPrivate } from \"../utils/types.js\";\nimport { RUNTIMES } from \"../constants.js\";\n\ninterface Claims {\n owner_id: string;\n project_id?: string;\n}\n\nfunction decodeUnverifiedToken(token: string): Claims | null {\n if (token.split(\".\").length !== 3) {\n return null;\n }\n try {\n const payload = JSON.parse(\n Buffer.from(token.split(\".\")[1], \"base64url\").toString(\"utf8\"),\n );\n if (payload.owner_id) {\n return { owner_id: payload.owner_id, project_id: payload.project_id };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface WithFetchOptions {\n fetch?: typeof globalThis.fetch;\n}\n\nexport class APIClient extends BaseClient {\n private teamId: string;\n private projectId: string | undefined;\n private isJwtToken: boolean;\n\n constructor(params: {\n baseUrl?: string;\n teamId: string;\n token: string;\n fetch?: typeof globalThis.fetch;\n }) {\n super({\n baseUrl: params.baseUrl ?? \"https://vercel.com/api\",\n token: params.token,\n debug: false,\n fetch: params.fetch,\n });\n\n this.teamId = params.teamId;\n this.isJwtToken = false;\n\n const claims = decodeUnverifiedToken(params.token);\n if (claims) {\n this.isJwtToken = true;\n this.projectId = claims.project_id;\n this.teamId = claims.owner_id;\n }\n }\n\n private async ensureValidToken(): Promise<void> {\n if (!this.isJwtToken) {\n return;\n }\n\n try {\n // Use getVercelOidcToken to refresh the token with team/project scope\n const freshToken = await getVercelOidcToken({\n expirationBufferMs: 5 * 60 * 1000, // 5 minutes\n team: this.teamId,\n project: this.projectId,\n });\n\n // Update token if it changed\n if (freshToken !== this.token) {\n this.token = freshToken;\n\n const claims = decodeUnverifiedToken(freshToken);\n if (claims) {\n this.teamId = claims.owner_id;\n }\n }\n } catch {\n // Ignore refresh errors and continue with current token\n }\n }\n\n protected async request(path: string, params?: RequestParams) {\n await this.ensureValidToken();\n\n return super.request(path, {\n ...params,\n query: { teamId: this.teamId, ...params?.query },\n headers: {\n \"content-type\": \"application/json\",\n \"user-agent\": `vercel/sandbox/${VERSION} (Node.js/${process.version}; ${os.platform()}/${os.arch()})`,\n ...params?.headers,\n },\n });\n }\n\n async getSession(\n params: WithPrivate<{ sessionId: string; signal?: AbortSignal }>,\n ) {\n const privateParams = getPrivateParams(params);\n let querystring = new URLSearchParams(privateParams).toString();\n querystring = querystring ? `?${querystring}` : \"\";\n return parseOrThrow(\n SessionAndRoutesResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}${querystring}`, {\n signal: params.signal,\n }),\n );\n }\n\n async createSandbox(\n params: WithPrivate<{\n name?: string;\n ports?: number[];\n projectId: string;\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n username?: string;\n password?: string;\n }\n | { type: \"tarball\"; url: string }\n | { type: \"snapshot\"; snapshotId: string };\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n runtime?: RUNTIMES | (string & {});\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\"/v2/sandboxes\", {\n method: \"POST\",\n body: JSON.stringify({\n projectId: params.projectId,\n ports: params.ports,\n source: params.source,\n timeout: params.timeout,\n resources: params.resources,\n runtime: params.runtime,\n image: params.image,\n name: params.name,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n ...privateParams,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async forkSandbox(\n params: WithPrivate<{\n sourceSandbox: string;\n projectId: string;\n name?: string;\n ports?: number[];\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\n `/v2/sandboxes/${encodeURIComponent(params.sourceSandbox)}/fork`,\n {\n method: \"POST\",\n query: { projectId: params.projectId },\n body: JSON.stringify({\n name: params.name,\n ports: params.ports,\n timeout: params.timeout,\n resources: params.resources,\n image: params.image,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n ...privateParams,\n }),\n signal: params.signal,\n },\n ),\n );\n }\n\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait: true;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<{\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: false;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: boolean;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<\n | {\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }\n | Parsed<z.infer<typeof CommandResponse>>\n > {\n if (params.wait) {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd`,\n {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n wait: true,\n logs: params.logs || undefined,\n timeout: params.timeout,\n }),\n signal: params.signal,\n },\n );\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of command data\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal: params.signal }).catch(\n (err) => {\n console.error(\"Error piping command stream:\", err);\n },\n );\n\n const iterator = jsonlinesStream[Symbol.asyncIterator]();\n const commandChunk = await iterator.next();\n if (commandChunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command data was received\",\n params.sessionId,\n );\n }\n const { command } = CommandResponse.parse(commandChunk.value);\n\n const finished = (async () => {\n while (true) {\n const chunk = await iterator.next();\n if (chunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command finished\",\n params.sessionId,\n );\n }\n\n if (chunk.value?.command) {\n const { command } = CommandFinishedResponse.parse(chunk.value);\n return command;\n }\n\n const parsed = LogLine.parse(chunk.value);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n params.onLog?.(parsed);\n }\n })();\n\n return { command, finished };\n }\n\n return parseOrThrow(\n CommandResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/cmd`, {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n timeout: params.timeout,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait: true;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandFinishedResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }) {\n return params.wait\n ? parseOrThrow(\n CommandFinishedResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal, query: { wait: \"true\" } },\n ),\n )\n : parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal },\n ),\n );\n }\n\n async openInteractive(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof InteractiveSessionResponse>>> {\n return parseOrThrow(\n InteractiveSessionResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/interactive`,\n {\n method: \"POST\",\n body: JSON.stringify({}),\n signal: params.signal,\n },\n ),\n );\n }\n\n async mkDir(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n EmptyResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/mkdir`, {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n }),\n );\n }\n\n getFileWriter(params: {\n sessionId: string;\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const writer = new FileWriter();\n return {\n response: (async () => {\n return this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/write`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/gzip\",\n \"x-cwd\": params.extractDir,\n },\n body: await consumeReadable(writer.readable),\n signal: params.signal,\n });\n })(),\n writer,\n };\n }\n\n async listSessions(params: {\n /**\n * The ID or name of the project to which the sessions belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter sessions by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of sessions to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SessionsResponse,\n await this.request(`/v2/sandboxes/sessions`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async listSnapshots(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter snapshots by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of snapshots to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotsResponse,\n await this.request(`/v2/sandboxes/snapshots`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async getSnapshotTree(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n */\n projectId: string;\n /**\n * The snapshot ID to use as the anchor for the tree traversal.\n */\n snapshotId: string;\n /**\n * Maximum number of nodes to return.\n */\n limit?: number;\n /**\n * Sort order: \"asc\" for descendants, \"desc\" for ancestors.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotTreeResponse,\n await this.request(`/v2/sandboxes/snapshots/tree`, {\n query: {\n project: params.projectId,\n snapshotId: params.snapshotId,\n limit: params.limit,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async writeFiles(params: {\n sessionId: string;\n cwd: string;\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[];\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const { writer, response } = this.getFileWriter({\n sessionId: params.sessionId,\n extractDir: params.extractDir,\n signal: params.signal,\n });\n\n for (const file of params.files) {\n await writer.addFile({\n name: normalizePath({\n filePath: file.path,\n extractDir: params.extractDir,\n cwd: params.cwd,\n }),\n content: file.content,\n mode: file.mode,\n });\n }\n\n writer.end();\n await parseOrThrow(EmptyResponse, await response);\n }\n\n async readFile(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }): Promise<Readable | null> {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/fs/read`,\n {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n // The file endpoint must return the file as an octet-stream. Any other\n // content type (e.g. application/json) indicates an error payload that\n // would otherwise be piped verbatim into the destination file.\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!response.ok || !contentType.includes(\"application/octet-stream\")) {\n const text = await response.text().catch(() => \"\");\n let json: unknown;\n try {\n json = JSON.parse(text || \"{}\");\n } catch {\n json = undefined;\n }\n throw new APIError(response, {\n message: `Unexpected response reading file: status ${response.status}, content-type ${contentType || \"(none)\"}`,\n json,\n text,\n });\n }\n\n if (response.body === null) {\n return null;\n }\n\n return Readable.fromWeb(response.body);\n }\n\n async killCommand(params: {\n sessionId: string;\n commandId: string;\n signal: number;\n abortSignal?: AbortSignal;\n }) {\n return parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.commandId}/kill`,\n {\n method: \"POST\",\n body: JSON.stringify({ signal: params.signal }),\n signal: params.abortSignal,\n },\n ),\n );\n }\n\n getLogs(params: {\n sessionId: string;\n cmdId: string;\n signal?: AbortSignal;\n }): AsyncGenerator<LogOutputLine, void, void> &\n Disposable & { close(): void } {\n const self = this;\n const disposer = new AbortController();\n const signal = !params.signal\n ? disposer.signal\n : mergeSignals(params.signal, disposer.signal);\n\n const generator = (async function* () {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}/logs`;\n const response = await self.request(url, {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of logs\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal }).catch((err) => {\n console.error(\"Error piping logs:\", err);\n });\n\n for await (const chunk of jsonlinesStream) {\n const parsed = LogLine.parse(chunk);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n yield parsed;\n }\n })();\n\n return Object.assign(generator, {\n [Symbol.dispose]() {\n disposer.abort(\"Disposed\");\n },\n close: () => disposer.abort(\"Disposed\"),\n });\n }\n\n async stopSession(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof StopSessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/stop`;\n return parseOrThrow(\n StopSessionResponse,\n await this.request(url, { method: \"POST\", signal: params.signal }),\n );\n }\n\n async updateNetworkPolicy(params: {\n sessionId: string;\n networkPolicy: NetworkPolicy;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/network-policy`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify(toAPINetworkPolicy(params.networkPolicy)),\n signal: params.signal,\n }),\n );\n }\n\n async extendTimeout(params: {\n sessionId: string;\n duration: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/extend-timeout`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify({ duration: params.duration }),\n signal: params.signal,\n }),\n );\n }\n\n async createSnapshot(params: {\n sessionId: string;\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CreateSnapshotResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/snapshot`;\n const body =\n params.expiration === undefined\n ? undefined\n : JSON.stringify({ expiration: params.expiration });\n return parseOrThrow(\n CreateSnapshotResponse,\n await this.request(url, {\n method: \"POST\",\n body,\n signal: params.signal,\n }),\n );\n }\n\n async deleteSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { method: \"DELETE\", signal: params.signal }),\n );\n }\n\n async getSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { signal: params.signal }),\n );\n }\n\n async getSandbox(params: WithPrivate<{\n name: string;\n projectId: string;\n resume?: boolean;\n signal?: AbortSignal;\n }>) {\n const privateParams = getPrivateParams(params);\n const query: Record<string, string | undefined> = {\n projectId: params.projectId,\n ...privateParams,\n };\n if (params.resume !== undefined) {\n query.resume = String(params.resume);\n }\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n query,\n signal: params.signal,\n }),\n );\n }\n\n async listSandboxes(params: {\n projectId: string;\n limit?: number;\n sortBy?: \"createdAt\" | \"name\" | \"statusUpdatedAt\";\n sortOrder?: \"asc\" | \"desc\";\n namePrefix?: string;\n cursor?: string;\n tags?: Record<string, string>;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SandboxesPaginationResponse,\n await this.request(`/v2/sandboxes`, {\n query: {\n project: params.projectId,\n limit: params.limit,\n sortBy: params.sortBy,\n sortOrder: params.sortOrder,\n namePrefix: params.namePrefix,\n cursor: params.cursor,\n tags: toTagsFilter(params.tags),\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async updateSandbox(params: {\n name: string;\n projectId: string;\n persistent?: boolean;\n resources?: { vcpus?: number; memory?: number };\n runtime?: RUNTIMES | (string & {});\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n ports?: number[];\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n } | null;\n currentSnapshotId?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"PATCH\",\n query: {\n projectId: params.projectId,\n },\n body: JSON.stringify({\n persistent: params.persistent,\n resources: params.resources,\n runtime: params.runtime,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n tags: params.tags,\n ports: params.ports,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n currentSnapshotId: params.currentSnapshotId,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async deleteSandbox(params: {\n name: string;\n projectId: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"DELETE\",\n query: {\n projectId: params.projectId,\n },\n signal: params.signal,\n }),\n );\n }\n}\n\nasync function pipe(\n readable: ReadableStream<Uint8Array>,\n output: NodeJS.WritableStream,\n options?: { signal?: AbortSignal },\n) {\n const reader = readable.getReader();\n let aborted = false;\n\n const signal = options?.signal;\n const onAbort = () => {\n aborted = true;\n const reason =\n signal?.reason ??\n new DOMException(\"The operation was aborted.\", \"AbortError\");\n void reader.cancel(reason).catch(() => {\n // ignore cancel errors when aborting\n });\n\n if (\"destroy\" in output && typeof output.destroy === \"function\") {\n output.destroy(reason as Error);\n return;\n }\n\n output.emit(\"error\", reason);\n output.end();\n };\n\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (true) {\n const read = await reader.read();\n if (read.value) {\n output.write(Buffer.from(read.value));\n }\n if (read.done) {\n break;\n }\n }\n } catch (err) {\n if (!aborted) {\n output.emit(\"error\", err);\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n if (!aborted) {\n output.end();\n }\n }\n}\n\nfunction mergeSignals(...signals: [AbortSignal, ...AbortSignal[]]) {\n const controller = new AbortController();\n const onAbort = () => {\n controller.abort();\n for (const signal of signals) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener(\"abort\", onAbort);\n }\n return controller.signal;\n}\n\nfunction toTagsFilter(\n tags: Record<string, string> | undefined,\n): string[] | undefined {\n if (tags === undefined) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries.map(([key, value]) => `${key}:${value}`);\n}\n"],"mappings":"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"}
{"version":3,"file":"api-client.cjs","names":["BaseClient","VERSION","getPrivateParams","parseOrThrow","SessionAndRoutesResponse","SandboxAndSessionResponse","toAPINetworkPolicy","z","APIError","StreamError","CommandResponse","CommandFinishedResponse","command","LogLine","InteractiveSessionResponse","EmptyResponse","FileWriter","consumeReadable","SessionsResponse","SnapshotsResponse","SnapshotTreeResponse","DrivesResponse","DriveResponse","normalizePath","json: unknown","Readable","StopSessionResponse","SessionResponse","CreateSnapshotResponse","SnapshotResponse","query: Record<string, string | undefined>","SandboxesPaginationResponse","UpdateSandboxResponse"],"sources":["../../src/api-client/api-client.ts"],"sourcesContent":["import {\n BaseClient,\n parseOrThrow,\n type Parsed,\n type RequestParams,\n} from \"./base-client.js\";\nimport {\n type CommandFinishedData,\n SessionAndRoutesResponse,\n SessionResponse,\n InteractiveSessionResponse,\n StopSessionResponse,\n SessionsResponse,\n CommandResponse,\n CommandFinishedResponse,\n EmptyResponse,\n LogLine,\n type LogOutputLine,\n SnapshotsResponse,\n SnapshotTreeResponse,\n SnapshotResponse,\n CreateSnapshotResponse,\n SandboxAndSessionResponse,\n SandboxesPaginationResponse,\n UpdateSandboxResponse,\n DrivesResponse,\n DriveResponse,\n type CommandData,\n} from \"./validators.js\";\nimport { APIError, StreamError } from \"./api-error.js\";\nimport { FileWriter } from \"./file-writer.js\";\nimport { VERSION } from \"../version.js\";\nimport { consumeReadable } from \"../utils/consume-readable.js\";\nimport { z } from \"zod\";\nimport jsonlines from \"jsonlines\";\nimport os from \"os\";\nimport { Readable } from \"stream\";\nimport { normalizePath } from \"../utils/normalizePath.js\";\nimport { getVercelOidcToken } from \"@vercel/oidc\";\nimport { NetworkPolicy } from \"../network-policy.js\";\nimport { toAPINetworkPolicy } from \"../utils/network-policy.js\";\nimport { getPrivateParams, WithPrivate } from \"../utils/types.js\";\nimport { RUNTIMES } from \"../constants.js\";\nimport { type BaseCreateSandboxParams } from \"../sandbox.js\";\n\ninterface Claims {\n owner_id: string;\n project_id?: string;\n}\n\nfunction decodeUnverifiedToken(token: string): Claims | null {\n if (token.split(\".\").length !== 3) {\n return null;\n }\n try {\n const payload = JSON.parse(\n Buffer.from(token.split(\".\")[1], \"base64url\").toString(\"utf8\"),\n );\n if (payload.owner_id) {\n return { owner_id: payload.owner_id, project_id: payload.project_id };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface WithFetchOptions {\n fetch?: typeof globalThis.fetch;\n}\n\nexport class APIClient extends BaseClient {\n private teamId: string;\n private projectId: string | undefined;\n private isJwtToken: boolean;\n\n constructor(params: {\n baseUrl?: string;\n teamId: string;\n token: string;\n fetch?: typeof globalThis.fetch;\n }) {\n super({\n baseUrl: params.baseUrl ?? \"https://vercel.com/api\",\n token: params.token,\n debug: false,\n fetch: params.fetch,\n });\n\n this.teamId = params.teamId;\n this.isJwtToken = false;\n\n const claims = decodeUnverifiedToken(params.token);\n if (claims) {\n this.isJwtToken = true;\n this.projectId = claims.project_id;\n this.teamId = claims.owner_id;\n }\n }\n\n private async ensureValidToken(): Promise<void> {\n if (!this.isJwtToken) {\n return;\n }\n\n try {\n // Use getVercelOidcToken to refresh the token with team/project scope\n const freshToken = await getVercelOidcToken({\n expirationBufferMs: 5 * 60 * 1000, // 5 minutes\n team: this.teamId,\n project: this.projectId,\n });\n\n // Update token if it changed\n if (freshToken !== this.token) {\n this.token = freshToken;\n\n const claims = decodeUnverifiedToken(freshToken);\n if (claims) {\n this.teamId = claims.owner_id;\n }\n }\n } catch {\n // Ignore refresh errors and continue with current token\n }\n }\n\n protected async request(path: string, params?: RequestParams) {\n await this.ensureValidToken();\n\n return super.request(path, {\n ...params,\n query: { teamId: this.teamId, ...params?.query },\n headers: {\n \"content-type\": \"application/json\",\n \"user-agent\": `vercel/sandbox/${VERSION} (Node.js/${process.version}; ${os.platform()}/${os.arch()})`,\n ...params?.headers,\n },\n });\n }\n\n async getSession(\n params: WithPrivate<{ sessionId: string; signal?: AbortSignal }>,\n ) {\n const privateParams = getPrivateParams(params);\n let querystring = new URLSearchParams(privateParams).toString();\n querystring = querystring ? `?${querystring}` : \"\";\n return parseOrThrow(\n SessionAndRoutesResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}${querystring}`, {\n signal: params.signal,\n }),\n );\n }\n\n async createSandbox(\n params: WithPrivate<{\n name?: string;\n ports?: number[];\n projectId: string;\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n username?: string;\n password?: string;\n }\n | { type: \"tarball\"; url: string }\n | { type: \"snapshot\"; snapshotId: string };\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n runtime?: RUNTIMES | (string & {});\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n mounts?: BaseCreateSandboxParams[\"mounts\"];\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\"/v2/sandboxes\", {\n method: \"POST\",\n body: JSON.stringify({\n projectId: params.projectId,\n ports: params.ports,\n source: params.source,\n timeout: params.timeout,\n resources: params.resources,\n runtime: params.runtime,\n image: params.image,\n name: params.name,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n mounts: params.mounts,\n ...privateParams,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async forkSandbox(\n params: WithPrivate<{\n sourceSandbox: string;\n projectId: string;\n name?: string;\n ports?: number[];\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\n `/v2/sandboxes/${encodeURIComponent(params.sourceSandbox)}/fork`,\n {\n method: \"POST\",\n query: { projectId: params.projectId },\n body: JSON.stringify({\n name: params.name,\n ports: params.ports,\n timeout: params.timeout,\n resources: params.resources,\n image: params.image,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n ...privateParams,\n }),\n signal: params.signal,\n },\n ),\n );\n }\n\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait: true;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<{\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: false;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: boolean;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<\n | {\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }\n | Parsed<z.infer<typeof CommandResponse>>\n > {\n if (params.wait) {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd`,\n {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n wait: true,\n logs: params.logs || undefined,\n timeout: params.timeout,\n }),\n signal: params.signal,\n },\n );\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of command data\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal: params.signal }).catch(\n (err) => {\n console.error(\"Error piping command stream:\", err);\n },\n );\n\n const iterator = jsonlinesStream[Symbol.asyncIterator]();\n const commandChunk = await iterator.next();\n if (commandChunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command data was received\",\n params.sessionId,\n );\n }\n const { command } = CommandResponse.parse(commandChunk.value);\n\n const finished = (async () => {\n while (true) {\n const chunk = await iterator.next();\n if (chunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command finished\",\n params.sessionId,\n );\n }\n\n if (chunk.value?.command) {\n const { command } = CommandFinishedResponse.parse(chunk.value);\n return command;\n }\n\n const parsed = LogLine.parse(chunk.value);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n params.onLog?.(parsed);\n }\n })();\n\n return { command, finished };\n }\n\n return parseOrThrow(\n CommandResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/cmd`, {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n timeout: params.timeout,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait: true;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandFinishedResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }) {\n return params.wait\n ? parseOrThrow(\n CommandFinishedResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal, query: { wait: \"true\" } },\n ),\n )\n : parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal },\n ),\n );\n }\n\n async openInteractive(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof InteractiveSessionResponse>>> {\n return parseOrThrow(\n InteractiveSessionResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/interactive`,\n {\n method: \"POST\",\n body: JSON.stringify({}),\n signal: params.signal,\n },\n ),\n );\n }\n\n async mkDir(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n EmptyResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/mkdir`, {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n }),\n );\n }\n\n getFileWriter(params: {\n sessionId: string;\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const writer = new FileWriter();\n return {\n response: (async () => {\n return this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/write`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/gzip\",\n \"x-cwd\": params.extractDir,\n },\n body: await consumeReadable(writer.readable),\n signal: params.signal,\n });\n })(),\n writer,\n };\n }\n\n async listSessions(params: {\n /**\n * The ID or name of the project to which the sessions belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter sessions by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of sessions to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SessionsResponse,\n await this.request(`/v2/sandboxes/sessions`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async listSnapshots(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter snapshots by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of snapshots to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotsResponse,\n await this.request(`/v2/sandboxes/snapshots`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async getSnapshotTree(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n */\n projectId: string;\n /**\n * The snapshot ID to use as the anchor for the tree traversal.\n */\n snapshotId: string;\n /**\n * Maximum number of nodes to return.\n */\n limit?: number;\n /**\n * Sort order: \"asc\" for descendants, \"desc\" for ancestors.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotTreeResponse,\n await this.request(`/v2/sandboxes/snapshots/tree`, {\n query: {\n project: params.projectId,\n snapshotId: params.snapshotId,\n limit: params.limit,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async listDrives(params: {\n projectId: string;\n limit?: number;\n cursor?: string | number;\n since?: number | string;\n until?: number | string;\n sortBy?: \"createdAt\" | \"updatedAt\" | \"name\";\n sortOrder?: \"asc\" | \"desc\";\n namePrefix?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n DrivesResponse,\n await this.request(`/v2/sandboxes/drives`, {\n query: {\n projectId: params.projectId,\n limit: params.limit,\n cursor: params.cursor ?? params.until,\n since: params.since,\n sortBy: params.sortBy,\n sortOrder: params.sortOrder,\n namePrefix: params.namePrefix,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async getOrCreateDrive(params: {\n projectId: string;\n name: string;\n maxSizeBytes?: number;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n DriveResponse,\n await this.request(\n `/v2/sandboxes/drives/${encodeURIComponent(params.name)}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n projectId: params.projectId,\n maxSizeBytes: params.maxSizeBytes,\n }),\n signal: params.signal,\n },\n ),\n );\n }\n\n async writeFiles(params: {\n sessionId: string;\n cwd: string;\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[];\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const { writer, response } = this.getFileWriter({\n sessionId: params.sessionId,\n extractDir: params.extractDir,\n signal: params.signal,\n });\n\n for (const file of params.files) {\n await writer.addFile({\n name: normalizePath({\n filePath: file.path,\n extractDir: params.extractDir,\n cwd: params.cwd,\n }),\n content: file.content,\n mode: file.mode,\n });\n }\n\n writer.end();\n await parseOrThrow(EmptyResponse, await response);\n }\n\n async readFile(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }): Promise<Readable | null> {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/fs/read`,\n {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n // The file endpoint must return the file as an octet-stream. Any other\n // content type (e.g. application/json) indicates an error payload that\n // would otherwise be piped verbatim into the destination file.\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!response.ok || !contentType.includes(\"application/octet-stream\")) {\n const text = await response.text().catch(() => \"\");\n let json: unknown;\n try {\n json = JSON.parse(text || \"{}\");\n } catch {\n json = undefined;\n }\n throw new APIError(response, {\n message: `Unexpected response reading file: status ${response.status}, content-type ${contentType || \"(none)\"}`,\n json,\n text,\n });\n }\n\n if (response.body === null) {\n return null;\n }\n\n return Readable.fromWeb(response.body);\n }\n\n async killCommand(params: {\n sessionId: string;\n commandId: string;\n signal: number;\n abortSignal?: AbortSignal;\n }) {\n return parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.commandId}/kill`,\n {\n method: \"POST\",\n body: JSON.stringify({ signal: params.signal }),\n signal: params.abortSignal,\n },\n ),\n );\n }\n\n getLogs(params: {\n sessionId: string;\n cmdId: string;\n signal?: AbortSignal;\n }): AsyncGenerator<LogOutputLine, void, void> &\n Disposable & { close(): void } {\n const self = this;\n const disposer = new AbortController();\n const signal = !params.signal\n ? disposer.signal\n : mergeSignals(params.signal, disposer.signal);\n\n const generator = (async function* () {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}/logs`;\n const response = await self.request(url, {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of logs\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal }).catch((err) => {\n console.error(\"Error piping logs:\", err);\n });\n\n for await (const chunk of jsonlinesStream) {\n const parsed = LogLine.parse(chunk);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n yield parsed;\n }\n })();\n\n return Object.assign(generator, {\n [Symbol.dispose]() {\n disposer.abort(\"Disposed\");\n },\n close: () => disposer.abort(\"Disposed\"),\n });\n }\n\n async stopSession(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof StopSessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/stop`;\n return parseOrThrow(\n StopSessionResponse,\n await this.request(url, { method: \"POST\", signal: params.signal }),\n );\n }\n\n async updateNetworkPolicy(params: {\n sessionId: string;\n networkPolicy: NetworkPolicy;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/network-policy`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify(toAPINetworkPolicy(params.networkPolicy)),\n signal: params.signal,\n }),\n );\n }\n\n async extendTimeout(params: {\n sessionId: string;\n duration: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/extend-timeout`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify({ duration: params.duration }),\n signal: params.signal,\n }),\n );\n }\n\n async createSnapshot(params: {\n sessionId: string;\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CreateSnapshotResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/snapshot`;\n const body =\n params.expiration === undefined\n ? undefined\n : JSON.stringify({ expiration: params.expiration });\n return parseOrThrow(\n CreateSnapshotResponse,\n await this.request(url, {\n method: \"POST\",\n body,\n signal: params.signal,\n }),\n );\n }\n\n async deleteSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { method: \"DELETE\", signal: params.signal }),\n );\n }\n\n async getSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { signal: params.signal }),\n );\n }\n\n async getSandbox(params: WithPrivate<{\n name: string;\n projectId: string;\n resume?: boolean;\n signal?: AbortSignal;\n }>) {\n const privateParams = getPrivateParams(params);\n const query: Record<string, string | undefined> = {\n projectId: params.projectId,\n ...privateParams,\n };\n if (params.resume !== undefined) {\n query.resume = String(params.resume);\n }\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n query,\n signal: params.signal,\n }),\n );\n }\n\n async listSandboxes(params: {\n projectId: string;\n limit?: number;\n sortBy?: \"createdAt\" | \"name\" | \"statusUpdatedAt\";\n sortOrder?: \"asc\" | \"desc\";\n namePrefix?: string;\n cursor?: string;\n tags?: Record<string, string>;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SandboxesPaginationResponse,\n await this.request(`/v2/sandboxes`, {\n query: {\n project: params.projectId,\n limit: params.limit,\n sortBy: params.sortBy,\n sortOrder: params.sortOrder,\n namePrefix: params.namePrefix,\n cursor: params.cursor,\n tags: toTagsFilter(params.tags),\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async deleteDrive(params: {\n projectId: string;\n name: string;\n signal?: AbortSignal;\n }) {\n const url = `/v2/sandboxes/drives/${encodeURIComponent(params.name)}`;\n return parseOrThrow(\n DriveResponse,\n await this.request(url, {\n method: \"DELETE\",\n query: {\n projectId: params.projectId,\n },\n signal: params.signal,\n }),\n );\n }\n\n async updateSandbox(params: {\n name: string;\n projectId: string;\n persistent?: boolean;\n resources?: { vcpus?: number; memory?: number };\n runtime?: RUNTIMES | (string & {});\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n ports?: number[];\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n } | null;\n currentSnapshotId?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"PATCH\",\n query: {\n projectId: params.projectId,\n },\n body: JSON.stringify({\n persistent: params.persistent,\n resources: params.resources,\n runtime: params.runtime,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n tags: params.tags,\n ports: params.ports,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n currentSnapshotId: params.currentSnapshotId,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async deleteSandbox(params: {\n name: string;\n projectId: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"DELETE\",\n query: {\n projectId: params.projectId,\n },\n signal: params.signal,\n }),\n );\n }\n}\n\nasync function pipe(\n readable: ReadableStream<Uint8Array>,\n output: NodeJS.WritableStream,\n options?: { signal?: AbortSignal },\n) {\n const reader = readable.getReader();\n let aborted = false;\n\n const signal = options?.signal;\n const onAbort = () => {\n aborted = true;\n const reason =\n signal?.reason ??\n new DOMException(\"The operation was aborted.\", \"AbortError\");\n void reader.cancel(reason).catch(() => {\n // ignore cancel errors when aborting\n });\n\n if (\"destroy\" in output && typeof output.destroy === \"function\") {\n output.destroy(reason as Error);\n return;\n }\n\n output.emit(\"error\", reason);\n output.end();\n };\n\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (true) {\n const read = await reader.read();\n if (read.value) {\n output.write(Buffer.from(read.value));\n }\n if (read.done) {\n break;\n }\n }\n } catch (err) {\n if (!aborted) {\n output.emit(\"error\", err);\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n if (!aborted) {\n output.end();\n }\n }\n}\n\nfunction mergeSignals(...signals: [AbortSignal, ...AbortSignal[]]) {\n const controller = new AbortController();\n const onAbort = () => {\n controller.abort();\n for (const signal of signals) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener(\"abort\", onAbort);\n }\n return controller.signal;\n}\n\nfunction toTagsFilter(\n tags: Record<string, string> | undefined,\n): string[] | undefined {\n if (tags === undefined) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries.map(([key, value]) => `${key}:${value}`);\n}\n"],"mappings":"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"}

@@ -7,2 +7,3 @@ import { BaseClient, Parsed, RequestParams } from "./base-client.cjs";

import { RUNTIMES } from "../constants.cjs";
import { BaseCreateSandboxParams } from "../sandbox.cjs";
import { z } from "zod";

@@ -184,2 +185,3 @@ import { Readable } from "stream";

};
mounts?: BaseCreateSandboxParams["mounts"];
signal?: AbortSignal;

@@ -295,2 +297,6 @@ }>): Promise<Parsed<{

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -553,2 +559,6 @@ keepLastSnapshots?: {

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1006,2 +1016,43 @@ keepLastSnapshots?: {

}>>;
listDrives(params: {
projectId: string;
limit?: number;
cursor?: string | number;
since?: number | string;
until?: number | string;
sortBy?: "createdAt" | "updatedAt" | "name";
sortOrder?: "asc" | "desc";
namePrefix?: string;
signal?: AbortSignal;
}): Promise<Parsed<{
drives: {
name: string;
projectId: string;
maxSizeBytes: number;
createdAt: number;
updatedAt: number;
currentSessionId?: string | undefined;
currentSandboxName?: string | undefined;
}[];
pagination: {
count: number;
next: string | null;
};
}>>;
getOrCreateDrive(params: {
projectId: string;
name: string;
maxSizeBytes?: number;
signal?: AbortSignal;
}): Promise<Parsed<{
drive: {
name: string;
projectId: string;
maxSizeBytes: number;
createdAt: number;
updatedAt: number;
currentSessionId?: string | undefined;
currentSandboxName?: string | undefined;
};
}>>;
writeFiles(params: {

@@ -1189,2 +1240,6 @@ sessionId: string;

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1435,2 +1490,6 @@ keepLastSnapshots?: {

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1448,2 +1507,17 @@ keepLastSnapshots?: {

}>>;
deleteDrive(params: {
projectId: string;
name: string;
signal?: AbortSignal;
}): Promise<Parsed<{
drive: {
name: string;
projectId: string;
maxSizeBytes: number;
createdAt: number;
updatedAt: number;
currentSessionId?: string | undefined;
currentSandboxName?: string | undefined;
};
}>>;
updateSandbox(params: {

@@ -1579,2 +1653,6 @@ name: string;

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1706,2 +1784,6 @@ keepLastSnapshots?: {

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1708,0 +1790,0 @@ keepLastSnapshots?: {

@@ -7,2 +7,3 @@ import { BaseClient, Parsed, RequestParams } from "./base-client.js";

import { RUNTIMES } from "../constants.js";
import { BaseCreateSandboxParams } from "../sandbox.js";
import { z } from "zod";

@@ -184,2 +185,3 @@ import { Readable } from "stream";

};
mounts?: BaseCreateSandboxParams["mounts"];
signal?: AbortSignal;

@@ -295,2 +297,6 @@ }>): Promise<Parsed<{

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -553,2 +559,6 @@ keepLastSnapshots?: {

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1006,2 +1016,43 @@ keepLastSnapshots?: {

}>>;
listDrives(params: {
projectId: string;
limit?: number;
cursor?: string | number;
since?: number | string;
until?: number | string;
sortBy?: "createdAt" | "updatedAt" | "name";
sortOrder?: "asc" | "desc";
namePrefix?: string;
signal?: AbortSignal;
}): Promise<Parsed<{
drives: {
name: string;
projectId: string;
maxSizeBytes: number;
createdAt: number;
updatedAt: number;
currentSessionId?: string | undefined;
currentSandboxName?: string | undefined;
}[];
pagination: {
count: number;
next: string | null;
};
}>>;
getOrCreateDrive(params: {
projectId: string;
name: string;
maxSizeBytes?: number;
signal?: AbortSignal;
}): Promise<Parsed<{
drive: {
name: string;
projectId: string;
maxSizeBytes: number;
createdAt: number;
updatedAt: number;
currentSessionId?: string | undefined;
currentSandboxName?: string | undefined;
};
}>>;
writeFiles(params: {

@@ -1189,2 +1240,6 @@ sessionId: string;

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1435,2 +1490,6 @@ keepLastSnapshots?: {

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1448,2 +1507,17 @@ keepLastSnapshots?: {

}>>;
deleteDrive(params: {
projectId: string;
name: string;
signal?: AbortSignal;
}): Promise<Parsed<{
drive: {
name: string;
projectId: string;
maxSizeBytes: number;
createdAt: number;
updatedAt: number;
currentSessionId?: string | undefined;
currentSandboxName?: string | undefined;
};
}>>;
updateSandbox(params: {

@@ -1579,2 +1653,6 @@ name: string;

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1706,2 +1784,6 @@ keepLastSnapshots?: {

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1708,0 +1790,0 @@ keepLastSnapshots?: {

import { APIError, StreamError } from "./api-error.js";
import { BaseClient, parseOrThrow } from "./base-client.js";
import { CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, EmptyResponse, InteractiveSessionResponse, LogLine, SandboxAndSessionResponse, SandboxesPaginationResponse, SessionAndRoutesResponse, SessionResponse, SessionsResponse, SnapshotResponse, SnapshotTreeResponse, SnapshotsResponse, StopSessionResponse, UpdateSandboxResponse } from "./validators.js";
import { CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, DriveResponse, DrivesResponse, EmptyResponse, InteractiveSessionResponse, LogLine, SandboxAndSessionResponse, SandboxesPaginationResponse, SessionAndRoutesResponse, SessionResponse, SessionsResponse, SnapshotResponse, SnapshotTreeResponse, SnapshotsResponse, StopSessionResponse, UpdateSandboxResponse } from "./validators.js";
import { FileWriter } from "./file-writer.js";

@@ -102,2 +102,3 @@ import { VERSION } from "../version.js";

keepLastSnapshots: params.keepLastSnapshots,
mounts: params.mounts,
...privateParams

@@ -271,2 +272,27 @@ }),

}
async listDrives(params) {
return parseOrThrow(DrivesResponse, await this.request(`/v2/sandboxes/drives`, {
query: {
projectId: params.projectId,
limit: params.limit,
cursor: params.cursor ?? params.until,
since: params.since,
sortBy: params.sortBy,
sortOrder: params.sortOrder,
namePrefix: params.namePrefix
},
method: "GET",
signal: params.signal
}));
}
async getOrCreateDrive(params) {
return parseOrThrow(DriveResponse, await this.request(`/v2/sandboxes/drives/${encodeURIComponent(params.name)}`, {
method: "POST",
body: JSON.stringify({
projectId: params.projectId,
maxSizeBytes: params.maxSizeBytes
}),
signal: params.signal
}));
}
async writeFiles(params) {

@@ -431,2 +457,10 @@ const { writer, response } = this.getFileWriter({

}
async deleteDrive(params) {
const url = `/v2/sandboxes/drives/${encodeURIComponent(params.name)}`;
return parseOrThrow(DriveResponse, await this.request(url, {
method: "DELETE",
query: { projectId: params.projectId },
signal: params.signal
}));
}
async updateSandbox(params) {

@@ -433,0 +467,0 @@ return parseOrThrow(UpdateSandboxResponse, await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {

@@ -1,1 +0,1 @@

{"version":3,"file":"api-client.js","names":["command","json: unknown","query: Record<string, string | undefined>"],"sources":["../../src/api-client/api-client.ts"],"sourcesContent":["import {\n BaseClient,\n parseOrThrow,\n type Parsed,\n type RequestParams,\n} from \"./base-client.js\";\nimport {\n type CommandFinishedData,\n SessionAndRoutesResponse,\n SessionResponse,\n InteractiveSessionResponse,\n StopSessionResponse,\n SessionsResponse,\n CommandResponse,\n CommandFinishedResponse,\n EmptyResponse,\n LogLine,\n type LogOutputLine,\n SnapshotsResponse,\n SnapshotTreeResponse,\n SnapshotResponse,\n CreateSnapshotResponse,\n SandboxAndSessionResponse,\n SandboxesPaginationResponse,\n UpdateSandboxResponse,\n type CommandData,\n} from \"./validators.js\";\nimport { APIError, StreamError } from \"./api-error.js\";\nimport { FileWriter } from \"./file-writer.js\";\nimport { VERSION } from \"../version.js\";\nimport { consumeReadable } from \"../utils/consume-readable.js\";\nimport { z } from \"zod\";\nimport jsonlines from \"jsonlines\";\nimport os from \"os\";\nimport { Readable } from \"stream\";\nimport { normalizePath } from \"../utils/normalizePath.js\";\nimport { getVercelOidcToken } from \"@vercel/oidc\";\nimport { NetworkPolicy } from \"../network-policy.js\";\nimport { toAPINetworkPolicy } from \"../utils/network-policy.js\";\nimport { getPrivateParams, WithPrivate } from \"../utils/types.js\";\nimport { RUNTIMES } from \"../constants.js\";\n\ninterface Claims {\n owner_id: string;\n project_id?: string;\n}\n\nfunction decodeUnverifiedToken(token: string): Claims | null {\n if (token.split(\".\").length !== 3) {\n return null;\n }\n try {\n const payload = JSON.parse(\n Buffer.from(token.split(\".\")[1], \"base64url\").toString(\"utf8\"),\n );\n if (payload.owner_id) {\n return { owner_id: payload.owner_id, project_id: payload.project_id };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface WithFetchOptions {\n fetch?: typeof globalThis.fetch;\n}\n\nexport class APIClient extends BaseClient {\n private teamId: string;\n private projectId: string | undefined;\n private isJwtToken: boolean;\n\n constructor(params: {\n baseUrl?: string;\n teamId: string;\n token: string;\n fetch?: typeof globalThis.fetch;\n }) {\n super({\n baseUrl: params.baseUrl ?? \"https://vercel.com/api\",\n token: params.token,\n debug: false,\n fetch: params.fetch,\n });\n\n this.teamId = params.teamId;\n this.isJwtToken = false;\n\n const claims = decodeUnverifiedToken(params.token);\n if (claims) {\n this.isJwtToken = true;\n this.projectId = claims.project_id;\n this.teamId = claims.owner_id;\n }\n }\n\n private async ensureValidToken(): Promise<void> {\n if (!this.isJwtToken) {\n return;\n }\n\n try {\n // Use getVercelOidcToken to refresh the token with team/project scope\n const freshToken = await getVercelOidcToken({\n expirationBufferMs: 5 * 60 * 1000, // 5 minutes\n team: this.teamId,\n project: this.projectId,\n });\n\n // Update token if it changed\n if (freshToken !== this.token) {\n this.token = freshToken;\n\n const claims = decodeUnverifiedToken(freshToken);\n if (claims) {\n this.teamId = claims.owner_id;\n }\n }\n } catch {\n // Ignore refresh errors and continue with current token\n }\n }\n\n protected async request(path: string, params?: RequestParams) {\n await this.ensureValidToken();\n\n return super.request(path, {\n ...params,\n query: { teamId: this.teamId, ...params?.query },\n headers: {\n \"content-type\": \"application/json\",\n \"user-agent\": `vercel/sandbox/${VERSION} (Node.js/${process.version}; ${os.platform()}/${os.arch()})`,\n ...params?.headers,\n },\n });\n }\n\n async getSession(\n params: WithPrivate<{ sessionId: string; signal?: AbortSignal }>,\n ) {\n const privateParams = getPrivateParams(params);\n let querystring = new URLSearchParams(privateParams).toString();\n querystring = querystring ? `?${querystring}` : \"\";\n return parseOrThrow(\n SessionAndRoutesResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}${querystring}`, {\n signal: params.signal,\n }),\n );\n }\n\n async createSandbox(\n params: WithPrivate<{\n name?: string;\n ports?: number[];\n projectId: string;\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n username?: string;\n password?: string;\n }\n | { type: \"tarball\"; url: string }\n | { type: \"snapshot\"; snapshotId: string };\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n runtime?: RUNTIMES | (string & {});\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\"/v2/sandboxes\", {\n method: \"POST\",\n body: JSON.stringify({\n projectId: params.projectId,\n ports: params.ports,\n source: params.source,\n timeout: params.timeout,\n resources: params.resources,\n runtime: params.runtime,\n image: params.image,\n name: params.name,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n ...privateParams,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async forkSandbox(\n params: WithPrivate<{\n sourceSandbox: string;\n projectId: string;\n name?: string;\n ports?: number[];\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\n `/v2/sandboxes/${encodeURIComponent(params.sourceSandbox)}/fork`,\n {\n method: \"POST\",\n query: { projectId: params.projectId },\n body: JSON.stringify({\n name: params.name,\n ports: params.ports,\n timeout: params.timeout,\n resources: params.resources,\n image: params.image,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n ...privateParams,\n }),\n signal: params.signal,\n },\n ),\n );\n }\n\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait: true;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<{\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: false;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: boolean;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<\n | {\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }\n | Parsed<z.infer<typeof CommandResponse>>\n > {\n if (params.wait) {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd`,\n {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n wait: true,\n logs: params.logs || undefined,\n timeout: params.timeout,\n }),\n signal: params.signal,\n },\n );\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of command data\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal: params.signal }).catch(\n (err) => {\n console.error(\"Error piping command stream:\", err);\n },\n );\n\n const iterator = jsonlinesStream[Symbol.asyncIterator]();\n const commandChunk = await iterator.next();\n if (commandChunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command data was received\",\n params.sessionId,\n );\n }\n const { command } = CommandResponse.parse(commandChunk.value);\n\n const finished = (async () => {\n while (true) {\n const chunk = await iterator.next();\n if (chunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command finished\",\n params.sessionId,\n );\n }\n\n if (chunk.value?.command) {\n const { command } = CommandFinishedResponse.parse(chunk.value);\n return command;\n }\n\n const parsed = LogLine.parse(chunk.value);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n params.onLog?.(parsed);\n }\n })();\n\n return { command, finished };\n }\n\n return parseOrThrow(\n CommandResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/cmd`, {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n timeout: params.timeout,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait: true;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandFinishedResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }) {\n return params.wait\n ? parseOrThrow(\n CommandFinishedResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal, query: { wait: \"true\" } },\n ),\n )\n : parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal },\n ),\n );\n }\n\n async openInteractive(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof InteractiveSessionResponse>>> {\n return parseOrThrow(\n InteractiveSessionResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/interactive`,\n {\n method: \"POST\",\n body: JSON.stringify({}),\n signal: params.signal,\n },\n ),\n );\n }\n\n async mkDir(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n EmptyResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/mkdir`, {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n }),\n );\n }\n\n getFileWriter(params: {\n sessionId: string;\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const writer = new FileWriter();\n return {\n response: (async () => {\n return this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/write`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/gzip\",\n \"x-cwd\": params.extractDir,\n },\n body: await consumeReadable(writer.readable),\n signal: params.signal,\n });\n })(),\n writer,\n };\n }\n\n async listSessions(params: {\n /**\n * The ID or name of the project to which the sessions belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter sessions by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of sessions to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SessionsResponse,\n await this.request(`/v2/sandboxes/sessions`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async listSnapshots(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter snapshots by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of snapshots to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotsResponse,\n await this.request(`/v2/sandboxes/snapshots`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async getSnapshotTree(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n */\n projectId: string;\n /**\n * The snapshot ID to use as the anchor for the tree traversal.\n */\n snapshotId: string;\n /**\n * Maximum number of nodes to return.\n */\n limit?: number;\n /**\n * Sort order: \"asc\" for descendants, \"desc\" for ancestors.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotTreeResponse,\n await this.request(`/v2/sandboxes/snapshots/tree`, {\n query: {\n project: params.projectId,\n snapshotId: params.snapshotId,\n limit: params.limit,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async writeFiles(params: {\n sessionId: string;\n cwd: string;\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[];\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const { writer, response } = this.getFileWriter({\n sessionId: params.sessionId,\n extractDir: params.extractDir,\n signal: params.signal,\n });\n\n for (const file of params.files) {\n await writer.addFile({\n name: normalizePath({\n filePath: file.path,\n extractDir: params.extractDir,\n cwd: params.cwd,\n }),\n content: file.content,\n mode: file.mode,\n });\n }\n\n writer.end();\n await parseOrThrow(EmptyResponse, await response);\n }\n\n async readFile(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }): Promise<Readable | null> {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/fs/read`,\n {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n // The file endpoint must return the file as an octet-stream. Any other\n // content type (e.g. application/json) indicates an error payload that\n // would otherwise be piped verbatim into the destination file.\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!response.ok || !contentType.includes(\"application/octet-stream\")) {\n const text = await response.text().catch(() => \"\");\n let json: unknown;\n try {\n json = JSON.parse(text || \"{}\");\n } catch {\n json = undefined;\n }\n throw new APIError(response, {\n message: `Unexpected response reading file: status ${response.status}, content-type ${contentType || \"(none)\"}`,\n json,\n text,\n });\n }\n\n if (response.body === null) {\n return null;\n }\n\n return Readable.fromWeb(response.body);\n }\n\n async killCommand(params: {\n sessionId: string;\n commandId: string;\n signal: number;\n abortSignal?: AbortSignal;\n }) {\n return parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.commandId}/kill`,\n {\n method: \"POST\",\n body: JSON.stringify({ signal: params.signal }),\n signal: params.abortSignal,\n },\n ),\n );\n }\n\n getLogs(params: {\n sessionId: string;\n cmdId: string;\n signal?: AbortSignal;\n }): AsyncGenerator<LogOutputLine, void, void> &\n Disposable & { close(): void } {\n const self = this;\n const disposer = new AbortController();\n const signal = !params.signal\n ? disposer.signal\n : mergeSignals(params.signal, disposer.signal);\n\n const generator = (async function* () {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}/logs`;\n const response = await self.request(url, {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of logs\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal }).catch((err) => {\n console.error(\"Error piping logs:\", err);\n });\n\n for await (const chunk of jsonlinesStream) {\n const parsed = LogLine.parse(chunk);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n yield parsed;\n }\n })();\n\n return Object.assign(generator, {\n [Symbol.dispose]() {\n disposer.abort(\"Disposed\");\n },\n close: () => disposer.abort(\"Disposed\"),\n });\n }\n\n async stopSession(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof StopSessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/stop`;\n return parseOrThrow(\n StopSessionResponse,\n await this.request(url, { method: \"POST\", signal: params.signal }),\n );\n }\n\n async updateNetworkPolicy(params: {\n sessionId: string;\n networkPolicy: NetworkPolicy;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/network-policy`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify(toAPINetworkPolicy(params.networkPolicy)),\n signal: params.signal,\n }),\n );\n }\n\n async extendTimeout(params: {\n sessionId: string;\n duration: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/extend-timeout`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify({ duration: params.duration }),\n signal: params.signal,\n }),\n );\n }\n\n async createSnapshot(params: {\n sessionId: string;\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CreateSnapshotResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/snapshot`;\n const body =\n params.expiration === undefined\n ? undefined\n : JSON.stringify({ expiration: params.expiration });\n return parseOrThrow(\n CreateSnapshotResponse,\n await this.request(url, {\n method: \"POST\",\n body,\n signal: params.signal,\n }),\n );\n }\n\n async deleteSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { method: \"DELETE\", signal: params.signal }),\n );\n }\n\n async getSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { signal: params.signal }),\n );\n }\n\n async getSandbox(params: WithPrivate<{\n name: string;\n projectId: string;\n resume?: boolean;\n signal?: AbortSignal;\n }>) {\n const privateParams = getPrivateParams(params);\n const query: Record<string, string | undefined> = {\n projectId: params.projectId,\n ...privateParams,\n };\n if (params.resume !== undefined) {\n query.resume = String(params.resume);\n }\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n query,\n signal: params.signal,\n }),\n );\n }\n\n async listSandboxes(params: {\n projectId: string;\n limit?: number;\n sortBy?: \"createdAt\" | \"name\" | \"statusUpdatedAt\";\n sortOrder?: \"asc\" | \"desc\";\n namePrefix?: string;\n cursor?: string;\n tags?: Record<string, string>;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SandboxesPaginationResponse,\n await this.request(`/v2/sandboxes`, {\n query: {\n project: params.projectId,\n limit: params.limit,\n sortBy: params.sortBy,\n sortOrder: params.sortOrder,\n namePrefix: params.namePrefix,\n cursor: params.cursor,\n tags: toTagsFilter(params.tags),\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async updateSandbox(params: {\n name: string;\n projectId: string;\n persistent?: boolean;\n resources?: { vcpus?: number; memory?: number };\n runtime?: RUNTIMES | (string & {});\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n ports?: number[];\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n } | null;\n currentSnapshotId?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"PATCH\",\n query: {\n projectId: params.projectId,\n },\n body: JSON.stringify({\n persistent: params.persistent,\n resources: params.resources,\n runtime: params.runtime,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n tags: params.tags,\n ports: params.ports,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n currentSnapshotId: params.currentSnapshotId,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async deleteSandbox(params: {\n name: string;\n projectId: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"DELETE\",\n query: {\n projectId: params.projectId,\n },\n signal: params.signal,\n }),\n );\n }\n}\n\nasync function pipe(\n readable: ReadableStream<Uint8Array>,\n output: NodeJS.WritableStream,\n options?: { signal?: AbortSignal },\n) {\n const reader = readable.getReader();\n let aborted = false;\n\n const signal = options?.signal;\n const onAbort = () => {\n aborted = true;\n const reason =\n signal?.reason ??\n new DOMException(\"The operation was aborted.\", \"AbortError\");\n void reader.cancel(reason).catch(() => {\n // ignore cancel errors when aborting\n });\n\n if (\"destroy\" in output && typeof output.destroy === \"function\") {\n output.destroy(reason as Error);\n return;\n }\n\n output.emit(\"error\", reason);\n output.end();\n };\n\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (true) {\n const read = await reader.read();\n if (read.value) {\n output.write(Buffer.from(read.value));\n }\n if (read.done) {\n break;\n }\n }\n } catch (err) {\n if (!aborted) {\n output.emit(\"error\", err);\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n if (!aborted) {\n output.end();\n }\n }\n}\n\nfunction mergeSignals(...signals: [AbortSignal, ...AbortSignal[]]) {\n const controller = new AbortController();\n const onAbort = () => {\n controller.abort();\n for (const signal of signals) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener(\"abort\", onAbort);\n }\n return controller.signal;\n}\n\nfunction toTagsFilter(\n tags: Record<string, string> | undefined,\n): string[] | undefined {\n if (tags === undefined) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries.map(([key, value]) => `${key}:${value}`);\n}\n"],"mappings":"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"}
{"version":3,"file":"api-client.js","names":["command","json: unknown","query: Record<string, string | undefined>"],"sources":["../../src/api-client/api-client.ts"],"sourcesContent":["import {\n BaseClient,\n parseOrThrow,\n type Parsed,\n type RequestParams,\n} from \"./base-client.js\";\nimport {\n type CommandFinishedData,\n SessionAndRoutesResponse,\n SessionResponse,\n InteractiveSessionResponse,\n StopSessionResponse,\n SessionsResponse,\n CommandResponse,\n CommandFinishedResponse,\n EmptyResponse,\n LogLine,\n type LogOutputLine,\n SnapshotsResponse,\n SnapshotTreeResponse,\n SnapshotResponse,\n CreateSnapshotResponse,\n SandboxAndSessionResponse,\n SandboxesPaginationResponse,\n UpdateSandboxResponse,\n DrivesResponse,\n DriveResponse,\n type CommandData,\n} from \"./validators.js\";\nimport { APIError, StreamError } from \"./api-error.js\";\nimport { FileWriter } from \"./file-writer.js\";\nimport { VERSION } from \"../version.js\";\nimport { consumeReadable } from \"../utils/consume-readable.js\";\nimport { z } from \"zod\";\nimport jsonlines from \"jsonlines\";\nimport os from \"os\";\nimport { Readable } from \"stream\";\nimport { normalizePath } from \"../utils/normalizePath.js\";\nimport { getVercelOidcToken } from \"@vercel/oidc\";\nimport { NetworkPolicy } from \"../network-policy.js\";\nimport { toAPINetworkPolicy } from \"../utils/network-policy.js\";\nimport { getPrivateParams, WithPrivate } from \"../utils/types.js\";\nimport { RUNTIMES } from \"../constants.js\";\nimport { type BaseCreateSandboxParams } from \"../sandbox.js\";\n\ninterface Claims {\n owner_id: string;\n project_id?: string;\n}\n\nfunction decodeUnverifiedToken(token: string): Claims | null {\n if (token.split(\".\").length !== 3) {\n return null;\n }\n try {\n const payload = JSON.parse(\n Buffer.from(token.split(\".\")[1], \"base64url\").toString(\"utf8\"),\n );\n if (payload.owner_id) {\n return { owner_id: payload.owner_id, project_id: payload.project_id };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport interface WithFetchOptions {\n fetch?: typeof globalThis.fetch;\n}\n\nexport class APIClient extends BaseClient {\n private teamId: string;\n private projectId: string | undefined;\n private isJwtToken: boolean;\n\n constructor(params: {\n baseUrl?: string;\n teamId: string;\n token: string;\n fetch?: typeof globalThis.fetch;\n }) {\n super({\n baseUrl: params.baseUrl ?? \"https://vercel.com/api\",\n token: params.token,\n debug: false,\n fetch: params.fetch,\n });\n\n this.teamId = params.teamId;\n this.isJwtToken = false;\n\n const claims = decodeUnverifiedToken(params.token);\n if (claims) {\n this.isJwtToken = true;\n this.projectId = claims.project_id;\n this.teamId = claims.owner_id;\n }\n }\n\n private async ensureValidToken(): Promise<void> {\n if (!this.isJwtToken) {\n return;\n }\n\n try {\n // Use getVercelOidcToken to refresh the token with team/project scope\n const freshToken = await getVercelOidcToken({\n expirationBufferMs: 5 * 60 * 1000, // 5 minutes\n team: this.teamId,\n project: this.projectId,\n });\n\n // Update token if it changed\n if (freshToken !== this.token) {\n this.token = freshToken;\n\n const claims = decodeUnverifiedToken(freshToken);\n if (claims) {\n this.teamId = claims.owner_id;\n }\n }\n } catch {\n // Ignore refresh errors and continue with current token\n }\n }\n\n protected async request(path: string, params?: RequestParams) {\n await this.ensureValidToken();\n\n return super.request(path, {\n ...params,\n query: { teamId: this.teamId, ...params?.query },\n headers: {\n \"content-type\": \"application/json\",\n \"user-agent\": `vercel/sandbox/${VERSION} (Node.js/${process.version}; ${os.platform()}/${os.arch()})`,\n ...params?.headers,\n },\n });\n }\n\n async getSession(\n params: WithPrivate<{ sessionId: string; signal?: AbortSignal }>,\n ) {\n const privateParams = getPrivateParams(params);\n let querystring = new URLSearchParams(privateParams).toString();\n querystring = querystring ? `?${querystring}` : \"\";\n return parseOrThrow(\n SessionAndRoutesResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}${querystring}`, {\n signal: params.signal,\n }),\n );\n }\n\n async createSandbox(\n params: WithPrivate<{\n name?: string;\n ports?: number[];\n projectId: string;\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n username?: string;\n password?: string;\n }\n | { type: \"tarball\"; url: string }\n | { type: \"snapshot\"; snapshotId: string };\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n runtime?: RUNTIMES | (string & {});\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n mounts?: BaseCreateSandboxParams[\"mounts\"];\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\"/v2/sandboxes\", {\n method: \"POST\",\n body: JSON.stringify({\n projectId: params.projectId,\n ports: params.ports,\n source: params.source,\n timeout: params.timeout,\n resources: params.resources,\n runtime: params.runtime,\n image: params.image,\n name: params.name,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n mounts: params.mounts,\n ...privateParams,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async forkSandbox(\n params: WithPrivate<{\n sourceSandbox: string;\n projectId: string;\n name?: string;\n ports?: number[];\n timeout?: number;\n resources?: { vcpus: number };\n persistent?: boolean;\n image?: string;\n networkPolicy?: NetworkPolicy;\n env?: Record<string, string>;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n };\n signal?: AbortSignal;\n }>,\n ) {\n const privateParams = getPrivateParams(params);\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(\n `/v2/sandboxes/${encodeURIComponent(params.sourceSandbox)}/fork`,\n {\n method: \"POST\",\n query: { projectId: params.projectId },\n body: JSON.stringify({\n name: params.name,\n ports: params.ports,\n timeout: params.timeout,\n resources: params.resources,\n image: params.image,\n persistent: params.persistent,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n env: params.env,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n ...privateParams,\n }),\n signal: params.signal,\n },\n ),\n );\n }\n\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait: true;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<{\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: false;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async runCommand(params: {\n sessionId: string;\n cwd?: string;\n command: string;\n args: string[];\n env: Record<string, string>;\n sudo: boolean;\n wait?: boolean;\n logs?: boolean;\n onLog?: (log: LogOutputLine) => void;\n timeout?: number;\n signal?: AbortSignal;\n }): Promise<\n | {\n command: CommandData;\n finished: Promise<CommandFinishedData>;\n }\n | Parsed<z.infer<typeof CommandResponse>>\n > {\n if (params.wait) {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd`,\n {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n wait: true,\n logs: params.logs || undefined,\n timeout: params.timeout,\n }),\n signal: params.signal,\n },\n );\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of command data\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal: params.signal }).catch(\n (err) => {\n console.error(\"Error piping command stream:\", err);\n },\n );\n\n const iterator = jsonlinesStream[Symbol.asyncIterator]();\n const commandChunk = await iterator.next();\n if (commandChunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command data was received\",\n params.sessionId,\n );\n }\n const { command } = CommandResponse.parse(commandChunk.value);\n\n const finished = (async () => {\n while (true) {\n const chunk = await iterator.next();\n if (chunk.done) {\n throw new StreamError(\n \"stream_ended_early\",\n \"Stream ended before command finished\",\n params.sessionId,\n );\n }\n\n if (chunk.value?.command) {\n const { command } = CommandFinishedResponse.parse(chunk.value);\n return command;\n }\n\n const parsed = LogLine.parse(chunk.value);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n params.onLog?.(parsed);\n }\n })();\n\n return { command, finished };\n }\n\n return parseOrThrow(\n CommandResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/cmd`, {\n method: \"POST\",\n body: JSON.stringify({\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n sudo: params.sudo,\n timeout: params.timeout,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait: true;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandFinishedResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CommandResponse>>>;\n async getCommand(params: {\n sessionId: string;\n cmdId: string;\n wait?: boolean;\n signal?: AbortSignal;\n }) {\n return params.wait\n ? parseOrThrow(\n CommandFinishedResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal, query: { wait: \"true\" } },\n ),\n )\n : parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}`,\n { signal: params.signal },\n ),\n );\n }\n\n async openInteractive(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof InteractiveSessionResponse>>> {\n return parseOrThrow(\n InteractiveSessionResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/interactive`,\n {\n method: \"POST\",\n body: JSON.stringify({}),\n signal: params.signal,\n },\n ),\n );\n }\n\n async mkDir(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n EmptyResponse,\n await this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/mkdir`, {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n }),\n );\n }\n\n getFileWriter(params: {\n sessionId: string;\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const writer = new FileWriter();\n return {\n response: (async () => {\n return this.request(`/v2/sandboxes/sessions/${params.sessionId}/fs/write`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/gzip\",\n \"x-cwd\": params.extractDir,\n },\n body: await consumeReadable(writer.readable),\n signal: params.signal,\n });\n })(),\n writer,\n };\n }\n\n async listSessions(params: {\n /**\n * The ID or name of the project to which the sessions belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter sessions by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of sessions to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SessionsResponse,\n await this.request(`/v2/sandboxes/sessions`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async listSnapshots(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n * @example \"my-project\"\n */\n projectId: string;\n /**\n * Filter snapshots by sandbox name.\n */\n name?: string;\n /**\n * Maximum number of snapshots to list from a request.\n * @example 10\n */\n limit?: number;\n /**\n * Cursor for pagination.\n */\n cursor?: string;\n /**\n * Sort order for results.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotsResponse,\n await this.request(`/v2/sandboxes/snapshots`, {\n query: {\n project: params.projectId,\n name: params.name,\n limit: params.limit,\n cursor: params.cursor,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async getSnapshotTree(params: {\n /**\n * The ID or name of the project to which the snapshots belong.\n */\n projectId: string;\n /**\n * The snapshot ID to use as the anchor for the tree traversal.\n */\n snapshotId: string;\n /**\n * Maximum number of nodes to return.\n */\n limit?: number;\n /**\n * Sort order: \"asc\" for descendants, \"desc\" for ancestors.\n */\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SnapshotTreeResponse,\n await this.request(`/v2/sandboxes/snapshots/tree`, {\n query: {\n project: params.projectId,\n snapshotId: params.snapshotId,\n limit: params.limit,\n sortOrder: params.sortOrder,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async listDrives(params: {\n projectId: string;\n limit?: number;\n cursor?: string | number;\n since?: number | string;\n until?: number | string;\n sortBy?: \"createdAt\" | \"updatedAt\" | \"name\";\n sortOrder?: \"asc\" | \"desc\";\n namePrefix?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n DrivesResponse,\n await this.request(`/v2/sandboxes/drives`, {\n query: {\n projectId: params.projectId,\n limit: params.limit,\n cursor: params.cursor ?? params.until,\n since: params.since,\n sortBy: params.sortBy,\n sortOrder: params.sortOrder,\n namePrefix: params.namePrefix,\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async getOrCreateDrive(params: {\n projectId: string;\n name: string;\n maxSizeBytes?: number;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n DriveResponse,\n await this.request(\n `/v2/sandboxes/drives/${encodeURIComponent(params.name)}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n projectId: params.projectId,\n maxSizeBytes: params.maxSizeBytes,\n }),\n signal: params.signal,\n },\n ),\n );\n }\n\n async writeFiles(params: {\n sessionId: string;\n cwd: string;\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[];\n extractDir: string;\n signal?: AbortSignal;\n }) {\n const { writer, response } = this.getFileWriter({\n sessionId: params.sessionId,\n extractDir: params.extractDir,\n signal: params.signal,\n });\n\n for (const file of params.files) {\n await writer.addFile({\n name: normalizePath({\n filePath: file.path,\n extractDir: params.extractDir,\n cwd: params.cwd,\n }),\n content: file.content,\n mode: file.mode,\n });\n }\n\n writer.end();\n await parseOrThrow(EmptyResponse, await response);\n }\n\n async readFile(params: {\n sessionId: string;\n path: string;\n cwd?: string;\n signal?: AbortSignal;\n }): Promise<Readable | null> {\n const response = await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/fs/read`,\n {\n method: \"POST\",\n body: JSON.stringify({ path: params.path, cwd: params.cwd }),\n signal: params.signal,\n },\n );\n\n if (response.status === 404) {\n return null;\n }\n\n // The file endpoint must return the file as an octet-stream. Any other\n // content type (e.g. application/json) indicates an error payload that\n // would otherwise be piped verbatim into the destination file.\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!response.ok || !contentType.includes(\"application/octet-stream\")) {\n const text = await response.text().catch(() => \"\");\n let json: unknown;\n try {\n json = JSON.parse(text || \"{}\");\n } catch {\n json = undefined;\n }\n throw new APIError(response, {\n message: `Unexpected response reading file: status ${response.status}, content-type ${contentType || \"(none)\"}`,\n json,\n text,\n });\n }\n\n if (response.body === null) {\n return null;\n }\n\n return Readable.fromWeb(response.body);\n }\n\n async killCommand(params: {\n sessionId: string;\n commandId: string;\n signal: number;\n abortSignal?: AbortSignal;\n }) {\n return parseOrThrow(\n CommandResponse,\n await this.request(\n `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.commandId}/kill`,\n {\n method: \"POST\",\n body: JSON.stringify({ signal: params.signal }),\n signal: params.abortSignal,\n },\n ),\n );\n }\n\n getLogs(params: {\n sessionId: string;\n cmdId: string;\n signal?: AbortSignal;\n }): AsyncGenerator<LogOutputLine, void, void> &\n Disposable & { close(): void } {\n const self = this;\n const disposer = new AbortController();\n const signal = !params.signal\n ? disposer.signal\n : mergeSignals(params.signal, disposer.signal);\n\n const generator = (async function* () {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/cmd/${params.cmdId}/logs`;\n const response = await self.request(url, {\n method: \"GET\",\n signal,\n });\n\n if (!response.ok) {\n await parseOrThrow(z.any(), response);\n }\n\n if (response.headers.get(\"content-type\") !== \"application/x-ndjson\") {\n throw new APIError(response, {\n message: \"Expected a stream of logs\",\n sessionId: params.sessionId,\n });\n }\n\n if (response.body === null) {\n throw new APIError(response, {\n message: \"No response body\",\n sessionId: params.sessionId,\n });\n }\n\n const jsonlinesStream = jsonlines.parse();\n pipe(response.body, jsonlinesStream, { signal }).catch((err) => {\n console.error(\"Error piping logs:\", err);\n });\n\n for await (const chunk of jsonlinesStream) {\n const parsed = LogLine.parse(chunk);\n if (parsed.stream === \"error\") {\n throw new StreamError(\n parsed.data.code,\n parsed.data.message,\n params.sessionId,\n );\n }\n yield parsed;\n }\n })();\n\n return Object.assign(generator, {\n [Symbol.dispose]() {\n disposer.abort(\"Disposed\");\n },\n close: () => disposer.abort(\"Disposed\"),\n });\n }\n\n async stopSession(params: {\n sessionId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof StopSessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/stop`;\n return parseOrThrow(\n StopSessionResponse,\n await this.request(url, { method: \"POST\", signal: params.signal }),\n );\n }\n\n async updateNetworkPolicy(params: {\n sessionId: string;\n networkPolicy: NetworkPolicy;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/network-policy`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify(toAPINetworkPolicy(params.networkPolicy)),\n signal: params.signal,\n }),\n );\n }\n\n async extendTimeout(params: {\n sessionId: string;\n duration: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SessionResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/extend-timeout`;\n return parseOrThrow(\n SessionResponse,\n await this.request(url, {\n method: \"POST\",\n body: JSON.stringify({ duration: params.duration }),\n signal: params.signal,\n }),\n );\n }\n\n async createSnapshot(params: {\n sessionId: string;\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof CreateSnapshotResponse>>> {\n const url = `/v2/sandboxes/sessions/${params.sessionId}/snapshot`;\n const body =\n params.expiration === undefined\n ? undefined\n : JSON.stringify({ expiration: params.expiration });\n return parseOrThrow(\n CreateSnapshotResponse,\n await this.request(url, {\n method: \"POST\",\n body,\n signal: params.signal,\n }),\n );\n }\n\n async deleteSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { method: \"DELETE\", signal: params.signal }),\n );\n }\n\n async getSnapshot(params: {\n snapshotId: string;\n signal?: AbortSignal;\n }): Promise<Parsed<z.infer<typeof SnapshotResponse>>> {\n const url = `/v2/sandboxes/snapshots/${params.snapshotId}`;\n return parseOrThrow(\n SnapshotResponse,\n await this.request(url, { signal: params.signal }),\n );\n }\n\n async getSandbox(params: WithPrivate<{\n name: string;\n projectId: string;\n resume?: boolean;\n signal?: AbortSignal;\n }>) {\n const privateParams = getPrivateParams(params);\n const query: Record<string, string | undefined> = {\n projectId: params.projectId,\n ...privateParams,\n };\n if (params.resume !== undefined) {\n query.resume = String(params.resume);\n }\n return parseOrThrow(\n SandboxAndSessionResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n query,\n signal: params.signal,\n }),\n );\n }\n\n async listSandboxes(params: {\n projectId: string;\n limit?: number;\n sortBy?: \"createdAt\" | \"name\" | \"statusUpdatedAt\";\n sortOrder?: \"asc\" | \"desc\";\n namePrefix?: string;\n cursor?: string;\n tags?: Record<string, string>;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n SandboxesPaginationResponse,\n await this.request(`/v2/sandboxes`, {\n query: {\n project: params.projectId,\n limit: params.limit,\n sortBy: params.sortBy,\n sortOrder: params.sortOrder,\n namePrefix: params.namePrefix,\n cursor: params.cursor,\n tags: toTagsFilter(params.tags),\n },\n method: \"GET\",\n signal: params.signal,\n }),\n );\n }\n\n async deleteDrive(params: {\n projectId: string;\n name: string;\n signal?: AbortSignal;\n }) {\n const url = `/v2/sandboxes/drives/${encodeURIComponent(params.name)}`;\n return parseOrThrow(\n DriveResponse,\n await this.request(url, {\n method: \"DELETE\",\n query: {\n projectId: params.projectId,\n },\n signal: params.signal,\n }),\n );\n }\n\n async updateSandbox(params: {\n name: string;\n projectId: string;\n persistent?: boolean;\n resources?: { vcpus?: number; memory?: number };\n runtime?: RUNTIMES | (string & {});\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n ports?: number[];\n snapshotExpiration?: number;\n keepLastSnapshots?: {\n count: number;\n expiration?: number;\n deleteEvicted?: boolean;\n } | null;\n currentSnapshotId?: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"PATCH\",\n query: {\n projectId: params.projectId,\n },\n body: JSON.stringify({\n persistent: params.persistent,\n resources: params.resources,\n runtime: params.runtime,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy\n ? toAPINetworkPolicy(params.networkPolicy)\n : undefined,\n tags: params.tags,\n ports: params.ports,\n snapshotExpiration: params.snapshotExpiration,\n keepLastSnapshots: params.keepLastSnapshots,\n currentSnapshotId: params.currentSnapshotId,\n }),\n signal: params.signal,\n }),\n );\n }\n\n async deleteSandbox(params: {\n name: string;\n projectId: string;\n signal?: AbortSignal;\n }) {\n return parseOrThrow(\n UpdateSandboxResponse,\n await this.request(`/v2/sandboxes/${encodeURIComponent(params.name)}`, {\n method: \"DELETE\",\n query: {\n projectId: params.projectId,\n },\n signal: params.signal,\n }),\n );\n }\n}\n\nasync function pipe(\n readable: ReadableStream<Uint8Array>,\n output: NodeJS.WritableStream,\n options?: { signal?: AbortSignal },\n) {\n const reader = readable.getReader();\n let aborted = false;\n\n const signal = options?.signal;\n const onAbort = () => {\n aborted = true;\n const reason =\n signal?.reason ??\n new DOMException(\"The operation was aborted.\", \"AbortError\");\n void reader.cancel(reason).catch(() => {\n // ignore cancel errors when aborting\n });\n\n if (\"destroy\" in output && typeof output.destroy === \"function\") {\n output.destroy(reason as Error);\n return;\n }\n\n output.emit(\"error\", reason);\n output.end();\n };\n\n if (signal) {\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (true) {\n const read = await reader.read();\n if (read.value) {\n output.write(Buffer.from(read.value));\n }\n if (read.done) {\n break;\n }\n }\n } catch (err) {\n if (!aborted) {\n output.emit(\"error\", err);\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n if (!aborted) {\n output.end();\n }\n }\n}\n\nfunction mergeSignals(...signals: [AbortSignal, ...AbortSignal[]]) {\n const controller = new AbortController();\n const onAbort = () => {\n controller.abort();\n for (const signal of signals) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener(\"abort\", onAbort);\n }\n return controller.signal;\n}\n\nfunction toTagsFilter(\n tags: Record<string, string> | undefined,\n): string[] | undefined {\n if (tags === undefined) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries.map(([key, value]) => `${key}:${value}`);\n}\n"],"mappings":"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"}

@@ -1,2 +0,2 @@

import { Command, CommandData, CommandFinishedData, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, InteractiveSessionResponse, LogError, LogLine, LogLineData, LogOutputLine, Sandbox, SandboxMetaData, SandboxRoute, SandboxRouteData, Session, SessionMetaData, SessionResponse, Snapshot, SnapshotMetadata, SnapshotResponse, SnapshotTreeNode, SnapshotTreeNodeData, StopSessionResponse } from "./validators.js";
import { Command, CommandData, CommandFinishedData, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, Drive, DriveMetadata, InteractiveSessionResponse, LogError, LogLine, LogLineData, LogOutputLine, Sandbox, SandboxMetaData, SandboxRoute, SandboxRouteData, Session, SessionMetaData, SessionResponse, Snapshot, SnapshotMetadata, SnapshotResponse, SnapshotTreeNode, SnapshotTreeNodeData, StopSessionResponse } from "./validators.js";
import { APIClient } from "./api-client.js";

@@ -1,4 +0,4 @@

import { Command, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, CursorPagination, EmptyResponse, ForwardRuleValidator, InjectionRuleValidator, InteractiveSessionResponse, LogError, LogLine, LogLineStderr, LogLineStdout, NetworkPolicyRequestValidator, NetworkPolicyResponseValidator, NetworkPolicyRuleValidator, NetworkPolicyTransformValidator, Sandbox, SandboxAndSessionResponse, SandboxRoute, SandboxesPaginationResponse, Session, SessionAndRoutesResponse, SessionResponse, SessionsResponse, Snapshot, SnapshotResponse, SnapshotTreeNode, SnapshotTreeResponse, SnapshotsResponse, StopSessionResponse, UpdateSandboxResponse, V2NetworkPolicyObjectValidator } from "./validators.js";
import { Command, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, CursorPagination, Drive, DriveResponse, DrivesResponse, EmptyResponse, ForwardRuleValidator, InjectionRuleValidator, InteractiveSessionResponse, LogError, LogLine, LogLineStderr, LogLineStdout, NetworkPolicyRequestValidator, NetworkPolicyResponseValidator, NetworkPolicyRuleValidator, NetworkPolicyTransformValidator, Sandbox, SandboxAndSessionResponse, SandboxRoute, SandboxesPaginationResponse, Session, SessionAndRoutesResponse, SessionResponse, SessionsResponse, Snapshot, SnapshotResponse, SnapshotTreeNode, SnapshotTreeResponse, SnapshotsResponse, StopSessionResponse, UpdateSandboxResponse, V2NetworkPolicyObjectValidator } from "./validators.js";
import { APIClient } from "./api-client.js";
export { };

@@ -174,2 +174,16 @@ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');

const SnapshotResponse = zod.z.object({ snapshot: Snapshot });
const Drive = zod.z.object({
name: zod.z.string(),
projectId: zod.z.string(),
maxSizeBytes: zod.z.number(),
currentSessionId: zod.z.string().optional(),
currentSandboxName: zod.z.string().optional(),
createdAt: zod.z.number(),
updatedAt: zod.z.number()
});
const DrivesResponse = zod.z.object({
drives: zod.z.array(Drive),
pagination: CursorPagination
});
const DriveResponse = zod.z.object({ drive: Drive });
const Sandbox = zod.z.object({

@@ -198,2 +212,6 @@ name: zod.z.string(),

tags: zod.z.record(zod.z.string(), zod.z.string()).optional(),
mounts: zod.z.record(zod.z.string(), zod.z.object({
drive: zod.z.string(),
mode: zod.z.enum(["read-only", "read-write"]).optional()
})).optional(),
snapshotExpiration: zod.z.number().optional(),

@@ -232,2 +250,5 @@ keepLastSnapshots: zod.z.object({

exports.CursorPagination = CursorPagination;
exports.Drive = Drive;
exports.DriveResponse = DriveResponse;
exports.DrivesResponse = DrivesResponse;
exports.EmptyResponse = EmptyResponse;

@@ -234,0 +255,0 @@ exports.ForwardRuleValidator = ForwardRuleValidator;

@@ -1,1 +0,1 @@

{"version":3,"file":"validators.cjs","names":["z"],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z\n .object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n })\n .refine(\n ({ transform, forwardURL }) =>\n transform === undefined || forwardURL === undefined,\n { message: \"transform and forwardURL cannot be used together\" },\n )\n .refine(\n ({ transform, forwardURL }) =>\n transform !== undefined || forwardURL !== undefined,\n { message: \"transform or forwardURL must be provided\" },\n );\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z\n .object({\n ingress: z.number(),\n egress: z.number(),\n })\n .optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n // optional because the duration was not preserved for older commands\n durationMs: z.number().optional(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<\n typeof CommandFinishedResponse\n>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n image: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n expiresAt: z.number().optional(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string(), z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n resumed: z.boolean().optional(),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":"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"}
{"version":3,"file":"validators.cjs","names":["z"],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z\n .object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n })\n .refine(\n ({ transform, forwardURL }) =>\n transform === undefined || forwardURL === undefined,\n { message: \"transform and forwardURL cannot be used together\" },\n )\n .refine(\n ({ transform, forwardURL }) =>\n transform !== undefined || forwardURL !== undefined,\n { message: \"transform or forwardURL must be provided\" },\n );\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z\n .object({\n ingress: z.number(),\n egress: z.number(),\n })\n .optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n // optional because the duration was not preserved for older commands\n durationMs: z.number().optional(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<\n typeof CommandFinishedResponse\n>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Drive = z.object({\n name: z.string(),\n projectId: z.string(),\n maxSizeBytes: z.number(),\n currentSessionId: z.string().optional(),\n currentSandboxName: z.string().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport type DriveMetadata = z.infer<typeof Drive>;\n\nexport const DrivesResponse = z.object({\n drives: z.array(Drive),\n pagination: CursorPagination,\n});\n\nexport const DriveResponse = z.object({\n drive: Drive,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n image: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n expiresAt: z.number().optional(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string(), z.string()).optional(),\n mounts: z\n .record(\n z.string(),\n z.object({\n drive: z.string(),\n mode: z.enum([\"read-only\", \"read-write\"]).optional(),\n }),\n )\n .optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n resumed: z.boolean().optional(),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":"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"}

@@ -520,2 +520,12 @@ import { z } from "zod";

}, z.core.$strip>;
declare const Drive: z.ZodObject<{
name: z.ZodString;
projectId: z.ZodString;
maxSizeBytes: z.ZodNumber;
currentSessionId: z.ZodOptional<z.ZodString>;
currentSandboxName: z.ZodOptional<z.ZodString>;
createdAt: z.ZodNumber;
updatedAt: z.ZodNumber;
}, z.core.$strip>;
type DriveMetadata = z.infer<typeof Drive>;
declare const Sandbox: z.ZodObject<{

@@ -634,2 +644,9 @@ name: z.ZodString;

tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
mounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
drive: z.ZodString;
mode: z.ZodOptional<z.ZodEnum<{
"read-only": "read-only";
"read-write": "read-write";
}>>;
}, z.core.$strip>>>;
snapshotExpiration: z.ZodOptional<z.ZodNumber>;

@@ -874,2 +891,9 @@ keepLastSnapshots: z.ZodOptional<z.ZodObject<{

tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
mounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
drive: z.ZodString;
mode: z.ZodOptional<z.ZodEnum<{
"read-only": "read-only";
"read-write": "read-write";
}>>;
}, z.core.$strip>>>;
snapshotExpiration: z.ZodOptional<z.ZodNumber>;

@@ -901,3 +925,3 @@ keepLastSnapshots: z.ZodOptional<z.ZodObject<{

//#endregion
export { CommandData, CommandFinishedData, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, InteractiveSessionResponse, LogOutputLine, SandboxMetaData, SandboxRouteData, SessionMetaData, SessionResponse, SnapshotMetadata, SnapshotResponse, SnapshotTreeNodeData, StopSessionResponse };
export { CommandData, CommandFinishedData, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, DriveMetadata, InteractiveSessionResponse, LogOutputLine, SandboxMetaData, SandboxRouteData, SessionMetaData, SessionResponse, SnapshotMetadata, SnapshotResponse, SnapshotTreeNodeData, StopSessionResponse };
//# sourceMappingURL=validators.d.cts.map

@@ -520,2 +520,12 @@ import { z } from "zod";

}, z.core.$strip>;
declare const Drive: z.ZodObject<{
name: z.ZodString;
projectId: z.ZodString;
maxSizeBytes: z.ZodNumber;
currentSessionId: z.ZodOptional<z.ZodString>;
currentSandboxName: z.ZodOptional<z.ZodString>;
createdAt: z.ZodNumber;
updatedAt: z.ZodNumber;
}, z.core.$strip>;
type DriveMetadata = z.infer<typeof Drive>;
declare const Sandbox: z.ZodObject<{

@@ -634,2 +644,9 @@ name: z.ZodString;

tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
mounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
drive: z.ZodString;
mode: z.ZodOptional<z.ZodEnum<{
"read-only": "read-only";
"read-write": "read-write";
}>>;
}, z.core.$strip>>>;
snapshotExpiration: z.ZodOptional<z.ZodNumber>;

@@ -874,2 +891,9 @@ keepLastSnapshots: z.ZodOptional<z.ZodObject<{

tags: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
mounts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
drive: z.ZodString;
mode: z.ZodOptional<z.ZodEnum<{
"read-only": "read-only";
"read-write": "read-write";
}>>;
}, z.core.$strip>>>;
snapshotExpiration: z.ZodOptional<z.ZodNumber>;

@@ -901,3 +925,3 @@ keepLastSnapshots: z.ZodOptional<z.ZodObject<{

//#endregion
export { Command, CommandData, CommandFinishedData, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, InteractiveSessionResponse, LogError, LogLine, LogLineData, LogOutputLine, Sandbox, SandboxMetaData, SandboxRoute, SandboxRouteData, Session, SessionMetaData, SessionResponse, Snapshot, SnapshotMetadata, SnapshotResponse, SnapshotTreeNode, SnapshotTreeNodeData, StopSessionResponse };
export { Command, CommandData, CommandFinishedData, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, Drive, DriveMetadata, InteractiveSessionResponse, LogError, LogLine, LogLineData, LogOutputLine, Sandbox, SandboxMetaData, SandboxRoute, SandboxRouteData, Session, SessionMetaData, SessionResponse, Snapshot, SnapshotMetadata, SnapshotResponse, SnapshotTreeNode, SnapshotTreeNodeData, StopSessionResponse };
//# sourceMappingURL=validators.d.ts.map

@@ -173,2 +173,16 @@ import { z } from "zod";

const SnapshotResponse = z.object({ snapshot: Snapshot });
const Drive = z.object({
name: z.string(),
projectId: z.string(),
maxSizeBytes: z.number(),
currentSessionId: z.string().optional(),
currentSandboxName: z.string().optional(),
createdAt: z.number(),
updatedAt: z.number()
});
const DrivesResponse = z.object({
drives: z.array(Drive),
pagination: CursorPagination
});
const DriveResponse = z.object({ drive: Drive });
const Sandbox = z.object({

@@ -197,2 +211,6 @@ name: z.string(),

tags: z.record(z.string(), z.string()).optional(),
mounts: z.record(z.string(), z.object({
drive: z.string(),
mode: z.enum(["read-only", "read-write"]).optional()
})).optional(),
snapshotExpiration: z.number().optional(),

@@ -226,3 +244,3 @@ keepLastSnapshots: z.object({

//#endregion
export { Command, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, CursorPagination, EmptyResponse, ForwardRuleValidator, InjectionRuleValidator, InteractiveSessionResponse, LogError, LogLine, LogLineStderr, LogLineStdout, NetworkPolicyRequestValidator, NetworkPolicyResponseValidator, NetworkPolicyRuleValidator, NetworkPolicyTransformValidator, Sandbox, SandboxAndSessionResponse, SandboxRoute, SandboxesPaginationResponse, Session, SessionAndRoutesResponse, SessionResponse, SessionsResponse, Snapshot, SnapshotResponse, SnapshotTreeNode, SnapshotTreeResponse, SnapshotsResponse, StopSessionResponse, UpdateSandboxResponse, V2NetworkPolicyObjectValidator };
export { Command, CommandFinishedResponse, CommandResponse, CreateSnapshotResponse, CursorPagination, Drive, DriveResponse, DrivesResponse, EmptyResponse, ForwardRuleValidator, InjectionRuleValidator, InteractiveSessionResponse, LogError, LogLine, LogLineStderr, LogLineStdout, NetworkPolicyRequestValidator, NetworkPolicyResponseValidator, NetworkPolicyRuleValidator, NetworkPolicyTransformValidator, Sandbox, SandboxAndSessionResponse, SandboxRoute, SandboxesPaginationResponse, Session, SessionAndRoutesResponse, SessionResponse, SessionsResponse, Snapshot, SnapshotResponse, SnapshotTreeNode, SnapshotTreeResponse, SnapshotsResponse, StopSessionResponse, UpdateSandboxResponse, V2NetworkPolicyObjectValidator };
//# sourceMappingURL=validators.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"validators.js","names":[],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z\n .object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n })\n .refine(\n ({ transform, forwardURL }) =>\n transform === undefined || forwardURL === undefined,\n { message: \"transform and forwardURL cannot be used together\" },\n )\n .refine(\n ({ transform, forwardURL }) =>\n transform !== undefined || forwardURL !== undefined,\n { message: \"transform or forwardURL must be provided\" },\n );\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z\n .object({\n ingress: z.number(),\n egress: z.number(),\n })\n .optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n // optional because the duration was not preserved for older commands\n durationMs: z.number().optional(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<\n typeof CommandFinishedResponse\n>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n image: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n expiresAt: z.number().optional(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string(), z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n resumed: z.boolean().optional(),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":";;;AAIA,MAAM,uBAAuB,EAAE,OAAO;CACpC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAM,2BAA2B,EAAE,OAAO;CACxC,KAAK,qBAAqB,UAAU;CACpC,OAAO,qBAAqB,UAAU;CACvC,CAAC;AAEF,MAAM,qBAAqB,EAAE,OAAO;CAClC,MAAM,qBAAqB,UAAU;CACrC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CACtC,aAAa,EAAE,MAAM,yBAAyB,CAAC,UAAU;CACzD,SAAS,EAAE,MAAM,yBAAyB,CAAC,UAAU;CACtD,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,QAAQ,EAAE,QAAQ;CAElB,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CAEpD,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,OAAO,mBAAmB,UAAU;CACrC,CAAC;AAEF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,QAAQ,EAAE,QAAQ;CAClB,YAAY,EAAE,QAAQ;CACtB,OAAO,mBAAmB,UAAU;CACrC,CAAC;AAEF,MAAa,kCAAkC,EAAE,OAAO,EACtD,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU,EACrD,CAAC;AAEF,MAAa,6BAA6B,EACvC,OAAO;CACN,OAAO,mBAAmB,UAAU;CACpC,WAAW,EAAE,MAAM,gCAAgC,CAAC,UAAU;CAC9D,YAAY,EAAE,QAAQ,CAAC,UAAU;CAClC,CAAC,CACD,QACE,EAAE,WAAW,iBACZ,cAAc,UAAa,eAAe,QAC5C,EAAE,SAAS,oDAAoD,CAChE,CACA,QACE,EAAE,WAAW,iBACZ,cAAc,UAAa,eAAe,QAC5C,EAAE,SAAS,4CAA4C,CACxD;AAEH,MAAa,iCAAiC,EAAE,OAAO;CACrD,OAAO,EACJ,MAAM,CACL,EAAE,MAAM,EAAE,QAAQ,CAAC,EACnB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,2BAA2B,CAAC,CAC1D,CAAC,CACD,UAAU;CACb,SAAS,EACN,OAAO;EACN,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EACrC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EACrC,CAAC,CACD,UAAU;CACd,CAAC;AAEF,MAAM,6BAA6B,EAAE,MAAM,CACzC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,aAAa,EACxD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,WAAW,EAAE,CAAC,CAAC,aAAa,CACxD,CAAC;AAEF,MAAM,qCAAqC,EACxC,OAAO;CACN,MAAM,EAAE,QAAQ,SAAS;CACzB,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC9C,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC5C,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,gBAAgB,EAAE,MAAM,uBAAuB,CAAC,UAAU;CAC1D,cAAc,EAAE,MAAM,qBAAqB,CAAC,UAAU;CACvD,CAAC,CACD,aAAa;AAEhB,MAAa,gCAAgC,EAAE,MAAM,CACnD,4BACA,+BAA+B,aAAa,CAC7C,CAAC;AAEF,MAAa,iCAAiC,EAAE,MAAM,CACpD,4BACA,mCACD,CAAC;AAEF,MAAa,UAAU,EAAE,OAAO;CAC9B,IAAI,EAAE,QAAQ;CACd,QAAQ,EAAE,QAAQ;CAClB,OAAO,EAAE,QAAQ;CACjB,QAAQ,EAAE,QAAQ;CAClB,SAAS,EAAE,QAAQ;CACnB,SAAS,EAAE,QAAQ;CACnB,QAAQ,EAAE,KAAK;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,aAAa,EAAE,QAAQ;CACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,eAAe,EAAE,QAAQ,CAAC,UAAU;CACpC,WAAW,EAAE,QAAQ;CACrB,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,eAAe,+BAA+B,UAAU;CACxD,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,iBAAiB,EACd,OAAO;EACN,SAAS,EAAE,QAAQ;EACnB,QAAQ,EAAE,QAAQ;EACnB,CAAC,CACD,UAAU;CACd,CAAC;AAIF,MAAa,eAAe,EAAE,OAAO;CACnC,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAIF,MAAa,WAAW,EAAE,OAAO;CAC/B,IAAI,EAAE,QAAQ;CACd,iBAAiB,EAAE,QAAQ;CAC3B,QAAQ,EAAE,QAAQ;CAClB,QAAQ,EAAE,KAAK;EAAC;EAAW;EAAW;EAAS,CAAC;CAChD,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,gBAAgB,EAAE,QAAQ,CAAC,UAAU;CACrC,UAAU,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAIF,MAAa,UAAU,EAAE,OAAO;CAC9B,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CACzB,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;CAE/B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,kBAAkB,QAAQ,OAAO,EACrC,UAAU,EAAE,QAAQ,EACrB,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO,EACtC,SAAS,QAAQ,aAAa,EAC/B,CAAC;AAEF,MAAa,2BAA2B,gBAAgB,OAAO,EAC7D,QAAQ,EAAE,MAAM,aAAa,EAC9B,CAAC;AAIF,MAAa,6BAA6B,EAAE,OAAO;CACjD,KAAK,EAAE,QAAQ;CACf,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,UAAU,EAAE,MAAM,QAAQ,aAAa,CAAC;CACxC,YAAY;CACb,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO,EACtC,SAAS,SACV,CAAC;AAMF,MAAa,0BAA0B,EAAE,OAAO,EAC9C,SAAS,iBACV,CAAC;AAEF,MAAa,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAEzC,MAAM,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQ,EAAE,QAAQ,SAAS,EAC5B,CAAC;AACF,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQ,EAAE,QAAQ,SAAS,EAC5B,CAAC;AAEF,MAAa,WAAW,EAAE,OAAO;CAC/B,QAAQ,EAAE,QAAQ,QAAQ;CAC1B,MAAM,EAAE,OAAO;EACb,MAAM,EAAE,QAAQ;EAChB,SAAS,EAAE,QAAQ;EACpB,CAAC;CACH,CAAC;AAEF,MAAa,UAAU,EAAE,mBAAmB,UAAU;CACpD;CACA;CACA;CACD,CAAC;AAIF,MAAa,oBAAoB,EAAE,OAAO;CACxC,WAAW,EAAE,MAAM,SAAS;CAC5B,YAAY;CACb,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,UAAU;CACV,UAAU,EAAE,MAAM,SAAS;CAC3B,OAAO,EAAE,QAAQ;CAClB,CAAC;AAIF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,WAAW,EAAE,MAAM,iBAAiB;CACpC,QAAQ,iBAAiB,UAAU;CACnC,YAAY;CACb,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,UAAU;CACV,SAAS,QAAQ,aAAa;CAC/B,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO,EACvC,UAAU,UACX,CAAC;AAEF,MAAa,UAAU,EAAE,OAAO;CAC9B,MAAM,EAAE,QAAQ;CAChB,YAAY,EAAE,SAAS;CACvB,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,eAAe,+BAA+B,UAAU;CACxD,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,0BAA0B,EAAE,QAAQ,CAAC,UAAU;CAC/C,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,kBAAkB,EAAE,QAAQ;CAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,QAAQ,QAAQ,MAAM;CACtB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,KAAK,EAAE,QAAQ,CAAC,UAAU;CAC1B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CACjD,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,mBAAmB,EAChB,OAAO;EACN,OAAO,EAAE,QAAQ;EACjB,YAAY,EAAE,QAAQ,CAAC,UAAU;EACjC,eAAe,EAAE,SAAS,CAAC,UAAU;EACtC,CAAC,CACD,UAAU;CACd,CAAC;AAIF,MAAa,sBAAsB,EAAE,OAAO;CAC1C,SAAS,QAAQ,aAAa;CAC9B,SAAS,QAAQ,UAAU;CAC3B,UAAU,SAAS,UAAU;CAC9B,CAAC;AAEF,MAAa,4BAA4B,EAAE,OAAO;CAChD,SAAS;CACT,SAAS,QAAQ,aAAa;CAC9B,QAAQ,EAAE,MAAM,aAAa;CAC7B,SAAS,EAAE,SAAS,CAAC,UAAU;CAChC,CAAC;AAEF,MAAa,8BAA8B,EAAE,OAAO;CAClD,WAAW,EAAE,MAAM,QAAQ;CAC3B,YAAY;CACb,CAAC;AAEF,MAAa,wBAAwB,EAAE,OAAO;CAC5C,SAAS;CACT,QAAQ,EAAE,MAAM,aAAa,CAAC,UAAU;CACzC,CAAC"}
{"version":3,"file":"validators.js","names":[],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z\n .object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n })\n .refine(\n ({ transform, forwardURL }) =>\n transform === undefined || forwardURL === undefined,\n { message: \"transform and forwardURL cannot be used together\" },\n )\n .refine(\n ({ transform, forwardURL }) =>\n transform !== undefined || forwardURL !== undefined,\n { message: \"transform or forwardURL must be provided\" },\n );\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z\n .object({\n ingress: z.number(),\n egress: z.number(),\n })\n .optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n // optional because the duration was not preserved for older commands\n durationMs: z.number().optional(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<\n typeof CommandFinishedResponse\n>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Drive = z.object({\n name: z.string(),\n projectId: z.string(),\n maxSizeBytes: z.number(),\n currentSessionId: z.string().optional(),\n currentSandboxName: z.string().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport type DriveMetadata = z.infer<typeof Drive>;\n\nexport const DrivesResponse = z.object({\n drives: z.array(Drive),\n pagination: CursorPagination,\n});\n\nexport const DriveResponse = z.object({\n drive: Drive,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n image: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyResponseValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n expiresAt: z.number().optional(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string(), z.string()).optional(),\n mounts: z\n .record(\n z.string(),\n z.object({\n drive: z.string(),\n mode: z.enum([\"read-only\", \"read-write\"]).optional(),\n }),\n )\n .optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n resumed: z.boolean().optional(),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":";;;AAIA,MAAM,uBAAuB,EAAE,OAAO;CACpC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAM,2BAA2B,EAAE,OAAO;CACxC,KAAK,qBAAqB,UAAU;CACpC,OAAO,qBAAqB,UAAU;CACvC,CAAC;AAEF,MAAM,qBAAqB,EAAE,OAAO;CAClC,MAAM,qBAAqB,UAAU;CACrC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CACtC,aAAa,EAAE,MAAM,yBAAyB,CAAC,UAAU;CACzD,SAAS,EAAE,MAAM,yBAAyB,CAAC,UAAU;CACtD,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,QAAQ,EAAE,QAAQ;CAElB,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CAEpD,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,OAAO,mBAAmB,UAAU;CACrC,CAAC;AAEF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,QAAQ,EAAE,QAAQ;CAClB,YAAY,EAAE,QAAQ;CACtB,OAAO,mBAAmB,UAAU;CACrC,CAAC;AAEF,MAAa,kCAAkC,EAAE,OAAO,EACtD,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU,EACrD,CAAC;AAEF,MAAa,6BAA6B,EACvC,OAAO;CACN,OAAO,mBAAmB,UAAU;CACpC,WAAW,EAAE,MAAM,gCAAgC,CAAC,UAAU;CAC9D,YAAY,EAAE,QAAQ,CAAC,UAAU;CAClC,CAAC,CACD,QACE,EAAE,WAAW,iBACZ,cAAc,UAAa,eAAe,QAC5C,EAAE,SAAS,oDAAoD,CAChE,CACA,QACE,EAAE,WAAW,iBACZ,cAAc,UAAa,eAAe,QAC5C,EAAE,SAAS,4CAA4C,CACxD;AAEH,MAAa,iCAAiC,EAAE,OAAO;CACrD,OAAO,EACJ,MAAM,CACL,EAAE,MAAM,EAAE,QAAQ,CAAC,EACnB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,2BAA2B,CAAC,CAC1D,CAAC,CACD,UAAU;CACb,SAAS,EACN,OAAO;EACN,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EACrC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EACrC,CAAC,CACD,UAAU;CACd,CAAC;AAEF,MAAM,6BAA6B,EAAE,MAAM,CACzC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,aAAa,EACxD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,WAAW,EAAE,CAAC,CAAC,aAAa,CACxD,CAAC;AAEF,MAAM,qCAAqC,EACxC,OAAO;CACN,MAAM,EAAE,QAAQ,SAAS;CACzB,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC9C,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC5C,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,gBAAgB,EAAE,MAAM,uBAAuB,CAAC,UAAU;CAC1D,cAAc,EAAE,MAAM,qBAAqB,CAAC,UAAU;CACvD,CAAC,CACD,aAAa;AAEhB,MAAa,gCAAgC,EAAE,MAAM,CACnD,4BACA,+BAA+B,aAAa,CAC7C,CAAC;AAEF,MAAa,iCAAiC,EAAE,MAAM,CACpD,4BACA,mCACD,CAAC;AAEF,MAAa,UAAU,EAAE,OAAO;CAC9B,IAAI,EAAE,QAAQ;CACd,QAAQ,EAAE,QAAQ;CAClB,OAAO,EAAE,QAAQ;CACjB,QAAQ,EAAE,QAAQ;CAClB,SAAS,EAAE,QAAQ;CACnB,SAAS,EAAE,QAAQ;CACnB,QAAQ,EAAE,KAAK;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,aAAa,EAAE,QAAQ;CACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,eAAe,EAAE,QAAQ,CAAC,UAAU;CACpC,WAAW,EAAE,QAAQ;CACrB,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,eAAe,+BAA+B,UAAU;CACxD,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,iBAAiB,EACd,OAAO;EACN,SAAS,EAAE,QAAQ;EACnB,QAAQ,EAAE,QAAQ;EACnB,CAAC,CACD,UAAU;CACd,CAAC;AAIF,MAAa,eAAe,EAAE,OAAO;CACnC,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAIF,MAAa,WAAW,EAAE,OAAO;CAC/B,IAAI,EAAE,QAAQ;CACd,iBAAiB,EAAE,QAAQ;CAC3B,QAAQ,EAAE,QAAQ;CAClB,QAAQ,EAAE,KAAK;EAAC;EAAW;EAAW;EAAS,CAAC;CAChD,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,gBAAgB,EAAE,QAAQ,CAAC,UAAU;CACrC,UAAU,EAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAIF,MAAa,UAAU,EAAE,OAAO;CAC9B,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CACzB,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;CAE/B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,kBAAkB,QAAQ,OAAO,EACrC,UAAU,EAAE,QAAQ,EACrB,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO,EACtC,SAAS,QAAQ,aAAa,EAC/B,CAAC;AAEF,MAAa,2BAA2B,gBAAgB,OAAO,EAC7D,QAAQ,EAAE,MAAM,aAAa,EAC9B,CAAC;AAIF,MAAa,6BAA6B,EAAE,OAAO;CACjD,KAAK,EAAE,QAAQ;CACf,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,UAAU,EAAE,MAAM,QAAQ,aAAa,CAAC;CACxC,YAAY;CACb,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO,EACtC,SAAS,SACV,CAAC;AAMF,MAAa,0BAA0B,EAAE,OAAO,EAC9C,SAAS,iBACV,CAAC;AAEF,MAAa,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAEzC,MAAM,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQ,EAAE,QAAQ,SAAS,EAC5B,CAAC;AACF,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQ,EAAE,QAAQ,SAAS,EAC5B,CAAC;AAEF,MAAa,WAAW,EAAE,OAAO;CAC/B,QAAQ,EAAE,QAAQ,QAAQ;CAC1B,MAAM,EAAE,OAAO;EACb,MAAM,EAAE,QAAQ;EAChB,SAAS,EAAE,QAAQ;EACpB,CAAC;CACH,CAAC;AAEF,MAAa,UAAU,EAAE,mBAAmB,UAAU;CACpD;CACA;CACA;CACD,CAAC;AAIF,MAAa,oBAAoB,EAAE,OAAO;CACxC,WAAW,EAAE,MAAM,SAAS;CAC5B,YAAY;CACb,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,UAAU;CACV,UAAU,EAAE,MAAM,SAAS;CAC3B,OAAO,EAAE,QAAQ;CAClB,CAAC;AAIF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,WAAW,EAAE,MAAM,iBAAiB;CACpC,QAAQ,iBAAiB,UAAU;CACnC,YAAY;CACb,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,UAAU;CACV,SAAS,QAAQ,aAAa;CAC/B,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO,EACvC,UAAU,UACX,CAAC;AAEF,MAAa,QAAQ,EAAE,OAAO;CAC5B,MAAM,EAAE,QAAQ;CAChB,WAAW,EAAE,QAAQ;CACrB,cAAc,EAAE,QAAQ;CACxB,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAIF,MAAa,iBAAiB,EAAE,OAAO;CACrC,QAAQ,EAAE,MAAM,MAAM;CACtB,YAAY;CACb,CAAC;AAEF,MAAa,gBAAgB,EAAE,OAAO,EACpC,OAAO,OACR,CAAC;AAEF,MAAa,UAAU,EAAE,OAAO;CAC9B,MAAM,EAAE,QAAQ;CAChB,YAAY,EAAE,SAAS;CACvB,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,eAAe,+BAA+B,UAAU;CACxD,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,0BAA0B,EAAE,QAAQ,CAAC,UAAU;CAC/C,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,kBAAkB,EAAE,QAAQ;CAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,QAAQ,QAAQ,MAAM;CACtB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,KAAK,EAAE,QAAQ,CAAC,UAAU;CAC1B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;CACjD,QAAQ,EACL,OACC,EAAE,QAAQ,EACV,EAAE,OAAO;EACP,OAAO,EAAE,QAAQ;EACjB,MAAM,EAAE,KAAK,CAAC,aAAa,aAAa,CAAC,CAAC,UAAU;EACrD,CAAC,CACH,CACA,UAAU;CACb,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CACzC,mBAAmB,EAChB,OAAO;EACN,OAAO,EAAE,QAAQ;EACjB,YAAY,EAAE,QAAQ,CAAC,UAAU;EACjC,eAAe,EAAE,SAAS,CAAC,UAAU;EACtC,CAAC,CACD,UAAU;CACd,CAAC;AAIF,MAAa,sBAAsB,EAAE,OAAO;CAC1C,SAAS,QAAQ,aAAa;CAC9B,SAAS,QAAQ,UAAU;CAC3B,UAAU,SAAS,UAAU;CAC9B,CAAC;AAEF,MAAa,4BAA4B,EAAE,OAAO;CAChD,SAAS;CACT,SAAS,QAAQ,aAAa;CAC9B,QAAQ,EAAE,MAAM,aAAa;CAC7B,SAAS,EAAE,SAAS,CAAC,UAAU;CAChC,CAAC;AAEF,MAAa,8BAA8B,EAAE,OAAO;CAClD,WAAW,EAAE,MAAM,QAAQ;CAC3B,YAAY;CACb,CAAC;AAEF,MAAa,wBAAwB,EAAE,OAAO;CAC5C,SAAS;CACT,QAAQ,EAAE,MAAM,aAAa,CAAC,UAAU;CACzC,CAAC"}

@@ -8,2 +8,3 @@ const require_api_error = require('./api-client/api-error.cjs');

const require_sandbox = require('./sandbox.cjs');
const require_drive = require('./drive.cjs');
const require_proxy = require('./proxy.cjs');

@@ -14,2 +15,3 @@

exports.CommandFinished = require_command.CommandFinished;
exports.Drive = require_drive.Drive;
exports.FileSystem = require_filesystem.FileSystem;

@@ -16,0 +18,0 @@ exports.Sandbox = require_sandbox.Sandbox;

@@ -10,4 +10,5 @@ import { APIError, StreamError } from "./api-client/api-error.cjs";

import { SandboxUser, SandboxUserAlreadyExistsError } from "./sandbox-user.cjs";
import { Sandbox, SerializedSandbox } from "./sandbox.cjs";
import { Sandbox, SandboxMountMode, SandboxMounts, SerializedSandbox } from "./sandbox.cjs";
import { Drive, SerializedDrive } from "./drive.cjs";
import { InvalidRequestProxyHandler, ProxyHandler, ProxyMeta, defineSandboxProxy } from "./proxy.cjs";
export { APIError, Command, CommandFinished, type CommandOutput, type ExecutionContext, FileSystem, type InvalidRequestProxyHandler, type NetworkPolicy, type NetworkPolicyKeyValueMatcher, type NetworkPolicyMatch, type NetworkPolicyMatcher, type NetworkPolicyRule, type NetworkTransformer, type ProxyHandler, type ProxyMeta, Sandbox, SandboxUser, SandboxUserAlreadyExistsError, type SerializedCommand, type SerializedCommandFinished, type SerializedSandbox, type SerializedSnapshot, Session, Snapshot, type SnapshotTreeNodeData, StreamError, defineSandboxProxy };
export { APIError, Command, CommandFinished, type CommandOutput, Drive, type ExecutionContext, FileSystem, type InvalidRequestProxyHandler, type NetworkPolicy, type NetworkPolicyKeyValueMatcher, type NetworkPolicyMatch, type NetworkPolicyMatcher, type NetworkPolicyRule, type NetworkTransformer, type ProxyHandler, type ProxyMeta, Sandbox, type SandboxMountMode, type SandboxMounts, SandboxUser, SandboxUserAlreadyExistsError, type SerializedCommand, type SerializedCommandFinished, type SerializedDrive, type SerializedSandbox, type SerializedSnapshot, Session, Snapshot, type SnapshotTreeNodeData, StreamError, defineSandboxProxy };

@@ -10,4 +10,5 @@ import { APIError, StreamError } from "./api-client/api-error.js";

import { SandboxUser, SandboxUserAlreadyExistsError } from "./sandbox-user.js";
import { Sandbox, SerializedSandbox } from "./sandbox.js";
import { Sandbox, SandboxMountMode, SandboxMounts, SerializedSandbox } from "./sandbox.js";
import { Drive, SerializedDrive } from "./drive.js";
import { InvalidRequestProxyHandler, ProxyHandler, ProxyMeta, defineSandboxProxy } from "./proxy.js";
export { APIError, Command, CommandFinished, type CommandOutput, type ExecutionContext, FileSystem, type InvalidRequestProxyHandler, type NetworkPolicy, type NetworkPolicyKeyValueMatcher, type NetworkPolicyMatch, type NetworkPolicyMatcher, type NetworkPolicyRule, type NetworkTransformer, type ProxyHandler, type ProxyMeta, Sandbox, SandboxUser, SandboxUserAlreadyExistsError, type SerializedCommand, type SerializedCommandFinished, type SerializedSandbox, type SerializedSnapshot, Session, Snapshot, type SnapshotTreeNodeData, StreamError, defineSandboxProxy };
export { APIError, Command, CommandFinished, type CommandOutput, Drive, type ExecutionContext, FileSystem, type InvalidRequestProxyHandler, type NetworkPolicy, type NetworkPolicyKeyValueMatcher, type NetworkPolicyMatch, type NetworkPolicyMatcher, type NetworkPolicyRule, type NetworkTransformer, type ProxyHandler, type ProxyMeta, Sandbox, type SandboxMountMode, type SandboxMounts, SandboxUser, SandboxUserAlreadyExistsError, type SerializedCommand, type SerializedCommandFinished, type SerializedDrive, type SerializedSandbox, type SerializedSnapshot, Session, Snapshot, type SnapshotTreeNodeData, StreamError, defineSandboxProxy };

@@ -8,4 +8,5 @@ import { APIError, StreamError } from "./api-client/api-error.js";

import { Sandbox } from "./sandbox.js";
import { Drive } from "./drive.js";
import { defineSandboxProxy } from "./proxy.js";
export { APIError, Command, CommandFinished, FileSystem, Sandbox, SandboxUser, SandboxUserAlreadyExistsError, Session, Snapshot, StreamError, defineSandboxProxy };
export { APIError, Command, CommandFinished, Drive, FileSystem, Sandbox, SandboxUser, SandboxUserAlreadyExistsError, Session, Snapshot, StreamError, defineSandboxProxy };

@@ -188,2 +188,8 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');

/**
* Drives mounted on the sandbox, keyed by mount path.
*/
get mounts() {
return this.sandbox.mounts;
}
/**
* The default network policy of this sandbox.

@@ -337,2 +343,3 @@ */

tags: params?.tags,
mounts: params?.mounts,
snapshotExpiration: params?.snapshotExpiration,

@@ -339,0 +346,0 @@ keepLastSnapshots: params?.keepLastSnapshots,

@@ -91,2 +91,26 @@ import { Paginator } from "./utils/paginator.cjs";

/**
* List of drives to attach to the sandbox, keyed by the desired mount path.
* The drive must be created beforehand with `Drive.getOrCreate`.
*
* The mount paths must be absolute and cannot overlap with each other.
*
* @example
* const drive = await Drive.getOrCreate({ name: "my-drive" });
* const sandbox = await Sandbox.create({
* mounts: {
* "/data": { drive: drive.name, mode: "read-write" },
* },
* });
*/
mounts?: Record<string, {
/**
* The drive name to mount.
*/
drive: string;
/**
* Mount mode. Defaults to `read-write` if unspecified.
*/
mode?: "read-only" | "read-write";
}>;
/**
* An AbortSignal to cancel sandbox creation.

@@ -131,2 +155,4 @@ */

}
type SandboxMounts = NonNullable<BaseCreateSandboxParams["mounts"]>;
type SandboxMountMode = NonNullable<SandboxMounts[string]["mode"]>;
/**

@@ -375,2 +401,6 @@ * `runtime` and `image` are mutually exclusive: a sandbox starts from either a

/**
* Drives mounted on the sandbox, keyed by mount path.
*/
get mounts(): SandboxMounts | undefined;
/**
* The default network policy of this sandbox.

@@ -534,2 +564,6 @@ */

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1221,3 +1255,3 @@ keepLastSnapshots?: {

//#endregion
export { Sandbox, SerializedSandbox };
export { BaseCreateSandboxParams, Sandbox, SandboxMountMode, SandboxMounts, SerializedSandbox };
//# sourceMappingURL=sandbox.d.cts.map

@@ -92,2 +92,26 @@ import { Paginator } from "./utils/paginator.js";

/**
* List of drives to attach to the sandbox, keyed by the desired mount path.
* The drive must be created beforehand with `Drive.getOrCreate`.
*
* The mount paths must be absolute and cannot overlap with each other.
*
* @example
* const drive = await Drive.getOrCreate({ name: "my-drive" });
* const sandbox = await Sandbox.create({
* mounts: {
* "/data": { drive: drive.name, mode: "read-write" },
* },
* });
*/
mounts?: Record<string, {
/**
* The drive name to mount.
*/
drive: string;
/**
* Mount mode. Defaults to `read-write` if unspecified.
*/
mode?: "read-only" | "read-write";
}>;
/**
* An AbortSignal to cancel sandbox creation.

@@ -132,2 +156,4 @@ */

}
type SandboxMounts = NonNullable<BaseCreateSandboxParams["mounts"]>;
type SandboxMountMode = NonNullable<SandboxMounts[string]["mode"]>;
/**

@@ -376,2 +402,6 @@ * `runtime` and `image` are mutually exclusive: a sandbox starts from either a

/**
* Drives mounted on the sandbox, keyed by mount path.
*/
get mounts(): SandboxMounts | undefined;
/**
* The default network policy of this sandbox.

@@ -535,2 +565,6 @@ */

tags?: Record<string, string> | undefined;
mounts?: Record<string, {
drive: string;
mode?: "read-only" | "read-write" | undefined;
}> | undefined;
snapshotExpiration?: number | undefined;

@@ -1222,3 +1256,3 @@ keepLastSnapshots?: {

//#endregion
export { Sandbox, SerializedSandbox };
export { BaseCreateSandboxParams, Sandbox, SandboxMountMode, SandboxMounts, SerializedSandbox };
//# sourceMappingURL=sandbox.d.ts.map

@@ -187,2 +187,8 @@ import { APIError } from "./api-client/api-error.js";

/**
* Drives mounted on the sandbox, keyed by mount path.
*/
get mounts() {
return this.sandbox.mounts;
}
/**
* The default network policy of this sandbox.

@@ -336,2 +342,3 @@ */

tags: params?.tags,
mounts: params?.mounts,
snapshotExpiration: params?.snapshotExpiration,

@@ -338,0 +345,0 @@ keepLastSnapshots: params?.keepLastSnapshots,

//#region src/version.ts
const VERSION = "2.9.2";
const VERSION = "2.10.0-beta.0";

@@ -5,0 +5,0 @@ //#endregion

@@ -1,1 +0,1 @@

{"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.9.2\";\n"],"mappings":";;AACA,MAAa,UAAU"}
{"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.10.0-beta.0\";\n"],"mappings":";;AACA,MAAa,UAAU"}
//#region src/version.ts
const VERSION = "2.9.2";
const VERSION = "2.10.0-beta.0";

@@ -4,0 +4,0 @@ //#endregion

@@ -1,1 +0,1 @@

{"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.9.2\";\n"],"mappings":";AACA,MAAa,UAAU"}
{"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.10.0-beta.0\";\n"],"mappings":";AACA,MAAa,UAAU"}
{
"name": "@vercel/sandbox",
"version": "2.9.2",
"version": "2.10.0-beta.0",
"description": "Software Development Kit for Vercel Sandbox",

@@ -5,0 +5,0 @@ "type": "module",

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display