{"version":3,"sources":["../src/errors.ts","../src/adapter.ts","../src/http.ts","../src/provincias.ts","../src/adapter-andreani.ts","../src/adapter-oca.ts","../src/adapter-correo.ts","../src/tools.ts"],"names":["ArAgentsError","runWithRetry","defaultRetryClassifier","z","tool"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Errors emitted by `@ar-agents/shipping` adapters and helpers.\n */\n\nimport type { Carrier } from \"./types\";\n\nexport type ShippingErrorCode =\n  | \"shipping_not_configured\"\n  | \"shipping_invalid_input\"\n  | \"shipping_carrier_error\"\n  | \"shipping_not_supported\"\n  | \"shipping_unknown_error\";\n\nimport { ArAgentsError } from \"@ar-agents/core\";\n\nconst RETRYABLE_CODES: Record<ShippingErrorCode, boolean> = {\n  shipping_not_configured: false,\n  shipping_invalid_input: false,\n  shipping_carrier_error: true,\n  shipping_not_supported: false,\n  shipping_unknown_error: false,\n};\n\nexport class ShippingError extends ArAgentsError {\n  override readonly code: ShippingErrorCode;\n  readonly details?: unknown;\n\n  constructor(code: ShippingErrorCode, message: string, details?: unknown) {\n    super(message, {\n      code,\n      retryable: RETRYABLE_CODES[code] ?? false,\n      context: details !== undefined ? { details } : {},\n    });\n    this.name = \"ShippingError\";\n    this.code = code;\n    this.details = details;\n  }\n}\n\n/**\n * Thrown when a tool is called against an adapter that hasn't been\n * configured. Surface the message — it tells the user how to enable.\n */\nexport class ShippingNotConfiguredError extends ShippingError {\n  constructor(public carrier: Carrier) {\n    super(\n      \"shipping_not_configured\",\n      `${carrier} no está configurado. Para activar: pasá un \\`${carrier === \"andreani\" ? \"AndreaniAdapter\" : carrier === \"oca\" ? \"OcaAdapter\" : \"CorreoAdapter\"}\\` con credenciales (cliente + API key) a \\`shippingTools()\\`. Mientras tanto, podés usar \\`MockShippingAdapter\\` para desarrollo local sin credenciales.`,\n    );\n    this.name = \"ShippingNotConfiguredError\";\n  }\n}\n\n/**\n * Thrown when an operation isn't supported by a specific carrier (e.g.\n * cancelar after pickup is OCA-only).\n */\nexport class ShippingNotSupportedError extends ShippingError {\n  constructor(public carrier: Carrier, public operation: string) {\n    super(\n      \"shipping_not_supported\",\n      `${carrier} no soporta '${operation}' en su API actual.`,\n    );\n    this.name = \"ShippingNotSupportedError\";\n  }\n}\n\n/**\n * Thrown when the carrier's API returns a structured error.\n */\nexport class ShippingCarrierError extends ShippingError {\n  constructor(\n    public carrier: Carrier,\n    message: string,\n    public httpStatus?: number,\n    public carrierErrorCode?: string,\n    details?: unknown,\n  ) {\n    super(\"shipping_carrier_error\", `${carrier}: ${message}`, details);\n    this.name = \"ShippingCarrierError\";\n  }\n}\n","/**\n * Adapter contract for shipping carriers. Implement to wire any AR carrier\n * (Andreani, OCA, Correo, your own private courier).\n *\n * # Why an adapter?\n *\n * Each AR carrier has a wildly different API: Andreani is REST/JSON,\n * OCA is SOAP/XML legacy, Correo Argentino has yet another shape.\n * The adapter pattern means callers always work in the normalized\n * `QuoteOption` / `ShipmentCreated` / `TrackingResult` types, and the\n * adapter handles translation.\n *\n * Two ready-to-use adapters ship:\n * - `UnconfiguredShippingAdapter` — always-fail, safe to call without setup.\n * - `MockShippingAdapter` — in-memory deterministic responses, useful for\n *   tests and demos when you don't have carrier credentials yet.\n *\n * Real-carrier adapters: `AndreaniAdapter`, `OcaAdapter`, `CorreoAdapter`.\n */\n\nimport type {\n  Branch,\n  Carrier,\n  CancelResult,\n  CreateShipmentInput,\n  QuoteInput,\n  QuoteOption,\n  ShipmentCreated,\n  TrackingResult,\n} from \"./types\";\nimport { ShippingNotConfiguredError } from \"./errors\";\n\n/**\n * The adapter interface. All methods may throw — the agent tools wrap\n * thrown errors into `{ available: false, error }` shapes so the agent\n * never crashes mid-conversation.\n */\nexport interface ShippingAdapter {\n  readonly carrier: Carrier;\n\n  cotizar(input: QuoteInput): Promise<QuoteOption>;\n  crear(input: CreateShipmentInput): Promise<ShipmentCreated>;\n  trackear(trackingNumber: string): Promise<TrackingResult>;\n  cancelar(trackingNumber: string): Promise<CancelResult>;\n  listarSucursales(params: { postalCode: string; limit?: number }): Promise<Branch[]>;\n}\n\n/**\n * Always-fail adapter. Tools wrap calls with a check; when this is the\n * adapter, they return `{ available: false, error: <setup instructions> }`.\n */\nexport class UnconfiguredShippingAdapter implements ShippingAdapter {\n  constructor(public readonly carrier: Carrier = \"andreani\") {}\n\n  async cotizar(): Promise<QuoteOption> {\n    throw new ShippingNotConfiguredError(this.carrier);\n  }\n  async crear(): Promise<ShipmentCreated> {\n    throw new ShippingNotConfiguredError(this.carrier);\n  }\n  async trackear(): Promise<TrackingResult> {\n    throw new ShippingNotConfiguredError(this.carrier);\n  }\n  async cancelar(): Promise<CancelResult> {\n    throw new ShippingNotConfiguredError(this.carrier);\n  }\n  async listarSucursales(): Promise<Branch[]> {\n    throw new ShippingNotConfiguredError(this.carrier);\n  }\n}\n\n/**\n * In-memory deterministic mock. Useful for tests + demos.\n *\n * Returns synthetic-but-realistic responses:\n * - cotizar: fixed cost based on weight + ETA based on service level\n * - crear: random tracking number, label URL is a data: URI\n * - trackear: lifecycle simulated based on the tracking number\n *   (numbers ending in 0 = label_created, 1-3 = in_transit, etc.)\n * - cancelar: succeeds for label_created/in_transit, fails otherwise\n * - listarSucursales: returns 3 mock branches near the requested CP\n */\nexport class MockShippingAdapter implements ShippingAdapter {\n  constructor(public readonly carrier: Carrier = \"andreani\") {}\n\n  async cotizar(input: QuoteInput): Promise<QuoteOption> {\n    const totalKg = input.packages.reduce((s, p) => s + p.weightKg, 0);\n    const service = input.service ?? \"standard\";\n    const baseCost = service === \"express\" ? 4500 : service === \"same_day\" ? 8000 : 2500;\n    const costArs = baseCost + Math.round(totalKg * 700);\n    const days =\n      service === \"same_day\" ? [0, 0] : service === \"express\" ? [1, 2] : [2, 5];\n    return {\n      carrier: this.carrier,\n      service,\n      costArs,\n      estimatedDaysMin: days[0]!,\n      estimatedDaysMax: days[1]!,\n      productId: `${this.carrier}-${service}`,\n      billedWeightKg: totalKg,\n    };\n  }\n\n  async crear(input: CreateShipmentInput): Promise<ShipmentCreated> {\n    const trackingNumber = `${this.carrier.toUpperCase()}${Date.now()}${Math.floor(\n      Math.random() * 1000,\n    )}`;\n    const quote = await this.cotizar(input);\n    const result: ShipmentCreated = {\n      carrier: this.carrier,\n      trackingNumber,\n      shipmentId: trackingNumber,\n      labelUrl: `https://mock-shipping.test/labels/${trackingNumber}.pdf`,\n      costArs: quote.costArs,\n      estimatedDeliveryDate: new Date(\n        Date.now() + quote.estimatedDaysMax * 24 * 3600 * 1000,\n      )\n        .toISOString()\n        .slice(0, 10),\n    };\n    if (input.externalReference) result.externalReference = input.externalReference;\n    return result;\n  }\n\n  async trackear(trackingNumber: string): Promise<TrackingResult> {\n    // Deterministic based on last digit\n    const lastDigit = Number(trackingNumber.slice(-1)) || 0;\n    let status: import(\"./types\").TrackingStatus = \"in_transit\";\n    if (lastDigit === 0) status = \"label_created\";\n    else if (lastDigit >= 1 && lastDigit <= 3) status = \"in_transit\";\n    else if (lastDigit >= 4 && lastDigit <= 6) status = \"out_for_delivery\";\n    else if (lastDigit === 7) status = \"delivery_failed\";\n    else if (lastDigit === 8) status = \"delivered\";\n    else status = \"returned\";\n\n    const baseTime = Date.now() - 2 * 24 * 3600 * 1000;\n    const events: import(\"./types\").TrackingEvent[] = [\n      {\n        timestamp: new Date(baseTime).toISOString(),\n        status: \"label_created\",\n        description: \"Etiqueta generada\",\n        location: \"Buenos Aires\",\n      },\n    ];\n    if (status !== \"label_created\") {\n      events.push({\n        timestamp: new Date(baseTime + 6 * 3600 * 1000).toISOString(),\n        status: \"in_transit\",\n        description: \"En tránsito hacia destino\",\n        location: \"Centro de distribución CABA\",\n      });\n    }\n    if (\n      status === \"out_for_delivery\" ||\n      status === \"delivery_failed\" ||\n      status === \"delivered\" ||\n      status === \"returned\"\n    ) {\n      events.push({\n        timestamp: new Date(baseTime + 24 * 3600 * 1000).toISOString(),\n        status: \"out_for_delivery\",\n        description: \"En reparto\",\n      });\n    }\n    if (status === \"delivered\") {\n      events.push({\n        timestamp: new Date(baseTime + 36 * 3600 * 1000).toISOString(),\n        status: \"delivered\",\n        description: \"Entregado al destinatario\",\n      });\n    }\n    const result: TrackingResult = {\n      carrier: this.carrier,\n      trackingNumber,\n      currentStatus: status,\n      events,\n    };\n    if (status === \"delivered\") {\n      result.deliveredAt = events[events.length - 1]!.timestamp;\n    }\n    return result;\n  }\n\n  async cancelar(trackingNumber: string): Promise<CancelResult> {\n    const tracking = await this.trackear(trackingNumber);\n    const cancelable =\n      tracking.currentStatus === \"label_created\" ||\n      tracking.currentStatus === \"in_transit\";\n    const result: CancelResult = {\n      carrier: this.carrier,\n      trackingNumber,\n      canceled: cancelable,\n    };\n    if (!cancelable) {\n      result.reason = `No se puede cancelar un envío en estado '${tracking.currentStatus}'.`;\n    }\n    return result;\n  }\n\n  async listarSucursales(params: {\n    postalCode: string;\n    limit?: number;\n  }): Promise<Branch[]> {\n    const limit = params.limit ?? 3;\n    return Array.from({ length: limit }).map((_, i) => ({\n      carrier: this.carrier,\n      id: `mock-branch-${i + 1}`,\n      name: `Sucursal Mock ${i + 1}`,\n      address: `Av. Mock ${1000 + i * 100}`,\n      city: \"Buenos Aires\",\n      state: \"CABA\",\n      postalCode: params.postalCode,\n      distanceKm: (i + 1) * 1.5,\n      openingHours: \"L-V 9-18, S 9-13\",\n      services: [\"dropoff\", \"pickup\"],\n    }));\n  }\n}\n","/**\n * Shared HTTP helper for shipping adapters: timeout, retry, observability.\n *\n * Built on @ar-agents/core's retry engine (`runWithRetry` + the\n * idempotency-aware `defaultRetryClassifier`) instead of a hand-rolled\n * AbortController/setTimeout loop, so shipping shares ONE retry policy with\n * every other @ar-agents adapter: 5xx / 429 / network errors AND per-attempt\n * timeouts are retried for idempotent requests only. Unlike core's\n * `HttpClient`, this helper still returns the raw `Response` for every status\n * (including 4xx/5xx after retries are exhausted) because the carrier\n * adapters decode error bodies themselves and raise `ShippingCarrierError`.\n */\n\nimport {\n  defaultRetryClassifier,\n  runWithRetry,\n  type RetryContext,\n} from \"@ar-agents/core\";\n\nexport interface HttpRequestParams {\n  url: string;\n  init: RequestInit;\n  fetchImpl?: typeof fetch;\n  /** Default 30s. */\n  requestTimeoutMs?: number;\n  /** Default 1. */\n  maxRetries?: number;\n  /**\n   * Whether the request is safe to retry. Idempotent reads (GET tariff /\n   * tracking lookups) default to `true`. Non-idempotent writes (Andreani\n   * `crear` / `cancelar` POSTs) MUST pass `false`: retrying them on a timeout\n   * or 5xx would create duplicate shipments / double-cancellations even though\n   * the original request may have succeeded server-side. Default `true`.\n   */\n  idempotent?: boolean;\n  /** Carrier name for the observability hook label. */\n  carrier: string;\n  /** Operation name (cotizar, crear, etc.) for the observability hook label. */\n  operation: string;\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\nexport async function shippingFetch(params: HttpRequestParams): Promise<Response> {\n  const fetchImpl = params.fetchImpl ?? globalThis.fetch.bind(globalThis);\n  const timeoutMs = params.requestTimeoutMs ?? 30_000;\n  // Non-idempotent writes must never be retried: a timeout / 5xx does not mean\n  // the carrier didn't process the request, so a retry risks a duplicate op.\n  const idempotent = params.idempotent ?? true;\n  const maxRetries = idempotent ? params.maxRetries ?? 1 : 0;\n  const label = `shipping.${params.carrier}.${params.operation}`;\n  const method = (params.init.method ?? \"GET\").toUpperCase();\n  const ctx: RetryContext = { method, idempotent };\n\n  try {\n    return await runWithRetry(\n      async (attempt) => {\n        const start = Date.now();\n        let res: Response;\n        try {\n          // Fresh per-attempt timeout signal, so a timed-out attempt can be\n          // retried (idempotent requests only, per the classifier).\n          res = await fetchImpl(params.url, {\n            ...params.init,\n            signal: AbortSignal.timeout(timeoutMs),\n          });\n        } catch (err) {\n          params.onCall?.({\n            label,\n            durationMs: Date.now() - start,\n            httpStatus: null,\n            retried: attempt - 1,\n            success: false,\n          });\n          throw err;\n        }\n        const decision = defaultRetryClassifier(null, res, ctx);\n        if (decision.shouldRetry) {\n          params.onCall?.({\n            label,\n            durationMs: Date.now() - start,\n            httpStatus: res.status,\n            retried: attempt - 1,\n            success: false,\n          });\n          // Synthetic error carrying the Response, the same contract core's\n          // fetchWithRetry uses: the classifier decides on retry; if attempts\n          // run out we unwrap it below and hand the Response back.\n          const synthetic = new Error(`HTTP ${res.status} ${res.statusText}`);\n          (synthetic as { response?: Response }).response = res;\n          throw synthetic;\n        }\n        params.onCall?.({\n          label,\n          durationMs: Date.now() - start,\n          httpStatus: res.status,\n          retried: attempt - 1,\n          success: res.ok,\n        });\n        return res;\n      },\n      defaultRetryClassifier,\n      { maxAttempts: maxRetries + 1, baseDelayMs: 250 },\n      ctx,\n    );\n  } catch (err) {\n    // Retryable status but attempts exhausted: keep the historical contract of\n    // returning the last Response so adapters decode the carrier error body.\n    const carried = (err as { response?: Response }).response;\n    if (carried) return carried;\n    throw err;\n  }\n}\n","/**\n * AR provincial codes — used by shipping carriers and AFIP / ARCA forms.\n *\n * Two parallel encoding schemes exist:\n * - **AFIP / IGJ codes**: 1-digit \"código provincia\" (1=BS AS, 2=CABA, etc.)\n * - **ISO 3166-2 codes**: \"AR-X\" two-letter (AR-B = Buenos Aires, AR-C = CABA…)\n *\n * Carriers use either or both; this module exposes both forms so the\n * adapters can map to whatever shape the API needs.\n */\n\nexport interface Provincia {\n  /** ISO 3166-2 letter code (e.g. \"B\" for Buenos Aires). */\n  iso: string;\n  /** AFIP / IGJ numeric code. */\n  afipCode: number;\n  /** Full Spanish name. */\n  name: string;\n  /** Common short name / alias for fuzzy lookup. */\n  aliases?: string[];\n}\n\nexport const PROVINCIAS: Provincia[] = [\n  { iso: \"C\", afipCode: 0, name: \"Ciudad Autónoma de Buenos Aires\", aliases: [\"CABA\", \"Capital Federal\", \"Capital\"] },\n  { iso: \"B\", afipCode: 1, name: \"Buenos Aires\", aliases: [\"BSAS\", \"PBA\", \"Pcia BA\"] },\n  { iso: \"K\", afipCode: 2, name: \"Catamarca\" },\n  { iso: \"X\", afipCode: 3, name: \"Córdoba\" },\n  { iso: \"W\", afipCode: 4, name: \"Corrientes\" },\n  { iso: \"E\", afipCode: 5, name: \"Entre Ríos\", aliases: [\"Entre Rios\"] },\n  { iso: \"P\", afipCode: 6, name: \"Formosa\" },\n  { iso: \"Y\", afipCode: 7, name: \"Jujuy\" },\n  { iso: \"L\", afipCode: 8, name: \"La Pampa\" },\n  { iso: \"F\", afipCode: 9, name: \"La Rioja\" },\n  { iso: \"M\", afipCode: 10, name: \"Mendoza\" },\n  { iso: \"N\", afipCode: 11, name: \"Misiones\" },\n  { iso: \"Q\", afipCode: 12, name: \"Neuquén\", aliases: [\"Neuquen\"] },\n  { iso: \"R\", afipCode: 13, name: \"Río Negro\", aliases: [\"Rio Negro\"] },\n  { iso: \"A\", afipCode: 14, name: \"Salta\" },\n  { iso: \"J\", afipCode: 15, name: \"San Juan\" },\n  { iso: \"D\", afipCode: 16, name: \"San Luis\" },\n  { iso: \"Z\", afipCode: 17, name: \"Santa Cruz\" },\n  { iso: \"S\", afipCode: 18, name: \"Santa Fe\" },\n  { iso: \"G\", afipCode: 19, name: \"Santiago del Estero\" },\n  { iso: \"V\", afipCode: 20, name: \"Tierra del Fuego, Antártida e Islas del Atlántico Sur\", aliases: [\"TDF\", \"Tierra del Fuego\"] },\n  { iso: \"T\", afipCode: 21, name: \"Tucumán\", aliases: [\"Tucuman\"] },\n  { iso: \"H\", afipCode: 22, name: \"Chaco\" },\n  { iso: \"U\", afipCode: 23, name: \"Chubut\" },\n];\n\nconst NAME_INDEX = new Map<string, Provincia>();\nconst ISO_INDEX = new Map<string, Provincia>();\nconst AFIP_INDEX = new Map<number, Provincia>();\n\nfor (const p of PROVINCIAS) {\n  ISO_INDEX.set(p.iso.toUpperCase(), p);\n  AFIP_INDEX.set(p.afipCode, p);\n  NAME_INDEX.set(normalize(p.name), p);\n  for (const alias of p.aliases ?? []) {\n    NAME_INDEX.set(normalize(alias), p);\n  }\n}\n\nfunction normalize(s: string): string {\n  return s\n    .normalize(\"NFD\")\n    .replace(/[̀-ͯ]/g, \"\")\n    .toLowerCase()\n    .trim();\n}\n\n/**\n * Resolve a provincia by name (fuzzy, accent-insensitive), ISO code, or\n * AFIP numeric code. Returns null on no match.\n *\n * @example\n * lookupProvincia(\"CABA\")       // → CABA entry\n * lookupProvincia(\"córdoba\")    // → Córdoba entry\n * lookupProvincia(\"B\")          // → Buenos Aires entry\n * lookupProvincia(8)            // → La Pampa entry\n */\nexport function lookupProvincia(input: string | number): Provincia | null {\n  if (typeof input === \"number\") return AFIP_INDEX.get(input) ?? null;\n  const trimmed = input.trim();\n  if (trimmed.length === 1) {\n    const iso = ISO_INDEX.get(trimmed.toUpperCase());\n    if (iso) return iso;\n  }\n  return NAME_INDEX.get(normalize(trimmed)) ?? null;\n}\n\n/**\n * Validate an Argentine postal code. AR uses CPA (Código Postal Argentino):\n * 4-digit legacy OR 8-character extended (1 letter + 4 digits + 3 letters).\n *\n * @example\n * isValidCPA(\"1842\")         // true (Monte Grande, BA)\n * isValidCPA(\"B1842ZAB\")     // true (extended CPA)\n * isValidCPA(\"00000\")        // false\n */\nexport function isValidCPA(cp: string): boolean {\n  const trimmed = cp.trim().toUpperCase();\n  if (/^\\d{4}$/.test(trimmed)) return Number(trimmed) >= 1000;\n  if (/^[A-Z]\\d{4}[A-Z]{3}$/.test(trimmed)) return true;\n  return false;\n}\n","/**\n * Andreani adapter — wired to Andreani's REST API.\n *\n * # Background\n *\n * Andreani is the largest private logistics carrier in AR (~50% of B2C\n * e-commerce shipping share). Has a modern REST API at\n * https://developers.andreani.com/.\n *\n * # Setup\n *\n * 1. Register at https://developers.andreani.com/\n * 2. Get `clientId` (= `username`) + `clientSecret` (= `password`) for the\n *    sandbox / production environment.\n * 3. Get your `numeroCliente` from the Andreani commercial team.\n * 4. Wire the adapter:\n *    ```ts\n *    const andreani = new AndreaniAdapter({\n *      username: process.env.ANDREANI_USERNAME!,\n *      password: process.env.ANDREANI_PASSWORD!,\n *      clientNumber: process.env.ANDREANI_CLIENT_NUMBER!,\n *      env: \"prod\",\n *    });\n *    ```\n *\n * # Auth\n *\n * Andreani uses Basic Auth on every request (no token exchange needed). The\n * adapter constructs the header automatically.\n *\n * # Service mapping\n *\n * - `standard` → \"Estándar\" (productId varies by client; default we use a\n *   common code, override via `productIdMap` if your contract differs)\n * - `express` → \"Urgente\"\n * - `same_day` → not generally available; the adapter throws.\n */\n\nimport type {\n  Branch,\n  CancelResult,\n  CreateShipmentInput,\n  QuoteInput,\n  QuoteOption,\n  ShipmentCreated,\n  TrackingResult,\n  TrackingStatus,\n} from \"./types\";\nimport type { ShippingAdapter } from \"./adapter\";\nimport { ShippingCarrierError, ShippingNotSupportedError } from \"./errors\";\nimport { shippingFetch } from \"./http\";\nimport { lookupProvincia } from \"./provincias\";\n\nexport interface AndreaniAdapterOptions {\n  /** Andreani API username. From dev panel. */\n  username: string;\n  /** Andreani API password. From dev panel. */\n  password: string;\n  /**\n   * Andreani's `numero de cliente` — assigned by their commercial team.\n   * Required for `crear` (shipment creation).\n   */\n  clientNumber: string;\n  /** \"homo\" for sandbox, \"prod\" for live. Default \"prod\". */\n  env?: \"homo\" | \"prod\";\n  /**\n   * Optional override of the productId map. Defaults: standard=140,\n   * express=140Pickup. Override if your Andreani contract uses different\n   * product codes.\n   */\n  productIdMap?: Partial<Record<\"standard\" | \"express\", string>>;\n  /** Override base URL (testing). */\n  baseUrl?: 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\nconst ANDREANI_URLS = {\n  homo: \"https://apisqa.andreani.com\",\n  prod: \"https://api.andreani.com\",\n} as const;\n\nconst DEFAULT_PRODUCT_MAP = {\n  standard: \"140\",\n  express: \"140Pickup\",\n} as const;\n\nexport class AndreaniAdapter implements ShippingAdapter {\n  readonly carrier = \"andreani\" as const;\n  private readonly baseUrl: string;\n  private readonly authHeader: string;\n  private readonly productMap: Record<string, string>;\n  private readonly clientNumber: string;\n  private readonly fetchImpl: typeof fetch | undefined;\n  private readonly requestTimeoutMs: number | undefined;\n  private readonly maxRetries: number | undefined;\n  private readonly onCall: AndreaniAdapterOptions[\"onCall\"];\n\n  constructor(opts: AndreaniAdapterOptions) {\n    if (!opts.username || !opts.password) {\n      throw new Error(\"AndreaniAdapter requires username + password.\");\n    }\n    if (!opts.clientNumber) {\n      throw new Error(\"AndreaniAdapter requires clientNumber.\");\n    }\n    this.baseUrl = opts.baseUrl ?? ANDREANI_URLS[opts.env ?? \"prod\"];\n    this.authHeader =\n      \"Basic \" +\n      Buffer.from(`${opts.username}:${opts.password}`).toString(\"base64\");\n    this.productMap = { ...DEFAULT_PRODUCT_MAP, ...(opts.productIdMap ?? {}) };\n    this.clientNumber = opts.clientNumber;\n    this.fetchImpl = opts.fetchImpl;\n    this.requestTimeoutMs = opts.requestTimeoutMs;\n    this.maxRetries = opts.maxRetries;\n    this.onCall = opts.onCall;\n  }\n\n  async cotizar(input: QuoteInput): Promise<QuoteOption> {\n    const service = input.service ?? \"standard\";\n    if (service === \"same_day\") {\n      throw new ShippingNotSupportedError(\"andreani\", \"service=same_day\");\n    }\n    const productId = this.productMap[service];\n    if (!productId) {\n      throw new ShippingNotSupportedError(\"andreani\", `service=${service}`);\n    }\n\n    const totalKg = input.packages.reduce((s, p) => s + p.weightKg, 0);\n    const declaredValue = input.packages.reduce(\n      (s, p) => s + p.declaredValueArs,\n      0,\n    );\n\n    const url = new URL(`${this.baseUrl}/v2/tarifas`);\n    url.searchParams.set(\"cpDestino\", input.destination.postalCode);\n    url.searchParams.set(\"cpOrigen\", input.origin.postalCode);\n    url.searchParams.set(\"contrato\", productId);\n    url.searchParams.set(\"cliente\", this.clientNumber);\n    url.searchParams.set(\"bultos[0][kilos]\", String(totalKg));\n    url.searchParams.set(\n      \"bultos[0][largoCm]\",\n      String(Math.max(...input.packages.map((p) => p.lengthCm))),\n    );\n    url.searchParams.set(\n      \"bultos[0][anchoCm]\",\n      String(Math.max(...input.packages.map((p) => p.widthCm))),\n    );\n    url.searchParams.set(\n      \"bultos[0][altoCm]\",\n      String(Math.max(...input.packages.map((p) => p.heightCm))),\n    );\n    url.searchParams.set(\"bultos[0][valorDeclarado]\", String(declaredValue));\n\n    const res = await this.call(\"cotizar\", url.toString(), { method: \"GET\" });\n    const json = (await res.json()) as {\n      tarifaConIva?: { total: number };\n      tarifaSinIva?: { total: number };\n      plazoEntrega?: number;\n    };\n    if (!json.tarifaConIva && !json.tarifaSinIva) {\n      throw new ShippingCarrierError(\n        \"andreani\",\n        \"tarifas response missing tarifaConIva\",\n        res.status,\n        undefined,\n        json,\n      );\n    }\n    const cost =\n      json.tarifaConIva?.total ?? json.tarifaSinIva?.total ?? 0;\n    const days = json.plazoEntrega ?? (service === \"express\" ? 2 : 5);\n    return {\n      carrier: this.carrier,\n      service,\n      costArs: cost,\n      estimatedDaysMin: Math.max(1, days - 1),\n      estimatedDaysMax: days,\n      productId,\n      billedWeightKg: totalKg,\n      raw: json,\n    };\n  }\n\n  async crear(input: CreateShipmentInput): Promise<ShipmentCreated> {\n    const service = input.service ?? \"standard\";\n    const productId =\n      input.productId ??\n      this.productMap[service as \"standard\" | \"express\"];\n    if (!productId) {\n      throw new ShippingNotSupportedError(\"andreani\", `service=${service}`);\n    }\n\n    const body = {\n      contrato: productId,\n      origen: this.toAndreaniAddress(input.origin),\n      destino: this.toAndreaniAddress(input.destination),\n      remitente: {\n        nombreCompleto: input.origin.name,\n        email: input.origin.email,\n        telefonos: input.origin.phone ? [{ tipo: 1, numero: input.origin.phone }] : [],\n      },\n      destinatario: [\n        {\n          nombreCompleto: input.destination.name,\n          email: input.destination.email,\n          documentoTipo: \"DNI\",\n          documentoNumero: \"\",\n          telefonos: input.destination.phone\n            ? [{ tipo: 1, numero: input.destination.phone }]\n            : [],\n        },\n      ],\n      bultos: input.packages.map((p) => ({\n        kilos: p.weightKg,\n        largoCm: p.lengthCm,\n        anchoCm: p.widthCm,\n        altoCm: p.heightCm,\n        volumenCm: p.lengthCm * p.widthCm * p.heightCm,\n        valorDeclaradoConImpuestos: p.declaredValueArs,\n        referencias: input.externalReference\n          ? [{ meta: \"referencia\", contenido: input.externalReference }]\n          : [],\n      })),\n    };\n\n    const res = await this.call(\n      \"crear\",\n      `${this.baseUrl}/v2/ordenes-de-envio`,\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(body),\n      },\n      false, // non-idempotent — never retry a shipment creation\n    );\n    const json = (await res.json()) as {\n      numeroAndreani?: string;\n      idEnvio?: string;\n      label?: string;\n      etiqueta?: string;\n      tarifaConIva?: { total: number };\n      fechaEntregaEstimada?: string;\n    };\n    const trackingNumber = json.numeroAndreani ?? json.idEnvio;\n    if (!trackingNumber) {\n      throw new ShippingCarrierError(\n        \"andreani\",\n        \"create response missing numeroAndreani\",\n        res.status,\n        undefined,\n        json,\n      );\n    }\n    if (json.tarifaConIva?.total === undefined) {\n      // Fail loud rather than fabricate costArs:0 — a 0 cost silently corrupts\n      // downstream accounting / reconciliation.\n      throw new ShippingCarrierError(\n        \"andreani\",\n        \"create response missing tarifaConIva\",\n        res.status,\n        undefined,\n        json,\n      );\n    }\n    const result: ShipmentCreated = {\n      carrier: this.carrier,\n      trackingNumber,\n      shipmentId: json.idEnvio ?? trackingNumber,\n      costArs: json.tarifaConIva.total,\n      raw: json,\n    };\n    if (json.label || json.etiqueta) {\n      result.labelUrl = json.label ?? json.etiqueta!;\n    }\n    if (json.fechaEntregaEstimada) {\n      result.estimatedDeliveryDate = json.fechaEntregaEstimada;\n    }\n    if (input.externalReference) {\n      result.externalReference = input.externalReference;\n    }\n    return result;\n  }\n\n  async trackear(trackingNumber: string): Promise<TrackingResult> {\n    const res = await this.call(\n      \"trackear\",\n      `${this.baseUrl}/v1/envios/${encodeURIComponent(trackingNumber)}/trazas`,\n      { method: \"GET\" },\n    );\n    const json = (await res.json()) as {\n      eventos?: Array<{\n        fecha?: string;\n        estado?: string;\n        traduccion?: string;\n        descripcion?: string;\n        sucursal?: { descripcion?: string };\n      }>;\n    };\n    const events = (json.eventos ?? []).map((e) => ({\n      timestamp: e.fecha ?? \"\",\n      status: mapAndreaniStatus(e.estado ?? \"\"),\n      description: e.traduccion ?? e.descripcion ?? e.estado ?? \"\",\n      location: e.sucursal?.descripcion ?? \"\",\n    }));\n    const currentStatus =\n      events.length > 0\n        ? events[events.length - 1]!.status\n        : (\"unknown\" as TrackingStatus);\n    const result: TrackingResult = {\n      carrier: this.carrier,\n      trackingNumber,\n      currentStatus,\n      events,\n      raw: json,\n    };\n    if (currentStatus === \"delivered\") {\n      result.deliveredAt = events[events.length - 1]!.timestamp;\n    }\n    return result;\n  }\n\n  async cancelar(trackingNumber: string): Promise<CancelResult> {\n    const res = await this.call(\n      \"cancelar\",\n      `${this.baseUrl}/v2/ordenes-de-envio/${encodeURIComponent(trackingNumber)}/cancelar`,\n      { method: \"POST\" },\n      false, // non-idempotent — never retry a cancellation\n    );\n    const json = (await res.json().catch(() => ({}))) as {\n      cancelado?: boolean;\n      motivo?: string;\n    };\n    if (typeof json.cancelado !== \"boolean\") {\n      // Fail loud rather than fabricate canceled:true from a bare 2xx — a false\n      // positive here tells the caller a shipment was cancelled when it wasn't.\n      throw new ShippingCarrierError(\n        \"andreani\",\n        \"cancel response missing cancelado\",\n        res.status,\n        undefined,\n        json,\n      );\n    }\n    return {\n      carrier: this.carrier,\n      trackingNumber,\n      canceled: json.cancelado,\n      ...(json.motivo ? { reason: json.motivo } : {}),\n      raw: json,\n    };\n  }\n\n  async listarSucursales(params: {\n    postalCode: string;\n    limit?: number;\n  }): Promise<Branch[]> {\n    const url = new URL(`${this.baseUrl}/v2/sucursales`);\n    url.searchParams.set(\"codigoPostal\", params.postalCode);\n    if (params.limit !== undefined) url.searchParams.set(\"limit\", String(params.limit));\n    const res = await this.call(\"listar_sucursales\", url.toString(), {\n      method: \"GET\",\n    });\n    const json = (await res.json()) as Array<{\n      id?: string;\n      nombre?: string;\n      direccion?: string;\n      localidad?: string;\n      provincia?: string;\n      codigoPostal?: string;\n      horarioAtencion?: string;\n      latitud?: number;\n      longitud?: number;\n    }>;\n    return (json ?? []).slice(0, params.limit ?? 20).map((s, i) => ({\n      carrier: this.carrier,\n      id: s.id ?? `andreani-${i}`,\n      name: s.nombre ?? \"Sucursal\",\n      address: s.direccion ?? \"\",\n      city: s.localidad ?? \"\",\n      state: s.provincia ?? \"\",\n      postalCode: s.codigoPostal ?? params.postalCode,\n      ...(s.horarioAtencion !== undefined ? { openingHours: s.horarioAtencion } : {}),\n      ...(s.latitud !== undefined ? { lat: s.latitud } : {}),\n      ...(s.longitud !== undefined ? { lng: s.longitud } : {}),\n    }));\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Internal helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private async call(\n    op: string,\n    url: string,\n    init: RequestInit,\n    /**\n     * Whether this op is safe to retry. `crear` / `cancelar` are\n     * non-idempotent POSTs and must pass `false` to avoid duplicate\n     * shipments / double-cancellations on timeout / 5xx. Defaults `true`.\n     */\n    idempotent = true,\n  ): Promise<Response> {\n    const headers: Record<string, string> = {\n      Authorization: this.authHeader,\n      Accept: \"application/json\",\n      ...((init.headers as Record<string, string> | undefined) ?? {}),\n    };\n    const params: Parameters<typeof shippingFetch>[0] = {\n      url,\n      init: { ...init, headers },\n      carrier: \"andreani\",\n      operation: op,\n      idempotent,\n      ...(this.fetchImpl !== undefined ? { fetchImpl: this.fetchImpl } : {}),\n      ...(this.requestTimeoutMs !== undefined\n        ? { requestTimeoutMs: this.requestTimeoutMs }\n        : {}),\n      ...(this.maxRetries !== undefined ? { maxRetries: this.maxRetries } : {}),\n      ...(this.onCall !== undefined ? { onCall: this.onCall } : {}),\n    };\n    const res = await shippingFetch(params);\n    if (!res.ok) {\n      const text = await res.text().catch(() => \"\");\n      throw new ShippingCarrierError(\n        \"andreani\",\n        `HTTP ${res.status} on ${op}: ${text.slice(0, 200)}`,\n        res.status,\n      );\n    }\n    return res;\n  }\n\n  private toAndreaniAddress(addr: import(\"./types\").Address) {\n    const provincia = lookupProvincia(addr.state);\n    return {\n      postal: {\n        codigoPostal: addr.postalCode,\n        calle: addr.street,\n        numero: addr.number,\n        ...(addr.unit ? { departamento: addr.unit } : {}),\n        localidad: addr.city,\n        region: provincia?.name ?? String(addr.state),\n        pais: addr.country ?? \"AR\",\n      },\n    };\n  }\n}\n\n/**\n * Map Andreani's native status strings to the normalized `TrackingStatus`.\n * Andreani's `estado` field is free-form Spanish; we match common keywords.\n */\nfunction mapAndreaniStatus(estado: string): TrackingStatus {\n  // Strip accents for keyword matching (Spanish \"tránsito\" → \"transito\").\n  const e = estado\n    .normalize(\"NFD\")\n    .replace(/[̀-ͯ]/g, \"\")\n    .toLowerCase();\n  if (e.includes(\"entregado\")) return \"delivered\";\n  if (e.includes(\"en reparto\") || e.includes(\"ruta\")) return \"out_for_delivery\";\n  if (e.includes(\"transit\") || e.includes(\"dist\")) return \"in_transit\";\n  if (e.includes(\"ausente\") || e.includes(\"rechaz\")) return \"delivery_failed\";\n  if (e.includes(\"retorn\") || e.includes(\"devuel\")) return \"returned\";\n  if (e.includes(\"cancel\")) return \"canceled\";\n  if (e.includes(\"etiqueta\") || e.includes(\"admit\")) return \"label_created\";\n  if (e.includes(\"dano\") || e.includes(\"perd\") || e.includes(\"incid\")) return \"exception\";\n  return \"unknown\";\n}\n","/**\n * OCA adapter — wired to OCA's E-Pak SOAP API.\n *\n * # Background\n *\n * OCA is the second-largest private courier in AR. Its API is **legacy SOAP**\n * (E-Pak), with no JSON / REST option. The official docs PDF is at\n * https://www.oca.com.ar/Solicitudes/wServicios.htm\n *\n * # Status — v0.1\n *\n * v0.1 ships a **HTTP-based stub** for the operations OCA exposes via their\n * \"Tarifador\" REST endpoint (https://www.oca.com.ar/api/v1/Tarifador/...).\n * For the full SOAP shipment-creation flow (`Ingreso_OR`), use the OCA\n * official PHP/.NET libraries until v0.2 ships a complete TS port.\n *\n * For most agent flows, this is enough: cotizar + listar_sucursales work,\n * crear/trackear/cancelar throw `ShippingNotSupportedError` with a clear\n * message pointing to the OCA dashboard.\n *\n * # Setup\n *\n * 1. Get a `cuit` + `operativa` (operativa code) from OCA's commercial team.\n * 2. Sign up at https://www.oca.com.ar for the API access.\n */\n\nimport type {\n  Branch,\n  CancelResult,\n  CreateShipmentInput,\n  QuoteInput,\n  QuoteOption,\n  ShipmentCreated,\n  TrackingResult,\n} from \"./types\";\nimport type { ShippingAdapter } from \"./adapter\";\nimport { ShippingCarrierError, ShippingNotSupportedError } from \"./errors\";\nimport { shippingFetch } from \"./http\";\n\nexport interface OcaAdapterOptions {\n  /** OCA CUIT (your CUIT registered with OCA). */\n  cuit: string;\n  /** OCA \"operativa\" code — the contract id assigned by OCA. */\n  operativa: string;\n  /** Override base URL (testing). */\n  baseUrl?: 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. */\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\nconst OCA_BASE = \"https://www.oca.com.ar/api\";\n\nexport class OcaAdapter implements ShippingAdapter {\n  readonly carrier = \"oca\" as const;\n  private readonly baseUrl: string;\n  private readonly cuit: string;\n  private readonly operativa: string;\n  private readonly fetchImpl: typeof fetch | undefined;\n  private readonly requestTimeoutMs: number | undefined;\n  private readonly maxRetries: number | undefined;\n  private readonly onCall: OcaAdapterOptions[\"onCall\"];\n\n  constructor(opts: OcaAdapterOptions) {\n    if (!opts.cuit || !opts.operativa) {\n      throw new Error(\"OcaAdapter requires cuit + operativa.\");\n    }\n    this.baseUrl = opts.baseUrl ?? OCA_BASE;\n    this.cuit = opts.cuit;\n    this.operativa = opts.operativa;\n    this.fetchImpl = opts.fetchImpl;\n    this.requestTimeoutMs = opts.requestTimeoutMs;\n    this.maxRetries = opts.maxRetries;\n    this.onCall = opts.onCall;\n  }\n\n  async cotizar(input: QuoteInput): Promise<QuoteOption> {\n    const totalKg = input.packages.reduce((s, p) => s + p.weightKg, 0);\n    const declaredValue = input.packages.reduce(\n      (s, p) => s + p.declaredValueArs,\n      0,\n    );\n    const totalVolume = input.packages.reduce(\n      (s, p) => s + (p.lengthCm * p.widthCm * p.heightCm) / 1000,\n      0,\n    );\n\n    const url = new URL(`${this.baseUrl}/v1/Tarifador`);\n    url.searchParams.set(\"PesoTotal\", String(totalKg));\n    url.searchParams.set(\"VolumenTotal\", String(totalVolume));\n    url.searchParams.set(\"CodigoPostalOrigen\", input.origin.postalCode);\n    url.searchParams.set(\n      \"CodigoPostalDestino\",\n      input.destination.postalCode,\n    );\n    url.searchParams.set(\"CantidadPaquetes\", String(input.packages.length));\n    url.searchParams.set(\"ValorDeclarado\", String(declaredValue));\n    url.searchParams.set(\"Cuit\", this.cuit);\n    url.searchParams.set(\"Operativa\", this.operativa);\n\n    const res = await this.call(\"cotizar\", url.toString(), { method: \"GET\" });\n    const json = (await res.json()) as {\n      Total?: number;\n      PrecioFinal?: number;\n      PlazoEntrega?: number;\n    };\n    const cost = json.Total ?? json.PrecioFinal ?? 0;\n    const days = json.PlazoEntrega ?? 5;\n    return {\n      carrier: this.carrier,\n      service: input.service ?? \"standard\",\n      costArs: cost,\n      estimatedDaysMin: Math.max(1, days - 1),\n      estimatedDaysMax: days,\n      billedWeightKg: totalKg,\n      raw: json,\n    };\n  }\n\n  async crear(_input: CreateShipmentInput): Promise<ShipmentCreated> {\n    throw new ShippingNotSupportedError(\n      \"oca\",\n      \"crear (requires SOAP Ingreso_OR — use OCA dashboard or v0.2+)\",\n    );\n  }\n\n  async trackear(_trackingNumber: string): Promise<TrackingResult> {\n    throw new ShippingNotSupportedError(\n      \"oca\",\n      \"trackear (requires SOAP — use OCA dashboard or v0.2+)\",\n    );\n  }\n\n  async cancelar(_trackingNumber: string): Promise<CancelResult> {\n    throw new ShippingNotSupportedError(\n      \"oca\",\n      \"cancelar (requires SOAP Anulacion_OR — use OCA dashboard or v0.2+)\",\n    );\n  }\n\n  async listarSucursales(params: {\n    postalCode: string;\n    limit?: number;\n  }): Promise<Branch[]> {\n    const url = new URL(`${this.baseUrl}/v1/Sucursales`);\n    url.searchParams.set(\"CodigoPostal\", params.postalCode);\n    const res = await this.call(\"listar_sucursales\", url.toString(), {\n      method: \"GET\",\n    });\n    const json = (await res.json()) as Array<{\n      idCentroImposicion?: number;\n      Sucursal?: string;\n      Calle?: string;\n      Localidad?: string;\n      Provincia?: string;\n      CodigoPostal?: string;\n      HorarioAtencion?: string;\n    }>;\n    return (json ?? []).slice(0, params.limit ?? 20).map((s, i) => ({\n      carrier: this.carrier,\n      id: String(s.idCentroImposicion ?? i),\n      name: s.Sucursal ?? \"Sucursal OCA\",\n      address: s.Calle ?? \"\",\n      city: s.Localidad ?? \"\",\n      state: s.Provincia ?? \"\",\n      postalCode: s.CodigoPostal ?? params.postalCode,\n      ...(s.HorarioAtencion !== undefined ? { openingHours: s.HorarioAtencion } : {}),\n    }));\n  }\n\n  private async call(\n    op: string,\n    url: string,\n    init: RequestInit,\n  ): Promise<Response> {\n    const params: Parameters<typeof shippingFetch>[0] = {\n      url,\n      init: {\n        ...init,\n        headers: { Accept: \"application/json\", ...((init.headers as Record<string, string>) ?? {}) },\n      },\n      carrier: \"oca\",\n      operation: op,\n      ...(this.fetchImpl !== undefined ? { fetchImpl: this.fetchImpl } : {}),\n      ...(this.requestTimeoutMs !== undefined\n        ? { requestTimeoutMs: this.requestTimeoutMs }\n        : {}),\n      ...(this.maxRetries !== undefined ? { maxRetries: this.maxRetries } : {}),\n      ...(this.onCall !== undefined ? { onCall: this.onCall } : {}),\n    };\n    const res = await shippingFetch(params);\n    if (!res.ok) {\n      const text = await res.text().catch(() => \"\");\n      throw new ShippingCarrierError(\n        \"oca\",\n        `HTTP ${res.status} on ${op}: ${text.slice(0, 200)}`,\n        res.status,\n      );\n    }\n    return res;\n  }\n}\n","/**\n * Correo Argentino adapter — wired to Correo's public REST endpoints.\n *\n * # Background\n *\n * Correo Argentino is the state-owned national postal service, the only\n * carrier that reaches every CPA in the country (including remote areas\n * private couriers won't service). Has a \"Mi Correo Empresas\" portal at\n * https://www.correoargentino.com.ar/empresas with a basic REST API.\n *\n * # Status — v0.1\n *\n * v0.1 implements `cotizar` (their public Tarifador endpoint) and\n * `trackear` (the public seguimiento endpoint that doesn't need auth).\n * Shipment creation and cancellation require a corporate contract +\n * the SAU portal — those throw `ShippingNotSupportedError` for v0.1.\n *\n * # Setup\n *\n * For v0.1 (cotizar + trackear): no setup required, both endpoints are\n * public. For shipment creation: contact the Correo Argentino Empresas\n * commercial team to get a corporate contract + portal credentials.\n */\n\nimport type {\n  Branch,\n  CancelResult,\n  CreateShipmentInput,\n  QuoteInput,\n  QuoteOption,\n  ShipmentCreated,\n  TrackingResult,\n  TrackingStatus,\n} from \"./types\";\nimport type { ShippingAdapter } from \"./adapter\";\nimport { ShippingCarrierError, ShippingNotSupportedError } from \"./errors\";\nimport { shippingFetch } from \"./http\";\n\nexport interface CorreoAdapterOptions {\n  /** Override base URL (testing). */\n  baseUrl?: 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. */\n  onCall?: (event: {\n    label: string;\n    durationMs: number;\n    httpStatus: number | null;\n    retried: number;\n    success: boolean;\n  }) => void;\n}\n\nconst CORREO_BASE = \"https://api.correoargentino.com.ar\";\n\nexport class CorreoAdapter implements ShippingAdapter {\n  readonly carrier = \"correo_argentino\" as const;\n  private readonly baseUrl: string;\n  private readonly fetchImpl: typeof fetch | undefined;\n  private readonly requestTimeoutMs: number | undefined;\n  private readonly maxRetries: number | undefined;\n  private readonly onCall: CorreoAdapterOptions[\"onCall\"];\n\n  constructor(opts: CorreoAdapterOptions = {}) {\n    this.baseUrl = opts.baseUrl ?? CORREO_BASE;\n    this.fetchImpl = opts.fetchImpl;\n    this.requestTimeoutMs = opts.requestTimeoutMs;\n    this.maxRetries = opts.maxRetries;\n    this.onCall = opts.onCall;\n  }\n\n  async cotizar(input: QuoteInput): Promise<QuoteOption> {\n    const totalKg = input.packages.reduce((s, p) => s + p.weightKg, 0);\n    const url = new URL(`${this.baseUrl}/v1/tarifador/cotizar`);\n    url.searchParams.set(\"cpOrigen\", input.origin.postalCode);\n    url.searchParams.set(\"cpDestino\", input.destination.postalCode);\n    url.searchParams.set(\"peso\", String(totalKg));\n    url.searchParams.set(\n      \"servicio\",\n      input.service === \"express\" ? \"expreso\" : \"estandar\",\n    );\n\n    const res = await this.call(\"cotizar\", url.toString(), { method: \"GET\" });\n    const json = (await res.json()) as {\n      precio?: number;\n      total?: number;\n      plazoEntrega?: number;\n    };\n    const cost = json.precio ?? json.total ?? 0;\n    const days = json.plazoEntrega ?? (input.service === \"express\" ? 3 : 7);\n    return {\n      carrier: this.carrier,\n      service: input.service ?? \"standard\",\n      costArs: cost,\n      estimatedDaysMin: Math.max(1, days - 2),\n      estimatedDaysMax: days,\n      billedWeightKg: totalKg,\n      raw: json,\n    };\n  }\n\n  async crear(_input: CreateShipmentInput): Promise<ShipmentCreated> {\n    throw new ShippingNotSupportedError(\n      \"correo_argentino\",\n      \"crear (requires corporate contract via Mi Correo Empresas)\",\n    );\n  }\n\n  async trackear(trackingNumber: string): Promise<TrackingResult> {\n    const url = `${this.baseUrl}/v1/seguimiento/${encodeURIComponent(trackingNumber)}`;\n    const res = await this.call(\"trackear\", url, { method: \"GET\" });\n    const json = (await res.json()) as {\n      eventos?: Array<{\n        fecha?: string;\n        estado?: string;\n        descripcion?: string;\n        ubicacion?: string;\n      }>;\n    };\n    const events = (json.eventos ?? []).map((e) => ({\n      timestamp: e.fecha ?? \"\",\n      status: mapCorreoStatus(e.estado ?? \"\"),\n      description: e.descripcion ?? e.estado ?? \"\",\n      location: e.ubicacion ?? \"\",\n    }));\n    const currentStatus =\n      events.length > 0\n        ? events[events.length - 1]!.status\n        : (\"unknown\" as TrackingStatus);\n    const result: TrackingResult = {\n      carrier: this.carrier,\n      trackingNumber,\n      currentStatus,\n      events,\n      raw: json,\n    };\n    if (currentStatus === \"delivered\") {\n      result.deliveredAt = events[events.length - 1]!.timestamp;\n    }\n    return result;\n  }\n\n  async cancelar(_trackingNumber: string): Promise<CancelResult> {\n    throw new ShippingNotSupportedError(\n      \"correo_argentino\",\n      \"cancelar (requires corporate contract via Mi Correo Empresas)\",\n    );\n  }\n\n  async listarSucursales(params: {\n    postalCode: string;\n    limit?: number;\n  }): Promise<Branch[]> {\n    const url = new URL(`${this.baseUrl}/v1/sucursales`);\n    url.searchParams.set(\"cp\", params.postalCode);\n    const res = await this.call(\"listar_sucursales\", url.toString(), {\n      method: \"GET\",\n    });\n    const json = (await res.json()) as Array<{\n      id?: string;\n      nombre?: string;\n      direccion?: string;\n      localidad?: string;\n      provincia?: string;\n      cp?: string;\n      horarios?: string;\n    }>;\n    return (json ?? []).slice(0, params.limit ?? 20).map((s, i) => ({\n      carrier: this.carrier,\n      id: s.id ?? `correo-${i}`,\n      name: s.nombre ?? \"Sucursal Correo\",\n      address: s.direccion ?? \"\",\n      city: s.localidad ?? \"\",\n      state: s.provincia ?? \"\",\n      postalCode: s.cp ?? params.postalCode,\n      ...(s.horarios !== undefined ? { openingHours: s.horarios } : {}),\n    }));\n  }\n\n  private async call(\n    op: string,\n    url: string,\n    init: RequestInit,\n  ): Promise<Response> {\n    const params: Parameters<typeof shippingFetch>[0] = {\n      url,\n      init: {\n        ...init,\n        headers: { Accept: \"application/json\", ...((init.headers as Record<string, string>) ?? {}) },\n      },\n      carrier: \"correo_argentino\",\n      operation: op,\n      ...(this.fetchImpl !== undefined ? { fetchImpl: this.fetchImpl } : {}),\n      ...(this.requestTimeoutMs !== undefined\n        ? { requestTimeoutMs: this.requestTimeoutMs }\n        : {}),\n      ...(this.maxRetries !== undefined ? { maxRetries: this.maxRetries } : {}),\n      ...(this.onCall !== undefined ? { onCall: this.onCall } : {}),\n    };\n    const res = await shippingFetch(params);\n    if (!res.ok) {\n      const text = await res.text().catch(() => \"\");\n      throw new ShippingCarrierError(\n        \"correo_argentino\",\n        `HTTP ${res.status} on ${op}: ${text.slice(0, 200)}`,\n        res.status,\n      );\n    }\n    return res;\n  }\n}\n\nfunction mapCorreoStatus(estado: string): TrackingStatus {\n  const e = estado\n    .normalize(\"NFD\")\n    .replace(/[̀-ͯ]/g, \"\")\n    .toLowerCase();\n  if (e.includes(\"entregado\")) return \"delivered\";\n  if (e.includes(\"reparto\") || e.includes(\"ruta\")) return \"out_for_delivery\";\n  if (e.includes(\"transit\") || e.includes(\"clasif\")) return \"in_transit\";\n  if (e.includes(\"ausente\")) return \"delivery_failed\";\n  if (e.includes(\"devuel\")) return \"returned\";\n  if (e.includes(\"admitido\") || e.includes(\"ingresado\")) return \"label_created\";\n  return \"unknown\";\n}\n","import { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport { UnconfiguredShippingAdapter, type ShippingAdapter } from \"./adapter\";\nimport { isValidCPA, lookupProvincia } from \"./provincias\";\nimport type { Address, Carrier, PackageInfo, ServiceLevel } from \"./types\";\n\nexport interface ShippingToolsOptions {\n  /**\n   * Shipping adapters keyed by carrier. Pass at least one. When a tool is\n   * called and the requested carrier isn't configured, it returns\n   * `{ available: false, error }` instead of crashing.\n   *\n   * @example\n   * ```ts\n   * shippingTools({\n   *   adapters: {\n   *     andreani: new AndreaniAdapter({ ... }),\n   *     correo_argentino: new CorreoAdapter(),\n   *   },\n   *   defaultCarrier: \"andreani\",\n   * });\n   * ```\n   */\n  adapters?: Partial<Record<Carrier, ShippingAdapter>>;\n  /**\n   * Default carrier when the agent doesn't specify one. Saves the agent\n   * from having to remember which carriers are wired.\n   */\n  defaultCarrier?: Carrier;\n  /**\n   * Override the agent-facing tool descriptions.\n   */\n  descriptions?: Partial<Record<ShippingToolName, string>>;\n}\n\nexport type ShippingToolName =\n  | \"cotizar_envio\"\n  | \"cotizar_envio_todos\"\n  | \"crear_envio\"\n  | \"trackear_envio\"\n  | \"cancelar_envio\"\n  | \"listar_sucursales\";\n\nconst DEFAULT_DESCRIPTIONS: Record<ShippingToolName, string> = {\n  cotizar_envio:\n    \"Quote the shipping cost with one carrier (cotizar un envío) (Andreani, OCA, o Correo Argentino). Pasá origen + destino + paquetes (peso + dimensiones + valor declarado) y servicio (standard, express, same_day). Returns { carrier, costArs, estimatedDaysMin, estimatedDaysMax, productId }. USE WHEN el usuario quiere el precio de UN carrier conocido. Para comparar entre carriers, usá cotizar_envio_todos.\",\n\n  cotizar_envio_todos:\n    \"Compare shipping quotes across ALL configured carriers in parallel (cotizar envío en todos los carriers). Returns { quotes: QuoteOption[] } ordenado por costo (más barato primero). USE WHEN el usuario dice 'cuál es el envío más barato' o 'compará Andreani vs OCA vs Correo'. Si un carrier falla individualmente, los otros igual responden, el campo error en cada quote indica si falló.\",\n\n  crear_envio:\n    \"Create a real shipment and get a tracking number + label (crear un envío). RETURNS un trackingNumber + labelUrl + costo. SIDE EFFECT: el envío queda registrado en el sistema del carrier, confirma con el usuario antes si el monto es alto (>$10k declared value). Para Andreani, requiere productId del cotizador previo si querés bloquear el precio. Usá `externalReference` para reconciliar con tu order id.\",\n\n  trackear_envio:\n    \"Track a shipment by tracking number (trackear un envío, dónde está mi paquete). Returns { currentStatus, events[], deliveredAt? }. currentStatus normalizado a uno de: label_created, in_transit, out_for_delivery, delivered, delivery_failed, returned, canceled, exception, unknown. SURFACE los `events` al usuario en orden cronológico, muestran el detalle del recorrido.\",\n\n  cancelar_envio:\n    \"Cancel a shipment that has not gone out for delivery (cancelar un envío). Returns { canceled: bool, reason? }. Si canceled=false, surface reason verbatim al usuario (típicamente 'ya está en reparto' o 'el carrier no soporta cancelación post-pickup'). Para envíos ya entregados, NO se puede cancelar, el usuario tiene que coordinar una devolución manual.\",\n\n  listar_sucursales:\n    \"List carrier branch offices near a postal code (listar sucursales de un carrier) cerca de un Código Postal Argentino (CPA). Returns array con id, name, address, openingHours, distanceKm cuando disponible. USE WHEN el usuario quiere despachar el envío en sucursal en lugar de retiro a domicilio, o cuando necesita un punto Pickup para que el destinatario retire.\",\n};\n\nexport function shippingTools(options: ShippingToolsOptions = {}): ToolSet {\n  const desc = (name: ShippingToolName): string =>\n    options.descriptions?.[name] ?? DEFAULT_DESCRIPTIONS[name];\n  const adapters = options.adapters ?? {};\n\n  const getAdapter = (carrier: Carrier): ShippingAdapter | null => {\n    const a = adapters[carrier];\n    if (a) return a;\n    return null;\n  };\n\n  const requireAdapter = (\n    carrier: Carrier | undefined,\n  ): ShippingAdapter | { _notConfigured: true; carrier: Carrier } => {\n    const c = carrier ?? options.defaultCarrier;\n    if (!c) {\n      return { _notConfigured: true, carrier: \"andreani\" as Carrier };\n    }\n    const a = getAdapter(c);\n    if (!a) return { _notConfigured: true, carrier: c };\n    return a;\n  };\n\n  const notConfiguredResult = (carrier: Carrier) => ({\n    available: false,\n    error: `Carrier '${carrier}' no está configurado. Pasá un adapter a shippingTools({ adapters: { ${carrier}: new ${\n      carrier === \"andreani\"\n        ? \"AndreaniAdapter\"\n        : carrier === \"oca\"\n          ? \"OcaAdapter\"\n          : \"CorreoAdapter\"\n    }({ ... }) } }).`,\n    data: null,\n  });\n\n  const validateAddress = (addr: Address, label: string): string | null => {\n    if (!isValidCPA(addr.postalCode)) {\n      return `${label}.postalCode '${addr.postalCode}' no es un CPA válido (debe ser 4 dígitos o extendido B1842ZAB).`;\n    }\n    if (!lookupProvincia(addr.state)) {\n      return `${label}.state '${addr.state}' no es una provincia AR válida.`;\n    }\n    return null;\n  };\n\n  const addressSchema = z.object({\n    name: z.string().min(1).max(120).describe(\"Recipient or sender full name. Required.\"),\n    company: z.string().max(120).optional().describe(\"Company name if delivering to a business.\"),\n    street: z.string().min(1).max(200).describe(\"Street name.\"),\n    number: z.string().min(1).max(20).describe(\"Street number (string, supports 's/n', '1234A', etc.).\"),\n    unit: z.string().max(40).optional().describe(\"Apt/floor (e.g. '4°B', 'PB').\"),\n    city: z.string().min(1).max(120).describe(\"City / locality.\"),\n    state: z\n      .string()\n      .min(1)\n      .max(40)\n      .describe(\"AR provincia. Accepts 'Buenos Aires', 'CABA', single-letter codes ('B', 'C'), etc. Validated against the official enum at runtime.\"),\n    postalCode: z\n      .string()\n      .min(4)\n      .max(8)\n      .describe(\"AR postal code (CPA). 4 digits ('1842') or extended ('B1842ZAB'). Validated at runtime.\"),\n    country: z.string().max(40).optional().describe(\"Default 'AR'. Required for international.\"),\n    phone: z.string().max(40).optional().describe(\"Contact phone for delivery coordination.\"),\n    email: z.string().email().optional(),\n    notes: z.string().max(500).optional(),\n  });\n\n  const packageSchema = z.object({\n    weightKg: z.number().positive(),\n    lengthCm: z.number().positive(),\n    widthCm: z.number().positive(),\n    heightCm: z.number().positive(),\n    declaredValueArs: z.number().nonnegative(),\n    description: z.string().optional(),\n    fragile: z.boolean().optional(),\n  });\n\n  const carrierSchema = z\n    .enum([\"andreani\", \"oca\", \"correo_argentino\"])\n    .optional();\n  const serviceSchema = z\n    .enum([\"standard\", \"express\", \"same_day\"])\n    .optional();\n\n  return {\n    cotizar_envio: tool({\n      description: desc(\"cotizar_envio\"),\n      inputSchema: z.object({\n        carrier: carrierSchema,\n        origin: addressSchema,\n        destination: addressSchema,\n        packages: z.array(packageSchema).min(1),\n        service: serviceSchema,\n      }),\n      execute: async (input) => {\n        const adapter = requireAdapter(input.carrier as Carrier);\n        if (\"_notConfigured\" in adapter) return notConfiguredResult(adapter.carrier);\n        const originErr = validateAddress(input.origin as Address, \"origin\");\n        if (originErr) return { available: true, ok: false, error: originErr };\n        const destErr = validateAddress(input.destination as Address, \"destination\");\n        if (destErr) return { available: true, ok: false, error: destErr };\n        try {\n          const quote = await adapter.cotizar({\n            origin: input.origin as Address,\n            destination: input.destination as Address,\n            packages: input.packages as PackageInfo[],\n            ...(input.service !== undefined ? { service: input.service as ServiceLevel } : {}),\n          });\n          return { available: true, ok: true, ...quote };\n        } catch (err) {\n          return {\n            available: true,\n            ok: false,\n            error: err instanceof Error ? err.message : String(err),\n          };\n        }\n      },\n    }),\n\n    cotizar_envio_todos: tool({\n      description: desc(\"cotizar_envio_todos\"),\n      inputSchema: z.object({\n        origin: addressSchema,\n        destination: addressSchema,\n        packages: z.array(packageSchema).min(1),\n        service: serviceSchema,\n      }),\n      execute: async (input) => {\n        const originErr = validateAddress(input.origin as Address, \"origin\");\n        if (originErr) return { available: true, ok: false, error: originErr };\n        const destErr = validateAddress(input.destination as Address, \"destination\");\n        if (destErr) return { available: true, ok: false, error: destErr };\n        const carriers = Object.keys(adapters) as Carrier[];\n        if (carriers.length === 0) {\n          return {\n            available: false,\n            error: \"No hay carriers configurados. Pasá al menos uno a shippingTools({ adapters: ... }).\",\n            quotes: [],\n          };\n        }\n        const results = await Promise.all(\n          carriers.map(async (c) => {\n            try {\n              const q = await adapters[c]!.cotizar({\n                origin: input.origin as Address,\n                destination: input.destination as Address,\n                packages: input.packages as PackageInfo[],\n                ...(input.service !== undefined ? { service: input.service as ServiceLevel } : {}),\n              });\n              return { carrier: c, ok: true as const, quote: q };\n            } catch (err) {\n              return {\n                carrier: c,\n                ok: false as const,\n                error: err instanceof Error ? err.message : String(err),\n              };\n            }\n          }),\n        );\n        const quotes = results\n          .filter((r) => r.ok)\n          .map((r) => (r as { ok: true; quote: import(\"./types\").QuoteOption }).quote)\n          .sort((a, b) => a.costArs - b.costArs);\n        const errors = results\n          .filter((r) => !r.ok)\n          .map((r) => ({\n            carrier: r.carrier,\n            error: (r as { ok: false; error: string }).error,\n          }));\n        return {\n          available: true,\n          ok: quotes.length > 0,\n          quotes,\n          errors,\n          cheapest: quotes[0] ?? null,\n        };\n      },\n    }),\n\n    crear_envio: tool({\n      description: desc(\"crear_envio\"),\n      inputSchema: z.object({\n        carrier: carrierSchema,\n        origin: addressSchema,\n        destination: addressSchema,\n        packages: z.array(packageSchema).min(1),\n        service: serviceSchema,\n        external_reference: z.string().optional(),\n        product_id: z.string().optional(),\n      }),\n      execute: async (input) => {\n        const adapter = requireAdapter(input.carrier as Carrier);\n        if (\"_notConfigured\" in adapter) return notConfiguredResult(adapter.carrier);\n        try {\n          const created = await adapter.crear({\n            origin: input.origin as Address,\n            destination: input.destination as Address,\n            packages: input.packages as PackageInfo[],\n            ...(input.service !== undefined ? { service: input.service as ServiceLevel } : {}),\n            ...(input.external_reference !== undefined ? { externalReference: input.external_reference } : {}),\n            ...(input.product_id !== undefined ? { productId: input.product_id } : {}),\n          });\n          return { available: true, ok: true, ...created };\n        } catch (err) {\n          return {\n            available: true,\n            ok: false,\n            error: err instanceof Error ? err.message : String(err),\n          };\n        }\n      },\n    }),\n\n    trackear_envio: tool({\n      description: desc(\"trackear_envio\"),\n      inputSchema: z.object({\n        carrier: carrierSchema,\n        tracking_number: z.string().min(1).max(40).describe(\"Tracking number from crear_envio.\"),\n      }),\n      execute: async ({ carrier, tracking_number }) => {\n        const adapter = requireAdapter(carrier as Carrier);\n        if (\"_notConfigured\" in adapter) return notConfiguredResult(adapter.carrier);\n        try {\n          const r = await adapter.trackear(tracking_number);\n          return { available: true, ok: true, ...r };\n        } catch (err) {\n          return {\n            available: true,\n            ok: false,\n            error: err instanceof Error ? err.message : String(err),\n          };\n        }\n      },\n    }),\n\n    cancelar_envio: tool({\n      description: desc(\"cancelar_envio\"),\n      inputSchema: z.object({\n        carrier: carrierSchema,\n        tracking_number: z.string().min(1).max(40).describe(\"Tracking number from crear_envio.\"),\n      }),\n      execute: async ({ carrier, tracking_number }) => {\n        const adapter = requireAdapter(carrier as Carrier);\n        if (\"_notConfigured\" in adapter) return notConfiguredResult(adapter.carrier);\n        try {\n          const r = await adapter.cancelar(tracking_number);\n          return { available: true, ok: r.canceled, ...r };\n        } catch (err) {\n          return {\n            available: true,\n            ok: false,\n            error: err instanceof Error ? err.message : String(err),\n          };\n        }\n      },\n    }),\n\n    listar_sucursales: tool({\n      description: desc(\"listar_sucursales\"),\n      inputSchema: z.object({\n        carrier: carrierSchema,\n        postal_code: z\n          .string()\n          .min(4)\n          .max(8)\n          .describe(\"AR CPA, 4 digits or extended ('B1842ZAB').\"),\n        limit: z.number().int().min(1).max(50).optional(),\n      }),\n      execute: async ({ carrier, postal_code, limit }) => {\n        if (!isValidCPA(postal_code)) {\n          return {\n            available: true,\n            ok: false,\n            error: `postal_code '${postal_code}' no es un CPA válido.`,\n          };\n        }\n        const adapter = requireAdapter(carrier as Carrier);\n        if (\"_notConfigured\" in adapter) return notConfiguredResult(adapter.carrier);\n        try {\n          const branches = await adapter.listarSucursales({\n            postalCode: postal_code,\n            ...(limit !== undefined ? { limit } : {}),\n          });\n          return { available: true, ok: true, branches };\n        } catch (err) {\n          return {\n            available: true,\n            ok: false,\n            error: err instanceof Error ? err.message : String(err),\n          };\n        }\n      },\n    }),\n  } satisfies ToolSet;\n}\n\n// Convenience for tests / one-off usage when no adapter is wired.\nexport function unconfiguredShippingTools(): ToolSet {\n  return shippingTools({\n    adapters: {\n      andreani: new UnconfiguredShippingAdapter(\"andreani\"),\n    },\n    defaultCarrier: \"andreani\",\n  });\n}\n"]}