{"version":3,"sources":["../src/errors.ts","../src/wsfe.ts","../src/wsfe-client.ts","../src/catalogs.ts","../src/validator.ts","../src/tools.ts"],"names":["ArAgentsError","authBlock","fetchWithRetry","TokenCache","normalizeCuit","tool","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Errors emitted by `@ar-agents/facturacion` 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\";\nimport type { WsfeError } from \"./types\";\n\nexport type FacturacionErrorCode =\n  | \"wsfe_not_configured\"\n  | \"wsfe_validation_error\"\n  | \"wsfe_authentication_failed\"\n  | \"wsfe_request_rejected\"\n  | \"wsfe_service_unavailable\"\n  | \"wsfe_unknown_error\";\n\nconst RETRYABLE_CODES: Record<FacturacionErrorCode, boolean> = {\n  wsfe_not_configured: false,\n  wsfe_validation_error: false,\n  wsfe_authentication_failed: false,\n  wsfe_request_rejected: false,\n  wsfe_service_unavailable: true,\n  wsfe_unknown_error: false,\n};\n\nexport class FacturacionError extends ArAgentsError {\n  override readonly code: FacturacionErrorCode;\n  readonly details?: unknown;\n\n  constructor(code: FacturacionErrorCode, message: string, details?: unknown) {\n    super(message, {\n      code,\n      retryable: RETRYABLE_CODES[code] ?? false,\n      context: details !== undefined ? { details } : {},\n    });\n    this.name = \"FacturacionError\";\n    this.code = code;\n    this.details = details;\n  }\n}\n\n/**\n * Thrown when the WsfeClient is constructed without the required cert/key\n * or CUIT. Surface the message verbatim — it's actionable.\n */\nexport class WsfeNotConfiguredError extends FacturacionError {\n  constructor() {\n    super(\n      \"wsfe_not_configured\",\n      \"WSFE no está configurado. Para emitir facturas: pasá `certPath` (o `certPem`), `keyPath` (o `keyPem`), y `cuit` al `WsfeClient`. El certificado debe estar autorizado para el servicio `wsfe` en tu cuenta AFIP/ARCA (Administrador de Relaciones → Nueva Relación → AFIP → WebServices → Servicio Web de Facturación Electrónica).\",\n    );\n    this.name = \"WsfeNotConfiguredError\";\n  }\n}\n\n/**\n * Thrown when the request fails AFIP's pre-emission validation (e.g., the\n * `ImpTotal` doesn't equal the sum of components). Surface the message —\n * it tells the user exactly what to fix.\n */\nexport class WsfeValidationError extends FacturacionError {\n  constructor(message: string, public errors?: WsfeError[]) {\n    super(\"wsfe_validation_error\", message, errors);\n    this.name = \"WsfeValidationError\";\n  }\n}\n\n/**\n * Thrown when AFIP rejects the request (Resultado: \"R\"). Carries the\n * top-level errors and per-detail observaciones for diagnosis.\n */\nexport class WsfeRejectedError extends FacturacionError {\n  constructor(\n    message: string,\n    public errors: WsfeError[],\n    public observaciones: WsfeError[],\n  ) {\n    super(\"wsfe_request_rejected\", message, { errors, observaciones });\n    this.name = \"WsfeRejectedError\";\n  }\n}\n","/**\n * AFIP/ARCA WSFE (Web Service de Factura Electrónica) operations.\n *\n * These build SOAP envelopes, POST them to AFIP, and parse the responses.\n * Reuses `fetchWithRetry` from `@ar-agents/identity/wsaa` for production\n * robustez (timeout / retry / SOAP-fault detection / observability hook).\n *\n * # Endpoints\n *\n * - **Producción**: `https://servicios1.afip.gov.ar/wsfev1/service.asmx`\n * - **Homologación**: `https://wswhomo.afip.gov.ar/wsfev1/service.asmx`\n *\n * # WSDL targetNamespace\n *\n * `http://ar.gov.afip.dif.FEV1/` — note: SOAPAction headers must include the\n * full operation name (e.g., `\"http://ar.gov.afip.dif.FEV1/FECAESolicitar\"`).\n *\n * # Service authorization\n *\n * The `wsfe` service must be authorized in your ARCA panel:\n * \"Administrador de Relaciones de Clave Fiscal\" → \"Nueva Relación\" →\n * \"AFIP\" → \"WebServices\" → \"Servicio Web de Facturación Electrónica\" →\n * select your alias. Once authorized, the same X.509 cert that powers\n * `@ar-agents/identity` works against WSFE too.\n */\n\nimport type { AccessTicket } from \"@ar-agents/identity/wsaa\";\nimport { fetchWithRetry } from \"@ar-agents/identity/wsaa\";\nimport type {\n  ConsultarComprobanteResult,\n  DummyResult,\n  IvaItem,\n  SolicitarCaeInput,\n  SolicitarCaeResult,\n  TributoItem,\n  UltimoComprobanteResult,\n  WsfeEnv,\n  WsfeError,\n  WsfeEvento,\n  WsfeObservacion,\n} from \"./types\";\nimport type { CbteTipoCode, DocTipoCode } from \"./catalogs\";\nimport { WsfeValidationError } from \"./errors\";\n\nexport const WSFE_SERVICE_NAME = \"wsfe\" as const;\n\nconst WSFE_URLS: Record<WsfeEnv, string> = {\n  homo: \"https://wswhomo.afip.gov.ar/wsfev1/service.asmx\",\n  prod: \"https://servicios1.afip.gov.ar/wsfev1/service.asmx\",\n};\n\nconst NS = \"http://ar.gov.afip.dif.FEV1/\";\n\ninterface CommonRequestOptions {\n  ta: AccessTicket;\n  env: WsfeEnv;\n  cuit: string;\n  endpointOverride?: string;\n  fetchImpl?: typeof fetch;\n  requestTimeoutMs?: number;\n  maxRetries?: number;\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\n/**\n * Build a SOAP envelope with the standard AFIP `<Auth>` block and a single\n * operation body element.\n */\nfunction buildEnvelope(\n  operation: string,\n  authBlock: string,\n  body: string,\n): string {\n  return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:fev1=\"${NS}\">\n  <soapenv:Body>\n    <fev1:${operation}>\n      ${authBlock}\n      ${body}\n    </fev1:${operation}>\n  </soapenv:Body>\n</soapenv:Envelope>`;\n}\n\nfunction authBlock(ta: AccessTicket, cuit: string): string {\n  return `<fev1:Auth>\n        <fev1:Token>${escapeXml(ta.token)}</fev1:Token>\n        <fev1:Sign>${escapeXml(ta.sign)}</fev1:Sign>\n        <fev1:Cuit>${escapeXml(cuit)}</fev1:Cuit>\n      </fev1:Auth>`;\n}\n\nfunction escapeXml(s: string): string {\n  return s\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\");\n}\n\nasync function callWsfe(\n  operation: string,\n  body: string,\n  opts: CommonRequestOptions,\n  label: string,\n): Promise<string> {\n  const url = opts.endpointOverride ?? WSFE_URLS[opts.env];\n  const envelope = buildEnvelope(operation, authBlock(opts.ta, opts.cuit), body);\n  const fetchOptions: Parameters<typeof fetchWithRetry>[0] = {\n    url,\n    init: {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"text/xml; charset=utf-8\",\n        SOAPAction: `${NS}${operation}`,\n      },\n      body: envelope,\n    },\n    label,\n    ...(opts.fetchImpl !== undefined ? { fetchImpl: opts.fetchImpl } : {}),\n    ...(opts.requestTimeoutMs !== undefined\n      ? { requestTimeoutMs: opts.requestTimeoutMs }\n      : {}),\n    ...(opts.maxRetries !== undefined ? { maxRetries: opts.maxRetries } : {}),\n    ...(opts.onCall !== undefined ? { onCall: opts.onCall } : {}),\n  };\n  return fetchWithRetry(fetchOptions);\n}\n\n// ============================================================================\n// Tag extraction helpers — WSFE returns XML, not JSON. We parse with regexes\n// rather than pulling in an XML lib (xml2js etc.) to keep the bundle lean.\n// AFIP responses are well-formed and predictable — `<Tag>value</Tag>` always.\n// ============================================================================\n\nfunction extractTag(xml: string, tag: string): string | null {\n  // Match either <Tag>value</Tag> or <ns:Tag>value</ns:Tag>\n  const re = new RegExp(`<(?:\\\\w+:)?${tag}>([\\\\s\\\\S]*?)</(?:\\\\w+:)?${tag}>`);\n  const m = xml.match(re);\n  return m && m[1] !== undefined ? m[1] : null;\n}\n\nfunction extractTagAll(xml: string, tag: string): string[] {\n  const re = new RegExp(`<(?:\\\\w+:)?${tag}>([\\\\s\\\\S]*?)</(?:\\\\w+:)?${tag}>`, \"g\");\n  const out: string[] = [];\n  for (const m of xml.matchAll(re)) {\n    if (m[1] !== undefined) out.push(m[1]);\n  }\n  return out;\n}\n\nfunction extractNumber(xml: string, tag: string): number {\n  const v = extractTag(xml, tag);\n  if (v === null) return 0;\n  const n = Number(v);\n  return Number.isFinite(n) ? n : 0;\n}\n\nfunction extractObservaciones(xml: string): WsfeObservacion[] {\n  const obsBlock = extractTag(xml, \"Observaciones\");\n  if (!obsBlock) return [];\n  return extractTagAll(obsBlock, \"Obs\").map((o) => ({\n    code: extractNumber(o, \"Code\"),\n    msg: decodeXml(extractTag(o, \"Msg\") ?? \"\"),\n  }));\n}\n\nfunction extractErrors(xml: string): WsfeError[] {\n  const errBlock = extractTag(xml, \"Errors\");\n  if (!errBlock) return [];\n  return extractTagAll(errBlock, \"Err\").map((e) => ({\n    code: extractNumber(e, \"Code\"),\n    msg: decodeXml(extractTag(e, \"Msg\") ?? \"\"),\n  }));\n}\n\nfunction extractEventos(xml: string): WsfeEvento[] {\n  const evBlock = extractTag(xml, \"Events\");\n  if (!evBlock) return [];\n  return extractTagAll(evBlock, \"Evt\").map((e) => ({\n    code: extractNumber(e, \"Code\"),\n    msg: decodeXml(extractTag(e, \"Msg\") ?? \"\"),\n  }));\n}\n\nfunction decodeXml(s: string): string {\n  return s\n    .replace(/&lt;/g, \"<\")\n    .replace(/&gt;/g, \">\")\n    .replace(/&amp;/g, \"&\")\n    .replace(/&quot;/g, '\"')\n    .replace(/&apos;/g, \"'\");\n}\n\nfunction checkSoapFault(xml: string): void {\n  const fault = extractTag(xml, \"faultstring\");\n  if (fault) {\n    throw new Error(`WSFE SOAP Fault: ${decodeXml(fault)}`);\n  }\n}\n\n// ============================================================================\n// Operations\n// ============================================================================\n\n/**\n * Health check. Returns the status of AFIP's app/db/auth servers.\n * Should return all \"OK\" when WSFE is up. Use for /health endpoints and as\n * a pre-emission gate when you want to fail fast.\n *\n * Doesn't require auth — but the operation still needs CUIT in the SOAP body\n * per AFIP's WSDL contract (we send it through `callWsfe`).\n */\nexport async function dummy(opts: CommonRequestOptions): Promise<DummyResult> {\n  const xml = await callWsfe(\"FEDummy\", \"\", opts, \"wsfe.dummy\");\n  checkSoapFault(xml);\n  return {\n    appServer: extractTag(xml, \"AppServer\") ?? \"?\",\n    dbServer: extractTag(xml, \"DbServer\") ?? \"?\",\n    authServer: extractTag(xml, \"AuthServer\") ?? \"?\",\n  };\n}\n\n/**\n * Returns the last authorized comprobante number for a (PtoVta, CbteTipo)\n * pair. Returns 0 when no comprobante has ever been authorized — your next\n * emission then uses `cbteDesde: 1`.\n *\n * # Common usage\n * ```ts\n * const last = await consultarUltimoAutorizado({\n *   ta, env, cuit,\n *   ptoVta: 1, cbteTipo: CbteTipo.FACTURA_C\n * });\n * const next = last.cbteNro + 1;\n * await solicitarCAE({ ..., cbteDesde: next, cbteHasta: next });\n * ```\n */\nexport async function consultarUltimoAutorizado(\n  opts: CommonRequestOptions & {\n    ptoVta: number;\n    cbteTipo: CbteTipoCode;\n  },\n): Promise<UltimoComprobanteResult> {\n  const body = `<fev1:PtoVta>${opts.ptoVta}</fev1:PtoVta>\n      <fev1:CbteTipo>${opts.cbteTipo}</fev1:CbteTipo>`;\n  const xml = await callWsfe(\n    \"FECompUltimoAutorizado\",\n    body,\n    opts,\n    \"wsfe.ultimoAutorizado\",\n  );\n  checkSoapFault(xml);\n\n  const errors = extractErrors(xml);\n  if (errors.length > 0) {\n    throw new Error(\n      `WSFE FECompUltimoAutorizado errors: ${errors.map((e) => `[${e.code}] ${e.msg}`).join(\"; \")}`,\n    );\n  }\n\n  return {\n    ptoVta: extractNumber(xml, \"PtoVta\"),\n    cbteTipo: extractNumber(xml, \"CbteTipo\") as CbteTipoCode,\n    cbteNro: extractNumber(xml, \"CbteNro\"),\n  };\n}\n\n/**\n * Look up the full details of a previously-authorized comprobante. Use this\n * to verify a CAE is valid and matches the data you have on record (e.g.,\n * after migrating from another system).\n */\nexport async function consultarComprobante(\n  opts: CommonRequestOptions & {\n    ptoVta: number;\n    cbteTipo: CbteTipoCode;\n    cbteNro: number;\n  },\n): Promise<ConsultarComprobanteResult> {\n  const body = `<fev1:FeCompConsReq>\n        <fev1:CbteTipo>${opts.cbteTipo}</fev1:CbteTipo>\n        <fev1:CbteNro>${opts.cbteNro}</fev1:CbteNro>\n        <fev1:PtoVta>${opts.ptoVta}</fev1:PtoVta>\n      </fev1:FeCompConsReq>`;\n  const xml = await callWsfe(\n    \"FECompConsultar\",\n    body,\n    opts,\n    \"wsfe.consultarComprobante\",\n  );\n  checkSoapFault(xml);\n\n  const errors = extractErrors(xml);\n  if (errors.length > 0) {\n    return {\n      found: false,\n      ptoVta: opts.ptoVta,\n      cbteTipo: opts.cbteTipo,\n      cbteDesde: 0,\n      cbteHasta: 0,\n      cbteFch: \"\",\n      cae: \"\",\n      caeFchVto: \"\",\n      resultado: \"R\",\n      emisionTipo: \"\",\n      docTipo: 0 as DocTipoCode,\n      docNro: \"\",\n      impTotal: 0,\n      impNeto: 0,\n      impIVA: 0,\n      observaciones: errors,\n    };\n  }\n\n  const result = extractTag(xml, \"ResultGet\") ?? xml;\n  return {\n    found: true,\n    ptoVta: extractNumber(result, \"PtoVta\"),\n    cbteTipo: extractNumber(result, \"CbteTipo\") as CbteTipoCode,\n    cbteDesde: extractNumber(result, \"CbteDesde\"),\n    cbteHasta: extractNumber(result, \"CbteHasta\"),\n    cbteFch: extractTag(result, \"CbteFch\") ?? \"\",\n    cae: extractTag(result, \"CodAutorizacion\") ?? \"\",\n    caeFchVto: extractTag(result, \"FchVto\") ?? \"\",\n    resultado: (extractTag(result, \"Resultado\") ?? \"R\") as \"A\" | \"R\" | \"P\",\n    emisionTipo: extractTag(result, \"EmisionTipo\") ?? \"\",\n    docTipo: extractNumber(result, \"DocTipo\") as DocTipoCode,\n    docNro: extractTag(result, \"DocNro\") ?? \"\",\n    impTotal: extractNumber(result, \"ImpTotal\"),\n    impNeto: extractNumber(result, \"ImpNeto\"),\n    impIVA: extractNumber(result, \"ImpIVA\"),\n    observaciones: extractObservaciones(result),\n  };\n}\n\n/**\n * Build the IVA block XML. Returns empty string when no items.\n */\nfunction buildIvaBlock(iva?: IvaItem[]): string {\n  if (!iva || iva.length === 0) return \"\";\n  const items = iva\n    .map(\n      (i) => `<fev1:AlicIva>\n                <fev1:Id>${i.id}</fev1:Id>\n                <fev1:BaseImp>${formatAmount(i.baseImp)}</fev1:BaseImp>\n                <fev1:Importe>${formatAmount(i.importe)}</fev1:Importe>\n              </fev1:AlicIva>`,\n    )\n    .join(\"\\n            \");\n  return `<fev1:Iva>\n            ${items}\n          </fev1:Iva>`;\n}\n\nfunction buildTributosBlock(tributos?: TributoItem[]): string {\n  if (!tributos || tributos.length === 0) return \"\";\n  const items = tributos\n    .map(\n      (t) => `<fev1:Tributo>\n                <fev1:Id>${t.id}</fev1:Id>\n                <fev1:Desc>${escapeXml(t.desc)}</fev1:Desc>\n                <fev1:BaseImp>${formatAmount(t.baseImp)}</fev1:BaseImp>\n                <fev1:Alic>${formatAmount(t.alic)}</fev1:Alic>\n                <fev1:Importe>${formatAmount(t.importe)}</fev1:Importe>\n              </fev1:Tributo>`,\n    )\n    .join(\"\\n            \");\n  return `<fev1:Tributos>\n            ${items}\n          </fev1:Tributos>`;\n}\n\nfunction formatAmount(n: number): string {\n  // AFIP wants 2-decimal precision for monetary fields; some allow 6 but 2\n  // is the universal safe choice and matches what end-user invoices show.\n  return n.toFixed(2);\n}\n\n/**\n * Solicit a CAE (Código de Autorización Electrónico) for a single\n * comprobante. The PRIMARY emission entrypoint — use this to authorize a\n * Factura A/B/C, Nota de Débito, or Nota de Crédito.\n *\n * # Pre-flight checklist\n *\n * 1. `cbteDesde` = `consultarUltimoAutorizado() + 1` (or 1 for first emission).\n * 2. `impTotal` MUST equal `impTotConc + impNeto + impIVA + impOpEx + impTrib`.\n *    AFIP rejects with code 10048 if it doesn't.\n * 3. For Factura C (monotributista): `impIVA = 0` and `iva` must be empty.\n *    For Factura A/B: include at least one `iva` row.\n * 4. For `concepto = SERVICIOS` or `PRODUCTOS_Y_SERVICIOS`: include\n *    `fchServDesde`, `fchServHasta`, `fchVtoPago`.\n * 5. For Nota de Crédito/Débito: include `cbtesAsoc` referencing the original.\n * 6. `cbteFch` must be within ±5 days of today (servicios: ±10).\n *\n * # On rejection (`resultado: \"R\"`)\n *\n * Inspect `errors` (top-level request issues) and `observaciones` (per-detail\n * issues). The most common rejection codes are documented in `AGENTS.md`.\n */\n/**\n * Defense-in-depth: assert every numeric field that lands in the CAE XML is a\n * finite number *before* we build the envelope. The Zod tool wrapper already\n * enforces this, but non-tool callers (WsfeClient.solicitarCAE and the raw\n * `solicitarCAE` export) bypass Zod — a crafted non-number (NaN/Infinity/a\n * string) would otherwise be interpolated straight into the fiscal document.\n * Throws WsfeValidationError so it never reaches AFIP.\n */\nfunction assertFiniteCaeNumbers(input: SolicitarCaeInput): void {\n  const numericFields: [string, unknown][] = [\n    [\"ptoVta\", input.ptoVta],\n    [\"cbteTipo\", input.cbteTipo],\n    [\"docTipo\", input.docTipo],\n    [\"cbteDesde\", input.cbteDesde],\n    [\"cbteHasta\", input.cbteHasta],\n    [\"impTotal\", input.impTotal],\n    [\"impNeto\", input.impNeto],\n    [\"impIVA\", input.impIVA],\n    [\"impTotConc\", input.impTotConc],\n    [\"impOpEx\", input.impOpEx],\n    [\"impTrib\", input.impTrib],\n    [\"monCotiz\", input.monCotiz],\n  ];\n  const bad = numericFields.filter(\n    ([, v]) => v !== undefined && (typeof v !== \"number\" || !Number.isFinite(v)),\n  );\n  // docNro is string|number by contract; only reject a numeric-but-non-finite\n  // value (a string docNro is escaped downstream, so it's XML-safe as-is).\n  if (typeof input.docNro === \"number\" && !Number.isFinite(input.docNro)) {\n    bad.push([\"docNro\", input.docNro]);\n  }\n  if (bad.length > 0) {\n    throw new WsfeValidationError(\n      `Campos numéricos inválidos en solicitarCAE (deben ser números finitos): ${bad\n        .map(([f, v]) => `${f}=${String(v)}`)\n        .join(\", \")}`,\n    );\n  }\n}\n\nexport async function solicitarCAE(\n  opts: CommonRequestOptions & SolicitarCaeInput,\n): Promise<SolicitarCaeResult> {\n  assertFiniteCaeNumbers(opts);\n\n  const cantReg = opts.cbteHasta - opts.cbteDesde + 1;\n\n  // AFIP RG 5616: <CondicionIVAReceptorId> is mandatory (rejection obs\n  // 10246 if absent). Derive a safe default when the caller didn't pass\n  // one — Consumidor Final for DocTipo 99, otherwise Responsable Inscripto\n  // — so pre-RG-5616 callers keep working; pass it explicitly otherwise.\n  const condicionIvaReceptorId =\n    opts.condicionIvaReceptorId ?? (Number(opts.docTipo) === 99 ? 5 : 1);\n\n  const optServiceDates =\n    opts.fchServDesde && opts.fchServHasta && opts.fchVtoPago\n      ? `<fev1:FchServDesde>${escapeXml(opts.fchServDesde)}</fev1:FchServDesde>\n              <fev1:FchServHasta>${escapeXml(opts.fchServHasta)}</fev1:FchServHasta>\n              <fev1:FchVtoPago>${escapeXml(opts.fchVtoPago)}</fev1:FchVtoPago>`\n      : \"\";\n\n  const optAsoc =\n    opts.cbtesAsoc && opts.cbtesAsoc.length > 0\n      ? `<fev1:CbtesAsoc>\n              ${opts.cbtesAsoc\n                .map(\n                  (c) => `<fev1:CbteAsoc>\n                <fev1:Tipo>${c.tipo}</fev1:Tipo>\n                <fev1:PtoVta>${c.ptoVta}</fev1:PtoVta>\n                <fev1:Nro>${c.nro}</fev1:Nro>${c.cuit ? `\\n                <fev1:Cuit>${escapeXml(c.cuit)}</fev1:Cuit>` : \"\"}${c.fecha ? `\\n                <fev1:CbteFch>${escapeXml(c.fecha)}</fev1:CbteFch>` : \"\"}\n              </fev1:CbteAsoc>`,\n                )\n                .join(\"\\n              \")}\n            </fev1:CbtesAsoc>`\n      : \"\";\n\n  const optOpcionales =\n    opts.opcionales && opts.opcionales.length > 0\n      ? `<fev1:Opcionales>\n              ${opts.opcionales\n                .map(\n                  (o) => `<fev1:Opcional>\n                <fev1:Id>${escapeXml(o.id)}</fev1:Id>\n                <fev1:Valor>${escapeXml(o.valor)}</fev1:Valor>\n              </fev1:Opcional>`,\n                )\n                .join(\"\\n              \")}\n            </fev1:Opcionales>`\n      : \"\";\n\n  const body = `<fev1:FeCAEReq>\n        <fev1:FeCabReq>\n          <fev1:CantReg>${cantReg}</fev1:CantReg>\n          <fev1:PtoVta>${opts.ptoVta}</fev1:PtoVta>\n          <fev1:CbteTipo>${opts.cbteTipo}</fev1:CbteTipo>\n        </fev1:FeCabReq>\n        <fev1:FeDetReq>\n          <fev1:FECAEDetRequest>\n            <fev1:Concepto>${opts.concepto}</fev1:Concepto>\n            <fev1:DocTipo>${opts.docTipo}</fev1:DocTipo>\n            <fev1:DocNro>${escapeXml(String(opts.docNro))}</fev1:DocNro>\n            <fev1:CbteDesde>${opts.cbteDesde}</fev1:CbteDesde>\n            <fev1:CbteHasta>${opts.cbteHasta}</fev1:CbteHasta>\n            <fev1:CbteFch>${escapeXml(opts.cbteFch)}</fev1:CbteFch>\n            <fev1:ImpTotal>${formatAmount(opts.impTotal)}</fev1:ImpTotal>\n            <fev1:ImpTotConc>${formatAmount(opts.impTotConc ?? 0)}</fev1:ImpTotConc>\n            <fev1:ImpNeto>${formatAmount(opts.impNeto)}</fev1:ImpNeto>\n            <fev1:ImpOpEx>${formatAmount(opts.impOpEx ?? 0)}</fev1:ImpOpEx>\n            <fev1:ImpTrib>${formatAmount(opts.impTrib ?? 0)}</fev1:ImpTrib>\n            <fev1:ImpIVA>${formatAmount(opts.impIVA)}</fev1:ImpIVA>\n            ${optServiceDates}\n            <fev1:MonId>${escapeXml(opts.monId ?? \"PES\")}</fev1:MonId>\n            <fev1:MonCotiz>${formatAmount(opts.monCotiz ?? 1)}</fev1:MonCotiz>\n            <fev1:CondicionIVAReceptorId>${condicionIvaReceptorId}</fev1:CondicionIVAReceptorId>\n            ${buildTributosBlock(opts.tributos)}\n            ${buildIvaBlock(opts.iva)}\n            ${optAsoc}\n            ${optOpcionales}\n          </fev1:FECAEDetRequest>\n        </fev1:FeDetReq>\n      </fev1:FeCAEReq>`;\n\n  // FECAESolicitar is NON-IDEMPOTENT: it authorizes a fiscal comprobante\n  // number. A retry after an AFIP timeout that happened *post-authorization*\n  // would emit a duplicate (or surface a false failure while N is legally\n  // authorized). Force maxRetries=0 for this call specifically — read ops\n  // (FECompUltimoAutorizado, catalogs, dummy) keep their configured retries.\n  const xml = await callWsfe(\n    \"FECAESolicitar\",\n    body,\n    { ...opts, maxRetries: 0 },\n    \"wsfe.solicitarCAE\",\n  );\n  checkSoapFault(xml);\n\n  const errors = extractErrors(xml);\n  const eventos = extractEventos(xml);\n  const detResp = extractTag(xml, \"FECAEDetResponse\") ?? xml;\n  const resultado = (extractTag(xml, \"Resultado\") ??\n    \"R\") as SolicitarCaeResult[\"resultado\"];\n\n  return {\n    resultado,\n    cae: extractTag(detResp, \"CAE\") || null,\n    caeFchVto: extractTag(detResp, \"CAEFchVto\") || null,\n    ptoVta: extractNumber(xml, \"PtoVta\"),\n    cbteTipo: extractNumber(xml, \"CbteTipo\") as CbteTipoCode,\n    cbteDesde: extractNumber(detResp, \"CbteDesde\"),\n    cbteHasta: extractNumber(detResp, \"CbteHasta\"),\n    cbteFch: extractTag(detResp, \"CbteFch\") ?? \"\",\n    fchProceso: extractTag(xml, \"FchProceso\") ?? \"\",\n    observaciones: extractObservaciones(detResp),\n    errors,\n    eventos,\n  };\n}\n\n// ============================================================================\n// Catalog operations — live AFIP catalogs\n// ============================================================================\n\nexport interface CatalogItem {\n  id: number | string;\n  desc: string;\n  fchDesde?: string;\n  fchHasta?: string;\n}\n\nasync function getCatalog(\n  operation: string,\n  opts: CommonRequestOptions,\n  itemTag: string,\n): Promise<CatalogItem[]> {\n  const xml = await callWsfe(operation, \"\", opts, `wsfe.${operation}`);\n  checkSoapFault(xml);\n  const result =\n    extractTag(xml, \"ResultGet\") ?? extractTag(xml, \"ResultGetResponse\") ?? xml;\n  return extractTagAll(result, itemTag).map((item) => {\n    const fchDesde = extractTag(item, \"FchDesde\");\n    const fchHasta = extractTag(item, \"FchHasta\");\n    return {\n      id: extractTag(item, \"Id\") ?? \"\",\n      desc: decodeXml(extractTag(item, \"Desc\") ?? \"\"),\n      ...(fchDesde !== null ? { fchDesde } : {}),\n      ...(fchHasta !== null ? { fchHasta } : {}),\n    };\n  });\n}\n\n/** Get the live AFIP comprobante-types catalog. */\nexport async function getTiposCbte(\n  opts: CommonRequestOptions,\n): Promise<CatalogItem[]> {\n  return getCatalog(\"FEParamGetTiposCbte\", opts, \"CbteTipo\");\n}\n\n/** Get the live AFIP document-types catalog. */\nexport async function getTiposDoc(\n  opts: CommonRequestOptions,\n): Promise<CatalogItem[]> {\n  return getCatalog(\"FEParamGetTiposDoc\", opts, \"DocTipo\");\n}\n\n/** Get the live AFIP IVA-rates catalog. */\nexport async function getTiposIva(\n  opts: CommonRequestOptions,\n): Promise<CatalogItem[]> {\n  return getCatalog(\"FEParamGetTiposIva\", opts, \"IvaTipo\");\n}\n\n/** Get the live AFIP concepto catalog (Productos / Servicios / both). */\nexport async function getTiposConcepto(\n  opts: CommonRequestOptions,\n): Promise<CatalogItem[]> {\n  return getCatalog(\"FEParamGetTiposConcepto\", opts, \"ConceptoTipo\");\n}\n\n/** Get the live AFIP currencies catalog. */\nexport async function getTiposMonedas(\n  opts: CommonRequestOptions,\n): Promise<CatalogItem[]> {\n  return getCatalog(\"FEParamGetTiposMonedas\", opts, \"Moneda\");\n}\n\n/**\n * Get the AFIP-published exchange rate for a foreign currency vs ARS.\n * Required when emitting Factura E or any multi-currency invoice.\n */\nexport async function getCotizacion(\n  opts: CommonRequestOptions & { monId: string },\n): Promise<{ monId: string; cotiz: number; fchCotiz: string }> {\n  const body = `<fev1:MonId>${escapeXml(opts.monId)}</fev1:MonId>`;\n  const xml = await callWsfe(\n    \"FEParamGetCotizacion\",\n    body,\n    opts,\n    \"wsfe.getCotizacion\",\n  );\n  checkSoapFault(xml);\n  return {\n    monId: extractTag(xml, \"MonId\") ?? opts.monId,\n    cotiz: extractNumber(xml, \"MonCotiz\"),\n    fchCotiz: extractTag(xml, \"FchCotiz\") ?? \"\",\n  };\n}\n","/**\n * High-level WSFE client. Combines the WSAA token-cache (from\n * `@ar-agents/identity/wsaa`) with the WSFE operations from `wsfe.ts`.\n *\n * Most apps interact only with this class — call its methods, get back\n * normalized result types, never touch SOAP envelopes.\n *\n * # Setup\n *\n * 1. Generate cert + register alias as documented in the\n *    `@ar-agents/identity` README.\n * 2. In ARCA → \"Administrador de Relaciones de Clave Fiscal\", authorize the\n *    alias for service `wsfe` (Servicio Web de Facturación Electrónica).\n * 3. Construct the client:\n *\n *    ```ts\n *    import { WsfeClient } from \"@ar-agents/facturacion\";\n *\n *    const wsfe = new WsfeClient({\n *      certPath: process.env.AFIP_CERT_PATH!,\n *      keyPath: process.env.AFIP_KEY_PATH!,\n *      cuit: process.env.AFIP_CUIT!,\n *      env: \"prod\",\n *    });\n *    ```\n *\n * The same cert that powers `@ar-agents/identity` works here — you just need\n * to authorize the `wsfe` service in addition to whatever padron service\n * you're using.\n */\n\nimport {\n  TokenCache,\n  type TokenStore,\n} from \"@ar-agents/identity/wsaa\";\nimport { normalizeCuit } from \"@ar-agents/identity\";\nimport {\n  consultarComprobante,\n  consultarUltimoAutorizado,\n  dummy,\n  getCotizacion,\n  getTiposCbte,\n  getTiposConcepto,\n  getTiposDoc,\n  getTiposIva,\n  getTiposMonedas,\n  solicitarCAE,\n  WSFE_SERVICE_NAME,\n} from \"./wsfe\";\nimport type {\n  ConsultarComprobanteResult,\n  DummyResult,\n  SolicitarCaeInput,\n  SolicitarCaeResult,\n  UltimoComprobanteResult,\n  WsfeEnv,\n} from \"./types\";\nimport type { CbteTipoCode } from \"./catalogs\";\nimport { WsfeNotConfiguredError } from \"./errors\";\n\nexport interface WsfeClientOptions {\n  /** X.509 cert PEM file path. Mutually exclusive with `certPem`. */\n  certPath?: string;\n  /** RSA private key PEM file path. Mutually exclusive with `keyPem`. */\n  keyPath?: string;\n  /** X.509 cert as a PEM string (for serverless: read from env var). */\n  certPem?: string;\n  /** RSA private key as a PEM string. */\n  keyPem?: string;\n  /**\n   * The CUIT whose Clave Fiscal authorized the certificate. Goes in every\n   * request as `Cuit` and is the issuer of all comprobantes emitted.\n   */\n  cuit: string;\n  /** \"homo\" for sandbox; \"prod\" for live. */\n  env: WsfeEnv;\n  /** Override TA storage for multi-process setups (Redis, DB, etc.). */\n  tokenStore?: TokenStore;\n  /** Override WSAA URL (testing only). */\n  wsaaEndpoint?: string;\n  /** Override WSFE URL (testing only). */\n  wsfeEndpoint?: 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  /**\n   * Observability hook fired after every WSAA + WSFE request.\n   */\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\ninterface CommonOps {\n  ta: import(\"@ar-agents/identity/wsaa\").AccessTicket;\n  env: WsfeEnv;\n  cuit: string;\n  endpointOverride?: string;\n  fetchImpl?: typeof fetch;\n  requestTimeoutMs?: number;\n  maxRetries?: number;\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\nexport class WsfeClient {\n  private readonly cache: TokenCache;\n  private readonly cuit: string;\n  private readonly env: WsfeEnv;\n  private readonly wsfeEndpoint: string | undefined;\n  private readonly fetchImpl: typeof fetch | undefined;\n  private readonly requestTimeoutMs: number | undefined;\n  private readonly maxRetries: number | undefined;\n  private readonly onCall: WsfeClientOptions[\"onCall\"];\n\n  constructor(options: WsfeClientOptions) {\n    const hasPaths = options.certPath && options.keyPath;\n    const hasPems = options.certPem && options.keyPem;\n    if ((!hasPaths && !hasPems) || !options.cuit) {\n      throw new WsfeNotConfiguredError();\n    }\n\n    this.cache = new TokenCache({\n      env: options.env,\n      ...(options.certPath !== undefined ? { certPath: options.certPath } : {}),\n      ...(options.keyPath !== undefined ? { keyPath: options.keyPath } : {}),\n      ...(options.certPem !== undefined ? { certPem: options.certPem } : {}),\n      ...(options.keyPem !== undefined ? { keyPem: options.keyPem } : {}),\n      ...(options.tokenStore !== undefined ? { store: options.tokenStore } : {}),\n      ...(options.wsaaEndpoint !== undefined\n        ? { endpointOverride: options.wsaaEndpoint }\n        : {}),\n      ...(options.fetchImpl !== undefined ? { fetchImpl: options.fetchImpl } : {}),\n      ...(options.requestTimeoutMs !== undefined\n        ? { requestTimeoutMs: options.requestTimeoutMs }\n        : {}),\n      ...(options.maxRetries !== undefined ? { maxRetries: options.maxRetries } : {}),\n      ...(options.onCall !== undefined ? { onCall: options.onCall } : {}),\n    });\n    this.cuit = normalizeCuit(options.cuit);\n    this.env = options.env;\n    this.wsfeEndpoint = options.wsfeEndpoint;\n    this.fetchImpl = options.fetchImpl;\n    this.requestTimeoutMs = options.requestTimeoutMs;\n    this.maxRetries = options.maxRetries;\n    this.onCall = options.onCall;\n  }\n\n  private async commonOps(): Promise<CommonOps> {\n    const ta = await this.cache.getTicket(WSFE_SERVICE_NAME);\n    const ops: CommonOps = {\n      ta,\n      env: this.env,\n      cuit: this.cuit,\n    };\n    if (this.wsfeEndpoint !== undefined) ops.endpointOverride = this.wsfeEndpoint;\n    if (this.fetchImpl !== undefined) ops.fetchImpl = this.fetchImpl;\n    if (this.requestTimeoutMs !== undefined)\n      ops.requestTimeoutMs = this.requestTimeoutMs;\n    if (this.maxRetries !== undefined) ops.maxRetries = this.maxRetries;\n    if (this.onCall !== undefined) ops.onCall = this.onCall;\n    return ops;\n  }\n\n  /** AFIP WSFE health check. Returns `{ appServer, dbServer, authServer }`. */\n  async dummy(): Promise<DummyResult> {\n    return dummy(await this.commonOps());\n  }\n\n  /**\n   * Get the last authorized comprobante number for a (PtoVta, CbteTipo) pair.\n   * Use `result.cbteNro + 1` as the next emission's `cbteDesde`.\n   */\n  async consultarUltimoAutorizado(\n    ptoVta: number,\n    cbteTipo: CbteTipoCode,\n  ): Promise<UltimoComprobanteResult> {\n    const ops = await this.commonOps();\n    return consultarUltimoAutorizado({ ...ops, ptoVta, cbteTipo });\n  }\n\n  /** Look up a previously-authorized comprobante by its number. */\n  async consultarComprobante(\n    ptoVta: number,\n    cbteTipo: CbteTipoCode,\n    cbteNro: number,\n  ): Promise<ConsultarComprobanteResult> {\n    const ops = await this.commonOps();\n    return consultarComprobante({ ...ops, ptoVta, cbteTipo, cbteNro });\n  }\n\n  /**\n   * Solicit a CAE (Código de Autorización Electrónico) for a single\n   * comprobante. The PRIMARY emission method.\n   */\n  async solicitarCAE(input: SolicitarCaeInput): Promise<SolicitarCaeResult> {\n    const ops = await this.commonOps();\n    return solicitarCAE({ ...ops, ...input });\n  }\n\n  /** Live AFIP catalog of comprobante types. */\n  async getTiposCbte() {\n    return getTiposCbte(await this.commonOps());\n  }\n\n  /** Live AFIP catalog of document types. */\n  async getTiposDoc() {\n    return getTiposDoc(await this.commonOps());\n  }\n\n  /** Live AFIP catalog of IVA rates. */\n  async getTiposIva() {\n    return getTiposIva(await this.commonOps());\n  }\n\n  /** Live AFIP catalog of conceptos. */\n  async getTiposConcepto() {\n    return getTiposConcepto(await this.commonOps());\n  }\n\n  /** Live AFIP catalog of currencies. */\n  async getTiposMonedas() {\n    return getTiposMonedas(await this.commonOps());\n  }\n\n  /** Get the AFIP-published exchange rate for a foreign currency vs ARS. */\n  async getCotizacion(monId: string) {\n    const ops = await this.commonOps();\n    return getCotizacion({ ...ops, monId });\n  }\n}\n","/**\n * AFIP/ARCA WSFE catalogs — the canonical IDs you pass to `solicitarCAE` for\n * comprobante type, document type, IVA rate, concept, and currency.\n *\n * These are stable AFIP constants (some date back to RG 100/1998); they don't\n * change. Mirroring them here lets agents resolve a human-readable label\n * (e.g. \"Factura C\" or \"21%\") to its WSFE numeric code WITHOUT a network\n * round-trip to AFIP's `FEParamGetTipos*` endpoints.\n *\n * For the authoritative live list, use `getTiposCbte()`, `getTiposDoc()`,\n * `getTiposIva()`, `getTiposConcepto()` from `wsfe.ts` — they hit AFIP in\n * real time and pick up newly-added codes (e.g., FCE MiPyMEs 2018).\n */\n\n/**\n * Tipo de comprobante (CbteTipo). The first thing you pick when emitting:\n * what kind of fiscal document is this?\n *\n * The choice depends on (a) your tax condition as the issuer and (b) the\n * receiver's tax condition. Common matrix:\n *\n * | Issuer ↓ / Receiver →   | RI       | Mono     | Cons. Final | Exento | Exterior |\n * | ----------------------- | -------- | -------- | ----------- | ------ | -------- |\n * | Responsable Inscripto   | A (1)    | A (1)    | B (6)       | B (6)  | E (19)   |\n * | Monotributista          | C (11)   | C (11)   | C (11)      | C (11) | E (19)   |\n * | Exento                  | C (11)   | C (11)   | C (11)      | C (11) | E (19)   |\n *\n * For credit/debit notes, the rule is: same letter as the original invoice.\n *\n * Common pitfall: you can't issue Factura M unless AFIP has flagged your CUIT\n * as \"Sujeto No Categorizado\" — for normal flows ignore tipo 51.\n */\nexport const CbteTipo = {\n  FACTURA_A: 1,\n  NOTA_DEBITO_A: 2,\n  NOTA_CREDITO_A: 3,\n  RECIBO_A: 4,\n  NOTA_VENTA_AL_CONTADO_A: 5,\n  FACTURA_B: 6,\n  NOTA_DEBITO_B: 7,\n  NOTA_CREDITO_B: 8,\n  RECIBO_B: 9,\n  NOTA_VENTA_AL_CONTADO_B: 10,\n  FACTURA_C: 11,\n  NOTA_DEBITO_C: 12,\n  NOTA_CREDITO_C: 13,\n  RECIBO_C: 15,\n  FACTURA_M: 51,\n  NOTA_DEBITO_M: 52,\n  NOTA_CREDITO_M: 53,\n  RECIBO_M: 54,\n  // FCE MiPyMEs (Factura de Crédito Electrónica) — RG 4367/2018\n  FCE_FACTURA_A: 201,\n  FCE_NOTA_DEBITO_A: 202,\n  FCE_NOTA_CREDITO_A: 203,\n  FCE_FACTURA_B: 206,\n  FCE_NOTA_DEBITO_B: 207,\n  FCE_NOTA_CREDITO_B: 208,\n  FCE_FACTURA_C: 211,\n  FCE_NOTA_DEBITO_C: 212,\n  FCE_NOTA_CREDITO_C: 213,\n  // Comprobantes E (exportación)\n  FACTURA_E: 19,\n  NOTA_DEBITO_E: 20,\n  NOTA_CREDITO_E: 21,\n} as const;\n\nexport type CbteTipoCode = (typeof CbteTipo)[keyof typeof CbteTipo];\n\n/**\n * Tipo de documento (DocTipo) — what kind of identifier the receiver is\n * presenting. CUIT is the most common for B2B; DNI for consumer-facing flows.\n */\nexport const DocTipo = {\n  CUIT: 80,\n  CUIL: 86,\n  CDI: 87,\n  LE: 89,\n  LC: 90,\n  CI_EXTRANJERA: 91,\n  EN_TRAMITE: 92,\n  ACTA_NACIMIENTO: 93,\n  PASAPORTE: 94,\n  CI_BS_AS_RNP: 95,\n  DNI: 96,\n  /**\n   * Special \"no identification\" code for consumer-facing sales below the AFIP\n   * threshold (currently ~$417k as of 2026). Pair with `DocNro: 0`.\n   */\n  CONSUMIDOR_FINAL: 99,\n} as const;\n\nexport type DocTipoCode = (typeof DocTipo)[keyof typeof DocTipo];\n\n/**\n * Condición frente al IVA del receptor — MANDATORY in FECAESolicitar since\n * AFIP Resolución General 5616 (request rejected with observación 10246 if\n * absent). Codes from AFIP's `FEParamGetCondicionIvaReceptor` catalog. For\n * a Factura C (monotributista emisor) to a walk-in buyer use\n * `CONSUMIDOR_FINAL` (5) with `DocTipo.CONSUMIDOR_FINAL` + `DocNro 0`.\n */\nexport const CondicionIvaReceptor = {\n  RESPONSABLE_INSCRIPTO: 1,\n  SUJETO_EXENTO: 4,\n  CONSUMIDOR_FINAL: 5,\n  RESPONSABLE_MONOTRIBUTO: 6,\n  SUJETO_NO_CATEGORIZADO: 7,\n  PROVEEDOR_DEL_EXTERIOR: 8,\n  CLIENTE_DEL_EXTERIOR: 9,\n  IVA_LIBERADO_LEY_19640: 10,\n  MONOTRIBUTISTA_SOCIAL: 13,\n  IVA_NO_ALCANZADO: 15,\n  MONOTRIBUTO_TRABAJADOR_INDEPENDIENTE_PROMOVIDO: 16,\n} as const;\n\nexport type CondicionIvaReceptorCode =\n  (typeof CondicionIvaReceptor)[keyof typeof CondicionIvaReceptor];\n\n/**\n * Concepto del comprobante. Determines whether the `FchServDesde`,\n * `FchServHasta`, and `FchVtoPago` fields are required:\n *\n * - **Productos (1)**: dates not required.\n * - **Servicios (2)**: dates REQUIRED — represents the service period and\n *   the payment due date.\n * - **Productos y Servicios (3)**: dates required.\n *\n * For SaaS subscriptions, use `SERVICIOS` and pass the billing period.\n */\nexport const Concepto = {\n  PRODUCTOS: 1,\n  SERVICIOS: 2,\n  PRODUCTOS_Y_SERVICIOS: 3,\n} as const;\n\nexport type ConceptoCode = (typeof Concepto)[keyof typeof Concepto];\n\n/**\n * Alícuotas de IVA. The numeric code goes inside the `<Iva><AlicIva><Id>`\n * element of the request; the percentage is what your customer sees.\n *\n * For monotributistas (Factura C), do NOT include any `<Iva>` items — the\n * concept of IVA discrimination doesn't apply. `ImpIVA` must be 0.\n */\nexport const AlicuotaIva = {\n  CERO: { id: 3, percent: 0 },\n  DOS_CINCO: { id: 9, percent: 2.5 },\n  CINCO: { id: 8, percent: 5 },\n  DIEZ_CINCO: { id: 4, percent: 10.5 },\n  VEINTIUNO: { id: 5, percent: 21 },\n  VEINTISIETE: { id: 6, percent: 27 },\n} as const;\n\nexport type AlicuotaIvaCode =\n  (typeof AlicuotaIva)[keyof typeof AlicuotaIva][\"id\"];\n\n/**\n * Result code from a `solicitarCAE` call.\n *\n * - **A — Aprobado**: CAE issued. Persist `cae` + `caeFchVto`.\n * - **R — Rechazado**: errors returned. Inspect `observaciones` and `errors`.\n * - **P — Parcial**: at least one detail rejected (rare with `CantReg=1`).\n */\nexport type WsfeResultado = \"A\" | \"R\" | \"P\";\n\n/**\n * Currency code (MonId). PES = Pesos Argentinos, the default. Use other codes\n * for export invoices (Factura E) or multi-currency invoices.\n */\nexport const Moneda = {\n  PESOS: \"PES\",\n  DOLAR: \"DOL\",\n  EURO: \"060\",\n  REAL: \"012\",\n} as const;\n\nexport type MonedaCode = (typeof Moneda)[keyof typeof Moneda];\n\n/**\n * Human-readable label for a comprobante type code. Use to render UI or to\n * surface the result of `consultarUltimoAutorizado()` to end users.\n */\nexport function describeCbteTipo(code: number): string {\n  const map: Record<number, string> = {\n    1: \"Factura A\",\n    2: \"Nota de Débito A\",\n    3: \"Nota de Crédito A\",\n    4: \"Recibo A\",\n    5: \"Nota de Venta al Contado A\",\n    6: \"Factura B\",\n    7: \"Nota de Débito B\",\n    8: \"Nota de Crédito B\",\n    9: \"Recibo B\",\n    10: \"Nota de Venta al Contado B\",\n    11: \"Factura C\",\n    12: \"Nota de Débito C\",\n    13: \"Nota de Crédito C\",\n    15: \"Recibo C\",\n    19: \"Factura E (exportación)\",\n    20: \"Nota de Débito E\",\n    21: \"Nota de Crédito E\",\n    51: \"Factura M\",\n    52: \"Nota de Débito M\",\n    53: \"Nota de Crédito M\",\n    54: \"Recibo M\",\n    201: \"FCE Factura A\",\n    202: \"FCE Nota de Débito A\",\n    203: \"FCE Nota de Crédito A\",\n    206: \"FCE Factura B\",\n    207: \"FCE Nota de Débito B\",\n    208: \"FCE Nota de Crédito B\",\n    211: \"FCE Factura C\",\n    212: \"FCE Nota de Débito C\",\n    213: \"FCE Nota de Crédito C\",\n  };\n  return map[code] ?? `Comprobante tipo ${code}`;\n}\n","/**\n * Pre-flight validation for `SolicitarCaeInput`. Catches the most common\n * AFIP rejection reasons LOCALLY so you don't burn a network round-trip on\n * a malformed request.\n *\n * The list here is curated from real production rejection patterns — every\n * check corresponds to an AFIP error code documented in `AGENTS.md`.\n *\n * Returns `{ valid: true }` when the input is internally consistent;\n * returns `{ valid: false, errors: [...] }` with Spanish-language error\n * messages otherwise.\n */\n\nimport type { SolicitarCaeInput } from \"./types\";\nimport { CbteTipo, Concepto } from \"./catalogs\";\n\nexport interface ValidationError {\n  field: string;\n  message: string;\n}\n\nexport interface ValidationResult {\n  valid: boolean;\n  errors: ValidationError[];\n}\n\nconst FACTURA_C_TYPES = new Set<number>([\n  CbteTipo.FACTURA_C,\n  CbteTipo.NOTA_DEBITO_C,\n  CbteTipo.NOTA_CREDITO_C,\n  CbteTipo.RECIBO_C,\n  CbteTipo.FCE_FACTURA_C,\n  CbteTipo.FCE_NOTA_DEBITO_C,\n  CbteTipo.FCE_NOTA_CREDITO_C,\n]);\n\nconst NOTA_TYPES = new Set<number>([\n  CbteTipo.NOTA_DEBITO_A,\n  CbteTipo.NOTA_CREDITO_A,\n  CbteTipo.NOTA_DEBITO_B,\n  CbteTipo.NOTA_CREDITO_B,\n  CbteTipo.NOTA_DEBITO_C,\n  CbteTipo.NOTA_CREDITO_C,\n  CbteTipo.NOTA_DEBITO_M,\n  CbteTipo.NOTA_CREDITO_M,\n  CbteTipo.FCE_NOTA_DEBITO_A,\n  CbteTipo.FCE_NOTA_CREDITO_A,\n  CbteTipo.FCE_NOTA_DEBITO_B,\n  CbteTipo.FCE_NOTA_CREDITO_B,\n  CbteTipo.FCE_NOTA_DEBITO_C,\n  CbteTipo.FCE_NOTA_CREDITO_C,\n]);\n\n/**\n * Validate a `SolicitarCaeInput` against AFIP's known constraints. Run this\n * BEFORE calling `solicitarCAE()` to catch errors locally.\n *\n * @example\n * ```ts\n * const v = validateSolicitarCae(input);\n * if (!v.valid) {\n *   throw new WsfeValidationError(\n *     `Factura inválida: ${v.errors.map(e => e.message).join(\"; \")}`,\n *     v.errors,\n *   );\n * }\n * await wsfe.solicitarCAE(input);\n * ```\n */\nexport function validateSolicitarCae(\n  input: SolicitarCaeInput,\n): ValidationResult {\n  const errors: ValidationError[] = [];\n\n  // ---- ptoVta ----\n  if (!Number.isInteger(input.ptoVta) || input.ptoVta < 1 || input.ptoVta > 99999) {\n    errors.push({\n      field: \"ptoVta\",\n      message: `Punto de venta inválido (${input.ptoVta}). Debe ser un entero entre 1 y 99999.`,\n    });\n  }\n\n  // ---- cbteDesde / cbteHasta ----\n  if (!Number.isInteger(input.cbteDesde) || input.cbteDesde < 1) {\n    errors.push({\n      field: \"cbteDesde\",\n      message: `Número de comprobante desde inválido (${input.cbteDesde}). Debe ser un entero >= 1.`,\n    });\n  }\n  if (!Number.isInteger(input.cbteHasta) || input.cbteHasta < input.cbteDesde) {\n    errors.push({\n      field: \"cbteHasta\",\n      message: `Número de comprobante hasta (${input.cbteHasta}) debe ser >= cbteDesde (${input.cbteDesde}).`,\n    });\n  }\n\n  // ---- cbteFch ----\n  if (!/^\\d{8}$/.test(input.cbteFch)) {\n    errors.push({\n      field: \"cbteFch\",\n      message: `Fecha de comprobante (${input.cbteFch}) debe tener formato YYYYMMDD (ej: \"20260506\").`,\n    });\n  }\n\n  // ---- amount sums (AFIP error 10048) ----\n  const expectedTotal =\n    (input.impTotConc ?? 0) +\n    input.impNeto +\n    input.impIVA +\n    (input.impOpEx ?? 0) +\n    (input.impTrib ?? 0);\n  if (Math.abs(expectedTotal - input.impTotal) > 0.01) {\n    errors.push({\n      field: \"impTotal\",\n      message: `ImpTotal (${input.impTotal.toFixed(2)}) no coincide con la suma de componentes (ImpTotConc + ImpNeto + ImpIVA + ImpOpEx + ImpTrib = ${expectedTotal.toFixed(2)}). AFIP rechaza con error 10048.`,\n    });\n  }\n\n  // ---- IVA discrimination consistency ----\n  const ivaSum = (input.iva ?? []).reduce((s, i) => s + i.importe, 0);\n  if (input.iva && input.iva.length > 0 && Math.abs(ivaSum - input.impIVA) > 0.01) {\n    errors.push({\n      field: \"iva\",\n      message: `Suma de Iva.Importe (${ivaSum.toFixed(2)}) no coincide con ImpIVA (${input.impIVA.toFixed(2)}).`,\n    });\n  }\n  if (!input.iva && input.impIVA > 0) {\n    errors.push({\n      field: \"iva\",\n      message: `ImpIVA es ${input.impIVA.toFixed(2)} pero no se pasaron filas <Iva>. Pasá al menos una fila con baseImp + importe.`,\n    });\n  }\n\n  // ---- Tributos consistency ----\n  if (input.tributos && input.tributos.length > 0) {\n    const tribSum = input.tributos.reduce((s, t) => s + t.importe, 0);\n    if (Math.abs(tribSum - (input.impTrib ?? 0)) > 0.01) {\n      errors.push({\n        field: \"tributos\",\n        message: `Suma de Tributo.Importe (${tribSum.toFixed(2)}) no coincide con ImpTrib (${(input.impTrib ?? 0).toFixed(2)}).`,\n      });\n    }\n  }\n\n  // ---- Factura C: no IVA allowed ----\n  if (FACTURA_C_TYPES.has(input.cbteTipo)) {\n    if (input.impIVA > 0) {\n      errors.push({\n        field: \"impIVA\",\n        message: `Factura/Nota tipo ${input.cbteTipo} (Monotributo / Exento) NO admite IVA. ImpIVA debe ser 0.`,\n      });\n    }\n    if (input.iva && input.iva.length > 0) {\n      errors.push({\n        field: \"iva\",\n        message: `Factura/Nota tipo ${input.cbteTipo} NO admite filas <Iva>. Quitalas del request.`,\n      });\n    }\n  }\n\n  // ---- Servicios: dates required ----\n  if (\n    (input.concepto === Concepto.SERVICIOS ||\n      input.concepto === Concepto.PRODUCTOS_Y_SERVICIOS) &&\n    (!input.fchServDesde || !input.fchServHasta || !input.fchVtoPago)\n  ) {\n    errors.push({\n      field: \"fchServDesde\",\n      message: `Concepto = Servicios (${input.concepto}) requiere fchServDesde, fchServHasta y fchVtoPago.`,\n    });\n  }\n\n  // ---- Service date format ----\n  for (const f of [\"fchServDesde\", \"fchServHasta\", \"fchVtoPago\"] as const) {\n    const v = input[f];\n    if (v && !/^\\d{8}$/.test(v)) {\n      errors.push({\n        field: f,\n        message: `${f} (${v}) debe tener formato YYYYMMDD.`,\n      });\n    }\n  }\n\n  // ---- Notas: cbtesAsoc required ----\n  if (NOTA_TYPES.has(input.cbteTipo) && (!input.cbtesAsoc || input.cbtesAsoc.length === 0)) {\n    errors.push({\n      field: \"cbtesAsoc\",\n      message: `Nota de Crédito/Débito tipo ${input.cbteTipo} requiere cbtesAsoc[] referenciando el comprobante original.`,\n    });\n  }\n\n  // ---- monId/monCotiz ----\n  if (input.monId && input.monId !== \"PES\" && (input.monCotiz ?? 1) === 1) {\n    errors.push({\n      field: \"monCotiz\",\n      message: `Moneda ${input.monId} debería tener monCotiz != 1 (cotización vs ARS). Usá getCotizacion(\"${input.monId}\") antes de emitir.`,\n    });\n  }\n\n  return { valid: errors.length === 0, errors };\n}\n","import { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport { WsfeClient } from \"./wsfe-client\";\nimport { describeCbteTipo, type CbteTipoCode } from \"./catalogs\";\nimport { validateSolicitarCae } from \"./validator\";\nimport type { SolicitarCaeInput } from \"./types\";\n\nexport interface FacturacionToolsOptions {\n  /**\n   * The configured `WsfeClient`. If you don't pass one, the tools return\n   * `{ available: false, error: <setup instructions> }` instead of crashing.\n   * Useful for stub deployments or local dev without a cert.\n   */\n  wsfe?: WsfeClient;\n  /**\n   * Override the agent-facing tool descriptions. Useful when the agent's\n   * primary language isn't English/Spanish.\n   */\n  descriptions?: Partial<Record<FacturacionToolName, string>>;\n  /**\n   * Default punto de venta. When set, agents can omit `ptoVta` from inputs.\n   * Most SaaS issue from a single PtoVta, passing it once at boot avoids\n   * the agent having to remember it.\n   */\n  defaultPtoVta?: number;\n}\n\nexport type FacturacionToolName =\n  | \"emitir_factura\"\n  | \"consultar_ultimo_comprobante\"\n  | \"consultar_factura_emitida\"\n  | \"obtener_tipos_comprobante\"\n  | \"obtener_tipos_documento\"\n  | \"obtener_alicuotas_iva\"\n  | \"obtener_tipos_concepto\"\n  | \"obtener_tipos_moneda\"\n  | \"obtener_cotizacion\"\n  | \"health_check_afip\";\n\nconst DEFAULT_DESCRIPTIONS: Record<FacturacionToolName, string> = {\n  emitir_factura:\n    \"Issue an electronic invoice and get its CAE (emitir factura electrónica, facturar) via AFIP/ARCA WSFE. Solicita el CAE (Código de Autorización Electrónico) que valida la factura ante AFIP. RETURNS: el CAE (14 dígitos), su fecha de vencimiento, y el número de comprobante asignado, o errors/observaciones si AFIP rechazó. SIDE EFFECT: el CAE queda registrado en AFIP, NO se puede deshacer; para anular, emitir Nota de Crédito. PRE-FLIGHT: validate_cuit (del receptor) + consultar_ultimo_comprobante para obtener el próximo número. CONSTRAINTS: ImpTotal = ImpNeto + ImpIVA + ImpOpEx + ImpTrib + ImpTotConc (AFIP error 10048 si no). Para Factura C (monotributista), ImpIVA debe ser 0 y no incluir filas iva. Para Servicios, fchServDesde/Hasta/VtoPago obligatorios. Para Notas de Crédito/Débito, cbtesAsoc obligatorio referenciando el comprobante original. The lib pre-valida estas reglas localmente antes del round-trip a AFIP.\",\n\n  consultar_ultimo_comprobante:\n    \"Get the last authorized invoice number (consultar último comprobante autorizado) para un (PtoVta, CbteTipo), i.e. cuál fue el número del último Factura C emitido desde el punto de venta 1. USE BEFORE emitir_factura para obtener el próximo número (último + 1). Returns 0 si nunca se emitió un comprobante de ese tipo desde ese PtoVta, entonces el próximo es 1. PURE READ: no side effects.\",\n\n  consultar_factura_emitida:\n    \"Look up an already-issued invoice (consultar factura emitida, verificar un CAE propio): CAE, fecha, importes, doc receptor. USE WHEN: necesitás verificar que un CAE es válido y matchea con tu base de datos, o estás migrando de otro sistema y querés re-cargar facturas históricas. PURE READ: no side effects.\",\n\n  obtener_tipos_comprobante:\n    \"List AFIP voucher types (tipos de comprobante) (Factura A=1, B=6, C=11, Nota Crédito A=3, etc.). USE WHEN: necesitás mostrar al usuario la lista actualizada (puede haber tipos nuevos que no están en los catalogs hard-coded del lib). HEAVY: hace network round-trip a AFIP, para flujos comunes preferí los constants de `CbteTipo` en `@ar-agents/facturacion`.\",\n\n  obtener_tipos_documento:\n    \"List AFIP document types (tipos de documento) (CUIT=80, DNI=96, Pasaporte=94, Consumidor Final=99, etc.). HEAVY: round-trip a AFIP. Preferí los constants de `DocTipo` para flujos comunes.\",\n\n  obtener_alicuotas_iva:\n    \"List VAT rates (alícuotas de IVA) según AFIP (21%=5, 10.5%=4, 27%=6, 0%=3, etc.). USE WHEN: el usuario necesita ver las opciones para construir una factura B o A. HEAVY: round-trip a AFIP. Preferí `AlicuotaIva` constants para flujos comunes.\",\n\n  obtener_tipos_concepto:\n    \"List concept types (tipos de concepto): Productos (1), Servicios (2), Productos y Servicios (3). HEAVY: round-trip a AFIP. Preferí `Concepto` constants.\",\n\n  obtener_tipos_moneda:\n    \"List currencies accepted for invoicing (tipos de moneda) (PES = Pesos, DOL = Dólar, 060 = Euro, 012 = Real, etc.). USE WHEN: el usuario quiere emitir Factura E (exportación) o multi-moneda. HEAVY: round-trip a AFIP.\",\n\n  obtener_cotizacion:\n    \"Get the official AFIP exchange rate (cotización oficial de moneda extranjera vs ARS). REQUIRED antes de emitir cualquier factura no-PES (AFIP rechaza si la cotización está desactualizada). Devuelve el monCotiz a usar en `emitir_factura`. PURE READ.\",\n\n  health_check_afip:\n    \"Health check de AFIP WSFE, devuelve el status de los servidores app, db, y auth. Use as a /health endpoint o como pre-flight rápido antes de emitir muchas facturas. PURE READ, latencia < 200ms.\",\n};\n\nexport function facturacionTools(\n  options: FacturacionToolsOptions = {},\n): ToolSet {\n  const wsfe = options.wsfe;\n  const desc = (name: FacturacionToolName): string =>\n    options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n  const dPv = options.defaultPtoVta;\n\n  const requireWsfe = (): WsfeClient | { _notConfigured: true } => {\n    if (!wsfe) return { _notConfigured: true };\n    return wsfe;\n  };\n\n  const notConfiguredResult = (op: string) => ({\n    available: false,\n    error: `WSFE no está configurado en este agente (${op} requiere un WsfeClient). Pasale uno a facturacionTools({ wsfe: new WsfeClient({...}) }). Necesitás cert + key X.509 emitidos por ARCA y autorizados para el servicio \"wsfe\".`,\n    data: null,\n  });\n\n  return {\n    emitir_factura: tool({\n      description: desc(\"emitir_factura\"),\n      inputSchema: z.object({\n        ptoVta: z.number().int().positive().optional().describe(\n          \"Punto de venta (1-99999). Omitible si pasaste defaultPtoVta al construir las tools.\",\n        ),\n        cbteTipo: z\n          .union([\n            // A-series (responsables inscriptos, IVA discriminado)\n            z.literal(1).describe(\"Factura A\"),\n            z.literal(2).describe(\"Nota de Débito A\"),\n            z.literal(3).describe(\"Nota de Crédito A\"),\n            z.literal(4).describe(\"Recibo A\"),\n            z.literal(5).describe(\"Nota de Venta al Contado A\"),\n            // B-series (consumidor final / no inscriptos, IVA incluido)\n            z.literal(6).describe(\"Factura B\"),\n            z.literal(7).describe(\"Nota de Débito B\"),\n            z.literal(8).describe(\"Nota de Crédito B\"),\n            z.literal(9).describe(\"Recibo B\"),\n            z.literal(10).describe(\"Nota de Venta al Contado B\"),\n            // C-series (monotributo)\n            z.literal(11).describe(\"Factura C\"),\n            z.literal(12).describe(\"Nota de Débito C\"),\n            z.literal(13).describe(\"Nota de Crédito C\"),\n            z.literal(15).describe(\"Recibo C\"),\n            // E-series (exportación)\n            z.literal(19).describe(\"Factura E (exportación)\"),\n            z.literal(20).describe(\"Nota de Débito E\"),\n            z.literal(21).describe(\"Nota de Crédito E\"),\n            // M-series (monotributistas con renta presunta)\n            z.literal(51).describe(\"Factura M\"),\n            z.literal(52).describe(\"Nota de Débito M\"),\n            z.literal(53).describe(\"Nota de Crédito M\"),\n            z.literal(54).describe(\"Recibo M\"),\n            // FCE MiPyMEs (RG 4367/2018)\n            z.literal(201).describe(\"FCE MiPyMEs Factura A\"),\n            z.literal(202).describe(\"FCE MiPyMEs Nota de Débito A\"),\n            z.literal(203).describe(\"FCE MiPyMEs Nota de Crédito A\"),\n            z.literal(206).describe(\"FCE MiPyMEs Factura B\"),\n            z.literal(207).describe(\"FCE MiPyMEs Nota de Débito B\"),\n            z.literal(208).describe(\"FCE MiPyMEs Nota de Crédito B\"),\n            z.literal(211).describe(\"FCE MiPyMEs Factura C\"),\n            z.literal(212).describe(\"FCE MiPyMEs Nota de Débito C\"),\n            z.literal(213).describe(\"FCE MiPyMEs Nota de Crédito C\"),\n          ])\n          .describe(\n            \"Tipo de comprobante AFIP. Lista cerrada, debe coincidir con CbteTipo en catalogs.ts. Si AFIP agrega nuevos códigos, agregalos a CbteTipo y a este union juntos.\",\n          ),\n        concepto: z\n          .union([\n            z.literal(1).describe(\"Productos\"),\n            z.literal(2).describe(\"Servicios\"),\n            z.literal(3).describe(\"Productos y Servicios\"),\n          ])\n          .describe(\"1 = Productos, 2 = Servicios, 3 = Productos y Servicios.\"),\n        docTipo: z\n          .union([\n            z.literal(80).describe(\"CUIT\"),\n            z.literal(86).describe(\"CUIL\"),\n            z.literal(87).describe(\"CDI (Cédula de Identificación)\"),\n            z.literal(89).describe(\"LE (Libreta de Enrolamiento)\"),\n            z.literal(90).describe(\"LC (Libreta Cívica)\"),\n            z.literal(91).describe(\"CI Extranjera\"),\n            z.literal(92).describe(\"En Trámite\"),\n            z.literal(93).describe(\"Acta de Nacimiento\"),\n            z.literal(94).describe(\"Pasaporte\"),\n            z.literal(95).describe(\"CI Buenos Aires (RNP)\"),\n            z.literal(96).describe(\"DNI\"),\n            z.literal(99).describe(\"Consumidor Final (DocNro: 0)\"),\n          ])\n          .describe(\n            \"Tipo de documento del receptor, lista cerrada AFIP. Debe coincidir con DocTipo en catalogs.ts.\",\n          ),\n        docNro: z.union([z.string(), z.number()]).describe(\n          \"Número de documento del receptor. Para Consumidor Final pasá 0.\",\n        ),\n        cbteFch: z.string().regex(/^\\d{8}$/).describe(\n          'Fecha del comprobante en formato YYYYMMDD (ej: \"20260506\"). Debe estar dentro de ±5 días de hoy (servicios: ±10).',\n        ),\n        impTotal: z.number().nonnegative().finite().describe(\n          \"Importe total de la factura. Debe ser igual a impNeto + impIVA + impOpEx + impTrib + impTotConc.\",\n        ),\n        impNeto: z.number().nonnegative().finite().describe(\n          \"Importe neto gravado (subtotal antes de IVA).\",\n        ),\n        impIVA: z.number().nonnegative().finite().describe(\n          \"Importe IVA. Para Factura C debe ser 0. Para A/B = sum(iva[].importe).\",\n        ),\n        impTotConc: z.number().nonnegative().finite().optional().describe(\n          \"Importe neto no gravado. Default 0.\",\n        ),\n        impOpEx: z.number().nonnegative().finite().optional().describe(\n          \"Importe operaciones exentas. Default 0.\",\n        ),\n        impTrib: z.number().nonnegative().finite().optional().describe(\n          \"Importe total de tributos (provinciales/municipales). Default 0.\",\n        ),\n        cbteDesde: z.number().int().positive().describe(\n          \"Número del comprobante a emitir. Obtenelo con consultar_ultimo_comprobante() + 1.\",\n        ),\n        fchServDesde: z.string().regex(/^\\d{8}$/).optional().describe(\n          \"Servicios: fecha de inicio del período (YYYYMMDD).\",\n        ),\n        fchServHasta: z.string().regex(/^\\d{8}$/).optional().describe(\n          \"Servicios: fecha de fin del período (YYYYMMDD).\",\n        ),\n        fchVtoPago: z.string().regex(/^\\d{8}$/).optional().describe(\n          \"Servicios: fecha de vencimiento del pago (YYYYMMDD).\",\n        ),\n        monId: z.string().optional().describe(\n          'Moneda. Default \"PES\". Otras: \"DOL\", \"060\" (Euro), \"012\" (Real).',\n        ),\n        monCotiz: z.number().optional().describe(\n          \"Cotización vs ARS. Default 1 para PES. Para otras monedas obtenelo con obtener_cotizacion().\",\n        ),\n        iva: z\n          .array(\n            z.object({\n              id: z\n                .union([\n                  z.literal(3).describe(\"0%\"),\n                  z.literal(4).describe(\"10.5%\"),\n                  z.literal(5).describe(\"21%\"),\n                  z.literal(6).describe(\"27%\"),\n                  z.literal(8).describe(\"5%\"),\n                  z.literal(9).describe(\"2.5%\"),\n                ])\n                .describe(\"Alícuota IVA (lista cerrada AFIP).\"),\n              baseImp: z.number().nonnegative().finite().describe(\"Importe sobre el que se calcula el IVA.\"),\n              importe: z.number().nonnegative().finite().describe(\"Importe del IVA (= baseImp × alícuota).\"),\n            }),\n          )\n          .optional()\n          .describe(\"Filas de discriminación IVA. Requerido para Factura A/B con impIVA > 0; vacío para Factura C.\"),\n        cbtesAsoc: z\n          .array(\n            z.object({\n              tipo: z.number().int().positive().describe(\"Tipo del comprobante asociado (mismo enum que cbteTipo).\"),\n              ptoVta: z.number().int().positive().max(99999).describe(\"Punto de venta del comprobante asociado.\"),\n              nro: z.number().int().positive().describe(\"Número del comprobante asociado.\"),\n              cuit: z.string().optional(),\n              fecha: z.string().optional(),\n            }),\n          )\n          .optional()\n          .describe(\"Comprobantes asociados (requerido para Notas de Crédito/Débito).\"),\n      }),\n      execute: async (input) => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w) return notConfiguredResult(\"emitir_factura\");\n        const ptoVta = input.ptoVta ?? dPv;\n        if (!ptoVta) {\n          return {\n            available: false,\n            error:\n              \"Falta ptoVta. Pasalo en el input o configura defaultPtoVta al crear las tools.\",\n            data: null,\n          };\n        }\n        // Build input with conditional spread to satisfy exactOptionalPropertyTypes.\n        const fullInput: SolicitarCaeInput = {\n          ptoVta,\n          cbteTipo: input.cbteTipo as CbteTipoCode,\n          concepto: input.concepto as SolicitarCaeInput[\"concepto\"],\n          docTipo: input.docTipo as SolicitarCaeInput[\"docTipo\"],\n          docNro: input.docNro,\n          cbteDesde: input.cbteDesde,\n          cbteHasta: input.cbteDesde,\n          cbteFch: input.cbteFch,\n          impTotal: input.impTotal,\n          impNeto: input.impNeto,\n          impIVA: input.impIVA,\n          ...(input.impTotConc !== undefined ? { impTotConc: input.impTotConc } : {}),\n          ...(input.impOpEx !== undefined ? { impOpEx: input.impOpEx } : {}),\n          ...(input.impTrib !== undefined ? { impTrib: input.impTrib } : {}),\n          ...(input.fchServDesde !== undefined ? { fchServDesde: input.fchServDesde } : {}),\n          ...(input.fchServHasta !== undefined ? { fchServHasta: input.fchServHasta } : {}),\n          ...(input.fchVtoPago !== undefined ? { fchVtoPago: input.fchVtoPago } : {}),\n          ...(input.monId !== undefined ? { monId: input.monId } : {}),\n          ...(input.monCotiz !== undefined ? { monCotiz: input.monCotiz } : {}),\n          ...(input.iva !== undefined\n            ? {\n                iva: input.iva.map((i) => ({\n                  id: i.id as SolicitarCaeInput[\"iva\"] extends (infer U)[] | undefined\n                    ? U extends { id: infer V }\n                      ? V\n                      : never\n                    : never,\n                  baseImp: i.baseImp,\n                  importe: i.importe,\n                })),\n              }\n            : {}),\n          ...(input.cbtesAsoc !== undefined\n            ? {\n                cbtesAsoc: input.cbtesAsoc.map((c) => ({\n                  tipo: c.tipo as CbteTipoCode,\n                  ptoVta: c.ptoVta,\n                  nro: c.nro,\n                  ...(c.cuit !== undefined ? { cuit: c.cuit } : {}),\n                  ...(c.fecha !== undefined ? { fecha: c.fecha } : {}),\n                })),\n              }\n            : {}),\n        };\n        const v = validateSolicitarCae(fullInput);\n        if (!v.valid) {\n          return {\n            available: true,\n            ok: false,\n            error: `Validación local falló: ${v.errors.map((e) => `[${e.field}] ${e.message}`).join(\"; \")}`,\n            errors: v.errors,\n            data: null,\n          };\n        }\n        const result = await w.solicitarCAE(fullInput);\n        return {\n          available: true,\n          ok: result.resultado === \"A\",\n          ...result,\n          tipoComprobanteDescripcion: describeCbteTipo(result.cbteTipo),\n        };\n      },\n    }),\n\n    consultar_ultimo_comprobante: tool({\n      description: desc(\"consultar_ultimo_comprobante\"),\n      inputSchema: z.object({\n        ptoVta: z.number().int().positive().optional(),\n        cbteTipo: z.number().int(),\n      }),\n      execute: async ({ ptoVta, cbteTipo }) => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"consultar_ultimo_comprobante\");\n        const pv = ptoVta ?? dPv;\n        if (!pv) {\n          return { available: false, error: \"Falta ptoVta.\", data: null };\n        }\n        const result = await w.consultarUltimoAutorizado(\n          pv,\n          cbteTipo as CbteTipoCode,\n        );\n        return {\n          available: true,\n          ...result,\n          tipoComprobanteDescripcion: describeCbteTipo(result.cbteTipo),\n          proximoNumero: result.cbteNro + 1,\n        };\n      },\n    }),\n\n    consultar_factura_emitida: tool({\n      description: desc(\"consultar_factura_emitida\"),\n      inputSchema: z.object({\n        ptoVta: z.number().int().positive().optional(),\n        cbteTipo: z.number().int(),\n        cbteNro: z.number().int().positive(),\n      }),\n      execute: async ({ ptoVta, cbteTipo, cbteNro }) => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"consultar_factura_emitida\");\n        const pv = ptoVta ?? dPv;\n        if (!pv) {\n          return { available: false, error: \"Falta ptoVta.\", data: null };\n        }\n        const result = await w.consultarComprobante(\n          pv,\n          cbteTipo as CbteTipoCode,\n          cbteNro,\n        );\n        return {\n          available: true,\n          ...result,\n          tipoComprobanteDescripcion: describeCbteTipo(result.cbteTipo),\n        };\n      },\n    }),\n\n    obtener_tipos_comprobante: tool({\n      description: desc(\"obtener_tipos_comprobante\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"obtener_tipos_comprobante\");\n        return { available: true, items: await w.getTiposCbte() };\n      },\n    }),\n\n    obtener_tipos_documento: tool({\n      description: desc(\"obtener_tipos_documento\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"obtener_tipos_documento\");\n        return { available: true, items: await w.getTiposDoc() };\n      },\n    }),\n\n    obtener_alicuotas_iva: tool({\n      description: desc(\"obtener_alicuotas_iva\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"obtener_alicuotas_iva\");\n        return { available: true, items: await w.getTiposIva() };\n      },\n    }),\n\n    obtener_tipos_concepto: tool({\n      description: desc(\"obtener_tipos_concepto\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"obtener_tipos_concepto\");\n        return { available: true, items: await w.getTiposConcepto() };\n      },\n    }),\n\n    obtener_tipos_moneda: tool({\n      description: desc(\"obtener_tipos_moneda\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"obtener_tipos_moneda\");\n        return { available: true, items: await w.getTiposMonedas() };\n      },\n    }),\n\n    obtener_cotizacion: tool({\n      description: desc(\"obtener_cotizacion\"),\n      inputSchema: z.object({\n        monId: z.string().describe(\n          'Código de moneda. Ej: \"DOL\" (USD), \"060\" (Euro), \"012\" (Real).',\n        ),\n      }),\n      execute: async ({ monId }) => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w) return notConfiguredResult(\"obtener_cotizacion\");\n        return { available: true, ...(await w.getCotizacion(monId)) };\n      },\n    }),\n\n    health_check_afip: tool({\n      description: desc(\"health_check_afip\"),\n      inputSchema: z.object({}),\n      execute: async () => {\n        const w = requireWsfe();\n        if (\"_notConfigured\" in w)\n          return notConfiguredResult(\"health_check_afip\");\n        const r = await w.dummy();\n        return {\n          available: true,\n          ...r,\n          ok: r.appServer === \"OK\" && r.dbServer === \"OK\" && r.authServer === \"OK\",\n        };\n      },\n    }),\n  } satisfies ToolSet;\n}\n"]}