export type DmChannel = 'instagram' | 'facebook' | 'tiktok' | 'youtube'; /** O que dispara a automação. */ export type DmTriggerType = 'comment' | 'direct_message'; /** Em quais publicações a automação vale. */ export type DmTriggerScope = 'all_posts' | 'specific_posts'; /** Templates prontos que o dono da conta escolhe. */ export type DmTemplateKind = 'link_only' | 'email_then_link' | 'name_email_then_link' | 'qualify_then_link'; export type DmStepType = 'send_text' | 'ask' | 'buttons'; /** Campo coletado por um passo `ask`. Alimenta DmContact/DmFlowRun.collected. */ export type DmAskField = 'name' | 'email' | 'phone' | 'custom'; export type DmValidation = 'none' | 'email' | 'phone'; export interface DmSendTextStep { type: 'send_text'; /** Aceita {{link}}, {{name}}, {{email}}, {{phone}}, {{username}}. */ text: string; } export interface DmAskStep { type: 'ask'; field: DmAskField; /** Obrigatório quando field === 'custom'; é a chave em collected. */ fieldKey?: string; prompt: string; validate: DmValidation; /** Mensagem quando a resposta não passa na validação. */ retryPrompt?: string; /** * Usa o quick reply nativo (`user_email` / `user_phone_number`), que chega * preenchido com o dado do perfil — um toque, sem digitação. Só o Messenger * suporta; no Instagram o adapter cai automaticamente para texto livre. */ useNativeQuickReply?: boolean; } export interface DmButtonOption { label: string; value: string; /** Quando presente, sobrescreve {{link}} nos passos seguintes. */ link?: string; } export interface DmButtonsStep { type: 'buttons'; prompt: string; /** Chave em collected onde o valor escolhido é gravado. */ fieldKey: string; options: DmButtonOption[]; } export type DmStep = DmSendTextStep | DmAskStep | DmButtonsStep; export type DmMessageDirection = 'incoming' | 'outgoing'; export type DmMessageSentBy = 'bot' | 'human' | 'contact'; export type DmMessageType = 'text' | 'image' | 'video' | 'audio' | 'story_reply'; /** Estado da execução do fluxo para um contato. */ export type DmFlowRunStatus = 'active' | 'completed' | 'abandoned' | 'opted_out' | 'failed'; export type DmConversationStatus = 'open' | 'closed'; /** Origem do evento que criou o contato — usado no funil. */ export type DmContactSource = 'comment' | 'direct_message' | 'manual';