{"version":3,"sources":["../src/banks.ts","../src/cbu.ts","../src/errors.ts","../src/bcra.ts","../src/bcra-vars.ts","../src/types.ts","../src/tools.ts"],"names":["ArAgentsError","tool","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * BCRA-published list of Argentine banks and PSPs (Proveedores de Servicios\n * de Pago) keyed by their 3-digit entity code (the first 3 digits of a\n * CBU/CVU).\n *\n * # Maintenance\n *\n * BCRA periodically updates the list (new fintechs join, banks merge or\n * rebrand). When a code in the wild isn't in this map, `lookupBankByCode()`\n * returns `null` and `parseCbu()` reports `kind: \"unknown\"` — the CBU may\n * still be structurally valid (the check-digit algorithm is independent of\n * this table). Submit a PR to extend the table when you encounter gaps.\n *\n * # Sources\n *\n * - BCRA \"Tabla de Entidades Financieras\" (annex to its CBU normative)\n * - BCRA \"Listado de Proveedores de Servicios de Pago — Cuentas de Pago\"\n * - Manually verified against issued CBUs/CVUs from each entity\n */\n\nexport type EntityKind = \"cbu\" | \"cvu\";\n\nexport interface BankInfo {\n  /** 3-digit BCRA-assigned code (first 3 digits of the CBU/CVU). */\n  code: string;\n  /** Full Spanish entity name as published by BCRA. */\n  name: string;\n  /** `cbu` for traditional banks, `cvu` for PSPs / virtual accounts. */\n  kind: EntityKind;\n  /**\n   * Optional brand/short name (e.g., \"Mercado Pago\" for the PSP whose legal\n   * name is \"Mercado Pago S.R.L.\"). Use this in user-facing surfaces; use\n   * `name` for compliance / receipts.\n   */\n  shortName?: string;\n}\n\nconst BANKS: BankInfo[] = [\n  // Public / national banks\n  { code: \"007\", name: \"Banco de Galicia y Buenos Aires S.A.U.\", kind: \"cbu\", shortName: \"Banco Galicia\" },\n  { code: \"011\", name: \"Banco de la Nación Argentina\", kind: \"cbu\", shortName: \"Banco Nación\" },\n  { code: \"014\", name: \"Banco de la Provincia de Buenos Aires\", kind: \"cbu\", shortName: \"Banco Provincia\" },\n  { code: \"015\", name: \"Industrial and Commercial Bank of China (Argentina) S.A.\", kind: \"cbu\", shortName: \"ICBC\" },\n  { code: \"016\", name: \"Citibank N.A.\", kind: \"cbu\", shortName: \"Citibank\" },\n  { code: \"017\", name: \"BBVA Banco Francés S.A.\", kind: \"cbu\", shortName: \"BBVA\" },\n  { code: \"018\", name: \"The Bank of Tokyo-Mitsubishi UFJ, Ltd.\", kind: \"cbu\", shortName: \"MUFG\" },\n  { code: \"020\", name: \"Banco de la Provincia de Córdoba S.A.\", kind: \"cbu\", shortName: \"Bancor\" },\n  { code: \"027\", name: \"Banco Supervielle S.A.\", kind: \"cbu\", shortName: \"Supervielle\" },\n  { code: \"029\", name: \"Banco de la Ciudad de Buenos Aires\", kind: \"cbu\", shortName: \"Banco Ciudad\" },\n  { code: \"030\", name: \"Central de la República Argentina\", kind: \"cbu\", shortName: \"BCRA\" },\n  { code: \"034\", name: \"Banco Patagonia S.A.\", kind: \"cbu\", shortName: \"Patagonia\" },\n  { code: \"044\", name: \"Banco Hipotecario S.A.\", kind: \"cbu\", shortName: \"Hipotecario\" },\n  { code: \"045\", name: \"Banco de San Juan S.A.\", kind: \"cbu\", shortName: \"Banco San Juan\" },\n  { code: \"046\", name: \"Banco do Brasil S.A.\", kind: \"cbu\", shortName: \"Banco do Brasil\" },\n  { code: \"060\", name: \"Banco del Tucumán S.A.\", kind: \"cbu\", shortName: \"Banco Tucumán\" },\n  { code: \"065\", name: \"Banco Municipal de Rosario\", kind: \"cbu\", shortName: \"BMR\" },\n  { code: \"072\", name: \"Banco Santander Argentina S.A.\", kind: \"cbu\", shortName: \"Santander\" },\n  { code: \"083\", name: \"Banco del Chubut S.A.\", kind: \"cbu\", shortName: \"Banco Chubut\" },\n  { code: \"086\", name: \"Banco de Santa Cruz S.A.\", kind: \"cbu\", shortName: \"Banco Santa Cruz\" },\n  { code: \"093\", name: \"Banco de la Pampa Sociedad de Economía Mixta\", kind: \"cbu\", shortName: \"Banco Pampa\" },\n  { code: \"094\", name: \"Banco de Corrientes S.A.\", kind: \"cbu\", shortName: \"Banco Corrientes\" },\n  { code: \"097\", name: \"Banco Provincia del Neuquén S.A.\", kind: \"cbu\", shortName: \"BPN\" },\n  { code: \"143\", name: \"Brubank S.A.U.\", kind: \"cbu\", shortName: \"Brubank\" },\n  { code: \"147\", name: \"Banco Interfinanzas S.A.\", kind: \"cbu\", shortName: \"Interfinanzas\" },\n  { code: \"150\", name: \"HSBC Bank Argentina S.A.\", kind: \"cbu\", shortName: \"HSBC\" },\n  { code: \"165\", name: \"JP Morgan Chase Bank N.A.\", kind: \"cbu\", shortName: \"JPMorgan\" },\n  { code: \"191\", name: \"Banco Credicoop Cooperativo Limitado\", kind: \"cbu\", shortName: \"Credicoop\" },\n  { code: \"198\", name: \"Banco de Valores S.A.\", kind: \"cbu\", shortName: \"Banco Valores\" },\n  { code: \"247\", name: \"Banco Roela S.A.\", kind: \"cbu\", shortName: \"Roela\" },\n  { code: \"254\", name: \"Banco Mariva S.A.\", kind: \"cbu\", shortName: \"Mariva\" },\n  { code: \"259\", name: \"Banco Itaú Argentina S.A.\", kind: \"cbu\", shortName: \"Itaú\" },\n  { code: \"262\", name: \"Bank of America N.A.\", kind: \"cbu\", shortName: \"BofA\" },\n  { code: \"266\", name: \"BNP Paribas\", kind: \"cbu\", shortName: \"BNP Paribas\" },\n  { code: \"268\", name: \"Banco Provincia de Tierra del Fuego\", kind: \"cbu\", shortName: \"BPTF\" },\n  { code: \"269\", name: \"Banco de la República Oriental del Uruguay\", kind: \"cbu\", shortName: \"BROU\" },\n  { code: \"277\", name: \"Banco Sáenz S.A.\", kind: \"cbu\", shortName: \"Sáenz\" },\n  { code: \"281\", name: \"Banco Meridian S.A.\", kind: \"cbu\", shortName: \"Meridian\" },\n  { code: \"285\", name: \"Banco Macro S.A.\", kind: \"cbu\", shortName: \"Macro\" },\n  { code: \"295\", name: \"American Express Bank Ltd. S.A.\", kind: \"cbu\", shortName: \"American Express\" },\n  { code: \"299\", name: \"Banco Comafi S.A.\", kind: \"cbu\", shortName: \"Comafi\" },\n  { code: \"300\", name: \"Banco de Inversión y Comercio Exterior S.A.\", kind: \"cbu\", shortName: \"BICE\" },\n  { code: \"301\", name: \"Banco Piano S.A.\", kind: \"cbu\", shortName: \"Piano\" },\n  { code: \"305\", name: \"Banco Julio S.A.\", kind: \"cbu\", shortName: \"Julio\" },\n  { code: \"309\", name: \"Nuevo Banco de la Rioja S.A.\", kind: \"cbu\", shortName: \"Nuevo Banco La Rioja\" },\n  { code: \"310\", name: \"Banco del Sol S.A.\", kind: \"cbu\", shortName: \"Banco del Sol\" },\n  { code: \"311\", name: \"Nuevo Banco del Chaco S.A.\", kind: \"cbu\", shortName: \"Nuevo Banco Chaco\" },\n  { code: \"312\", name: \"Banco VOII S.A.\", kind: \"cbu\", shortName: \"Voii\" },\n  { code: \"315\", name: \"Banco de Formosa S.A.\", kind: \"cbu\", shortName: \"Banco Formosa\" },\n  { code: \"319\", name: \"Banco CMF S.A.\", kind: \"cbu\", shortName: \"CMF\" },\n  { code: \"321\", name: \"Banco de Santiago del Estero S.A.\", kind: \"cbu\", shortName: \"Banco Santiago del Estero\" },\n  { code: \"322\", name: \"Banco Industrial S.A.\", kind: \"cbu\", shortName: \"Industrial\" },\n  { code: \"330\", name: \"Nuevo Banco de Santa Fe S.A.\", kind: \"cbu\", shortName: \"Nuevo Banco Santa Fe\" },\n  { code: \"331\", name: \"Banco Cetelem Argentina S.A.\", kind: \"cbu\", shortName: \"Cetelem\" },\n  { code: \"332\", name: \"Banco de Servicios Financieros S.A.\", kind: \"cbu\", shortName: \"BSF\" },\n  { code: \"336\", name: \"Banco Bradesco Argentina S.A.U.\", kind: \"cbu\", shortName: \"Bradesco\" },\n  { code: \"338\", name: \"Banco de Servicios y Transacciones S.A.\", kind: \"cbu\", shortName: \"BST\" },\n  { code: \"339\", name: \"RCI Banque S.A.\", kind: \"cbu\", shortName: \"RCI Banque\" },\n  { code: \"340\", name: \"BACS Banco de Crédito y Securitización S.A.\", kind: \"cbu\", shortName: \"BACS\" },\n  { code: \"341\", name: \"Banco Más Ventas S.A.\", kind: \"cbu\", shortName: \"Más Ventas\" },\n  { code: \"384\", name: \"Wilobank S.A.\", kind: \"cbu\", shortName: \"Wilobank\" },\n  { code: \"386\", name: \"Nuevo Banco de Entre Ríos S.A.\", kind: \"cbu\", shortName: \"Nuevo Banco Entre Ríos\" },\n  { code: \"389\", name: \"Banco Columbia S.A.\", kind: \"cbu\", shortName: \"Columbia\" },\n  { code: \"405\", name: \"Form S.A.\", kind: \"cbu\", shortName: \"Form\" },\n  { code: \"426\", name: \"Banco Bica S.A.\", kind: \"cbu\", shortName: \"Bica\" },\n  { code: \"431\", name: \"Banco Coinag S.A.\", kind: \"cbu\", shortName: \"Coinag\" },\n  { code: \"432\", name: \"Banco de Comercio S.A.\", kind: \"cbu\", shortName: \"Comercio\" },\n  { code: \"434\", name: \"Banco Reba S.A.\", kind: \"cbu\", shortName: \"Reba\" },\n  { code: \"437\", name: \"Banco Provincial de la Provincia de Salta\", kind: \"cbu\", shortName: \"Banco Salta\" },\n  { code: \"438\", name: \"Compañía Financiera Argentina S.A. (Efectivo Sí)\", kind: \"cbu\", shortName: \"Efectivo Sí\" },\n  { code: \"439\", name: \"Banco Rombo S.A.\", kind: \"cbu\", shortName: \"Rombo\" },\n  { code: \"440\", name: \"Banco Piano S.A.\", kind: \"cbu\", shortName: \"Piano\" },\n  { code: \"441\", name: \"Banco Julio S.A.\", kind: \"cbu\", shortName: \"Julio\" },\n  { code: \"443\", name: \"Banco Cofidis S.A.\", kind: \"cbu\", shortName: \"Cofidis\" },\n  { code: \"445\", name: \"Banco Cordial S.A.\", kind: \"cbu\", shortName: \"Cordial\" },\n  { code: \"448\", name: \"Banco Dino S.A.\", kind: \"cbu\", shortName: \"Dino\" },\n  { code: \"453\", name: \"Banco PSA Finance Argentina S.A.\", kind: \"cbu\", shortName: \"PSA Finance\" },\n  { code: \"515\", name: \"Banco Toyota Compañía Financiera S.A.\", kind: \"cbu\", shortName: \"Toyota\" },\n\n  // PSPs / Fintechs (CVU codes — heuristic; BCRA list of payment service providers)\n  { code: \"143\", name: \"Brubank S.A.U.\", kind: \"cvu\", shortName: \"Brubank\" }, // also bank\n  { code: \"384\", name: \"Wilobank S.A.\", kind: \"cvu\", shortName: \"Wilobank\" }, // also bank\n  // Note: most PSPs use CVUs that start with \"000\" + a 4-digit subcode. The\n  // first 3 digits (the \"code\" field of this table) is \"000\" for those, and\n  // the discriminating prefix is the 4-digit subcode at positions 3-7. We\n  // detect those via `lookupCvuByPrefix()` instead.\n];\n\n/**\n * PSPs (CVU issuers) keyed by the FULL first-7-digit prefix of the CVU\n * (entity 000 + 4-digit fintech subcode). Use `lookupCvuByPrefix()` to find\n * the issuer for a given CVU; standard `lookupBankByCode()` won't help\n * because every PSP shares entity code 000.\n */\nconst PSPS_BY_PREFIX: Record<string, BankInfo> = {\n  \"0000003\": { code: \"0000003\", name: \"Mercado Pago S.R.L.\", kind: \"cvu\", shortName: \"Mercado Pago\" },\n  \"0000031\": { code: \"0000031\", name: \"Mercado Pago S.R.L.\", kind: \"cvu\", shortName: \"Mercado Pago\" },\n  \"0000007\": { code: \"0000007\", name: \"Ualá (Bancar Technologies S.A.)\", kind: \"cvu\", shortName: \"Ualá\" },\n  \"0000058\": { code: \"0000058\", name: \"Naranja X (Tarjeta Naranja S.A.U.)\", kind: \"cvu\", shortName: \"Naranja X\" },\n  \"0000074\": { code: \"0000074\", name: \"Personal Pay (Telecom Argentina S.A.)\", kind: \"cvu\", shortName: \"Personal Pay\" },\n  \"0000075\": { code: \"0000075\", name: \"Cuenta DNI (Banco Provincia)\", kind: \"cvu\", shortName: \"Cuenta DNI\" },\n  \"0000172\": { code: \"0000172\", name: \"Belo (BeloCoin S.A.)\", kind: \"cvu\", shortName: \"Belo\" },\n  \"0000273\": { code: \"0000273\", name: \"Prex (Prex Argentina S.A.)\", kind: \"cvu\", shortName: \"Prex\" },\n};\n\nconst BANKS_BY_CODE: Map<string, BankInfo> = (() => {\n  const map = new Map<string, BankInfo>();\n  // Iterate in order; the first occurrence wins (so traditional bank entries\n  // beat duplicate-code CVU entries). Brubank is duplicated intentionally for\n  // both kinds; downstream `parseCbu()` distinguishes via prefix lookup too.\n  for (const bank of BANKS) {\n    if (!map.has(bank.code)) map.set(bank.code, bank);\n  }\n  return map;\n})();\n\n/**\n * Look up a bank/PSP by its 3-digit entity code (the first 3 digits of a\n * CBU). Returns `null` when the code isn't in the table.\n *\n * For CVUs (entity code 000), this returns null — use `lookupCvuByPrefix()`\n * with the 7-digit prefix (000 + 4-digit fintech subcode) instead.\n */\nexport function lookupBankByCode(code: string): BankInfo | null {\n  return BANKS_BY_CODE.get(code) ?? null;\n}\n\n/**\n * Look up a CVU issuer (PSP/fintech) by the 7-digit prefix of the CVU,\n * which is `000` plus the 4-digit fintech subcode. Use this to identify\n * which PSP issued a CVU starting with `000`.\n *\n * Returns `null` when the prefix isn't in the table — the CVU may still be\n * structurally valid (BCRA's PSP list evolves quickly).\n *\n * @example\n * lookupCvuByPrefix(\"0000031\") // → { name: \"Mercado Pago...\", kind: \"cvu\", ... }\n */\nexport function lookupCvuByPrefix(prefix7: string): BankInfo | null {\n  return PSPS_BY_PREFIX[prefix7] ?? null;\n}\n\n/**\n * Returns all known banks/entities. Useful for UIs that render a select\n * dropdown of banks. Sorted by code.\n */\nexport function listBanks(): BankInfo[] {\n  return [...BANKS_BY_CODE.values()].sort((a, b) =>\n    a.code.localeCompare(b.code),\n  );\n}\n\n/**\n * Returns all known PSP issuers (keyed by 7-digit prefix). Useful for UIs\n * that render a select dropdown of fintech wallets.\n */\nexport function listPsps(): BankInfo[] {\n  return Object.values(PSPS_BY_PREFIX).sort((a, b) =>\n    a.code.localeCompare(b.code),\n  );\n}\n","/**\n * Pure-algorithm CBU/CVU validation and parsing for Argentine bank accounts.\n *\n * # Background (for agents picking this lib)\n *\n * **CBU** (Clave Bancaria Uniforme) is the standardized 22-digit identifier\n * for AR bank accounts (Banco Nación, Galicia, Santander, etc.).\n * **CVU** (Clave Virtual Uniforme) is the same format but issued by PSPs\n * (Mercado Pago, Ualá, Brubank, Naranja X, etc.) — non-bank financial\n * services regulated by the BCRA.\n *\n * Both share the same structure and the same check-digit algorithm — the\n * only difference is the bank/entity code prefix in the first 3 digits:\n * - **001-499**: traditional banks (BCRA-assigned, see `banks.ts`)\n * - **000 + 4-digit fintech code**: PSP/PSPCP virtual accounts\n *\n * # Format\n *\n * 22 digits split into two blocks:\n * - **Block 1 (8 digits)**: `BBB-SSSS-V₁`\n *   - `BBB` = 3-digit entity code\n *   - `SSSS` = 4-digit branch code (sucursal)\n *   - `V₁` = block-1 check digit\n * - **Block 2 (14 digits)**: `<account-13>-V₂`\n *   - `account-13` = 13-digit account number\n *   - `V₂` = block-2 check digit\n *\n * # Check digit algorithm (BCRA spec)\n *\n * **Block 1 check digit (V₁)**:\n *   - Weights: `[7, 1, 3, 9, 7, 1, 3]` applied to digits 1-7 of block 1\n *   - sum = Σ(digit × weight)\n *   - V₁ = `(10 - (sum mod 10)) mod 10`\n *\n * **Block 2 check digit (V₂)**:\n *   - Weights: `[3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3]` applied to digits\n *     1-13 of block 2\n *   - sum = Σ(digit × weight)\n *   - V₂ = `(10 - (sum mod 10)) mod 10`\n *\n * # When to use this module\n *\n * Use these functions when you need to detect typos in a CBU/CVU or extract\n * the bank/branch/account components WITHOUT contacting a bank or BCRA.\n * They're pure functions (no I/O, no environment dependencies, sub-millisecond)\n * and always safe to call.\n *\n * # Common pitfall\n *\n * Users paste CBUs in many shapes: `0070000-30000123456789`, with spaces,\n * with hyphens. Always pass the user's input directly to `parseCbu()` — it\n * normalizes by stripping non-digits before validating.\n */\n\nimport { lookupBankByCode, lookupCvuByPrefix, type BankInfo } from \"./banks\";\n\nconst BLOCK1_WEIGHTS = [7, 1, 3, 9, 7, 1, 3] as const;\nconst BLOCK2_WEIGHTS = [3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3] as const;\n\n/**\n * Whether this CBU/CVU is a traditional bank CBU (entity code 001-499) or\n * a PSP virtual CVU (entity code 000-prefix).\n *\n * - `cbu`: traditional bank — BBB code is the BCRA-assigned bank code.\n * - `cvu`: PSP virtual account — typically code 000 + 4-digit fintech code,\n *   though some PSPs use codes in the 300+ range. Distinction is heuristic.\n * - `unknown`: bank code not in the lookup table (could be either).\n */\nexport type CbuKind = \"cbu\" | \"cvu\" | \"unknown\";\n\n/**\n * Structured result of parsing a CBU/CVU. The `valid` field is the bottom\n * line; the other fields exist to let callers explain WHY a CBU failed\n * (typo? wrong length? bad block-1 check? bad block-2 check?) instead of\n * just rejecting opaquely.\n */\nexport interface CbuParseResult {\n  /**\n   * True iff the CBU passes ALL validations: 22 digits, block-1 check\n   * digit matches, block-2 check digit matches. When false, see `error`.\n   */\n  valid: boolean;\n  /** Bare 22 digits with no separators. Always present even when invalid. */\n  normalized: string;\n  /** Pretty-printed `BBBSSSSV-AAAAAAAAAAAAAV`. Null when length isn't 22. */\n  formatted: string | null;\n  /** 3-digit entity (bank or PSP) code. Null when length isn't 22. */\n  entityCode: string | null;\n  /** 4-digit branch code (sucursal). Null when length isn't 22. */\n  branchCode: string | null;\n  /** 13-digit account number. Null when length isn't 22. */\n  accountNumber: string | null;\n  /** Block-1 check digit (as written). Null when length isn't 22. */\n  block1CheckDigit: string | null;\n  /** Block-2 check digit (as written). Null when length isn't 22. */\n  block2CheckDigit: string | null;\n  /**\n   * `cbu` if the entity code maps to a traditional bank, `cvu` if it maps\n   * to a known PSP, `unknown` if the code is unrecognized (still possibly\n   * valid — the BCRA list evolves).\n   */\n  kind: CbuKind;\n  /**\n   * Bank/entity info from the lookup table, or `null` if the entity code\n   * isn't in the table. Use `kind` together with this — `kind === \"unknown\"`\n   * implies `bank === null`.\n   */\n  bank: BankInfo | null;\n  /**\n   * Spanish error message when invalid. ALWAYS surface this verbatim to end\n   * users — it's actionable (e.g., \"Bloque 1 dígito verificador inválido.\n   * Esperado: 0, recibido: 7. Probablemente hay un typo.\").\n   */\n  error: string | null;\n}\n\n/**\n * Strip every non-digit character. CBU/CVU inputs from end users come in\n * many shapes (`0070000-30000123456789`, `00700003 00001234567890`, etc.);\n * normalize before validating.\n *\n * @example\n * normalizeCbu(\"0070000-30000123456789\") // → \"00700003000012345678901\" — wait, lengths\n */\nexport function normalizeCbu(input: string): string {\n  return input.replace(/\\D/g, \"\");\n}\n\n/**\n * Compute the BCRA mod-10 check digit for a block of digits with the given\n * weights. Returns `null` when input has unexpected length or non-digits.\n *\n * @internal exposed for testing — most callers should use `parseCbu()`.\n */\nexport function computeBlockCheckDigit(\n  digits: string,\n  weights: readonly number[],\n): number | null {\n  if (digits.length !== weights.length) return null;\n  if (!/^\\d+$/.test(digits)) return null;\n  const sum = weights.reduce(\n    (acc, weight, i) => acc + weight * Number(digits[i]),\n    0,\n  );\n  return (10 - (sum % 10)) % 10;\n}\n\n/**\n * Parse and validate a CBU/CVU. The PRIMARY entrypoint of this module.\n *\n * @param input The CBU/CVU in any format (with/without separators, spaces, hyphens).\n * @returns A `CbuParseResult` with `valid: true|false` plus structural details.\n *\n * @example\n * parseCbu(\"0070055530005571000018\")\n * // { valid: true, normalized: \"0070055530005571000018\",\n * //   entityCode: \"007\", branchCode: \"0055\", ..., kind: \"cbu\",\n * //   bank: { code: \"007\", name: \"Banco Santander Argentina\" } }\n */\nexport function parseCbu(input: string): CbuParseResult {\n  const normalized = normalizeCbu(input ?? \"\");\n\n  if (normalized.length === 0) {\n    return failure(normalized, \"CBU/CVU vacío.\");\n  }\n  if (normalized.length !== 22) {\n    return failure(\n      normalized,\n      `Debe tener 22 dígitos; recibí ${normalized.length}.`,\n    );\n  }\n\n  const block1 = normalized.slice(0, 8);\n  const block2 = normalized.slice(8, 22);\n  const entityCode = block1.slice(0, 3);\n  const branchCode = block1.slice(3, 7);\n  const block1CheckDigit = block1.slice(7, 8);\n  const accountNumber = block2.slice(0, 13);\n  const block2CheckDigit = block2.slice(13, 14);\n  const formatted = `${block1}-${block2}`;\n\n  const expected1 = computeBlockCheckDigit(\n    block1.slice(0, 7),\n    BLOCK1_WEIGHTS,\n  );\n  if (expected1 === null) {\n    return {\n      valid: false,\n      normalized,\n      formatted,\n      entityCode,\n      branchCode,\n      accountNumber,\n      block1CheckDigit,\n      block2CheckDigit,\n      kind: \"unknown\",\n      bank: null,\n      error: \"No se pudo calcular el dígito verificador del bloque 1.\",\n    };\n  }\n  if (Number(block1CheckDigit) !== expected1) {\n    return {\n      valid: false,\n      normalized,\n      formatted,\n      entityCode,\n      branchCode,\n      accountNumber,\n      block1CheckDigit,\n      block2CheckDigit,\n      kind: classifyKind(entityCode),\n      bank: resolveEntity(normalized),\n      error: `Bloque 1 dígito verificador inválido. Esperado: ${expected1}, recibido: ${block1CheckDigit}. Probablemente hay un typo en los primeros 8 dígitos del CBU.`,\n    };\n  }\n\n  const expected2 = computeBlockCheckDigit(\n    block2.slice(0, 13),\n    BLOCK2_WEIGHTS,\n  );\n  if (expected2 === null) {\n    return {\n      valid: false,\n      normalized,\n      formatted,\n      entityCode,\n      branchCode,\n      accountNumber,\n      block1CheckDigit,\n      block2CheckDigit,\n      kind: classifyKind(entityCode),\n      bank: resolveEntity(normalized),\n      error: \"No se pudo calcular el dígito verificador del bloque 2.\",\n    };\n  }\n  if (Number(block2CheckDigit) !== expected2) {\n    return {\n      valid: false,\n      normalized,\n      formatted,\n      entityCode,\n      branchCode,\n      accountNumber,\n      block1CheckDigit,\n      block2CheckDigit,\n      kind: classifyKind(entityCode),\n      bank: resolveEntity(normalized),\n      error: `Bloque 2 dígito verificador inválido. Esperado: ${expected2}, recibido: ${block2CheckDigit}. Probablemente hay un typo en los últimos 14 dígitos del CBU.`,\n    };\n  }\n\n  return {\n    valid: true,\n    normalized,\n    formatted,\n    entityCode,\n    branchCode,\n    accountNumber,\n    block1CheckDigit,\n    block2CheckDigit,\n    kind: classifyKind(entityCode),\n    bank: resolveEntity(normalized),\n    error: null,\n  };\n}\n\n/**\n * Convenience: returns just the boolean. Use `parseCbu()` when you need the\n * structured details (almost always — agents should explain WHY a CBU\n * failed to end users, not just reject it).\n */\nexport function isValidCbu(input: string): boolean {\n  return parseCbu(input).valid;\n}\n\nfunction classifyKind(entityCode: string): CbuKind {\n  // CVUs use the special \"000\" entity code — they're always virtual accounts\n  // (PSPs), even when we don't have the specific PSP in our prefix table.\n  if (entityCode === \"000\") return \"cvu\";\n  const bank = lookupBankByCode(entityCode);\n  if (!bank) return \"unknown\";\n  return bank.kind;\n}\n\n/**\n * Look up the entity behind a CBU/CVU. Tries the 3-digit bank code first,\n * then falls back to the 7-digit CVU prefix (000 + 4-digit PSP subcode).\n *\n * @internal called by parseCbu — most callers should use parseCbu directly.\n */\nfunction resolveEntity(normalized22: string): BankInfo | null {\n  const entityCode = normalized22.slice(0, 3);\n  if (entityCode === \"000\") {\n    return lookupCvuByPrefix(normalized22.slice(0, 7));\n  }\n  return lookupBankByCode(entityCode);\n}\n\nfunction failure(normalized: string, error: string): CbuParseResult {\n  return {\n    valid: false,\n    normalized,\n    formatted: null,\n    entityCode: null,\n    branchCode: null,\n    accountNumber: null,\n    block1CheckDigit: null,\n    block2CheckDigit: null,\n    kind: \"unknown\",\n    bank: null,\n    error,\n  };\n}\n","/**\n * Errors emitted by `@ar-agents/banking` adapters and helpers.\n *\n * Extends `ArAgentsError` from `@ar-agents/core` so the family contract\n * (code / retryable / context) is uniform.\n */\n\nimport { ArAgentsError } from \"@ar-agents/core\";\n\nexport type BankingErrorCode =\n  | \"bcra_not_configured\"\n  | \"bcra_cuit_not_found\"\n  | \"bcra_service_unavailable\"\n  | \"bcra_rate_limited\"\n  | \"bcra_unknown_error\"\n  | \"bcra_vars_not_configured\"\n  | \"bcra_vars_unavailable\";\n\nconst RETRYABLE_CODES: Record<BankingErrorCode, boolean> = {\n  bcra_not_configured: false,\n  bcra_cuit_not_found: false,\n  bcra_service_unavailable: true,\n  bcra_rate_limited: true,\n  bcra_unknown_error: false,\n  bcra_vars_not_configured: false,\n  bcra_vars_unavailable: true,\n};\n\nexport class BankingError extends ArAgentsError {\n  override readonly code: BankingErrorCode;\n  readonly details?: unknown;\n\n  constructor(code: BankingErrorCode, message: string, details?: unknown) {\n    super(message, {\n      code,\n      retryable: RETRYABLE_CODES[code] ?? false,\n      context: details !== undefined ? { details } : {},\n    });\n    this.name = \"BankingError\";\n    this.code = code;\n    this.details = details;\n  }\n}\n\n/**\n * Thrown when BCRA Central de Deudores lookup is requested but no adapter\n * is configured. Surface the message verbatim — it explains how to enable.\n */\nexport class BcraNotConfiguredError extends BankingError {\n  constructor() {\n    super(\n      \"bcra_not_configured\",\n      \"BCRA Central de Deudores lookup is not configured. To enable, pass a `BcraDeudaAdapter` to `bankingTools()`. The default `BcraPublicApiAdapter` hits BCRA's public REST endpoint with no auth required: `bankingTools({ bcra: new BcraPublicApiAdapter() })`.\",\n    );\n    this.name = \"BcraNotConfiguredError\";\n  }\n}\n\n/**\n * Thrown when BCRA Principales Variables lookup is requested but no\n * adapter is configured. Surface the message verbatim.\n */\nexport class BcraVarsNotConfiguredError extends BankingError {\n  constructor() {\n    super(\n      \"bcra_vars_not_configured\",\n      \"BCRA Principales Variables lookup is not configured. To enable, pass a `BcraVarsAdapter` to `bankingTools()`. The default `BcraVarsPublicApiAdapter` hits BCRA's public REST API (no auth required): `bankingTools({ bcraVars: new BcraVarsPublicApiAdapter() })`.\",\n    );\n    this.name = \"BcraVarsNotConfiguredError\";\n  }\n}\n","/**\n * Adapter contract for BCRA Central de Deudores lookups.\n *\n * # Background (for agents picking this lib)\n *\n * BCRA's \"Central de Deudores del Sistema Financiero\" is a public registry\n * of credit obligations across all AR banks and PSPs. Every CUIT with active\n * or recently active credit (loans, credit cards, mortgages) appears with\n * a \"situación\" code from 1 (normal) to 6 (irrecuperable):\n *\n * - **1 — Normal**: payments on time\n * - **2 — Riesgo bajo**: <90 days past due, observable warning\n * - **3 — Riesgo medio**: 90-180 days past due, real concern\n * - **4 — Riesgo alto**: 180-365 days past due, severe risk\n * - **5 — Irrecuperable**: 365+ days past due, written off\n * - **6 — Irrecuperable disposición técnica**: very rare, BCRA admin write-off\n *\n * The data is updated monthly. There's also `chequesRechazados` (bounced\n * cheques) for additional risk signal.\n *\n * # Why an adapter?\n *\n * BCRA exposes the data through a public REST endpoint\n * (https://api.bcra.gob.ar/centraldedeudores/v1.0/Deudas/{cuit}). The\n * package ships an `UnconfiguredBcraAdapter` (always-fail, always safe to\n * call) and a default `BcraPublicApiAdapter` that hits the public API. You\n * can swap in your own adapter to add caching, fallback, custom retry\n * policies, or to use a private mirror of the data.\n *\n * # When this matters\n *\n * Most agentic billing flows for AR SaaS *don't* need BCRA lookups —\n * Mercado Pago handles credit risk on the SaaS's behalf via its own scoring.\n * This adapter is for B2B agents that need to assess counterparty risk\n * before extending credit, factoring invoices, or onboarding suppliers.\n */\n\nimport { BcraNotConfiguredError } from \"./errors\";\nimport type { BcraDeudaResult } from \"./types\";\n\n/**\n * Adapter contract. Implement this to wire any BCRA-equivalent backend\n * (BCRA public API, NOSIS, Equifax, your in-house cache, mocks for tests).\n */\nexport interface BcraDeudaAdapter {\n  /**\n   * Look up the consolidated debt situation for a CUIT.\n   *\n   * @param cuit Bare 11-digit CUIT (caller normalizes — adapter doesn't).\n   * @returns Always returns a `BcraDeudaResult`; on error, `available: false`\n   *          with an explanatory message in `error`. Does NOT throw for\n   *          known failure modes (CUIT not found, service down) — only\n   *          throws for unexpected errors the caller should handle.\n   */\n  lookup(cuit: string): Promise<BcraDeudaResult>;\n}\n\n/**\n * Default adapter that always returns \"not configured\". Use this when you\n * want the `lookup_credit_situation` tool to be safe to call (no crash) but\n * not actually wired to BCRA — typical for read-only demos or tests.\n *\n * The error message is actionable: it tells the agent / end user how to\n * enable real lookups.\n */\nexport class UnconfiguredBcraAdapter implements BcraDeudaAdapter {\n  async lookup(cuit: string): Promise<BcraDeudaResult> {\n    return {\n      cuit,\n      available: false,\n      error: new BcraNotConfiguredError().message,\n      data: null,\n    };\n  }\n}\n\n/**\n * Default adapter that hits BCRA's public REST API. No authentication\n * required; respect their rate limits.\n *\n * # Endpoint\n * GET https://api.bcra.gob.ar/centraldedeudores/v1.0/Deudas/{cuit}\n *\n * # Response shape (simplified)\n * ```\n * {\n *   \"results\": {\n *     \"identificacion\": 20123456786,\n *     \"denominacion\": \"PEREZ JUAN\",\n *     \"periodos\": [{\n *       \"periodo\": \"202604\",\n *       \"entidades\": [{\n *         \"entidad\": \"BANCO MACRO S.A.\",\n *         \"situacion\": 1,\n *         \"monto\": 35.5,\n *         ...\n *       }]\n *     }]\n *   }\n * }\n * ```\n *\n * Returns `available: false` cleanly when:\n * - CUIT not in BCRA registry (HTTP 404)\n * - Service unavailable (5xx)\n * - Network error\n */\nexport class BcraPublicApiAdapter implements BcraDeudaAdapter {\n  private readonly endpoint: string;\n  private readonly fetchImpl: typeof fetch;\n  private readonly requestTimeoutMs: number;\n  private readonly maxRetries: number;\n  private readonly onCall:\n    | ((event: {\n        label: string;\n        durationMs: number;\n        httpStatus: number | null;\n        retried: number;\n        success: boolean;\n      }) => void)\n    | undefined;\n\n  constructor(options: BcraPublicApiAdapterOptions = {}) {\n    this.endpoint =\n      options.endpoint ??\n      \"https://api.bcra.gob.ar/centraldedeudores/v1.0/Deudas\";\n    this.fetchImpl = options.fetchImpl ?? globalThis.fetch.bind(globalThis);\n    this.requestTimeoutMs = options.requestTimeoutMs ?? 30_000;\n    this.maxRetries = options.maxRetries ?? 1;\n    this.onCall = options.onCall;\n  }\n\n  async lookup(cuit: string): Promise<BcraDeudaResult> {\n    const url = `${this.endpoint}/${cuit}`;\n    let lastErr: unknown = null;\n    for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n      const start = Date.now();\n      const controller = new AbortController();\n      const timer = setTimeout(\n        () => controller.abort(),\n        this.requestTimeoutMs,\n      );\n      try {\n        const res = await this.fetchImpl(url, {\n          method: \"GET\",\n          headers: { Accept: \"application/json\" },\n          signal: controller.signal,\n        });\n        clearTimeout(timer);\n        const httpStatus = res.status;\n\n        if (res.status === 404) {\n          this.onCall?.({\n            label: \"bcra.deudas.lookup\",\n            durationMs: Date.now() - start,\n            httpStatus,\n            retried: attempt,\n            success: true, // 404 is a clean \"not found\" response, not an error\n          });\n          return {\n            cuit,\n            available: false,\n            error: `BCRA no tiene registro del CUIT ${cuit} en la Central de Deudores. Puede ser un CUIT sin antecedentes crediticios o sin movimiento reciente.`,\n            data: null,\n          };\n        }\n\n        if (res.status >= 500 && attempt < this.maxRetries) {\n          // Retryable\n          this.onCall?.({\n            label: \"bcra.deudas.lookup\",\n            durationMs: Date.now() - start,\n            httpStatus,\n            retried: attempt,\n            success: false,\n          });\n          await new Promise((r) => setTimeout(r, 250 * (attempt + 1)));\n          continue;\n        }\n\n        if (!res.ok) {\n          this.onCall?.({\n            label: \"bcra.deudas.lookup\",\n            durationMs: Date.now() - start,\n            httpStatus,\n            retried: attempt,\n            success: false,\n          });\n          return {\n            cuit,\n            available: false,\n            error: `BCRA respondió HTTP ${res.status}. ${await safeText(res)}`,\n            data: null,\n          };\n        }\n\n        const json = (await res.json()) as { results?: BcraApiResults };\n        this.onCall?.({\n          label: \"bcra.deudas.lookup\",\n          durationMs: Date.now() - start,\n          httpStatus,\n          retried: attempt,\n          success: true,\n        });\n\n        if (!json.results) {\n          return {\n            cuit,\n            available: false,\n            error: `Respuesta BCRA sin campo \\\"results\\\" para CUIT ${cuit}.`,\n            data: null,\n          };\n        }\n\n        return {\n          cuit,\n          available: true,\n          error: null,\n          data: normalizeBcraResult(json.results),\n        };\n      } catch (err) {\n        clearTimeout(timer);\n        lastErr = err;\n        const isAbort =\n          err instanceof Error &&\n          (err.name === \"AbortError\" || err.message.includes(\"aborted\"));\n        this.onCall?.({\n          label: \"bcra.deudas.lookup\",\n          durationMs: Date.now() - start,\n          httpStatus: null,\n          retried: attempt,\n          success: false,\n        });\n        if (attempt < this.maxRetries && !isAbort) {\n          await new Promise((r) => setTimeout(r, 250 * (attempt + 1)));\n          continue;\n        }\n        return {\n          cuit,\n          available: false,\n          error: `Error contactando BCRA: ${err instanceof Error ? err.message : String(err)}.`,\n          data: null,\n        };\n      }\n    }\n    return {\n      cuit,\n      available: false,\n      error: `Error contactando BCRA tras ${this.maxRetries + 1} intentos: ${lastErr instanceof Error ? lastErr.message : String(lastErr)}.`,\n      data: null,\n    };\n  }\n}\n\nexport interface BcraPublicApiAdapterOptions {\n  /** Override the BCRA endpoint base (testing only). */\n  endpoint?: string;\n  /** Custom fetch (testing). */\n  fetchImpl?: typeof fetch;\n  /** Per-request timeout in ms. Default 30s. */\n  requestTimeoutMs?: number;\n  /** Retries on 5xx + transient errors. Default 1. */\n  maxRetries?: number;\n  /** Observability hook fired after every request. */\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\ninterface BcraApiResults {\n  identificacion: number;\n  denominacion?: string;\n  periodos?: Array<{\n    periodo: string;\n    entidades?: Array<{\n      entidad?: string;\n      situacion?: number;\n      fechaSit1?: string;\n      monto?: number;\n      diasAtrasoPago?: number;\n      refinanciaciones?: string;\n      recategorizacionOblig?: string;\n      situacionJuridica?: string;\n      irrecDisposicionTecnica?: string;\n      enRevision?: string;\n      procesoJud?: string;\n    }>;\n  }>;\n}\n\nfunction normalizeBcraResult(\n  results: BcraApiResults,\n): BcraDeudaResult[\"data\"] {\n  const periods = results.periodos ?? [];\n  const latestPeriod = periods[0];\n  const entities = (latestPeriod?.entidades ?? []).map((e) => ({\n    entity: e.entidad ?? \"Desconocido\",\n    situation: clampSituation(e.situacion ?? 0),\n    amount: e.monto ?? 0,\n    daysOverdue: e.diasAtrasoPago ?? 0,\n    refinanced: e.refinanciaciones === \"S\",\n    inReview: e.enRevision === \"S\",\n    inLitigation: e.procesoJud === \"S\",\n  }));\n  let worst: 0 | 1 | 2 | 3 | 4 | 5 | 6 = 0;\n  let total = 0;\n  for (const e of entities) {\n    if (e.situation > worst) worst = e.situation;\n    total += e.amount;\n  }\n  return {\n    name: results.denominacion ?? \"\",\n    period: latestPeriod?.periodo ?? \"\",\n    worstSituation: worst,\n    totalAmount: total,\n    entities,\n  };\n}\n\nfunction clampSituation(n: number): 0 | 1 | 2 | 3 | 4 | 5 | 6 {\n  if (n <= 0) return 0;\n  if (n >= 6) return 6;\n  return Math.floor(n) as 1 | 2 | 3 | 4 | 5;\n}\n\nasync function safeText(res: Response): Promise<string> {\n  try {\n    return (await res.text()).slice(0, 200);\n  } catch {\n    return \"\";\n  }\n}\n","/**\n * BCRA \"Principales Variables\" — the open REST API every Argentine fintech\n * needs. Tipo de cambio, CER, UVA, reservas internacionales, BADLAR, tasa\n * de política monetaria, inflación.\n *\n * # Endpoint\n *\n * Base: `https://api.bcra.gob.ar/estadisticas/v3.0`\n *\n * - `GET /Monetarias` — list of all available variables (id + descripción).\n * - `GET /Monetarias/{idVariable}` — time series for a single variable.\n *\n * No authentication. CORS-enabled. Rate-limited per IP (~60 req/min).\n *\n * # Why an adapter?\n *\n * Same pattern as `@ar-agents/banking`'s BCRA Central de Deudores: ship\n * `UnconfiguredBcraVarsAdapter` (always-fail, always safe) and a default\n * `BcraVarsPublicApiAdapter` that hits the public REST. Custom adapters\n * for caching, mirrors, or in-house copies.\n */\n\nimport { BcraVarsNotConfiguredError } from \"./errors\";\n\n/**\n * A single BCRA monetary variable definition. Returned by\n * `listVariables()`.\n */\nexport interface BcraVariable {\n  /** Internal BCRA id used to query the time series. */\n  idVariable: number;\n  /** Long descripción as published by BCRA. */\n  descripcion: string;\n  /** Most recent value in the series. */\n  valor: number | null;\n  /** ISO date of the most recent value (`YYYY-MM-DD`). */\n  fecha: string | null;\n  /** Update cadence: \"Diaria\" | \"Mensual\" | \"Trimestral\" | etc. */\n  cadencia?: string;\n}\n\n/** A single time-series datapoint for a BCRA variable. */\nexport interface BcraVariableDatapoint {\n  fecha: string; // YYYY-MM-DD\n  valor: number;\n}\n\nexport interface BcraVarsResult {\n  /** True when the call succeeded; false when the adapter is unconfigured or BCRA didn't respond. */\n  available: boolean;\n  /** Spanish-language explanation when `available: false`. */\n  error: string | null;\n  /** Result data when `available: true`. Type depends on the call. */\n  data: unknown;\n}\n\n/**\n * Adapter contract for BCRA Principales Variables. Implement this to wire\n * the BCRA public API, a private mirror, a caching layer, or a mock for\n * tests.\n */\nexport interface BcraVarsAdapter {\n  /** List all monetary variables BCRA publishes. */\n  listVariables(): Promise<BcraVariable[]>;\n  /**\n   * Fetch the time series for one variable. Range filtering via `from`/`to`\n   * (ISO `YYYY-MM-DD`); both optional. BCRA caps responses at ~3000 points.\n   */\n  getVariable(\n    idVariable: number,\n    range?: { from?: string; to?: string },\n  ): Promise<BcraVariableDatapoint[]>;\n}\n\n/**\n * Default adapter that always returns \"not configured\". Use when you want\n * the BCRA-vars tools to be safe to call without making real BCRA\n * requests.\n */\nexport class UnconfiguredBcraVarsAdapter implements BcraVarsAdapter {\n  async listVariables(): Promise<BcraVariable[]> {\n    throw new BcraVarsNotConfiguredError();\n  }\n  async getVariable(): Promise<BcraVariableDatapoint[]> {\n    throw new BcraVarsNotConfiguredError();\n  }\n}\n\n/**\n * Default adapter that hits BCRA's public REST API. No auth required.\n *\n * Tolerates BCRA's certificate quirks (some BCRA endpoints have served\n * intermittent TLS issues over the years) — pass a custom `fetch` to wrap\n * with retry/proxy when needed.\n */\nexport interface BcraVarsPublicApiAdapterOptions {\n  /** Override the BCRA base URL. Default `https://api.bcra.gob.ar/estadisticas/v3.0`. */\n  baseUrl?: string;\n  /** Custom fetch (proxy, retries, etc.). */\n  fetch?: typeof fetch;\n  /** Request timeout in ms. Default 15s. */\n  timeoutMs?: number;\n}\n\nexport class BcraVarsPublicApiAdapter implements BcraVarsAdapter {\n  private readonly baseUrl: string;\n  private readonly fetchImpl: typeof fetch;\n  private readonly timeoutMs: number;\n\n  constructor(opts: BcraVarsPublicApiAdapterOptions = {}) {\n    this.baseUrl = opts.baseUrl ?? \"https://api.bcra.gob.ar/estadisticas/v3.0\";\n    this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n    this.timeoutMs = opts.timeoutMs ?? 15_000;\n  }\n\n  async listVariables(): Promise<BcraVariable[]> {\n    const json = await this.getJson(`${this.baseUrl}/Monetarias`);\n    const results = Array.isArray(json) ? json : (json[\"results\"] as unknown);\n    if (!Array.isArray(results)) return [];\n    return results.map((r: Record<string, unknown>) => ({\n      idVariable: Number(r[\"idVariable\"] ?? 0),\n      descripcion: String(r[\"descripcion\"] ?? \"\"),\n      valor: r[\"valor\"] === null || r[\"valor\"] === undefined ? null : Number(r[\"valor\"]),\n      fecha: r[\"fecha\"] ? String(r[\"fecha\"]) : null,\n      ...(r[\"cadencia\"] !== undefined ? { cadencia: String(r[\"cadencia\"]) } : {}),\n    }));\n  }\n\n  async getVariable(\n    idVariable: number,\n    range: { from?: string; to?: string } = {},\n  ): Promise<BcraVariableDatapoint[]> {\n    const params = new URLSearchParams();\n    if (range.from) params.set(\"desde\", range.from);\n    if (range.to) params.set(\"hasta\", range.to);\n    const qs = params.size ? `?${params.toString()}` : \"\";\n    const url = `${this.baseUrl}/Monetarias/${idVariable}${qs}`;\n    const json = await this.getJson(url);\n    const results = Array.isArray(json) ? json : (json[\"results\"] as unknown);\n    if (!Array.isArray(results)) return [];\n    return results.map((r: Record<string, unknown>) => ({\n      fecha: String(r[\"fecha\"] ?? \"\"),\n      valor: Number(r[\"valor\"] ?? 0),\n    }));\n  }\n\n  private async getJson(url: string): Promise<Record<string, unknown> | unknown[]> {\n    const ctrl = new AbortController();\n    const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n    try {\n      const res = await this.fetchImpl(url, {\n        signal: ctrl.signal,\n        headers: { Accept: \"application/json\" },\n      });\n      if (!res.ok) {\n        throw new Error(`BCRA API ${res.status} ${res.statusText} at ${url}`);\n      }\n      return (await res.json()) as Record<string, unknown> | unknown[];\n    } finally {\n      clearTimeout(timer);\n    }\n  }\n}\n\n/**\n * Well-known BCRA variable ids. The ids are stable but new ones get added\n * occasionally — use `listVariables()` to discover.\n *\n * Verified against the BCRA API as of 2026-05.\n */\nexport const BCRA_VARIABLE_IDS = {\n  RESERVAS_INTERNACIONALES: 1,\n  TIPO_CAMBIO_MINORISTA_USD: 4,\n  TIPO_CAMBIO_MAYORISTA_USD: 5,\n  TASA_POLITICA_MONETARIA: 6,\n  BADLAR_BANCOS_PRIVADOS: 7,\n  TIPO_CAMBIO_REAL_MULTILATERAL: 8,\n  CER_DIA: 30,\n  UVA_DIA: 31,\n  INFLACION_MENSUAL: 27,\n  INFLACION_INTERANUAL: 28,\n} as const;\n\nexport type BcraVariableId = (typeof BCRA_VARIABLE_IDS)[keyof typeof BCRA_VARIABLE_IDS];\n","/**\n * BCRA Central de Deudores result for a single CUIT.\n */\nexport interface BcraDeudaResult {\n  /** The CUIT that was queried, normalized to 11 bare digits. */\n  cuit: string;\n  /**\n   * `true` when BCRA returned a record. `false` when the CUIT isn't in the\n   * registry, the service is down, or no adapter is configured. Always check\n   * before reading `data`.\n   */\n  available: boolean;\n  /**\n   * Spanish-language explanation when `available: false`. ALWAYS surface\n   * verbatim to end users — it's the actionable signal (e.g., \"CUIT no\n   * tiene antecedentes crediticios\" vs \"BCRA no responde\").\n   */\n  error: string | null;\n  /** Normalized BCRA data when `available: true`. `null` otherwise. */\n  data: BcraDeudaData | null;\n}\n\n/**\n * BCRA situation codes (1–6). 0 means \"no debt reported in the period\".\n *\n * - **1 — Normal**: payments on time\n * - **2 — Riesgo bajo**: <90 days past due\n * - **3 — Riesgo medio**: 90-180 days past due\n * - **4 — Riesgo alto**: 180-365 days past due\n * - **5 — Irrecuperable**: 365+ days past due, written off\n * - **6 — Irrecuperable disposición técnica**: very rare admin write-off\n */\nexport type BcraSituation = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface BcraDeudaData {\n  /** Taxpayer name as registered with BCRA. */\n  name: string;\n  /** Reporting period in YYYYMM format (e.g., \"202604\"). */\n  period: string;\n  /**\n   * Worst situation code across all reporting entities. The headline\n   * risk score for this taxpayer. 0 means no entity reported debt.\n   */\n  worstSituation: BcraSituation;\n  /** Sum of debt amounts across all entities, in ARS. */\n  totalAmount: number;\n  /**\n   * Per-entity breakdown. An entity is a bank or PSP that has a credit\n   * relationship with this taxpayer.\n   */\n  entities: BcraDebtEntity[];\n}\n\nexport interface BcraDebtEntity {\n  /** Entity name (bank or PSP). */\n  entity: string;\n  /** BCRA situation code for this entity's loan to this taxpayer. */\n  situation: BcraSituation;\n  /** Outstanding amount owed to this entity, in ARS. */\n  amount: number;\n  /** Days past due. 0 means current. */\n  daysOverdue: number;\n  /** True if the loan has been refinanced. */\n  refinanced: boolean;\n  /** True if the situation is currently under review. */\n  inReview: boolean;\n  /** True if the entity has initiated legal proceedings. */\n  inLitigation: boolean;\n}\n\n/**\n * Spanish-language description of a BCRA situation code, suitable for\n * surfacing to end users.\n */\nexport function describeSituation(situation: BcraSituation): string {\n  switch (situation) {\n    case 0:\n      return \"Sin deuda reportada en el período.\";\n    case 1:\n      return \"Situación normal: pagos al día.\";\n    case 2:\n      return \"Riesgo bajo: hasta 90 días de mora.\";\n    case 3:\n      return \"Riesgo medio: entre 90 y 180 días de mora.\";\n    case 4:\n      return \"Riesgo alto: entre 180 y 365 días de mora.\";\n    case 5:\n      return \"Irrecuperable: más de 365 días de mora.\";\n    case 6:\n      return \"Irrecuperable por disposición técnica.\";\n  }\n}\n","import { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport { parseCbu } from \"./cbu\";\nimport {\n  type BcraDeudaAdapter,\n  UnconfiguredBcraAdapter,\n} from \"./bcra\";\nimport {\n  type BcraVarsAdapter,\n  BCRA_VARIABLE_IDS,\n  UnconfiguredBcraVarsAdapter,\n} from \"./bcra-vars\";\nimport { describeSituation } from \"./types\";\nimport { listBanks, listPsps, lookupBankByCode, lookupCvuByPrefix } from \"./banks\";\n\n/**\n * Optional configuration for `bankingTools()`. All fields are optional;\n * when omitted, sensible defaults apply that keep the tools always callable\n * (algorithm tools always work; BCRA lookup returns a clear \"not configured\"\n * message via `UnconfiguredBcraAdapter`).\n */\nexport interface BankingToolsOptions {\n  /**\n   * BCRA Central de Deudores lookup backend. When omitted, a default adapter\n   * is used that always returns `available: false` with setup instructions,\n   * so the `lookup_credit_situation` tool stays safe to call without crashing.\n   *\n   * Pass `new BcraPublicApiAdapter()` for the production backend (no auth\n   * required, hits BCRA's public REST endpoint).\n   */\n  bcra?: BcraDeudaAdapter;\n  /**\n   * BCRA Principales Variables backend (tipo de cambio, CER, UVA,\n   * reservas, etc.). When omitted, returns \"not configured\" via\n   * `UnconfiguredBcraVarsAdapter`. Pass `new BcraVarsPublicApiAdapter()`\n   * to enable, no auth required.\n   */\n  bcraVars?: BcraVarsAdapter;\n  /**\n   * Override the agent-facing tool descriptions. Pass an object with keys\n   * matching tool names; values replace the default description. Useful\n   * when the agent's primary language isn't English/Spanish.\n   */\n  descriptions?: Partial<Record<BankingToolName, string>>;\n}\n\nexport type BankingToolName =\n  | \"validate_cbu\"\n  | \"lookup_bank_by_code\"\n  | \"list_banks\"\n  | \"list_psps\"\n  | \"lookup_credit_situation\"\n  | \"list_bcra_variables\"\n  | \"get_bcra_variable\"\n  | \"get_usd_oficial\"\n  | \"get_uva\"\n  | \"get_cer\"\n  | \"get_reservas_bcra\";\n\n/**\n * Default tool descriptions. These are the strings agents read when picking\n * tools, so they're written for LLM consumption: explicit about WHEN to use\n * each tool, what each tool returns, side effects, and constraints.\n */\nconst DEFAULT_DESCRIPTIONS: Record<BankingToolName, string> = {\n  validate_cbu:\n    \"Validate an Argentine CBU or CVU bank account number (validar CBU, validar CVU). CBU = Clave Bancaria Uniforme (traditional bank account), CVU = Clave Virtual Uniforme (fintech wallet account), checked via the BCRA dual mod-10 check-digit algorithm. PURE FUNCTION: no API call, no environment dependencies, sub-millisecond latency, free. Returns whether the input is mathematically valid PLUS the bank/PSP identification (e.g., '007 → Banco Galicia', '0000031 → Mercado Pago'), the branch code, and the account number. USE THIS WHEN: the user pastes a CBU/CVU and you need to detect typos, identify the issuing bank/wallet, or extract the account components before submitting a transfer or alias setup. Always call this BEFORE any transfer-related action, invalid CBUs cause hard failures downstream and chargebacks. Distinguishes CBU vs CVU automatically via the entity-code prefix.\",\n\n  lookup_bank_by_code:\n    \"Identify the Argentine bank or PSP behind an entity code (de qué banco es este CBU, código de entidad BCRA). PURE FUNCTION: in-memory lookup, free, sub-millisecond. Returns the entity's full legal name, short brand name, and kind (cbu = traditional bank, cvu = fintech). USE THIS WHEN: you have a bank code (e.g., from a CBU you've already parsed, from a user's input dropdown, from a transaction record) and need its human-readable name. For CVU prefixes (0000031 etc.), pass the 7-digit prefix; for traditional banks pass the 3-digit code. Returns null when the code isn't in the lookup table, the table is BCRA-published but updated periodically, so newer fintechs may be missing.\",\n\n  list_banks:\n    \"List Argentine banks (listar bancos argentinos) with their BCRA codes. USE THIS WHEN: you need to render a dropdown of banks for the user to pick from, or need to enumerate available entities for a workflow. Sorted by BCRA code. Returns array of `{ code, name, shortName, kind }`.\",\n\n  list_psps:\n    \"List Argentine fintech wallets / PSPs (listar billeteras virtuales, Mercado Pago, Ualá, Naranja X, Personal Pay, etc.) with their CVU prefixes. USE THIS WHEN: you need to render a dropdown of fintech wallets for the user to pick from, or need to enumerate PSPs for a workflow. Returns array of `{ code, name, shortName, kind }` where `code` is the 7-digit CVU prefix.\",\n\n  lookup_credit_situation:\n    \"Check a CUIT's credit standing in the BCRA Central de Deudores (consultar deudores BCRA, situación crediticia). Returns the worst situation code (1=normal, 2=low risk <90 days, 3=medium risk 90-180 days, 4=high risk 180-365 days, 5=irrecoverable, 6=irrecoverable by admin disposition), total outstanding debt across all entities, and per-entity breakdown. USE THIS WHEN: the user is assessing counterparty risk before extending credit, factoring invoices, or onboarding a B2B supplier. DO NOT USE for routine billing decisions, Mercado Pago handles credit risk on the SaaS's behalf for normal subscription flows. REQUIRES: a `BcraDeudaAdapter` configured at app boot. The default `BcraPublicApiAdapter` hits BCRA's public REST API (no auth required). When NOT configured, returns `{ available: false, error: <setup instructions> }` instead of crashing, surface the error verbatim. ALWAYS call `validate_cuit` (from @ar-agents/identity) first to confirm format before hitting BCRA.\",\n\n  list_bcra_variables:\n    \"List BCRA monetary indicators (principales variables del BCRA) with their current latest value and ID. Returns variables like Reservas Internacionales, Tipo de Cambio Minorista USD, Tipo de Cambio Mayorista USD, Tasa de Política Monetaria, BADLAR, CER día, UVA día, Inflación mensual / interanual. USE THIS WHEN: the user wants to discover what indicators are available, or asks 'qué variables publica el BCRA'. Returns array of `{ idVariable, descripcion, valor, fecha, cadencia }`.\",\n\n  get_bcra_variable:\n    \"Fetch the historical series of a BCRA indicator (serie histórica de una variable del BCRA) by id. USE THIS WHEN: the user wants historical values of a specific variable (cotización USD, CER, UVA, inflación). Optional `from`/`to` ISO dates filter the range. Returns `{ idVariable, datapoints: [{ fecha, valor }, ...] }`. PREFER the convenience tools (`get_usd_oficial`, `get_uva`, `get_cer`, `get_reservas_bcra`) when the user asks for one of those specifically, they pre-fill the id.\",\n\n  get_usd_oficial:\n    \"Get the official USD exchange rate (dólar oficial, a cuánto está el dólar, cotización USD; Tipo de Cambio Minorista, BCRA variable id 4). Returns the current value + date + the most recent N daily datapoints. USE THIS WHEN: the user asks 'a cuánto está el dólar oficial', 'cotización USD', 'tipo de cambio'. Pass `lookback_days` to control the time window (default 30).\",\n\n  get_uva:\n    \"Get the current UVA value (valor UVA hoy; Unidad de Valor Adquisitivo, BCRA variable id 31). UVA is the inflation-adjusted unit used for AR mortgages, fixed-term deposits, and rentals. USE THIS WHEN: the user asks about UVA value, mortgage adjustments, or inflation-linked instruments. Returns the latest value + date + recent datapoints.\",\n\n  get_cer:\n    \"Get the current CER coefficient (coeficiente CER hoy, ajuste por inflación; BCRA variable id 30). CER is the official inflation-tracking coefficient used to adjust regulated debt and contracts. USE THIS WHEN: the user asks about CER, contract adjustments, or 'ajuste por inflación'.\",\n\n  get_reservas_bcra:\n    \"Get BCRA international reserves (reservas del BCRA, Reservas Internacionales; variable id 1). USE THIS WHEN: the user asks about reservas, USD reserves, or BCRA balance sheet. Returns the latest value + date + recent datapoints. Reservas are reported in millions of USD.\",\n};\n\n/**\n * Build the agent tool collection for `@ar-agents/banking`. Drop directly\n * into `Experimental_Agent`'s `tools` option, or merge with other tool sets\n * (e.g., from `@ar-agents/identity` and `@ar-agents/mercadopago`).\n *\n * @example Algorithm-only (default, BCRA lookup returns \"not configured\")\n * ```ts\n * import { Experimental_Agent as Agent, stepCountIs } from \"ai\";\n * import { bankingTools } from \"@ar-agents/banking\";\n *\n * const agent = new Agent({\n *   model: \"anthropic/claude-sonnet-4-6\",\n *   tools: bankingTools(),\n *   stopWhen: stepCountIs(6),\n * });\n * ```\n *\n * @example With a real BCRA adapter\n * ```ts\n * import { bankingTools, BcraPublicApiAdapter } from \"@ar-agents/banking\";\n *\n * const agent = new Agent({\n *   model: \"anthropic/claude-sonnet-4-6\",\n *   tools: bankingTools({ bcra: new BcraPublicApiAdapter() }),\n *   stopWhen: stepCountIs(6),\n * });\n * ```\n */\nexport function bankingTools(options: BankingToolsOptions = {}): ToolSet {\n  const bcra = options.bcra ?? new UnconfiguredBcraAdapter();\n  const bcraVars = options.bcraVars ?? new UnconfiguredBcraVarsAdapter();\n  const desc = (name: BankingToolName): string =>\n    options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n\n  async function fetchSeriesWithLookback(\n    idVariable: number,\n    lookbackDays: number,\n  ): Promise<{\n    idVariable: number;\n    latest: { fecha: string; valor: number } | null;\n    datapoints: Array<{ fecha: string; valor: number }>;\n  }> {\n    const to = new Date().toISOString().slice(0, 10);\n    const fromDate = new Date();\n    fromDate.setDate(fromDate.getDate() - lookbackDays);\n    const from = fromDate.toISOString().slice(0, 10);\n    const datapoints = await bcraVars.getVariable(idVariable, { from, to });\n    const latest = datapoints.length > 0 ? datapoints[datapoints.length - 1]! : null;\n    return { idVariable, latest, datapoints };\n  }\n\n  return {\n    validate_cbu: tool({\n      description: desc(\"validate_cbu\"),\n      inputSchema: z.object({\n        cbu: z\n          .string()\n          .min(1)\n          .describe(\n            \"The CBU/CVU to validate. Accepts any format with or without separators: 0070055530005571000018, 00700555-30005571000018, with spaces, etc. The function normalizes by stripping non-digit characters before validating.\",\n          ),\n      }),\n      execute: async ({ cbu }) => {\n        return parseCbu(cbu);\n      },\n    }),\n\n    lookup_bank_by_code: tool({\n      description: desc(\"lookup_bank_by_code\"),\n      inputSchema: z.object({\n        code: z\n          .string()\n          .min(3)\n          .max(7)\n          .describe(\n            \"The BCRA entity code. For traditional banks pass the 3-digit code (e.g., '007' for Galicia, '011' for Nación). For PSPs/fintechs pass the 7-digit prefix (e.g., '0000031' for Mercado Pago, '0000007' for Ualá).\",\n          ),\n      }),\n      execute: async ({ code }) => {\n        const bank = code.length === 3 ? lookupBankByCode(code) : null;\n        const psp = code.length === 7 ? lookupCvuByPrefix(code) : null;\n        return {\n          code,\n          found: bank !== null || psp !== null,\n          entity: bank ?? psp ?? null,\n        };\n      },\n    }),\n\n    list_banks: tool({\n      description: desc(\"list_banks\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        return { banks: listBanks() };\n      },\n    }),\n\n    list_psps: tool({\n      description: desc(\"list_psps\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        return { psps: listPsps() };\n      },\n    }),\n\n    lookup_credit_situation: tool({\n      description: desc(\"lookup_credit_situation\"),\n      inputSchema: z.object({\n        cuit: z\n          .string()\n          .describe(\n            \"The CUIT to look up against BCRA Central de Deudores. Pass the 11-digit normalized form (output of validate_cuit.normalized from @ar-agents/identity).\",\n          ),\n      }),\n      execute: async ({ cuit }) => {\n        const result = await bcra.lookup(cuit);\n        return {\n          ...result,\n          worstSituationDescription: result.data\n            ? describeSituation(result.data.worstSituation)\n            : null,\n        };\n      },\n    }),\n\n    list_bcra_variables: tool({\n      description: desc(\"list_bcra_variables\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const variables = await bcraVars.listVariables();\n        return { variables };\n      },\n    }),\n\n    get_bcra_variable: tool({\n      description: desc(\"get_bcra_variable\"),\n      inputSchema: z.object({\n        id_variable: z.number().int().min(1).describe(\"BCRA variable id (e.g., 4 for USD oficial).\"),\n        from: z.string().optional().describe(\"ISO date YYYY-MM-DD lower bound (inclusive).\"),\n        to: z.string().optional().describe(\"ISO date YYYY-MM-DD upper bound (inclusive).\"),\n      }),\n      execute: async (input) => {\n        const range: { from?: string; to?: string } = {};\n        if (input.from !== undefined) range.from = input.from;\n        if (input.to !== undefined) range.to = input.to;\n        const datapoints = await bcraVars.getVariable(input.id_variable, range);\n        return {\n          idVariable: input.id_variable,\n          datapoints,\n          latest: datapoints.length > 0 ? datapoints[datapoints.length - 1] : null,\n        };\n      },\n    }),\n\n    get_usd_oficial: tool({\n      description: desc(\"get_usd_oficial\"),\n      inputSchema: z.object({\n        lookback_days: z\n          .number()\n          .int()\n          .min(1)\n          .max(365)\n          .optional()\n          .describe(\"How many days back to fetch. Default 30.\"),\n      }),\n      execute: async (input) =>\n        fetchSeriesWithLookback(\n          BCRA_VARIABLE_IDS.TIPO_CAMBIO_MINORISTA_USD,\n          input.lookback_days ?? 30,\n        ),\n    }),\n\n    get_uva: tool({\n      description: desc(\"get_uva\"),\n      inputSchema: z.object({\n        lookback_days: z.number().int().min(1).max(365).optional(),\n      }),\n      execute: async (input) =>\n        fetchSeriesWithLookback(BCRA_VARIABLE_IDS.UVA_DIA, input.lookback_days ?? 30),\n    }),\n\n    get_cer: tool({\n      description: desc(\"get_cer\"),\n      inputSchema: z.object({\n        lookback_days: z.number().int().min(1).max(365).optional(),\n      }),\n      execute: async (input) =>\n        fetchSeriesWithLookback(BCRA_VARIABLE_IDS.CER_DIA, input.lookback_days ?? 30),\n    }),\n\n    get_reservas_bcra: tool({\n      description: desc(\"get_reservas_bcra\"),\n      inputSchema: z.object({\n        lookback_days: z.number().int().min(1).max(365).optional(),\n      }),\n      execute: async (input) =>\n        fetchSeriesWithLookback(\n          BCRA_VARIABLE_IDS.RESERVAS_INTERNACIONALES,\n          input.lookback_days ?? 30,\n        ),\n    }),\n  } satisfies ToolSet;\n}\n"]}