import type { Encodable } from "@automate.ax/codec" import type { Vercel } from "@vercel/sdk" import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getVercelApi, getVercelTeamId, vercelAccountOptions } from "../lib/api" import { vercelArraySchema, vercelObjectSchema } from "../lib/schemas" import { VERCEL_INTEGRATION_CONFIGURATION_READ_SCOPE } from "../lib/scopes" const VERCEL_CONFIGURATION_SCHEMA = z.looseObject({ id: z.string() }) const VERCEL_CONFIGURATIONS_SCHEMA = vercelArraySchema< Awaited> & Encodable >(VERCEL_CONFIGURATION_SCHEMA) const VERCEL_CONFIGURATION_RESPONSE_SCHEMA = vercelObjectSchema< Awaited> & Encodable >(VERCEL_CONFIGURATION_SCHEMA) /** Lists Vercel integration installations visible to the connected account. */ export const listVercelIntegrationConfigurations = defineAction( "List Vercel integration configurations", ) .describe("Lists external or Marketplace integration installations.") .account( "vercel", vercelAccountOptions(VERCEL_INTEGRATION_CONFIGURATION_READ_SCOPE), ) .input( z.object({ /** Filter by installation kind. */ installationType: z .enum(["external", "marketplace", "provisioning"]) .optional(), /** Filter by integration ID or slug. */ integration: z.string().min(1).optional(), /** Team ID. OAuth accounts default to the installed team. */ teamId: z.string().min(1).optional(), /** Return account-level or project-level configuration details. */ view: z.enum(["account", "project"]).prefault("account"), }), ) .output(VERCEL_CONFIGURATIONS_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => getVercelApi(account).integrations.getConfigurations({ view: input.view, ...(input.installationType && { installationType: input.installationType, }), ...(input.integration && { integrationIdOrSlug: input.integration }), ...(getVercelTeamId(account, input.teamId) && { teamId: getVercelTeamId(account, input.teamId), }), }), ) /** Gets one Vercel integration installation by configuration ID. */ export const getVercelIntegrationConfiguration = defineAction( "Get Vercel integration configuration", ) .describe("Gets one integration installation and its granted resources.") .account( "vercel", vercelAccountOptions(VERCEL_INTEGRATION_CONFIGURATION_READ_SCOPE), ) .input( z.object({ /** Integration configuration ID. */ configurationId: z.string().min(1), /** Team ID. OAuth accounts default to the installed team. */ teamId: z.string().min(1).optional(), }), ) .output(VERCEL_CONFIGURATION_RESPONSE_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => getVercelApi(account).integrations.getConfiguration({ id: input.configurationId, ...(getVercelTeamId(account, input.teamId) && { teamId: getVercelTeamId(account, input.teamId), }), }), )