import {z} from 'zod' export type StepStatusEnum = 'Scheduled' | 'Running' | 'Failed' | 'Succeeded' | 'Skipped' | 'Unknown'; export type GetApiProjectsOwnerNameRunsRunIdStepsArgs = {owner: string, name: string, run_id: string, status?: StepStatusEnum | undefined, step_id?: Array | undefined, until_generation?: string | undefined, since_generation?: string | undefined, page?: number | undefined, 'per-page'?: number | undefined}; export type GetApiProjectsOwnerNameRunsRunIdStepsOptions = {baseUrl: string, JWTAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const iOAliasHandler = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), language: z.string(), module: z.string(), function: z.string(), index: z.number().int().optional()}); export const dAGGenericInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.string().optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const dAGStringInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.string().optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const dAGIntegerInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.number().int().optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const dAGNumberInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.number().optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const dAGBooleanInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.boolean().optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const hTTP = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), url: z.string()}); export const s3 = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), key: z.string(), endpoint: z.string(), bucket: z.string(), credentials_path: z.string().optional()}); export const projectFolder = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), path: z.string().optional()}); export const dAGFolderInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.union([hTTP, s3, projectFolder]).optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const dAGFileInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.union([hTTP, s3, projectFolder]).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), extensions: z.array(z.string()).optional()}); export const dAGPathInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.union([hTTP, s3, projectFolder]).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), extensions: z.array(z.string()).optional()}); export const itemType = z.enum(["Generic", "String", "Integer", "Number", "Boolean", "Array", "JSONObject"]); export const dAGArrayInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.array(z.unknown()).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), items_type: itemType.optional()}); export const dAGJSONObjectInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.object({}).optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const dAGLinkedInputAlias = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), platform: z.array(z.string()), handler: z.array(iOAliasHandler), default: z.string().optional(), required: z.boolean().optional(), spec: z.object({}).optional()}); export const stepStringInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.string().optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), value: z.string()}); export const stepIntegerInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.number().int().optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), value: z.number().int()}); export const stepNumberInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.number().optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), value: z.number()}); export const stepBooleanInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.boolean().optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), value: z.boolean()}); export const stepFolderInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.union([hTTP, s3, projectFolder]).optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), path: z.string().optional(), source: z.union([hTTP, s3, projectFolder])}); export const stepFileInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.union([hTTP, s3, projectFolder]).optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), path: z.string().optional(), extensions: z.array(z.string()).optional(), source: z.union([hTTP, s3, projectFolder])}); export const stepPathInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.union([hTTP, s3, projectFolder]).optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), path: z.string().optional(), extensions: z.array(z.string()).optional(), source: z.union([hTTP, s3, projectFolder])}); export const stepArrayInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.array(z.unknown()).optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), items_type: itemType.optional(), value: z.array(z.unknown())}); export const stepJSONObjectInput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), default: z.object({}).optional(), alias: z.array(z.union([dAGGenericInputAlias, dAGStringInputAlias, dAGIntegerInputAlias, dAGNumberInputAlias, dAGBooleanInputAlias, dAGFolderInputAlias, dAGFileInputAlias, dAGPathInputAlias, dAGArrayInputAlias, dAGJSONObjectInputAlias, dAGLinkedInputAlias])).optional(), required: z.boolean().optional(), spec: z.object({}).optional(), value: z.object({})}); export const stepStringOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), value: z.string()}); export const stepIntegerOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), value: z.number().int()}); export const stepNumberOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), value: z.number()}); export const stepBooleanOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), value: z.boolean()}); export const stepFolderOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), source: z.union([hTTP, s3, projectFolder])}); export const stepFileOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), source: z.union([hTTP, s3, projectFolder])}); export const stepPathOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), source: z.union([hTTP, s3, projectFolder])}); export const stepArrayOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), items_type: itemType.optional(), value: z.array(z.unknown())}); export const stepJSONObjectOutput = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), name: z.string(), description: z.string().optional(), path: z.string(), required: z.boolean().optional(), value: z.object({})}); export const stepStatusEnum = z.enum(["Scheduled", "Running", "Failed", "Succeeded", "Skipped", "Unknown"]); export const statusType = z.enum(["Function", "DAG", "Loop", "Container", "Unknown"]); export const stepStatus = z.object({type: z.string().optional(), annotations: z.record(z.string(), z.string()).optional(), inputs: z.array(z.union([stepStringInput, stepIntegerInput, stepNumberInput, stepBooleanInput, stepFolderInput, stepFileInput, stepPathInput, stepArrayInput, stepJSONObjectInput])), outputs: z.array(z.union([stepStringOutput, stepIntegerOutput, stepNumberOutput, stepBooleanOutput, stepFolderOutput, stepFileOutput, stepPathOutput, stepArrayOutput, stepJSONObjectOutput])), message: z.string().optional(), started_at: z.string(), finished_at: z.string().optional(), source: z.string().optional(), id: z.string(), name: z.string(), status: stepStatusEnum.optional(), status_type: statusType, template_ref: z.string(), command: z.string().optional(), boundary_id: z.string().optional(), children_ids: z.array(z.string()), outbound_steps: z.array(z.string())}); export const stepList = z.object({page: z.number().int(), per_page: z.number().int(), next_page: z.number().int().optional(), page_count: z.number().int(), total_count: z.number().int(), resources: z.array(stepStatus)}); 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 }; /** * Query the steps of a run * * GET /projects/{owner}/{name}/runs/{run_id}/steps * * Also accepts auth: APIKeyAuth */ export const getApiProjectsOwnerNameRunsRunIdSteps = async (args: GetApiProjectsOwnerNameRunsRunIdStepsArgs, options: GetApiProjectsOwnerNameRunsRunIdStepsOptions) => { const {baseUrl, fetch: fetchFn = fetch, JWTAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.status != null) query.append("status", String(args.status)) for (const item of args.step_id ?? []) query.append("step_id", String(item)) if (args.until_generation != null) query.append("until_generation", String(args.until_generation)) if (args.since_generation != null) query.append("since_generation", String(args.since_generation)) if (args.page != null) query.append("page", String(args.page)) if (args['per-page'] != null) query.append("per-page", String(args['per-page'])) if (JWTAuth !== undefined) headers.set('authorization', `Bearer ${JWTAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/projects/${encodeURIComponent(String(args.owner))}/${encodeURIComponent(String(args.name))}/runs/${encodeURIComponent(String(args.run_id))}/steps${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(stepList, await res.json()) };