import {z} from 'zod' export type CreateApiV2DeploymentsDeploymentIdRevisionsRevisionIdRedeployArgs = {deployment_id: string, revision_id: string}; export type CreateApiV2DeploymentsDeploymentIdRevisionsRevisionIdRedeployOptions = {baseUrl: string, APIKey?: string | undefined, fetch?: typeof fetch | undefined}; export const localObjectReference = z.object({name: z.string()}); export const volume = z.object({name: z.string().optional(), configMap: z.record(z.string(), z.unknown()).nullable().optional(), secret: z.record(z.string(), z.unknown()).nullable().optional(), emptyDir: z.record(z.string(), z.unknown()).nullable().optional(), persistentVolumeClaim: z.record(z.string(), z.unknown()).nullable().optional(), nfs: z.record(z.string(), z.unknown()).nullable().optional(), projected: z.record(z.string(), z.unknown()).nullable().optional(), downwardAPI: z.record(z.string(), z.unknown()).nullable().optional(), csi: z.record(z.string(), z.unknown()).nullable().optional()}); export const volumeMount = z.object({name: z.string().optional(), mountPath: z.string().optional(), subPath: z.string().nullable().optional(), mountPropagation: z.string().nullable().optional(), readOnly: z.boolean().nullable().optional(), subPathExpr: z.string().nullable().optional()}); export const envVar = z.object({name: z.string(), value: z.string().nullable().optional(), valueFrom: z.record(z.string(), z.unknown()).nullable().optional()}); export const resourceRequirements = z.object({limits: z.record(z.string(), z.string()).nullable().optional(), requests: z.record(z.string(), z.string()).nullable().optional()}); export const container = z.object({name: z.string(), image: z.string(), imagePullPolicy: z.string().nullable().optional(), command: z.array(z.string()).nullable().optional(), args: z.array(z.string()).nullable().optional(), workingDir: z.string().nullable().optional(), env: z.array(envVar).nullable().optional(), envFrom: z.array(z.record(z.string(), z.unknown())).nullable().optional(), resources: resourceRequirements.nullable().optional(), volumeMounts: z.array(volumeMount).nullable().optional(), securityContext: z.record(z.string(), z.unknown()).nullable().optional(), restartPolicy: z.string().nullable().optional()}); export const resourceSpecOutput = z.object({min_scale: z.number().int().nullable().optional(), max_scale: z.number().int().nullable().optional(), cpu: z.number().gte(0.1).lte(8).nullable().optional(), cpu_limit: z.number().gte(0.1).lte(16).nullable().optional(), memory_mb: z.number().int().nullable().optional(), memory_limit_mb: z.number().int().nullable().optional(), queue_min_scale: z.number().int().nullable().optional(), queue_max_scale: z.number().int().nullable().optional(), queue_cpu: z.number().gte(0.1).lte(8).nullable().optional(), queue_cpu_limit: z.number().gte(0.1).lte(16).nullable().optional(), queue_memory_mb: z.number().int().nullable().optional(), queue_memory_limit_mb: z.number().int().nullable().optional(), redis_cpu: z.number().gte(0.1).lte(8).nullable().optional(), redis_cpu_limit: z.number().gte(0.1).lte(16).nullable().optional(), redis_memory_mb: z.number().int().nullable().optional(), redis_memory_limit_mb: z.number().int().nullable().optional(), core_cpu: z.number().gte(0.1).nullable().optional(), core_cpu_limit: z.number().gte(0.1).nullable().optional(), core_memory_mb: z.number().int().nullable().optional(), core_memory_limit_mb: z.number().int().nullable().optional(), labels: z.record(z.string(), z.string()).nullable().optional(), annotations: z.record(z.string(), z.string()).nullable().optional(), service_account_name: z.string().nullable().optional(), image_pull_secrets: z.array(localObjectReference).nullable().optional(), volumes: z.array(volume).nullable().optional(), volume_mounts: z.array(volumeMount).nullable().optional(), init_containers: z.array(container).nullable().optional(), sidecars: z.array(container).nullable().optional(), db_cpu: z.number().nullable().optional(), db_cpu_limit: z.number().nullable().optional(), db_memory_mb: z.number().int().nullable().optional(), db_memory_limit_mb: z.number().int().nullable().optional(), db_storage_gi: z.number().int().nullable().optional(), db_max_connections: z.number().int().nullable().optional()}); export const listenerConfig = z.object({k8s_namespace: z.string().nullable().optional()}); export const sourceConfig = z.object({integration_id: z.string().nullable().optional(), repo_url: z.string().nullable().optional(), deployment_type: z.enum(["dev_free", "dev", "prod", "dev_zero", "dev_free_zero"]).nullable().optional(), build_on_push: z.boolean().nullable().optional(), custom_url: z.string().nullable().optional(), resource_spec: resourceSpecOutput.nullable().optional(), listener_id: z.string().nullable().optional(), listener_config: listenerConfig.nullable().optional(), install_command: z.string().nullable().optional(), build_command: z.string().nullable().optional()}); export const sourceRevisionConfig = z.object({repo_ref: z.string().nullable().optional(), langgraph_config_path: z.string().nullable().optional(), image_uri: z.string().nullable().optional(), source_tarball_path: z.string().nullable().optional(), repo_commit_sha: z.string().nullable().optional()}); export const secret = z.object({name: z.string(), value: z.string()}); export const secretReference = z.object({name: z.string(), secret_name: z.string(), secret_key: z.string()}); export const deploymentTier = z.enum(["SERVERLESS_S", "SERVERLESS_M", "SERVERLESS_L", "DEDICATED_S", "DEDICATED_M", "DEDICATED_L"]); export const deployment = z.object({name: z.string(), source: z.enum(["github", "external_docker", "internal_docker", "internal_source", "internal_template"]), source_config: sourceConfig, source_revision_config: sourceRevisionConfig, secrets: z.array(secret), secret_references: z.array(secretReference).nullable().optional(), id: z.string(), tenant_id: z.string(), created_at: z.string(), updated_at: z.string(), status: z.enum(["AWAITING_DATABASE", "READY", "UNUSED", "AWAITING_DELETE", "UNKNOWN"]), latest_revision_id: z.string().nullable(), active_revision_id: z.string().nullable(), image_version: z.string().nullable().optional(), display_name: z.string().nullable().optional(), is_managed_deep_agent: z.boolean().optional(), deployment_tier: deploymentTier.nullable().optional(), compute_tier: deploymentTier.nullable().optional(), database_tier: deploymentTier.nullable().optional()}); 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 }; /** * Redeploy Revision * * POST /v2/deployments/{deployment_id}/revisions/{revision_id}/redeploy * * Also accepts auth: Tenant ID, Bearer Auth */ export const createApiV2DeploymentsDeploymentIdRevisionsRevisionIdRedeploy = async (args: CreateApiV2DeploymentsDeploymentIdRevisionsRevisionIdRedeployArgs, options: CreateApiV2DeploymentsDeploymentIdRevisionsRevisionIdRedeployOptions) => { const {baseUrl, fetch: fetchFn = fetch, APIKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (APIKey !== undefined) headers.set("X-API-Key", APIKey) const url = `${baseUrl.replace(/\/+$/, '')}/v2/deployments/${encodeURIComponent(String(args.deployment_id))}/revisions/${encodeURIComponent(String(args.revision_id))}/redeploy${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(deployment, await res.json()) };