{"version":3,"sources":["../src/errors.ts","../src/phone.ts","../src/client.ts","../src/tools.ts","../src/webhook.ts"],"names":["ArAgentsError","tool","z","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error classes thrown by `@ar-agents/whatsapp`. All extend the base\n * `WhatsAppError` so callers can do `catch (err) if (err instanceof WhatsAppError)`.\n *\n * # Why typed errors?\n *\n * Tools surface failures back to the LLM as part of the tool result, but for\n * code paths outside the agent (webhook handlers, batch jobs) the typed\n * errors let you switch on the error class instead of regexing messages.\n */\nimport { ArAgentsError } from \"@ar-agents/core\";\n\nexport class WhatsAppError extends ArAgentsError {\n  constructor(message: string, cause?: unknown) {\n    super(message, {\n      code: \"whatsapp_error\",\n      retryable: false,\n      context: {},\n      cause,\n    });\n    this.name = \"WhatsAppError\";\n  }\n}\n\n/** Construction-time configuration error (missing accessToken / phoneNumberId). */\nexport class WhatsAppNotConfiguredError extends WhatsAppError {\n  constructor(message?: string) {\n    super(\n      message ??\n        \"WhatsAppClient requires `accessToken` and `phoneNumberId`. Get both from Meta Business Suite → WhatsApp → API Setup.\",\n    );\n    this.name = \"WhatsAppNotConfiguredError\";\n  }\n}\n\n/**\n * Meta Graph API returned a 4xx with a structured error body. Includes the\n * Meta error code so callers can branch on common cases:\n *\n * - 131009: phone number not on WhatsApp\n * - 131026: outside 24-hour customer service window (need template)\n * - 131031: app is not associated with this phone number\n * - 131056: invalid recipient phone number\n * - 132000: template params don't match the approved template\n * - 190: access token expired or invalid\n *\n * Full reference: https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes\n */\nexport class WhatsAppApiError extends WhatsAppError {\n  /** Meta Graph API error code (numeric). e.g. 131009, 131026. */\n  public readonly metaCode: number;\n  public readonly httpStatus: number;\n  public readonly metaSubcode?: number;\n  public readonly fbtraceId?: string;\n\n  constructor(\n    message: string,\n    metaCode: number,\n    httpStatus: number,\n    metaSubcode?: number,\n    fbtraceId?: string,\n    cause?: unknown,\n  ) {\n    super(message, cause);\n    this.name = \"WhatsAppApiError\";\n    // ArAgentsError's `code` is a string; this one carries the Meta numeric code.\n    (this as { code: string }).code = `whatsapp_meta_${metaCode}`;\n    this.metaCode = metaCode;\n    this.httpStatus = httpStatus;\n    if (metaSubcode !== undefined) this.metaSubcode = metaSubcode;\n    if (fbtraceId !== undefined) this.fbtraceId = fbtraceId;\n  }\n}\n\n/**\n * The recipient phone number doesn't match a WhatsApp account. Maps to Meta\n * code 131009. Surface this to the user as \"ese número no está en WhatsApp\".\n */\nexport class WhatsAppRecipientNotOnPlatformError extends WhatsAppApiError {\n  constructor(metaMessage: string, fbtraceId?: string) {\n    super(\n      `Recipient is not registered on WhatsApp: ${metaMessage}`,\n      131009,\n      400,\n      undefined,\n      fbtraceId,\n    );\n    this.name = \"WhatsAppRecipientNotOnPlatformError\";\n  }\n}\n\n/**\n * Tried to send a free-form message outside the 24-hour customer service\n * window. Maps to Meta code 131026 / 131047. The fix is to send an approved\n * template message instead.\n */\nexport class WhatsAppOutsideWindowError extends WhatsAppApiError {\n  constructor(metaMessage: string, fbtraceId?: string) {\n    super(\n      `Cannot send free-form message outside 24-hour window — use a template instead. Meta said: ${metaMessage}`,\n      131026,\n      400,\n      undefined,\n      fbtraceId,\n    );\n    this.name = \"WhatsAppOutsideWindowError\";\n  }\n}\n\n/** Webhook signature verification failed — the request is not from Meta. */\nexport class WhatsAppWebhookSignatureError extends WhatsAppError {\n  constructor(message: string = \"Webhook signature mismatch\") {\n    super(message);\n    this.name = \"WhatsAppWebhookSignatureError\";\n  }\n}\n","/**\n * Phone-number normalization for Argentine WhatsApp recipients.\n *\n * # Why this exists\n *\n * Meta's Cloud API expects E.164 format WITHOUT the leading `+`. Argentine\n * users write phone numbers a dozen different ways:\n *\n * - `+54 9 11 1234-5678`\n * - `54 9 11 1234 5678`\n * - `+5491112345678`\n * - `011 1234-5678` (no country code)\n * - `11-1234-5678`\n * - `1112345678` (no area code prefix)\n *\n * Two AR-specific gotchas:\n * 1. WhatsApp requires the **`9`** after the country code for mobile numbers.\n *    Local format `011 5555-1234` becomes `54 9 11 5555-1234`. Without the\n *    9, Meta rejects with \"recipient not on WhatsApp\" even when they are.\n * 2. The trunk `0` (e.g., the `0` in `011`) must be DROPPED.\n *\n * `normalizeArPhone` handles both. For non-AR numbers (anything starting\n * with country code !== 54), it just strips non-digits and returns.\n */\n\n/**\n * Normalize an Argentine phone number to WhatsApp E.164 format (no `+`).\n *\n * Rules applied in order:\n * 1. Strip all non-digit characters.\n * 2. If starts with `54` (country code already present): drop trunk `0` if\n *    next is `0`, ensure `9` present after `54` for mobile (10-digit\n *    subscriber numbers — landlines stay without `9`).\n * 3. If starts with `0`: assume AR domestic, drop the `0`, prefix `549`.\n * 4. If starts with `15`: legacy mobile prefix, strip and prefix `549<area>`\n *    (best effort — defaults to area `11` if unable to detect).\n * 5. Otherwise: prefix `549` (assumes AR mobile, 10 digits).\n *\n * Returns the normalized string, or throws if the input doesn't look like a\n * valid phone number after normalization.\n *\n * @example\n * normalizeArPhone(\"+54 9 11 1234-5678\") // \"5491112345678\"\n * normalizeArPhone(\"011 1234-5678\")       // \"5491112345678\"\n * normalizeArPhone(\"11-1234-5678\")        // \"5491112345678\"\n * normalizeArPhone(\"+1 415 555 2671\")     // \"14155552671\" (non-AR pass-through)\n */\nexport function normalizeArPhone(input: string): string {\n  if (typeof input !== \"string\") {\n    throw new TypeError(`Phone number must be a string, got ${typeof input}`);\n  }\n  const digits = input.replace(/\\D/g, \"\");\n  if (!digits) {\n    throw new Error(`Phone number \"${input}\" has no digits`);\n  }\n\n  // Country code 54 already present\n  if (digits.startsWith(\"54\")) {\n    const rest = digits.slice(2);\n    // If the next char is \"9\", it's already a WhatsApp mobile format\n    if (rest.startsWith(\"9\")) {\n      const subscriber = rest.slice(1);\n      if (subscriber.length < 9 || subscriber.length > 11) {\n        throw new Error(\n          `AR mobile after country+9 should be 9-11 digits, got ${subscriber.length}: \"${input}\"`,\n        );\n      }\n      return \"549\" + subscriber;\n    }\n    // No 9 — could be landline OR mobile that forgot the 9\n    // Heuristic: if length is 10 (area + subscriber), assume mobile, add 9\n    if (rest.length === 10) {\n      return \"549\" + rest;\n    }\n    // Otherwise treat as landline\n    return \"54\" + rest;\n  }\n\n  // Starts with leading 0 (domestic AR format)\n  if (digits.startsWith(\"0\")) {\n    const stripped = stripLeadingZeros(digits);\n    // Common pattern: 011 + 8-digit subscriber → 011 1234 5678 → 1112345678\n    return \"549\" + stripped;\n  }\n\n  // Legacy 15 mobile prefix (no longer used post-2022, but still seen)\n  if (digits.startsWith(\"15\") && digits.length === 10) {\n    return \"5491\" + digits.slice(2);\n  }\n\n  // Length 8 = subscriber only, assume CABA (area 11)\n  if (digits.length === 8) {\n    return \"549\" + \"11\" + digits;\n  }\n  // Length 10 = area + subscriber, assume AR mobile\n  if (digits.length === 10) {\n    return \"549\" + digits;\n  }\n  // Length 11 = 9 + area + subscriber, prepend 54\n  if (digits.length === 11 && digits.startsWith(\"9\")) {\n    return \"54\" + digits;\n  }\n  // Already E.164 length (12-13 digits) but no 54 prefix — pass through\n  if (digits.length >= 11 && digits.length <= 15) {\n    return digits;\n  }\n  throw new Error(\n    `Could not normalize phone \"${input}\" — got ${digits.length} digits, no clear AR pattern matched`,\n  );\n}\n\nfunction stripLeadingZeros(s: string): string {\n  return s.replace(/^0+/, \"\");\n}\n\n/**\n * Loose validation — checks shape, not deliverability. Returns true if the\n * input could plausibly be a WhatsApp-deliverable phone number. Use this in\n * tools where the LLM might pass garbage.\n */\nexport function isPlausibleWhatsAppPhone(input: string): boolean {\n  try {\n    const normalized = normalizeArPhone(input);\n    return normalized.length >= 11 && normalized.length <= 15 && /^\\d+$/.test(normalized);\n  } catch {\n    return false;\n  }\n}\n","import {\n  WhatsAppApiError,\n  WhatsAppNotConfiguredError,\n  WhatsAppOutsideWindowError,\n  WhatsAppRecipientNotOnPlatformError,\n} from \"./errors\";\nimport { normalizeArPhone } from \"./phone\";\nimport type {\n  PhoneNumberId,\n  SendResult,\n  WhatsAppClientOptions,\n  WhatsAppRecipient,\n} from \"./types\";\n\nconst DEFAULT_API_VERSION = \"v21.0\";\nconst DEFAULT_BASE_URL = \"https://graph.facebook.com\";\n\n/**\n * Thin client over Meta's WhatsApp Business Cloud API.\n *\n * # Surface\n *\n * - `sendText` — free-form text to a recipient (within the 24-hour customer\n *   service window).\n * - `sendTemplate` — approved template (any time; works outside the 24h\n *   window). Required for proactive marketing/transactional messages.\n * - `sendMedia` — image/audio/video/document by URL or pre-uploaded media ID.\n * - `sendInteractive` — buttons or list pickers for in-chat actions.\n * - `markAsRead` — flip the inbound message to \"read\" (blue checkmarks).\n * - `downloadMedia` — fetch a media file the user sent you (requires the\n *   `mediaId` from the inbound webhook).\n *\n * # Auth\n *\n * Pass a permanent or system-user access token from Meta. The token is sent\n * as `Authorization: Bearer ...` on every request — do NOT log it.\n *\n * # Error handling\n *\n * Methods throw typed errors (`WhatsAppApiError` and subclasses) when Meta\n * returns 4xx. Common subclasses:\n * - `WhatsAppRecipientNotOnPlatformError` (Meta code 131009)\n * - `WhatsAppOutsideWindowError` (131026/131047)\n *\n * Catch and surface to the agent — DON'T regex error messages.\n */\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class WhatsAppClient {\n  private readonly accessToken: string;\n  private readonly phoneNumberId: PhoneNumberId;\n  private readonly apiVersion: string;\n  private readonly baseUrl: string;\n  private readonly fetchImpl: typeof fetch | undefined;\n  private readonly requestTimeoutMs: number;\n  private readonly maxRetries: number;\n  private readonly onCall: WhatsAppClientOptions[\"onCall\"];\n\n  constructor(options: WhatsAppClientOptions) {\n    // Browser-context guard — same rationale as MercadoPagoClient. The\n    // Meta access token is server-only; bundling this client into a\n    // browser would leak it.\n    const w = (globalThis as { window?: unknown }).window;\n    if (typeof w !== \"undefined\" && !options.__allowBrowser) {\n      throw new Error(\n        \"WhatsAppClient must NEVER be instantiated in a browser context — \" +\n          \"the Meta access token would be exposed in the JavaScript bundle. \" +\n          \"Use a Server Component, Route Handler, or Server Action.\",\n      );\n    }\n    if (!options.accessToken || !options.phoneNumberId) {\n      throw new WhatsAppNotConfiguredError();\n    }\n    this.accessToken = options.accessToken;\n    this.phoneNumberId = options.phoneNumberId;\n    this.apiVersion = options.apiVersion ?? DEFAULT_API_VERSION;\n    this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n    this.fetchImpl = options.fetchImpl;\n    this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n    this.maxRetries = Math.max(0, options.maxRetries ?? 1);\n    this.onCall = options.onCall;\n  }\n\n  /**\n   * Internal helper: fetch with timeout + retry on 5xx/network errors.\n   * 4xx never retried.\n   *\n   * Retries only apply to idempotent requests. The Meta Cloud API has no\n   * client-supplied idempotency key on `POST /messages`, so retrying a send\n   * that timed out or 5xx'd risks delivering the message more than once.\n   * Callers issuing non-idempotent requests MUST pass `{ retry: false }`.\n   */\n  private async fetchWithRetry(\n    url: string,\n    init: RequestInit,\n    pathForObs: string,\n    opts: { retry?: boolean } = {},\n  ): Promise<Response> {\n    const fetchFn = this.fetchImpl ?? globalThis.fetch;\n    const maxRetries = opts.retry === false ? 0 : this.maxRetries;\n    const t0 = Date.now();\n    let attempt = 0;\n    let lastStatus: number | null = null;\n\n    while (attempt <= maxRetries) {\n      const controller = new AbortController();\n      const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n      try {\n        const res = await fetchFn(url, { ...init, signal: controller.signal });\n        clearTimeout(timer);\n        lastStatus = res.status;\n        if (res.ok || res.status < 500) {\n          this.onCall?.({\n            method: init.method ?? \"GET\",\n            path: pathForObs,\n            durationMs: Date.now() - t0,\n            httpStatus: res.status,\n            retried: attempt,\n            success: res.ok,\n          });\n          return res;\n        }\n        // 5xx → retry if budget remains\n        if (attempt < maxRetries) {\n          attempt++;\n          await sleep(250 * Math.pow(2, attempt - 1));\n          continue;\n        }\n        this.onCall?.({\n          method: init.method ?? \"GET\",\n          path: pathForObs,\n          durationMs: Date.now() - t0,\n          httpStatus: res.status,\n          retried: attempt,\n          success: false,\n        });\n        return res;\n      } catch (err) {\n        clearTimeout(timer);\n        const isAbort = err instanceof Error && err.name === \"AbortError\";\n        if (attempt < maxRetries) {\n          attempt++;\n          await sleep(250 * Math.pow(2, attempt - 1));\n          continue;\n        }\n        this.onCall?.({\n          method: init.method ?? \"GET\",\n          path: pathForObs,\n          durationMs: Date.now() - t0,\n          httpStatus: lastStatus,\n          retried: attempt,\n          success: false,\n        });\n        if (isAbort) {\n          throw new Error(\n            `WhatsApp request timed out after ${this.requestTimeoutMs}ms: ${pathForObs}`,\n          );\n        }\n        throw err;\n      }\n    }\n    // Unreachable\n    throw new Error(`WhatsApp request failed after ${maxRetries} retries`);\n  }\n\n  /**\n   * Send a plain text message. Only works within the 24-hour customer service\n   * window (Meta restriction). Outside the window, use `sendTemplate`.\n   *\n   * @example\n   * ```ts\n   * await wa.sendText({\n   *   to: \"5491112345678\",\n   *   text: \"Hola Lautaro, tu pedido ya salió.\",\n   * });\n   * ```\n   */\n  async sendText(params: {\n    to: WhatsAppRecipient;\n    text: string;\n    /**\n     * Enable URL preview cards. Default `true` to match WhatsApp UX\n     * expectations (links render as previews automatically).\n     */\n    previewUrl?: boolean;\n    /** wamid of the message to reply to (creates threaded reply). */\n    contextMessageId?: string;\n  }): Promise<SendResult> {\n    const recipient = normalizeArPhone(params.to);\n    const body: Record<string, unknown> = {\n      messaging_product: \"whatsapp\",\n      to: recipient,\n      type: \"text\",\n      text: {\n        body: params.text,\n        preview_url: params.previewUrl ?? true,\n      },\n    };\n    if (params.contextMessageId) {\n      body.context = { message_id: params.contextMessageId };\n    }\n    const res = await this.postMessages(body);\n    return this.toSendResult(res, recipient);\n  }\n\n  /**\n   * Send a pre-approved template message. Required for messages outside the\n   * 24-hour window (transactional, marketing, utility).\n   *\n   * Templates must be created and approved in Meta Business Suite first.\n   *\n   * @example\n   * ```ts\n   * await wa.sendTemplate({\n   *   to: \"5491112345678\",\n   *   templateName: \"order_shipped\",\n   *   languageCode: \"es_AR\",\n   *   bodyParams: [\"Lautaro\", \"OL-12345\"],\n   * });\n   * ```\n   */\n  async sendTemplate(params: {\n    to: WhatsAppRecipient;\n    /** Exact template name as registered in Meta. */\n    templateName: string;\n    /** Language code, e.g., \"es_AR\", \"es\", \"en_US\". */\n    languageCode?: string;\n    /** Positional parameters for the template body, in order. */\n    bodyParams?: string[];\n    /** Optional positional parameters for the header (text or media). */\n    headerParams?: Array<\n      | { type: \"text\"; text: string }\n      | { type: \"image\"; link: string }\n      | { type: \"document\"; link: string; filename?: string }\n      | { type: \"video\"; link: string }\n    >;\n  }): Promise<SendResult> {\n    const recipient = normalizeArPhone(params.to);\n    const components: unknown[] = [];\n\n    if (params.headerParams && params.headerParams.length > 0) {\n      components.push({\n        type: \"header\",\n        parameters: params.headerParams.map((p) => {\n          if (p.type === \"text\") return { type: \"text\", text: p.text };\n          if (p.type === \"image\") return { type: \"image\", image: { link: p.link } };\n          if (p.type === \"video\") return { type: \"video\", video: { link: p.link } };\n          return {\n            type: \"document\",\n            document: { link: p.link, filename: p.filename },\n          };\n        }),\n      });\n    }\n\n    if (params.bodyParams && params.bodyParams.length > 0) {\n      components.push({\n        type: \"body\",\n        parameters: params.bodyParams.map((text) => ({ type: \"text\", text })),\n      });\n    }\n\n    const body = {\n      messaging_product: \"whatsapp\",\n      to: recipient,\n      type: \"template\",\n      template: {\n        name: params.templateName,\n        language: { code: params.languageCode ?? \"es_AR\" },\n        ...(components.length > 0 ? { components } : {}),\n      },\n    };\n    const res = await this.postMessages(body);\n    return this.toSendResult(res, recipient);\n  }\n\n  /**\n   * Send media (image, audio, video, document). Provide either a public URL\n   * (`link`) OR a pre-uploaded `mediaId` (from `uploadMedia`).\n   *\n   * @example\n   * ```ts\n   * await wa.sendMedia({\n   *   to: \"5491112345678\",\n   *   type: \"image\",\n   *   link: \"https://example.com/order-receipt.jpg\",\n   *   caption: \"Tu comprobante\",\n   * });\n   * ```\n   */\n  async sendMedia(params: {\n    to: WhatsAppRecipient;\n    type: \"image\" | \"audio\" | \"video\" | \"document\" | \"sticker\";\n    /** Public URL — Meta downloads and sends. */\n    link?: string;\n    /** Pre-uploaded media ID from `uploadMedia`. */\n    mediaId?: string;\n    /** Caption (image/video/document only). */\n    caption?: string;\n    /** Filename hint (document only). */\n    filename?: string;\n  }): Promise<SendResult> {\n    if (!params.link && !params.mediaId) {\n      throw new Error(\"sendMedia requires either `link` or `mediaId`\");\n    }\n    const recipient = normalizeArPhone(params.to);\n    const mediaPayload: Record<string, unknown> = {};\n    if (params.mediaId) mediaPayload.id = params.mediaId;\n    if (params.link) mediaPayload.link = params.link;\n    if (params.caption && params.type !== \"audio\" && params.type !== \"sticker\") {\n      mediaPayload.caption = params.caption;\n    }\n    if (params.filename && params.type === \"document\") {\n      mediaPayload.filename = params.filename;\n    }\n    const body = {\n      messaging_product: \"whatsapp\",\n      to: recipient,\n      type: params.type,\n      [params.type]: mediaPayload,\n    };\n    const res = await this.postMessages(body);\n    return this.toSendResult(res, recipient);\n  }\n\n  /**\n   * Send an interactive message: buttons (up to 3 reply buttons) or a list\n   * picker (sectioned menu). Useful for confirming actions in chat without\n   * forcing the user to type.\n   */\n  async sendInteractive(params: {\n    to: WhatsAppRecipient;\n    bodyText: string;\n    headerText?: string;\n    footerText?: string;\n    /** Choose buttons OR list, not both. */\n    buttons?: Array<{ id: string; title: string }>;\n    list?: {\n      buttonText: string;\n      sections: Array<{\n        title?: string;\n        rows: Array<{ id: string; title: string; description?: string }>;\n      }>;\n    };\n  }): Promise<SendResult> {\n    const recipient = normalizeArPhone(params.to);\n    if (!params.buttons && !params.list) {\n      throw new Error(\"sendInteractive requires either `buttons` or `list`\");\n    }\n    if (params.buttons && params.list) {\n      throw new Error(\"sendInteractive: pass `buttons` OR `list`, not both\");\n    }\n    const interactive: Record<string, unknown> = {\n      type: params.buttons ? \"button\" : \"list\",\n      body: { text: params.bodyText },\n    };\n    if (params.headerText) {\n      interactive.header = { type: \"text\", text: params.headerText };\n    }\n    if (params.footerText) {\n      interactive.footer = { text: params.footerText };\n    }\n    if (params.buttons) {\n      interactive.action = {\n        buttons: params.buttons.map((b) => ({\n          type: \"reply\",\n          reply: { id: b.id, title: b.title },\n        })),\n      };\n    }\n    if (params.list) {\n      interactive.action = {\n        button: params.list.buttonText,\n        sections: params.list.sections,\n      };\n    }\n    const body = {\n      messaging_product: \"whatsapp\",\n      to: recipient,\n      type: \"interactive\",\n      interactive,\n    };\n    const res = await this.postMessages(body);\n    return this.toSendResult(res, recipient);\n  }\n\n  /**\n   * Mark an inbound message as read (sends the blue double-check). Call this\n   * from your webhook handler when you process the user's message.\n   */\n  async markAsRead(messageId: string): Promise<void> {\n    await this.postMessages({\n      messaging_product: \"whatsapp\",\n      status: \"read\",\n      message_id: messageId,\n    });\n  }\n\n  /**\n   * Download a media file the user sent. Two-step: GET the media metadata\n   * (returns a URL valid for ~5 minutes), then GET the URL with auth.\n   */\n  async downloadMedia(mediaId: string): Promise<{\n    bytes: ArrayBuffer;\n    mimeType: string | null;\n    filename: string | null;\n    sha256: string | null;\n  }> {\n    const metaUrl = `${this.baseUrl}/${this.apiVersion}/${mediaId}`;\n    const metaRes = await this.fetchWithRetry(\n      metaUrl,\n      { headers: { Authorization: `Bearer ${this.accessToken}` } },\n      `/${this.apiVersion}/${mediaId}`,\n    );\n    if (!metaRes.ok) {\n      const text = await metaRes.text();\n      throw await this.toApiError(text, metaRes.status, \"downloadMedia metadata\");\n    }\n    const meta = (await metaRes.json()) as {\n      url: string;\n      mime_type?: string;\n      sha256?: string;\n      file_size?: number;\n    };\n    const fileRes = await this.fetchWithRetry(\n      meta.url,\n      { headers: { Authorization: `Bearer ${this.accessToken}` } },\n      `media-download`,\n    );\n    if (!fileRes.ok) {\n      const text = await fileRes.text();\n      throw await this.toApiError(text, fileRes.status, \"downloadMedia binary\");\n    }\n    const bytes = await fileRes.arrayBuffer();\n    return {\n      bytes,\n      mimeType: meta.mime_type ?? null,\n      filename: null,\n      sha256: meta.sha256 ?? null,\n    };\n  }\n\n  /**\n   * Internal: POST to /{phoneNumberId}/messages. Throws typed errors on 4xx.\n   * Uses fetchWithRetry with retries DISABLED: `POST /messages` is not\n   * idempotent and Meta exposes no idempotency key, so a retry after a timeout\n   * or 5xx could deliver the same message twice. Better to surface the error\n   * and let the caller decide than to risk a duplicate send.\n   */\n  private async postMessages(body: Record<string, unknown>): Promise<{\n    messaging_product: string;\n    contacts?: Array<{ input: string; wa_id: string }>;\n    messages?: Array<{ id: string }>;\n  }> {\n    const url = `${this.baseUrl}/${this.apiVersion}/${this.phoneNumberId}/messages`;\n    const res = await this.fetchWithRetry(\n      url,\n      {\n        method: \"POST\",\n        headers: {\n          Authorization: `Bearer ${this.accessToken}`,\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify(body),\n      },\n      `/${this.apiVersion}/${this.phoneNumberId}/messages`,\n      { retry: false },\n    );\n    const text = await res.text();\n    if (!res.ok) {\n      throw await this.toApiError(text, res.status, \"postMessages\");\n    }\n    try {\n      return JSON.parse(text);\n    } catch {\n      throw new WhatsAppApiError(\n        `Meta returned non-JSON success response: ${text.slice(0, 200)}`,\n        0,\n        res.status,\n      );\n    }\n  }\n\n  private async toApiError(\n    body: string,\n    httpStatus: number,\n    context: string,\n  ): Promise<WhatsAppApiError> {\n    let parsed: {\n      error?: {\n        message?: string;\n        code?: number;\n        error_subcode?: number;\n        fbtrace_id?: string;\n      };\n    } = {};\n    try {\n      parsed = JSON.parse(body);\n    } catch {\n      return new WhatsAppApiError(\n        `Meta returned ${httpStatus} (${context}) with non-JSON body: ${body.slice(0, 200)}`,\n        0,\n        httpStatus,\n      );\n    }\n    const err = parsed.error ?? {};\n    const code = err.code ?? 0;\n    const message = err.message ?? `Meta returned ${httpStatus}`;\n    const fbtraceId = err.fbtrace_id;\n\n    if (code === 131009) {\n      return new WhatsAppRecipientNotOnPlatformError(message, fbtraceId);\n    }\n    if (code === 131026 || code === 131047) {\n      return new WhatsAppOutsideWindowError(message, fbtraceId);\n    }\n    return new WhatsAppApiError(\n      `${context} failed: ${message}`,\n      code,\n      httpStatus,\n      err.error_subcode,\n      fbtraceId,\n    );\n  }\n\n  private toSendResult(\n    res: {\n      contacts?: Array<{ wa_id: string }>;\n      messages?: Array<{ id: string }>;\n    },\n    recipient: string,\n  ): SendResult {\n    const messageId = res.messages?.[0]?.id;\n    if (!messageId) {\n      throw new WhatsAppApiError(\n        `Meta accepted the request but returned no message ID. Response: ${JSON.stringify(res).slice(0, 200)}`,\n        0,\n        200,\n      );\n    }\n    return { messageId, recipient };\n  }\n}\n","import { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport type { WhatsAppClient } from \"./client\";\n\n/**\n * Build the WhatsApp tool set for a Vercel AI SDK agent.\n *\n * Wires the methods of `WhatsAppClient` into named, schema-validated tools\n * that the LLM can invoke. The tool descriptions are written for the LLM -\n * they explain when to use each tool and when NOT to.\n *\n * # Scoped mode (recommended for webhook handlers)\n *\n * Pass `options.scopedTo: senderPhone` to bind every outbound message to the\n * inbound sender. The `to` parameter is REMOVED from the tool schemas so the\n * LLM cannot message a different number. This prevents agent-hijacking\n * scenarios where a crafted inbound message tricks the agent into spamming\n * arbitrary recipients (security audit finding /cso F5).\n *\n * # Unscoped mode\n *\n * Without `scopedTo`, tools accept arbitrary `to` arguments. Suitable for\n * batch/proactive flows where the agent is sending notifications to a list\n * of recipients you control.\n *\n * @example Scoped (webhook handler, recommended)\n * ```ts\n * import { whatsappTools, WhatsAppClient } from \"@ar-agents/whatsapp\";\n *\n * const wa = new WhatsAppClient({ ... });\n * const event = parseWebhookEvent(payload);\n *\n * // All send_* tools auto-bind `to` to event.from. LLM cannot override.\n * const tools = whatsappTools(wa, { scopedTo: event.from });\n * ```\n *\n * @example Unscoped (batch / outbound)\n * ```ts\n * const tools = whatsappTools(wa);\n * // LLM provides `to` per-call.\n * ```\n */\nexport function whatsappTools(\n  client: WhatsAppClient,\n  options: WhatsAppToolsOptions = {},\n): ToolSet {\n  const { scopedTo } = options;\n\n  if (scopedTo) {\n    return buildScopedTools(client, scopedTo);\n  }\n  return buildUnscopedTools(client);\n}\n\nexport interface WhatsAppToolsOptions {\n  /**\n   * Bind every outbound `send_*` tool to this single recipient phone. The\n   * `to` parameter is removed from tool schemas, the LLM cannot specify a\n   * different recipient. Use in webhook handlers to prevent agent hijacking.\n   *\n   * AR phone formats accepted: `+54 9 11 1234-5678`, `549112345678`, etc.\n   */\n  scopedTo?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Unscoped tools, LLM provides `to` per-call (batch / proactive flows).\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction buildUnscopedTools(client: WhatsAppClient) {\n  return {\n    send_whatsapp_text: tool({\n      description: `Send a free-form WhatsApp text message (enviar mensaje de WhatsApp, mandar un WhatsApp). Use for replies INSIDE the 24-hour customer service window (after the user has messaged you within the last 24h). For proactive messages outside that window, use send_whatsapp_template instead, free-form will fail with code 131026.\n\nReturns: { messageId, recipient } on success. Throws WhatsAppApiError on failure (network, invalid recipient, outside-window).\n\nThe recipient phone is auto-normalized (handles +54 9 11 ..., 011 ..., etc.).`,\n      inputSchema: z.object({\n        to: z\n          .string()\n          .describe(\"Recipient phone (any AR format accepted: +54 9 11 1234-5678, 011 1234-5678, etc.)\"),\n        text: z.string().min(1).max(4096).describe(\"Message body (max 4096 chars)\"),\n        previewUrl: z\n          .boolean()\n          .optional()\n          .describe(\"Render link previews in the message. Default true.\"),\n        contextMessageId: z\n          .string()\n          .optional()\n          .describe(\"wamid of the message to thread-reply to (creates a quoted reply).\"),\n      }),\n      execute: async (input) => {\n        return await client.sendText({\n          to: input.to,\n          text: input.text,\n          ...(input.previewUrl !== undefined ? { previewUrl: input.previewUrl } : {}),\n          ...(input.contextMessageId !== undefined ? { contextMessageId: input.contextMessageId } : {}),\n        });\n      },\n    }),\n\n    send_whatsapp_template: tool({\n      description: `Send an APPROVED WhatsApp template message (enviar plantilla de WhatsApp). Required for any message OUTSIDE the 24-hour customer service window, i.e. proactive notifications, transactional updates, marketing, re-engagement.\n\nTemplates must be created and approved by Meta first. The template name MUST match exactly what's registered in Meta Business Suite. The bodyParams array fills the {{1}}, {{2}}, ... placeholders in the template body, in order.\n\nCommon AR languages: \"es_AR\" (default), \"es\", \"en_US\".\n\nReturns: { messageId, recipient }. Throws if template doesn't exist, params don't match, or recipient is invalid.`,\n      inputSchema: z.object({\n        to: z.string().describe(\"Recipient phone (any AR format accepted).\"),\n        templateName: z\n          .string()\n          .describe(\"Exact template name as registered in Meta Business Suite.\"),\n        languageCode: z\n          .string()\n          .optional()\n          .describe('Language code, default \"es_AR\".'),\n        bodyParams: z\n          .array(z.string())\n          .optional()\n          .describe(\n            \"Positional params for the template body, fills {{1}}, {{2}}, etc. in order.\",\n          ),\n      }),\n      execute: async (input) => {\n        return await client.sendTemplate({\n          to: input.to,\n          templateName: input.templateName,\n          ...(input.languageCode !== undefined ? { languageCode: input.languageCode } : {}),\n          ...(input.bodyParams !== undefined ? { bodyParams: input.bodyParams } : {}),\n        });\n      },\n    }),\n\n    send_whatsapp_media: tool({\n      description: `Send a WhatsApp media attachment (enviar imagen, audio, video o documento por WhatsApp). Provide either a public URL (link, faster, Meta downloads) or a pre-uploaded media ID.\n\nWhatsApp media size limits: image 5MB, audio 16MB, video 16MB, document 100MB, sticker 100KB.\n\nSubject to the same 24-hour customer service window as send_whatsapp_text, outside the window use a template with a media header.\n\nReturns: { messageId, recipient }.`,\n      inputSchema: z.object({\n        to: z.string().describe(\"Recipient phone.\"),\n        type: z.enum([\"image\", \"audio\", \"video\", \"document\", \"sticker\"]),\n        link: z\n          .string()\n          .url()\n          .optional()\n          .describe(\"Public URL Meta can fetch.\"),\n        mediaId: z\n          .string()\n          .optional()\n          .describe(\"Pre-uploaded media ID (alternative to link).\"),\n        caption: z\n          .string()\n          .max(1024)\n          .optional()\n          .describe(\"Caption for image/video/document. Ignored for audio/sticker.\"),\n        filename: z\n          .string()\n          .optional()\n          .describe(\"Filename hint for document type only.\"),\n      }),\n      execute: async (input) => {\n        return await client.sendMedia({\n          to: input.to,\n          type: input.type,\n          ...(input.link !== undefined ? { link: input.link } : {}),\n          ...(input.mediaId !== undefined ? { mediaId: input.mediaId } : {}),\n          ...(input.caption !== undefined ? { caption: input.caption } : {}),\n          ...(input.filename !== undefined ? { filename: input.filename } : {}),\n        });\n      },\n    }),\n\n    send_whatsapp_buttons: tool({\n      description: `Send a WhatsApp message with up to 3 reply buttons (botones de respuesta rápida). The user taps a button and you receive an interactive.button_reply event in the webhook. Useful for confirmations like \"Sí / No / Cambiar\".\n\nUse for SHORT decisions in chat. For longer menus (4-10 options grouped into sections), use send_whatsapp_list.\n\nEach button has an id (you choose, used to identify the response in the webhook) and a title (max 20 chars, shown on the button).`,\n      inputSchema: z.object({\n        to: z.string(),\n        bodyText: z.string().min(1).max(1024),\n        headerText: z.string().max(60).optional(),\n        footerText: z.string().max(60).optional(),\n        buttons: z\n          .array(\n            z.object({\n              id: z.string().min(1).max(256),\n              title: z.string().min(1).max(20),\n            }),\n          )\n          .min(1)\n          .max(3),\n      }),\n      execute: async (input) => {\n        return await client.sendInteractive({\n          to: input.to,\n          bodyText: input.bodyText,\n          ...(input.headerText !== undefined ? { headerText: input.headerText } : {}),\n          ...(input.footerText !== undefined ? { footerText: input.footerText } : {}),\n          buttons: input.buttons,\n        });\n      },\n    }),\n\n    send_whatsapp_list: tool({\n      description: `Send a WhatsApp list-picker menu (menú de lista de WhatsApp), a button that opens a sectioned list of options. The user picks one and you receive an interactive.list_reply event.\n\nUse for menus with 4+ options or when grouping options helps (e.g., \"Plan Básico / Pro / Enterprise\" sections by tier).\n\nEach row has id (used in webhook), title (24 chars max), optional description (72 chars max).`,\n      inputSchema: z.object({\n        to: z.string(),\n        bodyText: z.string().min(1).max(1024),\n        headerText: z.string().max(60).optional(),\n        footerText: z.string().max(60).optional(),\n        buttonText: z\n          .string()\n          .min(1)\n          .max(20)\n          .describe('Label of the button that opens the list, e.g. \"Ver opciones\"'),\n        sections: z\n          .array(\n            z.object({\n              title: z.string().max(24).optional(),\n              rows: z\n                .array(\n                  z.object({\n                    id: z.string().min(1).max(200),\n                    title: z.string().min(1).max(24),\n                    description: z.string().max(72).optional(),\n                  }),\n                )\n                .min(1)\n                .max(10),\n            }),\n          )\n          .min(1)\n          .max(10),\n      }),\n      execute: async (input) => {\n        return await client.sendInteractive({\n          to: input.to,\n          bodyText: input.bodyText,\n          ...(input.headerText !== undefined ? { headerText: input.headerText } : {}),\n          ...(input.footerText !== undefined ? { footerText: input.footerText } : {}),\n          list: {\n            buttonText: input.buttonText,\n            sections: input.sections.map((s) => ({\n              ...(s.title !== undefined ? { title: s.title } : {}),\n              rows: s.rows.map((r) => ({\n                id: r.id,\n                title: r.title,\n                ...(r.description !== undefined ? { description: r.description } : {}),\n              })),\n            })),\n          },\n        });\n      },\n    }),\n\n    mark_whatsapp_read: tool({\n      description: `Mark an inbound WhatsApp message as read (marcar como leído, the blue double-check). Call this from your webhook handler immediately when you process a user message, the user sees the read receipt and knows the agent received the message even if the response takes a few seconds.\n\nPass the messageId (wamid) from the inbound webhook event.`,\n      inputSchema: z.object({\n        messageId: z\n          .string()\n          .describe(\"wamid of the inbound message to mark as read.\"),\n      }),\n      execute: async ({ messageId }) => {\n        await client.markAsRead(messageId);\n        return { ok: true, messageId };\n      },\n    }),\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Scoped tools, `to` is removed from schemas; bound to a single sender.\n// Use in webhook handlers. Prevents agent hijacking via prompt injection.\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction buildScopedTools(client: WhatsAppClient, scopedTo: string) {\n  const SCOPE_NOTE = `\\n\\nThis tool is BOUND to recipient ${scopedTo} (the original WhatsApp sender). You cannot message a different number, that parameter has been removed from the schema. If the user asks you to message someone else, decline politely.`;\n\n  return {\n    send_whatsapp_text: tool({\n      description:\n        `Send a free-form WhatsApp text reply (responder por WhatsApp) to the conversation owner. Use for replies INSIDE the 24-hour customer service window. For proactive messages outside that window, use send_whatsapp_template instead, free-form will fail with code 131026.\n\nReturns: { messageId, recipient }. Throws WhatsAppApiError on failure.` + SCOPE_NOTE,\n      inputSchema: z.object({\n        text: z.string().min(1).max(4096).describe(\"Message body (max 4096 chars)\"),\n        previewUrl: z\n          .boolean()\n          .optional()\n          .describe(\"Render link previews. Default true.\"),\n        contextMessageId: z\n          .string()\n          .optional()\n          .describe(\"wamid to thread-reply to.\"),\n      }),\n      execute: async (input) => {\n        return await client.sendText({\n          to: scopedTo,\n          text: input.text,\n          ...(input.previewUrl !== undefined ? { previewUrl: input.previewUrl } : {}),\n          ...(input.contextMessageId !== undefined ? { contextMessageId: input.contextMessageId } : {}),\n        });\n      },\n    }),\n\n    send_whatsapp_template: tool({\n      description:\n        `Send an APPROVED WhatsApp template message to the conversation owner (enviar plantilla de WhatsApp). Required for any message OUTSIDE the 24-hour customer service window.\n\nTemplates must be approved by Meta first. The bodyParams array fills the {{1}}, {{2}}, ... placeholders in order.\n\nReturns: { messageId, recipient }.` + SCOPE_NOTE,\n      inputSchema: z.object({\n        templateName: z.string().describe(\"Exact name as in Meta Business Suite.\"),\n        languageCode: z.string().optional().describe('Default \"es_AR\".'),\n        bodyParams: z\n          .array(z.string())\n          .optional()\n          .describe(\"Fills {{1}}, {{2}}, ... in order.\"),\n      }),\n      execute: async (input) => {\n        return await client.sendTemplate({\n          to: scopedTo,\n          templateName: input.templateName,\n          ...(input.languageCode !== undefined ? { languageCode: input.languageCode } : {}),\n          ...(input.bodyParams !== undefined ? { bodyParams: input.bodyParams } : {}),\n        });\n      },\n    }),\n\n    send_whatsapp_media: tool({\n      description:\n        `Send a WhatsApp media attachment to the conversation owner (enviar imagen, audio, video o documento). Provide either a public URL or a pre-uploaded media ID.\n\nSize limits: image 5MB, audio 16MB, video 16MB, document 100MB, sticker 100KB.` + SCOPE_NOTE,\n      inputSchema: z.object({\n        type: z.enum([\"image\", \"audio\", \"video\", \"document\", \"sticker\"]),\n        link: z.string().url().optional(),\n        mediaId: z.string().optional(),\n        caption: z.string().max(1024).optional(),\n        filename: z.string().optional(),\n      }),\n      execute: async (input) => {\n        return await client.sendMedia({\n          to: scopedTo,\n          type: input.type,\n          ...(input.link !== undefined ? { link: input.link } : {}),\n          ...(input.mediaId !== undefined ? { mediaId: input.mediaId } : {}),\n          ...(input.caption !== undefined ? { caption: input.caption } : {}),\n          ...(input.filename !== undefined ? { filename: input.filename } : {}),\n        });\n      },\n    }),\n\n    send_whatsapp_buttons: tool({\n      description:\n        `Send a WhatsApp message with up to 3 reply buttons to the conversation owner (botones de respuesta rápida).` + SCOPE_NOTE,\n      inputSchema: z.object({\n        bodyText: z.string().min(1).max(1024),\n        headerText: z.string().max(60).optional(),\n        footerText: z.string().max(60).optional(),\n        buttons: z\n          .array(\n            z.object({\n              id: z.string().min(1).max(256),\n              title: z.string().min(1).max(20),\n            }),\n          )\n          .min(1)\n          .max(3),\n      }),\n      execute: async (input) => {\n        return await client.sendInteractive({\n          to: scopedTo,\n          bodyText: input.bodyText,\n          ...(input.headerText !== undefined ? { headerText: input.headerText } : {}),\n          ...(input.footerText !== undefined ? { footerText: input.footerText } : {}),\n          buttons: input.buttons,\n        });\n      },\n    }),\n\n    send_whatsapp_list: tool({\n      description:\n        `Send a WhatsApp list-picker menu (menú de lista de WhatsApp) to the conversation owner.` + SCOPE_NOTE,\n      inputSchema: z.object({\n        bodyText: z.string().min(1).max(1024),\n        headerText: z.string().max(60).optional(),\n        footerText: z.string().max(60).optional(),\n        buttonText: z.string().min(1).max(20),\n        sections: z\n          .array(\n            z.object({\n              title: z.string().max(24).optional(),\n              rows: z\n                .array(\n                  z.object({\n                    id: z.string().min(1).max(200),\n                    title: z.string().min(1).max(24),\n                    description: z.string().max(72).optional(),\n                  }),\n                )\n                .min(1)\n                .max(10),\n            }),\n          )\n          .min(1)\n          .max(10),\n      }),\n      execute: async (input) => {\n        return await client.sendInteractive({\n          to: scopedTo,\n          bodyText: input.bodyText,\n          ...(input.headerText !== undefined ? { headerText: input.headerText } : {}),\n          ...(input.footerText !== undefined ? { footerText: input.footerText } : {}),\n          list: {\n            buttonText: input.buttonText,\n            sections: input.sections.map((s) => ({\n              ...(s.title !== undefined ? { title: s.title } : {}),\n              rows: s.rows.map((r) => ({\n                id: r.id,\n                title: r.title,\n                ...(r.description !== undefined ? { description: r.description } : {}),\n              })),\n            })),\n          },\n        });\n      },\n    }),\n\n    mark_whatsapp_read: tool({\n      description: `Mark an inbound WhatsApp message as read (marcar como leído, the blue double-check).`,\n      inputSchema: z.object({\n        messageId: z.string().describe(\"wamid of the inbound message.\"),\n      }),\n      execute: async ({ messageId }) => {\n        await client.markAsRead(messageId);\n        return { ok: true, messageId };\n      },\n    }),\n  };\n}\n\nexport type WhatsAppToolSet = ReturnType<typeof whatsappTools>;\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WhatsAppWebhookSignatureError } from \"./errors\";\nimport type { WebhookEvent } from \"./types\";\n\n/**\n * Verify the GET handshake Meta sends when you first subscribe a webhook URL.\n * Meta calls your endpoint with `?hub.mode=subscribe&hub.verify_token=X&hub.challenge=Y`.\n * You must return `hub.challenge` as plain text IF the token matches.\n *\n * @example\n * ```ts\n * // GET /api/whatsapp/webhook\n * const challenge = verifyWebhookSubscription(\n *   Object.fromEntries(new URL(req.url).searchParams),\n *   process.env.WA_WEBHOOK_VERIFY_TOKEN!,\n * );\n * if (challenge !== null) return new Response(challenge);\n * return new Response(\"Forbidden\", { status: 403 });\n * ```\n *\n * Returns the challenge string to echo back, or null if the request should\n * be rejected with 403.\n */\nexport function verifyWebhookSubscription(\n  query: Record<string, string | string[] | undefined>,\n  expectedToken: string,\n): string | null {\n  const mode = singleValue(query[\"hub.mode\"]);\n  const token = singleValue(query[\"hub.verify_token\"]);\n  const challenge = singleValue(query[\"hub.challenge\"]);\n  if (mode === \"subscribe\" && token === expectedToken && typeof challenge === \"string\") {\n    return challenge;\n  }\n  return null;\n}\n\nfunction singleValue(v: string | string[] | undefined): string | undefined {\n  if (Array.isArray(v)) return v[0];\n  return v;\n}\n\n/**\n * Verify the X-Hub-Signature-256 header on POST webhooks. Meta signs the raw\n * request body with HMAC-SHA256 using your app secret.\n *\n * **Pass the RAW body** — not the parsed JSON. If you've already parsed,\n * `JSON.stringify(parsed)` will not match the signature because key ordering\n * and whitespace differ. Use `req.text()` (Web standard) or `req.rawBody`\n * (Express) before parsing.\n *\n * Throws `WhatsAppWebhookSignatureError` if invalid. Catch and return 401.\n *\n * @example\n * ```ts\n * const raw = await req.text();\n * verifyWebhookSignature(\n *   raw,\n *   req.headers.get(\"x-hub-signature-256\") ?? \"\",\n *   process.env.META_APP_SECRET!,\n * );\n * const event = parseWebhookEvent(JSON.parse(raw));\n * ```\n */\nexport function verifyWebhookSignature(\n  rawBody: string,\n  signatureHeader: string,\n  appSecret: string,\n): void {\n  const expected =\n    \"sha256=\" + createHmac(\"sha256\", appSecret).update(rawBody, \"utf8\").digest(\"hex\");\n  // Constant-time compare to defang timing attacks.\n  const expectedBuf = Buffer.from(expected, \"utf8\");\n  const actualBuf = Buffer.from(signatureHeader, \"utf8\");\n  if (\n    expectedBuf.length !== actualBuf.length ||\n    !timingSafeEqual(expectedBuf, actualBuf)\n  ) {\n    throw new WhatsAppWebhookSignatureError(\n      \"X-Hub-Signature-256 mismatch — request is not from Meta or app secret is wrong\",\n    );\n  }\n}\n\n/**\n * Parse Meta's nested webhook envelope into a normalized `WebhookEvent`.\n *\n * # Meta's envelope shape\n *\n * Meta wraps EVERYTHING in a deeply nested structure. A single inbound\n * message looks like:\n *\n * ```\n * { object: \"whatsapp_business_account\",\n *   entry: [{ id: \"...\", changes: [{\n *     field: \"messages\",\n *     value: {\n *       messaging_product: \"whatsapp\",\n *       metadata: { phone_number_id: \"...\", display_phone_number: \"...\" },\n *       contacts: [{ profile: { name: \"Lautaro\" }, wa_id: \"5491112345678\" }],\n *       messages: [{ from: \"5491112345678\", id: \"wamid....\", timestamp: \"...\",\n *                    type: \"text\", text: { body: \"...\" } }]\n *     }\n *   }]}]\n * }\n * ```\n *\n * This function flattens that into one `WebhookEvent` per actual message or\n * status update. A single Meta payload can contain MULTIPLE events — see\n * `parseWebhookEvents` (plural) if you need them all.\n *\n * Returns the FIRST event in the payload (most webhooks deliver one event\n * per request). Use `parseWebhookEvents` for batches.\n */\nexport function parseWebhookEvent(payload: unknown): WebhookEvent {\n  const events = parseWebhookEvents(payload);\n  return events[0] ?? { kind: \"unknown\", raw: payload };\n}\n\n/**\n * Parse Meta's webhook envelope into ALL contained events. Meta can batch\n * status updates — you might get 3 status events in one POST.\n */\nexport function parseWebhookEvents(payload: unknown): WebhookEvent[] {\n  const events: WebhookEvent[] = [];\n  const obj = payload as Record<string, unknown>;\n  if (!obj || typeof obj !== \"object\") {\n    return [{ kind: \"unknown\", raw: payload }];\n  }\n  const entries = Array.isArray(obj.entry) ? obj.entry : [];\n  for (const entry of entries) {\n    const entryObj = entry as Record<string, unknown>;\n    const changes = Array.isArray(entryObj.changes) ? entryObj.changes : [];\n    for (const change of changes) {\n      const changeObj = change as Record<string, unknown>;\n      if (changeObj.field !== \"messages\") continue;\n      const value = changeObj.value as Record<string, unknown> | undefined;\n      if (!value) continue;\n\n      const phoneNumberId =\n        ((value.metadata as Record<string, unknown> | undefined)?.phone_number_id as string) ??\n        \"\";\n\n      // Inbound messages\n      const messages = Array.isArray(value.messages) ? value.messages : [];\n      const contacts = Array.isArray(value.contacts) ? value.contacts : [];\n      for (const m of messages) {\n        events.push(buildMessageEvent(m, contacts, phoneNumberId));\n      }\n\n      // Status updates\n      const statuses = Array.isArray(value.statuses) ? value.statuses : [];\n      for (const s of statuses) {\n        events.push(buildStatusEvent(s, phoneNumberId));\n      }\n    }\n  }\n  return events;\n}\n\nfunction buildMessageEvent(\n  raw: unknown,\n  contacts: unknown[],\n  phoneNumberId: string,\n): WebhookEvent {\n  const m = raw as Record<string, unknown>;\n  const from = (m.from as string) ?? \"\";\n  const fromName =\n    ((contacts.find(\n      (c) => (c as Record<string, unknown>).wa_id === from,\n    ) as Record<string, unknown> | undefined)?.profile as\n      | Record<string, unknown>\n      | undefined)?.name as string | undefined;\n\n  const messageId = (m.id as string) ?? \"\";\n  const timestamp = (m.timestamp as string) ?? \"\";\n  const contextMessageId =\n    ((m.context as Record<string, unknown> | undefined)?.id as string) ?? null;\n\n  const type = m.type as string;\n  let message: ReturnType<typeof buildMessageBody>;\n  try {\n    message = buildMessageBody(type, m);\n  } catch {\n    message = { type: \"unsupported\", raw: m };\n  }\n\n  return {\n    kind: \"message\",\n    phoneNumberId,\n    from,\n    fromName: fromName ?? null,\n    messageId,\n    timestamp,\n    message,\n    contextMessageId,\n  };\n}\n\ntype MessageBody = Extract<WebhookEvent, { kind: \"message\" }>[\"message\"];\n\nfunction buildMessageBody(type: string, m: Record<string, unknown>): MessageBody {\n  switch (type) {\n    case \"text\": {\n      const text = (m.text as Record<string, unknown> | undefined)?.body as string;\n      return { type: \"text\", text: text ?? \"\" };\n    }\n    case \"image\": {\n      const img = m.image as Record<string, unknown> | undefined;\n      return {\n        type: \"image\",\n        mediaId: (img?.id as string) ?? \"\",\n        caption: (img?.caption as string) ?? null,\n        mimeType: (img?.mime_type as string) ?? null,\n      };\n    }\n    case \"audio\": {\n      const a = m.audio as Record<string, unknown> | undefined;\n      return {\n        type: \"audio\",\n        mediaId: (a?.id as string) ?? \"\",\n        mimeType: (a?.mime_type as string) ?? null,\n        voice: Boolean(a?.voice),\n      };\n    }\n    case \"video\": {\n      const v = m.video as Record<string, unknown> | undefined;\n      return {\n        type: \"video\",\n        mediaId: (v?.id as string) ?? \"\",\n        caption: (v?.caption as string) ?? null,\n        mimeType: (v?.mime_type as string) ?? null,\n      };\n    }\n    case \"document\": {\n      const d = m.document as Record<string, unknown> | undefined;\n      return {\n        type: \"document\",\n        mediaId: (d?.id as string) ?? \"\",\n        filename: (d?.filename as string) ?? null,\n        mimeType: (d?.mime_type as string) ?? null,\n      };\n    }\n    case \"location\": {\n      const l = m.location as Record<string, unknown> | undefined;\n      return {\n        type: \"location\",\n        latitude: Number(l?.latitude ?? 0),\n        longitude: Number(l?.longitude ?? 0),\n        name: (l?.name as string) ?? null,\n        address: (l?.address as string) ?? null,\n      };\n    }\n    case \"contacts\": {\n      return { type: \"contacts\", raw: m.contacts };\n    }\n    case \"interactive\": {\n      const i = m.interactive as Record<string, unknown> | undefined;\n      const subtype = i?.type as string;\n      if (subtype === \"button_reply\") {\n        const r = i?.button_reply as Record<string, unknown> | undefined;\n        return {\n          type: \"interactive\",\n          subtype: \"button_reply\",\n          id: (r?.id as string) ?? \"\",\n          title: (r?.title as string) ?? \"\",\n        };\n      }\n      if (subtype === \"list_reply\") {\n        const r = i?.list_reply as Record<string, unknown> | undefined;\n        return {\n          type: \"interactive\",\n          subtype: \"list_reply\",\n          id: (r?.id as string) ?? \"\",\n          title: (r?.title as string) ?? \"\",\n        };\n      }\n      return { type: \"unsupported\", raw: m };\n    }\n    case \"button\": {\n      const b = m.button as Record<string, unknown> | undefined;\n      return {\n        type: \"button\",\n        payload: (b?.payload as string) ?? \"\",\n        text: (b?.text as string) ?? \"\",\n      };\n    }\n    case \"reaction\": {\n      const r = m.reaction as Record<string, unknown> | undefined;\n      return {\n        type: \"reaction\",\n        emoji: (r?.emoji as string) ?? \"\",\n        targetMessageId: (r?.message_id as string) ?? \"\",\n      };\n    }\n    default:\n      return { type: \"unsupported\", raw: m };\n  }\n}\n\nfunction buildStatusEvent(raw: unknown, phoneNumberId: string): WebhookEvent {\n  const s = raw as Record<string, unknown>;\n  const errorsRaw = Array.isArray(s.errors) ? s.errors : [];\n  const errors = errorsRaw.map((e) => {\n    const eo = e as Record<string, unknown>;\n    return {\n      code: Number(eo.code ?? 0),\n      title: (eo.title as string) ?? \"\",\n      details: (eo.message as string) ?? (eo.error_data as string) ?? null,\n    };\n  });\n  return {\n    kind: \"status\",\n    phoneNumberId,\n    messageId: (s.id as string) ?? \"\",\n    status: (s.status as \"sent\" | \"delivered\" | \"read\" | \"failed\" | \"warning\") ?? \"sent\",\n    recipient: (s.recipient_id as string) ?? \"\",\n    timestamp: (s.timestamp as string) ?? \"\",\n    errors,\n  };\n}\n"]}