import {z} from 'zod' export type RunnerTypeEnum = 'github-actions' | 'gitlab-pipelines' | 'bitbucket-pipelines' | 'azure-pipelines' | 'jenkins' | 'semaphore' | 'atlantis' | 'env0' | 'firefly' | 'unrecognized'; export type WorkspaceRunStatusEnum = 'pending' | 'running' | 'success' | 'failed' | 'canceled' | 'initializing' | 'queued' | 'planning' | 'planning_destroy' | 'applying' | 'destroying' | 'ready_for_apply' | 'ready_for_destroy' | 'destroyed' | 'destroy_plan_completed' | 'destroy_plan_failed' | 'destroy_failed' | 'discarded' | 'canceling_init' | 'canceling_plan' | 'canceling_planning_destroy' | 'canceling_apply' | 'canceling_destroy' | 'canceled_init' | 'canceled_plan' | 'canceled_planning_destroy' | 'canceled_apply' | 'canceled_destroy' | 'init_error' | 'plan_success' | 'plan_error' | 'apply_error' | 'apply_success' | 'blocked' | 'Acknowledged' | 'plan_no_changes' | 'apply_no_changes' | 'runner_failure'; export type VcsTypeEnum = 'github' | 'gitlab' | 'bitbucket' | 'codecommit' | 'azuredevops'; export type WorkspaceFilters = {workspaceName?: Array | undefined, repositories?: Array | undefined, ciTool?: Array | undefined, labels?: Array | undefined, status?: Array | undefined, isManagedWorkflow?: boolean | undefined, vcsType?: Array | undefined, poolId?: Array | undefined}; export type SortConfig = {order?: (-1 | 1) | undefined}; export type WorkspaceSortField = {lastRunTime?: SortConfig | undefined, workspaceName?: SortConfig | undefined, repository?: SortConfig | undefined, terraformVersion?: SortConfig | undefined, lastRunStatus?: SortConfig | undefined, ciTool?: SortConfig | undefined, runs?: SortConfig | undefined}; export type ListWorkspacesRequest = {projection?: Array | undefined, searchValue?: string | undefined, filters?: ({workspaceName?: Array | undefined, repositories?: Array | undefined, ciTool?: Array | undefined, labels?: Array | undefined, status?: Array | undefined, isManagedWorkflow?: boolean | undefined, vcsType?: Array | undefined, poolId?: Array | undefined, $or?: WorkspaceFilters | undefined}) | undefined, sort?: WorkspaceSortField | undefined}; export type CreateApiWorkspacesSearchArgs = {page?: number | undefined, pageSize?: number | undefined, body: ListWorkspacesRequest}; export type CreateApiWorkspacesSearchOptions = {baseUrl?: string | undefined, JWTAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const vcsTypeEnum = z.enum(["github", "gitlab", "bitbucket", "codecommit", "azuredevops"]); export const runnerTypeEnum = z.enum(["github-actions", "gitlab-pipelines", "bitbucket-pipelines", "azure-pipelines", "jenkins", "semaphore", "atlantis", "env0", "firefly", "unrecognized"]); export const workspaceRunStatusEnum = z.enum(["pending", "running", "success", "failed", "canceled", "initializing", "queued", "planning", "planning_destroy", "applying", "destroying", "ready_for_apply", "ready_for_destroy", "destroyed", "destroy_plan_completed", "destroy_plan_failed", "destroy_failed", "discarded", "canceling_init", "canceling_plan", "canceling_planning_destroy", "canceling_apply", "canceling_destroy", "canceled_init", "canceled_plan", "canceled_planning_destroy", "canceled_apply", "canceled_destroy", "init_error", "plan_success", "plan_error", "apply_error", "apply_success", "blocked", "Acknowledged", "plan_no_changes", "apply_no_changes", "runner_failure"]); export const workspace = z.object({id: z.string().optional(), accountId: z.string().optional(), createdAt: z.string().optional(), updatedAt: z.string().optional(), workspaceId: z.string().optional(), workspaceName: z.string().optional(), repo: z.string().optional(), repoUrl: z.string().optional(), vcsType: vcsTypeEnum.optional(), runnerType: runnerTypeEnum.optional(), lastRunStatus: workspaceRunStatusEnum.optional(), lastApplyTime: z.string().optional(), lastPlanTime: z.string().optional(), lastRunTime: z.string().optional(), iacType: z.string().optional(), iacTypeVersion: z.string().optional(), backendSummary: z.object({backendType: z.string().optional(), backendConfig: z.record(z.string(), z.unknown()).optional(), iacStackId: z.string().optional(), managedResourceCount: z.number().int().optional()}).optional(), labels: z.array(z.string()).optional(), poolId: z.string().optional(), runsCount: z.number().int().optional(), isWorkflowManaged: z.boolean().optional(), guardrails: z.array(z.string()).optional(), oidcAuthentication: z.boolean().nullable().optional(), isRemote: z.boolean().optional()}); export const listWorkspacesResponse = z.array(workspace); 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 Workspaces * * POST /workspaces/search */ export const createApiWorkspacesSearch = async (args: CreateApiWorkspacesSearchArgs, options?: CreateApiWorkspacesSearchOptions) => { const {baseUrl = "https://api.firefly.ai/v2", fetch: fetchFn = fetch, JWTAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.page != null) query.append("page", String(args.page)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (JWTAuth !== undefined) headers.set('authorization', `Bearer ${JWTAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/workspaces/search${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(listWorkspacesResponse, await res.json()) };