@ar-agents/mercadopago 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +10 -1
- package/CHANGELOG.md +89 -0
- package/README.md +64 -2
- package/cookbook/01-checkout-pro-basic.ts +99 -0
- package/cookbook/02-saas-subscription.ts +137 -0
- package/cookbook/03-webhook-handler.ts +162 -0
- package/cookbook/04-marketplace-split.ts +194 -0
- package/cookbook/05-qr-in-store.ts +142 -0
- package/cookbook/06-3ds-challenge.ts +139 -0
- package/cookbook/07-auth-only-order.ts +127 -0
- package/cookbook/08-recovery-patterns.ts +191 -0
- package/cookbook/README.md +36 -0
- package/dist/index.cjs +1039 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +319 -50
- package/dist/index.d.ts +319 -50
- package/dist/index.js +1036 -14
- package/dist/index.js.map +1 -1
- package/dist/state-C6Wzb_XX.d.cts +106 -0
- package/dist/state-C6Wzb_XX.d.ts +106 -0
- package/dist/vercel-kv.cjs +92 -0
- package/dist/vercel-kv.cjs.map +1 -0
- package/dist/vercel-kv.d.cts +107 -0
- package/dist/vercel-kv.d.ts +107 -0
- package/dist/vercel-kv.js +88 -0
- package/dist/vercel-kv.js.map +1 -0
- package/package.json +27 -4
- package/tools.manifest.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/types.ts","../src/oauth.ts","../src/test-cards.ts","../src/three-ds.ts","../src/webhook.ts","../src/tools.ts","../src/state.ts"],"names":["text","z","createHmac","timingSafeEqual","createHash","tool"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base class for any error originating from the Mercado Pago integration. All\n * specific error types extend this. Carries the MP HTTP status, the parsed\n * body when available, and the endpoint that failed for debugging.\n */\nexport class MercadoPagoError extends Error {\n constructor(\n message: string,\n public status: number,\n public endpoint: string,\n public mpResponse?: unknown,\n ) {\n super(message);\n this.name = \"MercadoPagoError\";\n }\n}\n\n/**\n * Thrown when the access token is missing, expired, or rejected by MP.\n */\nexport class MercadoPagoAuthError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the request as unauthorized. Check the access token (TEST- prefix for sandbox, APP_USR- for production).\",\n 401,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAuthError\";\n }\n}\n\n/**\n * Thrown when MP returns the \"back_url is not a valid URL\" rejection. Common\n * when devs pass localhost or http:// — MP requires HTTPS only, even in sandbox.\n */\nexport class MercadoPagoBackUrlInvalidError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"back_url must be a valid HTTPS URL. localhost and http:// URLs are rejected by Mercado Pago, including in sandbox. Use a placeholder like https://example.com/done for local testing.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoBackUrlInvalidError\";\n }\n}\n\n/**\n * Thrown when the buyer email matches the seller account's email. MP refuses\n * self-payment on subscriptions: the Confirmar button at the init_point UI\n * stays disabled with no surfaceable error message.\n */\nexport class MercadoPagoSelfPaymentError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"The buyer email cannot equal the seller account's email. Mercado Pago blocks self-payment on subscriptions.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoSelfPaymentError\";\n }\n}\n\n/**\n * Thrown when MP returns \"Cannot operate between different countries\". Despite\n * the error text, this generally signals an account-type mismatch (real\n * account-in-test-mode vs. test user account), not a literal country mismatch.\n */\nexport class MercadoPagoAccountTypeMismatchError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the operation: 'Cannot operate between different countries'. Despite the wording, this usually means the seller token and the buyer email are different account types (real-account-in-test-mode vs. test_user_*@testuser.com). Use a real consumer email as the buyer.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAccountTypeMismatchError\";\n }\n}\n\n/**\n * Thrown when MP's risk engine rejects the first payment of a subscription.\n * IMPORTANT: when this happens, MP automatically cancels the entire preapproval\n * — you cannot retry on the same subscription, you must create a fresh one.\n */\nexport class MercadoPagoPaymentRejectedError extends MercadoPagoError {\n constructor(\n public preapprovalId: string,\n public statusDetail: string | null,\n body?: unknown,\n ) {\n super(\n `Payment rejected by Mercado Pago risk engine on preapproval ${preapprovalId}. Status detail: ${statusDetail ?? \"unknown\"}. The preapproval was auto-cancelled by MP — create a fresh subscription to retry.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoPaymentRejectedError\";\n }\n}\n\n/**\n * Thrown when an attempt is made to authorize a preapproval via API. Only the\n * payer can authorize via the init_point UI; there is no admin override even\n * in sandbox.\n */\nexport class MercadoPagoAuthorizeForbiddenError extends MercadoPagoError {\n constructor(preapprovalId: string, body?: unknown) {\n super(\n `Cannot authorize preapproval ${preapprovalId} via API: only the payer can authorize through the init_point checkout. There is no API shortcut, even in sandbox.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoAuthorizeForbiddenError\";\n }\n}\n\n/**\n * Thrown when MP rate-limits the integration. Retry with exponential backoff.\n */\nexport class MercadoPagoRateLimitError extends MercadoPagoError {\n constructor(\n endpoint: string,\n public retryAfterSeconds: number | null,\n body?: unknown,\n ) {\n super(\n `Mercado Pago rate limit hit on ${endpoint}. ${\n retryAfterSeconds\n ? `Retry after ${retryAfterSeconds}s.`\n : \"Retry with exponential backoff.\"\n }`,\n 429,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoRateLimitError\";\n }\n}\n\n/**\n * Thrown when MP is overloaded and serves an HTML 503 page instead of a JSON\n * error. The library detects content-type !== application/json on 5xx and\n * raises this typed error so retry logic + agent UX can branch correctly.\n */\nexport class MercadoPagoOverloadedError extends MercadoPagoError {\n constructor(endpoint: string, status: number) {\n super(\n `Mercado Pago appears overloaded — returned a non-JSON ${status} response for ${endpoint}. Wait a few seconds and retry.`,\n status,\n endpoint,\n );\n this.name = \"MercadoPagoOverloadedError\";\n }\n}\n\n/**\n * Thrown when a request exceeds the configured `requestTimeoutMs`. Retried\n * automatically up to `maxRetries`; this surfaces only when the budget runs\n * out.\n */\nexport class MercadoPagoTimeoutError extends MercadoPagoError {\n constructor(endpoint: string, public readonly timeoutMs: number) {\n super(\n `Mercado Pago request timed out after ${timeoutMs}ms on ${endpoint}. Increase requestTimeoutMs or check connectivity.`,\n 0,\n endpoint,\n );\n this.name = \"MercadoPagoTimeoutError\";\n }\n}\n\n/**\n * Maps an MP error response body to the most specific known error class. Falls\n * back to the generic MercadoPagoError when no specific pattern matches.\n */\nexport function classifyError(\n status: number,\n endpoint: string,\n body: unknown,\n context?: { preapprovalId?: string; payerEmail?: string; sellerEmail?: string },\n): MercadoPagoError {\n const bodyText =\n typeof body === \"string\"\n ? body\n : body && typeof body === \"object\"\n ? JSON.stringify(body)\n : \"\";\n const lower = bodyText.toLowerCase();\n\n if (status === 401) return new MercadoPagoAuthError(endpoint, body);\n if (status === 429) {\n // Try to extract Retry-After from the body if it includes one.\n let retryAfter: number | null = null;\n const obj = body as { retry_after?: number; \"retry-after\"?: number } | undefined;\n if (obj?.retry_after) retryAfter = Number(obj.retry_after);\n else if (obj?.[\"retry-after\"]) retryAfter = Number(obj[\"retry-after\"]);\n return new MercadoPagoRateLimitError(endpoint, retryAfter, body);\n }\n if (status === 400) {\n if (lower.includes(\"back_url\") && lower.includes(\"not a valid url\")) {\n return new MercadoPagoBackUrlInvalidError(endpoint, body);\n }\n if (\n lower.includes(\"cannot operate\") &&\n lower.includes(\"different countries\")\n ) {\n return new MercadoPagoAccountTypeMismatchError(endpoint, body);\n }\n if (\n lower.includes(\"only the payer can\") &&\n context?.preapprovalId\n ) {\n return new MercadoPagoAuthorizeForbiddenError(context.preapprovalId, body);\n }\n if (\n context?.payerEmail &&\n context?.sellerEmail &&\n context.payerEmail.toLowerCase() === context.sellerEmail.toLowerCase()\n ) {\n return new MercadoPagoSelfPaymentError(endpoint, body);\n }\n }\n return new MercadoPagoError(\n `Mercado Pago ${endpoint} failed: ${status} ${bodyText.slice(0, 200)}`,\n status,\n endpoint,\n body,\n );\n}\n","import { classifyError, MercadoPagoError, MercadoPagoOverloadedError, MercadoPagoRateLimitError, MercadoPagoTimeoutError } from \"./errors\";\nimport type {\n AccountInfo,\n CardToken,\n CreateCardTokenParams,\n CreateCustomerParams,\n CreatePaymentParams,\n CreatePosParams,\n CreatePreapprovalParams,\n CreatePreferenceParams,\n CreateQrPaymentParams,\n CreateRefundParams,\n CreateStoreParams,\n CreateSubscriptionPlanParams,\n AccountBalance,\n AccountMovement,\n CreateOrderParams,\n CreateWebhookParams,\n Customer,\n CustomerCard,\n Dispute,\n IdentificationType,\n InstallmentOffer,\n Issuer,\n Order,\n Payment,\n PaymentMethod,\n PaymentsSearchResult,\n Pos,\n Preapproval,\n Preference,\n QrOrder,\n Refund,\n SearchPaymentsParams,\n Settlement,\n Store,\n SubscriptionPayment,\n SubscriptionPlan,\n WebhookConfig,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.mercadopago.com\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface MercadoPagoClientOptions {\n /** Access token. TEST- prefix for sandbox, APP_USR- for production. */\n accessToken: string;\n /**\n * Override the API base URL. Mostly useful for tests against MSW or for\n * pointing at a regional MP host. Defaults to https://api.mercadopago.com.\n */\n baseUrl?: string;\n /**\n * Custom fetch implementation. Defaults to globalThis.fetch. Override to\n * inject your own retry/instrumentation layer or to test with MSW.\n */\n fetch?: typeof fetch;\n /**\n * Per-request timeout in ms. Aborts the request and throws if exceeded.\n * Default 30_000 (30s). MP can be slow under load; 30s is a safe upper bound.\n */\n requestTimeoutMs?: number;\n /**\n * Number of retries on 5xx + network errors. Default 1 (single retry).\n * 4xx errors are NEVER retried (they're user/config errors). Each retry\n * uses exponential backoff: 250ms, 500ms, 1000ms, ...\n */\n maxRetries?: number;\n /**\n * Observability hook fired AFTER every request (success or failure).\n * Useful for logging, metrics, tracing. Synchronous, fire-and-forget.\n */\n onCall?: (event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void;\n}\n\ninterface RequestOptions {\n /** Idempotency key. Required for POST/PUT to dedupe retries safely. */\n idempotencyKey?: string;\n /** Query string params. Object → URLSearchParams. */\n query?: Record<string, string | number | undefined>;\n /** Context for error classification. */\n classifyContext?: {\n preapprovalId?: string;\n paymentId?: string;\n customerId?: string;\n payerEmail?: string;\n sellerEmail?: string;\n };\n}\n\n/**\n * Thin, typed wrapper around Mercado Pago's REST API. Exposes the surface\n * the agent layer needs: Subscriptions (Preapprovals), Payments, Checkout Pro\n * (Preferences), Customers + saved Cards, Refunds, Payment Methods +\n * Installments, and Account info. Deliberately narrower than a full SDK\n * rebuild — we add endpoints when the agent layer needs them.\n */\nexport class MercadoPagoClient {\n private readonly accessToken: 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:\n | ((event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void)\n | undefined;\n\n constructor(options: MercadoPagoClientOptions) {\n if (!options.accessToken) {\n throw new Error(\n \"MercadoPagoClient requires an accessToken. Get one from https://www.mercadopago.com.ar/developers/panel/credentials\",\n );\n }\n this.accessToken = options.accessToken;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.fetchImpl = options.fetch;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n this.maxRetries = Math.max(0, options.maxRetries ?? 1);\n this.onCall = options.onCall;\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\",\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n };\n if (options?.idempotencyKey) {\n headers[\"X-Idempotency-Key\"] = options.idempotencyKey;\n }\n\n let url = `${this.baseUrl}${path}`;\n if (options?.query) {\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(options.query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n search.set(k, String(v));\n }\n }\n const qs = search.toString();\n if (qs) url += `?${qs}`;\n }\n\n const fetchFn = this.fetchImpl ?? globalThis.fetch;\n const t0 = Date.now();\n let attempt = 0;\n let lastError: unknown;\n let lastStatus: number | null = null;\n\n while (attempt <= this.maxRetries) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n\n const init: RequestInit = { method, headers, signal: controller.signal };\n if (body !== undefined) init.body = JSON.stringify(body);\n\n try {\n const res = await fetchFn(url, init);\n clearTimeout(timer);\n lastStatus = res.status;\n\n if (res.ok) {\n const text = await res.text();\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: true,\n });\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Retry on 5xx and 429 (rate-limit); never on 4xx user/config errors\n const isRetryable = res.status >= 500 || res.status === 429;\n if (isRetryable && attempt < this.maxRetries) {\n // Honor Retry-After header on 429\n const retryAfter = res.headers.get(\"retry-after\");\n const waitMs = retryAfter\n ? Number(retryAfter) * 1000\n : 250 * Math.pow(2, attempt);\n attempt++;\n await sleep(waitMs);\n continue;\n }\n\n // Detect HTML / non-JSON 5xx (MP overloaded)\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (res.status >= 500 && !contentType.includes(\"application/json\")) {\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw new MercadoPagoOverloadedError(path, res.status);\n }\n\n let parsed: unknown;\n const text = await res.text();\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n const err = classifyError(res.status, path, parsed, options?.classifyContext);\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw err;\n } catch (err) {\n clearTimeout(timer);\n // If err is a MercadoPagoError, the 5xx-final / 4xx branch already\n // fired onCall above — don't double-fire. Just re-throw.\n if (err instanceof MercadoPagoError) throw err;\n\n // Network error / abort / parse error — retry if budget remains\n const isAbort = err instanceof Error && err.name === \"AbortError\";\n const isNetwork = !lastStatus && !isAbort;\n if ((isNetwork || isAbort) && attempt < this.maxRetries) {\n lastError = err;\n attempt++;\n await sleep(250 * Math.pow(2, attempt - 1));\n continue;\n }\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: lastStatus,\n retried: attempt,\n success: false,\n });\n if (isAbort) {\n throw new MercadoPagoTimeoutError(path, this.requestTimeoutMs);\n }\n throw err;\n }\n }\n\n throw lastError ?? new Error(`MercadoPago request failed after ${this.maxRetries} retries`);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscriptions (Preapprovals) — v0.1 surface, kept stable\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a recurring subscription (preapproval). The returned `init_point`\n * URL is where the buyer must complete the FIRST payment with their card +\n * CVV — there is no API path that bypasses this human step.\n */\n async createPreapproval(\n params: CreatePreapprovalParams,\n ): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"POST\",\n \"/preapproval\",\n {\n reason: params.reason,\n payer_email: params.payerEmail,\n back_url: params.backUrl,\n external_reference: params.externalReference,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n },\n },\n { classifyContext: { payerEmail: params.payerEmail } },\n );\n }\n\n async getPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\"GET\", `/preapproval/${id}`, undefined, {\n classifyContext: { preapprovalId: id },\n });\n }\n\n async cancelPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async pausePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"paused\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async resumePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"authorized\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment. Two main flows:\n * - **Card payment**: pass `token` (from MP frontend Cardform) + payment_method_id.\n * - **Account money / cash**: omit token, pass payment_method_id like \"account_money\", \"rapipago\", \"pagofacil\".\n *\n * For credit card payments where you don't have a card token (i.e., you only\n * have a payer email and want to send them a payment link), use\n * `createPreference` (Checkout Pro) instead.\n *\n * Idempotency: pass `idempotencyKey` to safely retry. Required for production\n * to dedupe network-failed requests.\n */\n async createPayment(params: CreatePaymentParams): Promise<Payment> {\n const body: Record<string, unknown> = {\n transaction_amount: params.transactionAmount,\n payment_method_id: params.paymentMethodId,\n payer: {\n email: params.payerEmail,\n ...(params.identification ? { identification: params.identification } : {}),\n },\n };\n if (params.installments !== undefined) body.installments = params.installments;\n if (params.token !== undefined) body.token = params.token;\n if (params.description !== undefined) body.description = params.description;\n if (params.externalReference !== undefined) body.external_reference = params.externalReference;\n if (params.notificationUrl !== undefined) body.notification_url = params.notificationUrl;\n if (params.statementDescriptor !== undefined)\n body.statement_descriptor = params.statementDescriptor;\n if (params.capture !== undefined) body.capture = params.capture;\n if (params.additionalInfo !== undefined) body.additional_info = params.additionalInfo;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /** Fetch a payment by ID. */\n async getPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\"GET\", `/v1/payments/${id}`, undefined, {\n classifyContext: { paymentId: id },\n });\n }\n\n /**\n * Search payments with filters. Common: by external_reference (your-system\n * id), by status, by date range. Pagination via offset + limit (max 100).\n */\n async searchPayments(params: SearchPaymentsParams = {}): Promise<PaymentsSearchResult> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.externalReference) query[\"external_reference\"] = params.externalReference;\n if (params.status) query[\"status\"] = params.status as string;\n if (params.payerEmail) query[\"payer.email\"] = params.payerEmail;\n if (params.beginDate) query[\"begin_date\"] = params.beginDate;\n if (params.endDate) query[\"end_date\"] = params.endDate;\n if (params.sort) query[\"sort\"] = params.sort;\n if (params.criteria) query[\"criteria\"] = params.criteria;\n\n return this.request<PaymentsSearchResult>(\n \"GET\",\n \"/v1/payments/search\",\n undefined,\n { query },\n );\n }\n\n /**\n * Capture a previously authorized payment. Only works for credit-card\n * payments created with `capture: false`. Optional partial capture amount.\n */\n async capturePayment(id: string, amount?: number): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n amount !== undefined ? { capture: true, transaction_amount: amount } : { capture: true },\n { classifyContext: { paymentId: id } },\n );\n }\n\n /**\n * Cancel a pending or in_process payment. Once approved, you must use\n * `createRefund` instead.\n */\n async cancelPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { paymentId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Refunds\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Refund a payment fully (omit `amount`) or partially. Idempotency key\n * recommended — refunds can fail mid-flight and you don't want double-refunds\n * on retry.\n */\n async createRefund(params: CreateRefundParams): Promise<Refund> {\n const body = params.amount !== undefined ? { amount: params.amount } : undefined;\n return this.request<Refund>(\n \"POST\",\n `/v1/payments/${params.paymentId}/refunds`,\n body,\n {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { paymentId: params.paymentId },\n },\n );\n }\n\n async listRefunds(paymentId: string): Promise<Refund[]> {\n const res = await this.request<Refund[] | { refunds: Refund[] }>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds`,\n undefined,\n { classifyContext: { paymentId } },\n );\n return Array.isArray(res) ? res : res.refunds ?? [];\n }\n\n async getRefund(paymentId: string, refundId: string): Promise<Refund> {\n return this.request<Refund>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds/${refundId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Checkout Pro (Preferences)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment preference for Checkout Pro. Returns `init_point` URL\n * where the buyer completes payment on MP-hosted form. This is the\n * recommended flow when you don't have a card token (most common path for\n * agents — you don't want to handle PCI data).\n *\n * Sandbox: use `sandbox_init_point` instead of `init_point`.\n */\n async createPreference(params: CreatePreferenceParams): Promise<Preference> {\n const body: Record<string, unknown> = {\n items: params.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: it.currency_id ?? \"ARS\",\n ...(it.description ? { description: it.description } : {}),\n ...(it.picture_url ? { picture_url: it.picture_url } : {}),\n })),\n };\n if (params.payer) body.payer = params.payer;\n if (params.backUrls) body.back_urls = params.backUrls;\n if (params.autoReturn) body.auto_return = params.autoReturn;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.paymentMethods) body.payment_methods = params.paymentMethods;\n if (params.statementDescriptor)\n body.statement_descriptor = params.statementDescriptor;\n if (params.expires !== undefined) body.expires = params.expires;\n if (params.expirationDateFrom) body.expiration_date_from = params.expirationDateFrom;\n if (params.expirationDateTo) body.expiration_date_to = params.expirationDateTo;\n // v0.5 — Marketplace split routing\n if (params.marketplace) body.marketplace = params.marketplace;\n if (params.marketplaceFee !== undefined) body.marketplace_fee = params.marketplaceFee;\n if (params.collectorId !== undefined) body.collector_id = params.collectorId;\n\n return this.request<Preference>(\"POST\", \"/checkout/preferences\", body);\n }\n\n async getPreference(id: string): Promise<Preference> {\n return this.request<Preference>(\"GET\", `/checkout/preferences/${id}`);\n }\n\n async updatePreference(\n id: string,\n patch: Partial<CreatePreferenceParams>,\n ): Promise<Preference> {\n return this.request<Preference>(\"PUT\", `/checkout/preferences/${id}`, patch);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ───────────────────────────────────────────────────────────────────────────\n\n async createCustomer(params: CreateCustomerParams): Promise<Customer> {\n const body: Record<string, unknown> = { email: params.email };\n if (params.firstName) body.first_name = params.firstName;\n if (params.lastName) body.last_name = params.lastName;\n if (params.phone) body.phone = { area_code: params.phone.areaCode, number: params.phone.number };\n if (params.identification) body.identification = params.identification;\n if (params.description) body.description = params.description;\n return this.request<Customer>(\"POST\", \"/v1/customers\", body, {\n classifyContext: { payerEmail: params.email },\n });\n }\n\n async getCustomer(id: string): Promise<Customer> {\n return this.request<Customer>(\"GET\", `/v1/customers/${id}`, undefined, {\n classifyContext: { customerId: id },\n });\n }\n\n /**\n * Search customers. Most common: by email (returns 0 or 1 result).\n * Note: MP's `/v1/customers/search` returns a paginated wrapper, not a flat array.\n */\n async searchCustomers(params: { email?: string; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Customer[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 10,\n offset: params.offset ?? 0,\n };\n if (params.email) query[\"email\"] = params.email;\n return this.request(\"GET\", \"/v1/customers/search\", undefined, { query });\n }\n\n async listCustomerCards(customerId: string): Promise<CustomerCard[]> {\n return this.request<CustomerCard[]>(\n \"GET\",\n `/v1/customers/${customerId}/cards`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async getCustomerCard(customerId: string, cardId: string): Promise<CustomerCard> {\n return this.request<CustomerCard>(\n \"GET\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async deleteCustomerCard(customerId: string, cardId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List all payment methods enabled for the account's site (MLA = Argentina). */\n async listPaymentMethods(): Promise<PaymentMethod[]> {\n return this.request<PaymentMethod[]>(\"GET\", \"/v1/payment_methods\");\n }\n\n /**\n * Get installment options for an amount. THE killer AR feature — returns\n * `payer_costs` with `recommended_message` strings like \"12 cuotas sin\n * interés de $X\" that you should surface verbatim to the user.\n *\n * Pass `bin` (first 6 digits of card) for issuer-specific offers (e.g.,\n * Naranja's interest-free promotions). Without bin, returns generic offers.\n */\n async getInstallments(params: {\n amount: number;\n paymentMethodId?: string;\n bin?: string;\n issuerId?: string;\n }): Promise<InstallmentOffer[]> {\n const query: Record<string, string | number | undefined> = {\n amount: params.amount,\n };\n if (params.paymentMethodId) query[\"payment_method_id\"] = params.paymentMethodId;\n if (params.bin) query[\"bin\"] = params.bin;\n if (params.issuerId) query[\"issuer.id\"] = params.issuerId;\n return this.request<InstallmentOffer[]>(\n \"GET\",\n \"/v1/payment_methods/installments\",\n undefined,\n { query },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Account\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Get info about the account that owns this access token. */\n async getMe(): Promise<AccountInfo> {\n return this.request<AccountInfo>(\"GET\", \"/users/me\");\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Card tokens (server-side, for saved-card retokenization)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a single-use card token from a saved card. This is the server-side\n * retokenization path (PCI-safe because the card data lives in MP's vault,\n * we only pass the saved card_id + customer_id + the user-supplied CVV).\n *\n * Tokens expire in 7 days but typically burn on first use. AR currently\n * REQUIRES CVV on every charge (MP doesn't store it); skipping CVV requires\n * a private MP product enablement, not a public API.\n */\n async createCardToken(params: CreateCardTokenParams): Promise<CardToken> {\n return this.request<CardToken>(\"POST\", \"/v1/card_tokens\", {\n card_id: params.cardId,\n customer_id: params.customerId,\n security_code: params.securityCode,\n });\n }\n\n /**\n * High-level helper: charge a saved card in 3 steps.\n * 1. Mint a card token from {customer_id, card_id, security_code}\n * 2. Lookup card to fill payment_method_id (avoids agent guessing)\n * 3. Create the payment with the token + idempotency key\n *\n * Returns the resulting Payment. Uses deterministic idempotency from\n * (card_id, amount, externalReference) so retries dedupe on MP's side.\n */\n async chargeSavedCard(params: {\n customerId: string;\n cardId: string;\n securityCode: string;\n amount: number;\n description: string;\n installments?: number;\n externalReference?: string;\n statementDescriptor?: string;\n idempotencyKey?: string;\n }): Promise<Payment> {\n // Step 1: Mint single-use token\n const token = await this.createCardToken({\n cardId: params.cardId,\n customerId: params.customerId,\n securityCode: params.securityCode,\n });\n\n // Step 2: Lookup the saved card to fill payment_method_id\n const card = await this.getCustomerCard(params.customerId, params.cardId);\n const paymentMethodId = card.payment_method?.id;\n if (!paymentMethodId) {\n throw new MercadoPagoError(\n `Saved card ${params.cardId} has no payment_method.id. Cannot charge.`,\n 0,\n `/v1/customers/${params.customerId}/cards/${params.cardId}`,\n );\n }\n\n // Step 3: Create payment\n const body: Record<string, unknown> = {\n transaction_amount: params.amount,\n token: token.id,\n payment_method_id: paymentMethodId,\n installments: params.installments ?? 1,\n description: params.description,\n payer: { type: \"customer\", id: params.customerId },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.statementDescriptor) body.statement_descriptor = params.statementDescriptor;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey !== undefined ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { customerId: params.customerId },\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // QR (in-store dynamic) — Section 2 of v0.3 spec\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a dynamic in-store QR order. Returns `qr_data` (EMVCo TLV string)\n * + `in_store_order_id`. The buyer scans the QR with any AR wallet (Modo,\n * BNA+, Cuenta DNI, Naranja X, etc. — interop is mandated by Transferencias\n * 3.0). On payment, MP fires `point_integration_wh` then `payment` topics.\n *\n * Requires a pre-configured POS (`external_pos_id` from MP dashboard or\n * `POST /pos`). The seller's `user_id` is auto-fetched from `/users/me`.\n *\n * The lib does NOT render the QR image — pass `qr_data` to a QR renderer\n * (e.g., `qrcode` package) to get a data URL. The agent tool layer wraps\n * this and returns both raw + data URL.\n */\n async createQrPayment(userId: string, params: CreateQrPaymentParams): Promise<QrOrder> {\n const body: Record<string, unknown> = {\n total_amount: params.totalAmount,\n title: params.title,\n };\n if (params.description) body.description = params.description;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.expirationDate) body.expiration_date = params.expirationDate;\n body.items = params.items ?? [\n {\n title: params.title,\n quantity: 1,\n unit_price: params.totalAmount,\n unit_measure: \"unit\",\n total_amount: params.totalAmount,\n },\n ];\n\n return this.request<QrOrder>(\n \"PUT\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(params.externalPosId)}/qrs`,\n body,\n );\n }\n\n /**\n * Cancel a pending QR order on a POS. Necessary if the buyer never scans\n * — otherwise the next `createQrPayment` on the same POS returns 409.\n */\n async cancelQrPayment(userId: string, externalPosId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(externalPosId)}/qrs`,\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscription Plans (preapproval_plan — reusable plans, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a reusable subscription plan. Customers later subscribe to it via\n * `subscribeToPlan` (which creates a preapproval pointing at the plan).\n *\n * Use this when you have fixed tiers (Básico/Pro/Enterprise). For custom\n * per-customer amounts, skip plans and use `createPreapproval` directly.\n */\n async createSubscriptionPlan(params: CreateSubscriptionPlanParams): Promise<SubscriptionPlan> {\n const body: Record<string, unknown> = {\n reason: params.reason,\n back_url: params.backUrl,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n ...(params.freeTrialFrequency !== undefined && params.freeTrialFrequencyType !== undefined\n ? {\n free_trial: {\n frequency: params.freeTrialFrequency,\n frequency_type: params.freeTrialFrequencyType,\n },\n }\n : {}),\n },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n return this.request<SubscriptionPlan>(\"POST\", \"/preapproval_plan\", body);\n }\n\n async getSubscriptionPlan(id: string): Promise<SubscriptionPlan> {\n return this.request<SubscriptionPlan>(\"GET\", `/preapproval_plan/${id}`);\n }\n\n async listSubscriptionPlans(params: { limit?: number; offset?: number; status?: string } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: SubscriptionPlan[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.status) query[\"status\"] = params.status;\n return this.request(\"GET\", \"/preapproval_plan/search\", undefined, { query });\n }\n\n async updateSubscriptionPlan(\n id: string,\n patch: { reason?: string; status?: \"active\" | \"cancelled\"; amount?: number; backUrl?: string },\n ): Promise<SubscriptionPlan> {\n const body: Record<string, unknown> = {};\n if (patch.reason !== undefined) body.reason = patch.reason;\n if (patch.status !== undefined) body.status = patch.status;\n if (patch.backUrl !== undefined) body.back_url = patch.backUrl;\n if (patch.amount !== undefined) {\n body.auto_recurring = { transaction_amount: patch.amount };\n }\n return this.request<SubscriptionPlan>(\"PUT\", `/preapproval_plan/${id}`, body);\n }\n\n /**\n * Subscribe a customer to an existing plan. Returns a Preapproval with\n * `init_point` URL where the buyer completes the first payment.\n */\n async subscribeToPlan(params: {\n planId: string;\n payerEmail: string;\n cardTokenId?: string;\n externalReference?: string;\n }): Promise<Preapproval> {\n const body: Record<string, unknown> = {\n preapproval_plan_id: params.planId,\n payer_email: params.payerEmail,\n };\n if (params.cardTokenId) body.card_token_id = params.cardTokenId;\n if (params.externalReference) body.external_reference = params.externalReference;\n return this.request<Preapproval>(\"POST\", \"/preapproval\", body, {\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /**\n * List the auto-charge attempts (authorized_payments) under a preapproval.\n * Useful for \"show me the cobros of the last 6 months for this client\".\n */\n async listSubscriptionPayments(preapprovalId: string, params: { limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: SubscriptionPayment[];\n }> {\n const query: Record<string, string | number | undefined> = {\n preapproval_id: preapprovalId,\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n return this.request(\n \"GET\",\n `/authorized_payments/search`,\n undefined,\n { query, classifyContext: { preapprovalId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Stores + POS (for QR payments self-serve setup, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Create a store for the seller. POSes (for QR) live under stores. */\n async createStore(userId: string, params: CreateStoreParams): Promise<Store> {\n const body: Record<string, unknown> = {\n name: params.name,\n external_id: params.externalId,\n };\n if (params.location) {\n body.location = {\n ...(params.location.addressLine ? { address_line: params.location.addressLine } : {}),\n ...(params.location.cityName ? { city_name: params.location.cityName } : {}),\n ...(params.location.stateName ? { state_name: params.location.stateName } : {}),\n ...(params.location.countryId ? { country_id: params.location.countryId } : {}),\n ...(params.location.latitude !== undefined ? { latitude: params.location.latitude } : {}),\n ...(params.location.longitude !== undefined ? { longitude: params.location.longitude } : {}),\n };\n }\n return this.request<Store>(\"POST\", `/users/${encodeURIComponent(userId)}/stores`, body);\n }\n\n async listStores(userId: string, params: { limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Store[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n };\n return this.request(\"GET\", `/users/${encodeURIComponent(userId)}/stores/search`, undefined, { query });\n }\n\n /** Create a POS under a store. The POS's `external_id` is what `createQrPayment` uses. */\n async createPos(params: CreatePosParams): Promise<Pos> {\n const body: Record<string, unknown> = {\n name: params.name,\n external_id: params.externalId,\n store_id: params.storeId,\n category: params.category ?? 621102, // \"Other Food and Beverage Services\" — generic default\n };\n if (params.fixedAmount !== undefined) body.fixed_amount = params.fixedAmount;\n return this.request<Pos>(\"POST\", \"/pos\", body);\n }\n\n async listPos(params: { storeId?: string | number; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Pos[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n };\n if (params.storeId !== undefined) query[\"store_id\"] = String(params.storeId);\n return this.request(\"GET\", \"/pos\", undefined, { query });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Disputes (read-only, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n async listPaymentDisputes(paymentId: string): Promise<Dispute[]> {\n return this.request<Dispute[]>(\"GET\", `/v1/payments/${paymentId}/disputes`, undefined, {\n classifyContext: { paymentId },\n });\n }\n\n async getDispute(paymentId: string, disputeId: string): Promise<Dispute> {\n return this.request<Dispute>(\n \"GET\",\n `/v1/payments/${paymentId}/disputes/${disputeId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Identification Types + Issuers (lookup helpers, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List valid identification types for the seller's site. AR returns DNI/CI/LE/LC/Otro/Pasaporte/CUIT/CUIL. */\n async listIdentificationTypes(): Promise<IdentificationType[]> {\n return this.request<IdentificationType[]>(\"GET\", \"/v1/identification_types\");\n }\n\n /** List card issuers for a payment method. Useful with `bin` for installments. */\n async listIssuers(params: { paymentMethodId: string; bin?: string }): Promise<Issuer[]> {\n const query: Record<string, string | number | undefined> = {\n payment_method_id: params.paymentMethodId,\n };\n if (params.bin) query[\"bin\"] = params.bin;\n return this.request<Issuer[]>(\"GET\", \"/v1/payment_methods/card_issuers\", undefined, { query });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Webhooks management (v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List configured webhook subscriptions. */\n async listWebhooks(): Promise<WebhookConfig[]> {\n return this.request<WebhookConfig[]>(\"GET\", \"/v1/webhooks\");\n }\n\n /** Create a webhook subscription for a topic. */\n async createWebhook(params: CreateWebhookParams): Promise<WebhookConfig> {\n return this.request<WebhookConfig>(\"POST\", \"/v1/webhooks\", {\n url: params.url,\n topic: params.topic,\n });\n }\n\n async updateWebhook(id: string, patch: { url?: string; topic?: string }): Promise<WebhookConfig> {\n return this.request<WebhookConfig>(\"PUT\", `/v1/webhooks/${id}`, patch);\n }\n\n async deleteWebhook(id: string): Promise<void> {\n await this.request(\"DELETE\", `/v1/webhooks/${id}`);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.5 — Order Management API\n //\n // The Order API is MP's newer abstraction for purchases, replacing some\n // Preference flows. Distinct from Preference: Order is a transactional\n // entity with explicit lifecycle (created → processed → captured/canceled),\n // supports manual capture (auth-only, capture later), and can attach\n // multiple payments to a single Order.\n //\n // Use Order when you need:\n // - Auth-only flow (capture later, e.g. ride-share, hotels)\n // - Multi-payment aggregation (one Order = N partial payments)\n // - In-store + online unified status\n //\n // Stick with Preference (Checkout Pro) when you just need a hosted pay-link.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new Order. Use `capture_mode: \"manual\"` for auth-only flows\n * where you want to capture funds later (ride-share, hotels, marketplaces).\n *\n * For marketplace splits, set `marketplace`, `marketplace_fee`,\n * `collector_id` — see `MarketplaceParams`.\n */\n async createOrder(\n params: CreateOrderParams,\n options?: RequestOptions,\n ): Promise<Order> {\n const body: Record<string, unknown> = {\n type: params.type,\n };\n if (params.currency_id) body.currency_id = params.currency_id;\n if (params.external_reference) body.external_reference = params.external_reference;\n if (params.items) body.items = params.items;\n if (params.total_amount !== undefined) body.total_amount = params.total_amount;\n if (params.payer) body.payer = params.payer;\n if (params.capture_mode) body.capture_mode = params.capture_mode;\n if (params.notification_url) body.notification_url = params.notification_url;\n if (params.marketplace) body.marketplace = params.marketplace;\n if (params.marketplace_fee !== undefined) body.marketplace_fee = params.marketplace_fee;\n if (params.collector_id !== undefined) body.collector_id = params.collector_id;\n\n return this.request<Order>(\"POST\", \"/v1/orders\", body, options);\n }\n\n async getOrder(id: string): Promise<Order> {\n return this.request<Order>(\"GET\", `/v1/orders/${id}`);\n }\n\n async updateOrder(\n id: string,\n patch: Partial<CreateOrderParams>,\n ): Promise<Order> {\n return this.request<Order>(\"PUT\", `/v1/orders/${id}`, patch);\n }\n\n /**\n * Capture a previously-authorized Order (only for orders created with\n * `capture_mode: \"manual\"`). Captures up to the originally-authorized\n * amount; pass `amount` for partial capture.\n */\n async captureOrder(id: string, amount?: number): Promise<Order> {\n const body = amount !== undefined ? { amount } : {};\n return this.request<Order>(\"POST\", `/v1/orders/${id}/capture`, body);\n }\n\n /**\n * Cancel an Order. Releases any auth-holds; marks the Order as canceled.\n * For orders that have already been captured, use `createRefund` instead.\n */\n async cancelOrder(id: string): Promise<Order> {\n return this.request<Order>(\"POST\", `/v1/orders/${id}/cancel`);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.6 — Account Balance + Movements\n //\n // Inspect the seller's MP wallet — what's available to withdraw, what's\n // in retention (pending release), and the movement log.\n //\n // For per-seller marketplace setups, instantiate the client AS THE SELLER\n // (with their OAuth access_token) before calling these — `getAccountBalance`\n // returns the balance of WHOEVER's accessToken is active.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the seller's current MP wallet balance (available + unavailable).\n * - `available_balance`: spendable / withdrawable right now.\n * - `unavailable_balance`: in retention (e.g., 14-21 days for new sellers).\n * - `total_amount` = sum of both.\n */\n async getAccountBalance(): Promise<AccountBalance> {\n return this.request<AccountBalance>(\"GET\", \"/users/me/mercadopago_account/balance\");\n }\n\n /**\n * List wallet movements (incoming payments, transfers, refunds, holdings).\n * Defaults to most-recent-first, paginated. Filter by date range with\n * `from`/`to` (ISO 8601).\n */\n async listAccountMovements(\n params: { from?: string; to?: string; limit?: number; offset?: number } = {},\n ): Promise<{ movements: AccountMovement[]; paging: { limit: number; offset: number; total: number } }> {\n const query: Record<string, string | number> = {};\n if (params.from) query.begin_date = params.from;\n if (params.to) query.end_date = params.to;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n results?: AccountMovement[];\n paging?: { limit: number; offset: number; total: number };\n }>(\"GET\", \"/users/me/mercadopago_account/movements/search\", undefined, { query });\n return {\n movements: result.results ?? [],\n paging: result.paging ?? { limit: params.limit ?? 25, offset: params.offset ?? 0, total: 0 },\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.6 — Settlements (release_money)\n //\n // When MP transfers funds from your MP wallet to your registered CBU.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * List settlements (transfers from MP wallet to your bank account).\n * Useful for monthly conciliation reports.\n */\n async listSettlements(\n params: { from?: string; to?: string; status?: string; limit?: number; offset?: number } = {},\n ): Promise<{ settlements: Settlement[]; paging: { limit: number; offset: number; total: number } }> {\n const query: Record<string, string | number> = {};\n if (params.from) query.begin_date = params.from;\n if (params.to) query.end_date = params.to;\n if (params.status) query.status = params.status;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n results?: Settlement[];\n paging?: { limit: number; offset: number; total: number };\n }>(\"GET\", \"/v1/account/release_money/search\", undefined, { query });\n return {\n settlements: result.results ?? [],\n paging: result.paging ?? { limit: params.limit ?? 25, offset: params.offset ?? 0, total: 0 },\n };\n }\n\n /**\n * Get a single settlement by id. Returns the full Settlement object\n * including bank_account info (CBU, bank name).\n */\n async getSettlement(id: string): Promise<Settlement> {\n return this.request<Settlement>(\"GET\", `/v1/account/release_money/${id}`);\n }\n}\n\nexport { MercadoPagoError };\n","import { z } from \"zod\";\n\n/**\n * Site IDs supported by Mercado Pago. The lib targets MLA (Argentina) primarily;\n * other LATAM sites may work for the read paths but the full Subscriptions flow\n * is only verified against MLA.\n */\nexport const SiteIdSchema = z.enum([\"MLA\", \"MLB\", \"MLM\", \"MCO\", \"MLC\", \"MLU\"]);\nexport type SiteId = z.infer<typeof SiteIdSchema>;\n\n/**\n * Currency identifiers MP exposes. ARS is the supported case for v0.1.\n */\nexport const CurrencyIdSchema = z.enum([\"ARS\", \"USD\", \"BRL\", \"MXN\"]);\nexport type CurrencyId = z.infer<typeof CurrencyIdSchema>;\n\n/**\n * Recurrence frequency unit for a subscription's auto_recurring config.\n */\nexport const FrequencyTypeSchema = z.enum([\"months\", \"days\"]);\nexport type FrequencyType = z.infer<typeof FrequencyTypeSchema>;\n\n/**\n * Lifecycle states a Mercado Pago preapproval can be in. The string is the\n * canonical MP value; we widen to `string` for forward compatibility because\n * MP has historically introduced new states without notice.\n */\nexport const PreapprovalStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"authorized\"),\n z.literal(\"paused\"),\n z.literal(\"cancelled\"),\n z.string(),\n]);\nexport type PreapprovalStatus = z.infer<typeof PreapprovalStatusSchema>;\n\nexport const AutoRecurringSchema = z.object({\n frequency: z.number().int().positive(),\n frequency_type: FrequencyTypeSchema,\n transaction_amount: z.number().positive(),\n currency_id: CurrencyIdSchema,\n start_date: z.string().optional(),\n end_date: z.string().optional(),\n});\nexport type AutoRecurring = z.infer<typeof AutoRecurringSchema>;\n\nexport const PreapprovalSchema = z.object({\n id: z.string(),\n status: PreapprovalStatusSchema,\n payer_email: z.string(),\n init_point: z.string().url(),\n external_reference: z.string().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n next_payment_date: z.string().optional(),\n payer_id: z.union([z.string(), z.number()]).optional(),\n auto_recurring: AutoRecurringSchema,\n});\nexport type Preapproval = z.infer<typeof PreapprovalSchema>;\n\n/**\n * Input for creating a preapproval (subscription). Internal field names match\n * MP API semantics; the public client method maps from camelCase Naza-friendly\n * params to the snake_case payload MP expects.\n */\nexport interface CreatePreapprovalParams {\n /** Short customer-facing description shown at checkout. */\n reason: string;\n /** Email of the buyer. Cannot equal the seller account's email (MP rejects). */\n payerEmail: string;\n /** Recurring amount per cycle. */\n amount: number;\n /** ARS for Argentina. Other currencies depend on the seller account's site. */\n currency: CurrencyId;\n /** Recurrence frequency (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** HTTPS URL where MP redirects the buyer after first payment. localhost rejected. */\n backUrl: string;\n /** Optional client-side identifier for the subscription. */\n externalReference?: string;\n}\n\n/**\n * The shape of an MP webhook notification body for `topic=preapproval`. MP's\n * webhook payload varies by event type; this is the union of fields seen in\n * production.\n */\nexport const WebhookBodySchema = z\n .object({\n type: z.string().optional(),\n topic: z.string().optional(),\n action: z.string().optional(),\n data: z.object({ id: z.union([z.string(), z.number()]) }).optional(),\n resource: z.string().optional(),\n user_id: z.union([z.string(), z.number()]).optional(),\n api_version: z.string().optional(),\n date_created: z.string().optional(),\n id: z.union([z.string(), z.number()]).optional(),\n live_mode: z.boolean().optional(),\n })\n .passthrough();\nexport type WebhookBody = z.infer<typeof WebhookBodySchema>;\n\n/**\n * Normalized webhook event after parsing. The library extracts topic + dataId\n * from either query params or body, since MP sends them in either location\n * depending on integration version.\n */\nexport interface ParsedWebhookEvent {\n /** Topic of the event, e.g., \"preapproval\", \"payment\", \"subscription_authorized_payment\". */\n topic: string;\n /** ID of the affected resource. */\n dataId: string;\n /** Action descriptor when present (e.g., \"updated\", \"created\"). */\n action: string | null;\n /** Raw body MP sent, for caller inspection / debugging. */\n raw: WebhookBody;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payments (v0.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Top-level lifecycle status of a payment. MP-canonical values; widened to\n * string for forward compatibility.\n */\nexport const PaymentStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"approved\"),\n z.literal(\"authorized\"),\n z.literal(\"in_process\"),\n z.literal(\"in_mediation\"),\n z.literal(\"rejected\"),\n z.literal(\"cancelled\"),\n z.literal(\"refunded\"),\n z.literal(\"charged_back\"),\n z.string(),\n]);\nexport type PaymentStatus = z.infer<typeof PaymentStatusSchema>;\n\n/** Status detail — finer granularity inside a status (e.g., why rejected). */\nexport type PaymentStatusDetail = string;\n\n/**\n * The full Payment object MP returns. Many fields are optional because they\n * vary by payment method, status, and integration mode (Checkout Pro vs API).\n */\nexport const PaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: PaymentStatusSchema,\n status_detail: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n date_approved: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n transaction_amount: z.number(),\n currency_id: z.string(),\n installments: z.number().int().nullable().optional(),\n payment_method_id: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n external_reference: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n payer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n email: z.string().nullable().optional(),\n identification: z\n .object({\n type: z.string().nullable().optional(),\n number: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n })\n .passthrough()\n .optional(),\n transaction_details: z\n .object({\n net_received_amount: z.number().nullable().optional(),\n total_paid_amount: z.number().nullable().optional(),\n installment_amount: z.number().nullable().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Payment = z.infer<typeof PaymentSchema>;\n\n/** Params for creating a payment (Checkout API / transparent flow). */\nexport interface CreatePaymentParams {\n /** Amount in account currency. ARS for Argentina. */\n transactionAmount: number;\n /** Number of installments. Use 1 for no cuotas; AR cards typically allow up to 12. */\n installments?: number;\n /** MP payment_method_id — `visa`, `master`, `naranja`, `account_money`, etc. */\n paymentMethodId: string;\n /** Payer email — REQUIRED. Cannot equal seller email. */\n payerEmail: string;\n /** Card token from MP frontend SDK (Cardform). Required for credit/debit; omit for `account_money` etc. */\n token?: string;\n /** Description shown in payer's MP statement. */\n description?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** Optional payer identification (DNI/CUIT) — required for some payment types. */\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n /** Webhook override URL. Falls back to dashboard config if omitted. */\n notificationUrl?: string;\n /** AFIP/ARCA discount/fee/tax additions. Used to discriminate IVA, marketplace fees, etc. */\n additionalInfo?: {\n items?: Array<{\n id?: string;\n title: string;\n quantity: number;\n unit_price: number;\n description?: string;\n }>;\n };\n /** Statement descriptor — what shows on the buyer's card statement. Max 13 chars. */\n statementDescriptor?: string;\n /** When true, capture is deferred (only for credit cards) — useful for hold flows. */\n capture?: boolean;\n /** Idempotency key — pass the same value on retries to dedupe. Required for non-GET. */\n idempotencyKey?: string;\n}\n\nexport interface SearchPaymentsParams {\n /** Filter by external_reference (your-system id). */\n externalReference?: string;\n /** Filter by payment status. */\n status?: PaymentStatus;\n /** Filter by payer email. */\n payerEmail?: string;\n /** Date range for date_created (ISO 8601). */\n beginDate?: string;\n endDate?: string;\n /** Result page (default 0). */\n offset?: number;\n /** Page size (default 30, max 100). */\n limit?: number;\n /** Sort: e.g. \"date_created\" desc. */\n sort?: string;\n criteria?: \"asc\" | \"desc\";\n}\n\nexport const PaymentsSearchResultSchema = z.object({\n paging: z.object({\n total: z.number(),\n limit: z.number(),\n offset: z.number(),\n }),\n results: z.array(PaymentSchema),\n});\nexport type PaymentsSearchResult = z.infer<typeof PaymentsSearchResultSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Refunds\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const RefundSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n payment_id: z.union([z.string(), z.number()]).transform(String),\n amount: z.number(),\n source: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n}).passthrough();\nexport type Refund = z.infer<typeof RefundSchema>;\n\nexport interface CreateRefundParams {\n paymentId: string;\n /** Partial refund amount. Omit for full refund. */\n amount?: number;\n /** Idempotency key — required for retry-safety. */\n idempotencyKey?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Checkout Pro (Preferences)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PreferenceItemSchema = z.object({\n id: z.string().optional(),\n title: z.string(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n category_id: z.string().optional(),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n currency_id: CurrencyIdSchema.optional(),\n});\nexport type PreferenceItem = z.infer<typeof PreferenceItemSchema>;\n\nexport const PreferenceSchema = z.object({\n id: z.string(),\n init_point: z.string().url().optional(),\n sandbox_init_point: z.string().url().optional(),\n client_id: z.union([z.string(), z.number()]).optional(),\n collector_id: z.union([z.string(), z.number()]).optional(),\n items: z.array(PreferenceItemSchema).optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n expires: z.boolean().optional(),\n expiration_date_from: z.string().nullable().optional(),\n expiration_date_to: z.string().nullable().optional(),\n}).passthrough();\nexport type Preference = z.infer<typeof PreferenceSchema>;\n\nexport interface CreatePreferenceParams {\n items: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n currency_id?: CurrencyId;\n description?: string;\n picture_url?: string;\n }>;\n payer?: {\n name?: string;\n surname?: string;\n email?: string;\n phone?: { area_code?: string; number?: string };\n identification?: { type: string; number: string };\n address?: { street_name?: string; street_number?: number; zip_code?: string };\n };\n /** Where to send the buyer after success/failure/pending. */\n backUrls?: { success?: string; failure?: string; pending?: string };\n /** \"approved\" → auto-redirect on success; \"all\" → always; \"\" → never. */\n autoReturn?: \"approved\" | \"all\";\n /** Webhook URL. */\n notificationUrl?: string;\n /** Your-system id for correlation. */\n externalReference?: string;\n /** Max installments offered. Defaults to MP account config. */\n paymentMethods?: {\n excluded_payment_types?: Array<{ id: string }>;\n excluded_payment_methods?: Array<{ id: string }>;\n installments?: number;\n default_installments?: number;\n };\n /** Statement descriptor — shows on buyer's card statement. */\n statementDescriptor?: string;\n /** Expiration window for the link itself. */\n expires?: boolean;\n expirationDateFrom?: string;\n expirationDateTo?: string;\n /**\n * Marketplace split — if set, funds route to `collector_id` (the seller)\n * and `marketplaceFee` (in ARS) is credited to the marketplace's MP\n * account. v0.5+. See `MarketplaceParams` for details.\n */\n marketplace?: string;\n marketplaceFee?: number;\n /** Seller's MP user_id. Funds route here when set. */\n collectorId?: string | number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Customers + Saved Cards\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CustomerSchema = z.object({\n id: z.string(),\n email: z.string(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z\n .object({ area_code: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n identification: z\n .object({ type: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n}).passthrough();\nexport type Customer = z.infer<typeof CustomerSchema>;\n\nexport const CustomerCardSchema = z.object({\n id: z.string(),\n customer_id: z.string(),\n expiration_month: z.number().int().nullable().optional(),\n expiration_year: z.number().int().nullable().optional(),\n first_six_digits: z.string().nullable().optional(),\n last_four_digits: z.string().nullable().optional(),\n payment_method: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n}).passthrough();\nexport type CustomerCard = z.infer<typeof CustomerCardSchema>;\n\nexport interface CreateCustomerParams {\n email: string;\n firstName?: string;\n lastName?: string;\n phone?: { areaCode?: string; number?: string };\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n description?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payment Methods + Installments\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PaymentMethodSchema = z.object({\n id: z.string(),\n name: z.string(),\n payment_type_id: z.string(),\n status: z.string(),\n thumbnail: z.string().nullable().optional(),\n secure_thumbnail: z.string().nullable().optional(),\n min_allowed_amount: z.number().nullable().optional(),\n max_allowed_amount: z.number().nullable().optional(),\n}).passthrough();\nexport type PaymentMethod = z.infer<typeof PaymentMethodSchema>;\n\nexport const InstallmentOfferSchema = z.object({\n payment_method_id: z.string(),\n payment_type_id: z.string(),\n issuer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n name: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n payer_costs: z.array(\n z.object({\n installments: z.number().int(),\n installment_rate: z.number(),\n discount_rate: z.number().nullable().optional(),\n installment_amount: z.number(),\n total_amount: z.number(),\n recommended_message: z.string().nullable().optional(),\n }).passthrough(),\n ),\n}).passthrough();\nexport type InstallmentOffer = z.infer<typeof InstallmentOfferSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Account\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─────────────────────────────────────────────────────────────────────────────\n// QR (in-store dynamic)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const QrOrderSchema = z.object({\n in_store_order_id: z.string(),\n qr_data: z.string(),\n}).passthrough();\nexport type QrOrder = z.infer<typeof QrOrderSchema>;\n\nexport interface CreateQrPaymentParams {\n /** Pre-configured POS external_id from MP dashboard. Required. */\n externalPosId: string;\n /** Total amount in ARS. */\n totalAmount: number;\n /** Display title shown to the buyer when scanning. */\n title: string;\n description?: string;\n /** Webhook URL — MP fires `point_integration_wh` then `payment` topic. */\n notificationUrl?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** ISO 8601 expiration (default 10 min from now). */\n expirationDate?: string;\n /** Itemized line items (optional but improves analytics). */\n items?: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n unit_measure?: string;\n total_amount?: number;\n }>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Card tokens (for charge_saved_card)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CardTokenSchema = z.object({\n id: z.string(),\n status: z.string().optional(),\n date_due: z.string().optional(),\n card_id: z.string().optional(),\n cardholder: z.unknown().optional(),\n}).passthrough();\nexport type CardToken = z.infer<typeof CardTokenSchema>;\n\nexport interface CreateCardTokenParams {\n /** Saved card id (from list_customer_cards). */\n cardId: string;\n /** Customer that owns the card. */\n customerId: string;\n /** CVV — required for AR; MP doesn't store CVV. */\n securityCode: string;\n}\n\nexport const AccountInfoSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n email: z.string().nullable().optional(),\n nickname: z.string().nullable().optional(),\n country_id: z.string().nullable().optional(),\n site_id: z.string().nullable().optional(),\n user_type: z.string().nullable().optional(),\n status: z\n .object({ user_type: z.string().nullable().optional() })\n .passthrough()\n .nullable()\n .optional(),\n}).passthrough();\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Subscription Plans (preapproval_plan — reusable plan definitions)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A reusable subscription plan. Different from a per-customer subscription:\n * a plan defines the price + frequency once, then customers subscribe to it\n * via `subscribe_to_plan` (which creates a preapproval pointing at the plan).\n *\n * Use plans for SaaS-style billing where you have a fixed set of tiers\n * (Básico/Pro/Enterprise) instead of negotiating amounts per customer.\n */\nexport const SubscriptionPlanSchema = z.object({\n id: z.string(),\n status: z.string(),\n reason: z.string(),\n back_url: z.string().url().optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n auto_recurring: AutoRecurringSchema,\n}).passthrough();\nexport type SubscriptionPlan = z.infer<typeof SubscriptionPlanSchema>;\n\nexport interface CreateSubscriptionPlanParams {\n /** Customer-facing plan name shown at checkout. */\n reason: string;\n /** Where MP redirects buyer after first payment. HTTPS only. */\n backUrl: string;\n /** Recurrence (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** Amount per cycle. */\n amount: number;\n /** ARS for AR. */\n currency: CurrencyId;\n /** Optional plan-level identifier from your system. */\n externalReference?: string;\n /** Free trial days before first charge. */\n freeTrialFrequency?: number;\n freeTrialFrequencyType?: FrequencyType;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stores + POS (for QR payments setup)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const StoreSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string().optional(),\n external_id: z.string().optional(),\n date_creation: z.string().optional(),\n location: z\n .object({\n address_line: z.string().optional(),\n city_name: z.string().optional(),\n state_name: z.string().optional(),\n country_id: z.string().optional(),\n latitude: z.number().optional(),\n longitude: z.number().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Store = z.infer<typeof StoreSchema>;\n\nexport interface CreateStoreParams {\n /** Display name for the store. */\n name: string;\n /** Caller-defined identifier (must be unique within the seller's stores). */\n externalId: string;\n /** Optional physical location. */\n location?: {\n addressLine?: string;\n cityName?: string;\n stateName?: string;\n countryId?: string;\n latitude?: number;\n longitude?: number;\n };\n}\n\nexport const PosSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string().optional(),\n external_id: z.string().optional(),\n store_id: z.union([z.string(), z.number()]).optional(),\n category: z.number().int().optional(),\n fixed_amount: z.boolean().optional(),\n qr: z\n .object({\n template_image: z.string().optional(),\n image: z.string().optional(),\n })\n .passthrough()\n .optional(),\n date_creation: z.string().optional(),\n}).passthrough();\nexport type Pos = z.infer<typeof PosSchema>;\n\nexport interface CreatePosParams {\n /** Display name. */\n name: string;\n /** Caller-defined POS id (used in QR endpoints; unique within store). */\n externalId: string;\n /** Parent store id (number from createStore). */\n storeId: string | number;\n /** MP category code (default 621102 = Other Food and Beverage Services). */\n category?: number;\n /** If true, the QR has a fixed amount; if false, dynamic per-order. */\n fixedAmount?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Disputes / Chargebacks (read-only)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const DisputeSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: z.string(),\n resource: z.string().optional(),\n resource_id: z.union([z.string(), z.number()]).optional(),\n amount: z.number().optional(),\n date_created: z.string().optional(),\n reason: z.string().optional(),\n resolution: z\n .object({\n reason: z.string().optional(),\n result: z.string().optional(),\n date: z.string().optional(),\n })\n .passthrough()\n .optional(),\n /** Documents the buyer / seller submitted as evidence. */\n documents: z.array(z.unknown()).optional(),\n /** Buyer's stated complaint. */\n reason_description: z.string().optional(),\n}).passthrough();\nexport type Dispute = z.infer<typeof DisputeSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Subscription Payment History (authorized_payments under a preapproval)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const SubscriptionPaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n preapproval_id: z.string().optional(),\n status: z.string(),\n payment_id: z.union([z.string(), z.number()]).nullable().optional(),\n transaction_amount: z.number().optional(),\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n debit_date: z.string().optional(),\n next_retry_date: z.string().nullable().optional(),\n retry_attempt: z.number().optional(),\n reason: z.string().optional(),\n}).passthrough();\nexport type SubscriptionPayment = z.infer<typeof SubscriptionPaymentSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Identification Types + Issuers (lookup helpers)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const IdentificationTypeSchema = z.object({\n id: z.string(),\n name: z.string(),\n type: z.string(),\n min_length: z.number().optional(),\n max_length: z.number().optional(),\n}).passthrough();\nexport type IdentificationType = z.infer<typeof IdentificationTypeSchema>;\n\nexport const IssuerSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string(),\n secure_thumbnail: z.string().nullable().optional(),\n thumbnail: z.string().nullable().optional(),\n processing_mode: z.string().optional(),\n status: z.string().optional(),\n}).passthrough();\nexport type Issuer = z.infer<typeof IssuerSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Webhooks (configure subscriptions to topics)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Topics MP can fire webhooks for. Add more as MP exposes them. */\nexport const WebhookTopicSchema = z.enum([\n \"payment\",\n \"subscription_authorized_payment\",\n \"subscription_preapproval\",\n \"merchant_order\",\n \"point_integration_wh\",\n \"stop_delivery_op_wh\",\n]);\nexport type WebhookTopic = z.infer<typeof WebhookTopicSchema>;\n\nexport const WebhookConfigSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n url: z.string().url().optional(),\n status: z.string().optional(),\n topic: z.string().optional(),\n date_created: z.string().optional(),\n date_modified: z.string().optional(),\n}).passthrough();\nexport type WebhookConfig = z.infer<typeof WebhookConfigSchema>;\n\nexport interface CreateWebhookParams {\n url: string;\n /** Topic to subscribe to. */\n topic: WebhookTopic | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.5 — OAuth Marketplace flow (link third-party MP accounts)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Token response from MP's OAuth `/oauth/token` endpoint. The `access_token`\n * is what you use to make API calls AS the linked seller; the `refresh_token`\n * is what you use to refresh the access_token before expiration (~6 hours).\n *\n * **Persist the refresh_token**: it does NOT expire and is the only way to\n * keep the integration alive long-term.\n *\n * **Always store `user_id`** alongside the tokens — it identifies WHICH\n * seller these tokens belong to (you'll have many in a marketplace).\n */\nexport const OAuthTokenSchema = z.object({\n access_token: z.string(),\n token_type: z.string().optional(),\n /** Seconds until access_token expires. Typically 21600 (6h). */\n expires_in: z.number().optional(),\n scope: z.string().optional(),\n /** The MP user_id of the seller who authorized your app. */\n user_id: z.union([z.string(), z.number()]).transform(String),\n refresh_token: z.string().optional(),\n public_key: z.string().optional(),\n live_mode: z.boolean().optional(),\n}).passthrough();\nexport type OAuthToken = z.infer<typeof OAuthTokenSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.5 — Order Management API (the new API replacing some Preference flows)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Status of an Order. Distinct from Payment status — an Order can have\n * multiple payments and the Order status reflects the aggregate state.\n */\nexport const OrderStatusSchema = z.union([\n z.literal(\"created\"),\n z.literal(\"processed\"),\n z.literal(\"action_required\"),\n z.literal(\"canceled\"),\n z.literal(\"expired\"),\n z.literal(\"refunded\"),\n z.string(),\n]);\nexport type OrderStatus = z.infer<typeof OrderStatusSchema>;\n\nexport const OrderItemSchema = z.object({\n title: z.string(),\n unit_price: z.number(),\n quantity: z.number(),\n description: z.string().optional(),\n id: z.string().optional(),\n category_id: z.string().optional(),\n picture_url: z.string().optional(),\n}).passthrough();\nexport type OrderItem = z.infer<typeof OrderItemSchema>;\n\nexport const OrderSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n type: z.string().optional(),\n status: OrderStatusSchema.optional(),\n status_detail: z.string().optional(),\n external_reference: z.string().optional(),\n total_amount: z.union([z.number(), z.string()]).optional(),\n /** Currency for this Order (e.g. \"ARS\"). */\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n date_last_updated: z.string().optional(),\n items: z.array(OrderItemSchema).optional(),\n /** Underlying transactions (payments) attached to this Order. */\n transactions: z\n .object({\n payments: z.array(z.unknown()).optional(),\n refunds: z.array(z.unknown()).optional(),\n })\n .passthrough()\n .optional(),\n /** Capture mode: \"automatic\" (charges immediately) or \"manual\" (auth-only). */\n capture_mode: z.string().optional(),\n}).passthrough();\nexport type Order = z.infer<typeof OrderSchema>;\n\nexport interface CreateOrderParams {\n /**\n * Order type. Common values:\n * - \"online\" — checkout-style (the most common)\n * - \"in_store\" — POS QR / in-person\n */\n type: \"online\" | \"in_store\" | string;\n /** Currency (e.g. \"ARS\"). */\n currency_id?: string;\n /** External reference for reconciliation (your internal id). */\n external_reference?: string;\n /** Items being ordered. */\n items?: OrderItem[];\n /** Total amount if you'd rather not itemize. */\n total_amount?: number;\n /** Customer info (payer). */\n payer?: {\n email?: string;\n first_name?: string;\n last_name?: string;\n identification?: { type?: string; number?: string };\n };\n /**\n * Capture mode:\n * - \"automatic\" (default) — charge immediately when paid.\n * - \"manual\" — authorize only, capture later via captureOrder().\n */\n capture_mode?: \"automatic\" | \"manual\";\n /**\n * Notification URL — MP fires webhooks for order lifecycle events here.\n */\n notification_url?: string;\n /**\n * Marketplace fee + collector — required for marketplace integrations\n * where YOU collect on behalf of a third-party seller (you take a fee,\n * the rest goes to the seller).\n */\n marketplace?: string;\n marketplace_fee?: number;\n collector_id?: string | number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.5 — Marketplace split payments (also usable on regular Preference)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Marketplace fee + collector params, applied to a Preference or Order.\n *\n * **How it works**: when you create a Preference or Order with\n * `collector_id` set to a SELLER's MP user_id (not yours), and you have a\n * valid OAuth access_token for that seller, MP routes the funds to the\n * seller's MP account, and credits `marketplace_fee` (in ARS, not %) to\n * YOUR marketplace account.\n *\n * Used for two-sided platforms (Rappi, MercadoLibre, Tienda Nube, etc.)\n * where your platform takes a fee and the seller keeps the rest.\n */\nexport interface MarketplaceParams {\n /**\n * Marketplace identifier — your application's marketplace name (you set\n * this when registering your app in MP's dev panel).\n */\n marketplace?: string;\n /**\n * Fee in ARS (NOT a percentage) that goes to your marketplace account.\n * Compute it from your own commission rate before passing.\n */\n marketplace_fee?: number;\n /**\n * The SELLER's MP user_id. The funds go to this account; the\n * `marketplace_fee` is split off and goes to YOUR account.\n * Get this from `OAuthToken.user_id` after the seller authorizes your app.\n */\n collector_id?: string | number;\n /**\n * Optional: split among multiple sellers. If set, `collector_id` /\n * `marketplace_fee` are ignored.\n */\n application_fee?: number;\n}\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 — Account Balance + Movements\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Account balance snapshot. Sum of `available + unavailable` is the seller's\n * total Mercado Pago balance.\n *\n * - `available` — funds the seller can withdraw or pay with right now.\n * - `unavailable` — funds in retention (typically 14-21 days for new sellers\n * or for risk-flagged transactions). Becomes `available` automatically.\n */\nexport const AccountBalanceSchema = z.object({\n user_id: z.union([z.string(), z.number()]).transform(String).optional(),\n available_balance: z.number(),\n unavailable_balance: z.number(),\n total_amount: z.number(),\n currency_id: z.string().default(\"ARS\"),\n}).passthrough();\nexport type AccountBalance = z.infer<typeof AccountBalanceSchema>;\n\n/**\n * Account movement (a single line in the seller's MP \"movements\" log).\n * Includes incoming payments, outgoing transfers, refunds, holdings, etc.\n */\nexport const AccountMovementSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n type: z.string(),\n description: z.string().optional(),\n amount: z.number(),\n currency_id: z.string().optional(),\n status: z.string().optional(),\n date_created: z.string().optional(),\n date_released: z.string().optional(),\n reference_id: z.union([z.string(), z.number()]).optional(),\n payment_id: z.union([z.string(), z.number()]).optional(),\n}).passthrough();\nexport type AccountMovement = z.infer<typeof AccountMovementSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 — Settlements (release_money)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A scheduled or completed transfer from the MP account to the seller's\n * registered bank account (CBU). Settlements are the core of \"when do I\n * actually get paid\".\n */\nexport const SettlementSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: z.string().optional(),\n amount: z.number().optional(),\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n date_scheduled: z.string().optional(),\n date_processed: z.string().optional(),\n bank_account: z\n .object({\n cbu: z.string().optional(),\n bank_name: z.string().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Settlement = z.infer<typeof SettlementSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 — 3DS (Strong Customer Authentication) info derived from a Payment\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ThreeDSStatus =\n | \"not_required\" // No 3DS challenge issued (low-risk transaction).\n | \"frictionless\" // Issuer approved without challenge.\n | \"challenge_required\" // Buyer must complete the issuer's challenge.\n | \"rejected\" // Failed authentication.\n | \"unknown\"; // Couldn't determine — surface to ops.\n\nexport interface ThreeDSInfo {\n /** High-level status — the field most agents care about. */\n status: ThreeDSStatus;\n /** Raw `three_d_secure_mode` field from the payment, if present. */\n mode: string | null;\n /**\n * URL the buyer must visit to complete the 3DS challenge, if one was\n * triggered. `null` for frictionless/not_required.\n */\n challengeUrl: string | null;\n /** Human-readable explanation suitable for surfacing to the user. */\n description: string;\n}\n\n","/**\n * Mercado Pago OAuth flow — for marketplace integrations where YOUR app\n * cobra a través de cuentas MP de terceros (sellers in your platform).\n *\n * # The flow (3 legs)\n *\n * 1. **Authorize URL** — Redirect the seller to `buildAuthorizeUrl()`. They\n * log in to MP and approve your app. MP redirects them back to your\n * `redirect_uri` with `?code=AUTH_CODE&state=YOUR_STATE`.\n * 2. **Code exchange** — Your server POSTs to `/oauth/token` via\n * `exchangeCodeForToken()` with the code. Returns `{ access_token,\n * refresh_token, user_id, expires_in (~6h), ... }`. **Persist all of it.**\n * 3. **Token refresh** — Before `expires_in` runs out (or on 401), call\n * `refreshAccessToken()` with the saved `refresh_token` to get a fresh\n * access_token. The refresh_token does NOT expire and is the only way\n * to keep the integration alive long-term.\n *\n * # Per-seller MercadoPagoClient\n *\n * Once you have an OAuth `access_token` for a seller, instantiate a\n * `MercadoPagoClient({ accessToken })` AS THAT SELLER. All API calls then\n * happen on the seller's behalf — payments, refunds, subscriptions,\n * everything.\n *\n * # Marketplace fee\n *\n * To take a fee while collecting on the seller's behalf, pass\n * `marketplace`, `marketplaceFee`, `collectorId` to `createPreference()`\n * or `createOrder()`. See `MarketplaceParams` for details.\n *\n * # Setup\n *\n * 1. Register your application in MP's dev panel\n * (https://www.mercadopago.com.ar/developers/panel/applications) to get\n * `clientId` (= application id) and `clientSecret`.\n * 2. Configure the `redirect_uri` whitelist in the same panel — MP rejects\n * redirects to URIs not whitelisted.\n * 3. Pick a `marketplace` identifier (used in fee routing).\n */\n\nimport { OAuthTokenSchema, type OAuthToken } from \"./types\";\n\nconst DEFAULT_AUTHORIZE_URL = \"https://auth.mercadopago.com.ar/authorization\";\nconst DEFAULT_TOKEN_URL = \"https://api.mercadopago.com/oauth/token\";\n\n/**\n * Build the URL the seller visits to authorize your app. Redirect them here.\n * On approval, MP redirects them to `redirect_uri?code=...&state=...`.\n *\n * @param state Optional opaque value echoed back in the redirect — use this\n * to bind the OAuth round-trip to a specific user/session and\n * prevent CSRF. Always set it in production.\n */\nexport function buildAuthorizeUrl(params: {\n /** Your app's client ID (= application id from MP dev panel). */\n clientId: string;\n /** Where MP redirects after approval. Must be whitelisted in MP panel. */\n redirectUri: string;\n /** CSRF / session-binding token, echoed back. Strongly recommended. */\n state?: string;\n /**\n * Override the authorize endpoint base. Default points to AR; for other\n * sites use `https://auth.mercadopago.com.{br,mx,co,cl,uy}/authorization`.\n */\n authorizeUrl?: string;\n}): string {\n const url = new URL(params.authorizeUrl ?? DEFAULT_AUTHORIZE_URL);\n url.searchParams.set(\"client_id\", params.clientId);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"platform_id\", \"mp\");\n url.searchParams.set(\"redirect_uri\", params.redirectUri);\n if (params.state) url.searchParams.set(\"state\", params.state);\n return url.toString();\n}\n\n/**\n * Exchange the authorization code (from the OAuth redirect) for an\n * `OAuthToken`. POSTs to `/oauth/token` with `grant_type=authorization_code`.\n *\n * **Persist the entire response** — the `refresh_token` is the only way to\n * keep the integration alive long-term, and `user_id` identifies the seller.\n */\nexport async function exchangeCodeForToken(params: {\n clientId: string;\n clientSecret: string;\n /** The `code` query param from the OAuth redirect. */\n code: string;\n /** Must match the `redirect_uri` used in `buildAuthorizeUrl`. */\n redirectUri: string;\n /** Override the token endpoint (testing). */\n tokenUrl?: string;\n /** Custom fetch (testing). */\n fetchImpl?: typeof fetch;\n}): Promise<OAuthToken> {\n const url = params.tokenUrl ?? DEFAULT_TOKEN_URL;\n const fetchFn = params.fetchImpl ?? globalThis.fetch;\n const res = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: params.clientId,\n client_secret: params.clientSecret,\n code: params.code,\n redirect_uri: params.redirectUri,\n }).toString(),\n });\n return parseTokenResponse(res);\n}\n\n/**\n * Refresh an access_token using the saved refresh_token. Call this\n * proactively before `expires_in` runs out, or reactively on a 401 from a\n * per-seller MercadoPagoClient.\n *\n * The new response includes a fresh `refresh_token` — **always persist it,\n * replacing the old one**, even though MP often returns the same value.\n */\nexport async function refreshAccessToken(params: {\n clientId: string;\n clientSecret: string;\n refreshToken: string;\n tokenUrl?: string;\n fetchImpl?: typeof fetch;\n}): Promise<OAuthToken> {\n const url = params.tokenUrl ?? DEFAULT_TOKEN_URL;\n const fetchFn = params.fetchImpl ?? globalThis.fetch;\n const res = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: params.clientId,\n client_secret: params.clientSecret,\n refresh_token: params.refreshToken,\n }).toString(),\n });\n return parseTokenResponse(res);\n}\n\nasync function parseTokenResponse(res: Response): Promise<OAuthToken> {\n const text = await res.text();\n if (!res.ok) {\n throw new Error(\n `MP OAuth ${res.status}: ${text.slice(0, 300)}`,\n );\n }\n const json = JSON.parse(text);\n return OAuthTokenSchema.parse(json);\n}\n\n/**\n * Compute when an access_token will expire, given the timestamp it was\n * issued and the `expires_in` value (in seconds).\n *\n * @returns A unix-ms timestamp.\n */\nexport function expirationTimeMs(\n issuedAtMs: number,\n expiresInSeconds: number | undefined,\n): number {\n return issuedAtMs + (expiresInSeconds ?? 21_600) * 1000;\n}\n\n/**\n * Check whether an access_token is close to expiring. Use this to decide\n * whether to proactively refresh BEFORE making an API call.\n *\n * @param skewSeconds Buffer to refresh early (default 5 min). MP tokens\n * typically last 6h; refreshing in the last 5 min avoids\n * races with API calls that take a few seconds.\n */\nexport function isExpiringSoon(\n expirationMs: number,\n skewSeconds = 300,\n): boolean {\n return Date.now() + skewSeconds * 1000 >= expirationMs;\n}\n","/**\n * MP sandbox test cards for AR (MLA) — the official numbers MP publishes for\n * its TEST environment. Use these in unit tests + integration tests to\n * exercise the create_payment / charge_saved_card flows without touching a\n * real card.\n *\n * # When this matters\n *\n * Most non-trivial dev flows hit the issue of \"I want to test approved /\n * rejected / pending paths\" but MP's docs scatter the test card numbers\n * across multiple pages. This module collects them so you can `import { TEST_CARDS_AR }`\n * and pick the scenario you need.\n *\n * # Source\n *\n * AR (MLA) test cards published at\n * https://www.mercadopago.com.ar/developers/es/docs/checkout-api/additional-content/test-cards\n *\n * Last sync: 2026-05.\n */\n\n/**\n * The full data needed to test a payment:\n * - `number` — 16 digits\n * - `cvv` — 3 digits\n * - `exp` — MM/YY (use any future date in TEST mode)\n * - `paymentMethodId` — what to pass as `payment_method_id` to create_payment\n * - `holderName` — special string that triggers the desired status\n * (e.g. \"APRO\" → approved, \"OTHE\" → rejected with bad CVV)\n */\nexport interface TestCard {\n brand: string;\n number: string;\n cvv: string;\n exp: string;\n paymentMethodId: string;\n /**\n * Holder-name \"magic strings\" — MP routes the payment to a specific\n * status_detail based on this:\n * - `APRO` → status: approved\n * - `OTHE` → rejected (status_detail: cc_rejected_other_reason)\n * - `CONT` → pending (status_detail: pending_contingency)\n * - `CALL` → rejected (status_detail: cc_rejected_call_for_authorize)\n * - `FUND` → rejected (status_detail: cc_rejected_insufficient_amount)\n * - `SECU` → rejected (status_detail: cc_rejected_bad_filled_security_code)\n * - `EXPI` → rejected (status_detail: cc_rejected_bad_filled_date)\n * - `FORM` → rejected (status_detail: cc_rejected_bad_filled_other)\n */\n holderNameToTest: Record<string, string>;\n}\n\n/**\n * The MP-published test cards for AR. Pass `holderName: \"APRO\"` for an\n * approved payment, `\"OTHE\"` for a rejected one, etc.\n */\nexport const TEST_CARDS_AR: Record<string, TestCard> = {\n VISA_CREDIT: {\n brand: \"Visa (crédito)\",\n number: \"4509 9535 6623 3704\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"visa\",\n holderNameToTest: {\n APRO: \"approved\",\n OTHE: \"cc_rejected_other_reason\",\n CONT: \"pending_contingency\",\n CALL: \"cc_rejected_call_for_authorize\",\n FUND: \"cc_rejected_insufficient_amount\",\n SECU: \"cc_rejected_bad_filled_security_code\",\n EXPI: \"cc_rejected_bad_filled_date\",\n FORM: \"cc_rejected_bad_filled_other\",\n },\n },\n MASTERCARD_CREDIT: {\n brand: \"Mastercard (crédito)\",\n number: \"5031 7557 3453 0604\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"master\",\n holderNameToTest: {\n APRO: \"approved\",\n OTHE: \"cc_rejected_other_reason\",\n CONT: \"pending_contingency\",\n CALL: \"cc_rejected_call_for_authorize\",\n FUND: \"cc_rejected_insufficient_amount\",\n },\n },\n AMEX_CREDIT: {\n brand: \"American Express (crédito)\",\n number: \"3711 803032 57522\".replace(/\\s/g, \"\"),\n cvv: \"1234\",\n exp: \"11/30\",\n paymentMethodId: \"amex\",\n holderNameToTest: { APRO: \"approved\", OTHE: \"cc_rejected_other_reason\" },\n },\n VISA_DEBIT: {\n brand: \"Visa (débito)\",\n number: \"4002 7686 9439 5619\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"debvisa\",\n holderNameToTest: { APRO: \"approved\", OTHE: \"cc_rejected_other_reason\" },\n },\n MASTERCARD_DEBIT: {\n brand: \"Mastercard (débito)\",\n number: \"5287 3383 0125 4634\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"debmaster\",\n holderNameToTest: { APRO: \"approved\", OTHE: \"cc_rejected_other_reason\" },\n },\n};\n\n/**\n * Pre-built payer objects that MP recognizes as test buyers. Pair with\n * an APRO test card → status: approved.\n *\n * **Use a NEW email per call** if you don't want MP's idempotency-on-email\n * to dedupe — append a timestamp.\n */\nexport const TEST_PAYERS_AR = {\n approvedBuyer: () => ({\n email: `test_user_${Date.now()}@testuser.com`,\n identification: { type: \"DNI\", number: \"12345678\" },\n }),\n} as const;\n\n/**\n * Resolve a `(card, scenario)` pair to a ready-to-use `CreatePaymentParams`-like\n * object. Reduces boilerplate in test files.\n *\n * @example\n * ```ts\n * const card = buildTestCardScenario(\"VISA_CREDIT\", \"APRO\", 1500);\n * await client.createPayment({ ...card, externalReference: \"test-1\" });\n * ```\n */\nexport function buildTestCardScenario(\n cardKey: keyof typeof TEST_CARDS_AR,\n scenario: string,\n amountArs: number,\n): {\n transactionAmount: number;\n paymentMethodId: string;\n payerEmail: string;\n description: string;\n installments: number;\n /**\n * Magic holder name — pass to MP frontend's CardForm `cardholderName`\n * field. (For server-side create_payment, pass via additional_info.)\n */\n holderName: string;\n} {\n const card = TEST_CARDS_AR[cardKey];\n if (!card) throw new Error(`Unknown test card: ${cardKey}`);\n if (!card.holderNameToTest[scenario]) {\n throw new Error(\n `Card ${cardKey} doesn't define scenario ${scenario}. Available: ${Object.keys(card.holderNameToTest).join(\", \")}`,\n );\n }\n return {\n transactionAmount: amountArs,\n paymentMethodId: card.paymentMethodId,\n payerEmail: TEST_PAYERS_AR.approvedBuyer().email,\n description: `TEST ${scenario} via ${cardKey}`,\n installments: 1,\n holderName: scenario,\n };\n}\n","/**\n * 3DS (Strong Customer Authentication) analyzer for Mercado Pago Payments.\n *\n * # Background\n *\n * 3DS (3-D Secure / \"verified by Visa\", \"Mastercard SecureCode\") is the\n * issuer-side 2FA layer for card payments. MP triggers it automatically when:\n * - The card's issuer requires it (driven by MCC + amount + risk).\n * - The buyer's country mandates it (MX, BR, several EU countries).\n *\n * In Argentina (MLA), 3DS is OPTIONAL but strongly recommended for\n * high-value transactions and is required for some FCE MiPyMEs flows.\n *\n * # What this module does\n *\n * Given a `Payment` returned by `getPayment()` or `createPayment()`, derive\n * a normalized `ThreeDSInfo` telling you:\n * - Whether 3DS was triggered at all\n * - Whether it was frictionless (no buyer interaction) or required a challenge\n * - The challenge URL (if any) you must redirect the buyer to\n * - A human-readable description suitable for surfacing to the user\n *\n * # When to use\n *\n * Call `analyze3DS(payment)` after EVERY `createPayment()` for credit cards.\n * If `info.challengeUrl !== null`, you MUST redirect the buyer there before\n * the payment can complete — otherwise it stays in `pending` forever.\n */\n\nimport type { Payment } from \"./types\";\nimport type { ThreeDSInfo, ThreeDSStatus } from \"./types\";\n\n/**\n * Analyze a Payment's 3DS state. Pure function, no I/O.\n */\nexport function analyze3DS(payment: Payment): ThreeDSInfo {\n const raw = payment as unknown as Record<string, unknown>;\n const mode = (raw.three_d_secure_mode as string | undefined) ?? null;\n const statusDetail = (payment.status_detail as string | null) ?? null;\n\n // No 3DS field at all → not triggered for this payment.\n if (!mode || mode === \"not_supported\" || mode === \"off\") {\n return {\n status: \"not_required\",\n mode,\n challengeUrl: null,\n description:\n \"3DS no fue requerido para este pago (riesgo bajo o emisor sin 3DS habilitado).\",\n };\n }\n\n // MP exposes the challenge URL inside `three_ds_info.external_resource_url`\n // when one is required.\n const threeDsInfo = (raw.three_ds_info as\n | { external_resource_url?: string; status?: string; creq?: string }\n | undefined) ?? undefined;\n\n if (statusDetail === \"pending_challenge\" && threeDsInfo?.external_resource_url) {\n return {\n status: \"challenge_required\",\n mode,\n challengeUrl: threeDsInfo.external_resource_url,\n description:\n \"El emisor de la tarjeta requirió autenticación 3DS. Redirigí al comprador a challengeUrl para completar el desafío. El pago queda pending hasta que lo haga.\",\n };\n }\n\n // Approved + 3DS field present → frictionless flow (issuer authorized\n // without challenging the buyer).\n if (payment.status === \"approved\") {\n return {\n status: \"frictionless\",\n mode,\n challengeUrl: null,\n description: \"3DS frictionless: el emisor autorizó sin desafiar al comprador.\",\n };\n }\n\n // Rejected with 3DS-related status_detail.\n if (\n payment.status === \"rejected\" &&\n typeof statusDetail === \"string\" &&\n statusDetail.includes(\"3ds\")\n ) {\n return {\n status: \"rejected\",\n mode,\n challengeUrl: null,\n description: `Autenticación 3DS rechazada (${statusDetail}). El comprador debe usar otra tarjeta o validarla con el emisor.`,\n };\n }\n\n return {\n status: \"unknown\" as ThreeDSStatus,\n mode,\n challengeUrl: threeDsInfo?.external_resource_url ?? null,\n description:\n \"No se pudo determinar el estado 3DS — revisar payment.three_d_secure_mode + payment.status_detail manualmente.\",\n };\n}\n","import { createHmac, timingSafeEqual } from \"node:crypto\";\nimport { WebhookBodySchema, type ParsedWebhookEvent } from \"./types\";\n\n/**\n * Parse a Mercado Pago webhook from the raw request body and URL search params.\n * MP sends the topic and resource id in EITHER the URL query string OR the\n * body, depending on integration version — this normalizes both shapes into a\n * single structure.\n *\n * @example\n * ```ts\n * export async function POST(req: Request) {\n * const body = await req.json().catch(() => ({}));\n * const event = parseWebhookEvent(body, new URL(req.url).searchParams);\n * if (event && event.topic === 'preapproval') {\n * // refresh status from MP, update your store\n * }\n * return Response.json({ received: true });\n * }\n * ```\n */\nexport function parseWebhookEvent(\n body: unknown,\n searchParams?: URLSearchParams,\n): ParsedWebhookEvent | null {\n const parseResult = WebhookBodySchema.safeParse(body ?? {});\n const parsedBody = parseResult.success ? parseResult.data : {};\n\n const topic =\n searchParams?.get(\"topic\") ??\n parsedBody.topic ??\n parsedBody.type ??\n null;\n\n const dataId =\n searchParams?.get(\"id\") ??\n (parsedBody.data?.id !== undefined ? String(parsedBody.data.id) : null) ??\n parsedBody.resource ??\n null;\n\n if (!topic || !dataId) {\n return null;\n }\n\n return {\n topic,\n dataId: String(dataId),\n action: parsedBody.action ?? null,\n raw: parsedBody,\n };\n}\n\n/**\n * Verify the HMAC-SHA256 signature MP sends in the `x-signature` header for\n * webhook authenticity. Returns true if the signature matches the expected\n * value derived from the integration's secret key.\n *\n * @param requestId The value of the `x-request-id` request header.\n * @param dataId The id of the resource the webhook is about (from query or body).\n * @param signatureHeader The full `x-signature` header value MP sent.\n * @param secret Your integration's webhook secret (configured in MP dev panel).\n *\n * @remarks\n * MP's `x-signature` header has the form: `ts=NNNNNNNN,v1=HEXSIGNATURE`. We\n * extract the timestamp and the v1 signature, then compute\n * `HMAC-SHA256(secret, \"id:${dataId};request-id:${requestId};ts:${ts};\")`\n * and compare with constant-time equality.\n */\nexport function verifyWebhookSignature(params: {\n requestId: string | null;\n dataId: string;\n signatureHeader: string | null;\n secret: string;\n}): boolean {\n if (!params.signatureHeader || !params.requestId) return false;\n\n // Parse \"ts=...,v1=...\" into a map.\n const parts = Object.fromEntries(\n params.signatureHeader\n .split(\",\")\n .map((segment) => segment.trim().split(\"=\") as [string, string]),\n );\n const ts = parts.ts;\n const v1 = parts.v1;\n if (!ts || !v1) return false;\n\n const manifest = `id:${params.dataId};request-id:${params.requestId};ts:${ts};`;\n const expected = createHmac(\"sha256\", params.secret)\n .update(manifest)\n .digest(\"hex\");\n\n // Constant-time comparison; lengths must match for timingSafeEqual.\n if (expected.length !== v1.length) return false;\n return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));\n}\n","import { createHash } from \"node:crypto\";\nimport { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport type { MercadoPagoClient } from \"./client\";\nimport {\n buildAuthorizeUrl,\n exchangeCodeForToken,\n refreshAccessToken,\n} from \"./oauth\";\nimport type { SubscriptionStateAdapter } from \"./state\";\nimport { TEST_CARDS_AR } from \"./test-cards\";\nimport { analyze3DS } from \"./three-ds\";\nimport { parseWebhookEvent, verifyWebhookSignature } from \"./webhook\";\n\n/**\n * Deterministic idempotency key from caller-meaningful fields. Safe to retry:\n * the SAME inputs always produce the same key, so MP dedupes on its side\n * even if the client retries multiple times. Use a hash to keep keys short\n * + opaque (callers can't accidentally extract sensitive data from the key).\n */\nfunction deterministicIdempotencyKey(...parts: Array<string | number | undefined>): string {\n const payload = parts\n .filter((p) => p !== undefined && p !== null)\n .map(String)\n .join(\"|\");\n return createHash(\"sha256\").update(payload).digest(\"hex\").slice(0, 32);\n}\n\nexport interface MercadoPagoToolsOptions {\n /** State adapter for persisting subscription records. */\n state: SubscriptionStateAdapter;\n /**\n * Default back_url used when callers don't supply one. MUST be HTTPS — MP\n * rejects http:// and localhost back URLs even in sandbox.\n */\n backUrl: string;\n /**\n * Optionally override the agent-facing tool descriptions. Pass an object\n * with keys matching tool names; values replace the default description.\n * Useful for localizing the agent's tool reasoning.\n */\n descriptions?: Partial<Record<ToolName, string>>;\n /**\n * Default notification webhook URL used when callers don't supply one.\n * Optional — MP falls back to dashboard config if not set.\n */\n notificationUrl?: string;\n /**\n * Webhook secret for the `handle_webhook` tool. Required to verify\n * incoming webhook HMAC-SHA256 signatures. Get it from MP dev panel →\n * \"Notificaciones\" → \"Webhooks\" → \"Configurar notificaciones\".\n * If omitted, `handle_webhook` returns `{ verified: false, error: ... }`\n * and the agent should reject the webhook.\n */\n webhookSecret?: string;\n /**\n * OAuth credentials for the marketplace flow. Required for\n * `oauth_exchange_code` and `oauth_refresh_token` (the secret cannot be\n * passed by the agent — it's a server-side secret). If omitted, those\n * tools return `{ available: false }` with setup instructions.\n */\n oauth?: {\n clientId: string;\n clientSecret: string;\n };\n}\n\ntype ToolName =\n // Subscriptions (v0.1)\n | \"create_subscription\"\n | \"get_subscription_status\"\n | \"cancel_subscription\"\n | \"pause_subscription\"\n | \"resume_subscription\"\n // Payments (v0.2)\n | \"create_payment\"\n | \"get_payment\"\n | \"search_payments\"\n | \"cancel_payment\"\n | \"capture_payment\"\n // Refunds (v0.2)\n | \"refund_payment\"\n | \"list_refunds\"\n // Checkout Pro (v0.2)\n | \"create_payment_preference\"\n | \"get_payment_preference\"\n // Customers + Cards (v0.2)\n | \"create_customer\"\n | \"find_customer_by_email\"\n | \"list_customer_cards\"\n | \"delete_customer_card\"\n // Payment Methods + Installments (v0.2)\n | \"list_payment_methods\"\n | \"calculate_installments\"\n // Account (v0.2)\n | \"get_account_info\"\n // Saved-card charging (v0.3)\n | \"charge_saved_card\"\n // QR in-store (v0.3)\n | \"create_qr_payment\"\n | \"cancel_qr_payment\"\n // Subscription Plans (v0.4)\n | \"create_subscription_plan\"\n | \"list_subscription_plans\"\n | \"update_subscription_plan\"\n | \"subscribe_to_plan\"\n | \"list_subscription_payments\"\n // Stores + POS (v0.4)\n | \"create_store\"\n | \"list_stores\"\n | \"create_pos\"\n | \"list_pos\"\n // Disputes (v0.4)\n | \"list_payment_disputes\"\n | \"get_dispute\"\n // Lookup helpers (v0.4)\n | \"list_identification_types\"\n | \"list_issuers\"\n // Webhooks (v0.4)\n | \"list_webhooks\"\n | \"create_webhook\"\n | \"update_webhook\"\n | \"delete_webhook\"\n // Webhook handler combo (v0.5)\n | \"handle_webhook\"\n // OAuth Marketplace (v0.5)\n | \"oauth_authorize_url\"\n | \"oauth_exchange_code\"\n | \"oauth_refresh_token\"\n // Order Management API (v0.5)\n | \"create_order\"\n | \"get_order\"\n | \"update_order\"\n | \"capture_order\"\n | \"cancel_order\"\n // v0.6 — Account / Balance / Movements / Settlements\n | \"get_account_balance\"\n | \"list_account_movements\"\n | \"list_settlements\"\n | \"get_settlement\"\n // v0.6 — 3DS analyzer (pure)\n | \"analyze_payment_3ds\"\n // v0.6 — Test cards (pure)\n | \"get_test_cards\";\n\nconst DEFAULT_DESCRIPTIONS: Record<ToolName, string> = {\n // ── Subscriptions ────────────────────────────────────────────────────────\n create_subscription:\n \"Create a Mercado Pago recurring subscription. Returns an init_point URL where the customer must complete the FIRST payment with their card and CVV (this is a hard MP requirement; agents cannot bypass it). After they pay, MP will auto-charge at the configured frequency without further intervention.\",\n get_subscription_status:\n \"Check the current status of a Mercado Pago subscription. Use this to confirm the customer completed the first payment (status becomes 'authorized') or to inspect the next charge date.\",\n cancel_subscription:\n \"Cancel an active Mercado Pago subscription. After cancellation, MP will not charge the customer again. This action is irreversible — confirm with the user before calling.\",\n pause_subscription:\n \"Pause an authorized Mercado Pago subscription. Charges stop until resumed. Only works on subscriptions in 'authorized' status.\",\n resume_subscription:\n \"Resume a paused Mercado Pago subscription. Charges resume on the next scheduled date. Only works on subscriptions in 'paused' status.\",\n\n // ── Payments ─────────────────────────────────────────────────────────────\n create_payment:\n \"Create a one-time payment. Two flows: (a) with a card token from MP frontend Cardform — for transparent checkout; (b) without token, for non-card methods like 'account_money', 'rapipago', 'pagofacil'. For most agent flows where you only have a payer email and want to send them a payment link, use create_payment_preference instead (Checkout Pro hosted form). Returns the Payment object with status — typically 'approved' for account_money and 'pending' for tickets.\",\n get_payment:\n \"Fetch a single payment by ID. Use to confirm status after webhook arrives, or to inspect details (status_detail explains rejections).\",\n search_payments:\n \"Search payments with filters. Most common: by external_reference (your-system identifier) to find all payments for an order, or by status='approved' to list successful charges in a date range. Returns paginated results.\",\n cancel_payment:\n \"Cancel a pending or in_process payment (only works before approval). Once approved, use refund_payment instead. Common use: cancel an unpaid ticket payment that's still pending.\",\n capture_payment:\n \"Capture an authorized credit-card payment that was created with capture=false. Use for hold-then-capture flows (e.g., authorize on order, capture on shipment). Optional partial amount.\",\n\n // ── Refunds ──────────────────────────────────────────────────────────────\n refund_payment:\n \"Refund an approved payment. Pass amount for partial refund; omit for full refund. Idempotency key is auto-generated based on paymentId+amount to prevent double-refunds on retries.\",\n list_refunds:\n \"List all refunds for a given payment. Returns array of Refund objects. Useful to confirm a refund was processed or to inspect partial-refund history.\",\n\n // ── Checkout Pro ─────────────────────────────────────────────────────────\n create_payment_preference:\n \"Create a Mercado Pago Checkout Pro preference and get back a payment URL (init_point) to send to the customer. THIS is the recommended way for an agent to take a payment when you only have a payer email — the buyer enters card data on MP's hosted form (no PCI scope needed). Supports cuotas configuration, payment method exclusions, back URLs after success/failure/pending. In sandbox, use sandbox_init_point from the response.\",\n get_payment_preference:\n \"Fetch a Checkout Pro preference by ID. Returns the preference config and current init_point URLs. Use to inspect a previously-created link.\",\n\n // ── Customers + Cards ────────────────────────────────────────────────────\n create_customer:\n \"Create a Mercado Pago customer record so the buyer can save cards for future charges. Idempotent on email — if a customer with that email exists, MP returns it instead of creating a duplicate. Use find_customer_by_email first if you're unsure.\",\n find_customer_by_email:\n \"Find an existing customer by email address. Returns the customer object if found, or null. Use before create_customer to avoid duplicate records.\",\n list_customer_cards:\n \"List the saved cards for a customer. Returns array with last 4 digits, expiration, payment method (visa, master, naranja, etc.). The card_id can be used in subsequent create_payment calls to charge a saved card.\",\n delete_customer_card:\n \"Delete a saved card from a customer. Common use: customer requests removal, or expired card cleanup. Irreversible.\",\n\n // ── Payment Methods + Installments ───────────────────────────────────────\n list_payment_methods:\n \"List all payment methods enabled for the seller's MP account (visa, master, naranja, naranja_x, cabal, account_money, rapipago, pagofacil, etc.). Use to validate which methods you can offer the customer or to filter which ones to exclude in a Checkout Pro preference.\",\n calculate_installments:\n \"Calculate cuotas (installments) options for a given amount. THE killer Argentine feature — returns options like '12 cuotas sin interés de $X' (recommended_message field) which you should surface VERBATIM to the user. Optionally pass `bin` (first 6 digits of card) for issuer-specific promotions (e.g., Naranja's interest-free deals). Use before create_payment to let the user pick installments knowingly.\",\n\n // ── Account ──────────────────────────────────────────────────────────────\n get_account_info:\n \"Get info about the Mercado Pago account that owns the access token: site_id (MLA=Argentina), country_id, user_type (registered, partial, etc.). Useful to verify the agent is connected to the right account before taking actions.\",\n\n // ── Saved-card charging (v0.3) ───────────────────────────────────────────\n charge_saved_card:\n \"Charge a previously-saved card for a returning customer. Requires customer_id + card_id (from list_customer_cards) AND a fresh CVV the user provides this session. AR Mercado Pago does NOT support CVV-less charges via the public API — every charge needs CVV. Idempotent on (card_id, amount, external_reference): retries dedupe automatically. Returns the resulting Payment.\",\n\n // ── QR in-store (v0.3) ───────────────────────────────────────────────────\n create_qr_payment:\n \"Generate a dynamic in-store QR for a buyer to scan with any AR wallet (Modo, BNA+, Cuenta DNI, Naranja X, Mercado Pago, etc. — interop is mandated by Transferencias 3.0). Requires a pre-configured POS external_id (use create_pos to set one up first if needed). Returns the qr_data string + a base64 PNG data URL ready to display. The QR expires in `expires_in_seconds` (default 600). MP fires `point_integration_wh` then `payment` webhooks when scanned.\",\n cancel_qr_payment:\n \"Cancel a pending QR order on a POS. Necessary if the buyer never scans — otherwise the next create_qr_payment on the same POS returns 409.\",\n\n // ── Subscription Plans (v0.4) ────────────────────────────────────────────\n create_subscription_plan:\n \"Create a REUSABLE subscription plan (preapproval_plan). Different from create_subscription: a plan defines price + frequency once, then customers subscribe to it via subscribe_to_plan. Use plans for SaaS-style billing (Básico/Pro/Enterprise tiers). For per-customer custom amounts, use create_subscription directly.\",\n list_subscription_plans:\n \"List all subscription plans defined for this MP account. Useful before create_subscription_plan to check if one already exists, or for surfacing options to a customer.\",\n update_subscription_plan:\n \"Update a subscription plan's reason / amount / status / back_url. Existing customer subscriptions to the plan are NOT automatically updated — only NEW subscribers get the new pricing.\",\n subscribe_to_plan:\n \"Subscribe a customer to an existing reusable plan. Returns a Preapproval with init_point URL where the customer completes first payment. Cleaner than create_subscription when you have fixed tiers.\",\n list_subscription_payments:\n \"List the auto-charge attempts (authorized_payments) under a subscription. Useful for 'show me the cobros del último mes for this client' or to debug a failing recurring charge.\",\n\n // ── Stores + POS (v0.4) ──────────────────────────────────────────────────\n create_store:\n \"Create a store under the seller's MP account. Stores are the parent entity for POSes (which generate QR payments). Required ONE-TIME setup before create_pos. Pass a unique external_id and a display name.\",\n list_stores:\n \"List all stores configured for this MP account. Use this to find an existing store_id before create_pos, or to surface store options to the agent.\",\n create_pos:\n \"Create a POS (Point of Sale) under a store. The POS's external_id is what create_qr_payment uses. Each physical checkout / counter / agent typically has its own POS. Categories are MP-defined (default 621102 = Other Food and Beverage Services).\",\n list_pos:\n \"List all POSes for the seller (or filtered by store_id). Use to find an existing POS before create_qr_payment, or to surface options.\",\n\n // ── Disputes (v0.4 — read-only) ──────────────────────────────────────────\n list_payment_disputes:\n \"List all disputes / chargebacks raised against a payment. Read-only — resolution is dashboard-only. Surface the dashboard URL `https://www.mercadopago.com.ar/disputes/{dispute_id}` to the user when they need to respond.\",\n get_dispute:\n \"Get details of a specific dispute including reason, amount, resolution status. Read-only.\",\n\n // ── Lookup helpers (v0.4) ────────────────────────────────────────────────\n list_identification_types:\n \"List valid identification types for the seller's site. AR returns: DNI, CI, LE, LC, Otro, Pasaporte, CUIT, CUIL with their min/max length. Useful to validate an identification before passing to create_payment.\",\n list_issuers:\n \"List card issuers (banks) that support a payment_method_id. Optionally filter by `bin` (first 6 digits of the card) for accurate issuer detection. Useful with calculate_installments — issuer-specific promos (e.g., Naranja Galicia 6 cuotas sin interés) only appear when the issuer is identified.\",\n\n // ── Webhooks management (v0.4) ───────────────────────────────────────────\n list_webhooks:\n \"List all webhook subscriptions configured for this MP application. Use to see what topics + URLs are wired before adding new ones.\",\n create_webhook:\n \"Subscribe a webhook URL to a MP topic (payment, subscription_authorized_payment, subscription_preapproval, merchant_order, point_integration_wh). MP will POST to this URL when events of that topic fire.\",\n update_webhook:\n \"Update a webhook's URL or topic. Useful when you change deployment URLs without resubscribing from scratch.\",\n delete_webhook:\n \"Delete a webhook subscription. MP stops POSTing to it immediately.\",\n\n // ── Webhook handler combo (v0.5) ─────────────────────────────────────────\n handle_webhook:\n \"Process an incoming MP webhook in ONE call: verify the HMAC-SHA256 signature, parse the event, and (optionally) auto-fetch the underlying resource (Payment, Subscription, Order). Returns the structured event PLUS the full resource. USE THIS in your webhook endpoint INSTEAD of chaining verify_webhook_signature + parse_webhook_event + get_payment manually. Pass the raw request body, x-signature header, x-request-id header, and your MP webhook secret. SAFE: returns { verified: false } when signature mismatches — caller should respond 401 and stop processing. WHEN auto_fetch is true (default), the resource is fetched as the SAME MP user the client is configured for (so for marketplace integrations, instantiate a per-seller client).\",\n\n // ── OAuth Marketplace (v0.5) ─────────────────────────────────────────────\n oauth_authorize_url:\n \"Build the URL the SELLER (third-party MP account) visits to authorize your marketplace app. Pass the seller's redirect uri (must be whitelisted in MP dev panel) and an opaque state token (CSRF protection — bind it to the user's session). PURE FUNCTION: no network. The seller approves, MP redirects them to your `redirect_uri?code=...&state=...`. Then call oauth_exchange_code with the code.\",\n oauth_exchange_code:\n \"Exchange the authorization code (from the OAuth redirect) for an `OAuthToken`. Returns access_token, refresh_token, user_id, and expires_in. **PERSIST the entire response** — refresh_token is long-lived and the only way to keep the integration alive past 6h. Use the access_token to instantiate a per-seller MercadoPagoClient for marketplace flows.\",\n oauth_refresh_token:\n \"Refresh a per-seller access_token using the saved refresh_token. Call PROACTIVELY before expires_in elapses, or REACTIVELY on a 401 from a per-seller MercadoPagoClient. Returns a fresh OAuthToken — persist the new refresh_token (MP often returns the same value, but always replace).\",\n\n // ── Order Management API (v0.5 — modern Order API) ───────────────────────\n create_order:\n \"Create a new Order via MP's modern Order Management API. DIFFERENT from create_payment_preference: Order is a transactional entity with explicit lifecycle (created → processed → captured/canceled), supports MANUAL CAPTURE (auth-only, capture later — for ride-share, hotels, marketplaces) and aggregates multiple payments into one Order. Use Preference (Checkout Pro) for simple hosted pay-links; use Order when you need auth-only or multi-payment-per-order semantics. For marketplace splits, set marketplace + marketplace_fee + collector_id (the SELLER's MP user_id from oauth_exchange_code).\",\n get_order:\n \"Fetch an Order by ID. Returns the Order with its lifecycle status and any attached payments/refunds.\",\n update_order:\n \"Patch an existing Order before it's captured/canceled. Common use: update items or external_reference.\",\n capture_order:\n \"Capture a previously-authorized Order (only for orders created with capture_mode='manual'). Captures up to the originally-authorized amount; pass amount for partial capture. Common use: ride-share marks ride complete → capture; hotel checks-out guest → capture.\",\n cancel_order:\n \"Cancel an Order. Releases any auth-holds and marks the Order as canceled. For orders that have already been CAPTURED, use refund_payment instead — cancel only works pre-capture.\",\n\n // ── Account / Balance / Movements / Settlements (v0.6) ───────────────────\n get_account_balance:\n \"Get the seller's current MP wallet balance. Returns { available_balance, unavailable_balance, total_amount, currency_id }. The available balance is what the seller can withdraw or pay with right now; unavailable is in retention (typically 14-21 days for new sellers or risk-flagged transactions). For per-seller marketplace setups, instantiate the client AS THE SELLER first.\",\n list_account_movements:\n \"List wallet movements (incoming payments, transfers, refunds, holdings) for the active MP account. Filter by date range with `from`/`to` (ISO 8601). Useful for monthly conciliation or 'show me what came in this month' workflows.\",\n list_settlements:\n \"List settlements (release_money) — i.e. transfers from the MP wallet to the seller's registered bank account (CBU). USE WHEN the user asks 'cuándo me deposita MP' or for monthly bank-conciliation reports. Filter by date range and status.\",\n get_settlement:\n \"Get details of a single settlement: amount, date_scheduled, date_processed, bank_account info (CBU + bank name).\",\n\n // ── 3DS analyzer (v0.6 — pure) ───────────────────────────────────────────\n analyze_payment_3ds:\n \"Pure local analyzer for a Payment's 3DS (Strong Customer Authentication) state. Pass a payment_id (string) and the tool fetches the Payment then derives { status: 'not_required'|'frictionless'|'challenge_required'|'rejected'|'unknown', mode, challengeUrl, description }. USE THIS after every create_payment for credit cards: when challengeUrl !== null, you MUST redirect the buyer there before the payment can complete. Without 3DS, payments stay in 'pending' indefinitely if the issuer demanded a challenge.\",\n\n // ── Test cards (v0.6 — pure) ─────────────────────────────────────────────\n get_test_cards:\n \"Pure helper that returns the official MP test cards for AR (MLA): VISA/Mastercard/Amex credit + debit, with the 'magic' holder names that route the payment to specific status_detail values (APRO=approved, OTHE=rejected, CONT=pending, FUND=insufficient_amount, etc.). USE WHEN you need to demo a payment flow without a real card, or to script integration tests. Pure data — no network call.\",\n};\n\n/**\n * Build a tool set for the Vercel AI SDK that exposes Mercado Pago to an\n * agent. Pass directly to `Experimental_Agent`'s `tools` option, or merge with\n * other tool sets.\n *\n * @example\n * ```ts\n * import { Experimental_Agent as Agent, stepCountIs } from 'ai';\n * import { MercadoPagoClient, mercadoPagoTools, InMemoryStateAdapter } from '@ar-agents/mercadopago';\n *\n * const mp = new MercadoPagoClient({ accessToken: process.env.MP_ACCESS_TOKEN! });\n * const agent = new Agent({\n * model: 'anthropic/claude-sonnet-4-6',\n * tools: mercadoPagoTools(mp, {\n * state: new InMemoryStateAdapter(),\n * backUrl: 'https://mysite.com/done',\n * }),\n * stopWhen: stepCountIs(8),\n * });\n * ```\n */\nexport function mercadoPagoTools(\n client: MercadoPagoClient,\n options: MercadoPagoToolsOptions,\n): ToolSet {\n const desc = (name: ToolName): string =>\n options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n\n return {\n // ─────────────────────────────────────────────────────────────────────────\n // Subscriptions (v0.1 — kept identical for backward compatibility)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription: tool({\n description: desc(\"create_subscription\"),\n inputSchema: z.object({\n customer_email: z.string().email().describe(\"Email of the customer who will be charged\"),\n amount_ars: z.number().positive().describe(\"Amount in Argentine Pesos per recurring charge\"),\n frequency_months: z.number().int().positive().max(12).describe(\"Frequency in months (1=monthly, 3=quarterly, 12=yearly)\"),\n reason: z.string().min(3).max(120).describe(\"Short description shown to the customer at checkout\"),\n external_reference: z.string().optional().describe(\"Optional id from your system to track this subscription\"),\n }),\n execute: async ({ customer_email, amount_ars, frequency_months, reason, external_reference }) => {\n const created = await client.createPreapproval({\n reason,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n backUrl: options.backUrl,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n });\n await options.state.set(created.id, {\n status: created.status,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n initPoint: created.init_point,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n createdAt: new Date().toISOString(),\n });\n return {\n subscription_id: created.id,\n status: created.status,\n init_point_url: created.init_point,\n next_step:\n \"Send init_point_url to the customer. They must complete the first payment with card+CVV. Use get_subscription_status to confirm activation after they pay.\",\n };\n },\n }),\n\n get_subscription_status: tool({\n description: desc(\"get_subscription_status\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID\"),\n }),\n execute: async ({ subscription_id }) => {\n const fresh = await client.getPreapproval(subscription_id);\n const cached = await options.state.get(subscription_id);\n return {\n subscription_id: fresh.id,\n status: fresh.status,\n payer_email: fresh.payer_email,\n amount: fresh.auto_recurring.transaction_amount,\n currency: fresh.auto_recurring.currency_id,\n next_payment_date: fresh.next_payment_date ?? null,\n last_webhook_status: cached?.lastWebhookStatus ?? null,\n last_webhook_at: cached?.lastWebhookAt ?? null,\n };\n },\n }),\n\n cancel_subscription: tool({\n description: desc(\"cancel_subscription\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID to cancel\"),\n }),\n execute: async ({ subscription_id }) => {\n const cancelled = await client.cancelPreapproval(subscription_id);\n await options.state.set(subscription_id, {\n status: cancelled.status,\n cancelledAt: new Date().toISOString(),\n });\n return {\n subscription_id: cancelled.id,\n status: cancelled.status,\n message: \"Subscription cancelled. No further charges will occur.\",\n };\n },\n }),\n\n pause_subscription: tool({\n description: desc(\"pause_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const paused = await client.pausePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: paused.status });\n return {\n subscription_id: paused.id,\n status: paused.status,\n message: \"Subscription paused. Use resume_subscription to reactivate.\",\n };\n },\n }),\n\n resume_subscription: tool({\n description: desc(\"resume_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const resumed = await client.resumePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: resumed.status });\n return {\n subscription_id: resumed.id,\n status: resumed.status,\n message: \"Subscription resumed. Charges will continue on next scheduled date.\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment: tool({\n description: desc(\"create_payment\"),\n inputSchema: z.object({\n amount_ars: z.number().positive().describe(\"Amount in ARS\"),\n payment_method_id: z.string().describe(\"MP payment method id (e.g. 'account_money', 'rapipago', 'visa', 'master', 'naranja')\"),\n payer_email: z.string().email().describe(\"Email of the payer. Cannot equal seller email.\"),\n token: z.string().optional().describe(\"Card token from MP frontend Cardform. Required for credit/debit; omit for cash/account_money.\"),\n installments: z.number().int().min(1).max(24).optional().describe(\"Number of installments (cuotas). Default 1. Use calculate_installments first to see options.\"),\n description: z.string().max(255).optional().describe(\"Short description\"),\n external_reference: z.string().optional().describe(\"Your-system identifier\"),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional().describe(\"Payer identification — required for some payment types in AR\"),\n statement_descriptor: z.string().max(13).optional().describe(\"Shows on buyer's card statement (max 13 chars)\"),\n }),\n execute: async (input) => {\n const payment = await client.createPayment({\n transactionAmount: input.amount_ars,\n paymentMethodId: input.payment_method_id,\n payerEmail: input.payer_email,\n ...(input.token !== undefined ? { token: input.token } : {}),\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n // Deterministic idempotency key — safe to retry, same inputs always\n // produce the same key (MP dedupes on its side).\n idempotencyKey: deterministicIdempotencyKey(\n \"create_payment\",\n input.external_reference ?? input.payer_email,\n input.amount_ars,\n input.payment_method_id,\n input.token,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n currency: payment.currency_id,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n payer_email: payment.payer?.email ?? null,\n external_reference: payment.external_reference,\n date_created: payment.date_created,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n get_payment: tool({\n description: desc(\"get_payment\"),\n inputSchema: z.object({\n payment_id: z.string().describe(\"The MP payment ID\"),\n }),\n execute: async ({ payment_id }) => {\n const p = await client.getPayment(payment_id);\n return {\n payment_id: p.id,\n status: p.status,\n status_detail: p.status_detail,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payment_method: p.payment_method_id,\n installments: p.installments,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n date_approved: p.date_approved,\n net_received: p.transaction_details?.net_received_amount ?? null,\n };\n },\n }),\n\n search_payments: tool({\n description: desc(\"search_payments\"),\n inputSchema: z.object({\n external_reference: z.string().optional(),\n status: z.string().optional().describe(\"'approved' | 'pending' | 'rejected' | 'cancelled' | 'refunded' etc.\"),\n payer_email: z.string().optional(),\n begin_date: z.string().optional().describe(\"ISO 8601, e.g. 2026-01-01T00:00:00Z\"),\n end_date: z.string().optional().describe(\"ISO 8601\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 30, max 100\"),\n offset: z.number().int().min(0).optional().describe(\"Pagination offset (default 0)\"),\n }),\n execute: async (input) => {\n const result = await client.searchPayments({\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.payer_email !== undefined ? { payerEmail: input.payer_email } : {}),\n ...(input.begin_date !== undefined ? { beginDate: input.begin_date } : {}),\n ...(input.end_date !== undefined ? { endDate: input.end_date } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n return {\n total: result.paging.total,\n returned: result.results.length,\n offset: result.paging.offset,\n payments: result.results.map((p) => ({\n payment_id: p.id,\n status: p.status,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n })),\n };\n },\n }),\n\n cancel_payment: tool({\n description: desc(\"cancel_payment\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const cancelled = await client.cancelPayment(payment_id);\n return {\n payment_id: cancelled.id,\n status: cancelled.status,\n message: \"Payment cancelled. If it was already approved, use refund_payment instead.\",\n };\n },\n }),\n\n capture_payment: tool({\n description: desc(\"capture_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Optional partial-capture amount. Omit to capture full authorized amount.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const captured = await client.capturePayment(payment_id, amount_ars);\n return {\n payment_id: captured.id,\n status: captured.status,\n amount: captured.transaction_amount,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Refunds\n // ─────────────────────────────────────────────────────────────────────────\n\n refund_payment: tool({\n description: desc(\"refund_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Partial-refund amount in ARS. Omit for full refund.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const refund = await client.createRefund({\n paymentId: payment_id,\n ...(amount_ars !== undefined ? { amount: amount_ars } : {}),\n idempotencyKey: deterministicIdempotencyKey(\"refund\", payment_id, amount_ars ?? \"full\"),\n });\n return {\n refund_id: refund.id,\n payment_id: refund.payment_id,\n amount: refund.amount,\n status: refund.status,\n message:\n amount_ars === undefined\n ? \"Full refund issued. Funds return to the buyer in 3-10 business days.\"\n : `Partial refund of ${amount_ars} ARS issued.`,\n };\n },\n }),\n\n list_refunds: tool({\n description: desc(\"list_refunds\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const refunds = await client.listRefunds(payment_id);\n return {\n payment_id,\n count: refunds.length,\n refunds: refunds.map((r) => ({\n refund_id: r.id,\n amount: r.amount,\n status: r.status,\n date_created: r.date_created,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Checkout Pro\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment_preference: tool({\n description: desc(\"create_payment_preference\"),\n inputSchema: z.object({\n items: z.array(z.object({\n title: z.string().min(1).max(256),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n })).min(1).describe(\"Items being charged. At least one required.\"),\n payer_email: z.string().email().optional().describe(\"Pre-fill the payer email on Checkout Pro form\"),\n external_reference: z.string().optional(),\n max_installments: z.number().int().min(1).max(24).optional().describe(\"Limit max cuotas offered. Defaults to MP account config.\"),\n statement_descriptor: z.string().max(13).optional(),\n excluded_payment_types: z.array(z.enum([\"credit_card\", \"debit_card\", \"ticket\", \"atm\", \"bank_transfer\"])).optional().describe(\"Block payment types — e.g., ['ticket'] to disable Rapipago/Pago Fácil\"),\n }),\n execute: async (input) => {\n const pref = await client.createPreference({\n items: input.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: \"ARS\",\n ...(it.description !== undefined ? { description: it.description } : {}),\n ...(it.picture_url !== undefined ? { picture_url: it.picture_url } : {}),\n })),\n ...(input.payer_email !== undefined ? { payer: { email: input.payer_email } } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n backUrls: { success: options.backUrl, failure: options.backUrl, pending: options.backUrl },\n autoReturn: \"approved\",\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n ...((input.max_installments !== undefined || input.excluded_payment_types !== undefined)\n ? {\n paymentMethods: {\n ...(input.max_installments !== undefined ? { installments: input.max_installments } : {}),\n ...(input.excluded_payment_types !== undefined\n ? { excluded_payment_types: input.excluded_payment_types.map((id) => ({ id })) }\n : {}),\n },\n }\n : {}),\n });\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n date_created: pref.date_created,\n next_step:\n \"Send init_point_url (or sandbox_init_point_url in sandbox) to the customer. After they pay, MP fires a webhook with the payment_id; use get_payment to confirm status.\",\n };\n },\n }),\n\n get_payment_preference: tool({\n description: desc(\"get_payment_preference\"),\n inputSchema: z.object({ preference_id: z.string() }),\n execute: async ({ preference_id }) => {\n const pref = await client.getPreference(preference_id);\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n items: pref.items,\n date_created: pref.date_created,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ─────────────────────────────────────────────────────────────────────────\n\n create_customer: tool({\n description: desc(\"create_customer\"),\n inputSchema: z.object({\n email: z.string().email(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional(),\n description: z.string().optional(),\n }),\n execute: async (input) => {\n const customer = await client.createCustomer({\n email: input.email,\n ...(input.first_name !== undefined ? { firstName: input.first_name } : {}),\n ...(input.last_name !== undefined ? { lastName: input.last_name } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n });\n return {\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n date_created: customer.date_created,\n };\n },\n }),\n\n find_customer_by_email: tool({\n description: desc(\"find_customer_by_email\"),\n inputSchema: z.object({ email: z.string().email() }),\n execute: async ({ email }) => {\n const result = await client.searchCustomers({ email, limit: 1 });\n const customer = result.results[0] ?? null;\n return customer\n ? {\n found: true,\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n }\n : { found: false, customer_id: null };\n },\n }),\n\n list_customer_cards: tool({\n description: desc(\"list_customer_cards\"),\n inputSchema: z.object({ customer_id: z.string() }),\n execute: async ({ customer_id }) => {\n const cards = await client.listCustomerCards(customer_id);\n return {\n customer_id,\n count: cards.length,\n cards: cards.map((c) => ({\n card_id: c.id,\n last_four_digits: c.last_four_digits,\n expiration_month: c.expiration_month,\n expiration_year: c.expiration_year,\n payment_method: c.payment_method?.id ?? null,\n payment_method_name: c.payment_method?.name ?? null,\n })),\n };\n },\n }),\n\n delete_customer_card: tool({\n description: desc(\"delete_customer_card\"),\n inputSchema: z.object({\n customer_id: z.string(),\n card_id: z.string(),\n }),\n execute: async ({ customer_id, card_id }) => {\n await client.deleteCustomerCard(customer_id, card_id);\n return { customer_id, card_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_methods: tool({\n description: desc(\"list_payment_methods\"),\n inputSchema: z.object({}),\n execute: async () => {\n const methods = await client.listPaymentMethods();\n return {\n count: methods.length,\n methods: methods.map((m) => ({\n id: m.id,\n name: m.name,\n payment_type: m.payment_type_id,\n status: m.status,\n min_amount: m.min_allowed_amount,\n max_amount: m.max_allowed_amount,\n })),\n };\n },\n }),\n\n calculate_installments: tool({\n description: desc(\"calculate_installments\"),\n inputSchema: z.object({\n amount_ars: z.number().positive(),\n payment_method_id: z.string().optional().describe(\"E.g. 'visa', 'master', 'naranja'. Omit for all available methods.\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for issuer-specific offers (e.g., Naranja interest-free promotions)\"),\n }),\n execute: async (input) => {\n const offers = await client.getInstallments({\n amount: input.amount_ars,\n ...(input.payment_method_id !== undefined ? { paymentMethodId: input.payment_method_id } : {}),\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n amount: input.amount_ars,\n offers: offers.map((o) => ({\n payment_method_id: o.payment_method_id,\n payment_type_id: o.payment_type_id,\n issuer_name: o.issuer?.name ?? null,\n options: o.payer_costs.map((pc) => ({\n installments: pc.installments,\n installment_amount: pc.installment_amount,\n total_amount: pc.total_amount,\n installment_rate: pc.installment_rate,\n recommended_message: pc.recommended_message,\n })),\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Account\n // ─────────────────────────────────────────────────────────────────────────\n\n get_account_info: tool({\n description: desc(\"get_account_info\"),\n inputSchema: z.object({}),\n execute: async () => {\n const me = await client.getMe();\n return {\n account_id: me.id,\n email: me.email,\n nickname: me.nickname,\n country_id: me.country_id,\n site_id: me.site_id,\n user_type: me.user_type,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Saved-card charging (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n charge_saved_card: tool({\n description: desc(\"charge_saved_card\"),\n inputSchema: z.object({\n customer_id: z.string().describe(\"MP customer id (from create_customer / find_customer_by_email)\"),\n card_id: z.string().describe(\"Saved card id (from list_customer_cards)\"),\n security_code: z.string().regex(/^\\d{3,4}$/).describe(\"CVV — 3 digits (Visa/Master) or 4 (Amex). User must provide this each charge in AR.\"),\n amount_ars: z.number().positive(),\n description: z.string().min(1).max(255),\n installments: z.number().int().min(1).max(24).optional().describe(\"Default 1. Use calculate_installments first to pick a valid count.\"),\n external_reference: z.string().optional(),\n statement_descriptor: z.string().max(13).optional(),\n }),\n execute: async (input) => {\n const payment = await client.chargeSavedCard({\n customerId: input.customer_id,\n cardId: input.card_id,\n securityCode: input.security_code,\n amount: input.amount_ars,\n description: input.description,\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n idempotencyKey: deterministicIdempotencyKey(\n \"charge_saved_card\",\n input.card_id,\n input.amount_ars,\n input.external_reference,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n customer_id: input.customer_id,\n card_id: input.card_id,\n external_reference: payment.external_reference,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // QR in-store (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_qr_payment: tool({\n description: desc(\"create_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string().describe(\"Pre-configured POS external_id from MP dashboard. Required.\"),\n amount_ars: z.number().positive(),\n title: z.string().min(1).max(80).describe(\"Display title shown when scanning\"),\n description: z.string().max(255).optional(),\n external_reference: z.string().optional(),\n notification_url: z.string().url().optional().describe(\"Webhook URL — falls back to dashboard config if omitted\"),\n expires_in_seconds: z.number().int().min(60).max(3600).optional().describe(\"Default 600 (10 min)\"),\n }),\n execute: async (input) => {\n // Lazy-load qrcode to keep cold-start lean for users who don't use QR\n const QRCode = (await import(\"qrcode\")).default;\n const me = await client.getMe();\n const userId = String(me.id);\n const expiresAt = new Date(\n Date.now() + (input.expires_in_seconds ?? 600) * 1000,\n ).toISOString();\n\n const qr = await client.createQrPayment(userId, {\n externalPosId: input.external_pos_id,\n totalAmount: input.amount_ars,\n title: input.title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.notification_url !== undefined ? { notificationUrl: input.notification_url } : {}),\n expirationDate: expiresAt,\n });\n\n const qrDataUrl = await QRCode.toDataURL(qr.qr_data, {\n errorCorrectionLevel: \"M\",\n margin: 1,\n width: 512,\n });\n\n return {\n in_store_order_id: qr.in_store_order_id,\n qr_data: qr.qr_data,\n qr_data_url: qrDataUrl,\n expires_at: expiresAt,\n external_pos_id: input.external_pos_id,\n amount: input.amount_ars,\n next_step:\n \"Display the qr_data_url image to the buyer. Wait for the payment webhook (point_integration_wh fires first, then payment topic). If buyer doesn't scan in time, call cancel_qr_payment to free the POS.\",\n };\n },\n }),\n\n cancel_qr_payment: tool({\n description: desc(\"cancel_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string(),\n }),\n execute: async ({ external_pos_id }) => {\n const me = await client.getMe();\n await client.cancelQrPayment(String(me.id), external_pos_id);\n return { external_pos_id, cancelled: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Subscription Plans (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription_plan: tool({\n description: desc(\"create_subscription_plan\"),\n inputSchema: z.object({\n reason: z.string().min(3).max(120).describe(\"Plan name shown at checkout\"),\n amount_ars: z.number().positive(),\n frequency_months: z.number().int().min(1).max(12),\n back_url: z.string().url().describe(\"HTTPS URL where MP redirects after first payment\"),\n external_reference: z.string().optional(),\n free_trial_days: z.number().int().min(1).max(60).optional().describe(\"Free trial period in days before first charge\"),\n }),\n execute: async (input) => {\n const plan = await client.createSubscriptionPlan({\n reason: input.reason,\n amount: input.amount_ars,\n currency: \"ARS\",\n frequency: input.frequency_months,\n frequencyType: \"months\",\n backUrl: input.back_url,\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.free_trial_days !== undefined ? { freeTrialFrequency: input.free_trial_days, freeTrialFrequencyType: \"days\" as const } : {}),\n });\n return {\n plan_id: plan.id,\n status: plan.status,\n reason: plan.reason,\n amount: plan.auto_recurring.transaction_amount,\n currency: plan.auto_recurring.currency_id,\n frequency: `${plan.auto_recurring.frequency} ${plan.auto_recurring.frequency_type}`,\n external_reference: plan.external_reference,\n next_step: \"Use subscribe_to_plan to enroll customers in this plan, or share its ID for them to subscribe via your frontend.\",\n };\n },\n }),\n\n list_subscription_plans: tool({\n description: desc(\"list_subscription_plans\"),\n inputSchema: z.object({\n status: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listSubscriptionPlans({\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n plans: result.results.map((p) => ({\n plan_id: p.id,\n reason: p.reason,\n status: p.status,\n amount: p.auto_recurring.transaction_amount,\n currency: p.auto_recurring.currency_id,\n frequency: `${p.auto_recurring.frequency} ${p.auto_recurring.frequency_type}`,\n })),\n };\n },\n }),\n\n update_subscription_plan: tool({\n description: desc(\"update_subscription_plan\"),\n inputSchema: z.object({\n plan_id: z.string(),\n reason: z.string().optional(),\n amount_ars: z.number().positive().optional(),\n status: z.enum([\"active\", \"cancelled\"]).optional(),\n back_url: z.string().url().optional(),\n }),\n execute: async (input) => {\n const updated = await client.updateSubscriptionPlan(input.plan_id, {\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(input.amount_ars !== undefined ? { amount: input.amount_ars } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.back_url !== undefined ? { backUrl: input.back_url } : {}),\n });\n return {\n plan_id: updated.id,\n status: updated.status,\n reason: updated.reason,\n amount: updated.auto_recurring.transaction_amount,\n message: input.amount_ars !== undefined\n ? \"Updated. Existing subscribers keep their old amount; only NEW subscribers get the new pricing.\"\n : \"Plan updated.\",\n };\n },\n }),\n\n subscribe_to_plan: tool({\n description: desc(\"subscribe_to_plan\"),\n inputSchema: z.object({\n plan_id: z.string(),\n customer_email: z.string().email(),\n external_reference: z.string().optional(),\n }),\n execute: async (input) => {\n const sub = await client.subscribeToPlan({\n planId: input.plan_id,\n payerEmail: input.customer_email,\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n });\n return {\n subscription_id: sub.id,\n status: sub.status,\n payer_email: sub.payer_email,\n init_point_url: sub.init_point,\n next_step: \"Send init_point_url to the customer for first payment with card+CVV.\",\n };\n },\n }),\n\n list_subscription_payments: tool({\n description: desc(\"list_subscription_payments\"),\n inputSchema: z.object({\n subscription_id: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listSubscriptionPayments(input.subscription_id, {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n subscription_id: input.subscription_id,\n total: result.paging.total,\n payments: result.results.map((p) => ({\n authorized_payment_id: p.id,\n payment_id: p.payment_id ?? null,\n status: p.status,\n amount: p.transaction_amount ?? null,\n currency: p.currency_id ?? null,\n debit_date: p.debit_date ?? null,\n next_retry_date: p.next_retry_date ?? null,\n retry_attempt: p.retry_attempt ?? 0,\n reason: p.reason ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Stores + POS (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_store: tool({\n description: desc(\"create_store\"),\n inputSchema: z.object({\n name: z.string().min(1).max(80),\n external_id: z.string().min(1).max(64).describe(\"Unique within the seller's stores\"),\n address_line: z.string().optional(),\n city_name: z.string().optional(),\n state_name: z.string().optional(),\n }),\n execute: async (input) => {\n const me = await client.getMe();\n const store = await client.createStore(String(me.id), {\n name: input.name,\n externalId: input.external_id,\n ...(input.address_line || input.city_name || input.state_name\n ? {\n location: {\n ...(input.address_line ? { addressLine: input.address_line } : {}),\n ...(input.city_name ? { cityName: input.city_name } : {}),\n ...(input.state_name ? { stateName: input.state_name } : {}),\n countryId: \"AR\",\n },\n }\n : {}),\n });\n return {\n store_id: store.id,\n name: store.name,\n external_id: store.external_id,\n next_step: \"Use create_pos with this store_id to add a Point of Sale where create_qr_payment can issue QRs.\",\n };\n },\n }),\n\n list_stores: tool({\n description: desc(\"list_stores\"),\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const me = await client.getMe();\n const result = await client.listStores(String(me.id), {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n stores: result.results.map((s) => ({\n store_id: s.id,\n name: s.name ?? null,\n external_id: s.external_id ?? null,\n })),\n };\n },\n }),\n\n create_pos: tool({\n description: desc(\"create_pos\"),\n inputSchema: z.object({\n name: z.string().min(1).max(80),\n external_id: z.string().min(1).max(64).describe(\"Unique within the store. This is what create_qr_payment uses.\"),\n store_id: z.string().describe(\"From create_store / list_stores\"),\n category: z.number().int().optional().describe(\"MP category code, default 621102 (other food/beverage)\"),\n fixed_amount: z.boolean().optional().describe(\"True for static QR with fixed amount; false (default) for dynamic per-order QR\"),\n }),\n execute: async (input) => {\n const pos = await client.createPos({\n name: input.name,\n externalId: input.external_id,\n storeId: input.store_id,\n ...(input.category !== undefined ? { category: input.category } : {}),\n ...(input.fixed_amount !== undefined ? { fixedAmount: input.fixed_amount } : {}),\n });\n return {\n pos_id: pos.id,\n external_id: pos.external_id,\n store_id: pos.store_id,\n name: pos.name,\n next_step: \"Use create_qr_payment with this external_id to start issuing dynamic QRs from this POS.\",\n };\n },\n }),\n\n list_pos: tool({\n description: desc(\"list_pos\"),\n inputSchema: z.object({\n store_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listPos({\n ...(input.store_id !== undefined ? { storeId: input.store_id } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n pos: result.results.map((p) => ({\n pos_id: p.id,\n external_id: p.external_id ?? null,\n store_id: p.store_id ?? null,\n name: p.name ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disputes (v0.4 — read-only)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_disputes: tool({\n description: desc(\"list_payment_disputes\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const disputes = await client.listPaymentDisputes(payment_id);\n return {\n payment_id,\n count: disputes.length,\n disputes: disputes.map((d) => ({\n dispute_id: d.id,\n status: d.status,\n amount: d.amount ?? null,\n reason: d.reason ?? null,\n date_created: d.date_created ?? null,\n dashboard_url: `https://www.mercadopago.com.ar/disputes/${d.id}`,\n })),\n };\n },\n }),\n\n get_dispute: tool({\n description: desc(\"get_dispute\"),\n inputSchema: z.object({\n payment_id: z.string(),\n dispute_id: z.string(),\n }),\n execute: async ({ payment_id, dispute_id }) => {\n const d = await client.getDispute(payment_id, dispute_id);\n return {\n dispute_id: d.id,\n status: d.status,\n amount: d.amount ?? null,\n reason: d.reason ?? null,\n reason_description: d.reason_description ?? null,\n resolution: d.resolution ?? null,\n date_created: d.date_created ?? null,\n dashboard_url: `https://www.mercadopago.com.ar/disputes/${d.id}`,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lookup helpers (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_identification_types: tool({\n description: desc(\"list_identification_types\"),\n inputSchema: z.object({}),\n execute: async () => {\n const types = await client.listIdentificationTypes();\n return {\n count: types.length,\n types: types.map((t) => ({\n id: t.id,\n name: t.name,\n type: t.type,\n min_length: t.min_length ?? null,\n max_length: t.max_length ?? null,\n })),\n };\n },\n }),\n\n list_issuers: tool({\n description: desc(\"list_issuers\"),\n inputSchema: z.object({\n payment_method_id: z.string().describe(\"E.g. 'visa', 'master', 'naranja'\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for precise issuer detection\"),\n }),\n execute: async (input) => {\n const issuers = await client.listIssuers({\n paymentMethodId: input.payment_method_id,\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n payment_method_id: input.payment_method_id,\n count: issuers.length,\n issuers: issuers.map((i) => ({\n issuer_id: i.id,\n name: i.name,\n status: i.status ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Webhooks management (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_webhooks: tool({\n description: desc(\"list_webhooks\"),\n inputSchema: z.object({}),\n execute: async () => {\n const hooks = await client.listWebhooks();\n return {\n count: hooks.length,\n webhooks: hooks.map((h) => ({\n webhook_id: h.id,\n url: h.url ?? null,\n topic: h.topic ?? null,\n status: h.status ?? null,\n date_created: h.date_created ?? null,\n })),\n };\n },\n }),\n\n create_webhook: tool({\n description: desc(\"create_webhook\"),\n inputSchema: z.object({\n url: z.string().url(),\n topic: z.string().describe(\"E.g. 'payment', 'subscription_authorized_payment', 'subscription_preapproval', 'merchant_order', 'point_integration_wh'\"),\n }),\n execute: async ({ url, topic }) => {\n const hook = await client.createWebhook({ url, topic });\n return {\n webhook_id: hook.id,\n url: hook.url ?? url,\n topic: hook.topic ?? topic,\n status: hook.status ?? null,\n };\n },\n }),\n\n update_webhook: tool({\n description: desc(\"update_webhook\"),\n inputSchema: z.object({\n webhook_id: z.string(),\n url: z.string().url().optional(),\n topic: z.string().optional(),\n }),\n execute: async (input) => {\n const hook = await client.updateWebhook(input.webhook_id, {\n ...(input.url !== undefined ? { url: input.url } : {}),\n ...(input.topic !== undefined ? { topic: input.topic } : {}),\n });\n return {\n webhook_id: hook.id,\n url: hook.url ?? null,\n topic: hook.topic ?? null,\n status: hook.status ?? null,\n };\n },\n }),\n\n delete_webhook: tool({\n description: desc(\"delete_webhook\"),\n inputSchema: z.object({ webhook_id: z.string() }),\n execute: async ({ webhook_id }) => {\n await client.deleteWebhook(webhook_id);\n return { webhook_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.5 — Webhook handler combo\n // ─────────────────────────────────────────────────────────────────────────\n\n handle_webhook: tool({\n description: desc(\"handle_webhook\"),\n inputSchema: z.object({\n raw_body: z\n .string()\n .describe(\n \"The raw JSON body of the webhook request, exactly as received (do NOT re-stringify). Pass `await req.text()` from your handler.\",\n ),\n signature_header: z\n .string()\n .nullable()\n .describe(\"Value of the `x-signature` request header.\"),\n request_id_header: z\n .string()\n .nullable()\n .describe(\"Value of the `x-request-id` request header.\"),\n auto_fetch: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n \"If true (default), fetch the underlying resource (Payment, Subscription, etc.) AS the MP user the client is configured for. Set to false to skip the fetch (faster, useful when you only need the topic+id).\",\n ),\n }),\n execute: async ({\n raw_body,\n signature_header,\n request_id_header,\n auto_fetch,\n }) => {\n if (!options.webhookSecret) {\n return {\n verified: false,\n error:\n \"webhookSecret not configured in mercadoPagoTools options. Pass it from MP dev panel → Notificaciones → Webhooks.\",\n event: null,\n resource: null,\n };\n }\n let parsedBody: unknown;\n try {\n parsedBody = JSON.parse(raw_body);\n } catch {\n return {\n verified: false,\n error: \"raw_body is not valid JSON.\",\n event: null,\n resource: null,\n };\n }\n const event = parseWebhookEvent(parsedBody);\n if (!event) {\n return {\n verified: false,\n error: \"Could not extract topic + dataId from webhook body.\",\n event: null,\n resource: null,\n };\n }\n const verified = verifyWebhookSignature({\n requestId: request_id_header,\n dataId: event.dataId,\n signatureHeader: signature_header,\n secret: options.webhookSecret,\n });\n if (!verified) {\n return {\n verified: false,\n error: \"HMAC-SHA256 signature mismatch. Reject the webhook (HTTP 401).\",\n event,\n resource: null,\n };\n }\n let resource: unknown = null;\n let resourceError: string | null = null;\n if (auto_fetch) {\n try {\n switch (event.topic) {\n case \"payment\":\n case \"payment.created\":\n case \"payment.updated\":\n resource = await client.getPayment(event.dataId);\n break;\n case \"preapproval\":\n case \"subscription_preapproval\":\n resource = await client.getPreapproval(event.dataId);\n break;\n case \"subscription_authorized_payment\":\n // No direct fetch endpoint; the data id IS the authorized_payment id.\n resource = { id: event.dataId, hint: \"Use list_subscription_payments to enumerate parent.\" };\n break;\n default:\n resource = null;\n resourceError = `No auto-fetch handler for topic '${event.topic}' yet.`;\n }\n } catch (err) {\n resourceError = err instanceof Error ? err.message : String(err);\n }\n }\n return {\n verified: true,\n event,\n resource,\n resource_error: resourceError,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.5 — OAuth Marketplace flow\n // ─────────────────────────────────────────────────────────────────────────\n\n oauth_authorize_url: tool({\n description: desc(\"oauth_authorize_url\"),\n inputSchema: z.object({\n redirect_uri: z\n .string()\n .url()\n .describe(\n \"Where MP redirects the seller after approval. MUST be whitelisted in MP dev panel → Aplicaciones → tu app → Redirect URIs.\",\n ),\n state: z\n .string()\n .min(8)\n .describe(\n \"Opaque CSRF/session token echoed back. Bind to the user's session and verify on redirect.\",\n ),\n }),\n execute: async ({ redirect_uri, state }) => {\n if (!options.oauth?.clientId) {\n return {\n available: false,\n error:\n \"OAuth not configured. Pass `oauth: { clientId, clientSecret }` to mercadoPagoTools options.\",\n url: null,\n };\n }\n const url = buildAuthorizeUrl({\n clientId: options.oauth.clientId,\n redirectUri: redirect_uri,\n state,\n });\n return {\n available: true,\n url,\n next_step:\n \"Redirect the seller to `url`. After approval MP sends them to redirect_uri?code=...&state=... — verify state matches, then call oauth_exchange_code with the code.\",\n };\n },\n }),\n\n oauth_exchange_code: tool({\n description: desc(\"oauth_exchange_code\"),\n inputSchema: z.object({\n code: z\n .string()\n .describe(\"The `code` query param from the OAuth redirect URL.\"),\n redirect_uri: z\n .string()\n .url()\n .describe(\n \"Must EXACTLY match the redirect_uri used in oauth_authorize_url.\",\n ),\n }),\n execute: async ({ code, redirect_uri }) => {\n if (!options.oauth?.clientId || !options.oauth?.clientSecret) {\n return {\n available: false,\n error:\n \"OAuth not configured. Pass `oauth: { clientId, clientSecret }` to mercadoPagoTools options.\",\n token: null,\n };\n }\n try {\n const token = await exchangeCodeForToken({\n clientId: options.oauth.clientId,\n clientSecret: options.oauth.clientSecret,\n code,\n redirectUri: redirect_uri,\n });\n return {\n available: true,\n token,\n next_step:\n \"PERSIST { user_id, access_token, refresh_token, expires_in } against this seller. Use access_token to instantiate `new MercadoPagoClient({ accessToken })` AS the seller for marketplace API calls.\",\n };\n } catch (err) {\n return {\n available: true,\n error: err instanceof Error ? err.message : String(err),\n token: null,\n };\n }\n },\n }),\n\n oauth_refresh_token: tool({\n description: desc(\"oauth_refresh_token\"),\n inputSchema: z.object({\n refresh_token: z\n .string()\n .describe(\"The saved refresh_token for this seller.\"),\n }),\n execute: async ({ refresh_token }) => {\n if (!options.oauth?.clientId || !options.oauth?.clientSecret) {\n return {\n available: false,\n error:\n \"OAuth not configured. Pass `oauth: { clientId, clientSecret }` to mercadoPagoTools options.\",\n token: null,\n };\n }\n try {\n const token = await refreshAccessToken({\n clientId: options.oauth.clientId,\n clientSecret: options.oauth.clientSecret,\n refreshToken: refresh_token,\n });\n return {\n available: true,\n token,\n next_step:\n \"Replace the persisted access_token + refresh_token with these new values (refresh_token may have rotated).\",\n };\n } catch (err) {\n return {\n available: true,\n error: err instanceof Error ? err.message : String(err),\n token: null,\n };\n }\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.5 — Order Management API\n // ─────────────────────────────────────────────────────────────────────────\n\n create_order: tool({\n description: desc(\"create_order\"),\n inputSchema: z.object({\n type: z\n .enum([\"online\", \"in_store\"])\n .describe(\"'online' for hosted/checkout flow, 'in_store' for QR/POS\"),\n currency_id: z.string().optional().default(\"ARS\"),\n external_reference: z.string().optional(),\n total_amount: z.number().positive().optional(),\n items: z\n .array(\n z.object({\n title: z.string(),\n unit_price: z.number(),\n quantity: z.number(),\n description: z.string().optional(),\n }),\n )\n .optional(),\n payer_email: z.string().email().optional(),\n capture_mode: z\n .enum([\"automatic\", \"manual\"])\n .optional()\n .describe(\n \"'automatic' charges immediately; 'manual' authorizes only — capture later via capture_order.\",\n ),\n notification_url: z.string().url().optional(),\n marketplace: z\n .string()\n .optional()\n .describe(\n \"Marketplace identifier (your app's name). Required for split payments.\",\n ),\n marketplace_fee: z\n .number()\n .optional()\n .describe(\n \"Fee in ARS (NOT %) credited to the marketplace's MP account.\",\n ),\n collector_id: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\n \"Seller's MP user_id (from oauth_exchange_code.user_id). Funds route here; marketplace_fee is split off to your account.\",\n ),\n }),\n execute: async (input) => {\n const params: Parameters<typeof client.createOrder>[0] = {\n type: input.type,\n };\n if (input.currency_id) params.currency_id = input.currency_id;\n if (input.external_reference) params.external_reference = input.external_reference;\n if (input.total_amount !== undefined) params.total_amount = input.total_amount;\n if (input.items) params.items = input.items;\n if (input.payer_email) params.payer = { email: input.payer_email };\n if (input.capture_mode) params.capture_mode = input.capture_mode;\n if (input.notification_url) params.notification_url = input.notification_url;\n if (input.marketplace) params.marketplace = input.marketplace;\n if (input.marketplace_fee !== undefined) params.marketplace_fee = input.marketplace_fee;\n if (input.collector_id !== undefined) params.collector_id = input.collector_id;\n const order = await client.createOrder(params, {\n idempotencyKey: deterministicIdempotencyKey(\n \"create_order\",\n input.external_reference,\n input.total_amount,\n input.collector_id,\n ),\n });\n return {\n order_id: order.id,\n status: order.status ?? null,\n capture_mode: order.capture_mode ?? params.capture_mode ?? \"automatic\",\n total_amount: order.total_amount ?? null,\n };\n },\n }),\n\n get_order: tool({\n description: desc(\"get_order\"),\n inputSchema: z.object({ order_id: z.string() }),\n execute: async ({ order_id }) => {\n const order = await client.getOrder(order_id);\n return order;\n },\n }),\n\n update_order: tool({\n description: desc(\"update_order\"),\n inputSchema: z.object({\n order_id: z.string(),\n external_reference: z.string().optional(),\n total_amount: z.number().optional(),\n }),\n execute: async ({ order_id, external_reference, total_amount }) => {\n const patch: Parameters<typeof client.updateOrder>[1] = {};\n if (external_reference !== undefined) patch.external_reference = external_reference;\n if (total_amount !== undefined) patch.total_amount = total_amount;\n const order = await client.updateOrder(order_id, patch);\n return order;\n },\n }),\n\n capture_order: tool({\n description: desc(\"capture_order\"),\n inputSchema: z.object({\n order_id: z.string(),\n amount: z\n .number()\n .positive()\n .optional()\n .describe(\n \"Optional partial-capture amount. Omit to capture the full authorized amount.\",\n ),\n }),\n execute: async ({ order_id, amount }) => {\n const order = await client.captureOrder(order_id, amount);\n return {\n order_id: order.id,\n status: order.status ?? null,\n captured_amount: amount ?? order.total_amount ?? null,\n };\n },\n }),\n\n cancel_order: tool({\n description: desc(\"cancel_order\"),\n inputSchema: z.object({ order_id: z.string() }),\n execute: async ({ order_id }) => {\n const order = await client.cancelOrder(order_id);\n return {\n order_id: order.id,\n status: order.status ?? \"canceled\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.6 — Account / Balance / Movements / Settlements\n // ─────────────────────────────────────────────────────────────────────────\n\n get_account_balance: tool({\n description: desc(\"get_account_balance\"),\n inputSchema: z.object({}),\n execute: async () => {\n const balance = await client.getAccountBalance();\n return balance;\n },\n }),\n\n list_account_movements: tool({\n description: desc(\"list_account_movements\"),\n inputSchema: z.object({\n from: z\n .string()\n .optional()\n .describe(\"ISO 8601 start date (e.g. 2026-05-01)\"),\n to: z\n .string()\n .optional()\n .describe(\"ISO 8601 end date\"),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ from, to, limit, offset }) => {\n const params: Parameters<typeof client.listAccountMovements>[0] = {};\n if (from !== undefined) params.from = from;\n if (to !== undefined) params.to = to;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.listAccountMovements(params);\n },\n }),\n\n list_settlements: tool({\n description: desc(\"list_settlements\"),\n inputSchema: z.object({\n from: z.string().optional(),\n to: z.string().optional(),\n status: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ from, to, status, limit, offset }) => {\n const params: Parameters<typeof client.listSettlements>[0] = {};\n if (from !== undefined) params.from = from;\n if (to !== undefined) params.to = to;\n if (status !== undefined) params.status = status;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.listSettlements(params);\n },\n }),\n\n get_settlement: tool({\n description: desc(\"get_settlement\"),\n inputSchema: z.object({ settlement_id: z.string() }),\n execute: async ({ settlement_id }) => {\n return client.getSettlement(settlement_id);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.6 — 3DS analyzer (combined: fetch payment + analyze)\n // ─────────────────────────────────────────────────────────────────────────\n\n analyze_payment_3ds: tool({\n description: desc(\"analyze_payment_3ds\"),\n inputSchema: z.object({\n payment_id: z.string().describe(\"MP payment id\"),\n }),\n execute: async ({ payment_id }) => {\n const payment = await client.getPayment(payment_id);\n const info = analyze3DS(payment);\n return {\n payment_id,\n payment_status: payment.status,\n payment_status_detail: payment.status_detail ?? null,\n ...info,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.6 — Test cards (pure)\n // ─────────────────────────────────────────────────────────────────────────\n\n get_test_cards: tool({\n description: desc(\"get_test_cards\"),\n inputSchema: z.object({}),\n execute: async () => {\n return {\n site: \"MLA\",\n cards: TEST_CARDS_AR,\n usage:\n \"Pass holderName='APRO' for an approved payment, 'OTHE' for rejected, 'CONT' for pending, 'FUND' for insufficient amount, 'CALL' for call-for-authorize. Use a NEW payer email per call (append a timestamp) to avoid MP idempotency-on-email deduping.\",\n };\n },\n }),\n } satisfies ToolSet;\n}\n","/**\n * In-memory record of a subscription. The lib persists the MP-side fields\n * needed to reason about a subscription without hitting the API every time\n * (status, last webhook info, customer email, etc.) plus a free-form metadata\n * bag for callers to attach business context (tenant id, plan name, etc.).\n */\nexport interface SubscriptionStateRecord {\n status?: string;\n payerEmail?: string;\n amount?: number;\n currency?: string;\n frequency?: number;\n frequencyType?: string;\n initPoint?: string;\n externalReference?: string;\n createdAt?: string;\n cancelledAt?: string;\n lastWebhookStatus?: string;\n lastWebhookAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Persistence surface for subscription state. Implementations may back this\n * with Upstash Redis, Vercel KV, Postgres, in-memory, or anything that\n * supports the three operations. The default `InMemoryStateAdapter` is\n * provided for tests and trivial single-process deployments; production\n * setups should plug in a durable store.\n */\nexport interface SubscriptionStateAdapter {\n set(id: string, state: Partial<SubscriptionStateRecord>): Promise<void>;\n get(id: string): Promise<SubscriptionStateRecord | null>;\n list?(): Promise<string[]>;\n}\n\n/**\n * Volatile, single-process state adapter. Useful for tests and demos. Do not\n * use in production: state is lost on restart and is not safe across tenants.\n */\nexport class InMemoryStateAdapter implements SubscriptionStateAdapter {\n private readonly store = new Map<string, SubscriptionStateRecord>();\n\n async set(\n id: string,\n state: Partial<SubscriptionStateRecord>,\n ): Promise<void> {\n const existing = this.store.get(id) ?? {};\n this.store.set(id, { ...existing, ...state });\n }\n\n async get(id: string): Promise<SubscriptionStateRecord | null> {\n return this.store.get(id) ?? null;\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.store.keys());\n }\n\n /** Test helper: drop everything. Not part of the adapter interface. */\n reset(): void {\n this.store.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/crypto.ts","../src/types.ts","../src/oauth.ts","../src/helpers.ts","../src/test-cards.ts","../src/three-ds.ts","../src/webhook.ts","../src/tools.ts","../src/state.ts"],"names":["text","z","tool"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base class for any error originating from the Mercado Pago integration. All\n * specific error types extend this. Carries the MP HTTP status, the parsed\n * body when available, and the endpoint that failed for debugging.\n */\nexport class MercadoPagoError extends Error {\n constructor(\n message: string,\n public status: number,\n public endpoint: string,\n public mpResponse?: unknown,\n ) {\n super(message);\n this.name = \"MercadoPagoError\";\n }\n}\n\n/**\n * Thrown when the access token is missing, expired, or rejected by MP.\n */\nexport class MercadoPagoAuthError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the request as unauthorized. Check the access token (TEST- prefix for sandbox, APP_USR- for production).\",\n 401,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAuthError\";\n }\n}\n\n/**\n * Thrown when MP returns the \"back_url is not a valid URL\" rejection. Common\n * when devs pass localhost or http:// — MP requires HTTPS only, even in sandbox.\n */\nexport class MercadoPagoBackUrlInvalidError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"back_url must be a valid HTTPS URL. localhost and http:// URLs are rejected by Mercado Pago, including in sandbox. Use a placeholder like https://example.com/done for local testing.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoBackUrlInvalidError\";\n }\n}\n\n/**\n * Thrown when the buyer email matches the seller account's email. MP refuses\n * self-payment on subscriptions: the Confirmar button at the init_point UI\n * stays disabled with no surfaceable error message.\n */\nexport class MercadoPagoSelfPaymentError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"The buyer email cannot equal the seller account's email. Mercado Pago blocks self-payment on subscriptions.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoSelfPaymentError\";\n }\n}\n\n/**\n * Thrown when MP returns \"Cannot operate between different countries\". Despite\n * the error text, this generally signals an account-type mismatch (real\n * account-in-test-mode vs. test user account), not a literal country mismatch.\n */\nexport class MercadoPagoAccountTypeMismatchError extends MercadoPagoError {\n constructor(endpoint: string, body?: unknown) {\n super(\n \"Mercado Pago rejected the operation: 'Cannot operate between different countries'. Despite the wording, this usually means the seller token and the buyer email are different account types (real-account-in-test-mode vs. test_user_*@testuser.com). Use a real consumer email as the buyer.\",\n 400,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoAccountTypeMismatchError\";\n }\n}\n\n/**\n * Thrown when MP's risk engine rejects the first payment of a subscription.\n * IMPORTANT: when this happens, MP automatically cancels the entire preapproval\n * — you cannot retry on the same subscription, you must create a fresh one.\n */\nexport class MercadoPagoPaymentRejectedError extends MercadoPagoError {\n constructor(\n public preapprovalId: string,\n public statusDetail: string | null,\n body?: unknown,\n ) {\n super(\n `Payment rejected by Mercado Pago risk engine on preapproval ${preapprovalId}. Status detail: ${statusDetail ?? \"unknown\"}. The preapproval was auto-cancelled by MP — create a fresh subscription to retry.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoPaymentRejectedError\";\n }\n}\n\n/**\n * Thrown when an attempt is made to authorize a preapproval via API. Only the\n * payer can authorize via the init_point UI; there is no admin override even\n * in sandbox.\n */\nexport class MercadoPagoAuthorizeForbiddenError extends MercadoPagoError {\n constructor(preapprovalId: string, body?: unknown) {\n super(\n `Cannot authorize preapproval ${preapprovalId} via API: only the payer can authorize through the init_point checkout. There is no API shortcut, even in sandbox.`,\n 400,\n `/preapproval/${preapprovalId}`,\n body,\n );\n this.name = \"MercadoPagoAuthorizeForbiddenError\";\n }\n}\n\n/**\n * Thrown when MP rate-limits the integration. Retry with exponential backoff.\n */\nexport class MercadoPagoRateLimitError extends MercadoPagoError {\n constructor(\n endpoint: string,\n public retryAfterSeconds: number | null,\n body?: unknown,\n ) {\n super(\n `Mercado Pago rate limit hit on ${endpoint}. ${\n retryAfterSeconds\n ? `Retry after ${retryAfterSeconds}s.`\n : \"Retry with exponential backoff.\"\n }`,\n 429,\n endpoint,\n body,\n );\n this.name = \"MercadoPagoRateLimitError\";\n }\n}\n\n/**\n * Thrown when MP is overloaded and serves an HTML 503 page instead of a JSON\n * error. The library detects content-type !== application/json on 5xx and\n * raises this typed error so retry logic + agent UX can branch correctly.\n */\nexport class MercadoPagoOverloadedError extends MercadoPagoError {\n constructor(endpoint: string, status: number) {\n super(\n `Mercado Pago appears overloaded — returned a non-JSON ${status} response for ${endpoint}. Wait a few seconds and retry.`,\n status,\n endpoint,\n );\n this.name = \"MercadoPagoOverloadedError\";\n }\n}\n\n/**\n * Thrown when a request exceeds the configured `requestTimeoutMs`. Retried\n * automatically up to `maxRetries`; this surfaces only when the budget runs\n * out.\n */\nexport class MercadoPagoTimeoutError extends MercadoPagoError {\n constructor(endpoint: string, public readonly timeoutMs: number) {\n super(\n `Mercado Pago request timed out after ${timeoutMs}ms on ${endpoint}. Increase requestTimeoutMs or check connectivity.`,\n 0,\n endpoint,\n );\n this.name = \"MercadoPagoTimeoutError\";\n }\n}\n\n/**\n * Maps an MP error response body to the most specific known error class. Falls\n * back to the generic MercadoPagoError when no specific pattern matches.\n */\nexport function classifyError(\n status: number,\n endpoint: string,\n body: unknown,\n context?: { preapprovalId?: string; payerEmail?: string; sellerEmail?: string },\n): MercadoPagoError {\n const bodyText =\n typeof body === \"string\"\n ? body\n : body && typeof body === \"object\"\n ? JSON.stringify(body)\n : \"\";\n const lower = bodyText.toLowerCase();\n\n if (status === 401) return new MercadoPagoAuthError(endpoint, body);\n if (status === 429) {\n // Try to extract Retry-After from the body if it includes one.\n let retryAfter: number | null = null;\n const obj = body as { retry_after?: number; \"retry-after\"?: number } | undefined;\n if (obj?.retry_after) retryAfter = Number(obj.retry_after);\n else if (obj?.[\"retry-after\"]) retryAfter = Number(obj[\"retry-after\"]);\n return new MercadoPagoRateLimitError(endpoint, retryAfter, body);\n }\n if (status === 400) {\n if (lower.includes(\"back_url\") && lower.includes(\"not a valid url\")) {\n return new MercadoPagoBackUrlInvalidError(endpoint, body);\n }\n if (\n lower.includes(\"cannot operate\") &&\n lower.includes(\"different countries\")\n ) {\n return new MercadoPagoAccountTypeMismatchError(endpoint, body);\n }\n if (\n lower.includes(\"only the payer can\") &&\n context?.preapprovalId\n ) {\n return new MercadoPagoAuthorizeForbiddenError(context.preapprovalId, body);\n }\n if (\n context?.payerEmail &&\n context?.sellerEmail &&\n context.payerEmail.toLowerCase() === context.sellerEmail.toLowerCase()\n ) {\n return new MercadoPagoSelfPaymentError(endpoint, body);\n }\n }\n return new MercadoPagoError(\n `Mercado Pago ${endpoint} failed: ${status} ${bodyText.slice(0, 200)}`,\n status,\n endpoint,\n body,\n );\n}\n","import { classifyError, MercadoPagoError, MercadoPagoOverloadedError, MercadoPagoRateLimitError, MercadoPagoTimeoutError } from \"./errors\";\nimport type {\n AccountInfo,\n CardToken,\n CreateCardTokenParams,\n CreateCustomerParams,\n CreatePaymentParams,\n CreatePosParams,\n CreatePreapprovalParams,\n CreatePreferenceParams,\n CreateQrPaymentParams,\n CreateRefundParams,\n CreateStoreParams,\n CreateSubscriptionPlanParams,\n AccountBalance,\n AccountMovement,\n BankAccount,\n CreateOrderParams,\n CreatePointPaymentIntentParams,\n CreateWebhookParams,\n Customer,\n CustomerCard,\n Dispute,\n IdentificationType,\n InstallmentOffer,\n Issuer,\n MerchantOrder,\n Order,\n Payment,\n PointDevice,\n PointPaymentIntent,\n PaymentMethod,\n PaymentsSearchResult,\n Pos,\n Preapproval,\n Preference,\n QrOrder,\n Refund,\n SearchPaymentsParams,\n Settlement,\n Store,\n SubscriptionPayment,\n SubscriptionPlan,\n WebhookConfig,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.mercadopago.com\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface MercadoPagoClientOptions {\n /** Access token. TEST- prefix for sandbox, APP_USR- for production. */\n accessToken: string;\n /**\n * Override the API base URL. Mostly useful for tests against MSW or for\n * pointing at a regional MP host. Defaults to https://api.mercadopago.com.\n */\n baseUrl?: string;\n /**\n * Custom fetch implementation. Defaults to globalThis.fetch. Override to\n * inject your own retry/instrumentation layer or to test with MSW.\n */\n fetch?: typeof fetch;\n /**\n * Per-request timeout in ms. Aborts the request and throws if exceeded.\n * Default 30_000 (30s). MP can be slow under load; 30s is a safe upper bound.\n */\n requestTimeoutMs?: number;\n /**\n * Number of retries on 5xx + network errors. Default 1 (single retry).\n * 4xx errors are NEVER retried (they're user/config errors). Each retry\n * uses exponential backoff: 250ms, 500ms, 1000ms, ...\n */\n maxRetries?: number;\n /**\n * Observability hook fired AFTER every request (success or failure).\n * Useful for logging, metrics, tracing. Synchronous, fire-and-forget.\n */\n onCall?: (event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void;\n}\n\ninterface RequestOptions {\n /** Idempotency key. Required for POST/PUT to dedupe retries safely. */\n idempotencyKey?: string;\n /** Query string params. Object → URLSearchParams. */\n query?: Record<string, string | number | undefined>;\n /** Context for error classification. */\n classifyContext?: {\n preapprovalId?: string;\n paymentId?: string;\n customerId?: string;\n payerEmail?: string;\n sellerEmail?: string;\n };\n}\n\n/**\n * Thin, typed wrapper around Mercado Pago's REST API. Exposes the surface\n * the agent layer needs: Subscriptions (Preapprovals), Payments, Checkout Pro\n * (Preferences), Customers + saved Cards, Refunds, Payment Methods +\n * Installments, and Account info. Deliberately narrower than a full SDK\n * rebuild — we add endpoints when the agent layer needs them.\n */\nexport class MercadoPagoClient {\n private readonly accessToken: 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:\n | ((event: {\n method: string;\n path: string;\n durationMs: number;\n httpStatus: number | null;\n retried: number;\n success: boolean;\n }) => void)\n | undefined;\n\n constructor(options: MercadoPagoClientOptions) {\n if (!options.accessToken) {\n throw new Error(\n \"MercadoPagoClient requires an accessToken. Get one from https://www.mercadopago.com.ar/developers/panel/credentials\",\n );\n }\n this.accessToken = options.accessToken;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.fetchImpl = options.fetch;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n this.maxRetries = Math.max(0, options.maxRetries ?? 1);\n this.onCall = options.onCall;\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n };\n if (options?.idempotencyKey) {\n headers[\"X-Idempotency-Key\"] = options.idempotencyKey;\n }\n\n let url = `${this.baseUrl}${path}`;\n if (options?.query) {\n const search = new URLSearchParams();\n for (const [k, v] of Object.entries(options.query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n search.set(k, String(v));\n }\n }\n const qs = search.toString();\n if (qs) url += `?${qs}`;\n }\n\n const fetchFn = this.fetchImpl ?? globalThis.fetch;\n const t0 = Date.now();\n let attempt = 0;\n let lastError: unknown;\n let lastStatus: number | null = null;\n\n while (attempt <= this.maxRetries) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);\n\n const init: RequestInit = { method, headers, signal: controller.signal };\n if (body !== undefined) init.body = JSON.stringify(body);\n\n try {\n const res = await fetchFn(url, init);\n clearTimeout(timer);\n lastStatus = res.status;\n\n if (res.ok) {\n const text = await res.text();\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: true,\n });\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Retry on 5xx and 429 (rate-limit); never on 4xx user/config errors\n const isRetryable = res.status >= 500 || res.status === 429;\n if (isRetryable && attempt < this.maxRetries) {\n // Honor Retry-After header on 429\n const retryAfter = res.headers.get(\"retry-after\");\n const waitMs = retryAfter\n ? Number(retryAfter) * 1000\n : 250 * Math.pow(2, attempt);\n attempt++;\n await sleep(waitMs);\n continue;\n }\n\n // Detect HTML / non-JSON 5xx (MP overloaded)\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (res.status >= 500 && !contentType.includes(\"application/json\")) {\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw new MercadoPagoOverloadedError(path, res.status);\n }\n\n let parsed: unknown;\n const text = await res.text();\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n const err = classifyError(res.status, path, parsed, options?.classifyContext);\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: res.status,\n retried: attempt,\n success: false,\n });\n throw err;\n } catch (err) {\n clearTimeout(timer);\n // If err is a MercadoPagoError, the 5xx-final / 4xx branch already\n // fired onCall above — don't double-fire. Just re-throw.\n if (err instanceof MercadoPagoError) throw err;\n\n // Network error / abort / parse error — retry if budget remains\n const isAbort = err instanceof Error && err.name === \"AbortError\";\n const isNetwork = !lastStatus && !isAbort;\n if ((isNetwork || isAbort) && attempt < this.maxRetries) {\n lastError = err;\n attempt++;\n await sleep(250 * Math.pow(2, attempt - 1));\n continue;\n }\n this.onCall?.({\n method,\n path,\n durationMs: Date.now() - t0,\n httpStatus: lastStatus,\n retried: attempt,\n success: false,\n });\n if (isAbort) {\n throw new MercadoPagoTimeoutError(path, this.requestTimeoutMs);\n }\n throw err;\n }\n }\n\n throw lastError ?? new Error(`MercadoPago request failed after ${this.maxRetries} retries`);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscriptions (Preapprovals) — v0.1 surface, kept stable\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a recurring subscription (preapproval). The returned `init_point`\n * URL is where the buyer must complete the FIRST payment with their card +\n * CVV — there is no API path that bypasses this human step.\n */\n async createPreapproval(\n params: CreatePreapprovalParams,\n ): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"POST\",\n \"/preapproval\",\n {\n reason: params.reason,\n payer_email: params.payerEmail,\n back_url: params.backUrl,\n external_reference: params.externalReference,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n },\n },\n { classifyContext: { payerEmail: params.payerEmail } },\n );\n }\n\n async getPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\"GET\", `/preapproval/${id}`, undefined, {\n classifyContext: { preapprovalId: id },\n });\n }\n\n async cancelPreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async pausePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"paused\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n async resumePreapproval(id: string): Promise<Preapproval> {\n return this.request<Preapproval>(\n \"PUT\",\n `/preapproval/${id}`,\n { status: \"authorized\" },\n { classifyContext: { preapprovalId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment. Two main flows:\n * - **Card payment**: pass `token` (from MP frontend Cardform) + payment_method_id.\n * - **Account money / cash**: omit token, pass payment_method_id like \"account_money\", \"rapipago\", \"pagofacil\".\n *\n * For credit card payments where you don't have a card token (i.e., you only\n * have a payer email and want to send them a payment link), use\n * `createPreference` (Checkout Pro) instead.\n *\n * Idempotency: pass `idempotencyKey` to safely retry. Required for production\n * to dedupe network-failed requests.\n */\n async createPayment(params: CreatePaymentParams): Promise<Payment> {\n const body: Record<string, unknown> = {\n transaction_amount: params.transactionAmount,\n payment_method_id: params.paymentMethodId,\n payer: {\n email: params.payerEmail,\n ...(params.identification ? { identification: params.identification } : {}),\n },\n };\n if (params.installments !== undefined) body.installments = params.installments;\n if (params.token !== undefined) body.token = params.token;\n if (params.description !== undefined) body.description = params.description;\n if (params.externalReference !== undefined) body.external_reference = params.externalReference;\n if (params.notificationUrl !== undefined) body.notification_url = params.notificationUrl;\n if (params.statementDescriptor !== undefined)\n body.statement_descriptor = params.statementDescriptor;\n if (params.capture !== undefined) body.capture = params.capture;\n if (params.additionalInfo !== undefined) body.additional_info = params.additionalInfo;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /** Fetch a payment by ID. */\n async getPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\"GET\", `/v1/payments/${id}`, undefined, {\n classifyContext: { paymentId: id },\n });\n }\n\n /**\n * Search payments with filters. Common: by external_reference (your-system\n * id), by status, by date range. Pagination via offset + limit (max 100).\n */\n async searchPayments(params: SearchPaymentsParams = {}): Promise<PaymentsSearchResult> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.externalReference) query[\"external_reference\"] = params.externalReference;\n if (params.status) query[\"status\"] = params.status as string;\n if (params.payerEmail) query[\"payer.email\"] = params.payerEmail;\n if (params.beginDate) query[\"begin_date\"] = params.beginDate;\n if (params.endDate) query[\"end_date\"] = params.endDate;\n if (params.sort) query[\"sort\"] = params.sort;\n if (params.criteria) query[\"criteria\"] = params.criteria;\n\n return this.request<PaymentsSearchResult>(\n \"GET\",\n \"/v1/payments/search\",\n undefined,\n { query },\n );\n }\n\n /**\n * Capture a previously authorized payment. Only works for credit-card\n * payments created with `capture: false`. Optional partial capture amount.\n */\n async capturePayment(id: string, amount?: number): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n amount !== undefined ? { capture: true, transaction_amount: amount } : { capture: true },\n { classifyContext: { paymentId: id } },\n );\n }\n\n /**\n * Cancel a pending or in_process payment. Once approved, you must use\n * `createRefund` instead.\n */\n async cancelPayment(id: string): Promise<Payment> {\n return this.request<Payment>(\n \"PUT\",\n `/v1/payments/${id}`,\n { status: \"cancelled\" },\n { classifyContext: { paymentId: id } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Refunds\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Refund a payment fully (omit `amount`) or partially. Idempotency key\n * recommended — refunds can fail mid-flight and you don't want double-refunds\n * on retry.\n */\n async createRefund(params: CreateRefundParams): Promise<Refund> {\n const body = params.amount !== undefined ? { amount: params.amount } : undefined;\n return this.request<Refund>(\n \"POST\",\n `/v1/payments/${params.paymentId}/refunds`,\n body,\n {\n ...(params.idempotencyKey ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { paymentId: params.paymentId },\n },\n );\n }\n\n async listRefunds(paymentId: string): Promise<Refund[]> {\n const res = await this.request<Refund[] | { refunds: Refund[] }>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds`,\n undefined,\n { classifyContext: { paymentId } },\n );\n return Array.isArray(res) ? res : res.refunds ?? [];\n }\n\n async getRefund(paymentId: string, refundId: string): Promise<Refund> {\n return this.request<Refund>(\n \"GET\",\n `/v1/payments/${paymentId}/refunds/${refundId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Checkout Pro (Preferences)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a payment preference for Checkout Pro. Returns `init_point` URL\n * where the buyer completes payment on MP-hosted form. This is the\n * recommended flow when you don't have a card token (most common path for\n * agents — you don't want to handle PCI data).\n *\n * Sandbox: use `sandbox_init_point` instead of `init_point`.\n */\n async createPreference(params: CreatePreferenceParams): Promise<Preference> {\n const body: Record<string, unknown> = {\n items: params.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: it.currency_id ?? \"ARS\",\n ...(it.description ? { description: it.description } : {}),\n ...(it.picture_url ? { picture_url: it.picture_url } : {}),\n })),\n };\n if (params.payer) body.payer = params.payer;\n if (params.backUrls) body.back_urls = params.backUrls;\n if (params.autoReturn) body.auto_return = params.autoReturn;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.paymentMethods) body.payment_methods = params.paymentMethods;\n if (params.statementDescriptor)\n body.statement_descriptor = params.statementDescriptor;\n if (params.expires !== undefined) body.expires = params.expires;\n if (params.expirationDateFrom) body.expiration_date_from = params.expirationDateFrom;\n if (params.expirationDateTo) body.expiration_date_to = params.expirationDateTo;\n // v0.5 — Marketplace split routing\n if (params.marketplace) body.marketplace = params.marketplace;\n if (params.marketplaceFee !== undefined) body.marketplace_fee = params.marketplaceFee;\n if (params.collectorId !== undefined) body.collector_id = params.collectorId;\n\n return this.request<Preference>(\"POST\", \"/checkout/preferences\", body);\n }\n\n async getPreference(id: string): Promise<Preference> {\n return this.request<Preference>(\"GET\", `/checkout/preferences/${id}`);\n }\n\n async updatePreference(\n id: string,\n patch: Partial<CreatePreferenceParams>,\n ): Promise<Preference> {\n return this.request<Preference>(\"PUT\", `/checkout/preferences/${id}`, patch);\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ───────────────────────────────────────────────────────────────────────────\n\n async createCustomer(params: CreateCustomerParams): Promise<Customer> {\n const body: Record<string, unknown> = { email: params.email };\n if (params.firstName) body.first_name = params.firstName;\n if (params.lastName) body.last_name = params.lastName;\n if (params.phone) body.phone = { area_code: params.phone.areaCode, number: params.phone.number };\n if (params.identification) body.identification = params.identification;\n if (params.description) body.description = params.description;\n return this.request<Customer>(\"POST\", \"/v1/customers\", body, {\n classifyContext: { payerEmail: params.email },\n });\n }\n\n async getCustomer(id: string): Promise<Customer> {\n return this.request<Customer>(\"GET\", `/v1/customers/${id}`, undefined, {\n classifyContext: { customerId: id },\n });\n }\n\n /**\n * Search customers. Most common: by email (returns 0 or 1 result).\n * Note: MP's `/v1/customers/search` returns a paginated wrapper, not a flat array.\n */\n async searchCustomers(params: { email?: string; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Customer[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 10,\n offset: params.offset ?? 0,\n };\n if (params.email) query[\"email\"] = params.email;\n return this.request(\"GET\", \"/v1/customers/search\", undefined, { query });\n }\n\n async listCustomerCards(customerId: string): Promise<CustomerCard[]> {\n return this.request<CustomerCard[]>(\n \"GET\",\n `/v1/customers/${customerId}/cards`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async getCustomerCard(customerId: string, cardId: string): Promise<CustomerCard> {\n return this.request<CustomerCard>(\n \"GET\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n async deleteCustomerCard(customerId: string, cardId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/v1/customers/${customerId}/cards/${cardId}`,\n undefined,\n { classifyContext: { customerId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List all payment methods enabled for the account's site (MLA = Argentina). */\n async listPaymentMethods(): Promise<PaymentMethod[]> {\n return this.request<PaymentMethod[]>(\"GET\", \"/v1/payment_methods\");\n }\n\n /**\n * Get installment options for an amount. THE killer AR feature — returns\n * `payer_costs` with `recommended_message` strings like \"12 cuotas sin\n * interés de $X\" that you should surface verbatim to the user.\n *\n * Pass `bin` (first 6 digits of card) for issuer-specific offers (e.g.,\n * Naranja's interest-free promotions). Without bin, returns generic offers.\n */\n async getInstallments(params: {\n amount: number;\n paymentMethodId?: string;\n bin?: string;\n issuerId?: string;\n }): Promise<InstallmentOffer[]> {\n const query: Record<string, string | number | undefined> = {\n amount: params.amount,\n };\n if (params.paymentMethodId) query[\"payment_method_id\"] = params.paymentMethodId;\n if (params.bin) query[\"bin\"] = params.bin;\n if (params.issuerId) query[\"issuer.id\"] = params.issuerId;\n return this.request<InstallmentOffer[]>(\n \"GET\",\n \"/v1/payment_methods/installments\",\n undefined,\n { query },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Account\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Get info about the account that owns this access token. */\n async getMe(): Promise<AccountInfo> {\n return this.request<AccountInfo>(\"GET\", \"/users/me\");\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Card tokens (server-side, for saved-card retokenization)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a single-use card token from a saved card. This is the server-side\n * retokenization path (PCI-safe because the card data lives in MP's vault,\n * we only pass the saved card_id + customer_id + the user-supplied CVV).\n *\n * Tokens expire in 7 days but typically burn on first use. AR currently\n * REQUIRES CVV on every charge (MP doesn't store it); skipping CVV requires\n * a private MP product enablement, not a public API.\n */\n async createCardToken(params: CreateCardTokenParams): Promise<CardToken> {\n return this.request<CardToken>(\"POST\", \"/v1/card_tokens\", {\n card_id: params.cardId,\n customer_id: params.customerId,\n security_code: params.securityCode,\n });\n }\n\n /**\n * High-level helper: charge a saved card in 3 steps.\n * 1. Mint a card token from {customer_id, card_id, security_code}\n * 2. Lookup card to fill payment_method_id (avoids agent guessing)\n * 3. Create the payment with the token + idempotency key\n *\n * Returns the resulting Payment. Uses deterministic idempotency from\n * (card_id, amount, externalReference) so retries dedupe on MP's side.\n */\n async chargeSavedCard(params: {\n customerId: string;\n cardId: string;\n securityCode: string;\n amount: number;\n description: string;\n installments?: number;\n externalReference?: string;\n statementDescriptor?: string;\n idempotencyKey?: string;\n }): Promise<Payment> {\n // Step 1: Mint single-use token\n const token = await this.createCardToken({\n cardId: params.cardId,\n customerId: params.customerId,\n securityCode: params.securityCode,\n });\n\n // Step 2: Lookup the saved card to fill payment_method_id\n const card = await this.getCustomerCard(params.customerId, params.cardId);\n const paymentMethodId = card.payment_method?.id;\n if (!paymentMethodId) {\n throw new MercadoPagoError(\n `Saved card ${params.cardId} has no payment_method.id. Cannot charge.`,\n 0,\n `/v1/customers/${params.customerId}/cards/${params.cardId}`,\n );\n }\n\n // Step 3: Create payment\n const body: Record<string, unknown> = {\n transaction_amount: params.amount,\n token: token.id,\n payment_method_id: paymentMethodId,\n installments: params.installments ?? 1,\n description: params.description,\n payer: { type: \"customer\", id: params.customerId },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.statementDescriptor) body.statement_descriptor = params.statementDescriptor;\n\n return this.request<Payment>(\"POST\", \"/v1/payments\", body, {\n ...(params.idempotencyKey !== undefined ? { idempotencyKey: params.idempotencyKey } : {}),\n classifyContext: { customerId: params.customerId },\n });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // QR (in-store dynamic) — Section 2 of v0.3 spec\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a dynamic in-store QR order. Returns `qr_data` (EMVCo TLV string)\n * + `in_store_order_id`. The buyer scans the QR with any AR wallet (Modo,\n * BNA+, Cuenta DNI, Naranja X, etc. — interop is mandated by Transferencias\n * 3.0). On payment, MP fires `point_integration_wh` then `payment` topics.\n *\n * Requires a pre-configured POS (`external_pos_id` from MP dashboard or\n * `POST /pos`). The seller's `user_id` is auto-fetched from `/users/me`.\n *\n * The lib does NOT render the QR image — pass `qr_data` to a QR renderer\n * (e.g., `qrcode` package) to get a data URL. The agent tool layer wraps\n * this and returns both raw + data URL.\n */\n async createQrPayment(userId: string, params: CreateQrPaymentParams): Promise<QrOrder> {\n const body: Record<string, unknown> = {\n total_amount: params.totalAmount,\n title: params.title,\n };\n if (params.description) body.description = params.description;\n if (params.notificationUrl) body.notification_url = params.notificationUrl;\n if (params.externalReference) body.external_reference = params.externalReference;\n if (params.expirationDate) body.expiration_date = params.expirationDate;\n body.items = params.items ?? [\n {\n title: params.title,\n quantity: 1,\n unit_price: params.totalAmount,\n unit_measure: \"unit\",\n total_amount: params.totalAmount,\n },\n ];\n\n return this.request<QrOrder>(\n \"PUT\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(params.externalPosId)}/qrs`,\n body,\n );\n }\n\n /**\n * Cancel a pending QR order on a POS. Necessary if the buyer never scans\n * — otherwise the next `createQrPayment` on the same POS returns 409.\n */\n async cancelQrPayment(userId: string, externalPosId: string): Promise<void> {\n await this.request(\n \"DELETE\",\n `/instore/orders/qr/seller/collectors/${encodeURIComponent(userId)}/pos/${encodeURIComponent(externalPosId)}/qrs`,\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Subscription Plans (preapproval_plan — reusable plans, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a reusable subscription plan. Customers later subscribe to it via\n * `subscribeToPlan` (which creates a preapproval pointing at the plan).\n *\n * Use this when you have fixed tiers (Básico/Pro/Enterprise). For custom\n * per-customer amounts, skip plans and use `createPreapproval` directly.\n */\n async createSubscriptionPlan(params: CreateSubscriptionPlanParams): Promise<SubscriptionPlan> {\n const body: Record<string, unknown> = {\n reason: params.reason,\n back_url: params.backUrl,\n auto_recurring: {\n frequency: params.frequency,\n frequency_type: params.frequencyType,\n transaction_amount: params.amount,\n currency_id: params.currency,\n ...(params.freeTrialFrequency !== undefined && params.freeTrialFrequencyType !== undefined\n ? {\n free_trial: {\n frequency: params.freeTrialFrequency,\n frequency_type: params.freeTrialFrequencyType,\n },\n }\n : {}),\n },\n };\n if (params.externalReference) body.external_reference = params.externalReference;\n return this.request<SubscriptionPlan>(\"POST\", \"/preapproval_plan\", body);\n }\n\n async getSubscriptionPlan(id: string): Promise<SubscriptionPlan> {\n return this.request<SubscriptionPlan>(\"GET\", `/preapproval_plan/${id}`);\n }\n\n async listSubscriptionPlans(params: { limit?: number; offset?: number; status?: string } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: SubscriptionPlan[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n if (params.status) query[\"status\"] = params.status;\n return this.request(\"GET\", \"/preapproval_plan/search\", undefined, { query });\n }\n\n async updateSubscriptionPlan(\n id: string,\n patch: { reason?: string; status?: \"active\" | \"cancelled\"; amount?: number; backUrl?: string },\n ): Promise<SubscriptionPlan> {\n const body: Record<string, unknown> = {};\n if (patch.reason !== undefined) body.reason = patch.reason;\n if (patch.status !== undefined) body.status = patch.status;\n if (patch.backUrl !== undefined) body.back_url = patch.backUrl;\n if (patch.amount !== undefined) {\n body.auto_recurring = { transaction_amount: patch.amount };\n }\n return this.request<SubscriptionPlan>(\"PUT\", `/preapproval_plan/${id}`, body);\n }\n\n /**\n * Subscribe a customer to an existing plan. Returns a Preapproval with\n * `init_point` URL where the buyer completes the first payment.\n */\n async subscribeToPlan(params: {\n planId: string;\n payerEmail: string;\n cardTokenId?: string;\n externalReference?: string;\n }): Promise<Preapproval> {\n const body: Record<string, unknown> = {\n preapproval_plan_id: params.planId,\n payer_email: params.payerEmail,\n };\n if (params.cardTokenId) body.card_token_id = params.cardTokenId;\n if (params.externalReference) body.external_reference = params.externalReference;\n return this.request<Preapproval>(\"POST\", \"/preapproval\", body, {\n classifyContext: { payerEmail: params.payerEmail },\n });\n }\n\n /**\n * List the auto-charge attempts (authorized_payments) under a preapproval.\n * Useful for \"show me the cobros of the last 6 months for this client\".\n */\n async listSubscriptionPayments(preapprovalId: string, params: { limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: SubscriptionPayment[];\n }> {\n const query: Record<string, string | number | undefined> = {\n preapproval_id: preapprovalId,\n limit: params.limit ?? 30,\n offset: params.offset ?? 0,\n };\n return this.request(\n \"GET\",\n `/authorized_payments/search`,\n undefined,\n { query, classifyContext: { preapprovalId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Stores + POS (for QR payments self-serve setup, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** Create a store for the seller. POSes (for QR) live under stores. */\n async createStore(userId: string, params: CreateStoreParams): Promise<Store> {\n const body: Record<string, unknown> = {\n name: params.name,\n external_id: params.externalId,\n };\n if (params.location) {\n body.location = {\n ...(params.location.addressLine ? { address_line: params.location.addressLine } : {}),\n ...(params.location.cityName ? { city_name: params.location.cityName } : {}),\n ...(params.location.stateName ? { state_name: params.location.stateName } : {}),\n ...(params.location.countryId ? { country_id: params.location.countryId } : {}),\n ...(params.location.latitude !== undefined ? { latitude: params.location.latitude } : {}),\n ...(params.location.longitude !== undefined ? { longitude: params.location.longitude } : {}),\n };\n }\n return this.request<Store>(\"POST\", `/users/${encodeURIComponent(userId)}/stores`, body);\n }\n\n async listStores(userId: string, params: { limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Store[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n };\n return this.request(\"GET\", `/users/${encodeURIComponent(userId)}/stores/search`, undefined, { query });\n }\n\n /** Create a POS under a store. The POS's `external_id` is what `createQrPayment` uses. */\n async createPos(params: CreatePosParams): Promise<Pos> {\n const body: Record<string, unknown> = {\n name: params.name,\n external_id: params.externalId,\n store_id: params.storeId,\n category: params.category ?? 621102, // \"Other Food and Beverage Services\" — generic default\n };\n if (params.fixedAmount !== undefined) body.fixed_amount = params.fixedAmount;\n return this.request<Pos>(\"POST\", \"/pos\", body);\n }\n\n async listPos(params: { storeId?: string | number; limit?: number; offset?: number } = {}): Promise<{\n paging: { total: number; limit: number; offset: number };\n results: Pos[];\n }> {\n const query: Record<string, string | number | undefined> = {\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n };\n if (params.storeId !== undefined) query[\"store_id\"] = String(params.storeId);\n return this.request(\"GET\", \"/pos\", undefined, { query });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Disputes (read-only, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n async listPaymentDisputes(paymentId: string): Promise<Dispute[]> {\n return this.request<Dispute[]>(\"GET\", `/v1/payments/${paymentId}/disputes`, undefined, {\n classifyContext: { paymentId },\n });\n }\n\n async getDispute(paymentId: string, disputeId: string): Promise<Dispute> {\n return this.request<Dispute>(\n \"GET\",\n `/v1/payments/${paymentId}/disputes/${disputeId}`,\n undefined,\n { classifyContext: { paymentId } },\n );\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Identification Types + Issuers (lookup helpers, v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List valid identification types for the seller's site. AR returns DNI/CI/LE/LC/Otro/Pasaporte/CUIT/CUIL. */\n async listIdentificationTypes(): Promise<IdentificationType[]> {\n return this.request<IdentificationType[]>(\"GET\", \"/v1/identification_types\");\n }\n\n /** List card issuers for a payment method. Useful with `bin` for installments. */\n async listIssuers(params: { paymentMethodId: string; bin?: string }): Promise<Issuer[]> {\n const query: Record<string, string | number | undefined> = {\n payment_method_id: params.paymentMethodId,\n };\n if (params.bin) query[\"bin\"] = params.bin;\n return this.request<Issuer[]>(\"GET\", \"/v1/payment_methods/card_issuers\", undefined, { query });\n }\n\n // ───────────────────────────────────────────────────────────────────────────\n // Webhooks management (v0.4)\n // ───────────────────────────────────────────────────────────────────────────\n\n /** List configured webhook subscriptions. */\n async listWebhooks(): Promise<WebhookConfig[]> {\n return this.request<WebhookConfig[]>(\"GET\", \"/v1/webhooks\");\n }\n\n /** Create a webhook subscription for a topic. */\n async createWebhook(params: CreateWebhookParams): Promise<WebhookConfig> {\n return this.request<WebhookConfig>(\"POST\", \"/v1/webhooks\", {\n url: params.url,\n topic: params.topic,\n });\n }\n\n async updateWebhook(id: string, patch: { url?: string; topic?: string }): Promise<WebhookConfig> {\n return this.request<WebhookConfig>(\"PUT\", `/v1/webhooks/${id}`, patch);\n }\n\n async deleteWebhook(id: string): Promise<void> {\n await this.request(\"DELETE\", `/v1/webhooks/${id}`);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.5 — Order Management API\n //\n // The Order API is MP's newer abstraction for purchases, replacing some\n // Preference flows. Distinct from Preference: Order is a transactional\n // entity with explicit lifecycle (created → processed → captured/canceled),\n // supports manual capture (auth-only, capture later), and can attach\n // multiple payments to a single Order.\n //\n // Use Order when you need:\n // - Auth-only flow (capture later, e.g. ride-share, hotels)\n // - Multi-payment aggregation (one Order = N partial payments)\n // - In-store + online unified status\n //\n // Stick with Preference (Checkout Pro) when you just need a hosted pay-link.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Create a new Order. Use `capture_mode: \"manual\"` for auth-only flows\n * where you want to capture funds later (ride-share, hotels, marketplaces).\n *\n * For marketplace splits, set `marketplace`, `marketplace_fee`,\n * `collector_id` — see `MarketplaceParams`.\n */\n async createOrder(\n params: CreateOrderParams,\n options?: RequestOptions,\n ): Promise<Order> {\n const body: Record<string, unknown> = {\n type: params.type,\n };\n if (params.currency_id) body.currency_id = params.currency_id;\n if (params.external_reference) body.external_reference = params.external_reference;\n if (params.items) body.items = params.items;\n if (params.total_amount !== undefined) body.total_amount = params.total_amount;\n if (params.payer) body.payer = params.payer;\n if (params.capture_mode) body.capture_mode = params.capture_mode;\n if (params.notification_url) body.notification_url = params.notification_url;\n if (params.marketplace) body.marketplace = params.marketplace;\n if (params.marketplace_fee !== undefined) body.marketplace_fee = params.marketplace_fee;\n if (params.collector_id !== undefined) body.collector_id = params.collector_id;\n\n return this.request<Order>(\"POST\", \"/v1/orders\", body, options);\n }\n\n async getOrder(id: string): Promise<Order> {\n return this.request<Order>(\"GET\", `/v1/orders/${id}`);\n }\n\n async updateOrder(\n id: string,\n patch: Partial<CreateOrderParams>,\n ): Promise<Order> {\n return this.request<Order>(\"PUT\", `/v1/orders/${id}`, patch);\n }\n\n /**\n * Capture a previously-authorized Order (only for orders created with\n * `capture_mode: \"manual\"`). Captures up to the originally-authorized\n * amount; pass `amount` for partial capture.\n */\n async captureOrder(id: string, amount?: number): Promise<Order> {\n const body = amount !== undefined ? { amount } : {};\n return this.request<Order>(\"POST\", `/v1/orders/${id}/capture`, body);\n }\n\n /**\n * Cancel an Order. Releases any auth-holds; marks the Order as canceled.\n * For orders that have already been captured, use `createRefund` instead.\n */\n async cancelOrder(id: string): Promise<Order> {\n return this.request<Order>(\"POST\", `/v1/orders/${id}/cancel`);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.6 — Account Balance + Movements\n //\n // Inspect the seller's MP wallet — what's available to withdraw, what's\n // in retention (pending release), and the movement log.\n //\n // For per-seller marketplace setups, instantiate the client AS THE SELLER\n // (with their OAuth access_token) before calling these — `getAccountBalance`\n // returns the balance of WHOEVER's accessToken is active.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Get the seller's current MP wallet balance (available + unavailable).\n * - `available_balance`: spendable / withdrawable right now.\n * - `unavailable_balance`: in retention (e.g., 14-21 days for new sellers).\n * - `total_amount` = sum of both.\n */\n async getAccountBalance(): Promise<AccountBalance> {\n return this.request<AccountBalance>(\"GET\", \"/users/me/mercadopago_account/balance\");\n }\n\n /**\n * List wallet movements (incoming payments, transfers, refunds, holdings).\n * Defaults to most-recent-first, paginated. Filter by date range with\n * `from`/`to` (ISO 8601).\n */\n async listAccountMovements(\n params: { from?: string; to?: string; limit?: number; offset?: number } = {},\n ): Promise<{ movements: AccountMovement[]; paging: { limit: number; offset: number; total: number } }> {\n const query: Record<string, string | number> = {};\n if (params.from) query.begin_date = params.from;\n if (params.to) query.end_date = params.to;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n results?: AccountMovement[];\n paging?: { limit: number; offset: number; total: number };\n }>(\"GET\", \"/users/me/mercadopago_account/movements/search\", undefined, { query });\n return {\n movements: result.results ?? [],\n paging: result.paging ?? { limit: params.limit ?? 25, offset: params.offset ?? 0, total: 0 },\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.6 — Settlements (release_money)\n //\n // When MP transfers funds from your MP wallet to your registered CBU.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * List settlements (transfers from MP wallet to your bank account).\n * Useful for monthly conciliation reports.\n */\n async listSettlements(\n params: { from?: string; to?: string; status?: string; limit?: number; offset?: number } = {},\n ): Promise<{ settlements: Settlement[]; paging: { limit: number; offset: number; total: number } }> {\n const query: Record<string, string | number> = {};\n if (params.from) query.begin_date = params.from;\n if (params.to) query.end_date = params.to;\n if (params.status) query.status = params.status;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n results?: Settlement[];\n paging?: { limit: number; offset: number; total: number };\n }>(\"GET\", \"/v1/account/release_money/search\", undefined, { query });\n return {\n settlements: result.results ?? [],\n paging: result.paging ?? { limit: params.limit ?? 25, offset: params.offset ?? 0, total: 0 },\n };\n }\n\n /**\n * Get a single settlement by id. Returns the full Settlement object\n * including bank_account info (CBU, bank name).\n */\n async getSettlement(id: string): Promise<Settlement> {\n return this.request<Settlement>(\"GET\", `/v1/account/release_money/${id}`);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.7 — Customer + Card extensions (close gaps)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Update a customer's profile (name, last name, address, etc.). MP merges\n * the patch — fields you don't send remain unchanged.\n */\n async updateCustomer(\n id: string,\n patch: Partial<{\n first_name: string;\n last_name: string;\n phone: { area_code?: string; number?: string };\n identification: { type: string; number: string };\n address: { street_name?: string; street_number?: number; zip_code?: string };\n description: string;\n default_card?: string;\n }>,\n ): Promise<Customer> {\n return this.request<Customer>(\"PUT\", `/v1/customers/${id}`, patch);\n }\n\n /**\n * Add a saved card to a customer using a card token (one-time, get from\n * MP's frontend Cardform). The card is then chargeable with charge_saved_card.\n */\n async createCustomerCard(\n customerId: string,\n cardToken: string,\n ): Promise<CustomerCard> {\n return this.request<CustomerCard>(\n \"POST\",\n `/v1/customers/${customerId}/cards`,\n { token: cardToken },\n );\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.7 — Subscription extensions\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Update an existing subscription. Common patches:\n * - `transaction_amount` to change the recurring amount\n * - `card_token_id` to switch payment method (e.g., expired card)\n * - `status: \"cancelled\" | \"paused\"` (alternative to dedicated cancel/pause endpoints)\n * - `reason` to update the description shown to the buyer\n */\n async updatePreapproval(\n id: string,\n patch: Partial<{\n transaction_amount: number;\n card_token_id: string;\n status: \"authorized\" | \"paused\" | \"cancelled\";\n reason: string;\n external_reference: string;\n }>,\n ): Promise<Preapproval> {\n return this.request<Preapproval>(\"PUT\", `/preapproval/${id}`, patch);\n }\n\n /**\n * Search subscriptions across the seller's account. Common filters:\n * `status` (pending/authorized/paused/cancelled), `payer_email`,\n * `external_reference`. Paginated.\n */\n async searchPreapprovals(\n params: {\n status?: string;\n payerEmail?: string;\n externalReference?: string;\n preapproval_plan_id?: string;\n limit?: number;\n offset?: number;\n } = {},\n ): Promise<{\n results: Preapproval[];\n paging: { limit: number; offset: number; total: number };\n }> {\n const query: Record<string, string | number> = {};\n if (params.status) query.status = params.status;\n if (params.payerEmail) query.payer_email = params.payerEmail;\n if (params.externalReference) query.external_reference = params.externalReference;\n if (params.preapproval_plan_id) query.preapproval_plan_id = params.preapproval_plan_id;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n results?: Preapproval[];\n paging?: { limit: number; offset: number; total: number };\n }>(\"GET\", \"/preapproval/search\", undefined, { query });\n return {\n results: result.results ?? [],\n paging: result.paging ?? { limit: params.limit ?? 25, offset: params.offset ?? 0, total: 0 },\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.7 — Merchant Orders (parent of Payments grouped under a Preference)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Get a merchant_order with all its associated payments + shipments.\n * Useful for reconciling \"which payments belong to which preference\"\n * — typical webhook handler use case.\n */\n async getMerchantOrder(id: string): Promise<MerchantOrder> {\n return this.request<MerchantOrder>(\"GET\", `/merchant_orders/${id}`);\n }\n\n /**\n * Search merchant_orders by external_reference, preference_id, or status.\n */\n async searchMerchantOrders(\n params: {\n preferenceId?: string;\n externalReference?: string;\n status?: string;\n limit?: number;\n offset?: number;\n } = {},\n ): Promise<{\n elements: MerchantOrder[];\n paging: { limit: number; offset: number; total: number };\n }> {\n const query: Record<string, string | number> = {};\n if (params.preferenceId) query.preference_id = params.preferenceId;\n if (params.externalReference) query.external_reference = params.externalReference;\n if (params.status) query.status = params.status;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n elements?: MerchantOrder[];\n paging?: { limit: number; offset: number; total: number };\n }>(\"GET\", \"/merchant_orders/search\", undefined, { query });\n return {\n elements: result.elements ?? [],\n paging: result.paging ?? { limit: params.limit ?? 25, offset: params.offset ?? 0, total: 0 },\n };\n }\n\n /**\n * Update a merchant_order — typically to add items or update shipping.\n */\n async updateMerchantOrder(\n id: string,\n patch: Record<string, unknown>,\n ): Promise<MerchantOrder> {\n return this.request<MerchantOrder>(\"PUT\", `/merchant_orders/${id}`, patch);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.7 — Stores + POS CRUD completion\n // ──────────────────────────────────────────────────────────────────────────\n\n async getStore(userId: string, storeId: string): Promise<Store> {\n return this.request<Store>(\"GET\", `/users/${userId}/stores/${storeId}`);\n }\n\n async updateStore(\n userId: string,\n storeId: string,\n patch: Partial<CreateStoreParams>,\n ): Promise<Store> {\n return this.request<Store>(\"PUT\", `/users/${userId}/stores/${storeId}`, patch);\n }\n\n async deleteStore(userId: string, storeId: string): Promise<void> {\n await this.request(\"DELETE\", `/users/${userId}/stores/${storeId}`);\n }\n\n async getPos(posId: string): Promise<Pos> {\n return this.request<Pos>(\"GET\", `/pos/${posId}`);\n }\n\n async updatePos(\n posId: string,\n patch: Partial<CreatePosParams>,\n ): Promise<Pos> {\n return this.request<Pos>(\"PUT\", `/pos/${posId}`, patch);\n }\n\n async deletePos(posId: string): Promise<void> {\n await this.request(\"DELETE\", `/pos/${posId}`);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.7 — Bank Accounts (the CBUs the seller has registered for payouts)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * List bank accounts registered by the seller. The default is the one\n * that receives `release_money` settlements.\n */\n async listBankAccounts(): Promise<BankAccount[]> {\n const result = await this.request<{ results?: BankAccount[] } | BankAccount[]>(\n \"GET\",\n \"/users/me/bank_accounts\",\n );\n if (Array.isArray(result)) return result;\n return result.results ?? [];\n }\n\n /**\n * Register a new bank account (CBU) for the seller. Note: MP usually\n * requires this through the dashboard for compliance — this endpoint may\n * not work for all sellers.\n */\n async registerBankAccount(params: {\n cbu: string;\n alias?: string;\n }): Promise<BankAccount> {\n return this.request<BankAccount>(\"POST\", \"/users/me/bank_accounts\", params);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // v0.7 — Point Devices (physical terminal hardware: Smart, Tap to Pay)\n //\n // Distinct from the logical `Pos` entity. PointDevices are the actual\n // physical terminals you have at brick-and-mortar shops.\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * List the Point devices linked to the seller's MP account. Each device\n * has an id (the device serial), an operating_mode (PDV vs STANDALONE),\n * and an optional pos_id (when bound to a logical POS).\n */\n async listPointDevices(\n params: { posId?: string | number; limit?: number; offset?: number } = {},\n ): Promise<{ devices: PointDevice[]; paging: { total: number; limit: number; offset: number } }> {\n const query: Record<string, string | number> = {};\n if (params.posId !== undefined) query[\"pos.id\"] = params.posId;\n if (params.limit !== undefined) query.limit = params.limit;\n if (params.offset !== undefined) query.offset = params.offset;\n const result = await this.request<{\n devices?: PointDevice[];\n paging?: { total: number; limit: number; offset: number };\n }>(\"GET\", \"/point/integration-api/devices\", undefined, { query });\n return {\n devices: result.devices ?? [],\n paging: result.paging ?? { total: 0, limit: params.limit ?? 50, offset: params.offset ?? 0 },\n };\n }\n\n /**\n * Switch a Point device's operating mode:\n * - \"PDV\": device is bound to a logical Pos and only takes payments\n * triggered through that Pos (typical for cash-register integrations).\n * - \"STANDALONE\": device works independently, accepts any payment.\n */\n async updatePointDeviceOperatingMode(\n deviceId: string,\n operatingMode: \"PDV\" | \"STANDALONE\",\n ): Promise<PointDevice> {\n return this.request<PointDevice>(\n \"PATCH\",\n `/point/integration-api/devices/${encodeURIComponent(deviceId)}`,\n { operating_mode: operatingMode },\n );\n }\n\n /**\n * Create a payment intent on a Point device — the device prompts the buyer\n * to tap/insert/swipe. Returns immediately with intent id; query state via\n * `getPointPaymentIntent()` or wait for `point_integration_wh` webhook.\n *\n * NOTE: amount is in CENTAVOS (Point API differs from Payments API which\n * uses pesos). 100 = $1 ARS, 1000 = $10, 10000 = $100, etc.\n */\n async createPointPaymentIntent(\n deviceId: string,\n params: CreatePointPaymentIntentParams,\n ): Promise<PointPaymentIntent> {\n const body: Record<string, unknown> = {\n amount: params.amount,\n ...(params.description ? { description: params.description } : {}),\n ...(params.externalReference\n ? { additional_info: { external_reference: params.externalReference } }\n : {}),\n payment: {\n installments: params.installments ?? 1,\n ...(params.installmentsCost\n ? { installments_cost: params.installmentsCost }\n : {}),\n ...(params.printOnTerminal !== undefined\n ? { print_on_terminal: params.printOnTerminal }\n : {}),\n ...(params.ticketNumber ? { ticket_number: params.ticketNumber } : {}),\n },\n };\n return this.request<PointPaymentIntent>(\n \"POST\",\n `/point/integration-api/devices/${encodeURIComponent(deviceId)}/payment-intents`,\n body,\n );\n }\n\n /** Get the current state of a Point payment intent. */\n async getPointPaymentIntent(intentId: string): Promise<PointPaymentIntent> {\n return this.request<PointPaymentIntent>(\n \"GET\",\n `/point/integration-api/payment-intents/${encodeURIComponent(intentId)}`,\n );\n }\n\n /**\n * Cancel an OPEN payment intent before the buyer interacts with the device.\n * Only works while state is \"OPEN\" — once the buyer taps, you can't cancel.\n */\n async cancelPointPaymentIntent(\n deviceId: string,\n intentId: string,\n ): Promise<{ id: string; canceled: true }> {\n await this.request(\n \"DELETE\",\n `/point/integration-api/devices/${encodeURIComponent(deviceId)}/payment-intents/${encodeURIComponent(intentId)}`,\n );\n return { id: intentId, canceled: true };\n }\n}\n\nexport { MercadoPagoError };\n","/**\n * Universal crypto helpers — work in Node 18+, Vercel Edge Runtime, browsers,\n * and any environment that exposes the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Crypto)\n * via `globalThis.crypto`.\n *\n * # Why this module exists\n *\n * Webhook HMAC verification and deterministic idempotency keys both need\n * crypto primitives. The previous implementation used `node:crypto` which\n * doesn't ship in Edge Runtime (Vercel Edge, Cloudflare Workers, Deno\n * deploy). Web Crypto is the cross-runtime standard.\n *\n * # Why async?\n *\n * Web Crypto's `crypto.subtle.*` methods are Promise-based by design (they\n * may delegate to hardware-backed key stores). The trade-off: signatures\n * change from `(...) => boolean` to `(...) => Promise<boolean>`. All call\n * sites in this package are already inside `async` tool execute() handlers,\n * so this is a zero-cost upgrade for the typical agent-tool consumer.\n *\n * # Performance\n *\n * Web Crypto in Node 18+ is implemented in OpenSSL-backed C, so HMAC-SHA256\n * costs ~100µs per verification — same order as the old `node:crypto`\n * synchronous path. For SHA256-of-string idempotency keys, perf is identical.\n */\n\nconst subtle: SubtleCrypto = (() => {\n // `crypto` is a global in modern Node (18+), Edge runtimes, browsers, etc.\n // `globalThis.crypto.subtle` exists if the runtime supports Web Crypto.\n const c = (globalThis as { crypto?: Crypto }).crypto;\n if (!c?.subtle) {\n throw new Error(\n \"@ar-agents/mercadopago: Web Crypto API is not available in this runtime. Use Node 18+, Vercel Edge Runtime, Cloudflare Workers, or any modern browser.\",\n );\n }\n return c.subtle;\n})();\n\nconst encoder = new TextEncoder();\n\n/**\n * Compute HMAC-SHA256 of `message` using `secret`. Returns the hex digest.\n *\n * @param secret The HMAC secret (e.g., MP webhook secret from dev panel).\n * @param message The string to authenticate.\n */\nexport async function hmacSha256Hex(\n secret: string,\n message: string,\n): Promise<string> {\n const keyMaterial = await subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sigBuf = await subtle.sign(\n \"HMAC\",\n keyMaterial,\n encoder.encode(message),\n );\n return bufferToHex(sigBuf);\n}\n\n/**\n * Compute SHA-256 hash of `input`. Returns the full 64-char hex digest.\n *\n * Used for deterministic idempotency keys derived from caller-meaningful\n * fields. Truncate the output to 32 chars for storage if needed.\n */\nexport async function sha256Hex(input: string): Promise<string> {\n const digest = await subtle.digest(\"SHA-256\", encoder.encode(input));\n return bufferToHex(digest);\n}\n\n/**\n * Constant-time comparison of two hex strings. Use after computing an\n * expected HMAC to compare against a user-supplied signature, to prevent\n * timing attacks that could leak the secret.\n *\n * Falls back to a manual constant-time loop because `node:crypto`'s\n * `timingSafeEqual` isn't available in Edge.\n */\nexport function timingSafeEqualHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nfunction bufferToHex(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n const b = bytes[i]!;\n hex += (b < 16 ? \"0\" : \"\") + b.toString(16);\n }\n return hex;\n}\n","import { z } from \"zod\";\n\n/**\n * Site IDs supported by Mercado Pago. The lib targets MLA (Argentina) primarily;\n * other LATAM sites may work for the read paths but the full Subscriptions flow\n * is only verified against MLA.\n */\nexport const SiteIdSchema = z.enum([\"MLA\", \"MLB\", \"MLM\", \"MCO\", \"MLC\", \"MLU\"]);\nexport type SiteId = z.infer<typeof SiteIdSchema>;\n\n/**\n * Currency identifiers MP exposes. ARS is the supported case for v0.1.\n */\nexport const CurrencyIdSchema = z.enum([\"ARS\", \"USD\", \"BRL\", \"MXN\"]);\nexport type CurrencyId = z.infer<typeof CurrencyIdSchema>;\n\n/**\n * Recurrence frequency unit for a subscription's auto_recurring config.\n */\nexport const FrequencyTypeSchema = z.enum([\"months\", \"days\"]);\nexport type FrequencyType = z.infer<typeof FrequencyTypeSchema>;\n\n/**\n * Lifecycle states a Mercado Pago preapproval can be in. The string is the\n * canonical MP value; we widen to `string` for forward compatibility because\n * MP has historically introduced new states without notice.\n */\nexport const PreapprovalStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"authorized\"),\n z.literal(\"paused\"),\n z.literal(\"cancelled\"),\n z.string(),\n]);\nexport type PreapprovalStatus = z.infer<typeof PreapprovalStatusSchema>;\n\nexport const AutoRecurringSchema = z.object({\n frequency: z.number().int().positive(),\n frequency_type: FrequencyTypeSchema,\n transaction_amount: z.number().positive(),\n currency_id: CurrencyIdSchema,\n start_date: z.string().optional(),\n end_date: z.string().optional(),\n});\nexport type AutoRecurring = z.infer<typeof AutoRecurringSchema>;\n\nexport const PreapprovalSchema = z.object({\n id: z.string(),\n status: PreapprovalStatusSchema,\n payer_email: z.string(),\n init_point: z.string().url(),\n external_reference: z.string().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n next_payment_date: z.string().optional(),\n payer_id: z.union([z.string(), z.number()]).optional(),\n auto_recurring: AutoRecurringSchema,\n});\nexport type Preapproval = z.infer<typeof PreapprovalSchema>;\n\n/**\n * Input for creating a preapproval (subscription). Internal field names match\n * MP API semantics; the public client method maps from camelCase Naza-friendly\n * params to the snake_case payload MP expects.\n */\nexport interface CreatePreapprovalParams {\n /** Short customer-facing description shown at checkout. */\n reason: string;\n /** Email of the buyer. Cannot equal the seller account's email (MP rejects). */\n payerEmail: string;\n /** Recurring amount per cycle. */\n amount: number;\n /** ARS for Argentina. Other currencies depend on the seller account's site. */\n currency: CurrencyId;\n /** Recurrence frequency (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** HTTPS URL where MP redirects the buyer after first payment. localhost rejected. */\n backUrl: string;\n /** Optional client-side identifier for the subscription. */\n externalReference?: string;\n}\n\n/**\n * The shape of an MP webhook notification body for `topic=preapproval`. MP's\n * webhook payload varies by event type; this is the union of fields seen in\n * production.\n */\nexport const WebhookBodySchema = z\n .object({\n type: z.string().optional(),\n topic: z.string().optional(),\n action: z.string().optional(),\n data: z.object({ id: z.union([z.string(), z.number()]) }).optional(),\n resource: z.string().optional(),\n user_id: z.union([z.string(), z.number()]).optional(),\n api_version: z.string().optional(),\n date_created: z.string().optional(),\n id: z.union([z.string(), z.number()]).optional(),\n live_mode: z.boolean().optional(),\n })\n .passthrough();\nexport type WebhookBody = z.infer<typeof WebhookBodySchema>;\n\n/**\n * Normalized webhook event after parsing. The library extracts topic + dataId\n * from either query params or body, since MP sends them in either location\n * depending on integration version.\n */\nexport interface ParsedWebhookEvent {\n /** Topic of the event, e.g., \"preapproval\", \"payment\", \"subscription_authorized_payment\". */\n topic: string;\n /** ID of the affected resource. */\n dataId: string;\n /** Action descriptor when present (e.g., \"updated\", \"created\"). */\n action: string | null;\n /** Raw body MP sent, for caller inspection / debugging. */\n raw: WebhookBody;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payments (v0.2)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Top-level lifecycle status of a payment. MP-canonical values; widened to\n * string for forward compatibility.\n */\nexport const PaymentStatusSchema = z.union([\n z.literal(\"pending\"),\n z.literal(\"approved\"),\n z.literal(\"authorized\"),\n z.literal(\"in_process\"),\n z.literal(\"in_mediation\"),\n z.literal(\"rejected\"),\n z.literal(\"cancelled\"),\n z.literal(\"refunded\"),\n z.literal(\"charged_back\"),\n z.string(),\n]);\nexport type PaymentStatus = z.infer<typeof PaymentStatusSchema>;\n\n/** Status detail — finer granularity inside a status (e.g., why rejected). */\nexport type PaymentStatusDetail = string;\n\n/**\n * The full Payment object MP returns. Many fields are optional because they\n * vary by payment method, status, and integration mode (Checkout Pro vs API).\n */\nexport const PaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: PaymentStatusSchema,\n status_detail: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n date_approved: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n transaction_amount: z.number(),\n currency_id: z.string(),\n installments: z.number().int().nullable().optional(),\n payment_method_id: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n external_reference: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n payer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n email: z.string().nullable().optional(),\n identification: z\n .object({\n type: z.string().nullable().optional(),\n number: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n })\n .passthrough()\n .optional(),\n transaction_details: z\n .object({\n net_received_amount: z.number().nullable().optional(),\n total_paid_amount: z.number().nullable().optional(),\n installment_amount: z.number().nullable().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Payment = z.infer<typeof PaymentSchema>;\n\n/** Params for creating a payment (Checkout API / transparent flow). */\nexport interface CreatePaymentParams {\n /** Amount in account currency. ARS for Argentina. */\n transactionAmount: number;\n /** Number of installments. Use 1 for no cuotas; AR cards typically allow up to 12. */\n installments?: number;\n /** MP payment_method_id — `visa`, `master`, `naranja`, `account_money`, etc. */\n paymentMethodId: string;\n /** Payer email — REQUIRED. Cannot equal seller email. */\n payerEmail: string;\n /** Card token from MP frontend SDK (Cardform). Required for credit/debit; omit for `account_money` etc. */\n token?: string;\n /** Description shown in payer's MP statement. */\n description?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** Optional payer identification (DNI/CUIT) — required for some payment types. */\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n /** Webhook override URL. Falls back to dashboard config if omitted. */\n notificationUrl?: string;\n /** AFIP/ARCA discount/fee/tax additions. Used to discriminate IVA, marketplace fees, etc. */\n additionalInfo?: {\n items?: Array<{\n id?: string;\n title: string;\n quantity: number;\n unit_price: number;\n description?: string;\n }>;\n };\n /** Statement descriptor — what shows on the buyer's card statement. Max 13 chars. */\n statementDescriptor?: string;\n /** When true, capture is deferred (only for credit cards) — useful for hold flows. */\n capture?: boolean;\n /** Idempotency key — pass the same value on retries to dedupe. Required for non-GET. */\n idempotencyKey?: string;\n}\n\nexport interface SearchPaymentsParams {\n /** Filter by external_reference (your-system id). */\n externalReference?: string;\n /** Filter by payment status. */\n status?: PaymentStatus;\n /** Filter by payer email. */\n payerEmail?: string;\n /** Date range for date_created (ISO 8601). */\n beginDate?: string;\n endDate?: string;\n /** Result page (default 0). */\n offset?: number;\n /** Page size (default 30, max 100). */\n limit?: number;\n /** Sort: e.g. \"date_created\" desc. */\n sort?: string;\n criteria?: \"asc\" | \"desc\";\n}\n\nexport const PaymentsSearchResultSchema = z.object({\n paging: z.object({\n total: z.number(),\n limit: z.number(),\n offset: z.number(),\n }),\n results: z.array(PaymentSchema),\n});\nexport type PaymentsSearchResult = z.infer<typeof PaymentsSearchResultSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Refunds\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const RefundSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n payment_id: z.union([z.string(), z.number()]).transform(String),\n amount: z.number(),\n source: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n type: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n status: z.string().nullable().optional(),\n}).passthrough();\nexport type Refund = z.infer<typeof RefundSchema>;\n\nexport interface CreateRefundParams {\n paymentId: string;\n /** Partial refund amount. Omit for full refund. */\n amount?: number;\n /** Idempotency key — required for retry-safety. */\n idempotencyKey?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Checkout Pro (Preferences)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PreferenceItemSchema = z.object({\n id: z.string().optional(),\n title: z.string(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n category_id: z.string().optional(),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n currency_id: CurrencyIdSchema.optional(),\n});\nexport type PreferenceItem = z.infer<typeof PreferenceItemSchema>;\n\nexport const PreferenceSchema = z.object({\n id: z.string(),\n init_point: z.string().url().optional(),\n sandbox_init_point: z.string().url().optional(),\n client_id: z.union([z.string(), z.number()]).optional(),\n collector_id: z.union([z.string(), z.number()]).optional(),\n items: z.array(PreferenceItemSchema).optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string().nullable().optional(),\n expires: z.boolean().optional(),\n expiration_date_from: z.string().nullable().optional(),\n expiration_date_to: z.string().nullable().optional(),\n}).passthrough();\nexport type Preference = z.infer<typeof PreferenceSchema>;\n\nexport interface CreatePreferenceParams {\n items: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n currency_id?: CurrencyId;\n description?: string;\n picture_url?: string;\n }>;\n payer?: {\n name?: string;\n surname?: string;\n email?: string;\n phone?: { area_code?: string; number?: string };\n identification?: { type: string; number: string };\n address?: { street_name?: string; street_number?: number; zip_code?: string };\n };\n /** Where to send the buyer after success/failure/pending. */\n backUrls?: { success?: string; failure?: string; pending?: string };\n /** \"approved\" → auto-redirect on success; \"all\" → always; \"\" → never. */\n autoReturn?: \"approved\" | \"all\";\n /** Webhook URL. */\n notificationUrl?: string;\n /** Your-system id for correlation. */\n externalReference?: string;\n /** Max installments offered. Defaults to MP account config. */\n paymentMethods?: {\n excluded_payment_types?: Array<{ id: string }>;\n excluded_payment_methods?: Array<{ id: string }>;\n installments?: number;\n default_installments?: number;\n };\n /** Statement descriptor — shows on buyer's card statement. */\n statementDescriptor?: string;\n /** Expiration window for the link itself. */\n expires?: boolean;\n expirationDateFrom?: string;\n expirationDateTo?: string;\n /**\n * Marketplace split — if set, funds route to `collector_id` (the seller)\n * and `marketplaceFee` (in ARS) is credited to the marketplace's MP\n * account. v0.5+. See `MarketplaceParams` for details.\n */\n marketplace?: string;\n marketplaceFee?: number;\n /** Seller's MP user_id. Funds route here when set. */\n collectorId?: string | number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Customers + Saved Cards\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CustomerSchema = z.object({\n id: z.string(),\n email: z.string(),\n first_name: z.string().nullable().optional(),\n last_name: z.string().nullable().optional(),\n phone: z\n .object({ area_code: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n identification: z\n .object({ type: z.string().nullable().optional(), number: z.string().nullable().optional() })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n date_last_updated: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n}).passthrough();\nexport type Customer = z.infer<typeof CustomerSchema>;\n\nexport const CustomerCardSchema = z.object({\n id: z.string(),\n customer_id: z.string(),\n expiration_month: z.number().int().nullable().optional(),\n expiration_year: z.number().int().nullable().optional(),\n first_six_digits: z.string().nullable().optional(),\n last_four_digits: z.string().nullable().optional(),\n payment_method: z\n .object({\n id: z.string().nullable().optional(),\n name: z.string().nullable().optional(),\n payment_type_id: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n date_created: z.string().nullable().optional(),\n}).passthrough();\nexport type CustomerCard = z.infer<typeof CustomerCardSchema>;\n\nexport interface CreateCustomerParams {\n email: string;\n firstName?: string;\n lastName?: string;\n phone?: { areaCode?: string; number?: string };\n identification?: { type: \"DNI\" | \"CUIT\" | \"CUIL\"; number: string };\n description?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payment Methods + Installments\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PaymentMethodSchema = z.object({\n id: z.string(),\n name: z.string(),\n payment_type_id: z.string(),\n status: z.string(),\n thumbnail: z.string().nullable().optional(),\n secure_thumbnail: z.string().nullable().optional(),\n min_allowed_amount: z.number().nullable().optional(),\n max_allowed_amount: z.number().nullable().optional(),\n}).passthrough();\nexport type PaymentMethod = z.infer<typeof PaymentMethodSchema>;\n\nexport const InstallmentOfferSchema = z.object({\n payment_method_id: z.string(),\n payment_type_id: z.string(),\n issuer: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n name: z.string().nullable().optional(),\n })\n .nullable()\n .optional(),\n payer_costs: z.array(\n z.object({\n installments: z.number().int(),\n installment_rate: z.number(),\n discount_rate: z.number().nullable().optional(),\n installment_amount: z.number(),\n total_amount: z.number(),\n recommended_message: z.string().nullable().optional(),\n }).passthrough(),\n ),\n}).passthrough();\nexport type InstallmentOffer = z.infer<typeof InstallmentOfferSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Account\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─────────────────────────────────────────────────────────────────────────────\n// QR (in-store dynamic)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const QrOrderSchema = z.object({\n in_store_order_id: z.string(),\n qr_data: z.string(),\n}).passthrough();\nexport type QrOrder = z.infer<typeof QrOrderSchema>;\n\nexport interface CreateQrPaymentParams {\n /** Pre-configured POS external_id from MP dashboard. Required. */\n externalPosId: string;\n /** Total amount in ARS. */\n totalAmount: number;\n /** Display title shown to the buyer when scanning. */\n title: string;\n description?: string;\n /** Webhook URL — MP fires `point_integration_wh` then `payment` topic. */\n notificationUrl?: string;\n /** Your-system identifier for correlation. */\n externalReference?: string;\n /** ISO 8601 expiration (default 10 min from now). */\n expirationDate?: string;\n /** Itemized line items (optional but improves analytics). */\n items?: Array<{\n title: string;\n quantity: number;\n unit_price: number;\n unit_measure?: string;\n total_amount?: number;\n }>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Card tokens (for charge_saved_card)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CardTokenSchema = z.object({\n id: z.string(),\n status: z.string().optional(),\n date_due: z.string().optional(),\n card_id: z.string().optional(),\n cardholder: z.unknown().optional(),\n}).passthrough();\nexport type CardToken = z.infer<typeof CardTokenSchema>;\n\nexport interface CreateCardTokenParams {\n /** Saved card id (from list_customer_cards). */\n cardId: string;\n /** Customer that owns the card. */\n customerId: string;\n /** CVV — required for AR; MP doesn't store CVV. */\n securityCode: string;\n}\n\nexport const AccountInfoSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n email: z.string().nullable().optional(),\n nickname: z.string().nullable().optional(),\n country_id: z.string().nullable().optional(),\n site_id: z.string().nullable().optional(),\n user_type: z.string().nullable().optional(),\n status: z\n .object({ user_type: z.string().nullable().optional() })\n .passthrough()\n .nullable()\n .optional(),\n}).passthrough();\nexport type AccountInfo = z.infer<typeof AccountInfoSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Subscription Plans (preapproval_plan — reusable plan definitions)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A reusable subscription plan. Different from a per-customer subscription:\n * a plan defines the price + frequency once, then customers subscribe to it\n * via `subscribe_to_plan` (which creates a preapproval pointing at the plan).\n *\n * Use plans for SaaS-style billing where you have a fixed set of tiers\n * (Básico/Pro/Enterprise) instead of negotiating amounts per customer.\n */\nexport const SubscriptionPlanSchema = z.object({\n id: z.string(),\n status: z.string(),\n reason: z.string(),\n back_url: z.string().url().optional(),\n external_reference: z.string().nullable().optional(),\n date_created: z.string(),\n last_modified: z.string(),\n auto_recurring: AutoRecurringSchema,\n}).passthrough();\nexport type SubscriptionPlan = z.infer<typeof SubscriptionPlanSchema>;\n\nexport interface CreateSubscriptionPlanParams {\n /** Customer-facing plan name shown at checkout. */\n reason: string;\n /** Where MP redirects buyer after first payment. HTTPS only. */\n backUrl: string;\n /** Recurrence (e.g., 1 + months = monthly). */\n frequency: number;\n frequencyType: FrequencyType;\n /** Amount per cycle. */\n amount: number;\n /** ARS for AR. */\n currency: CurrencyId;\n /** Optional plan-level identifier from your system. */\n externalReference?: string;\n /** Free trial days before first charge. */\n freeTrialFrequency?: number;\n freeTrialFrequencyType?: FrequencyType;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stores + POS (for QR payments setup)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const StoreSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string().optional(),\n external_id: z.string().optional(),\n date_creation: z.string().optional(),\n location: z\n .object({\n address_line: z.string().optional(),\n city_name: z.string().optional(),\n state_name: z.string().optional(),\n country_id: z.string().optional(),\n latitude: z.number().optional(),\n longitude: z.number().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Store = z.infer<typeof StoreSchema>;\n\nexport interface CreateStoreParams {\n /** Display name for the store. */\n name: string;\n /** Caller-defined identifier (must be unique within the seller's stores). */\n externalId: string;\n /** Optional physical location. */\n location?: {\n addressLine?: string;\n cityName?: string;\n stateName?: string;\n countryId?: string;\n latitude?: number;\n longitude?: number;\n };\n}\n\nexport const PosSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string().optional(),\n external_id: z.string().optional(),\n store_id: z.union([z.string(), z.number()]).optional(),\n category: z.number().int().optional(),\n fixed_amount: z.boolean().optional(),\n qr: z\n .object({\n template_image: z.string().optional(),\n image: z.string().optional(),\n })\n .passthrough()\n .optional(),\n date_creation: z.string().optional(),\n}).passthrough();\nexport type Pos = z.infer<typeof PosSchema>;\n\nexport interface CreatePosParams {\n /** Display name. */\n name: string;\n /** Caller-defined POS id (used in QR endpoints; unique within store). */\n externalId: string;\n /** Parent store id (number from createStore). */\n storeId: string | number;\n /** MP category code (default 621102 = Other Food and Beverage Services). */\n category?: number;\n /** If true, the QR has a fixed amount; if false, dynamic per-order. */\n fixedAmount?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Disputes / Chargebacks (read-only)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const DisputeSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: z.string(),\n resource: z.string().optional(),\n resource_id: z.union([z.string(), z.number()]).optional(),\n amount: z.number().optional(),\n date_created: z.string().optional(),\n reason: z.string().optional(),\n resolution: z\n .object({\n reason: z.string().optional(),\n result: z.string().optional(),\n date: z.string().optional(),\n })\n .passthrough()\n .optional(),\n /** Documents the buyer / seller submitted as evidence. */\n documents: z.array(z.unknown()).optional(),\n /** Buyer's stated complaint. */\n reason_description: z.string().optional(),\n}).passthrough();\nexport type Dispute = z.infer<typeof DisputeSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Subscription Payment History (authorized_payments under a preapproval)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const SubscriptionPaymentSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n preapproval_id: z.string().optional(),\n status: z.string(),\n payment_id: z.union([z.string(), z.number()]).nullable().optional(),\n transaction_amount: z.number().optional(),\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n debit_date: z.string().optional(),\n next_retry_date: z.string().nullable().optional(),\n retry_attempt: z.number().optional(),\n reason: z.string().optional(),\n}).passthrough();\nexport type SubscriptionPayment = z.infer<typeof SubscriptionPaymentSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Identification Types + Issuers (lookup helpers)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const IdentificationTypeSchema = z.object({\n id: z.string(),\n name: z.string(),\n type: z.string(),\n min_length: z.number().optional(),\n max_length: z.number().optional(),\n}).passthrough();\nexport type IdentificationType = z.infer<typeof IdentificationTypeSchema>;\n\nexport const IssuerSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n name: z.string(),\n secure_thumbnail: z.string().nullable().optional(),\n thumbnail: z.string().nullable().optional(),\n processing_mode: z.string().optional(),\n status: z.string().optional(),\n}).passthrough();\nexport type Issuer = z.infer<typeof IssuerSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Webhooks (configure subscriptions to topics)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Topics MP can fire webhooks for. Add more as MP exposes them. */\nexport const WebhookTopicSchema = z.enum([\n \"payment\",\n \"subscription_authorized_payment\",\n \"subscription_preapproval\",\n \"merchant_order\",\n \"point_integration_wh\",\n \"stop_delivery_op_wh\",\n]);\nexport type WebhookTopic = z.infer<typeof WebhookTopicSchema>;\n\nexport const WebhookConfigSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n url: z.string().url().optional(),\n status: z.string().optional(),\n topic: z.string().optional(),\n date_created: z.string().optional(),\n date_modified: z.string().optional(),\n}).passthrough();\nexport type WebhookConfig = z.infer<typeof WebhookConfigSchema>;\n\nexport interface CreateWebhookParams {\n url: string;\n /** Topic to subscribe to. */\n topic: WebhookTopic | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.5 — OAuth Marketplace flow (link third-party MP accounts)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Token response from MP's OAuth `/oauth/token` endpoint. The `access_token`\n * is what you use to make API calls AS the linked seller; the `refresh_token`\n * is what you use to refresh the access_token before expiration (~6 hours).\n *\n * **Persist the refresh_token**: it does NOT expire and is the only way to\n * keep the integration alive long-term.\n *\n * **Always store `user_id`** alongside the tokens — it identifies WHICH\n * seller these tokens belong to (you'll have many in a marketplace).\n */\nexport const OAuthTokenSchema = z.object({\n access_token: z.string(),\n token_type: z.string().optional(),\n /** Seconds until access_token expires. Typically 21600 (6h). */\n expires_in: z.number().optional(),\n scope: z.string().optional(),\n /** The MP user_id of the seller who authorized your app. */\n user_id: z.union([z.string(), z.number()]).transform(String),\n refresh_token: z.string().optional(),\n public_key: z.string().optional(),\n live_mode: z.boolean().optional(),\n}).passthrough();\nexport type OAuthToken = z.infer<typeof OAuthTokenSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.5 — Order Management API (the new API replacing some Preference flows)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Status of an Order. Distinct from Payment status — an Order can have\n * multiple payments and the Order status reflects the aggregate state.\n */\nexport const OrderStatusSchema = z.union([\n z.literal(\"created\"),\n z.literal(\"processed\"),\n z.literal(\"action_required\"),\n z.literal(\"canceled\"),\n z.literal(\"expired\"),\n z.literal(\"refunded\"),\n z.string(),\n]);\nexport type OrderStatus = z.infer<typeof OrderStatusSchema>;\n\nexport const OrderItemSchema = z.object({\n title: z.string(),\n unit_price: z.number(),\n quantity: z.number(),\n description: z.string().optional(),\n id: z.string().optional(),\n category_id: z.string().optional(),\n picture_url: z.string().optional(),\n}).passthrough();\nexport type OrderItem = z.infer<typeof OrderItemSchema>;\n\nexport const OrderSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n type: z.string().optional(),\n status: OrderStatusSchema.optional(),\n status_detail: z.string().optional(),\n external_reference: z.string().optional(),\n total_amount: z.union([z.number(), z.string()]).optional(),\n /** Currency for this Order (e.g. \"ARS\"). */\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n date_last_updated: z.string().optional(),\n items: z.array(OrderItemSchema).optional(),\n /** Underlying transactions (payments) attached to this Order. */\n transactions: z\n .object({\n payments: z.array(z.unknown()).optional(),\n refunds: z.array(z.unknown()).optional(),\n })\n .passthrough()\n .optional(),\n /** Capture mode: \"automatic\" (charges immediately) or \"manual\" (auth-only). */\n capture_mode: z.string().optional(),\n}).passthrough();\nexport type Order = z.infer<typeof OrderSchema>;\n\nexport interface CreateOrderParams {\n /**\n * Order type. Common values:\n * - \"online\" — checkout-style (the most common)\n * - \"in_store\" — POS QR / in-person\n */\n type: \"online\" | \"in_store\" | string;\n /** Currency (e.g. \"ARS\"). */\n currency_id?: string;\n /** External reference for reconciliation (your internal id). */\n external_reference?: string;\n /** Items being ordered. */\n items?: OrderItem[];\n /** Total amount if you'd rather not itemize. */\n total_amount?: number;\n /** Customer info (payer). */\n payer?: {\n email?: string;\n first_name?: string;\n last_name?: string;\n identification?: { type?: string; number?: string };\n };\n /**\n * Capture mode:\n * - \"automatic\" (default) — charge immediately when paid.\n * - \"manual\" — authorize only, capture later via captureOrder().\n */\n capture_mode?: \"automatic\" | \"manual\";\n /**\n * Notification URL — MP fires webhooks for order lifecycle events here.\n */\n notification_url?: string;\n /**\n * Marketplace fee + collector — required for marketplace integrations\n * where YOU collect on behalf of a third-party seller (you take a fee,\n * the rest goes to the seller).\n */\n marketplace?: string;\n marketplace_fee?: number;\n collector_id?: string | number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.5 — Marketplace split payments (also usable on regular Preference)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Marketplace fee + collector params, applied to a Preference or Order.\n *\n * **How it works**: when you create a Preference or Order with\n * `collector_id` set to a SELLER's MP user_id (not yours), and you have a\n * valid OAuth access_token for that seller, MP routes the funds to the\n * seller's MP account, and credits `marketplace_fee` (in ARS, not %) to\n * YOUR marketplace account.\n *\n * Used for two-sided platforms (Rappi, MercadoLibre, Tienda Nube, etc.)\n * where your platform takes a fee and the seller keeps the rest.\n */\nexport interface MarketplaceParams {\n /**\n * Marketplace identifier — your application's marketplace name (you set\n * this when registering your app in MP's dev panel).\n */\n marketplace?: string;\n /**\n * Fee in ARS (NOT a percentage) that goes to your marketplace account.\n * Compute it from your own commission rate before passing.\n */\n marketplace_fee?: number;\n /**\n * The SELLER's MP user_id. The funds go to this account; the\n * `marketplace_fee` is split off and goes to YOUR account.\n * Get this from `OAuthToken.user_id` after the seller authorizes your app.\n */\n collector_id?: string | number;\n /**\n * Optional: split among multiple sellers. If set, `collector_id` /\n * `marketplace_fee` are ignored.\n */\n application_fee?: number;\n}\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 — Account Balance + Movements\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Account balance snapshot. Sum of `available + unavailable` is the seller's\n * total Mercado Pago balance.\n *\n * - `available` — funds the seller can withdraw or pay with right now.\n * - `unavailable` — funds in retention (typically 14-21 days for new sellers\n * or for risk-flagged transactions). Becomes `available` automatically.\n */\nexport const AccountBalanceSchema = z.object({\n user_id: z.union([z.string(), z.number()]).transform(String).optional(),\n available_balance: z.number(),\n unavailable_balance: z.number(),\n total_amount: z.number(),\n currency_id: z.string().default(\"ARS\"),\n}).passthrough();\nexport type AccountBalance = z.infer<typeof AccountBalanceSchema>;\n\n/**\n * Account movement (a single line in the seller's MP \"movements\" log).\n * Includes incoming payments, outgoing transfers, refunds, holdings, etc.\n */\nexport const AccountMovementSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n type: z.string(),\n description: z.string().optional(),\n amount: z.number(),\n currency_id: z.string().optional(),\n status: z.string().optional(),\n date_created: z.string().optional(),\n date_released: z.string().optional(),\n reference_id: z.union([z.string(), z.number()]).optional(),\n payment_id: z.union([z.string(), z.number()]).optional(),\n}).passthrough();\nexport type AccountMovement = z.infer<typeof AccountMovementSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 — Settlements (release_money)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A scheduled or completed transfer from the MP account to the seller's\n * registered bank account (CBU). Settlements are the core of \"when do I\n * actually get paid\".\n */\nexport const SettlementSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: z.string().optional(),\n amount: z.number().optional(),\n currency_id: z.string().optional(),\n date_created: z.string().optional(),\n date_scheduled: z.string().optional(),\n date_processed: z.string().optional(),\n bank_account: z\n .object({\n cbu: z.string().optional(),\n bank_name: z.string().optional(),\n })\n .passthrough()\n .optional(),\n}).passthrough();\nexport type Settlement = z.infer<typeof SettlementSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.6 — 3DS (Strong Customer Authentication) info derived from a Payment\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ThreeDSStatus =\n | \"not_required\" // No 3DS challenge issued (low-risk transaction).\n | \"frictionless\" // Issuer approved without challenge.\n | \"challenge_required\" // Buyer must complete the issuer's challenge.\n | \"rejected\" // Failed authentication.\n | \"unknown\"; // Couldn't determine — surface to ops.\n\nexport interface ThreeDSInfo {\n /** High-level status — the field most agents care about. */\n status: ThreeDSStatus;\n /** Raw `three_d_secure_mode` field from the payment, if present. */\n mode: string | null;\n /**\n * URL the buyer must visit to complete the 3DS challenge, if one was\n * triggered. `null` for frictionless/not_required.\n */\n challengeUrl: string | null;\n /** Human-readable explanation suitable for surfacing to the user. */\n description: string;\n}\n\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.7 — Merchant Orders\n//\n// MerchantOrder is the parent entity for Payments associated with a single\n// Preference. Each Preference can collect multiple Payments (partial\n// installments, retries) — the MerchantOrder aggregates them and reports\n// the final paid_amount, shipping status, etc. Useful for reconciling\n// \"which payments belong to which order\" at the dashboard level.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const MerchantOrderSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n status: z.string().optional(),\n external_reference: z.string().nullable().optional(),\n preference_id: z.union([z.string(), z.number()]).optional(),\n payments: z.array(z.unknown()).optional(),\n shipments: z.array(z.unknown()).optional(),\n payer: z.unknown().optional(),\n collector: z.unknown().optional(),\n marketplace: z.string().optional(),\n total_amount: z.number().optional(),\n paid_amount: z.number().optional(),\n refunded_amount: z.number().optional(),\n shipping_cost: z.number().optional(),\n date_created: z.string().optional(),\n last_updated: z.string().optional(),\n site_id: z.string().optional(),\n order_status: z.string().optional(),\n}).passthrough();\nexport type MerchantOrder = z.infer<typeof MerchantOrderSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.7 — Bank Accounts (the CBUs the seller has registered for payouts)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const BankAccountSchema = z.object({\n id: z.union([z.string(), z.number()]).transform(String),\n cbu: z.string().optional(),\n alias: z.string().nullable().optional(),\n bank_name: z.string().optional(),\n account_type: z.string().optional(),\n status: z.string().optional(),\n is_default: z.boolean().optional(),\n date_created: z.string().optional(),\n}).passthrough();\nexport type BankAccount = z.infer<typeof BankAccountSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.7 — Point Devices (physical POS hardware: Point Smart, Point Tap to Pay)\n//\n// Distinct from the \"Pos\" (logical sale point) entity. PointDevices are the\n// physical terminals you use at a brick-and-mortar shop. Use this API to:\n// - List the devices linked to your account\n// - Switch a device between PDV mode (linked to Pos) and STANDALONE mode\n// - Push a payment intent directly to a device (the device prompts the\n// buyer to tap/insert; no QR involved)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const PointDeviceSchema = z.object({\n id: z.string(),\n pos_id: z.union([z.string(), z.number()]).nullable().optional(),\n store_id: z.union([z.string(), z.number()]).nullable().optional(),\n external_pos_id: z.string().nullable().optional(),\n operating_mode: z.union([z.literal(\"PDV\"), z.literal(\"STANDALONE\"), z.string()]).optional(),\n}).passthrough();\nexport type PointDevice = z.infer<typeof PointDeviceSchema>;\n\nexport type PointPaymentIntentState =\n | \"OPEN\" // Sent to device, awaiting buyer interaction\n | \"PROCESSING\" // Buyer tapped/inserted, processing\n | \"FINISHED\" // Done (approved or rejected)\n | \"CANCELED\"\n | \"ERROR\"\n | string;\n\nexport const PointPaymentIntentSchema = z.object({\n id: z.string(),\n device_id: z.string().optional(),\n amount: z.number().optional(),\n state: z.union([\n z.literal(\"OPEN\"),\n z.literal(\"PROCESSING\"),\n z.literal(\"FINISHED\"),\n z.literal(\"CANCELED\"),\n z.literal(\"ERROR\"),\n z.string(),\n ]).optional(),\n payment: z\n .object({\n id: z.union([z.string(), z.number()]).optional(),\n type: z.string().optional(),\n installments: z.number().optional(),\n installments_cost: z.string().optional(),\n print_on_terminal: z.boolean().optional(),\n })\n .passthrough()\n .optional(),\n additional_info: z.unknown().optional(),\n}).passthrough();\nexport type PointPaymentIntent = z.infer<typeof PointPaymentIntentSchema>;\n\nexport interface CreatePointPaymentIntentParams {\n /** Amount in centavos (yes, centavos — Point API differs from Payments API). */\n amount: number;\n /** Description shown on the device screen + the buyer's receipt. */\n description?: string;\n /** Your-system reference (echoed back in the resulting Payment). */\n externalReference?: string;\n /** Number of installments (default 1). */\n installments?: number;\n /** \"seller\" or \"buyer\" — who pays the installment cost. */\n installmentsCost?: \"seller\" | \"buyer\";\n /**\n * Print receipt on the terminal (default true). Some kiosks set false.\n */\n printOnTerminal?: boolean;\n /** Ticket number (your sequential receipt number). */\n ticketNumber?: string;\n}\n\n","/**\n * Mercado Pago OAuth flow — for marketplace integrations where YOUR app\n * cobra a través de cuentas MP de terceros (sellers in your platform).\n *\n * # The flow (3 legs)\n *\n * 1. **Authorize URL** — Redirect the seller to `buildAuthorizeUrl()`. They\n * log in to MP and approve your app. MP redirects them back to your\n * `redirect_uri` with `?code=AUTH_CODE&state=YOUR_STATE`.\n * 2. **Code exchange** — Your server POSTs to `/oauth/token` via\n * `exchangeCodeForToken()` with the code. Returns `{ access_token,\n * refresh_token, user_id, expires_in (~6h), ... }`. **Persist all of it.**\n * 3. **Token refresh** — Before `expires_in` runs out (or on 401), call\n * `refreshAccessToken()` with the saved `refresh_token` to get a fresh\n * access_token. The refresh_token does NOT expire and is the only way\n * to keep the integration alive long-term.\n *\n * # Per-seller MercadoPagoClient\n *\n * Once you have an OAuth `access_token` for a seller, instantiate a\n * `MercadoPagoClient({ accessToken })` AS THAT SELLER. All API calls then\n * happen on the seller's behalf — payments, refunds, subscriptions,\n * everything.\n *\n * # Marketplace fee\n *\n * To take a fee while collecting on the seller's behalf, pass\n * `marketplace`, `marketplaceFee`, `collectorId` to `createPreference()`\n * or `createOrder()`. See `MarketplaceParams` for details.\n *\n * # Setup\n *\n * 1. Register your application in MP's dev panel\n * (https://www.mercadopago.com.ar/developers/panel/applications) to get\n * `clientId` (= application id) and `clientSecret`.\n * 2. Configure the `redirect_uri` whitelist in the same panel — MP rejects\n * redirects to URIs not whitelisted.\n * 3. Pick a `marketplace` identifier (used in fee routing).\n */\n\nimport { OAuthTokenSchema, type OAuthToken } from \"./types\";\n\nconst DEFAULT_AUTHORIZE_URL = \"https://auth.mercadopago.com.ar/authorization\";\nconst DEFAULT_TOKEN_URL = \"https://api.mercadopago.com/oauth/token\";\n\n/**\n * Build the URL the seller visits to authorize your app. Redirect them here.\n * On approval, MP redirects them to `redirect_uri?code=...&state=...`.\n *\n * @param state Optional opaque value echoed back in the redirect — use this\n * to bind the OAuth round-trip to a specific user/session and\n * prevent CSRF. Always set it in production.\n */\nexport function buildAuthorizeUrl(params: {\n /** Your app's client ID (= application id from MP dev panel). */\n clientId: string;\n /** Where MP redirects after approval. Must be whitelisted in MP panel. */\n redirectUri: string;\n /** CSRF / session-binding token, echoed back. Strongly recommended. */\n state?: string;\n /**\n * Override the authorize endpoint base. Default points to AR; for other\n * sites use `https://auth.mercadopago.com.{br,mx,co,cl,uy}/authorization`.\n */\n authorizeUrl?: string;\n}): string {\n const url = new URL(params.authorizeUrl ?? DEFAULT_AUTHORIZE_URL);\n url.searchParams.set(\"client_id\", params.clientId);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"platform_id\", \"mp\");\n url.searchParams.set(\"redirect_uri\", params.redirectUri);\n if (params.state) url.searchParams.set(\"state\", params.state);\n return url.toString();\n}\n\n/**\n * Exchange the authorization code (from the OAuth redirect) for an\n * `OAuthToken`. POSTs to `/oauth/token` with `grant_type=authorization_code`.\n *\n * **Persist the entire response** — the `refresh_token` is the only way to\n * keep the integration alive long-term, and `user_id` identifies the seller.\n */\nexport async function exchangeCodeForToken(params: {\n clientId: string;\n clientSecret: string;\n /** The `code` query param from the OAuth redirect. */\n code: string;\n /** Must match the `redirect_uri` used in `buildAuthorizeUrl`. */\n redirectUri: string;\n /** Override the token endpoint (testing). */\n tokenUrl?: string;\n /** Custom fetch (testing). */\n fetchImpl?: typeof fetch;\n}): Promise<OAuthToken> {\n const url = params.tokenUrl ?? DEFAULT_TOKEN_URL;\n const fetchFn = params.fetchImpl ?? globalThis.fetch;\n const res = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: params.clientId,\n client_secret: params.clientSecret,\n code: params.code,\n redirect_uri: params.redirectUri,\n }).toString(),\n });\n return parseTokenResponse(res);\n}\n\n/**\n * Refresh an access_token using the saved refresh_token. Call this\n * proactively before `expires_in` runs out, or reactively on a 401 from a\n * per-seller MercadoPagoClient.\n *\n * The new response includes a fresh `refresh_token` — **always persist it,\n * replacing the old one**, even though MP often returns the same value.\n */\nexport async function refreshAccessToken(params: {\n clientId: string;\n clientSecret: string;\n refreshToken: string;\n tokenUrl?: string;\n fetchImpl?: typeof fetch;\n}): Promise<OAuthToken> {\n const url = params.tokenUrl ?? DEFAULT_TOKEN_URL;\n const fetchFn = params.fetchImpl ?? globalThis.fetch;\n const res = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: params.clientId,\n client_secret: params.clientSecret,\n refresh_token: params.refreshToken,\n }).toString(),\n });\n return parseTokenResponse(res);\n}\n\nasync function parseTokenResponse(res: Response): Promise<OAuthToken> {\n const text = await res.text();\n if (!res.ok) {\n throw new Error(\n `MP OAuth ${res.status}: ${text.slice(0, 300)}`,\n );\n }\n const json = JSON.parse(text);\n return OAuthTokenSchema.parse(json);\n}\n\n/**\n * Compute when an access_token will expire, given the timestamp it was\n * issued and the `expires_in` value (in seconds).\n *\n * @returns A unix-ms timestamp.\n */\nexport function expirationTimeMs(\n issuedAtMs: number,\n expiresInSeconds: number | undefined,\n): number {\n return issuedAtMs + (expiresInSeconds ?? 21_600) * 1000;\n}\n\n/**\n * Check whether an access_token is close to expiring. Use this to decide\n * whether to proactively refresh BEFORE making an API call.\n *\n * @param skewSeconds Buffer to refresh early (default 5 min). MP tokens\n * typically last 6h; refreshing in the last 5 min avoids\n * races with API calls that take a few seconds.\n */\nexport function isExpiringSoon(\n expirationMs: number,\n skewSeconds = 300,\n): boolean {\n return Date.now() + skewSeconds * 1000 >= expirationMs;\n}\n","/**\n * Pure helpers — no I/O, deterministic, fast. Importable directly from the\n * package root or used via the agent tools (`compute_marketplace_fee`,\n * `explain_payment_status`).\n */\n\nimport type { Payment } from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Marketplace fee calculator\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface MarketplaceFeeRule {\n /** Fixed fee in ARS (added on top of percentage). */\n flatArs?: number;\n /** Percentage of the transaction amount (0-100). */\n percent?: number;\n /** Minimum fee floor in ARS. */\n minArs?: number;\n /** Maximum fee cap in ARS. */\n maxArs?: number;\n /** Round to nearest peso (default true). */\n round?: boolean;\n}\n\n/**\n * Compute the exact `marketplace_fee` (in ARS) to pass to `create_order` /\n * `create_payment_preference` for a given transaction amount and fee rule.\n *\n * @example\n * // 5% fee with $50 floor and $5000 cap\n * computeMarketplaceFee(10000, { percent: 5, minArs: 50, maxArs: 5000 })\n * // → 500\n *\n * computeMarketplaceFee(500, { percent: 5, minArs: 50 })\n * // → 50 (would be 25 by percent, floor lifts to 50)\n *\n * @example\n * // Flat $200 + 2%\n * computeMarketplaceFee(10000, { flatArs: 200, percent: 2 })\n * // → 400\n */\nexport function computeMarketplaceFee(\n amountArs: number,\n rule: MarketplaceFeeRule,\n): number {\n if (amountArs <= 0) return 0;\n const percentPart = (rule.percent ?? 0) > 0 ? amountArs * (rule.percent! / 100) : 0;\n const flatPart = rule.flatArs ?? 0;\n let fee = percentPart + flatPart;\n if (rule.minArs !== undefined) fee = Math.max(fee, rule.minArs);\n if (rule.maxArs !== undefined) fee = Math.min(fee, rule.maxArs);\n if (fee > amountArs) fee = amountArs; // can't charge more than the transaction\n if (rule.round !== false) fee = Math.round(fee);\n return fee;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Payment status explainer\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface PaymentStatusExplanation {\n /** Spanish summary of the current state — surface to user. */\n summary: string;\n /** What the agent should do next. Actionable guidance. */\n recommendedAction: string;\n /**\n * Whether this state is FINAL (no further changes) or transient\n * (can still flip with another webhook).\n */\n final: boolean;\n /** Whether the buyer paid successfully (approved). */\n paid: boolean;\n /**\n * Whether this is a recoverable rejection (user can retry with another\n * card / different installments) vs a hard rejection (stop trying).\n */\n retryable: boolean;\n}\n\nconst STATUS_DETAIL_MAP: Record<\n string,\n { summary: string; recommendedAction: string; retryable: boolean }\n> = {\n // Approved\n accredited: {\n summary: \"Pago aprobado y acreditado.\",\n recommendedAction: \"Confirmar al cliente y continuar con el flujo (envío, factura).\",\n retryable: false,\n },\n partially_refunded: {\n summary: \"Pago aprobado con reembolso parcial.\",\n recommendedAction: \"Mostrar el monto neto y el reembolso. Verificar inventario si corresponde.\",\n retryable: false,\n },\n\n // Pending\n pending_contingency: {\n summary: \"Pago en proceso por contingencia. MP está procesando — puede demorar minutos a horas.\",\n recommendedAction: \"No reintentar todavía. Esperar webhook de actualización (puede demorar 24h máx).\",\n retryable: false,\n },\n pending_review_manual: {\n summary: \"Pago en revisión manual por el equipo de seguridad de MP.\",\n recommendedAction: \"No reintentar. MP responderá con webhook en 24-72h. Avisar al cliente sobre la demora.\",\n retryable: false,\n },\n pending_waiting_payment: {\n summary: \"Esperando que el comprador complete el pago (típico de account_money / boleto / Rapipago).\",\n recommendedAction: \"Mostrar instrucciones de pago. MP avisará por webhook cuando se complete.\",\n retryable: false,\n },\n pending_waiting_transfer: {\n summary: \"Esperando confirmación de transferencia bancaria.\",\n recommendedAction: \"Esperar webhook. Sin acción del agente.\",\n retryable: false,\n },\n pending_challenge: {\n summary: \"El emisor de la tarjeta requirió autenticación 3DS. El comprador debe completar el desafío.\",\n recommendedAction: \"Redirigir al comprador a `payment.three_ds_info.external_resource_url` (usá analyze_payment_3ds para obtenerlo).\",\n retryable: false,\n },\n\n // Rejected — RETRYABLE (user can fix and try again)\n cc_rejected_bad_filled_card_number: {\n summary: \"El número de tarjeta es incorrecto.\",\n recommendedAction: \"Pedir al cliente que verifique el número. Reintentable.\",\n retryable: true,\n },\n cc_rejected_bad_filled_security_code: {\n summary: \"El CVV es incorrecto.\",\n recommendedAction: \"Pedir el CVV nuevamente. Reintentable.\",\n retryable: true,\n },\n cc_rejected_bad_filled_date: {\n summary: \"La fecha de vencimiento es incorrecta.\",\n recommendedAction: \"Pedir al cliente que verifique mes/año. Reintentable.\",\n retryable: true,\n },\n cc_rejected_bad_filled_other: {\n summary: \"Algún dato de la tarjeta es incorrecto.\",\n recommendedAction: \"Pedir al cliente que revise todos los datos. Reintentable.\",\n retryable: true,\n },\n cc_rejected_call_for_authorize: {\n summary: \"El emisor requiere que el cliente autorice el pago llamando al banco.\",\n recommendedAction: \"Mostrar el teléfono del banco emisor (usá list_issuers para obtenerlo). Reintentable después de la llamada.\",\n retryable: true,\n },\n cc_rejected_card_disabled: {\n summary: \"La tarjeta está inhabilitada por el banco emisor.\",\n recommendedAction: \"El cliente debe contactar a su banco. Probar con otra tarjeta. Reintentable con otra tarjeta.\",\n retryable: true,\n },\n cc_rejected_insufficient_amount: {\n summary: \"Saldo insuficiente en la tarjeta.\",\n recommendedAction: \"Sugerir tarjeta alternativa o monto menor. Reintentable.\",\n retryable: true,\n },\n cc_rejected_invalid_installments: {\n summary: \"El emisor no soporta esa cantidad de cuotas para esta tarjeta.\",\n recommendedAction: \"Llamar a calculate_installments para ver opciones válidas y sugerir otra. Reintentable.\",\n retryable: true,\n },\n cc_rejected_other_reason: {\n summary: \"Pago rechazado por razón no especificada del emisor.\",\n recommendedAction: \"Sugerir otra tarjeta o método de pago. Reintentable con otra tarjeta.\",\n retryable: true,\n },\n\n // Rejected — NON-RETRYABLE (don't retry the same card)\n cc_rejected_blacklist: {\n summary: \"Pago rechazado por blacklist de seguridad de MP. NO REINTENTAR con esta tarjeta.\",\n recommendedAction: \"Sugerir un método de pago alternativo (account_money, otra tarjeta de otro titular).\",\n retryable: false,\n },\n cc_rejected_high_risk: {\n summary: \"Rechazo por análisis de riesgo de MP. La tarjeta es válida pero MP detectó fraude potencial.\",\n recommendedAction: \"Sugerir otro medio de pago o pedirle al cliente que verifique su identidad en MP.\",\n retryable: false,\n },\n cc_rejected_max_attempts: {\n summary: \"Excedió el número máximo de intentos con esta tarjeta.\",\n recommendedAction: \"Pedir al cliente que use otra tarjeta. NO REINTENTAR la misma.\",\n retryable: false,\n },\n cc_rejected_duplicated_payment: {\n summary: \"Ya se procesó un pago idéntico en los últimos minutos (deduplicación de MP).\",\n recommendedAction: \"Verificar con search_payments si el pago anterior se acreditó. Sin acción adicional necesaria.\",\n retryable: false,\n },\n\n // Cancelled / refunded / mediation\n by_collector: {\n summary: \"El vendedor canceló el pago.\",\n recommendedAction: \"Sin acción. Estado final.\",\n retryable: false,\n },\n by_payer: {\n summary: \"El comprador canceló el pago.\",\n recommendedAction: \"Sin acción. Estado final.\",\n retryable: false,\n },\n refunded: {\n summary: \"Pago reembolsado al comprador.\",\n recommendedAction: \"Estado final. Reflejar el reembolso en tu sistema.\",\n retryable: false,\n },\n charged_back: {\n summary: \"Contracargo (chargeback) iniciado por el banco emisor.\",\n recommendedAction: \"Revisar list_payment_disputes para responder. Surface al equipo de ops.\",\n retryable: false,\n },\n};\n\n/**\n * Human-readable explanation of a Payment's current state — derives summary,\n * recommended action, finality, and whether the rejection is retryable from\n * `payment.status` + `payment.status_detail`.\n *\n * Pure function. Use the output to drive agent decisions (\"¿reintento?\n * ¿le digo al cliente que cambie de tarjeta?\") without having to memorize\n * every MP status_detail code.\n */\nexport function explainPaymentStatus(payment: Payment): PaymentStatusExplanation {\n const status = payment.status as string;\n const statusDetail = (payment.status_detail as string | null) ?? \"\";\n\n const detail = STATUS_DETAIL_MAP[statusDetail];\n if (detail) {\n const isFinal =\n status === \"approved\" ||\n status === \"rejected\" ||\n status === \"cancelled\" ||\n status === \"refunded\" ||\n status === \"charged_back\";\n return {\n summary: detail.summary,\n recommendedAction: detail.recommendedAction,\n final: isFinal,\n paid: status === \"approved\",\n retryable: detail.retryable,\n };\n }\n\n // Fallbacks by top-level status\n switch (status) {\n case \"approved\":\n return {\n summary: \"Pago aprobado.\",\n recommendedAction: \"Continuar con el flujo posterior (envío, factura, notificación).\",\n final: true,\n paid: true,\n retryable: false,\n };\n case \"authorized\":\n return {\n summary: \"Pago autorizado pero no capturado (auth-only).\",\n recommendedAction: \"Llamar a capture_payment cuando completés el servicio. Vence en 7 días si no capturás.\",\n final: false,\n paid: false,\n retryable: false,\n };\n case \"in_process\":\n return {\n summary: \"Pago en proceso.\",\n recommendedAction: \"Esperar webhook. Sin acción inmediata.\",\n final: false,\n paid: false,\n retryable: false,\n };\n case \"in_mediation\":\n return {\n summary: \"Pago en mediación con MP por disputa del comprador.\",\n recommendedAction: \"Revisar list_payment_disputes y responder via dashboard.\",\n final: false,\n paid: false,\n retryable: false,\n };\n case \"pending\":\n return {\n summary: \"Pago pendiente. El comprador no completó el pago todavía o MP está procesando.\",\n recommendedAction: \"Esperar webhook (puede demorar minutos a 72h según el método).\",\n final: false,\n paid: false,\n retryable: false,\n };\n case \"rejected\":\n return {\n summary: `Pago rechazado (status_detail: ${statusDetail || \"no especificado\"}).`,\n recommendedAction: \"Verificar status_detail. Considerar otro método de pago.\",\n final: true,\n paid: false,\n retryable: true,\n };\n case \"cancelled\":\n return {\n summary: \"Pago cancelado.\",\n recommendedAction: \"Estado final. Sin acción.\",\n final: true,\n paid: false,\n retryable: false,\n };\n case \"refunded\":\n return {\n summary: \"Pago reembolsado.\",\n recommendedAction: \"Estado final. Reflejar el reembolso.\",\n final: true,\n paid: false,\n retryable: false,\n };\n case \"charged_back\":\n return {\n summary: \"Pago con contracargo del banco.\",\n recommendedAction: \"Surfacear a ops. Revisar disputas.\",\n final: true,\n paid: false,\n retryable: false,\n };\n default:\n return {\n summary: `Status no reconocido: '${status}'.`,\n recommendedAction: \"Inspeccionar payment.status + payment.status_detail manualmente.\",\n final: false,\n paid: false,\n retryable: false,\n };\n }\n}\n","/**\n * MP sandbox test cards for AR (MLA) — the official numbers MP publishes for\n * its TEST environment. Use these in unit tests + integration tests to\n * exercise the create_payment / charge_saved_card flows without touching a\n * real card.\n *\n * # When this matters\n *\n * Most non-trivial dev flows hit the issue of \"I want to test approved /\n * rejected / pending paths\" but MP's docs scatter the test card numbers\n * across multiple pages. This module collects them so you can `import { TEST_CARDS_AR }`\n * and pick the scenario you need.\n *\n * # Source\n *\n * AR (MLA) test cards published at\n * https://www.mercadopago.com.ar/developers/es/docs/checkout-api/additional-content/test-cards\n *\n * Last sync: 2026-05.\n */\n\n/**\n * The full data needed to test a payment:\n * - `number` — 16 digits\n * - `cvv` — 3 digits\n * - `exp` — MM/YY (use any future date in TEST mode)\n * - `paymentMethodId` — what to pass as `payment_method_id` to create_payment\n * - `holderName` — special string that triggers the desired status\n * (e.g. \"APRO\" → approved, \"OTHE\" → rejected with bad CVV)\n */\nexport interface TestCard {\n brand: string;\n number: string;\n cvv: string;\n exp: string;\n paymentMethodId: string;\n /**\n * Holder-name \"magic strings\" — MP routes the payment to a specific\n * status_detail based on this:\n * - `APRO` → status: approved\n * - `OTHE` → rejected (status_detail: cc_rejected_other_reason)\n * - `CONT` → pending (status_detail: pending_contingency)\n * - `CALL` → rejected (status_detail: cc_rejected_call_for_authorize)\n * - `FUND` → rejected (status_detail: cc_rejected_insufficient_amount)\n * - `SECU` → rejected (status_detail: cc_rejected_bad_filled_security_code)\n * - `EXPI` → rejected (status_detail: cc_rejected_bad_filled_date)\n * - `FORM` → rejected (status_detail: cc_rejected_bad_filled_other)\n */\n holderNameToTest: Record<string, string>;\n}\n\n/**\n * The MP-published test cards for AR. Pass `holderName: \"APRO\"` for an\n * approved payment, `\"OTHE\"` for a rejected one, etc.\n */\nexport const TEST_CARDS_AR: Record<string, TestCard> = {\n VISA_CREDIT: {\n brand: \"Visa (crédito)\",\n number: \"4509 9535 6623 3704\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"visa\",\n holderNameToTest: {\n APRO: \"approved\",\n OTHE: \"cc_rejected_other_reason\",\n CONT: \"pending_contingency\",\n CALL: \"cc_rejected_call_for_authorize\",\n FUND: \"cc_rejected_insufficient_amount\",\n SECU: \"cc_rejected_bad_filled_security_code\",\n EXPI: \"cc_rejected_bad_filled_date\",\n FORM: \"cc_rejected_bad_filled_other\",\n },\n },\n MASTERCARD_CREDIT: {\n brand: \"Mastercard (crédito)\",\n number: \"5031 7557 3453 0604\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"master\",\n holderNameToTest: {\n APRO: \"approved\",\n OTHE: \"cc_rejected_other_reason\",\n CONT: \"pending_contingency\",\n CALL: \"cc_rejected_call_for_authorize\",\n FUND: \"cc_rejected_insufficient_amount\",\n },\n },\n AMEX_CREDIT: {\n brand: \"American Express (crédito)\",\n number: \"3711 803032 57522\".replace(/\\s/g, \"\"),\n cvv: \"1234\",\n exp: \"11/30\",\n paymentMethodId: \"amex\",\n holderNameToTest: { APRO: \"approved\", OTHE: \"cc_rejected_other_reason\" },\n },\n VISA_DEBIT: {\n brand: \"Visa (débito)\",\n number: \"4002 7686 9439 5619\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"debvisa\",\n holderNameToTest: { APRO: \"approved\", OTHE: \"cc_rejected_other_reason\" },\n },\n MASTERCARD_DEBIT: {\n brand: \"Mastercard (débito)\",\n number: \"5287 3383 0125 4634\".replace(/\\s/g, \"\"),\n cvv: \"123\",\n exp: \"11/30\",\n paymentMethodId: \"debmaster\",\n holderNameToTest: { APRO: \"approved\", OTHE: \"cc_rejected_other_reason\" },\n },\n};\n\n/**\n * Pre-built payer objects that MP recognizes as test buyers. Pair with\n * an APRO test card → status: approved.\n *\n * **Use a NEW email per call** if you don't want MP's idempotency-on-email\n * to dedupe — append a timestamp.\n */\nexport const TEST_PAYERS_AR = {\n approvedBuyer: () => ({\n email: `test_user_${Date.now()}@testuser.com`,\n identification: { type: \"DNI\", number: \"12345678\" },\n }),\n} as const;\n\n/**\n * Resolve a `(card, scenario)` pair to a ready-to-use `CreatePaymentParams`-like\n * object. Reduces boilerplate in test files.\n *\n * @example\n * ```ts\n * const card = buildTestCardScenario(\"VISA_CREDIT\", \"APRO\", 1500);\n * await client.createPayment({ ...card, externalReference: \"test-1\" });\n * ```\n */\nexport function buildTestCardScenario(\n cardKey: keyof typeof TEST_CARDS_AR,\n scenario: string,\n amountArs: number,\n): {\n transactionAmount: number;\n paymentMethodId: string;\n payerEmail: string;\n description: string;\n installments: number;\n /**\n * Magic holder name — pass to MP frontend's CardForm `cardholderName`\n * field. (For server-side create_payment, pass via additional_info.)\n */\n holderName: string;\n} {\n const card = TEST_CARDS_AR[cardKey];\n if (!card) throw new Error(`Unknown test card: ${cardKey}`);\n if (!card.holderNameToTest[scenario]) {\n throw new Error(\n `Card ${cardKey} doesn't define scenario ${scenario}. Available: ${Object.keys(card.holderNameToTest).join(\", \")}`,\n );\n }\n return {\n transactionAmount: amountArs,\n paymentMethodId: card.paymentMethodId,\n payerEmail: TEST_PAYERS_AR.approvedBuyer().email,\n description: `TEST ${scenario} via ${cardKey}`,\n installments: 1,\n holderName: scenario,\n };\n}\n","/**\n * 3DS (Strong Customer Authentication) analyzer for Mercado Pago Payments.\n *\n * # Background\n *\n * 3DS (3-D Secure / \"verified by Visa\", \"Mastercard SecureCode\") is the\n * issuer-side 2FA layer for card payments. MP triggers it automatically when:\n * - The card's issuer requires it (driven by MCC + amount + risk).\n * - The buyer's country mandates it (MX, BR, several EU countries).\n *\n * In Argentina (MLA), 3DS is OPTIONAL but strongly recommended for\n * high-value transactions and is required for some FCE MiPyMEs flows.\n *\n * # What this module does\n *\n * Given a `Payment` returned by `getPayment()` or `createPayment()`, derive\n * a normalized `ThreeDSInfo` telling you:\n * - Whether 3DS was triggered at all\n * - Whether it was frictionless (no buyer interaction) or required a challenge\n * - The challenge URL (if any) you must redirect the buyer to\n * - A human-readable description suitable for surfacing to the user\n *\n * # When to use\n *\n * Call `analyze3DS(payment)` after EVERY `createPayment()` for credit cards.\n * If `info.challengeUrl !== null`, you MUST redirect the buyer there before\n * the payment can complete — otherwise it stays in `pending` forever.\n */\n\nimport type { Payment } from \"./types\";\nimport type { ThreeDSInfo, ThreeDSStatus } from \"./types\";\n\n/**\n * Analyze a Payment's 3DS state. Pure function, no I/O.\n */\nexport function analyze3DS(payment: Payment): ThreeDSInfo {\n const raw = payment as unknown as Record<string, unknown>;\n const mode = (raw.three_d_secure_mode as string | undefined) ?? null;\n const statusDetail = (payment.status_detail as string | null) ?? null;\n\n // No 3DS field at all → not triggered for this payment.\n if (!mode || mode === \"not_supported\" || mode === \"off\") {\n return {\n status: \"not_required\",\n mode,\n challengeUrl: null,\n description:\n \"3DS no fue requerido para este pago (riesgo bajo o emisor sin 3DS habilitado).\",\n };\n }\n\n // MP exposes the challenge URL inside `three_ds_info.external_resource_url`\n // when one is required.\n const threeDsInfo = (raw.three_ds_info as\n | { external_resource_url?: string; status?: string; creq?: string }\n | undefined) ?? undefined;\n\n if (statusDetail === \"pending_challenge\" && threeDsInfo?.external_resource_url) {\n return {\n status: \"challenge_required\",\n mode,\n challengeUrl: threeDsInfo.external_resource_url,\n description:\n \"El emisor de la tarjeta requirió autenticación 3DS. Redirigí al comprador a challengeUrl para completar el desafío. El pago queda pending hasta que lo haga.\",\n };\n }\n\n // Approved + 3DS field present → frictionless flow (issuer authorized\n // without challenging the buyer).\n if (payment.status === \"approved\") {\n return {\n status: \"frictionless\",\n mode,\n challengeUrl: null,\n description: \"3DS frictionless: el emisor autorizó sin desafiar al comprador.\",\n };\n }\n\n // Rejected with 3DS-related status_detail.\n if (\n payment.status === \"rejected\" &&\n typeof statusDetail === \"string\" &&\n statusDetail.includes(\"3ds\")\n ) {\n return {\n status: \"rejected\",\n mode,\n challengeUrl: null,\n description: `Autenticación 3DS rechazada (${statusDetail}). El comprador debe usar otra tarjeta o validarla con el emisor.`,\n };\n }\n\n return {\n status: \"unknown\" as ThreeDSStatus,\n mode,\n challengeUrl: threeDsInfo?.external_resource_url ?? null,\n description:\n \"No se pudo determinar el estado 3DS — revisar payment.three_d_secure_mode + payment.status_detail manualmente.\",\n };\n}\n","/**\n * Webhook helpers — parse incoming MP notifications and verify the\n * HMAC-SHA256 signature MP sends in the `x-signature` header.\n *\n * # Edge Runtime\n *\n * Both `verifyWebhookSignature` and `parseWebhookEvent` work in Vercel\n * Edge Runtime, Cloudflare Workers, Deno, browsers, and Node 18+. The\n * HMAC verification uses Web Crypto under the hood (see `./crypto.ts`)\n * and is **async** — make sure to `await` the call.\n */\n\nimport { hmacSha256Hex, timingSafeEqualHex } from \"./crypto\";\nimport { WebhookBodySchema, type ParsedWebhookEvent } from \"./types\";\n\n/**\n * Parse a Mercado Pago webhook from the raw request body and URL search params.\n * MP sends the topic and resource id in EITHER the URL query string OR the\n * body, depending on integration version — this normalizes both shapes into a\n * single structure.\n *\n * **Pure function — synchronous, no I/O.**\n *\n * @example\n * ```ts\n * export async function POST(req: Request) {\n * const body = await req.json().catch(() => ({}));\n * const event = parseWebhookEvent(body, new URL(req.url).searchParams);\n * if (event && event.topic === 'preapproval') {\n * // refresh status from MP, update your store\n * }\n * return Response.json({ received: true });\n * }\n * ```\n */\nexport function parseWebhookEvent(\n body: unknown,\n searchParams?: URLSearchParams,\n): ParsedWebhookEvent | null {\n const parseResult = WebhookBodySchema.safeParse(body ?? {});\n const parsedBody = parseResult.success ? parseResult.data : {};\n\n const topic =\n searchParams?.get(\"topic\") ??\n parsedBody.topic ??\n parsedBody.type ??\n null;\n\n const dataId =\n searchParams?.get(\"id\") ??\n (parsedBody.data?.id !== undefined ? String(parsedBody.data.id) : null) ??\n parsedBody.resource ??\n null;\n\n if (!topic || !dataId) {\n return null;\n }\n\n return {\n topic,\n dataId: String(dataId),\n action: parsedBody.action ?? null,\n raw: parsedBody,\n };\n}\n\n/**\n * Maximum age (in seconds) of a webhook before it's considered stale and\n * potentially a replay attack. Default: 5 minutes.\n *\n * MP webhooks include a `ts` (unix seconds) in the `x-signature` header.\n * If the difference between `ts` and current time exceeds this tolerance,\n * `verifyWebhookSignature` returns `false`. Set higher only if your network\n * has known clock skew or proxy delays.\n */\nexport const DEFAULT_REPLAY_TOLERANCE_SECONDS = 300;\n\n/**\n * Verify the HMAC-SHA256 signature MP sends in the `x-signature` header for\n * webhook authenticity. Returns true if the signature matches the expected\n * value derived from the integration's secret key AND the timestamp is\n * within the replay-tolerance window.\n *\n * **Async** — runs on Web Crypto under the hood, works in Edge Runtime.\n *\n * @param requestId The value of the `x-request-id` request header.\n * @param dataId The id of the resource the webhook is about (from query or body).\n * @param signatureHeader The full `x-signature` header value MP sent.\n * @param secret Your integration's webhook secret (configured in MP dev panel).\n * @param replayToleranceSeconds Optional override. Default 300s (5 min).\n *\n * @remarks\n * MP's `x-signature` header has the form: `ts=NNNNNNNN,v1=HEXSIGNATURE`. We\n * extract the timestamp and the v1 signature, then compute\n * `HMAC-SHA256(secret, \"id:${dataId};request-id:${requestId};ts:${ts};\")`\n * and compare with constant-time equality.\n *\n * **Replay protection**: rejects signatures whose `ts` is older than\n * `replayToleranceSeconds` (default 5min) — prevents an attacker who\n * captured a valid webhook from replaying it later.\n */\nexport async function verifyWebhookSignature(params: {\n requestId: string | null;\n dataId: string;\n signatureHeader: string | null;\n secret: string;\n replayToleranceSeconds?: number;\n}): Promise<boolean> {\n if (!params.signatureHeader || !params.requestId) return false;\n\n // Parse \"ts=...,v1=...\" into a map.\n const parts = Object.fromEntries(\n params.signatureHeader\n .split(\",\")\n .map((segment) => segment.trim().split(\"=\") as [string, string]),\n );\n const ts = parts.ts;\n const v1 = parts.v1;\n if (!ts || !v1) return false;\n\n // Replay protection: reject signatures older than the tolerance window.\n const tolerance = params.replayToleranceSeconds ?? DEFAULT_REPLAY_TOLERANCE_SECONDS;\n const tsNumber = Number(ts);\n if (!Number.isFinite(tsNumber)) return false;\n const ageSeconds = Math.abs(Math.floor(Date.now() / 1000) - tsNumber);\n if (ageSeconds > tolerance) return false;\n\n const manifest = `id:${params.dataId};request-id:${params.requestId};ts:${ts};`;\n const expected = await hmacSha256Hex(params.secret, manifest);\n\n return timingSafeEqualHex(expected, v1);\n}\n","import { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport type { MercadoPagoClient } from \"./client\";\nimport { sha256Hex } from \"./crypto\";\nimport {\n buildAuthorizeUrl,\n exchangeCodeForToken,\n refreshAccessToken,\n} from \"./oauth\";\nimport { computeMarketplaceFee, explainPaymentStatus } from \"./helpers\";\nimport type { SubscriptionStateAdapter } from \"./state\";\nimport { TEST_CARDS_AR } from \"./test-cards\";\nimport { analyze3DS } from \"./three-ds\";\nimport { parseWebhookEvent, verifyWebhookSignature } from \"./webhook\";\n\n/**\n * Deterministic idempotency key from caller-meaningful fields. Safe to retry:\n * the SAME inputs always produce the same key, so MP dedupes on its side\n * even if the client retries multiple times. Use a hash to keep keys short\n * + opaque (callers can't accidentally extract sensitive data from the key).\n *\n * **Async** — uses Web Crypto so it works in Edge Runtime.\n */\nasync function deterministicIdempotencyKey(\n ...parts: Array<string | number | undefined>\n): Promise<string> {\n const payload = parts\n .filter((p) => p !== undefined && p !== null)\n .map(String)\n .join(\"|\");\n return (await sha256Hex(payload)).slice(0, 32);\n}\n\nexport interface MercadoPagoToolsOptions {\n /** State adapter for persisting subscription records. */\n state: SubscriptionStateAdapter;\n /**\n * Default back_url used when callers don't supply one. MUST be HTTPS — MP\n * rejects http:// and localhost back URLs even in sandbox.\n */\n backUrl: string;\n /**\n * Optionally override the agent-facing tool descriptions. Pass an object\n * with keys matching tool names; values replace the default description.\n * Useful for localizing the agent's tool reasoning.\n */\n descriptions?: Partial<Record<ToolName, string>>;\n /**\n * Default notification webhook URL used when callers don't supply one.\n * Optional — MP falls back to dashboard config if not set.\n */\n notificationUrl?: string;\n /**\n * Webhook secret for the `handle_webhook` tool. Required to verify\n * incoming webhook HMAC-SHA256 signatures. Get it from MP dev panel →\n * \"Notificaciones\" → \"Webhooks\" → \"Configurar notificaciones\".\n * If omitted, `handle_webhook` returns `{ verified: false, error: ... }`\n * and the agent should reject the webhook.\n */\n webhookSecret?: string;\n /**\n * OAuth credentials for the marketplace flow. Required for\n * `oauth_exchange_code` and `oauth_refresh_token` (the secret cannot be\n * passed by the agent — it's a server-side secret). If omitted, those\n * tools return `{ available: false }` with setup instructions.\n */\n oauth?: {\n clientId: string;\n clientSecret: string;\n };\n}\n\ntype ToolName =\n // Subscriptions (v0.1)\n | \"create_subscription\"\n | \"get_subscription_status\"\n | \"cancel_subscription\"\n | \"pause_subscription\"\n | \"resume_subscription\"\n // Payments (v0.2)\n | \"create_payment\"\n | \"get_payment\"\n | \"search_payments\"\n | \"cancel_payment\"\n | \"capture_payment\"\n // Refunds (v0.2)\n | \"refund_payment\"\n | \"list_refunds\"\n // Checkout Pro (v0.2)\n | \"create_payment_preference\"\n | \"get_payment_preference\"\n // Customers + Cards (v0.2)\n | \"create_customer\"\n | \"find_customer_by_email\"\n | \"list_customer_cards\"\n | \"delete_customer_card\"\n // Payment Methods + Installments (v0.2)\n | \"list_payment_methods\"\n | \"calculate_installments\"\n // Account (v0.2)\n | \"get_account_info\"\n // Saved-card charging (v0.3)\n | \"charge_saved_card\"\n // QR in-store (v0.3)\n | \"create_qr_payment\"\n | \"cancel_qr_payment\"\n // Subscription Plans (v0.4)\n | \"create_subscription_plan\"\n | \"list_subscription_plans\"\n | \"update_subscription_plan\"\n | \"subscribe_to_plan\"\n | \"list_subscription_payments\"\n // Stores + POS (v0.4)\n | \"create_store\"\n | \"list_stores\"\n | \"create_pos\"\n | \"list_pos\"\n // Disputes (v0.4)\n | \"list_payment_disputes\"\n | \"get_dispute\"\n // Lookup helpers (v0.4)\n | \"list_identification_types\"\n | \"list_issuers\"\n // Webhooks (v0.4)\n | \"list_webhooks\"\n | \"create_webhook\"\n | \"update_webhook\"\n | \"delete_webhook\"\n // Webhook handler combo (v0.5)\n | \"handle_webhook\"\n // OAuth Marketplace (v0.5)\n | \"oauth_authorize_url\"\n | \"oauth_exchange_code\"\n | \"oauth_refresh_token\"\n // Order Management API (v0.5)\n | \"create_order\"\n | \"get_order\"\n | \"update_order\"\n | \"capture_order\"\n | \"cancel_order\"\n // v0.6 — Account / Balance / Movements / Settlements\n | \"get_account_balance\"\n | \"list_account_movements\"\n | \"list_settlements\"\n | \"get_settlement\"\n // v0.6 — 3DS analyzer (pure)\n | \"analyze_payment_3ds\"\n // v0.6 — Test cards (pure)\n | \"get_test_cards\"\n // v0.7 — Customer + Card extensions\n | \"get_customer\"\n | \"update_customer\"\n | \"create_customer_card\"\n | \"get_customer_card\"\n // v0.7 — Subscription / Plan / Refund / Preference extensions\n | \"get_subscription_plan\"\n | \"update_subscription\"\n | \"search_subscriptions\"\n | \"get_refund\"\n | \"update_payment_preference\"\n // v0.7 — Merchant Orders\n | \"get_merchant_order\"\n | \"search_merchant_orders\"\n | \"update_merchant_order\"\n // v0.7 — Stores + POS CRUD completion\n | \"get_store\"\n | \"update_store\"\n | \"delete_store\"\n | \"get_pos\"\n | \"update_pos\"\n | \"delete_pos\"\n // v0.7 — Bank Accounts\n | \"list_bank_accounts\"\n | \"register_bank_account\"\n // v0.7 — Point Devices físicos\n | \"list_point_devices\"\n | \"update_point_device_mode\"\n | \"create_point_payment_intent\"\n | \"get_point_payment_intent\"\n | \"cancel_point_payment_intent\"\n // v0.7 — Pure helpers\n | \"compute_marketplace_fee\"\n | \"explain_payment_status\";\n\nconst DEFAULT_DESCRIPTIONS: Record<ToolName, string> = {\n // ── Subscriptions ────────────────────────────────────────────────────────\n create_subscription:\n \"Create a Mercado Pago recurring subscription. Returns an init_point URL where the customer must complete the FIRST payment with their card and CVV (this is a hard MP requirement; agents cannot bypass it). After they pay, MP will auto-charge at the configured frequency without further intervention.\",\n get_subscription_status:\n \"Check the current status of a Mercado Pago subscription. Use this to confirm the customer completed the first payment (status becomes 'authorized') or to inspect the next charge date.\",\n cancel_subscription:\n \"Cancel an active Mercado Pago subscription. After cancellation, MP will not charge the customer again. This action is irreversible — confirm with the user before calling.\",\n pause_subscription:\n \"Pause an authorized Mercado Pago subscription. Charges stop until resumed. Only works on subscriptions in 'authorized' status.\",\n resume_subscription:\n \"Resume a paused Mercado Pago subscription. Charges resume on the next scheduled date. Only works on subscriptions in 'paused' status.\",\n\n // ── Payments ─────────────────────────────────────────────────────────────\n create_payment:\n \"Create a one-time payment. Two flows: (a) with a card token from MP frontend Cardform — for transparent checkout; (b) without token, for non-card methods like 'account_money', 'rapipago', 'pagofacil'. For most agent flows where you only have a payer email and want to send them a payment link, use create_payment_preference instead (Checkout Pro hosted form). Returns the Payment object with status — typically 'approved' for account_money and 'pending' for tickets.\",\n get_payment:\n \"Fetch a single payment by ID. Use to confirm status after webhook arrives, or to inspect details (status_detail explains rejections).\",\n search_payments:\n \"Search payments with filters. Most common: by external_reference (your-system identifier) to find all payments for an order, or by status='approved' to list successful charges in a date range. Returns paginated results.\",\n cancel_payment:\n \"Cancel a pending or in_process payment (only works before approval). Once approved, use refund_payment instead. Common use: cancel an unpaid ticket payment that's still pending.\",\n capture_payment:\n \"Capture an authorized credit-card payment that was created with capture=false. Use for hold-then-capture flows (e.g., authorize on order, capture on shipment). Optional partial amount.\",\n\n // ── Refunds ──────────────────────────────────────────────────────────────\n refund_payment:\n \"Refund an approved payment. Pass amount for partial refund; omit for full refund. Idempotency key is auto-generated based on paymentId+amount to prevent double-refunds on retries.\",\n list_refunds:\n \"List all refunds for a given payment. Returns array of Refund objects. Useful to confirm a refund was processed or to inspect partial-refund history.\",\n\n // ── Checkout Pro ─────────────────────────────────────────────────────────\n create_payment_preference:\n \"Create a Mercado Pago Checkout Pro preference and get back a payment URL (init_point) to send to the customer. THIS is the recommended way for an agent to take a payment when you only have a payer email — the buyer enters card data on MP's hosted form (no PCI scope needed). Supports cuotas configuration, payment method exclusions, back URLs after success/failure/pending. In sandbox, use sandbox_init_point from the response.\",\n get_payment_preference:\n \"Fetch a Checkout Pro preference by ID. Returns the preference config and current init_point URLs. Use to inspect a previously-created link.\",\n\n // ── Customers + Cards ────────────────────────────────────────────────────\n create_customer:\n \"Create a Mercado Pago customer record so the buyer can save cards for future charges. Idempotent on email — if a customer with that email exists, MP returns it instead of creating a duplicate. Use find_customer_by_email first if you're unsure.\",\n find_customer_by_email:\n \"Find an existing customer by email address. Returns the customer object if found, or null. Use before create_customer to avoid duplicate records.\",\n list_customer_cards:\n \"List the saved cards for a customer. Returns array with last 4 digits, expiration, payment method (visa, master, naranja, etc.). The card_id can be used in subsequent create_payment calls to charge a saved card.\",\n delete_customer_card:\n \"Delete a saved card from a customer. Common use: customer requests removal, or expired card cleanup. Irreversible.\",\n\n // ── Payment Methods + Installments ───────────────────────────────────────\n list_payment_methods:\n \"List all payment methods enabled for the seller's MP account (visa, master, naranja, naranja_x, cabal, account_money, rapipago, pagofacil, etc.). Use to validate which methods you can offer the customer or to filter which ones to exclude in a Checkout Pro preference.\",\n calculate_installments:\n \"Calculate cuotas (installments) options for a given amount. THE killer Argentine feature — returns options like '12 cuotas sin interés de $X' (recommended_message field) which you should surface VERBATIM to the user. Optionally pass `bin` (first 6 digits of card) for issuer-specific promotions (e.g., Naranja's interest-free deals). Use before create_payment to let the user pick installments knowingly.\",\n\n // ── Account ──────────────────────────────────────────────────────────────\n get_account_info:\n \"Get info about the Mercado Pago account that owns the access token: site_id (MLA=Argentina), country_id, user_type (registered, partial, etc.). Useful to verify the agent is connected to the right account before taking actions.\",\n\n // ── Saved-card charging (v0.3) ───────────────────────────────────────────\n charge_saved_card:\n \"Charge a previously-saved card for a returning customer. Requires customer_id + card_id (from list_customer_cards) AND a fresh CVV the user provides this session. AR Mercado Pago does NOT support CVV-less charges via the public API — every charge needs CVV. Idempotent on (card_id, amount, external_reference): retries dedupe automatically. Returns the resulting Payment.\",\n\n // ── QR in-store (v0.3) ───────────────────────────────────────────────────\n create_qr_payment:\n \"Generate a dynamic in-store QR for a buyer to scan with any AR wallet (Modo, BNA+, Cuenta DNI, Naranja X, Mercado Pago, etc. — interop is mandated by Transferencias 3.0). Requires a pre-configured POS external_id (use create_pos to set one up first if needed). Returns the qr_data string + a base64 PNG data URL ready to display. The QR expires in `expires_in_seconds` (default 600). MP fires `point_integration_wh` then `payment` webhooks when scanned.\",\n cancel_qr_payment:\n \"Cancel a pending QR order on a POS. Necessary if the buyer never scans — otherwise the next create_qr_payment on the same POS returns 409.\",\n\n // ── Subscription Plans (v0.4) ────────────────────────────────────────────\n create_subscription_plan:\n \"Create a REUSABLE subscription plan (preapproval_plan). Different from create_subscription: a plan defines price + frequency once, then customers subscribe to it via subscribe_to_plan. Use plans for SaaS-style billing (Básico/Pro/Enterprise tiers). For per-customer custom amounts, use create_subscription directly.\",\n list_subscription_plans:\n \"List all subscription plans defined for this MP account. Useful before create_subscription_plan to check if one already exists, or for surfacing options to a customer.\",\n update_subscription_plan:\n \"Update a subscription plan's reason / amount / status / back_url. Existing customer subscriptions to the plan are NOT automatically updated — only NEW subscribers get the new pricing.\",\n subscribe_to_plan:\n \"Subscribe a customer to an existing reusable plan. Returns a Preapproval with init_point URL where the customer completes first payment. Cleaner than create_subscription when you have fixed tiers.\",\n list_subscription_payments:\n \"List the auto-charge attempts (authorized_payments) under a subscription. Useful for 'show me the cobros del último mes for this client' or to debug a failing recurring charge.\",\n\n // ── Stores + POS (v0.4) ──────────────────────────────────────────────────\n create_store:\n \"Create a store under the seller's MP account. Stores are the parent entity for POSes (which generate QR payments). Required ONE-TIME setup before create_pos. Pass a unique external_id and a display name.\",\n list_stores:\n \"List all stores configured for this MP account. Use this to find an existing store_id before create_pos, or to surface store options to the agent.\",\n create_pos:\n \"Create a POS (Point of Sale) under a store. The POS's external_id is what create_qr_payment uses. Each physical checkout / counter / agent typically has its own POS. Categories are MP-defined (default 621102 = Other Food and Beverage Services).\",\n list_pos:\n \"List all POSes for the seller (or filtered by store_id). Use to find an existing POS before create_qr_payment, or to surface options.\",\n\n // ── Disputes (v0.4 — read-only) ──────────────────────────────────────────\n list_payment_disputes:\n \"List all disputes / chargebacks raised against a payment. Read-only — resolution is dashboard-only. Surface the dashboard URL `https://www.mercadopago.com.ar/disputes/{dispute_id}` to the user when they need to respond.\",\n get_dispute:\n \"Get details of a specific dispute including reason, amount, resolution status. Read-only.\",\n\n // ── Lookup helpers (v0.4) ────────────────────────────────────────────────\n list_identification_types:\n \"List valid identification types for the seller's site. AR returns: DNI, CI, LE, LC, Otro, Pasaporte, CUIT, CUIL with their min/max length. Useful to validate an identification before passing to create_payment.\",\n list_issuers:\n \"List card issuers (banks) that support a payment_method_id. Optionally filter by `bin` (first 6 digits of the card) for accurate issuer detection. Useful with calculate_installments — issuer-specific promos (e.g., Naranja Galicia 6 cuotas sin interés) only appear when the issuer is identified.\",\n\n // ── Webhooks management (v0.4) ───────────────────────────────────────────\n list_webhooks:\n \"List all webhook subscriptions configured for this MP application. Use to see what topics + URLs are wired before adding new ones.\",\n create_webhook:\n \"Subscribe a webhook URL to a MP topic (payment, subscription_authorized_payment, subscription_preapproval, merchant_order, point_integration_wh). MP will POST to this URL when events of that topic fire.\",\n update_webhook:\n \"Update a webhook's URL or topic. Useful when you change deployment URLs without resubscribing from scratch.\",\n delete_webhook:\n \"Delete a webhook subscription. MP stops POSTing to it immediately.\",\n\n // ── Webhook handler combo (v0.5) ─────────────────────────────────────────\n handle_webhook:\n \"Process an incoming MP webhook in ONE call: verify the HMAC-SHA256 signature, parse the event, and (optionally) auto-fetch the underlying resource (Payment, Subscription, Order). Returns the structured event PLUS the full resource. USE THIS in your webhook endpoint INSTEAD of chaining verify_webhook_signature + parse_webhook_event + get_payment manually. Pass the raw request body, x-signature header, x-request-id header, and your MP webhook secret. SAFE: returns { verified: false } when signature mismatches — caller should respond 401 and stop processing. WHEN auto_fetch is true (default), the resource is fetched as the SAME MP user the client is configured for (so for marketplace integrations, instantiate a per-seller client).\",\n\n // ── OAuth Marketplace (v0.5) ─────────────────────────────────────────────\n oauth_authorize_url:\n \"Build the URL the SELLER (third-party MP account) visits to authorize your marketplace app. Pass the seller's redirect uri (must be whitelisted in MP dev panel) and an opaque state token (CSRF protection — bind it to the user's session). PURE FUNCTION: no network. The seller approves, MP redirects them to your `redirect_uri?code=...&state=...`. Then call oauth_exchange_code with the code.\",\n oauth_exchange_code:\n \"Exchange the authorization code (from the OAuth redirect) for an `OAuthToken`. Returns access_token, refresh_token, user_id, and expires_in. **PERSIST the entire response** — refresh_token is long-lived and the only way to keep the integration alive past 6h. Use the access_token to instantiate a per-seller MercadoPagoClient for marketplace flows.\",\n oauth_refresh_token:\n \"Refresh a per-seller access_token using the saved refresh_token. Call PROACTIVELY before expires_in elapses, or REACTIVELY on a 401 from a per-seller MercadoPagoClient. Returns a fresh OAuthToken — persist the new refresh_token (MP often returns the same value, but always replace).\",\n\n // ── Order Management API (v0.5 — modern Order API) ───────────────────────\n create_order:\n \"Create a new Order via MP's modern Order Management API. DIFFERENT from create_payment_preference: Order is a transactional entity with explicit lifecycle (created → processed → captured/canceled), supports MANUAL CAPTURE (auth-only, capture later — for ride-share, hotels, marketplaces) and aggregates multiple payments into one Order. Use Preference (Checkout Pro) for simple hosted pay-links; use Order when you need auth-only or multi-payment-per-order semantics. For marketplace splits, set marketplace + marketplace_fee + collector_id (the SELLER's MP user_id from oauth_exchange_code).\",\n get_order:\n \"Fetch an Order by ID. Returns the Order with its lifecycle status and any attached payments/refunds.\",\n update_order:\n \"Patch an existing Order before it's captured/canceled. Common use: update items or external_reference.\",\n capture_order:\n \"Capture a previously-authorized Order (only for orders created with capture_mode='manual'). Captures up to the originally-authorized amount; pass amount for partial capture. Common use: ride-share marks ride complete → capture; hotel checks-out guest → capture.\",\n cancel_order:\n \"Cancel an Order. Releases any auth-holds and marks the Order as canceled. For orders that have already been CAPTURED, use refund_payment instead — cancel only works pre-capture.\",\n\n // ── Account / Balance / Movements / Settlements (v0.6) ───────────────────\n get_account_balance:\n \"Get the seller's current MP wallet balance. Returns { available_balance, unavailable_balance, total_amount, currency_id }. The available balance is what the seller can withdraw or pay with right now; unavailable is in retention (typically 14-21 days for new sellers or risk-flagged transactions). For per-seller marketplace setups, instantiate the client AS THE SELLER first.\",\n list_account_movements:\n \"List wallet movements (incoming payments, transfers, refunds, holdings) for the active MP account. Filter by date range with `from`/`to` (ISO 8601). Useful for monthly conciliation or 'show me what came in this month' workflows.\",\n list_settlements:\n \"List settlements (release_money) — i.e. transfers from the MP wallet to the seller's registered bank account (CBU). USE WHEN the user asks 'cuándo me deposita MP' or for monthly bank-conciliation reports. Filter by date range and status.\",\n get_settlement:\n \"Get details of a single settlement: amount, date_scheduled, date_processed, bank_account info (CBU + bank name).\",\n\n // ── 3DS analyzer (v0.6 — pure) ───────────────────────────────────────────\n analyze_payment_3ds:\n \"Pure local analyzer for a Payment's 3DS (Strong Customer Authentication) state. Pass a payment_id (string) and the tool fetches the Payment then derives { status: 'not_required'|'frictionless'|'challenge_required'|'rejected'|'unknown', mode, challengeUrl, description }. USE THIS after every create_payment for credit cards: when challengeUrl !== null, you MUST redirect the buyer there before the payment can complete. Without 3DS, payments stay in 'pending' indefinitely if the issuer demanded a challenge.\",\n\n // ── Test cards (v0.6 — pure) ─────────────────────────────────────────────\n get_test_cards:\n \"Pure helper that returns the official MP test cards for AR (MLA): VISA/Mastercard/Amex credit + debit, with the 'magic' holder names that route the payment to specific status_detail values (APRO=approved, OTHE=rejected, CONT=pending, FUND=insufficient_amount, etc.). USE WHEN you need to demo a payment flow without a real card, or to script integration tests. Pure data — no network call.\",\n\n // ── Customer + Card extensions (v0.7) ────────────────────────────────────\n get_customer:\n \"Get a customer by id. Returns full Customer object: email, first_name, last_name, identification, address, default_card, registered cards. PURE READ. USE WHEN you have the customer_id from a previous create_customer / find_customer_by_email / payment.payer.id and want the full record.\",\n update_customer:\n \"Update a customer's profile (first_name, last_name, phone, identification, address, default_card). MP merges the patch — fields you don't send remain unchanged. Use to keep customer records in sync (e.g., shipping address changes) or to set a default card for charge_saved_card.\",\n create_customer_card:\n \"Add a saved card to an existing customer using a card_token (one-time token from MP frontend Cardform — agents should NEVER take raw card data, that's a PCI violation). Returns the saved CustomerCard with id usable in charge_saved_card. Persists across charges (no need to re-tokenize each time).\",\n get_customer_card:\n \"Get details of a single saved card by (customer_id, card_id). Returns last 4 digits, expiration, brand, issuer. PURE READ — useful before charge_saved_card to confirm the card is still valid.\",\n\n // ── Subscription / Plan / Refund / Preference extensions (v0.7) ─────────\n get_subscription_plan:\n \"Fetch a subscription plan by id. Returns plan config: amount, frequency, status, init_point. Use to inspect a plan before subscribing customers, or to display plan details to the user.\",\n update_subscription:\n \"Update a subscription's amount, status, reason, external_reference, OR card_token_id (to switch payment method when the buyer's card is expired/declined). For card swap: pass card_token_id from a fresh tokenization. CONSTRAINTS: status changes only support 'paused' | 'cancelled' (use authorize via init_point flow to re-activate).\",\n search_subscriptions:\n \"Search subscriptions across the seller's account. Filter by status (pending/authorized/paused/cancelled), payer_email, external_reference, or preapproval_plan_id (to find all subscribers of a plan). Paginated. USE WHEN you need to enumerate active subscribers, audit cancellations, or find a subscription by external reference.\",\n get_refund:\n \"Fetch a single refund by (payment_id, refund_id). Returns the Refund object with amount, status, date_created. PURE READ — useful to verify a refund processed or to reconcile partial-refund history.\",\n update_payment_preference:\n \"Update a Checkout Pro preference (notification_url, back_urls, items, payer info, payment_methods exclusion list). Only works on preferences NOT yet paid. Common use: regenerate the link with a new notification_url after deployment, or change items if the buyer requested adjustments before paying.\",\n\n // ── Merchant Orders (v0.7) ────────────────────────────────────────────────\n get_merchant_order:\n \"Get a merchant_order with all its associated payments + shipments. MerchantOrder is the parent entity for Payments associated with a single Preference — one Order can have multiple partial Payments (retries, installments). USE THIS in webhooks with topic='merchant_order' to get the aggregate paid_amount, refunded_amount, and shipping status in one call.\",\n search_merchant_orders:\n \"Search merchant_orders by preference_id, external_reference, or status. Paginated. Returns up to 50 per page. USE WHEN you have a preference_id and want all its derived merchant_orders, or when reconciling 'which payments belong to which preference'.\",\n update_merchant_order:\n \"Update a merchant_order — typically to add items or shipping info. Most agent flows don't need this; use only when integrating with a custom shipping flow that requires updating the MO mid-lifecycle.\",\n\n // ── Stores + POS CRUD completion (v0.7) ──────────────────────────────────\n get_store:\n \"Fetch a single store by (user_id, store_id). Returns store details: name, location, business_hours, external_id. PURE READ.\",\n update_store:\n \"Update a store's properties (name, location, business_hours, external_id). MP merges the patch.\",\n delete_store:\n \"Delete a store. IRREVERSIBLE. Confirm with user before calling. Will fail if the store has associated POSes — delete those first.\",\n get_pos:\n \"Fetch a POS by id. Returns: name, store_id, category, external_id, qr_template (if configured). PURE READ. Use when you need to find the external_id for create_qr_payment.\",\n update_pos:\n \"Update a POS's properties (name, category, external_id). MP merges the patch.\",\n delete_pos:\n \"Delete a POS. IRREVERSIBLE. Cancels any pending QR orders attached to it. Confirm with user before calling.\",\n\n // ── Bank Accounts (v0.7) ─────────────────────────────────────────────────\n list_bank_accounts:\n \"List the bank accounts (CBUs) the seller has registered with MP for receiving payouts. Returns an array — the one with `is_default: true` is where settlements (release_money) go. USE BEFORE list_settlements when the user asks 'a qué cuenta me deposita MP'.\",\n register_bank_account:\n \"Register a new bank account (CBU) for the seller. NOTE: MP usually requires this through the dashboard for compliance — this endpoint may not work for all accounts. If it fails with 403, redirect the user to https://www.mercadopago.com.ar/banking/dashboard.\",\n\n // ── Point Devices físicos (v0.7) ─────────────────────────────────────────\n list_point_devices:\n \"List the physical Point devices (Smart, Tap to Pay, etc.) linked to the seller's MP account. Distinct from logical POS — these are actual terminals at brick-and-mortar shops. Returns each device's id (serial), operating_mode (PDV vs STANDALONE), and pos_id (when bound to a logical POS). Filter by pos_id to find devices for a specific cash register.\",\n update_point_device_mode:\n \"Switch a Point device's operating_mode between 'PDV' (bound to a logical POS, takes payments triggered through that POS) and 'STANDALONE' (works independently, accepts any payment). PDV is for cash-register integrations; STANDALONE is for free-form retail. Affects how payments hit the device.\",\n create_point_payment_intent:\n \"Create a payment intent on a physical Point device — the device prompts the buyer to tap/insert/swipe their card. Returns immediately with intent_id; query state via get_point_payment_intent or wait for point_integration_wh webhook. **AMOUNT IS IN CENTAVOS**, NOT pesos (Point API differs from Payments API): 100 = $1, 1000 = $10, 10000 = $100.\",\n get_point_payment_intent:\n \"Get the current state of a Point payment intent (OPEN, PROCESSING, FINISHED, CANCELED, ERROR). USE in polling loops if you can't wait for the webhook. When state=FINISHED, the intent.payment.id is the resulting Payment id usable with get_payment.\",\n cancel_point_payment_intent:\n \"Cancel an OPEN point payment intent before the buyer interacts with the device. ONLY WORKS while state='OPEN' — once the buyer taps, you can't cancel; refund_payment after the fact instead.\",\n\n // ── Pure helpers (v0.7) ──────────────────────────────────────────────────\n compute_marketplace_fee:\n \"PURE HELPER (no network) — given a transaction amount + fee rule (% or flat ARS, with optional min/max floors), returns the exact `marketplace_fee` value in ARS to pass to create_order or create_payment_preference. USE WHEN your platform takes a commission and you need to compute the exact fee per transaction. Examples: { percent: 5, minArs: 50, maxArs: 5000 } for percentage with floor + cap; { flatArs: 200, percent: 2 } for fixed + percentage.\",\n explain_payment_status:\n \"PURE HELPER (no network) — given a Payment object (from get_payment / create_payment / handle_webhook), returns { summary, recommendedAction, final, paid, retryable } in Spanish. Translates MP's cryptic status_detail codes to plain Spanish + actionable guidance ('reintentar con otra tarjeta' vs 'esperar webhook' vs 'estado final'). USE THIS instead of having to memorize 30+ status_detail codes — surface summary + recommendedAction directly to the user.\",\n};\n\n/**\n * Build a tool set for the Vercel AI SDK that exposes Mercado Pago to an\n * agent. Pass directly to `Experimental_Agent`'s `tools` option, or merge with\n * other tool sets.\n *\n * @example\n * ```ts\n * import { Experimental_Agent as Agent, stepCountIs } from 'ai';\n * import { MercadoPagoClient, mercadoPagoTools, InMemoryStateAdapter } from '@ar-agents/mercadopago';\n *\n * const mp = new MercadoPagoClient({ accessToken: process.env.MP_ACCESS_TOKEN! });\n * const agent = new Agent({\n * model: 'anthropic/claude-sonnet-4-6',\n * tools: mercadoPagoTools(mp, {\n * state: new InMemoryStateAdapter(),\n * backUrl: 'https://mysite.com/done',\n * }),\n * stopWhen: stepCountIs(8),\n * });\n * ```\n */\nexport function mercadoPagoTools(\n client: MercadoPagoClient,\n options: MercadoPagoToolsOptions,\n): ToolSet {\n const desc = (name: ToolName): string =>\n options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n\n return {\n // ─────────────────────────────────────────────────────────────────────────\n // Subscriptions (v0.1 — kept identical for backward compatibility)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription: tool({\n description: desc(\"create_subscription\"),\n inputSchema: z.object({\n customer_email: z.string().email().describe(\"Email of the customer who will be charged\"),\n amount_ars: z.number().positive().describe(\"Amount in Argentine Pesos per recurring charge\"),\n frequency_months: z.number().int().positive().max(12).describe(\"Frequency in months (1=monthly, 3=quarterly, 12=yearly)\"),\n reason: z.string().min(3).max(120).describe(\"Short description shown to the customer at checkout\"),\n external_reference: z.string().optional().describe(\"Optional id from your system to track this subscription\"),\n }),\n execute: async ({ customer_email, amount_ars, frequency_months, reason, external_reference }) => {\n const created = await client.createPreapproval({\n reason,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n backUrl: options.backUrl,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n });\n await options.state.set(created.id, {\n status: created.status,\n payerEmail: customer_email,\n amount: amount_ars,\n currency: \"ARS\",\n frequency: frequency_months,\n frequencyType: \"months\",\n initPoint: created.init_point,\n ...(external_reference !== undefined ? { externalReference: external_reference } : {}),\n createdAt: new Date().toISOString(),\n });\n return {\n subscription_id: created.id,\n status: created.status,\n init_point_url: created.init_point,\n next_step:\n \"Send init_point_url to the customer. They must complete the first payment with card+CVV. Use get_subscription_status to confirm activation after they pay.\",\n };\n },\n }),\n\n get_subscription_status: tool({\n description: desc(\"get_subscription_status\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID\"),\n }),\n execute: async ({ subscription_id }) => {\n const fresh = await client.getPreapproval(subscription_id);\n const cached = await options.state.get(subscription_id);\n return {\n subscription_id: fresh.id,\n status: fresh.status,\n payer_email: fresh.payer_email,\n amount: fresh.auto_recurring.transaction_amount,\n currency: fresh.auto_recurring.currency_id,\n next_payment_date: fresh.next_payment_date ?? null,\n last_webhook_status: cached?.lastWebhookStatus ?? null,\n last_webhook_at: cached?.lastWebhookAt ?? null,\n };\n },\n }),\n\n cancel_subscription: tool({\n description: desc(\"cancel_subscription\"),\n inputSchema: z.object({\n subscription_id: z.string().describe(\"The Mercado Pago subscription/preapproval ID to cancel\"),\n }),\n execute: async ({ subscription_id }) => {\n const cancelled = await client.cancelPreapproval(subscription_id);\n await options.state.set(subscription_id, {\n status: cancelled.status,\n cancelledAt: new Date().toISOString(),\n });\n return {\n subscription_id: cancelled.id,\n status: cancelled.status,\n message: \"Subscription cancelled. No further charges will occur.\",\n };\n },\n }),\n\n pause_subscription: tool({\n description: desc(\"pause_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const paused = await client.pausePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: paused.status });\n return {\n subscription_id: paused.id,\n status: paused.status,\n message: \"Subscription paused. Use resume_subscription to reactivate.\",\n };\n },\n }),\n\n resume_subscription: tool({\n description: desc(\"resume_subscription\"),\n inputSchema: z.object({ subscription_id: z.string() }),\n execute: async ({ subscription_id }) => {\n const resumed = await client.resumePreapproval(subscription_id);\n await options.state.set(subscription_id, { status: resumed.status });\n return {\n subscription_id: resumed.id,\n status: resumed.status,\n message: \"Subscription resumed. Charges will continue on next scheduled date.\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payments (v0.2)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment: tool({\n description: desc(\"create_payment\"),\n inputSchema: z.object({\n amount_ars: z.number().positive().describe(\"Amount in ARS\"),\n payment_method_id: z.string().describe(\"MP payment method id (e.g. 'account_money', 'rapipago', 'visa', 'master', 'naranja')\"),\n payer_email: z.string().email().describe(\"Email of the payer. Cannot equal seller email.\"),\n token: z.string().optional().describe(\"Card token from MP frontend Cardform. Required for credit/debit; omit for cash/account_money.\"),\n installments: z.number().int().min(1).max(24).optional().describe(\"Number of installments (cuotas). Default 1. Use calculate_installments first to see options.\"),\n description: z.string().max(255).optional().describe(\"Short description\"),\n external_reference: z.string().optional().describe(\"Your-system identifier\"),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional().describe(\"Payer identification — required for some payment types in AR\"),\n statement_descriptor: z.string().max(13).optional().describe(\"Shows on buyer's card statement (max 13 chars)\"),\n }),\n execute: async (input) => {\n const payment = await client.createPayment({\n transactionAmount: input.amount_ars,\n paymentMethodId: input.payment_method_id,\n payerEmail: input.payer_email,\n ...(input.token !== undefined ? { token: input.token } : {}),\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n // Deterministic idempotency key — safe to retry, same inputs always\n // produce the same key (MP dedupes on its side).\n idempotencyKey: await deterministicIdempotencyKey(\n \"create_payment\",\n input.external_reference ?? input.payer_email,\n input.amount_ars,\n input.payment_method_id,\n input.token,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n currency: payment.currency_id,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n payer_email: payment.payer?.email ?? null,\n external_reference: payment.external_reference,\n date_created: payment.date_created,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n get_payment: tool({\n description: desc(\"get_payment\"),\n inputSchema: z.object({\n payment_id: z.string().describe(\"The MP payment ID\"),\n }),\n execute: async ({ payment_id }) => {\n const p = await client.getPayment(payment_id);\n return {\n payment_id: p.id,\n status: p.status,\n status_detail: p.status_detail,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payment_method: p.payment_method_id,\n installments: p.installments,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n date_approved: p.date_approved,\n net_received: p.transaction_details?.net_received_amount ?? null,\n };\n },\n }),\n\n search_payments: tool({\n description: desc(\"search_payments\"),\n inputSchema: z.object({\n external_reference: z.string().optional(),\n status: z.string().optional().describe(\"'approved' | 'pending' | 'rejected' | 'cancelled' | 'refunded' etc.\"),\n payer_email: z.string().optional(),\n begin_date: z.string().optional().describe(\"ISO 8601, e.g. 2026-01-01T00:00:00Z\"),\n end_date: z.string().optional().describe(\"ISO 8601\"),\n limit: z.number().int().min(1).max(100).optional().describe(\"Default 30, max 100\"),\n offset: z.number().int().min(0).optional().describe(\"Pagination offset (default 0)\"),\n }),\n execute: async (input) => {\n const result = await client.searchPayments({\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.payer_email !== undefined ? { payerEmail: input.payer_email } : {}),\n ...(input.begin_date !== undefined ? { beginDate: input.begin_date } : {}),\n ...(input.end_date !== undefined ? { endDate: input.end_date } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n ...(input.offset !== undefined ? { offset: input.offset } : {}),\n });\n return {\n total: result.paging.total,\n returned: result.results.length,\n offset: result.paging.offset,\n payments: result.results.map((p) => ({\n payment_id: p.id,\n status: p.status,\n amount: p.transaction_amount,\n currency: p.currency_id,\n payer_email: p.payer?.email ?? null,\n external_reference: p.external_reference,\n date_created: p.date_created,\n })),\n };\n },\n }),\n\n cancel_payment: tool({\n description: desc(\"cancel_payment\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const cancelled = await client.cancelPayment(payment_id);\n return {\n payment_id: cancelled.id,\n status: cancelled.status,\n message: \"Payment cancelled. If it was already approved, use refund_payment instead.\",\n };\n },\n }),\n\n capture_payment: tool({\n description: desc(\"capture_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Optional partial-capture amount. Omit to capture full authorized amount.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const captured = await client.capturePayment(payment_id, amount_ars);\n return {\n payment_id: captured.id,\n status: captured.status,\n amount: captured.transaction_amount,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Refunds\n // ─────────────────────────────────────────────────────────────────────────\n\n refund_payment: tool({\n description: desc(\"refund_payment\"),\n inputSchema: z.object({\n payment_id: z.string(),\n amount_ars: z.number().positive().optional().describe(\"Partial-refund amount in ARS. Omit for full refund.\"),\n }),\n execute: async ({ payment_id, amount_ars }) => {\n const refund = await client.createRefund({\n paymentId: payment_id,\n ...(amount_ars !== undefined ? { amount: amount_ars } : {}),\n idempotencyKey: await deterministicIdempotencyKey(\"refund\", payment_id, amount_ars ?? \"full\"),\n });\n return {\n refund_id: refund.id,\n payment_id: refund.payment_id,\n amount: refund.amount,\n status: refund.status,\n message:\n amount_ars === undefined\n ? \"Full refund issued. Funds return to the buyer in 3-10 business days.\"\n : `Partial refund of ${amount_ars} ARS issued.`,\n };\n },\n }),\n\n list_refunds: tool({\n description: desc(\"list_refunds\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const refunds = await client.listRefunds(payment_id);\n return {\n payment_id,\n count: refunds.length,\n refunds: refunds.map((r) => ({\n refund_id: r.id,\n amount: r.amount,\n status: r.status,\n date_created: r.date_created,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Checkout Pro\n // ─────────────────────────────────────────────────────────────────────────\n\n create_payment_preference: tool({\n description: desc(\"create_payment_preference\"),\n inputSchema: z.object({\n items: z.array(z.object({\n title: z.string().min(1).max(256),\n quantity: z.number().int().positive(),\n unit_price: z.number().positive(),\n description: z.string().optional(),\n picture_url: z.string().url().optional(),\n })).min(1).describe(\"Items being charged. At least one required.\"),\n payer_email: z.string().email().optional().describe(\"Pre-fill the payer email on Checkout Pro form\"),\n external_reference: z.string().optional(),\n max_installments: z.number().int().min(1).max(24).optional().describe(\"Limit max cuotas offered. Defaults to MP account config.\"),\n statement_descriptor: z.string().max(13).optional(),\n excluded_payment_types: z.array(z.enum([\"credit_card\", \"debit_card\", \"ticket\", \"atm\", \"bank_transfer\"])).optional().describe(\"Block payment types — e.g., ['ticket'] to disable Rapipago/Pago Fácil\"),\n }),\n execute: async (input) => {\n const pref = await client.createPreference({\n items: input.items.map((it) => ({\n title: it.title,\n quantity: it.quantity,\n unit_price: it.unit_price,\n currency_id: \"ARS\",\n ...(it.description !== undefined ? { description: it.description } : {}),\n ...(it.picture_url !== undefined ? { picture_url: it.picture_url } : {}),\n })),\n ...(input.payer_email !== undefined ? { payer: { email: input.payer_email } } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n backUrls: { success: options.backUrl, failure: options.backUrl, pending: options.backUrl },\n autoReturn: \"approved\",\n ...(options.notificationUrl !== undefined ? { notificationUrl: options.notificationUrl } : {}),\n ...((input.max_installments !== undefined || input.excluded_payment_types !== undefined)\n ? {\n paymentMethods: {\n ...(input.max_installments !== undefined ? { installments: input.max_installments } : {}),\n ...(input.excluded_payment_types !== undefined\n ? { excluded_payment_types: input.excluded_payment_types.map((id) => ({ id })) }\n : {}),\n },\n }\n : {}),\n });\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n date_created: pref.date_created,\n next_step:\n \"Send init_point_url (or sandbox_init_point_url in sandbox) to the customer. After they pay, MP fires a webhook with the payment_id; use get_payment to confirm status.\",\n };\n },\n }),\n\n get_payment_preference: tool({\n description: desc(\"get_payment_preference\"),\n inputSchema: z.object({ preference_id: z.string() }),\n execute: async ({ preference_id }) => {\n const pref = await client.getPreference(preference_id);\n return {\n preference_id: pref.id,\n init_point_url: pref.init_point ?? null,\n sandbox_init_point_url: pref.sandbox_init_point ?? null,\n external_reference: pref.external_reference,\n items: pref.items,\n date_created: pref.date_created,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Customers + Saved Cards\n // ─────────────────────────────────────────────────────────────────────────\n\n create_customer: tool({\n description: desc(\"create_customer\"),\n inputSchema: z.object({\n email: z.string().email(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n identification: z.object({\n type: z.enum([\"DNI\", \"CUIT\", \"CUIL\"]),\n number: z.string(),\n }).optional(),\n description: z.string().optional(),\n }),\n execute: async (input) => {\n const customer = await client.createCustomer({\n email: input.email,\n ...(input.first_name !== undefined ? { firstName: input.first_name } : {}),\n ...(input.last_name !== undefined ? { lastName: input.last_name } : {}),\n ...(input.identification !== undefined ? { identification: input.identification } : {}),\n ...(input.description !== undefined ? { description: input.description } : {}),\n });\n return {\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n date_created: customer.date_created,\n };\n },\n }),\n\n find_customer_by_email: tool({\n description: desc(\"find_customer_by_email\"),\n inputSchema: z.object({ email: z.string().email() }),\n execute: async ({ email }) => {\n const result = await client.searchCustomers({ email, limit: 1 });\n const customer = result.results[0] ?? null;\n return customer\n ? {\n found: true,\n customer_id: customer.id,\n email: customer.email,\n first_name: customer.first_name,\n last_name: customer.last_name,\n }\n : { found: false, customer_id: null };\n },\n }),\n\n list_customer_cards: tool({\n description: desc(\"list_customer_cards\"),\n inputSchema: z.object({ customer_id: z.string() }),\n execute: async ({ customer_id }) => {\n const cards = await client.listCustomerCards(customer_id);\n return {\n customer_id,\n count: cards.length,\n cards: cards.map((c) => ({\n card_id: c.id,\n last_four_digits: c.last_four_digits,\n expiration_month: c.expiration_month,\n expiration_year: c.expiration_year,\n payment_method: c.payment_method?.id ?? null,\n payment_method_name: c.payment_method?.name ?? null,\n })),\n };\n },\n }),\n\n delete_customer_card: tool({\n description: desc(\"delete_customer_card\"),\n inputSchema: z.object({\n customer_id: z.string(),\n card_id: z.string(),\n }),\n execute: async ({ customer_id, card_id }) => {\n await client.deleteCustomerCard(customer_id, card_id);\n return { customer_id, card_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Payment Methods + Installments\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_methods: tool({\n description: desc(\"list_payment_methods\"),\n inputSchema: z.object({}),\n execute: async () => {\n const methods = await client.listPaymentMethods();\n return {\n count: methods.length,\n methods: methods.map((m) => ({\n id: m.id,\n name: m.name,\n payment_type: m.payment_type_id,\n status: m.status,\n min_amount: m.min_allowed_amount,\n max_amount: m.max_allowed_amount,\n })),\n };\n },\n }),\n\n calculate_installments: tool({\n description: desc(\"calculate_installments\"),\n inputSchema: z.object({\n amount_ars: z.number().positive(),\n payment_method_id: z.string().optional().describe(\"E.g. 'visa', 'master', 'naranja'. Omit for all available methods.\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for issuer-specific offers (e.g., Naranja interest-free promotions)\"),\n }),\n execute: async (input) => {\n const offers = await client.getInstallments({\n amount: input.amount_ars,\n ...(input.payment_method_id !== undefined ? { paymentMethodId: input.payment_method_id } : {}),\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n amount: input.amount_ars,\n offers: offers.map((o) => ({\n payment_method_id: o.payment_method_id,\n payment_type_id: o.payment_type_id,\n issuer_name: o.issuer?.name ?? null,\n options: o.payer_costs.map((pc) => ({\n installments: pc.installments,\n installment_amount: pc.installment_amount,\n total_amount: pc.total_amount,\n installment_rate: pc.installment_rate,\n recommended_message: pc.recommended_message,\n })),\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Account\n // ─────────────────────────────────────────────────────────────────────────\n\n get_account_info: tool({\n description: desc(\"get_account_info\"),\n inputSchema: z.object({}),\n execute: async () => {\n const me = await client.getMe();\n return {\n account_id: me.id,\n email: me.email,\n nickname: me.nickname,\n country_id: me.country_id,\n site_id: me.site_id,\n user_type: me.user_type,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Saved-card charging (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n charge_saved_card: tool({\n description: desc(\"charge_saved_card\"),\n inputSchema: z.object({\n customer_id: z.string().describe(\"MP customer id (from create_customer / find_customer_by_email)\"),\n card_id: z.string().describe(\"Saved card id (from list_customer_cards)\"),\n security_code: z.string().regex(/^\\d{3,4}$/).describe(\"CVV — 3 digits (Visa/Master) or 4 (Amex). User must provide this each charge in AR.\"),\n amount_ars: z.number().positive(),\n description: z.string().min(1).max(255),\n installments: z.number().int().min(1).max(24).optional().describe(\"Default 1. Use calculate_installments first to pick a valid count.\"),\n external_reference: z.string().optional(),\n statement_descriptor: z.string().max(13).optional(),\n }),\n execute: async (input) => {\n const payment = await client.chargeSavedCard({\n customerId: input.customer_id,\n cardId: input.card_id,\n securityCode: input.security_code,\n amount: input.amount_ars,\n description: input.description,\n ...(input.installments !== undefined ? { installments: input.installments } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.statement_descriptor !== undefined ? { statementDescriptor: input.statement_descriptor } : {}),\n idempotencyKey: await deterministicIdempotencyKey(\n \"charge_saved_card\",\n input.card_id,\n input.amount_ars,\n input.external_reference,\n ),\n });\n return {\n payment_id: payment.id,\n status: payment.status,\n status_detail: payment.status_detail,\n amount: payment.transaction_amount,\n installments: payment.installments,\n payment_method: payment.payment_method_id,\n customer_id: input.customer_id,\n card_id: input.card_id,\n external_reference: payment.external_reference,\n date_approved: payment.date_approved,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // QR in-store (v0.3)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_qr_payment: tool({\n description: desc(\"create_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string().describe(\"Pre-configured POS external_id from MP dashboard. Required.\"),\n amount_ars: z.number().positive(),\n title: z.string().min(1).max(80).describe(\"Display title shown when scanning\"),\n description: z.string().max(255).optional(),\n external_reference: z.string().optional(),\n notification_url: z.string().url().optional().describe(\"Webhook URL — falls back to dashboard config if omitted\"),\n expires_in_seconds: z.number().int().min(60).max(3600).optional().describe(\"Default 600 (10 min)\"),\n }),\n execute: async (input) => {\n // Lazy-load qrcode to keep cold-start lean for users who don't use QR\n const QRCode = (await import(\"qrcode\")).default;\n const me = await client.getMe();\n const userId = String(me.id);\n const expiresAt = new Date(\n Date.now() + (input.expires_in_seconds ?? 600) * 1000,\n ).toISOString();\n\n const qr = await client.createQrPayment(userId, {\n externalPosId: input.external_pos_id,\n totalAmount: input.amount_ars,\n title: input.title,\n ...(input.description !== undefined ? { description: input.description } : {}),\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.notification_url !== undefined ? { notificationUrl: input.notification_url } : {}),\n expirationDate: expiresAt,\n });\n\n const qrDataUrl = await QRCode.toDataURL(qr.qr_data, {\n errorCorrectionLevel: \"M\",\n margin: 1,\n width: 512,\n });\n\n return {\n in_store_order_id: qr.in_store_order_id,\n qr_data: qr.qr_data,\n qr_data_url: qrDataUrl,\n expires_at: expiresAt,\n external_pos_id: input.external_pos_id,\n amount: input.amount_ars,\n next_step:\n \"Display the qr_data_url image to the buyer. Wait for the payment webhook (point_integration_wh fires first, then payment topic). If buyer doesn't scan in time, call cancel_qr_payment to free the POS.\",\n };\n },\n }),\n\n cancel_qr_payment: tool({\n description: desc(\"cancel_qr_payment\"),\n inputSchema: z.object({\n external_pos_id: z.string(),\n }),\n execute: async ({ external_pos_id }) => {\n const me = await client.getMe();\n await client.cancelQrPayment(String(me.id), external_pos_id);\n return { external_pos_id, cancelled: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Subscription Plans (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_subscription_plan: tool({\n description: desc(\"create_subscription_plan\"),\n inputSchema: z.object({\n reason: z.string().min(3).max(120).describe(\"Plan name shown at checkout\"),\n amount_ars: z.number().positive(),\n frequency_months: z.number().int().min(1).max(12),\n back_url: z.string().url().describe(\"HTTPS URL where MP redirects after first payment\"),\n external_reference: z.string().optional(),\n free_trial_days: z.number().int().min(1).max(60).optional().describe(\"Free trial period in days before first charge\"),\n }),\n execute: async (input) => {\n const plan = await client.createSubscriptionPlan({\n reason: input.reason,\n amount: input.amount_ars,\n currency: \"ARS\",\n frequency: input.frequency_months,\n frequencyType: \"months\",\n backUrl: input.back_url,\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n ...(input.free_trial_days !== undefined ? { freeTrialFrequency: input.free_trial_days, freeTrialFrequencyType: \"days\" as const } : {}),\n });\n return {\n plan_id: plan.id,\n status: plan.status,\n reason: plan.reason,\n amount: plan.auto_recurring.transaction_amount,\n currency: plan.auto_recurring.currency_id,\n frequency: `${plan.auto_recurring.frequency} ${plan.auto_recurring.frequency_type}`,\n external_reference: plan.external_reference,\n next_step: \"Use subscribe_to_plan to enroll customers in this plan, or share its ID for them to subscribe via your frontend.\",\n };\n },\n }),\n\n list_subscription_plans: tool({\n description: desc(\"list_subscription_plans\"),\n inputSchema: z.object({\n status: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listSubscriptionPlans({\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n plans: result.results.map((p) => ({\n plan_id: p.id,\n reason: p.reason,\n status: p.status,\n amount: p.auto_recurring.transaction_amount,\n currency: p.auto_recurring.currency_id,\n frequency: `${p.auto_recurring.frequency} ${p.auto_recurring.frequency_type}`,\n })),\n };\n },\n }),\n\n update_subscription_plan: tool({\n description: desc(\"update_subscription_plan\"),\n inputSchema: z.object({\n plan_id: z.string(),\n reason: z.string().optional(),\n amount_ars: z.number().positive().optional(),\n status: z.enum([\"active\", \"cancelled\"]).optional(),\n back_url: z.string().url().optional(),\n }),\n execute: async (input) => {\n const updated = await client.updateSubscriptionPlan(input.plan_id, {\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(input.amount_ars !== undefined ? { amount: input.amount_ars } : {}),\n ...(input.status !== undefined ? { status: input.status } : {}),\n ...(input.back_url !== undefined ? { backUrl: input.back_url } : {}),\n });\n return {\n plan_id: updated.id,\n status: updated.status,\n reason: updated.reason,\n amount: updated.auto_recurring.transaction_amount,\n message: input.amount_ars !== undefined\n ? \"Updated. Existing subscribers keep their old amount; only NEW subscribers get the new pricing.\"\n : \"Plan updated.\",\n };\n },\n }),\n\n subscribe_to_plan: tool({\n description: desc(\"subscribe_to_plan\"),\n inputSchema: z.object({\n plan_id: z.string(),\n customer_email: z.string().email(),\n external_reference: z.string().optional(),\n }),\n execute: async (input) => {\n const sub = await client.subscribeToPlan({\n planId: input.plan_id,\n payerEmail: input.customer_email,\n ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n });\n return {\n subscription_id: sub.id,\n status: sub.status,\n payer_email: sub.payer_email,\n init_point_url: sub.init_point,\n next_step: \"Send init_point_url to the customer for first payment with card+CVV.\",\n };\n },\n }),\n\n list_subscription_payments: tool({\n description: desc(\"list_subscription_payments\"),\n inputSchema: z.object({\n subscription_id: z.string(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listSubscriptionPayments(input.subscription_id, {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n subscription_id: input.subscription_id,\n total: result.paging.total,\n payments: result.results.map((p) => ({\n authorized_payment_id: p.id,\n payment_id: p.payment_id ?? null,\n status: p.status,\n amount: p.transaction_amount ?? null,\n currency: p.currency_id ?? null,\n debit_date: p.debit_date ?? null,\n next_retry_date: p.next_retry_date ?? null,\n retry_attempt: p.retry_attempt ?? 0,\n reason: p.reason ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Stores + POS (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n create_store: tool({\n description: desc(\"create_store\"),\n inputSchema: z.object({\n name: z.string().min(1).max(80),\n external_id: z.string().min(1).max(64).describe(\"Unique within the seller's stores\"),\n address_line: z.string().optional(),\n city_name: z.string().optional(),\n state_name: z.string().optional(),\n }),\n execute: async (input) => {\n const me = await client.getMe();\n const store = await client.createStore(String(me.id), {\n name: input.name,\n externalId: input.external_id,\n ...(input.address_line || input.city_name || input.state_name\n ? {\n location: {\n ...(input.address_line ? { addressLine: input.address_line } : {}),\n ...(input.city_name ? { cityName: input.city_name } : {}),\n ...(input.state_name ? { stateName: input.state_name } : {}),\n countryId: \"AR\",\n },\n }\n : {}),\n });\n return {\n store_id: store.id,\n name: store.name,\n external_id: store.external_id,\n next_step: \"Use create_pos with this store_id to add a Point of Sale where create_qr_payment can issue QRs.\",\n };\n },\n }),\n\n list_stores: tool({\n description: desc(\"list_stores\"),\n inputSchema: z.object({\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const me = await client.getMe();\n const result = await client.listStores(String(me.id), {\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n stores: result.results.map((s) => ({\n store_id: s.id,\n name: s.name ?? null,\n external_id: s.external_id ?? null,\n })),\n };\n },\n }),\n\n create_pos: tool({\n description: desc(\"create_pos\"),\n inputSchema: z.object({\n name: z.string().min(1).max(80),\n external_id: z.string().min(1).max(64).describe(\"Unique within the store. This is what create_qr_payment uses.\"),\n store_id: z.string().describe(\"From create_store / list_stores\"),\n category: z.number().int().optional().describe(\"MP category code, default 621102 (other food/beverage)\"),\n fixed_amount: z.boolean().optional().describe(\"True for static QR with fixed amount; false (default) for dynamic per-order QR\"),\n }),\n execute: async (input) => {\n const pos = await client.createPos({\n name: input.name,\n externalId: input.external_id,\n storeId: input.store_id,\n ...(input.category !== undefined ? { category: input.category } : {}),\n ...(input.fixed_amount !== undefined ? { fixedAmount: input.fixed_amount } : {}),\n });\n return {\n pos_id: pos.id,\n external_id: pos.external_id,\n store_id: pos.store_id,\n name: pos.name,\n next_step: \"Use create_qr_payment with this external_id to start issuing dynamic QRs from this POS.\",\n };\n },\n }),\n\n list_pos: tool({\n description: desc(\"list_pos\"),\n inputSchema: z.object({\n store_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n }),\n execute: async (input) => {\n const result = await client.listPos({\n ...(input.store_id !== undefined ? { storeId: input.store_id } : {}),\n ...(input.limit !== undefined ? { limit: input.limit } : {}),\n });\n return {\n total: result.paging.total,\n pos: result.results.map((p) => ({\n pos_id: p.id,\n external_id: p.external_id ?? null,\n store_id: p.store_id ?? null,\n name: p.name ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Disputes (v0.4 — read-only)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_payment_disputes: tool({\n description: desc(\"list_payment_disputes\"),\n inputSchema: z.object({ payment_id: z.string() }),\n execute: async ({ payment_id }) => {\n const disputes = await client.listPaymentDisputes(payment_id);\n return {\n payment_id,\n count: disputes.length,\n disputes: disputes.map((d) => ({\n dispute_id: d.id,\n status: d.status,\n amount: d.amount ?? null,\n reason: d.reason ?? null,\n date_created: d.date_created ?? null,\n dashboard_url: `https://www.mercadopago.com.ar/disputes/${d.id}`,\n })),\n };\n },\n }),\n\n get_dispute: tool({\n description: desc(\"get_dispute\"),\n inputSchema: z.object({\n payment_id: z.string(),\n dispute_id: z.string(),\n }),\n execute: async ({ payment_id, dispute_id }) => {\n const d = await client.getDispute(payment_id, dispute_id);\n return {\n dispute_id: d.id,\n status: d.status,\n amount: d.amount ?? null,\n reason: d.reason ?? null,\n reason_description: d.reason_description ?? null,\n resolution: d.resolution ?? null,\n date_created: d.date_created ?? null,\n dashboard_url: `https://www.mercadopago.com.ar/disputes/${d.id}`,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Lookup helpers (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_identification_types: tool({\n description: desc(\"list_identification_types\"),\n inputSchema: z.object({}),\n execute: async () => {\n const types = await client.listIdentificationTypes();\n return {\n count: types.length,\n types: types.map((t) => ({\n id: t.id,\n name: t.name,\n type: t.type,\n min_length: t.min_length ?? null,\n max_length: t.max_length ?? null,\n })),\n };\n },\n }),\n\n list_issuers: tool({\n description: desc(\"list_issuers\"),\n inputSchema: z.object({\n payment_method_id: z.string().describe(\"E.g. 'visa', 'master', 'naranja'\"),\n bin: z.string().min(6).max(8).optional().describe(\"First 6-8 digits of card for precise issuer detection\"),\n }),\n execute: async (input) => {\n const issuers = await client.listIssuers({\n paymentMethodId: input.payment_method_id,\n ...(input.bin !== undefined ? { bin: input.bin } : {}),\n });\n return {\n payment_method_id: input.payment_method_id,\n count: issuers.length,\n issuers: issuers.map((i) => ({\n issuer_id: i.id,\n name: i.name,\n status: i.status ?? null,\n })),\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // Webhooks management (v0.4)\n // ─────────────────────────────────────────────────────────────────────────\n\n list_webhooks: tool({\n description: desc(\"list_webhooks\"),\n inputSchema: z.object({}),\n execute: async () => {\n const hooks = await client.listWebhooks();\n return {\n count: hooks.length,\n webhooks: hooks.map((h) => ({\n webhook_id: h.id,\n url: h.url ?? null,\n topic: h.topic ?? null,\n status: h.status ?? null,\n date_created: h.date_created ?? null,\n })),\n };\n },\n }),\n\n create_webhook: tool({\n description: desc(\"create_webhook\"),\n inputSchema: z.object({\n url: z.string().url(),\n topic: z.string().describe(\"E.g. 'payment', 'subscription_authorized_payment', 'subscription_preapproval', 'merchant_order', 'point_integration_wh'\"),\n }),\n execute: async ({ url, topic }) => {\n const hook = await client.createWebhook({ url, topic });\n return {\n webhook_id: hook.id,\n url: hook.url ?? url,\n topic: hook.topic ?? topic,\n status: hook.status ?? null,\n };\n },\n }),\n\n update_webhook: tool({\n description: desc(\"update_webhook\"),\n inputSchema: z.object({\n webhook_id: z.string(),\n url: z.string().url().optional(),\n topic: z.string().optional(),\n }),\n execute: async (input) => {\n const hook = await client.updateWebhook(input.webhook_id, {\n ...(input.url !== undefined ? { url: input.url } : {}),\n ...(input.topic !== undefined ? { topic: input.topic } : {}),\n });\n return {\n webhook_id: hook.id,\n url: hook.url ?? null,\n topic: hook.topic ?? null,\n status: hook.status ?? null,\n };\n },\n }),\n\n delete_webhook: tool({\n description: desc(\"delete_webhook\"),\n inputSchema: z.object({ webhook_id: z.string() }),\n execute: async ({ webhook_id }) => {\n await client.deleteWebhook(webhook_id);\n return { webhook_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.5 — Webhook handler combo\n // ─────────────────────────────────────────────────────────────────────────\n\n handle_webhook: tool({\n description: desc(\"handle_webhook\"),\n inputSchema: z.object({\n raw_body: z\n .string()\n .describe(\n \"The raw JSON body of the webhook request, exactly as received (do NOT re-stringify). Pass `await req.text()` from your handler.\",\n ),\n signature_header: z\n .string()\n .nullable()\n .describe(\"Value of the `x-signature` request header.\"),\n request_id_header: z\n .string()\n .nullable()\n .describe(\"Value of the `x-request-id` request header.\"),\n auto_fetch: z\n .boolean()\n .optional()\n .default(true)\n .describe(\n \"If true (default), fetch the underlying resource (Payment, Subscription, etc.) AS the MP user the client is configured for. Set to false to skip the fetch (faster, useful when you only need the topic+id).\",\n ),\n }),\n execute: async ({\n raw_body,\n signature_header,\n request_id_header,\n auto_fetch,\n }) => {\n if (!options.webhookSecret) {\n return {\n verified: false,\n error:\n \"webhookSecret not configured in mercadoPagoTools options. Pass it from MP dev panel → Notificaciones → Webhooks.\",\n event: null,\n resource: null,\n };\n }\n let parsedBody: unknown;\n try {\n parsedBody = JSON.parse(raw_body);\n } catch {\n return {\n verified: false,\n error: \"raw_body is not valid JSON.\",\n event: null,\n resource: null,\n };\n }\n const event = parseWebhookEvent(parsedBody);\n if (!event) {\n return {\n verified: false,\n error: \"Could not extract topic + dataId from webhook body.\",\n event: null,\n resource: null,\n };\n }\n const verified = await verifyWebhookSignature({\n requestId: request_id_header,\n dataId: event.dataId,\n signatureHeader: signature_header,\n secret: options.webhookSecret,\n });\n if (!verified) {\n return {\n verified: false,\n error: \"HMAC-SHA256 signature mismatch. Reject the webhook (HTTP 401).\",\n event,\n resource: null,\n };\n }\n let resource: unknown = null;\n let resourceError: string | null = null;\n if (auto_fetch) {\n try {\n switch (event.topic) {\n case \"payment\":\n case \"payment.created\":\n case \"payment.updated\":\n resource = await client.getPayment(event.dataId);\n break;\n case \"preapproval\":\n case \"subscription_preapproval\":\n resource = await client.getPreapproval(event.dataId);\n break;\n case \"subscription_authorized_payment\":\n // No direct fetch endpoint; the data id IS the authorized_payment id.\n resource = { id: event.dataId, hint: \"Use list_subscription_payments to enumerate parent.\" };\n break;\n default:\n resource = null;\n resourceError = `No auto-fetch handler for topic '${event.topic}' yet.`;\n }\n } catch (err) {\n resourceError = err instanceof Error ? err.message : String(err);\n }\n }\n return {\n verified: true,\n event,\n resource,\n resource_error: resourceError,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.5 — OAuth Marketplace flow\n // ─────────────────────────────────────────────────────────────────────────\n\n oauth_authorize_url: tool({\n description: desc(\"oauth_authorize_url\"),\n inputSchema: z.object({\n redirect_uri: z\n .string()\n .url()\n .describe(\n \"Where MP redirects the seller after approval. MUST be whitelisted in MP dev panel → Aplicaciones → tu app → Redirect URIs.\",\n ),\n state: z\n .string()\n .min(8)\n .describe(\n \"Opaque CSRF/session token echoed back. Bind to the user's session and verify on redirect.\",\n ),\n }),\n execute: async ({ redirect_uri, state }) => {\n if (!options.oauth?.clientId) {\n return {\n available: false,\n error:\n \"OAuth not configured. Pass `oauth: { clientId, clientSecret }` to mercadoPagoTools options.\",\n url: null,\n };\n }\n const url = buildAuthorizeUrl({\n clientId: options.oauth.clientId,\n redirectUri: redirect_uri,\n state,\n });\n return {\n available: true,\n url,\n next_step:\n \"Redirect the seller to `url`. After approval MP sends them to redirect_uri?code=...&state=... — verify state matches, then call oauth_exchange_code with the code.\",\n };\n },\n }),\n\n oauth_exchange_code: tool({\n description: desc(\"oauth_exchange_code\"),\n inputSchema: z.object({\n code: z\n .string()\n .describe(\"The `code` query param from the OAuth redirect URL.\"),\n redirect_uri: z\n .string()\n .url()\n .describe(\n \"Must EXACTLY match the redirect_uri used in oauth_authorize_url.\",\n ),\n }),\n execute: async ({ code, redirect_uri }) => {\n if (!options.oauth?.clientId || !options.oauth?.clientSecret) {\n return {\n available: false,\n error:\n \"OAuth not configured. Pass `oauth: { clientId, clientSecret }` to mercadoPagoTools options.\",\n token: null,\n };\n }\n try {\n const token = await exchangeCodeForToken({\n clientId: options.oauth.clientId,\n clientSecret: options.oauth.clientSecret,\n code,\n redirectUri: redirect_uri,\n });\n return {\n available: true,\n token,\n next_step:\n \"PERSIST { user_id, access_token, refresh_token, expires_in } against this seller. Use access_token to instantiate `new MercadoPagoClient({ accessToken })` AS the seller for marketplace API calls.\",\n };\n } catch (err) {\n return {\n available: true,\n error: err instanceof Error ? err.message : String(err),\n token: null,\n };\n }\n },\n }),\n\n oauth_refresh_token: tool({\n description: desc(\"oauth_refresh_token\"),\n inputSchema: z.object({\n refresh_token: z\n .string()\n .describe(\"The saved refresh_token for this seller.\"),\n }),\n execute: async ({ refresh_token }) => {\n if (!options.oauth?.clientId || !options.oauth?.clientSecret) {\n return {\n available: false,\n error:\n \"OAuth not configured. Pass `oauth: { clientId, clientSecret }` to mercadoPagoTools options.\",\n token: null,\n };\n }\n try {\n const token = await refreshAccessToken({\n clientId: options.oauth.clientId,\n clientSecret: options.oauth.clientSecret,\n refreshToken: refresh_token,\n });\n return {\n available: true,\n token,\n next_step:\n \"Replace the persisted access_token + refresh_token with these new values (refresh_token may have rotated).\",\n };\n } catch (err) {\n return {\n available: true,\n error: err instanceof Error ? err.message : String(err),\n token: null,\n };\n }\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.5 — Order Management API\n // ─────────────────────────────────────────────────────────────────────────\n\n create_order: tool({\n description: desc(\"create_order\"),\n inputSchema: z.object({\n type: z\n .enum([\"online\", \"in_store\"])\n .describe(\"'online' for hosted/checkout flow, 'in_store' for QR/POS\"),\n currency_id: z.string().optional().default(\"ARS\"),\n external_reference: z.string().optional(),\n total_amount: z.number().positive().optional(),\n items: z\n .array(\n z.object({\n title: z.string(),\n unit_price: z.number(),\n quantity: z.number(),\n description: z.string().optional(),\n }),\n )\n .optional(),\n payer_email: z.string().email().optional(),\n capture_mode: z\n .enum([\"automatic\", \"manual\"])\n .optional()\n .describe(\n \"'automatic' charges immediately; 'manual' authorizes only — capture later via capture_order.\",\n ),\n notification_url: z.string().url().optional(),\n marketplace: z\n .string()\n .optional()\n .describe(\n \"Marketplace identifier (your app's name). Required for split payments.\",\n ),\n marketplace_fee: z\n .number()\n .optional()\n .describe(\n \"Fee in ARS (NOT %) credited to the marketplace's MP account.\",\n ),\n collector_id: z\n .union([z.string(), z.number()])\n .optional()\n .describe(\n \"Seller's MP user_id (from oauth_exchange_code.user_id). Funds route here; marketplace_fee is split off to your account.\",\n ),\n }),\n execute: async (input) => {\n const params: Parameters<typeof client.createOrder>[0] = {\n type: input.type,\n };\n if (input.currency_id) params.currency_id = input.currency_id;\n if (input.external_reference) params.external_reference = input.external_reference;\n if (input.total_amount !== undefined) params.total_amount = input.total_amount;\n if (input.items) params.items = input.items;\n if (input.payer_email) params.payer = { email: input.payer_email };\n if (input.capture_mode) params.capture_mode = input.capture_mode;\n if (input.notification_url) params.notification_url = input.notification_url;\n if (input.marketplace) params.marketplace = input.marketplace;\n if (input.marketplace_fee !== undefined) params.marketplace_fee = input.marketplace_fee;\n if (input.collector_id !== undefined) params.collector_id = input.collector_id;\n const order = await client.createOrder(params, {\n idempotencyKey: await deterministicIdempotencyKey(\n \"create_order\",\n input.external_reference,\n input.total_amount,\n input.collector_id,\n ),\n });\n return {\n order_id: order.id,\n status: order.status ?? null,\n capture_mode: order.capture_mode ?? params.capture_mode ?? \"automatic\",\n total_amount: order.total_amount ?? null,\n };\n },\n }),\n\n get_order: tool({\n description: desc(\"get_order\"),\n inputSchema: z.object({ order_id: z.string() }),\n execute: async ({ order_id }) => {\n const order = await client.getOrder(order_id);\n return order;\n },\n }),\n\n update_order: tool({\n description: desc(\"update_order\"),\n inputSchema: z.object({\n order_id: z.string(),\n external_reference: z.string().optional(),\n total_amount: z.number().optional(),\n }),\n execute: async ({ order_id, external_reference, total_amount }) => {\n const patch: Parameters<typeof client.updateOrder>[1] = {};\n if (external_reference !== undefined) patch.external_reference = external_reference;\n if (total_amount !== undefined) patch.total_amount = total_amount;\n const order = await client.updateOrder(order_id, patch);\n return order;\n },\n }),\n\n capture_order: tool({\n description: desc(\"capture_order\"),\n inputSchema: z.object({\n order_id: z.string(),\n amount: z\n .number()\n .positive()\n .optional()\n .describe(\n \"Optional partial-capture amount. Omit to capture the full authorized amount.\",\n ),\n }),\n execute: async ({ order_id, amount }) => {\n const order = await client.captureOrder(order_id, amount);\n return {\n order_id: order.id,\n status: order.status ?? null,\n captured_amount: amount ?? order.total_amount ?? null,\n };\n },\n }),\n\n cancel_order: tool({\n description: desc(\"cancel_order\"),\n inputSchema: z.object({ order_id: z.string() }),\n execute: async ({ order_id }) => {\n const order = await client.cancelOrder(order_id);\n return {\n order_id: order.id,\n status: order.status ?? \"canceled\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.6 — Account / Balance / Movements / Settlements\n // ─────────────────────────────────────────────────────────────────────────\n\n get_account_balance: tool({\n description: desc(\"get_account_balance\"),\n inputSchema: z.object({}),\n execute: async () => {\n const balance = await client.getAccountBalance();\n return balance;\n },\n }),\n\n list_account_movements: tool({\n description: desc(\"list_account_movements\"),\n inputSchema: z.object({\n from: z\n .string()\n .optional()\n .describe(\"ISO 8601 start date (e.g. 2026-05-01)\"),\n to: z\n .string()\n .optional()\n .describe(\"ISO 8601 end date\"),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ from, to, limit, offset }) => {\n const params: Parameters<typeof client.listAccountMovements>[0] = {};\n if (from !== undefined) params.from = from;\n if (to !== undefined) params.to = to;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.listAccountMovements(params);\n },\n }),\n\n list_settlements: tool({\n description: desc(\"list_settlements\"),\n inputSchema: z.object({\n from: z.string().optional(),\n to: z.string().optional(),\n status: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ from, to, status, limit, offset }) => {\n const params: Parameters<typeof client.listSettlements>[0] = {};\n if (from !== undefined) params.from = from;\n if (to !== undefined) params.to = to;\n if (status !== undefined) params.status = status;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.listSettlements(params);\n },\n }),\n\n get_settlement: tool({\n description: desc(\"get_settlement\"),\n inputSchema: z.object({ settlement_id: z.string() }),\n execute: async ({ settlement_id }) => {\n return client.getSettlement(settlement_id);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.6 — 3DS analyzer (combined: fetch payment + analyze)\n // ─────────────────────────────────────────────────────────────────────────\n\n analyze_payment_3ds: tool({\n description: desc(\"analyze_payment_3ds\"),\n inputSchema: z.object({\n payment_id: z.string().describe(\"MP payment id\"),\n }),\n execute: async ({ payment_id }) => {\n const payment = await client.getPayment(payment_id);\n const info = analyze3DS(payment);\n return {\n payment_id,\n payment_status: payment.status,\n payment_status_detail: payment.status_detail ?? null,\n ...info,\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.6 — Test cards (pure)\n // ─────────────────────────────────────────────────────────────────────────\n\n get_test_cards: tool({\n description: desc(\"get_test_cards\"),\n inputSchema: z.object({}),\n execute: async () => {\n return {\n site: \"MLA\",\n cards: TEST_CARDS_AR,\n usage:\n \"Pass holderName='APRO' for an approved payment, 'OTHE' for rejected, 'CONT' for pending, 'FUND' for insufficient amount, 'CALL' for call-for-authorize. Use a NEW payer email per call (append a timestamp) to avoid MP idempotency-on-email deduping.\",\n };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Customer + Card extensions\n // ─────────────────────────────────────────────────────────────────────────\n\n get_customer: tool({\n description: desc(\"get_customer\"),\n inputSchema: z.object({ customer_id: z.string() }),\n execute: async ({ customer_id }) => {\n return client.getCustomer(customer_id);\n },\n }),\n\n update_customer: tool({\n description: desc(\"update_customer\"),\n inputSchema: z.object({\n customer_id: z.string(),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n phone: z\n .object({ area_code: z.string().optional(), number: z.string().optional() })\n .optional(),\n identification: z\n .object({ type: z.string(), number: z.string() })\n .optional(),\n address: z\n .object({\n street_name: z.string().optional(),\n street_number: z.number().optional(),\n zip_code: z.string().optional(),\n })\n .optional(),\n description: z.string().optional(),\n default_card: z.string().optional(),\n }),\n execute: async ({ customer_id, ...patch }) => {\n // Filter out undefined to satisfy exactOptionalPropertyTypes.\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined) cleaned[k] = v;\n }\n return client.updateCustomer(customer_id, cleaned as never);\n },\n }),\n\n create_customer_card: tool({\n description: desc(\"create_customer_card\"),\n inputSchema: z.object({\n customer_id: z.string(),\n card_token: z.string().describe(\"Card token from MP frontend Cardform OR create_card_token.\"),\n }),\n execute: async ({ customer_id, card_token }) => {\n return client.createCustomerCard(customer_id, card_token);\n },\n }),\n\n get_customer_card: tool({\n description: desc(\"get_customer_card\"),\n inputSchema: z.object({\n customer_id: z.string(),\n card_id: z.string(),\n }),\n execute: async ({ customer_id, card_id }) => {\n return client.getCustomerCard(customer_id, card_id);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Subscription / Plan / Refund / Preference extensions\n // ─────────────────────────────────────────────────────────────────────────\n\n get_subscription_plan: tool({\n description: desc(\"get_subscription_plan\"),\n inputSchema: z.object({ plan_id: z.string() }),\n execute: async ({ plan_id }) => {\n return client.getSubscriptionPlan(plan_id);\n },\n }),\n\n update_subscription: tool({\n description: desc(\"update_subscription\"),\n inputSchema: z.object({\n subscription_id: z.string(),\n transaction_amount: z.number().positive().optional(),\n card_token_id: z.string().optional(),\n status: z.enum([\"authorized\", \"paused\", \"cancelled\"]).optional(),\n reason: z.string().optional(),\n external_reference: z.string().optional(),\n }),\n execute: async ({ subscription_id, ...patch }) => {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined) cleaned[k] = v;\n }\n return client.updatePreapproval(subscription_id, cleaned as never);\n },\n }),\n\n search_subscriptions: tool({\n description: desc(\"search_subscriptions\"),\n inputSchema: z.object({\n status: z.string().optional(),\n payer_email: z.string().email().optional(),\n external_reference: z.string().optional(),\n plan_id: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ status, payer_email, external_reference, plan_id, limit, offset }) => {\n const params: Parameters<typeof client.searchPreapprovals>[0] = {};\n if (status !== undefined) params.status = status;\n if (payer_email !== undefined) params.payerEmail = payer_email;\n if (external_reference !== undefined) params.externalReference = external_reference;\n if (plan_id !== undefined) params.preapproval_plan_id = plan_id;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.searchPreapprovals(params);\n },\n }),\n\n get_refund: tool({\n description: desc(\"get_refund\"),\n inputSchema: z.object({\n payment_id: z.string(),\n refund_id: z.string(),\n }),\n execute: async ({ payment_id, refund_id }) => {\n return client.getRefund(payment_id, refund_id);\n },\n }),\n\n update_payment_preference: tool({\n description: desc(\"update_payment_preference\"),\n inputSchema: z.object({\n preference_id: z.string(),\n notification_url: z.string().url().optional(),\n external_reference: z.string().optional(),\n statement_descriptor: z.string().optional(),\n }),\n execute: async ({ preference_id, ...patch }) => {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined) cleaned[k] = v;\n }\n return client.updatePreference(preference_id, cleaned);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Merchant Orders\n // ─────────────────────────────────────────────────────────────────────────\n\n get_merchant_order: tool({\n description: desc(\"get_merchant_order\"),\n inputSchema: z.object({ merchant_order_id: z.string() }),\n execute: async ({ merchant_order_id }) => {\n return client.getMerchantOrder(merchant_order_id);\n },\n }),\n\n search_merchant_orders: tool({\n description: desc(\"search_merchant_orders\"),\n inputSchema: z.object({\n preference_id: z.string().optional(),\n external_reference: z.string().optional(),\n status: z.string().optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ preference_id, external_reference, status, limit, offset }) => {\n const params: Parameters<typeof client.searchMerchantOrders>[0] = {};\n if (preference_id !== undefined) params.preferenceId = preference_id;\n if (external_reference !== undefined) params.externalReference = external_reference;\n if (status !== undefined) params.status = status;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.searchMerchantOrders(params);\n },\n }),\n\n update_merchant_order: tool({\n description: desc(\"update_merchant_order\"),\n inputSchema: z.object({\n merchant_order_id: z.string(),\n patch: z.record(z.string(), z.unknown()),\n }),\n execute: async ({ merchant_order_id, patch }) => {\n return client.updateMerchantOrder(merchant_order_id, patch);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Stores + POS CRUD completion\n // ─────────────────────────────────────────────────────────────────────────\n\n get_store: tool({\n description: desc(\"get_store\"),\n inputSchema: z.object({\n user_id: z.string(),\n store_id: z.string(),\n }),\n execute: async ({ user_id, store_id }) => {\n return client.getStore(user_id, store_id);\n },\n }),\n\n update_store: tool({\n description: desc(\"update_store\"),\n inputSchema: z.object({\n user_id: z.string(),\n store_id: z.string(),\n name: z.string().optional(),\n external_id: z.string().optional(),\n }),\n execute: async ({ user_id, store_id, ...patch }) => {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined) cleaned[k] = v;\n }\n return client.updateStore(user_id, store_id, cleaned as never);\n },\n }),\n\n delete_store: tool({\n description: desc(\"delete_store\"),\n inputSchema: z.object({\n user_id: z.string(),\n store_id: z.string(),\n }),\n execute: async ({ user_id, store_id }) => {\n await client.deleteStore(user_id, store_id);\n return { user_id, store_id, deleted: true };\n },\n }),\n\n get_pos: tool({\n description: desc(\"get_pos\"),\n inputSchema: z.object({ pos_id: z.string() }),\n execute: async ({ pos_id }) => {\n return client.getPos(pos_id);\n },\n }),\n\n update_pos: tool({\n description: desc(\"update_pos\"),\n inputSchema: z.object({\n pos_id: z.string(),\n name: z.string().optional(),\n external_id: z.string().optional(),\n category: z.number().optional(),\n }),\n execute: async ({ pos_id, ...patch }) => {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined) cleaned[k] = v;\n }\n return client.updatePos(pos_id, cleaned as never);\n },\n }),\n\n delete_pos: tool({\n description: desc(\"delete_pos\"),\n inputSchema: z.object({ pos_id: z.string() }),\n execute: async ({ pos_id }) => {\n await client.deletePos(pos_id);\n return { pos_id, deleted: true };\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Bank Accounts\n // ─────────────────────────────────────────────────────────────────────────\n\n list_bank_accounts: tool({\n description: desc(\"list_bank_accounts\"),\n inputSchema: z.object({}),\n execute: async () => {\n const accounts = await client.listBankAccounts();\n return { accounts };\n },\n }),\n\n register_bank_account: tool({\n description: desc(\"register_bank_account\"),\n inputSchema: z.object({\n cbu: z.string().regex(/^\\d{22}$/),\n alias: z.string().optional(),\n }),\n execute: async (input) => {\n const params: Parameters<typeof client.registerBankAccount>[0] = {\n cbu: input.cbu,\n };\n if (input.alias !== undefined) params.alias = input.alias;\n return client.registerBankAccount(params);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Point Devices físicos\n // ─────────────────────────────────────────────────────────────────────────\n\n list_point_devices: tool({\n description: desc(\"list_point_devices\"),\n inputSchema: z.object({\n pos_id: z.union([z.string(), z.number()]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().min(0).optional(),\n }),\n execute: async ({ pos_id, limit, offset }) => {\n const params: Parameters<typeof client.listPointDevices>[0] = {};\n if (pos_id !== undefined) params.posId = pos_id;\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n return client.listPointDevices(params);\n },\n }),\n\n update_point_device_mode: tool({\n description: desc(\"update_point_device_mode\"),\n inputSchema: z.object({\n device_id: z.string(),\n operating_mode: z.enum([\"PDV\", \"STANDALONE\"]),\n }),\n execute: async ({ device_id, operating_mode }) => {\n return client.updatePointDeviceOperatingMode(device_id, operating_mode);\n },\n }),\n\n create_point_payment_intent: tool({\n description: desc(\"create_point_payment_intent\"),\n inputSchema: z.object({\n device_id: z.string(),\n amount_centavos: z\n .number()\n .int()\n .positive()\n .describe(\"Amount in CENTAVOS (NOT pesos). 100 = $1, 1000 = $10, 10000 = $100.\"),\n description: z.string().optional(),\n external_reference: z.string().optional(),\n installments: z.number().int().min(1).max(24).optional(),\n installments_cost: z.enum([\"seller\", \"buyer\"]).optional(),\n print_on_terminal: z.boolean().optional(),\n ticket_number: z.string().optional(),\n }),\n execute: async (input) => {\n const params: Parameters<typeof client.createPointPaymentIntent>[1] = {\n amount: input.amount_centavos,\n };\n if (input.description !== undefined) params.description = input.description;\n if (input.external_reference !== undefined) params.externalReference = input.external_reference;\n if (input.installments !== undefined) params.installments = input.installments;\n if (input.installments_cost !== undefined) params.installmentsCost = input.installments_cost;\n if (input.print_on_terminal !== undefined) params.printOnTerminal = input.print_on_terminal;\n if (input.ticket_number !== undefined) params.ticketNumber = input.ticket_number;\n return client.createPointPaymentIntent(input.device_id, params);\n },\n }),\n\n get_point_payment_intent: tool({\n description: desc(\"get_point_payment_intent\"),\n inputSchema: z.object({ intent_id: z.string() }),\n execute: async ({ intent_id }) => {\n return client.getPointPaymentIntent(intent_id);\n },\n }),\n\n cancel_point_payment_intent: tool({\n description: desc(\"cancel_point_payment_intent\"),\n inputSchema: z.object({\n device_id: z.string(),\n intent_id: z.string(),\n }),\n execute: async ({ device_id, intent_id }) => {\n return client.cancelPointPaymentIntent(device_id, intent_id);\n },\n }),\n\n // ─────────────────────────────────────────────────────────────────────────\n // v0.7 — Pure helpers\n // ─────────────────────────────────────────────────────────────────────────\n\n compute_marketplace_fee: tool({\n description: desc(\"compute_marketplace_fee\"),\n inputSchema: z.object({\n amount_ars: z.number().positive(),\n flat_ars: z.number().nonnegative().optional(),\n percent: z.number().min(0).max(100).optional(),\n min_ars: z.number().nonnegative().optional(),\n max_ars: z.number().nonnegative().optional(),\n round: z.boolean().optional(),\n }),\n execute: async (input) => {\n const rule: Parameters<typeof computeMarketplaceFee>[1] = {};\n if (input.flat_ars !== undefined) rule.flatArs = input.flat_ars;\n if (input.percent !== undefined) rule.percent = input.percent;\n if (input.min_ars !== undefined) rule.minArs = input.min_ars;\n if (input.max_ars !== undefined) rule.maxArs = input.max_ars;\n if (input.round !== undefined) rule.round = input.round;\n const fee = computeMarketplaceFee(input.amount_ars, rule);\n return {\n amount_ars: input.amount_ars,\n marketplace_fee: fee,\n seller_receives: input.amount_ars - fee,\n rule_applied: rule,\n };\n },\n }),\n\n explain_payment_status: tool({\n description: desc(\"explain_payment_status\"),\n inputSchema: z.object({\n payment_id: z.string().optional().describe(\"If provided, fetches the Payment first.\"),\n payment: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Alternatively, pass a Payment object directly (saves a network round-trip).\"),\n }),\n execute: async ({ payment_id, payment }) => {\n let p: import(\"./types\").Payment;\n if (payment) {\n p = payment as unknown as import(\"./types\").Payment;\n } else if (payment_id) {\n p = await client.getPayment(payment_id);\n } else {\n return {\n ok: false,\n error: \"Pass either payment_id or payment.\",\n };\n }\n const explanation = explainPaymentStatus(p);\n return {\n ok: true,\n payment_status: p.status,\n payment_status_detail: p.status_detail ?? null,\n ...explanation,\n };\n },\n }),\n } satisfies ToolSet;\n}\n","/**\n * In-memory record of a subscription. The lib persists the MP-side fields\n * needed to reason about a subscription without hitting the API every time\n * (status, last webhook info, customer email, etc.) plus a free-form metadata\n * bag for callers to attach business context (tenant id, plan name, etc.).\n */\nexport interface SubscriptionStateRecord {\n status?: string;\n payerEmail?: string;\n amount?: number;\n currency?: string;\n frequency?: number;\n frequencyType?: string;\n initPoint?: string;\n externalReference?: string;\n createdAt?: string;\n cancelledAt?: string;\n lastWebhookStatus?: string;\n lastWebhookAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Persistence surface for subscription state. Implementations may back this\n * with Upstash Redis, Vercel KV, Postgres, in-memory, or anything that\n * supports the three operations. The default `InMemoryStateAdapter` is\n * provided for tests and trivial single-process deployments; production\n * setups should plug in a durable store.\n */\nexport interface SubscriptionStateAdapter {\n set(id: string, state: Partial<SubscriptionStateRecord>): Promise<void>;\n get(id: string): Promise<SubscriptionStateRecord | null>;\n list?(): Promise<string[]>;\n}\n\n/**\n * Volatile, single-process state adapter. Useful for tests and demos. Do not\n * use in production: state is lost on restart and is not safe across tenants.\n */\nexport class InMemoryStateAdapter implements SubscriptionStateAdapter {\n private readonly store = new Map<string, SubscriptionStateRecord>();\n\n async set(\n id: string,\n state: Partial<SubscriptionStateRecord>,\n ): Promise<void> {\n const existing = this.store.get(id) ?? {};\n this.store.set(id, { ...existing, ...state });\n }\n\n async get(id: string): Promise<SubscriptionStateRecord | null> {\n return this.store.get(id) ?? null;\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.store.keys());\n }\n\n /** Test helper: drop everything. Not part of the adapter interface. */\n reset(): void {\n this.store.clear();\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.8 — OAuthTokenStore\n//\n// The marketplace OAuth flow needs PERSISTENT storage: after a seller\n// authorizes your app, you get { user_id, access_token, refresh_token,\n// expires_in }. The access_token is short-lived (~6h); the refresh_token\n// is long-lived but rotates on each refresh.\n//\n// In a marketplace setup you have one record PER SELLER, keyed by user_id.\n// Before any per-seller API call you typically:\n// 1. `store.get(user_id)` — fetch the persisted token\n// 2. If `expires_at` is within the skew window → `oauth_refresh_token`\n// → `store.set(user_id, newToken)`\n// 3. Instantiate `new MercadoPagoClient({ accessToken })` AS the seller\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface OAuthTokenRecord {\n user_id: string;\n access_token: string;\n refresh_token: string;\n /** Unix-ms timestamp when access_token expires. */\n expires_at: number;\n /** OAuth scope granted, if any. */\n scope?: string;\n /** Optional: any business metadata you want to attach (tenant id, etc.). */\n metadata?: Record<string, unknown>;\n}\n\nexport interface OAuthTokenStore {\n /** Persist (or update) the token for `user_id`. */\n set(userId: string, token: OAuthTokenRecord): Promise<void>;\n /** Fetch the stored token, or null if no token registered for that seller. */\n get(userId: string): Promise<OAuthTokenRecord | null>;\n /** Forget a seller's token (e.g., they revoked the app). */\n delete(userId: string): Promise<void>;\n /** Optional: enumerate all sellers (useful for batch refresh jobs). */\n list?(): Promise<string[]>;\n}\n\n/**\n * Volatile, single-process OAuth token store. NOT for production marketplace\n * setups — tokens are lost on restart. Plug in `VercelKVOAuthTokenStore`\n * (from `@ar-agents/mercadopago/vercel-kv`) or your own Postgres-backed\n * implementation.\n */\nexport class InMemoryOAuthTokenStore implements OAuthTokenStore {\n private readonly store = new Map<string, OAuthTokenRecord>();\n\n async set(userId: string, token: OAuthTokenRecord): Promise<void> {\n this.store.set(userId, token);\n }\n\n async get(userId: string): Promise<OAuthTokenRecord | null> {\n return this.store.get(userId) ?? null;\n }\n\n async delete(userId: string): Promise<void> {\n this.store.delete(userId);\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.store.keys());\n }\n\n /** Test helper. */\n reset(): void {\n this.store.clear();\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v0.8 — IdempotencyCache\n//\n// Deduplicate REPEATED tool calls with the same `idempotencyKey` — caches\n// the response of the FIRST successful call, returns the cached value on\n// subsequent calls within the TTL window.\n//\n// MP server-side dedup already protects against duplicate transactions\n// (same X-Idempotency-Key header → same response). This client-side cache\n// is layered on top: it short-circuits the network call entirely, saving\n// latency + MP API quota when an agent retries due to LLM non-determinism.\n//\n// Use this carefully: caching is opt-in per-tool because some flows want\n// the network round-trip every time (e.g., status checks).\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface IdempotencyCache {\n /** Get the cached response for a key, or null if not present / expired. */\n get<T>(key: string): Promise<T | null>;\n /**\n * Store a response under `key`. `ttlSeconds` defaults to 24h — match MP's\n * own idempotency window so the cache becomes irrelevant once MP would\n * forget anyway.\n */\n set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;\n /** Forget a cache entry (force a re-fetch on next call). */\n delete(key: string): Promise<void>;\n}\n\n/**\n * Volatile, single-process idempotency cache. Tests + dev only.\n */\nexport class InMemoryIdempotencyCache implements IdempotencyCache {\n private readonly store = new Map<string, { value: unknown; expiresAt: number }>();\n\n async get<T>(key: string): Promise<T | null> {\n const entry = this.store.get(key);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return null;\n }\n return entry.value as T;\n }\n\n async set<T>(key: string, value: T, ttlSeconds = 86_400): Promise<void> {\n this.store.set(key, { value, expiresAt: Date.now() + ttlSeconds * 1000 });\n }\n\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n /** Test helper. */\n reset(): void {\n this.store.clear();\n }\n}\n"]}
|