diff --git a/@blaxel/core/src/client/sdk.gen.ts b/@blaxel/core/src/client/sdk.gen.ts index ef9dbb2f..f0a52cc8 100644 --- a/@blaxel/core/src/client/sdk.gen.ts +++ b/@blaxel/core/src/client/sdk.gen.ts @@ -1,7 +1,7 @@ // This file is auto-generated by @hey-api/openapi-ts import type { Options as ClientOptions, TDataShape, Client } from '@hey-api/client-fetch'; -import type { ListAgentsData, ListAgentsResponse, ListAgentsError, CreateAgentData, CreateAgentResponse, CreateAgentError, DeleteAgentData, DeleteAgentResponse, DeleteAgentError, GetAgentData, GetAgentResponse, GetAgentError, UpdateAgentData, UpdateAgentResponse, UpdateAgentError, ListAgentRevisionsData, ListAgentRevisionsResponse, GetConfigurationData, GetConfigurationResponse, ListCustomDomainsData, ListCustomDomainsResponse, CreateCustomDomainData, CreateCustomDomainResponse, DeleteCustomDomainData, DeleteCustomDomainResponse, GetCustomDomainData, GetCustomDomainResponse, UpdateCustomDomainData, UpdateCustomDomainResponse, VerifyCustomDomainData, VerifyCustomDomainResponse, ListDrivesData, ListDrivesResponse, CreateDriveData, CreateDriveResponse, DeleteDriveData, DeleteDriveResponse, GetDriveData, GetDriveResponse, UpdateDriveData, UpdateDriveResponse, CreateDriveAccessTokenData, CreateDriveAccessTokenResponse, GetDriveJwksData, GetDriveJwksResponse, ListAllEgressGatewaysData, ListAllEgressGatewaysResponse, ListAllEgressIpsData, ListAllEgressIpsResponse, GetWorkspaceFeaturesData, GetWorkspaceFeaturesResponse, GetWorkspaceFeaturesError, TestFeatureFlagData, TestFeatureFlagResponse, TestFeatureFlagError, ListFunctionsData, ListFunctionsResponse, ListFunctionsError, CreateFunctionData, CreateFunctionResponse, CreateFunctionError, DeleteFunctionData, DeleteFunctionResponse, DeleteFunctionError, GetFunctionData, GetFunctionResponse, GetFunctionError, UpdateFunctionData, UpdateFunctionResponse, UpdateFunctionError, ListFunctionRevisionsData, ListFunctionRevisionsResponse, CleanupImagesData, CleanupImagesResponse, ListImagesData, ListImagesResponse, DeleteImageData, DeleteImageResponse, GetImageData, GetImageResponse, DeleteImageTagData, DeleteImageTagResponse, GetIntegrationData, GetIntegrationResponse, ListIntegrationConnectionsData, ListIntegrationConnectionsResponse, ListIntegrationConnectionsError, CreateIntegrationConnectionData, CreateIntegrationConnectionResponse, CreateIntegrationConnectionError, DeleteIntegrationConnectionData, DeleteIntegrationConnectionResponse, DeleteIntegrationConnectionError, GetIntegrationConnectionData, GetIntegrationConnectionResponse, GetIntegrationConnectionError, UpdateIntegrationConnectionData, UpdateIntegrationConnectionResponse, UpdateIntegrationConnectionError, GetIntegrationConnectionModelEndpointConfigurationsData, ListIntegrationConnectionModelsData, GetIntegrationConnectionModelData, ListJobsData, ListJobsResponse, CreateJobData, CreateJobResponse, DeleteJobData, DeleteJobResponse, GetJobData, GetJobResponse, UpdateJobData, UpdateJobResponse, ListJobExecutionsData, ListJobExecutionsResponse, CreateJobExecutionData, CreateJobExecutionResponse, DeleteJobExecutionData, DeleteJobExecutionResponse, GetJobExecutionData, GetJobExecutionResponse, ListJobRevisionsData, ListJobRevisionsResponse, ListLocationsData, ListLocationsResponse, ListMcpHubDefinitionsData, ListMcpHubDefinitionsResponse, ListModelsData, ListModelsResponse, ListModelsError, CreateModelData, CreateModelResponse, CreateModelError, DeleteModelData, DeleteModelResponse, DeleteModelError, GetModelData, GetModelResponse, GetModelError, UpdateModelData, UpdateModelResponse, UpdateModelError, ListModelRevisionsData, ListModelRevisionsResponse, ListPoliciesData, ListPoliciesResponse, CreatePolicyData, CreatePolicyResponse, DeletePolicyData, DeletePolicyResponse, GetPolicyData, GetPolicyResponse, UpdatePolicyData, UpdatePolicyResponse, ListPublicIpsData, ListPublicIpsResponse, ListSandboxHubDefinitionsData, ListSandboxHubDefinitionsResponse, ListSandboxesData, ListSandboxesResponse, ListSandboxesError, CreateSandboxData, CreateSandboxResponse, CreateSandboxError, DeleteSandboxData, DeleteSandboxResponse, DeleteSandboxError, GetSandboxData, GetSandboxResponse, GetSandboxError, UpdateSandboxData, UpdateSandboxResponse, UpdateSandboxError, ListSandboxPreviewsData, ListSandboxPreviewsResponse, CreateSandboxPreviewData, CreateSandboxPreviewResponse, DeleteSandboxPreviewData, DeleteSandboxPreviewResponse, GetSandboxPreviewData, GetSandboxPreviewResponse, UpdateSandboxPreviewData, UpdateSandboxPreviewResponse, ListSandboxPreviewTokensData, ListSandboxPreviewTokensResponse, CreateSandboxPreviewTokenData, CreateSandboxPreviewTokenResponse, DeleteSandboxPreviewTokenData, DeleteSandboxPreviewTokenResponse, GetWorkspaceServiceAccountsData, GetWorkspaceServiceAccountsResponse, CreateWorkspaceServiceAccountData, CreateWorkspaceServiceAccountResponse, DeleteWorkspaceServiceAccountData, DeleteWorkspaceServiceAccountResponse, UpdateWorkspaceServiceAccountData, UpdateWorkspaceServiceAccountResponse, ListApiKeysForServiceAccountData, ListApiKeysForServiceAccountResponse, CreateApiKeyForServiceAccountData, CreateApiKeyForServiceAccountResponse, DeleteApiKeyForServiceAccountData, ListTemplatesData, ListTemplatesResponse, GetTemplateData, GetTemplateResponse, ListWorkspaceUsersData, ListWorkspaceUsersResponse, InviteWorkspaceUserData, InviteWorkspaceUserResponse, RemoveWorkspaceUserData, UpdateWorkspaceUserRoleData, UpdateWorkspaceUserRoleResponse, ListVolumeTemplatesData, ListVolumeTemplatesResponse, CreateVolumeTemplateData, CreateVolumeTemplateResponse, DeleteVolumeTemplateData, DeleteVolumeTemplateResponse, GetVolumeTemplateData, GetVolumeTemplateResponse, UpdateVolumeTemplateData, UpdateVolumeTemplateResponse, DeleteVolumeTemplateVersionData, DeleteVolumeTemplateVersionResponse, ListVolumesData, ListVolumesResponse, ListVolumesError, CreateVolumeData, CreateVolumeResponse, CreateVolumeError, DeleteVolumeData, DeleteVolumeResponse, DeleteVolumeError, GetVolumeData, GetVolumeResponse, GetVolumeError, UpdateVolumeData, UpdateVolumeResponse, ListVpcsData, ListVpcsResponse, CreateVpcData, CreateVpcResponse, DeleteVpcData, DeleteVpcResponse, GetVpcData, GetVpcResponse, ListEgressGatewaysData, ListEgressGatewaysResponse, CreateEgressGatewayData, CreateEgressGatewayResponse, DeleteEgressGatewayData, DeleteEgressGatewayResponse, GetEgressGatewayData, GetEgressGatewayResponse, ListEgressIpsData, ListEgressIpsResponse, CreateEgressIpData, CreateEgressIpResponse, DeleteEgressIpData, DeleteEgressIpResponse, GetEgressIpData, GetEgressIpResponse, ListWorkspacesData, ListWorkspacesResponse, ListWorkspacesError, CreateWorkspaceData, CreateWorkspaceResponse, CreateWorkspaceError, DeleteWorkspaceData, DeleteWorkspaceResponse, DeleteWorkspaceError, GetWorkspaceData, GetWorkspaceResponse, GetWorkspaceError, UpdateWorkspaceData, UpdateWorkspaceResponse, UpdateWorkspaceError, DeclineWorkspaceInvitationData, DeclineWorkspaceInvitationResponse, AcceptWorkspaceInvitationData, AcceptWorkspaceInvitationResponse, LeaveWorkspaceData, LeaveWorkspaceResponse, CheckWorkspaceAvailabilityData, CheckWorkspaceAvailabilityResponse } from './types.gen.js'; +import type { ListAgentsData, ListAgentsResponse, ListAgentsError, CreateAgentData, CreateAgentResponse, CreateAgentError, DeleteAgentData, DeleteAgentResponse, DeleteAgentError, GetAgentData, GetAgentResponse, GetAgentError, UpdateAgentData, UpdateAgentResponse, UpdateAgentError, ListAgentRevisionsData, ListAgentRevisionsResponse, GetConfigurationData, GetConfigurationResponse, ListCustomDomainsData, ListCustomDomainsResponse, CreateCustomDomainData, CreateCustomDomainResponse, DeleteCustomDomainData, DeleteCustomDomainResponse, GetCustomDomainData, GetCustomDomainResponse, UpdateCustomDomainData, UpdateCustomDomainResponse, VerifyCustomDomainData, VerifyCustomDomainResponse, ListDrivesData, ListDrivesResponse, CreateDriveData, CreateDriveResponse, DeleteDriveData, DeleteDriveResponse, GetDriveData, GetDriveResponse, UpdateDriveData, UpdateDriveResponse, CreateDriveAccessTokenData, CreateDriveAccessTokenResponse, GetDriveJwksData, GetDriveJwksResponse, ListAllEgressGatewaysData, ListAllEgressGatewaysResponse, ListAllEgressIpsData, ListAllEgressIpsResponse, GetWorkspaceFeaturesData, GetWorkspaceFeaturesResponse, GetWorkspaceFeaturesError, TestFeatureFlagData, TestFeatureFlagResponse, TestFeatureFlagError, ListFunctionsData, ListFunctionsResponse, ListFunctionsError, CreateFunctionData, CreateFunctionResponse, CreateFunctionError, DeleteFunctionData, DeleteFunctionResponse, DeleteFunctionError, GetFunctionData, GetFunctionResponse, GetFunctionError, UpdateFunctionData, UpdateFunctionResponse, UpdateFunctionError, ListFunctionRevisionsData, ListFunctionRevisionsResponse, CleanupImagesData, CleanupImagesResponse, ListImagesData, ListImagesResponse, CreateImageData, CreateImageResponse, DeleteImageData, DeleteImageResponse, GetImageData, GetImageResponse, ListImageSharesData, ListImageSharesResponse, ShareImageData, ShareImageResponse, UnshareImageData, UnshareImageResponse, DeleteImageTagData, DeleteImageTagResponse, GetIntegrationData, GetIntegrationResponse, ListIntegrationConnectionsData, ListIntegrationConnectionsResponse, ListIntegrationConnectionsError, CreateIntegrationConnectionData, CreateIntegrationConnectionResponse, CreateIntegrationConnectionError, DeleteIntegrationConnectionData, DeleteIntegrationConnectionResponse, DeleteIntegrationConnectionError, GetIntegrationConnectionData, GetIntegrationConnectionResponse, GetIntegrationConnectionError, UpdateIntegrationConnectionData, UpdateIntegrationConnectionResponse, UpdateIntegrationConnectionError, GetIntegrationConnectionModelEndpointConfigurationsData, ListIntegrationConnectionModelsData, GetIntegrationConnectionModelData, ListJobsData, ListJobsResponse, CreateJobData, CreateJobResponse, DeleteJobData, DeleteJobResponse, GetJobData, GetJobResponse, UpdateJobData, UpdateJobResponse, ListJobExecutionsData, ListJobExecutionsResponse, CreateJobExecutionData, CreateJobExecutionResponse, DeleteJobExecutionData, DeleteJobExecutionResponse, GetJobExecutionData, GetJobExecutionResponse, ListJobRevisionsData, ListJobRevisionsResponse, ListLocationsData, ListLocationsResponse, ListMcpHubDefinitionsData, ListMcpHubDefinitionsResponse, ListModelsData, ListModelsResponse, ListModelsError, CreateModelData, CreateModelResponse, CreateModelError, DeleteModelData, DeleteModelResponse, DeleteModelError, GetModelData, GetModelResponse, GetModelError, UpdateModelData, UpdateModelResponse, UpdateModelError, ListModelRevisionsData, ListModelRevisionsResponse, ListPoliciesData, ListPoliciesResponse, CreatePolicyData, CreatePolicyResponse, DeletePolicyData, DeletePolicyResponse, GetPolicyData, GetPolicyResponse, UpdatePolicyData, UpdatePolicyResponse, ListPublicIpsData, ListPublicIpsResponse, ListSandboxHubDefinitionsData, ListSandboxHubDefinitionsResponse, ListSandboxesData, ListSandboxesResponse, ListSandboxesError, CreateSandboxData, CreateSandboxResponse, CreateSandboxError, DeleteSandboxData, DeleteSandboxResponse, DeleteSandboxError, GetSandboxData, GetSandboxResponse, GetSandboxError, UpdateSandboxData, UpdateSandboxResponse, UpdateSandboxError, ListSandboxPreviewsData, ListSandboxPreviewsResponse, CreateSandboxPreviewData, CreateSandboxPreviewResponse, DeleteSandboxPreviewData, DeleteSandboxPreviewResponse, GetSandboxPreviewData, GetSandboxPreviewResponse, UpdateSandboxPreviewData, UpdateSandboxPreviewResponse, ListSandboxPreviewTokensData, ListSandboxPreviewTokensResponse, CreateSandboxPreviewTokenData, CreateSandboxPreviewTokenResponse, DeleteSandboxPreviewTokenData, DeleteSandboxPreviewTokenResponse, GetWorkspaceServiceAccountsData, GetWorkspaceServiceAccountsResponse, CreateWorkspaceServiceAccountData, CreateWorkspaceServiceAccountResponse, DeleteWorkspaceServiceAccountData, DeleteWorkspaceServiceAccountResponse, UpdateWorkspaceServiceAccountData, UpdateWorkspaceServiceAccountResponse, ListApiKeysForServiceAccountData, ListApiKeysForServiceAccountResponse, CreateApiKeyForServiceAccountData, CreateApiKeyForServiceAccountResponse, DeleteApiKeyForServiceAccountData, ListTemplatesData, ListTemplatesResponse, GetTemplateData, GetTemplateResponse, ListWorkspaceUsersData, ListWorkspaceUsersResponse, InviteWorkspaceUserData, InviteWorkspaceUserResponse, RemoveWorkspaceUserData, UpdateWorkspaceUserRoleData, UpdateWorkspaceUserRoleResponse, ListVolumeTemplatesData, ListVolumeTemplatesResponse, CreateVolumeTemplateData, CreateVolumeTemplateResponse, DeleteVolumeTemplateData, DeleteVolumeTemplateResponse, GetVolumeTemplateData, GetVolumeTemplateResponse, UpdateVolumeTemplateData, UpdateVolumeTemplateResponse, DeleteVolumeTemplateVersionData, DeleteVolumeTemplateVersionResponse, ListVolumesData, ListVolumesResponse, ListVolumesError, CreateVolumeData, CreateVolumeResponse, CreateVolumeError, DeleteVolumeData, DeleteVolumeResponse, DeleteVolumeError, GetVolumeData, GetVolumeResponse, GetVolumeError, UpdateVolumeData, UpdateVolumeResponse, ListVpcsData, ListVpcsResponse, CreateVpcData, CreateVpcResponse, DeleteVpcData, DeleteVpcResponse, GetVpcData, GetVpcResponse, ListEgressGatewaysData, ListEgressGatewaysResponse, CreateEgressGatewayData, CreateEgressGatewayResponse, DeleteEgressGatewayData, DeleteEgressGatewayResponse, GetEgressGatewayData, GetEgressGatewayResponse, ListEgressIpsData, ListEgressIpsResponse, CreateEgressIpData, CreateEgressIpResponse, DeleteEgressIpData, DeleteEgressIpResponse, GetEgressIpData, GetEgressIpResponse, ListWorkspacesData, ListWorkspacesResponse, ListWorkspacesError, CreateWorkspaceData, CreateWorkspaceResponse, CreateWorkspaceError, DeleteWorkspaceData, DeleteWorkspaceResponse, DeleteWorkspaceError, GetWorkspaceData, GetWorkspaceResponse, GetWorkspaceError, UpdateWorkspaceData, UpdateWorkspaceResponse, UpdateWorkspaceError, DeclineWorkspaceInvitationData, DeclineWorkspaceInvitationResponse, AcceptWorkspaceInvitationData, AcceptWorkspaceInvitationResponse, LeaveWorkspaceData, LeaveWorkspaceResponse, CheckWorkspaceAvailabilityData, CheckWorkspaceAvailabilityResponse } from './types.gen.js'; import { client as _heyApiClient } from './client.gen'; export type Options = ClientOptions & { @@ -581,6 +581,27 @@ export const listImages = (options?: Optio }); }; +/** + * Build a container image + * Builds a container image without creating a deployment. Returns a presigned URL for uploading source code. After upload, the image will be built and stored in the registry, but no agent, function, sandbox, or job will be created or updated. + */ +export const createImage = (options: Options) => { + return (options.client ?? _heyApiClient).post({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/images', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers + } + }); +}; + /** * Delete container image * Deletes a container image and all its tags from the workspace registry. Will fail if the image is currently in use by an active deployment. @@ -615,6 +636,61 @@ export const getImage = (options: Options< }); }; +/** + * List image shares + * Returns the list of workspaces that a container image is currently shared with. + */ +export const listImageShares = (options: Options) => { + return (options.client ?? _heyApiClient).get({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/images/{resourceType}/{imageName}/share', + ...options + }); +}; + +/** + * Share a container image + * Shares a container image with another workspace by copying the metadata record. The underlying storage (S3) data is not duplicated. The target workspace must belong to the same account. + */ +export const shareImage = (options: Options) => { + return (options.client ?? _heyApiClient).post({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/images/{resourceType}/{imageName}/share', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers + } + }); +}; + +/** + * Unshare a container image + * Revokes sharing of a container image with a target workspace. Removes the metadata copy from the target workspace. The source image is not affected. + */ +export const unshareImage = (options: Options) => { + return (options.client ?? _heyApiClient).delete({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/images/{resourceType}/{imageName}/share/{targetWorkspace}', + ...options + }); +}; + /** * Delete container image tag * Deletes a specific tag from a container image. The underlying image layers are kept if other tags reference them. Will fail if the tag is currently in use. diff --git a/@blaxel/core/src/client/types.gen.ts b/@blaxel/core/src/client/types.gen.ts index 435f3054..218651b6 100644 --- a/@blaxel/core/src/client/types.gen.ts +++ b/@blaxel/core/src/client/types.gen.ts @@ -920,6 +920,16 @@ export type FunctionSpecWritable = { triggers?: TriggersWritable; }; +/** + * Configuration for running GitHub Actions workflow jobs on Blaxel infrastructure. When repositories are configured, the job acts as a self-hosted GitHub Actions runner. Workflow jobs use runs-on with the Blaxel job name to target a specific runner. + */ +export type GithubRunnerConfig = { + /** + * Repositories in owner/repo format that this runner is associated with. The runner will pick up workflow jobs from any of these repositories. If non-empty, the runner is considered enabled. + */ + repositories?: Array; +}; + /** * Mapping between an IdP group and a workspace role for directory sync */ @@ -953,6 +963,7 @@ export type ImageMetadata = { * The display name of the image (registry/workspace/repository). */ displayName?: string; + events?: CoreEvents; /** * The date and time when the image was last deployed (most recent across all tags). */ @@ -965,6 +976,11 @@ export type ImageMetadata = { * The resource type of the image. */ resourceType?: string; + /** + * If this image is shared from another workspace, this field contains the name of the source workspace. Empty for non-shared images. + */ + readonly sourceWorkspace?: string; + status?: Status; /** * The date and time when the image was last updated. */ @@ -980,6 +996,7 @@ export type ImageMetadataWritable = { * The display name of the image (registry/workspace/repository). */ displayName?: string; + events?: CoreEventsWritable; /** * The name of the image (repository name). */ @@ -988,6 +1005,7 @@ export type ImageMetadataWritable = { * The resource type of the image. */ resourceType?: string; + status?: Status; }; export type ImageSpec = { @@ -1647,6 +1665,7 @@ export type JobSpec = { * When false, the job is disabled and new executions cannot be triggered */ enabled?: boolean; + githubRunner?: GithubRunnerConfig; policies?: PoliciesList; /** * Region where the job should be created (e.g. us-was-1, eu-lon-1) @@ -1655,6 +1674,7 @@ export type JobSpec = { revision?: RevisionConfiguration; runtime?: JobRuntime; triggers?: Triggers; + volumes?: JobVolumes; }; /** @@ -1665,6 +1685,7 @@ export type JobSpecWritable = { * When false, the job is disabled and new executions cannot be triggered */ enabled?: boolean; + githubRunner?: GithubRunnerConfig; policies?: PoliciesList; /** * Region where the job should be created (e.g. us-was-1, eu-lon-1) @@ -1673,8 +1694,37 @@ export type JobSpecWritable = { revision?: RevisionConfiguration; runtime?: JobRuntime; triggers?: TriggersWritable; + volumes?: JobVolumes; +}; + +/** + * Ephemeral volume for a job. Temporary disk-backed storage that is created when the job starts and destroyed when it completes. + */ +export type JobVolume = { + /** + * Absolute filesystem path where the volume will be mounted inside the container + */ + mountPath: string; + /** + * Identifier for the volume, used to reference it internally + */ + name: string; + /** + * If true, the volume is mounted read-only + */ + readOnly?: boolean; + /** + * Storage capacity in megabytes + */ + sizeMb: number; + /** + * Type of volume. Currently only "ephemeral" is supported. + */ + type: 'ephemeral'; }; +export type JobVolumes = Array; + /** * Location availability for policies */ @@ -2068,6 +2118,7 @@ export type PendingInvitationAcceptWritable = { * Pending invitation in workspace */ export type PendingInvitationRender = { + account?: PendingInvitationRenderAccount; /** * User email */ @@ -2085,10 +2136,28 @@ export type PendingInvitationRender = { * ACL role */ role?: string; + /** + * Invitation type: "workspace" or "account_admin" + */ + type?: string; workspace?: PendingInvitationRenderWorkspace; workspaceDetails?: PendingInvitationWorkspaceDetails; }; +/** + * Account info in pending invitation render (for account_admin type) + */ +export type PendingInvitationRenderAccount = { + /** + * Account display name or owner email + */ + displayName?: string; + /** + * Account ID + */ + id?: string; +}; + /** * Invited by */ @@ -2845,6 +2914,10 @@ export type Sandbox = { readonly lastUsedAt?: string; metadata: Metadata; spec: SandboxSpec; + /** + * Current state of the sandbox (read-only, managed by the system) + */ + state?: 'RUNNING' | 'STANDBY'; status?: Status; }; @@ -2855,6 +2928,10 @@ export type SandboxWritable = { events?: CoreEventsWritable; metadata: MetadataWritable; spec: SandboxSpec; + /** + * Current state of the sandbox (read-only, managed by the system) + */ + state?: 'RUNNING' | 'STANDBY'; status?: Status; }; @@ -3037,7 +3114,7 @@ export type SandboxSpec = { /** * Deployment status of a resource deployed on Blaxel */ -export type Status = 'DELETING' | 'TERMINATED' | 'FAILED' | 'DEACTIVATED' | 'DEACTIVATING' | 'UPLOADING' | 'BUILDING' | 'DEPLOYING' | 'DEPLOYED'; +export type Status = 'DELETING' | 'TERMINATED' | 'FAILED' | 'DEACTIVATED' | 'DEACTIVATING' | 'UPLOADING' | 'BUILDING' | 'DEPLOYING' | 'DEPLOYED' | 'BUILT'; /** * Blaxel template @@ -3316,7 +3393,7 @@ export type VolumeWritable = { }; /** - * Configuration for attaching a volume to a sandbox at a specific filesystem path + * Configuration for attaching a persistent volume to a sandbox at a specific filesystem path */ export type VolumeAttachment = { /** @@ -4596,6 +4673,63 @@ export type ListImagesResponses = { export type ListImagesResponse = ListImagesResponses[keyof ListImagesResponses]; +export type CreateImageData = { + body: { + /** + * Runtime generation (e.g., mk3). Defaults to mk3 if not specified. + */ + generation?: string; + /** + * A pre-built Docker image reference (e.g., docker.io/myorg/myimage:latest). When provided, the build step is skipped and the image is used directly as the source for the resource runtime. + */ + image?: string; + /** + * Name of the image to build + */ + name: string; + /** + * Resource type (agent, function, sandbox, job) + */ + resourceType: string; + }; + path?: never; + query?: never; + url: '/images'; +}; + +export type CreateImageErrors = { + /** + * invalid request + */ + 400: unknown; +}; + +export type CreateImageResponses = { + /** + * successful operation + */ + 200: { + /** + * The registered image reference (only present when image was provided in request) + */ + image?: string; + /** + * Status message + */ + message?: string; + /** + * Name of the image + */ + name?: string; + /** + * Resource type + */ + resourceType?: string; + }; +}; + +export type CreateImageResponse = CreateImageResponses[keyof CreateImageResponses]; + export type DeleteImageData = { body?: never; path: { @@ -4657,6 +4791,115 @@ export type GetImageResponses = { export type GetImageResponse = GetImageResponses[keyof GetImageResponses]; +export type ListImageSharesData = { + body?: never; + path: { + /** + * Resource type (agents, functions, sandboxes, jobs) + */ + resourceType: string; + /** + * Name of the container image repository + */ + imageName: string; + }; + query?: never; + url: '/images/{resourceType}/{imageName}/share'; +}; + +export type ListImageSharesErrors = { + /** + * image not found + */ + 404: unknown; +}; + +export type ListImageSharesResponses = { + /** + * successful operation + */ + 200: Array; +}; + +export type ListImageSharesResponse = ListImageSharesResponses[keyof ListImageSharesResponses]; + +export type ShareImageData = { + body: { + /** + * Name of the workspace to share the image with + */ + targetWorkspace: string; + }; + path: { + /** + * Resource type (agents, functions, sandboxes, jobs) + */ + resourceType: string; + /** + * Name of the container image repository + */ + imageName: string; + }; + query?: never; + url: '/images/{resourceType}/{imageName}/share'; +}; + +export type ShareImageErrors = { + /** + * invalid request + */ + 400: unknown; + /** + * image not found + */ + 404: unknown; +}; + +export type ShareImageResponses = { + /** + * successful operation + */ + 200: Image; +}; + +export type ShareImageResponse = ShareImageResponses[keyof ShareImageResponses]; + +export type UnshareImageData = { + body?: never; + path: { + /** + * Resource type (agents, functions, sandboxes, jobs) + */ + resourceType: string; + /** + * Name of the container image repository + */ + imageName: string; + /** + * Name of the target workspace to revoke sharing from + */ + targetWorkspace: string; + }; + query?: never; + url: '/images/{resourceType}/{imageName}/share/{targetWorkspace}'; +}; + +export type UnshareImageErrors = { + /** + * image or share not found + */ + 404: unknown; +}; + +export type UnshareImageResponses = { + /** + * successful operation + */ + 200: Image; +}; + +export type UnshareImageResponse = UnshareImageResponses[keyof UnshareImageResponses]; + export type DeleteImageTagData = { body?: never; path: { diff --git a/@blaxel/core/src/sandbox/interpreter.ts b/@blaxel/core/src/sandbox/interpreter.ts index d63ea203..aa7311cd 100644 --- a/@blaxel/core/src/sandbox/interpreter.ts +++ b/@blaxel/core/src/sandbox/interpreter.ts @@ -37,7 +37,7 @@ export class CodeInterpreter extends SandboxInstance { static async create( sandbox?: Sandbox | SandboxCreateConfiguration | Record | null, - { safe = true }: { safe?: boolean } = {} + { safe = true, createIfNotExist = false }: { safe?: boolean; createIfNotExist?: boolean } = {} ): Promise { // Build a SandboxCreateConfiguration with CodeInterpreter defaults const defaults: SandboxCreateConfiguration = { @@ -72,7 +72,7 @@ export class CodeInterpreter extends SandboxInstance { merged = defaults; } - const baseInstance = await super.create(merged, { safe }); + const baseInstance = await super.create(merged, { safe, createIfNotExist }); // Create config from the instance const config: SandboxConfiguration = { diff --git a/@blaxel/core/src/sandbox/sandbox.ts b/@blaxel/core/src/sandbox/sandbox.ts index 26e75cee..53bb1902 100644 --- a/@blaxel/core/src/sandbox/sandbox.ts +++ b/@blaxel/core/src/sandbox/sandbox.ts @@ -97,7 +97,7 @@ export class SandboxInstance { return this; } - static async create(sandbox?: SandboxModel | SandboxCreateConfiguration, { safe = false }: { safe?: boolean } = {}) { + static async create(sandbox?: SandboxModel | SandboxCreateConfiguration, { safe = false, createIfNotExist = false }: { safe?: boolean; createIfNotExist?: boolean } = {}) { const defaultName = `sandbox-${uuidv4().replace(/-/g, '').substring(0, 8)}` const defaultImage = `blaxel/base-image:latest` const defaultMemory = 4096 @@ -188,6 +188,7 @@ export class SandboxInstance { createSandbox({ body: sandbox, throwOnError: true, + ...(createIfNotExist ? { query: { createIfNotExist: true } } : {}), }), edgeDomain ? import("../common/h2pool.js").then(({ h2Pool }) => h2Pool.get(edgeDomain)).catch(() => null) : Promise.resolve(null), ]); @@ -277,7 +278,7 @@ export class SandboxInstance { static async createIfNotExists(sandbox: SandboxModel | SandboxCreateConfiguration) { try { - return await this.create(sandbox); + return await this.create(sandbox, { createIfNotExist: true }); } catch (e) { if (typeof e === "object" && e !== null && "code" in e && (e.code === 409 || e.code === 'SANDBOX_ALREADY_EXISTS')) { const name = 'name' in sandbox ? sandbox.name : (sandbox as SandboxModel).metadata.name @@ -291,7 +292,7 @@ export class SandboxInstance { // If the sandbox is TERMINATED, treat it as not existing if (sandboxInstance.status === "TERMINATED") { // Create a new sandbox - backend will handle cleanup of the terminated one - return await this.create(sandbox); + return await this.create(sandbox, { createIfNotExist: true }); } // Otherwise return the existing running sandbox diff --git a/Makefile b/Makefile index f30899de..4e0c4dc3 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ ARGS:= $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) +branch ?= main install: bun install @@ -8,7 +9,7 @@ sdk-sandbox: @curl -H "Authorization: token $$(gh auth token)" \ -H "Accept: application/vnd.github.v3.raw" \ -o ./definition.yml \ - https://api.github.com/repos/blaxel-ai/sandbox/contents/sandbox-api/docs/openapi.yml?ref=main + https://api.github.com/repos/blaxel-ai/sandbox/contents/sandbox-api/docs/openapi.yml?ref=$(branch) rm -rf @blaxel/core/src/sandbox/client/types.gen.ts @blaxel/core/src/sandbox/client/sdk.gen.ts npx @hey-api/openapi-ts@0.66.0 -i ./definition.yml -o ./tmp/ -c @hey-api/client-fetch cp -r ./tmp/* @blaxel/core/src/sandbox/client @@ -26,7 +27,7 @@ sdk-controlplane: @curl -H "Authorization: token $$(gh auth token)" \ -H "Accept: application/vnd.github.v3.raw" \ -o ./definition.yml \ - https://api.github.com/repos/blaxel-ai/controlplane/contents/api/api/definitions/controlplane.yml?ref=main + https://api.github.com/repos/blaxel-ai/controlplane/contents/api/api/definitions/controlplane.yml?ref=$(branch) rm -rf @blaxel/core/src/client/types.gen.ts @blaxel/core/src/client/sdk.gen.ts npx @hey-api/openapi-ts@0.66.0 -i ./definition.yml -o ./tmp/ -c @hey-api/client-fetch cp -r ./tmp/* @blaxel/core/src/client