import { getKitApi, KitApiError, KIT_OPERATION_DEFINITIONS, kitOperation, kitOperationInputSchema, kitOperationOutputSchema, type KitOperationInput, type KitOperationKey, type KitOperationOutput, } from "@automate.ax/integration-contracts/kit" import type { ZodType } from "zod" import { defineAction, parseRetryAfter, retryableActionError, terminalActionError, type DefinedAction, } from "../../../automation/actions" export const KIT_ACCOUNT = "kit" /** * Builds the connection alternatives supported by one Kit operation. * * @param oauthOnly Whether Kit rejects personal API keys for the operation. */ export function kitAccountRequirement(oauthOnly: boolean) { return { connections: [ { connectionMethodId: "oauth", requiredScope: "public" }, ...(!oauthOnly ? [{ connectionMethodId: "api-key" }] : []), ], } as const } /** * Defines one named action backed by the frozen Kit V4 OpenAPI contract. * * @param key Frozen public operation identifier. * @throws When the manifest has no matching definition. */ export function defineKitAction( key: TKey, ): DefinedAction< ZodType>, ZodType>, typeof KIT_ACCOUNT > { const definition = KIT_OPERATION_DEFINITIONS.find( ({ alias }) => alias === key, ) if (!definition) throw new Error(`Unknown Kit operation: ${key}`) const operation = kitOperation(key) return defineAction(definition.title) .describe(definition.description) .account(KIT_ACCOUNT, kitAccountRequirement(definition.oauthOnly)) .input(kitOperationInputSchema(key)) .output(kitOperationOutputSchema(key)) .retry({ replaySafety: definition.replaySafety }) .handler(async ({ account, input }) => { try { return await getKitApi(account).operation(key, input) } catch (error) { if (!(error instanceof KitApiError)) throw error if (error.status === 404 && operation.responseMode === "void") { return kitOperationOutputSchema(key).parse({}) } if (error.status === 413 || error.status === 429) { throw retryableActionError(error, { retryAt: parseRetryAfter(error.retryAfter), }) } throw error.status < 500 ? terminalActionError(error) : error } }) }