import {z} from 'zod' export type GetApiApiV1CvmsCvmIdArgs = {cvm_id: string}; export type GetApiApiV1CvmsCvmIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; 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 teehouseApiRoutesResourceCvmsManagementCommonCvmBasicInfo = z.object({id: z.union([z.number().int(), z.string()]), teepod_id: z.number().int().nullable().optional(), teepod: cvmNode.nullable().optional(), name: z.string(), status: z.string(), in_progress: z.boolean().optional(), app_id: z.string(), vm_uuid: z.string().nullable().optional(), instance_id: z.string().nullable().optional(), vcpu: z.number().int(), memory: z.number().int(), disk_size: z.number().int(), base_image: z.string().nullable().optional(), encrypted_env_pubkey: z.string().nullable().optional(), listed: z.boolean().optional(), project_id: z.string().nullable().optional(), project_type: z.string().nullable().optional(), instance_type: z.string().nullable().optional(), public_sysinfo: z.boolean().nullable().optional(), public_logs: z.boolean().nullable().optional(), managed_env: z.boolean().optional(), enabled_ssh_access: z.boolean(), dapp_dashboard_url: z.string().nullable().optional(), syslog_endpoint: z.string().nullable().optional(), kms_info: kMSInfo.nullable().optional(), contract_address: z.string().nullable().optional(), deployer_address: z.string().nullable().optional(), scheduled_delete_at: z.string().nullable().optional(), public_urls: z.array(cvmNetworkUrls).nullable().optional(), gateway_domain: z.string().nullable().optional()}); 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 cVMInfoDetail = 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(), compose_file: z.union([z.record(z.string(), z.unknown()), z.string()]).nullable().optional()}); export const getApiApiV1CvmsCvmIdResponse = z.union([teehouseApiRoutesResourceCvmsManagementCommonCvmBasicInfo, cVMInfoDetail]); 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 }; /** * Get CVM details * * GET /api/v1/cvms/{cvm_id} */ export const getApiApiV1CvmsCvmId = async (args: GetApiApiV1CvmsCvmIdArgs, options?: GetApiApiV1CvmsCvmIdOptions) => { const {baseUrl = "https://cloud-api.phala.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/cvms/${encodeURIComponent(String(args.cvm_id))}${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(getApiApiV1CvmsCvmIdResponse, await res.json()) };