import * as z from "zod" import { defineAction } from "../../../automation/actions" import { EMAIL_ORIGIN_TOKEN } from "../../../lib/email-origin" import { getGmailApi, setRawMessageAutomationOrigin, toMessageMetadata, } from "@automate.ax/integration-contracts/gmail" import { GMAIL_COMPOSE_REQUIREMENT } from "../lib/scopes" import { MESSAGE_METADATA_SCHEMA } from "@automate.ax/integration-contracts/gmail" /** Sends an existing Gmail draft and returns the sent message metadata. */ export const sendGmailDraft = defineAction("Send Gmail draft") .describe("Sends an existing Gmail draft.") .account("google", GMAIL_COMPOSE_REQUIREMENT) .input( z.object({ /** Immutable Gmail draft ID to send. */ draftId: z.string().min(1), }), ) .output(MESSAGE_METADATA_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input, runtime }) => { const gmailApi = getGmailApi(account.secret) const { data: draft } = await gmailApi.users.drafts.get({ format: "raw", id: input.draftId, userId: "me", }) if (!draft.message?.raw) { throw new Error("Gmail did not return the raw draft message.") } await gmailApi.users.drafts.update({ id: input.draftId, requestBody: { id: input.draftId, message: { raw: runtime[EMAIL_ORIGIN_TOKEN] ? setRawMessageAutomationOrigin( draft.message.raw, runtime[EMAIL_ORIGIN_TOKEN], ) : draft.message.raw, }, }, userId: "me", }) return toMessageMetadata( ( await gmailApi.users.drafts.send({ requestBody: { id: input.draftId }, userId: "me", }) ).data, "sent draft", ) })