import {z} from 'zod' export type GetApiApiV1CvmsArgs = {family?: ('all' | 'cpu' | 'gpu') | undefined, instance_types?: (Array | null) | undefined}; export type GetApiApiV1CvmsOptions = {baseUrl?: string | undefined, OAuth2AuthorizationCodeBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const portAttrs = z.object({port: z.number().int(), pp: z.boolean().optional()}); export const portPolicy = z.object({ports: z.array(portAttrs).optional(), restrict_mode: z.boolean().optional()}); export const jsonValue = z.unknown(); export const verityVolume = z.object({source: z.string().min(1), target: z.string(), verity_root: z.string()}); export const appComposeV2Output = z.object({allowed_envs: z.array(z.string()).optional(), bash_script: z.string().nullable().optional(), default_gateway_domain: z.string().nullable().optional(), docker_compose_file: z.string().nullable().optional(), init_script: z.array(z.string()).optional(), key_provider: z.enum(["none", "kms", "local", "tpm"]).nullable().optional(), key_provider_id: z.string().nullable().optional(), kms_enabled: z.boolean().optional(), local_key_provider_enabled: z.boolean().optional(), manifest_version: z.union([z.number().int(), z.string()]).optional(), name: z.string(), no_instance_id: z.boolean().optional(), port_policy: portPolicy.nullable().optional(), pre_launch_script: z.string().nullable().optional(), public_logs: z.boolean().optional(), public_sysinfo: z.boolean().optional(), public_tcbinfo: z.boolean().optional(), runner: z.string().optional(), requirements: z.record(z.string(), jsonValue).nullable().optional(), storage_discard: z.boolean().nullable().optional(), event_log_version: z.union([z.literal(1), z.literal(2)]).nullable().optional(), snapshotter: z.enum(["overlayfs", "stargz"]).nullable().optional(), verity_volumes: z.array(verityVolume).nullable().optional(), gateway_enabled: z.boolean().optional(), features: z.array(z.string()).optional(), salt: z.string().nullable().optional(), secure_time: z.boolean().optional(), storage_fs: z.union([z.literal("ext4"), z.literal("zfs")]).nullable().optional(), swap_size: z.string().nullable().optional(), tproxy_enabled: z.boolean().optional()}); export const portMapping = z.object({protocol: z.string(), host_port: z.number().int(), vm_port: z.number().int(), host_address: z.string().nullable().optional(), nic_index: z.number().int().nullable().optional()}); export const gpuSpec = z.object({slot: z.string(), product_id: z.string().nullable().optional()}); export const gpuConfig = z.object({gpus: z.array(gpuSpec), attach_mode: z.union([z.enum(["listed", "all"]), z.string()]).optional()}); export const networkingConfig = z.object({mode: z.string(), bridge_name: z.string().optional(), parent: z.string().optional(), vhost: z.boolean().nullable().optional(), queues: z.number().int().nullable().optional()}); export const vmConfiguration = z.object({name: z.string(), image: z.string(), compose_file: appComposeV2Output.nullable().optional(), os_image_version: z.string().nullable().optional(), compose_file_raw: z.string().nullable().optional(), vcpu: z.number().int(), memory: z.number().int(), disk_size: z.number().int(), ports: z.array(portMapping).nullable().optional(), encrypted_env: z.string().nullable().optional(), app_id: z.string().nullable().optional(), user_config: z.string().nullable().optional(), hugepages: z.boolean().optional(), pin_numa: z.boolean().optional(), gpus: gpuConfig.nullable().optional(), kms_urls: z.array(z.string()).optional(), gateway_urls: z.array(z.string()).optional(), stopped: z.boolean().optional(), networks: z.array(networkingConfig).optional(), annotations: z.record(z.string(), z.string()).optional()}); export const guestEvent = z.object({event: z.string(), body: z.string(), timestamp: z.number().int().optional()}); export const networkInterfaceStatus = z.object({mode: z.string(), backend: z.string(), mac: z.string().optional(), bridge_name: z.string().nullable().optional(), netdev_id: z.string().nullable().optional(), vhost: z.boolean().nullable().optional(), queues: z.number().int().nullable().optional(), macvtap_mode: z.string().nullable().optional()}); export const vmInfo = z.object({id: z.string(), name: z.string(), status: z.string(), uptime: z.string(), app_url: z.string().nullable().optional(), app_id: z.string(), instance_id: z.string().nullable().optional(), configuration: vmConfiguration.nullable().optional(), exited_at: z.string().nullable().optional(), boot_progress: z.string().nullable().optional(), boot_error: z.string().nullable().optional(), shutdown_progress: z.string().nullable().optional(), image_version: z.string().nullable().optional(), events: z.array(guestEvent).optional(), interfaces: z.array(networkInterfaceStatus).optional(), running: z.boolean().optional()}); export const managedUser = z.object({id: z.union([z.number().int(), z.string()]), username: z.string()}); export const cvmNode = z.object({id: z.number().int(), name: z.string(), region_identifier: z.string().nullable().optional()}); export const kMSInfo = z.object({id: z.string(), slug: z.string().nullable().optional(), url: z.string(), version: z.string(), chain_id: z.number().int().nullable().optional(), kms_contract_address: z.string().nullable().optional(), gateway_app_id: z.string().nullable().optional(), ca_pubkey: z.string().nullable().optional(), k256_pubkey: z.string().nullable().optional()}); export const cvmNetworkUrls = z.object({app: z.string(), instance: z.string()}); export const hostedCvm = z.object({hosted: vmInfo, name: z.string(), managed_user: managedUser.nullable().optional(), node: cvmNode.nullable().optional(), listed: z.boolean().optional(), status: z.string(), in_progress: z.boolean().optional(), dapp_dashboard_url: z.string().nullable().optional(), syslog_endpoint: z.string().nullable().optional(), allow_upgrade: z.boolean().optional(), project_id: z.string().nullable().optional(), project_type: z.string().nullable().optional(), billing_period: z.string().nullable().optional(), kms_info: kMSInfo.nullable().optional(), contract_address: z.string().nullable().optional(), deployer_address: z.string().nullable().optional(), vcpu: z.number().int().nullable().optional(), memory: z.number().int().nullable().optional(), disk_size: z.number().int().nullable().optional(), gateway_domain: z.string().nullable().optional(), public_urls: z.array(cvmNetworkUrls), enabled_ssh_access: z.boolean()}); export const billingPeriod = z.enum(["skip", "hourly", "monthly"]); export const cVMResourceInfo = z.object({instance_type: z.string().nullable().optional(), vcpu: z.number().int().nullable().optional(), memory_in_gb: z.number().nullable().optional(), disk_in_gb: z.number().int().nullable().optional(), gpus: z.number().int().nullable().optional(), compute_billing_price: z.string().nullable().optional(), billing_period: billingPeriod.nullable().optional()}); export const nodeDeviceIdOut = z.object({device_id: z.string(), algorithm_version: z.string(), enabled: z.boolean()}); export const teepodStatus = z.enum(["ONLINE", "OFFLINE", "MAINTENANCE"]); export const nodeRef = z.object({object_type: z.literal("node").optional(), id: z.number().int().nullable().optional(), node_id: z.number().int().nullable().optional(), node: z.string().nullable().optional(), name: z.string().nullable().optional(), region: z.string().nullable().optional(), device_id: z.string().nullable().optional(), device_ids: z.array(nodeDeviceIdOut).optional(), ppid: z.string().nullable().optional(), status: teepodStatus.nullable().optional(), version: z.string().nullable().optional()}); export const cVMOSInfo = z.object({name: z.string().nullable().optional(), version: z.string().nullable().optional(), is_dev: z.boolean().nullable().optional(), os_image_hash: z.string().nullable().optional()}); export const kmsType = z.enum(["phala", "ethereum", "base", "local", "legacy"]); export const cVMKmsInfo = z.object({chain_id: z.number().int().nullable().optional(), dstack_kms_address: z.string().nullable().optional(), dstack_app_address: z.string().nullable().optional(), deployer_address: z.string().nullable().optional(), rpc_endpoint: z.string().nullable().optional(), encrypted_env_pubkey: z.string().nullable().optional(), k256_pubkey: z.string().nullable().optional()}); export const cVMProgressInfo = z.object({target: z.string().nullable().optional(), started_at: z.string().nullable().optional(), correlation_id: z.string().nullable().optional()}); export const cVMGatewayInfo = z.object({base_domain: z.string().nullable().optional(), cname: z.string().nullable().optional()}); export const cVMLogUrls = z.object({serial: z.string().nullable().optional(), stdout: z.string().nullable().optional(), stderr: z.string().nullable().optional(), container_log_base: z.string().nullable().optional()}); export const workspaceRef = z.object({object_type: z.literal("workspace").optional(), id: z.string(), name: z.string(), slug: z.string().nullable().optional(), avatar_url: z.string().nullable().optional()}); export const userRef = z.object({object_type: z.literal("user").optional(), id: z.string().nullable().optional(), username: z.string().nullable().optional(), avatar_url: z.string().nullable().optional()}); export const cVMHourlyRate = z.object({total: z.string().nullable().optional(), compute: z.string().nullable().optional(), disk: z.string().nullable().optional()}); export const gpuRentalOrderStatus = z.enum(["pending", "provisioning", "active", "teardown", "completed", "cancelled"]); export const gpuSkuPricingPlan = z.enum(["on_demand", "commitment"]); export const cVMGpuRentalOrderInfo = z.object({order_id: z.string(), status: gpuRentalOrderStatus, pricing_plan: gpuSkuPricingPlan.nullable().optional(), commitment_days: z.number().int().nullable().optional(), auto_renew: z.boolean().optional(), expires_at: z.string().nullable().optional(), renewal_in_progress: z.boolean().optional(), renewal_next_attempt_at: z.string().nullable().optional(), agreed_hourly_rate: z.string().nullable().optional(), hourly_billing_start_time: z.string().nullable().optional(), activated_at: z.string().nullable().optional(), completed_at: z.string().nullable().optional(), cancelled_at: z.string().nullable().optional(), decoupled_at: z.string().nullable().optional(), sku_code: z.string().nullable().optional(), sku_display_name: z.string().nullable().optional()}); export const teehouseApiRoutesCvmsV20260121SchemasCVMInfo = z.object({id: z.string(), name: z.string(), app_id: z.string().nullable().optional(), vm_uuid: z.string().nullable().optional(), instance_id: z.string().nullable().optional(), resource: cVMResourceInfo, node_info: nodeRef.nullable().optional(), os: cVMOSInfo.nullable().optional(), kms_type: kmsType.nullable().optional(), kms_info: cVMKmsInfo.nullable().optional(), status: z.string(), in_progress: z.boolean().optional(), progress: cVMProgressInfo.nullable().optional(), compose_hash: z.string().nullable().optional(), docker_compose_hash: z.string().nullable().optional(), pre_launch_script_hash: z.string().nullable().optional(), gateway: cVMGatewayInfo, logs: cVMLogUrls.optional(), services: z.array(z.record(z.string(), z.unknown())).optional(), endpoints: z.array(cvmNetworkUrls).nullable().optional(), public_logs: z.boolean().optional(), public_sysinfo: z.boolean().optional(), public_tcbinfo: z.boolean().optional(), gateway_enabled: z.boolean().optional(), secure_time: z.boolean().optional(), managed_env: z.boolean().optional(), enabled_ssh_access: z.boolean(), storage_fs: z.string().optional(), workspace: workspaceRef.nullable().optional(), creator: userRef.nullable().optional(), hourly_rate: cVMHourlyRate.nullable().optional(), billing_interval: z.enum(["hourly", "monthly", "unmetered"]).nullable().optional(), gpu_rental_order: cVMGpuRentalOrderInfo.nullable().optional(), created_at: z.string().nullable().optional(), deleted_at: z.string().nullable().optional(), listed: z.boolean().optional(), project_type: z.string().nullable().optional()}); export const getApiApiV1CvmsResponse = z.union([z.array(hostedCvm), z.array(teehouseApiRoutesCvmsV20260121SchemasCVMInfo)]); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * List CVMs * * GET /api/v1/cvms */ export const getApiApiV1Cvms = async (args: GetApiApiV1CvmsArgs, options?: GetApiApiV1CvmsOptions) => { const {baseUrl = "https://cloud-api.phala.com", fetch: fetchFn = fetch, OAuth2AuthorizationCodeBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.family != null) query.append("family", String(args.family)) for (const item of args.instance_types ?? []) query.append("instance_types", String(item)) if (OAuth2AuthorizationCodeBearer !== undefined) headers.set('authorization', `Bearer ${OAuth2AuthorizationCodeBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/cvms${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiApiV1CvmsResponse, await res.json()) };