{"version":3,"sources":["../src/hitl.ts","../src/schemas/common.ts","../src/schemas/item.ts","../src/items.ts","../src/schemas/category.ts","../src/categories.ts","../src/schemas/question.ts","../src/questions.ts","../src/schemas/order.ts","../src/orders.ts","../src/schemas/claim.ts","../src/claims.ts","../src/shipments.ts","../src/schemas/shipment.ts","../src/errors.ts","../src/schemas/reputation.ts","../src/reputation.ts","../src/schemas/promotion.ts","../src/promotions.ts","../src/ai-sdk.ts"],"names":["z","ArAgentsError","tool"],"mappings":"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","file":"ai-sdk.cjs","sourcesContent":["// Human-in-the-loop (HITL) gate for irreversible operations.\n//\n// Eight tool functions in `meliTools()` mutate seller-visible state in ways\n// that are hard to reverse:\n//\n//   create_item                 — emits a public listing\n//   update_item_price_or_stock  — public price change (visible immediately)\n//   answer_question             — public answer on the listing page\n//   defend_claim                — uploads evidence (one-shot, no amendment)\n//   optInPromotion              — locks the discount until promo expires\n//   blacklistAsker              — silences a buyer permanently\n//   pauseItem / closeItem       — affects discoverability + indexing\n//\n// Stripe Agent Toolkit's HITL pattern, applied to MELI. The host wires a\n// `requireConfirmation` callback that the lib invokes BEFORE the HTTP call\n// fires. The callback returns `true` to proceed, `false` to abort. The\n// guard is PROGRAMMATIC — it's not just a system-prompt rule the LLM might\n// ignore; the tool literally cannot execute without confirmation.\n//\n// Use cases:\n//   - Show the user a UI (\"approve $X price change on MLA…?\") and wait.\n//   - Auto-approve below a threshold (\"any change <5% is fine\").\n//   - Email/Slack the seller before destructive ops in a multi-tenant SaaS.\n//   - Audit logging — every irreversible op gets logged with the operator id.\n\n/** Operations the HITL gate covers. Stable identifiers — host code can\n *  switch on these to render different UIs (\"you're about to defend claim\n *  X with N evidences\" vs \"you're about to change the price of Y\"). */\nexport type HitlOpKind =\n  | \"create_item\"\n  | \"update_item_price_or_stock\"\n  | \"pause_item\"\n  | \"close_item\"\n  | \"relist_item\"\n  | \"answer_question\"\n  | \"defend_claim\"\n  | \"opt_in_promotion\"\n  | \"blacklist_asker\";\n\n/** Common envelope across all op kinds. Tool implementations wrap their\n *  inputs into this shape before invoking the gate. */\nexport interface HitlContext<TKind extends HitlOpKind = HitlOpKind> {\n  kind: TKind;\n  /** Stable identifier for the resource being mutated (item id, claim id,\n   *  question id, etc.) so the host UI can render a recognizable target. */\n  resourceId: string | number;\n  /** Human-readable summary the host can show the user without parsing the\n   *  raw input. Always Spanish — these go in front of Argentine sellers. */\n  summary: string;\n  /** Raw inputs the tool received, for advanced UIs that want to render a\n   *  diff or full preview. Don't rely on the shape — it's per-op. */\n  input: unknown;\n  /** Best-effort severity hint. Hosts can use this to decide whether to\n   *  block + ask vs auto-approve via threshold rules. */\n  severity: \"low\" | \"medium\" | \"high\";\n}\n\n/**\n * Decision returned from the host's HITL callback.\n *\n *   - `{ approve: true }`            — proceed with the operation.\n *   - `{ approve: false, reason }`   — abort. The tool returns\n *                                      `{ ok: false, code: \"hitl_rejected\" }`.\n *   - `{ approve: true, override: { ... } }` — proceed BUT replace the\n *                                              tool's inputs (e.g., user\n *                                              hand-edited the answer text\n *                                              before approving).\n */\nexport type HitlDecision =\n  | { approve: true; override?: Record<string, unknown> }\n  | { approve: false; reason?: string };\n\n/** Sync or async — hosts often need to render a UI + await a click. */\nexport type RequireConfirmation = (\n  context: HitlContext,\n) => HitlDecision | Promise<HitlDecision>;\n\n/**\n * Auto-approve hook. Lets the host run a fast policy decision before\n * popping a UI dialog. Examples:\n *   - \"any update under 5% price delta auto-approves\"\n *   - \"any answer under 200 chars auto-approves\"\n *   - \"create_item never auto-approves; always ask\"\n */\nexport type AutoApprovePolicy = (\n  context: HitlContext,\n) => boolean | Promise<boolean>;\n\n/** Default policy — never auto-approves. Forces every irreversible op\n *  through the user. Hosts override via `meliTools(client, { hitl })`. */\nexport const denyAllAutoApprove: AutoApprovePolicy = () => false;\n\n/** Combined HITL configuration the AI-SDK toolset accepts. */\nexport interface HitlConfig {\n  /** Required. Called to gate every op the auto-approve policy didn't pass. */\n  requireConfirmation: RequireConfirmation;\n  /** Optional. Bypasses `requireConfirmation` when it returns true. */\n  autoApprove?: AutoApprovePolicy;\n}\n\n/** Internal helper used by the AI-SDK tool wrappers. Returns the (possibly\n *  overridden) inputs if the op is approved, or throws `HitlRejectedError`\n *  if rejected. */\nexport class HitlRejectedError extends Error {\n  readonly code = \"hitl_rejected\";\n  constructor(\n    public readonly context: HitlContext,\n    public readonly reason?: string,\n  ) {\n    super(\n      reason\n        ? `HITL: rejected by user (${context.kind} on ${context.resourceId}): ${reason}`\n        : `HITL: rejected by user (${context.kind} on ${context.resourceId})`,\n    );\n    this.name = \"HitlRejectedError\";\n  }\n}\n\nexport async function gateHitl(\n  hitl: HitlConfig | undefined,\n  context: HitlContext,\n): Promise<{ approved: true; overrides?: Record<string, unknown> }> {\n  if (!hitl) return { approved: true };\n  const auto = hitl.autoApprove ?? denyAllAutoApprove;\n  if (await auto(context)) return { approved: true };\n  const decision = await hitl.requireConfirmation(context);\n  if (decision.approve === false) {\n    throw new HitlRejectedError(context, decision.reason);\n  }\n  if (decision.override !== undefined) {\n    return { approved: true, overrides: decision.override };\n  }\n  return { approved: true };\n}\n\n/** Severity classifier. Used by tool wrappers when building the context. */\nexport function classifyHitlSeverity(kind: HitlOpKind): HitlContext[\"severity\"] {\n  switch (kind) {\n    case \"create_item\":\n    case \"defend_claim\":\n    case \"opt_in_promotion\":\n      return \"high\"; // hard to undo\n    case \"update_item_price_or_stock\":\n    case \"pause_item\":\n    case \"close_item\":\n    case \"blacklist_asker\":\n      return \"medium\"; // reversible but visible\n    case \"relist_item\":\n    case \"answer_question\":\n      return \"low\"; // small blast radius\n  }\n}\n","import { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Site IDs (MLA / MLB / MLM / MLC / MCO / MLU / MPE)\n// ---------------------------------------------------------------------------\n\nexport const SiteId = z.enum([\n  \"MLA\", // Argentina\n  \"MLB\", // Brazil\n  \"MLM\", // Mexico\n  \"MLC\", // Chile\n  \"MCO\", // Colombia\n  \"MLU\", // Uruguay\n  \"MPE\", // Peru\n]);\nexport type SiteId = z.infer<typeof SiteId>;\n\n// MELI uses ISO 4217 alpha-3 codes. We accept upper or lower; canonical\n// serialization is upper.\nexport const Currency = z.enum([\n  \"ARS\", // MLA\n  \"BRL\", // MLB\n  \"MXN\", // MLM\n  \"CLP\", // MLC\n  \"COP\", // MCO\n  \"UYU\", // MLU\n  \"PEN\", // MPE\n  \"USD\",\n]);\nexport type Currency = z.infer<typeof Currency>;\n\n// ---------------------------------------------------------------------------\n// MELI item id pattern (e.g. MLA123456789, MLB987654321)\n// ---------------------------------------------------------------------------\n\nexport const MeliItemId = z\n  .string()\n  .regex(/^(MLA|MLB|MLM|MLC|MCO|MLU|MPE)\\d+$/, \"must be a MELI item id like 'MLA123456789'\");\nexport type MeliItemId = z.infer<typeof MeliItemId>;\n\n// ---------------------------------------------------------------------------\n// Category id (e.g. MLA1055)\n// ---------------------------------------------------------------------------\n\nexport const CategoryId = z\n  .string()\n  .regex(/^(MLA|MLB|MLM|MLC|MCO|MLU|MPE)\\d+$/, \"must be a MELI category id like 'MLA1055'\");\nexport type CategoryId = z.infer<typeof CategoryId>;\n\n// ---------------------------------------------------------------------------\n// Listing types and item statuses\n// ---------------------------------------------------------------------------\n\nexport const ListingType = z.enum([\n  \"free\",\n  \"bronze\",\n  \"silver\",\n  \"gold\",\n  \"gold_premium\",\n  \"gold_special\",\n  \"gold_pro\",\n]);\nexport type ListingType = z.infer<typeof ListingType>;\n\nexport const ItemStatus = z.enum([\n  \"active\",\n  \"paused\",\n  \"closed\",\n  \"under_review\",\n  \"inactive\",\n  \"payment_required\",\n  \"not_yet_active\",\n]);\nexport type ItemStatus = z.infer<typeof ItemStatus>;\n\n// ---------------------------------------------------------------------------\n// Cursor pagination\n// ---------------------------------------------------------------------------\n\nexport const PagingResponse = z.object({\n  total: z.number().int().nonnegative(),\n  offset: z.number().int().nonnegative().optional(),\n  limit: z.number().int().positive().optional(),\n});\nexport type PagingResponse = z.infer<typeof PagingResponse>;\n\nexport const ScrollPagingResponse = z.object({\n  total: z.number().int().nonnegative(),\n  scroll_id: z.string().optional(),\n  limit: z.number().int().positive().optional(),\n});\nexport type ScrollPagingResponse = z.infer<typeof ScrollPagingResponse>;\n\n// ---------------------------------------------------------------------------\n// Pictures\n// ---------------------------------------------------------------------------\n\nexport const Picture = z.object({\n  id: z.string().optional(),\n  url: z.string().url().optional(),\n  secure_url: z.string().url().optional(),\n  size: z.string().optional(),\n  max_size: z.string().optional(),\n  quality: z.string().optional(),\n});\nexport type Picture = z.infer<typeof Picture>;\n\n// ---------------------------------------------------------------------------\n// Common attribute (used in items + categories)\n// ---------------------------------------------------------------------------\n\nexport const ItemAttribute = z.object({\n  id: z.string(),\n  name: z.string().optional(),\n  value_id: z.string().nullable().optional(),\n  value_name: z.string().nullable().optional(),\n  value_struct: z\n    .object({\n      number: z.number().optional(),\n      unit: z.string().optional(),\n    })\n    .nullable()\n    .optional(),\n  attribute_group_id: z.string().optional(),\n  attribute_group_name: z.string().optional(),\n});\nexport type ItemAttribute = z.infer<typeof ItemAttribute>;\n","import { z } from \"zod\";\nimport {\n  CategoryId,\n  Currency,\n  ItemAttribute,\n  ItemStatus,\n  ListingType,\n  MeliItemId,\n  Picture,\n  SiteId,\n} from \"./common\";\n\n// ---------------------------------------------------------------------------\n// Variations\n// ---------------------------------------------------------------------------\n\nexport const ItemVariation = z.object({\n  id: z.union([z.string(), z.number()]),\n  price: z.number().nonnegative().optional(),\n  available_quantity: z.number().int().nonnegative().optional(),\n  sold_quantity: z.number().int().nonnegative().optional(),\n  attribute_combinations: z.array(ItemAttribute).optional(),\n  picture_ids: z.array(z.string()).optional(),\n  seller_custom_field: z.string().nullable().optional(),\n});\nexport type ItemVariation = z.infer<typeof ItemVariation>;\n\n// ---------------------------------------------------------------------------\n// Shipping\n// ---------------------------------------------------------------------------\n\nexport const ItemShipping = z.object({\n  mode: z\n    .enum([\"me1\", \"me2\", \"custom\", \"not_specified\"])\n    .optional(),\n  free_shipping: z.boolean().optional(),\n  logistic_type: z\n    .enum([\n      \"default\",\n      \"self_service\",\n      \"cross_docking\",\n      \"xd_drop_off\",\n      \"fulfillment\",\n      \"drop_off\",\n    ])\n    .optional(),\n  tags: z.array(z.string()).optional(),\n  dimensions: z.string().nullable().optional(),\n  local_pick_up: z.boolean().optional(),\n  free_methods: z\n    .array(\n      z.object({\n        id: z.union([z.string(), z.number()]),\n        rule: z\n          .object({\n            free_mode: z.string().optional(),\n            value: z.number().optional(),\n          })\n          .optional(),\n      }),\n    )\n    .optional(),\n});\nexport type ItemShipping = z.infer<typeof ItemShipping>;\n\n// ---------------------------------------------------------------------------\n// Item (full shape)\n// ---------------------------------------------------------------------------\n\nexport const Item = z.object({\n  id: MeliItemId,\n  site_id: SiteId,\n  title: z.string(),\n  subtitle: z.string().nullable().optional(),\n  seller_id: z.number().int(),\n  category_id: CategoryId,\n  official_store_id: z.number().int().nullable().optional(),\n  price: z.number().nonnegative(),\n  base_price: z.number().nonnegative().optional(),\n  original_price: z.number().nonnegative().nullable().optional(),\n  currency_id: Currency,\n  initial_quantity: z.number().int().nonnegative().optional(),\n  available_quantity: z.number().int().nonnegative(),\n  sold_quantity: z.number().int().nonnegative().optional(),\n  buying_mode: z.enum([\"buy_it_now\", \"auction\", \"classified\"]).optional(),\n  listing_type_id: ListingType,\n  start_time: z.string().optional(),\n  stop_time: z.string().optional(),\n  end_time: z.string().optional(),\n  expiration_time: z.string().optional(),\n  condition: z.enum([\"new\", \"used\", \"not_specified\"]).optional(),\n  permalink: z.string().url().optional(),\n  thumbnail: z.string().url().optional(),\n  secure_thumbnail: z.string().url().optional(),\n  pictures: z.array(Picture).optional(),\n  video_id: z.string().nullable().optional(),\n  descriptions: z\n    .array(z.object({ id: z.string() }))\n    .optional(),\n  accepts_mercadopago: z.boolean().optional(),\n  shipping: ItemShipping.optional(),\n  international_delivery_mode: z.string().optional(),\n  seller_address: z\n    .object({\n      city: z.object({ id: z.string().optional(), name: z.string().optional() }).optional(),\n      state: z.object({ id: z.string().optional(), name: z.string().optional() }).optional(),\n      country: z.object({ id: z.string().optional(), name: z.string().optional() }).optional(),\n      zip_code: z.string().optional(),\n    })\n    .optional(),\n  seller_contact: z.unknown().nullable().optional(),\n  location: z.unknown().optional(),\n  geolocation: z\n    .object({\n      latitude: z.number().optional(),\n      longitude: z.number().optional(),\n    })\n    .optional(),\n  coverage_areas: z.array(z.unknown()).optional(),\n  attributes: z.array(ItemAttribute).optional(),\n  warnings: z.array(z.unknown()).optional(),\n  listing_source: z.string().optional(),\n  variations: z.array(ItemVariation).optional(),\n  status: ItemStatus,\n  sub_status: z.array(z.string()).optional(),\n  tags: z.array(z.string()).optional(),\n  warranty: z.string().nullable().optional(),\n  catalog_product_id: z.string().nullable().optional(),\n  domain_id: z.string().nullable().optional(),\n  parent_item_id: MeliItemId.nullable().optional(),\n  differential_pricing: z.unknown().nullable().optional(),\n  deal_ids: z.array(z.string()).optional(),\n  automatic_relist: z.boolean().optional(),\n  date_created: z.string().optional(),\n  last_updated: z.string().optional(),\n  health: z.number().nullable().optional(),\n  catalog_listing: z.boolean().optional(),\n  channels: z.array(z.string()).optional(),\n});\nexport type Item = z.infer<typeof Item>;\n\n// ---------------------------------------------------------------------------\n// Create/update payloads\n// ---------------------------------------------------------------------------\n\nexport const ItemCreateRequest = z.object({\n  title: z.string().min(1),\n  category_id: CategoryId,\n  price: z.number().nonnegative(),\n  currency_id: Currency,\n  available_quantity: z.number().int().nonnegative(),\n  buying_mode: z.enum([\"buy_it_now\", \"classified\"]).default(\"buy_it_now\"),\n  listing_type_id: ListingType.default(\"gold_special\"),\n  condition: z.enum([\"new\", \"used\", \"not_specified\"]).default(\"new\"),\n  description: z\n    .object({ plain_text: z.string() })\n    .or(z.string())\n    .optional(),\n  pictures: z\n    .array(z.object({ source: z.string().url() }))\n    .min(1)\n    .optional(),\n  attributes: z.array(ItemAttribute).optional(),\n  variations: z.array(ItemVariation).optional(),\n  warranty: z.string().optional(),\n  shipping: ItemShipping.optional(),\n  catalog_listing: z.boolean().optional(),\n  catalog_product_id: z.string().optional(),\n});\nexport type ItemCreateRequest = z.infer<typeof ItemCreateRequest>;\n\nexport const ItemUpdateRequest = z\n  .object({\n    title: z.string().optional(),\n    price: z.number().nonnegative().optional(),\n    available_quantity: z.number().int().nonnegative().optional(),\n    status: z.enum([\"active\", \"paused\", \"closed\"]).optional(),\n    pictures: z.array(z.object({ source: z.string().url() })).optional(),\n    attributes: z.array(ItemAttribute).optional(),\n    variations: z.array(ItemVariation).optional(),\n  })\n  .partial();\nexport type ItemUpdateRequest = z.infer<typeof ItemUpdateRequest>;\n","// Items API — `/items`, `/items/{id}`, `/users/{id}/items/search`.\n//\n// Covers create / get / update / pause / close / relist / multiget /\n// seller-items search with cursor (`scroll_id`) pagination.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  Item,\n  ItemCreateRequest,\n  ItemUpdateRequest,\n  type Item as TItem,\n  type ItemCreateRequest as TItemCreateRequest,\n  type ItemUpdateRequest as TItemUpdateRequest,\n} from \"./schemas/item\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Get (single)\n// ---------------------------------------------------------------------------\n\nexport interface GetItemOptions {\n  /** Optionally project a subset of fields via the `attributes` param. */\n  attributes?: string[];\n  /** Include catalog data in the response. */\n  includeCatalog?: boolean;\n}\n\nexport async function getItem(\n  client: MeliClient,\n  itemId: string,\n  options: GetItemOptions = {},\n): Promise<TItem> {\n  const query: Record<string, string> = {};\n  if (options.attributes) query[\"attributes\"] = options.attributes.join(\",\");\n  if (options.includeCatalog) query[\"include_attributes\"] = \"all\";\n  return client.fetch<TItem>({\n    method: \"GET\",\n    path: `/items/${itemId}`,\n    query,\n    responseSchema: Item,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Multiget — `/items?ids=ML...,ML...`\n//\n// MELI's `/items?ids=...` accepts at most **20 ids per call**. This helper\n// auto-chunks larger arrays + parallelizes the chunks (still gated by the\n// client's per-seller rate limiter, so no risk of overwhelming MELI).\n// Items the API returns with a non-200 sub-code (e.g., 404 because the item\n// was deleted) are silently dropped — callers that need to surface those\n// should use `getItem` per-id instead.\n// ---------------------------------------------------------------------------\n\nconst MELI_MULTIGET_LIMIT = 20;\n\nconst MultigetEntry = z.object({\n  code: z.number().int(),\n  body: Item,\n});\nconst MultigetResponse = z.array(MultigetEntry);\n\nexport interface MultigetOptions {\n  /** How many chunks to fetch in parallel. Default 4 — high enough to halve\n   *  wall-clock time on a 100-item lookup, low enough that the per-seller\n   *  rate limit stays within burst on hot paths. */\n  concurrency?: number;\n}\n\nexport async function multigetItems(\n  client: MeliClient,\n  itemIds: string[],\n  options: MultigetOptions = {},\n): Promise<TItem[]> {\n  if (itemIds.length === 0) return [];\n\n  // Single-call fast path: no chunking + no parallelism overhead.\n  if (itemIds.length <= MELI_MULTIGET_LIMIT) {\n    const response = await client.fetch<z.infer<typeof MultigetResponse>>({\n      method: \"GET\",\n      path: `/items`,\n      query: { ids: itemIds.join(\",\") },\n      responseSchema: MultigetResponse,\n    });\n    return response.filter((e) => e.code === 200).map((e) => e.body);\n  }\n\n  // Chunk + fetch in parallel. Preserve original order for the caller — when\n  // chunk N completes before chunk N-1, we still want the output to match\n  // the input ordering.\n  const concurrency = Math.max(1, options.concurrency ?? 4);\n  const chunks: string[][] = [];\n  for (let i = 0; i < itemIds.length; i += MELI_MULTIGET_LIMIT) {\n    chunks.push(itemIds.slice(i, i + MELI_MULTIGET_LIMIT));\n  }\n  const results: TItem[][] = new Array(chunks.length);\n  let next = 0;\n  async function worker() {\n    while (next < chunks.length) {\n      const idx = next++;\n      const chunk = chunks[idx]!;\n      const response = await client.fetch<z.infer<typeof MultigetResponse>>({\n        method: \"GET\",\n        path: `/items`,\n        query: { ids: chunk.join(\",\") },\n        responseSchema: MultigetResponse,\n      });\n      results[idx] = response.filter((e) => e.code === 200).map((e) => e.body);\n    }\n  }\n  await Promise.all(\n    Array.from({ length: Math.min(concurrency, chunks.length) }, () => worker()),\n  );\n  return results.flat();\n}\n\n// ---------------------------------------------------------------------------\n// Create\n// ---------------------------------------------------------------------------\n\nexport async function createItem(\n  client: MeliClient,\n  payload: TItemCreateRequest,\n): Promise<TItem> {\n  const validated = ItemCreateRequest.parse(payload);\n  return client.fetch<TItem>({\n    method: \"POST\",\n    path: `/items`,\n    body: validated,\n    responseSchema: Item,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Update\n// ---------------------------------------------------------------------------\n\nexport async function updateItem(\n  client: MeliClient,\n  itemId: string,\n  payload: TItemUpdateRequest,\n): Promise<TItem> {\n  const validated = ItemUpdateRequest.parse(payload);\n  return client.fetch<TItem>({\n    method: \"PUT\",\n    path: `/items/${itemId}`,\n    body: validated,\n    responseSchema: Item,\n  });\n}\n\nexport async function pauseItem(client: MeliClient, itemId: string): Promise<TItem> {\n  return updateItem(client, itemId, { status: \"paused\" });\n}\n\nexport async function closeItem(client: MeliClient, itemId: string): Promise<TItem> {\n  return updateItem(client, itemId, { status: \"closed\" });\n}\n\n// ---------------------------------------------------------------------------\n// Relist (re-activate a closed listing)\n// ---------------------------------------------------------------------------\n\nexport async function relistItem(\n  client: MeliClient,\n  itemId: string,\n  args: {\n    listing_type_id?: TItem[\"listing_type_id\"];\n    quantity?: number;\n    price?: number;\n  } = {},\n): Promise<TItem> {\n  return client.fetch<TItem>({\n    method: \"POST\",\n    path: `/items/${itemId}/relist`,\n    body: args,\n    responseSchema: Item,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Seller-side items search with scroll_id pagination\n// (the only way to iterate >1k items)\n// ---------------------------------------------------------------------------\n\nexport const SellerItemsSearchResponse = z.object({\n  paging: z.object({\n    total: z.number().int().nonnegative(),\n    offset: z.number().int().nonnegative().optional(),\n    limit: z.number().int().positive().optional(),\n  }),\n  results: z.array(z.string()), // item ids\n  scroll_id: z.string().optional(),\n});\nexport type SellerItemsSearchResponse = z.infer<typeof SellerItemsSearchResponse>;\n\nexport interface SearchSellerItemsOptions {\n  /** Status filter. */\n  status?: \"active\" | \"paused\" | \"closed\" | \"all\";\n  /** ISO date filter — items updated after this. */\n  updatedAfter?: string;\n  /** Sort. */\n  sort?: \"last_updated_desc\" | \"last_updated_asc\";\n  /** Page size. Default 50. */\n  limit?: number;\n  /** Continuation token from the previous call. */\n  scrollId?: string;\n}\n\nexport async function searchSellerItems(\n  client: MeliClient,\n  sellerId: number,\n  options: SearchSellerItemsOptions = {},\n): Promise<SellerItemsSearchResponse> {\n  const query: Record<string, string | number> = {\n    search_type: \"scan\",\n  };\n  if (options.status && options.status !== \"all\") query[\"status\"] = options.status;\n  if (options.sort) query[\"sort\"] = options.sort;\n  if (options.limit) query[\"limit\"] = options.limit;\n  if (options.scrollId) query[\"scroll_id\"] = options.scrollId;\n  return client.fetch<SellerItemsSearchResponse>({\n    method: \"GET\",\n    path: `/users/${sellerId}/items/search`,\n    query,\n    responseSchema: SellerItemsSearchResponse,\n  });\n}\n\n/**\n * Iterate ALL items for a seller, transparently paging via `scroll_id`.\n * Yields one item id at a time; the caller decides batching.\n */\nexport async function* iterateSellerItems(\n  client: MeliClient,\n  sellerId: number,\n  options: Omit<SearchSellerItemsOptions, \"scrollId\"> = {},\n): AsyncGenerator<string, void, void> {\n  let scrollId: string | undefined;\n  while (true) {\n    const page = await searchSellerItems(client, sellerId, {\n      ...options,\n      ...(scrollId !== undefined ? { scrollId } : {}),\n    });\n    for (const id of page.results) yield id;\n    if (!page.scroll_id || page.results.length === 0) return;\n    scrollId = page.scroll_id;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Description (separate resource per spec)\n// ---------------------------------------------------------------------------\n\nexport const ItemDescription = z.object({\n  text: z.string().optional(),\n  plain_text: z.string().optional(),\n  last_updated: z.string().optional(),\n});\nexport type ItemDescription = z.infer<typeof ItemDescription>;\n\nexport async function getItemDescription(\n  client: MeliClient,\n  itemId: string,\n): Promise<ItemDescription> {\n  return client.fetch<ItemDescription>({\n    method: \"GET\",\n    path: `/items/${itemId}/description`,\n    responseSchema: ItemDescription,\n  });\n}\n\nexport async function updateItemDescription(\n  client: MeliClient,\n  itemId: string,\n  description: { plain_text: string },\n): Promise<ItemDescription> {\n  return client.fetch<ItemDescription>({\n    method: \"PUT\",\n    path: `/items/${itemId}/description`,\n    body: description,\n    responseSchema: ItemDescription,\n  });\n}\n","import { z } from \"zod\";\nimport { CategoryId, ItemAttribute } from \"./common\";\n\n// ---------------------------------------------------------------------------\n// Category predictor — `/sites/{site}/category_predictor/predict`\n// ---------------------------------------------------------------------------\n\nexport const CategoryPrediction = z.object({\n  category_id: CategoryId,\n  category_name: z.string(),\n  domain_id: z.string().optional(),\n  domain_name: z.string().optional(),\n  prediction_probability: z.number().min(0).max(1).optional(),\n  attributes: z.array(ItemAttribute).optional(),\n  /** Path to root, e.g. \"Electrónica > Celulares y Teléfonos > Celulares y Smartphones\". */\n  category_path: z\n    .array(z.object({ id: CategoryId, name: z.string() }))\n    .optional(),\n});\nexport type CategoryPrediction = z.infer<typeof CategoryPrediction>;\n\n// ---------------------------------------------------------------------------\n// Domain discovery — `/sites/{site}/domain_discovery/search` (better than predictor)\n// ---------------------------------------------------------------------------\n\nexport const DomainDiscoveryResult = z.object({\n  domain_id: z.string(),\n  domain_name: z.string(),\n  category_id: CategoryId,\n  category_name: z.string(),\n  attributes: z\n    .array(\n      z.object({\n        id: z.string(),\n        value_id: z.string().nullable().optional(),\n        value_name: z.string().nullable().optional(),\n      }),\n    )\n    .optional(),\n});\nexport type DomainDiscoveryResult = z.infer<typeof DomainDiscoveryResult>;\n\n// ---------------------------------------------------------------------------\n// Domain technical specs — `/domains/{id}/technical_specs/input`\n// ---------------------------------------------------------------------------\n\nexport const TechnicalSpecAttribute = z.object({\n  id: z.string(),\n  name: z.string().optional(),\n  hierarchy: z.string().optional(),\n  relevance: z.number().int().optional(),\n  required: z.boolean().optional(),\n  /** Allowed values when the attribute has a closed enum. */\n  values: z\n    .array(\n      z.object({\n        id: z.string().optional(),\n        name: z.string().optional(),\n        metadata: z.record(z.string(), z.unknown()).optional(),\n      }),\n    )\n    .optional(),\n  value_type: z.string().optional(),\n  value_max_length: z.number().int().optional(),\n  tags: z.record(z.string(), z.unknown()).optional(),\n});\nexport type TechnicalSpecAttribute = z.infer<typeof TechnicalSpecAttribute>;\n\nexport const TechnicalSpecResponse = z.object({\n  /** \"MAIN\" attributes are required to publish; \"DELT\" are optional but\n   * recommended for relevance / catalog matching. */\n  groups: z.array(\n    z.object({\n      id: z.string(),\n      label: z.string().optional(),\n      components: z.array(TechnicalSpecAttribute),\n    }),\n  ),\n});\nexport type TechnicalSpecResponse = z.infer<typeof TechnicalSpecResponse>;\n\n// ---------------------------------------------------------------------------\n// Category metadata — `/categories/{id}`\n// ---------------------------------------------------------------------------\n\nexport const CategoryMetadata = z.object({\n  id: CategoryId,\n  name: z.string(),\n  picture: z.string().url().nullable().optional(),\n  permalink: z.string().nullable().optional(),\n  total_items_in_this_category: z.number().int().nonnegative().optional(),\n  path_from_root: z\n    .array(z.object({ id: CategoryId, name: z.string() }))\n    .optional(),\n  children_categories: z\n    .array(z.object({ id: CategoryId, name: z.string() }))\n    .optional(),\n  attribute_types: z.string().optional(),\n  attributes: z.array(TechnicalSpecAttribute).optional(),\n  settings: z.record(z.string(), z.unknown()).optional(),\n});\nexport type CategoryMetadata = z.infer<typeof CategoryMetadata>;\n","// Categories — `/sites/{site}/category_predictor`,\n// `/sites/{site}/domain_discovery/search`, `/domains/{id}/technical_specs/input`,\n// `/categories/{id}`.\n//\n// THE killer-app endpoints for agentic listings: predict the category from\n// title + description, fetch required attributes per domain, and surface\n// suggested values so the agent can fill them.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  CategoryMetadata,\n  CategoryPrediction,\n  DomainDiscoveryResult,\n  TechnicalSpecResponse,\n  type CategoryMetadata as TCategoryMetadata,\n  type CategoryPrediction as TCategoryPrediction,\n  type DomainDiscoveryResult as TDomainDiscoveryResult,\n  type TechnicalSpecResponse as TTechnicalSpecResponse,\n} from \"./schemas/category\";\nimport type { SiteId } from \"./schemas/common\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Category predictor — POST `/sites/{site}/category_predictor/predict`\n// ---------------------------------------------------------------------------\n\nexport interface PredictCategoryInput {\n  title: string;\n  /** Optional price (currency-aware predictions). */\n  price?: number | undefined;\n  /** Optional listing condition. */\n  condition?: \"new\" | \"used\" | undefined;\n}\n\nexport async function predictCategory(\n  client: MeliClient,\n  site: SiteId,\n  input: PredictCategoryInput,\n): Promise<TCategoryPrediction> {\n  return client.fetch<TCategoryPrediction>({\n    method: \"POST\",\n    path: `/sites/${site}/category_predictor/predict`,\n    body: input,\n    responseSchema: CategoryPrediction,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Domain discovery — `/sites/{site}/domain_discovery/search?q=...`\n// (Better than the predictor for narrowing down the canonical domain.)\n// ---------------------------------------------------------------------------\n\nconst DomainDiscoveryListResponse = z.array(DomainDiscoveryResult);\n\nexport async function discoverDomain(\n  client: MeliClient,\n  site: SiteId,\n  query: string,\n  options: { limit?: number } = {},\n): Promise<TDomainDiscoveryResult[]> {\n  return client.fetch<TDomainDiscoveryResult[]>({\n    method: \"GET\",\n    path: `/sites/${site}/domain_discovery/search`,\n    query: { q: query, limit: options.limit ?? 5 },\n    responseSchema: DomainDiscoveryListResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Technical specs — `/domains/{id}/technical_specs/input`\n// Returns required + recommended attributes for a domain.\n// ---------------------------------------------------------------------------\n\nexport async function getDomainTechnicalSpecs(\n  client: MeliClient,\n  domainId: string,\n): Promise<TTechnicalSpecResponse> {\n  return client.fetch<TTechnicalSpecResponse>({\n    method: \"GET\",\n    path: `/domains/${encodeURIComponent(domainId)}/technical_specs/input`,\n    responseSchema: TechnicalSpecResponse,\n  });\n}\n\n/**\n * Convenience: classify required attribute ids for a domain. Useful for\n * an agent flow that wants to ensure mandatory fields are filled BEFORE\n * trying to publish.\n */\nexport async function getRequiredAttributeIds(\n  client: MeliClient,\n  domainId: string,\n): Promise<string[]> {\n  const specs = await getDomainTechnicalSpecs(client, domainId);\n  const ids: string[] = [];\n  for (const group of specs.groups) {\n    if (group.id !== \"MAIN\") continue;\n    for (const c of group.components) {\n      if (c.required !== false) ids.push(c.id); // required defaults to true\n    }\n  }\n  return ids;\n}\n\n// ---------------------------------------------------------------------------\n// Category metadata — `/categories/{id}`\n// ---------------------------------------------------------------------------\n\nexport async function getCategory(\n  client: MeliClient,\n  categoryId: string,\n): Promise<TCategoryMetadata> {\n  return client.fetch<TCategoryMetadata>({\n    method: \"GET\",\n    path: `/categories/${categoryId}`,\n    responseSchema: CategoryMetadata,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Site categories (root) — `/sites/{site}/categories`\n// ---------------------------------------------------------------------------\n\nconst SiteCategoriesResponse = z.array(\n  z.object({ id: z.string(), name: z.string() }),\n);\n\nexport async function listSiteCategories(\n  client: MeliClient,\n  site: SiteId,\n): Promise<Array<{ id: string; name: string }>> {\n  return client.fetch({\n    method: \"GET\",\n    path: `/sites/${site}/categories`,\n    responseSchema: SiteCategoriesResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Composite helper: predict + fetch specs in one call.\n// ---------------------------------------------------------------------------\n\nexport interface CategorizeAndPlanResult {\n  prediction: TCategoryPrediction;\n  /** All required attribute ids for the predicted domain. */\n  requiredAttributeIds: string[];\n  /** Full technical specs (use to render the form / fill via LLM). */\n  technicalSpecs: TTechnicalSpecResponse;\n}\n\n/**\n * One-shot: take a listing title (+ optional price/condition), predict the\n * category, fetch required attributes, and return everything needed for an\n * agent to publish a complete listing.\n *\n * This is the core of the \"agent publishes a listing in 30 seconds\" demo.\n */\nexport async function categorizeAndPlan(\n  client: MeliClient,\n  site: SiteId,\n  input: PredictCategoryInput,\n): Promise<CategorizeAndPlanResult> {\n  const prediction = await predictCategory(client, site, input);\n  if (!prediction.domain_id) {\n    return {\n      prediction,\n      requiredAttributeIds: [],\n      technicalSpecs: { groups: [] },\n    };\n  }\n  const technicalSpecs = await getDomainTechnicalSpecs(client, prediction.domain_id);\n  const requiredAttributeIds: string[] = [];\n  for (const group of technicalSpecs.groups) {\n    if (group.id !== \"MAIN\") continue;\n    for (const c of group.components) {\n      if (c.required !== false) requiredAttributeIds.push(c.id);\n    }\n  }\n  return { prediction, requiredAttributeIds, technicalSpecs };\n}\n","import { z } from \"zod\";\nimport { MeliItemId } from \"./common\";\n\n// ---------------------------------------------------------------------------\n// Question + answer — `/questions/search` + `/questions/{id}` + `/answers`\n// ---------------------------------------------------------------------------\n\nexport const QuestionStatus = z.enum([\n  \"ANSWERED\",\n  \"UNANSWERED\",\n  \"CLOSED_UNANSWERED\",\n  \"UNDER_REVIEW\",\n  \"BANNED\",\n  \"DELETED\",\n  \"DISABLED\",\n]);\nexport type QuestionStatus = z.infer<typeof QuestionStatus>;\n\nexport const Answer = z.object({\n  text: z.string(),\n  status: z.enum([\"ACTIVE\", \"DISABLED\", \"UNDER_REVIEW\", \"DELETED\"]).optional(),\n  date_created: z.string().optional(),\n});\nexport type Answer = z.infer<typeof Answer>;\n\nexport const Question = z.object({\n  id: z.number().int(),\n  date_created: z.string(),\n  item_id: MeliItemId,\n  seller_id: z.number().int(),\n  status: QuestionStatus,\n  text: z.string(),\n  answer: Answer.nullable().optional(),\n  deleted_from_listing: z.boolean().optional(),\n  hold: z.boolean().optional(),\n  from: z\n    .object({\n      id: z.number().int(),\n      answered_questions: z.number().int().nonnegative().optional(),\n    })\n    .optional(),\n});\nexport type Question = z.infer<typeof Question>;\n\nexport const QuestionsSearchResponse = z.object({\n  questions: z.array(Question),\n  total: z.number().int().nonnegative(),\n  limit: z.number().int().positive().optional(),\n  offset: z.number().int().nonnegative().optional(),\n  filters: z.unknown().optional(),\n  available_filters: z.unknown().optional(),\n  available_sorts: z.unknown().optional(),\n});\nexport type QuestionsSearchResponse = z.infer<typeof QuestionsSearchResponse>;\n\nexport const AnswerRequest = z.object({\n  question_id: z.number().int(),\n  text: z.string().min(1).max(2000),\n});\nexport type AnswerRequest = z.infer<typeof AnswerRequest>;\n\n// ---------------------------------------------------------------------------\n// Spam classification helper — heuristic features used by the LLM-based\n// classifier in `questions.ts#classifyAsSpam`.\n// ---------------------------------------------------------------------------\n\nexport const QuestionSpamFeatures = z.object({\n  /** Account age in days (if known). New accounts are higher-risk. */\n  asker_account_age_days: z.number().nonnegative().optional(),\n  /** Past answered questions by this asker. */\n  asker_answered_questions: z.number().int().nonnegative().optional(),\n  /** True if the question contains URLs / phone numbers / emails. */\n  contains_external_contact: z.boolean(),\n  /** True if the question is duplicated across many listings. */\n  cross_listing_repetition: z.boolean(),\n  /** Length of the question text. */\n  text_length: z.number().int().nonnegative(),\n});\nexport type QuestionSpamFeatures = z.infer<typeof QuestionSpamFeatures>;\n","// Questions API — `/questions/search`, `/questions/{id}`, `/answers`,\n// `/users/{id}/questions_blacklist`.\n//\n// Includes a heuristic spam classifier suitable for a first-pass filter\n// before an LLM-based responder takes over.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  AnswerRequest,\n  Question,\n  QuestionSpamFeatures,\n  QuestionsSearchResponse,\n  type Answer,\n  type AnswerRequest as TAnswerRequest,\n  type Question as TQuestion,\n  type QuestionSpamFeatures as TQuestionSpamFeatures,\n  type QuestionsSearchResponse as TQuestionsSearchResponse,\n} from \"./schemas/question\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// List questions — `/questions/search?seller_id=...&status=...`\n// ---------------------------------------------------------------------------\n\nexport interface ListQuestionsOptions {\n  status?: \"ANSWERED\" | \"UNANSWERED\" | \"CLOSED_UNANSWERED\";\n  itemId?: string;\n  /** Default 50. Max 100 per the docs. */\n  limit?: number;\n  offset?: number;\n  /** Sort, default `date_created.desc`. */\n  sort?: \"date_created.desc\" | \"date_created.asc\";\n}\n\nexport async function listQuestions(\n  client: MeliClient,\n  sellerId: number,\n  options: ListQuestionsOptions = {},\n): Promise<TQuestionsSearchResponse> {\n  const query: Record<string, string | number> = {\n    seller_id: sellerId,\n    api_version: 4,\n  };\n  if (options.status !== undefined) query[\"status\"] = options.status;\n  if (options.itemId !== undefined) query[\"item\"] = options.itemId;\n  if (options.limit !== undefined) query[\"limit\"] = options.limit;\n  if (options.offset !== undefined) query[\"offset\"] = options.offset;\n  if (options.sort !== undefined) query[\"sort\"] = options.sort;\n  return client.fetch<TQuestionsSearchResponse>({\n    method: \"GET\",\n    path: `/questions/search`,\n    query,\n    responseSchema: QuestionsSearchResponse,\n  });\n}\n\nexport async function getQuestion(\n  client: MeliClient,\n  questionId: number,\n): Promise<TQuestion> {\n  return client.fetch<TQuestion>({\n    method: \"GET\",\n    path: `/questions/${questionId}`,\n    responseSchema: Question,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Answer — `POST /answers`\n// ---------------------------------------------------------------------------\n\nconst AnswerResponse = z.object({\n  id: z.number().int(),\n  text: z.string(),\n  status: z.string().optional(),\n  date_created: z.string().optional(),\n});\n\nexport async function answerQuestion(\n  client: MeliClient,\n  request: TAnswerRequest,\n): Promise<z.infer<typeof AnswerResponse>> {\n  const validated = AnswerRequest.parse(request);\n  return client.fetch({\n    method: \"POST\",\n    path: `/answers`,\n    body: validated,\n    responseSchema: AnswerResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Block (blacklist) a buyer\n// ---------------------------------------------------------------------------\n\nexport async function blacklistAsker(\n  client: MeliClient,\n  sellerId: number,\n  askerUserId: number,\n): Promise<void> {\n  await client.fetch({\n    method: \"POST\",\n    path: `/users/${sellerId}/questions_blacklist`,\n    body: { user_id: askerUserId },\n  });\n}\n\nexport async function unblockAsker(\n  client: MeliClient,\n  sellerId: number,\n  askerUserId: number,\n): Promise<void> {\n  await client.fetch({\n    method: \"DELETE\",\n    path: `/users/${sellerId}/questions_blacklist/${askerUserId}`,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic spam classifier — feature extractor + score function.\n//\n// The score is a non-LLM first-pass filter. For high-stakes auto-respond,\n// pair this with an LLM that re-classifies anything in the \"borderline\"\n// zone (score 0.3..0.7).\n// ---------------------------------------------------------------------------\n\nexport interface ClassifySpamInput {\n  question: TQuestion;\n  /** Fetched separately when needed (asker history). */\n  askerProfile?: {\n    answered_questions?: number;\n    account_age_days?: number;\n  };\n  /** Set of question texts (or hashes) seen across this seller's catalog. */\n  recentQuestionsByThisAsker?: string[];\n}\n\nconst URL_RE = /\\bhttps?:\\/\\/\\S+|www\\.\\S+/i;\n// Phone-like patterns: require word boundary, an optional country code\n// (`+54` etc.), and either explicit separators (spaces/hyphens/parens/dots)\n// OR a leading + sign — to avoid flagging order numbers and tracking codes\n// that are bare digit runs. Examples this catches:\n//   \"+54 11 1234-5678\", \"(011) 1234 5678\", \"11 1234.5678\", \"+34 695 632 237\"\n// Examples this rejects:\n//   \"2000003508510037\" (order id), \"AND1234567890\" (tracking)\nconst PHONE_RE =\n  /(?:\\+\\d[\\d\\s\\-.()]{6,}\\d)|(?:\\b\\(?\\d{2,4}\\)?[\\s\\-.]\\d{2,4}[\\s\\-.]\\d{3,4}\\b)/;\nconst EMAIL_RE = /[^\\s]+@[^\\s]+\\.[^\\s]+/i;\n\nexport function extractSpamFeatures(input: ClassifySpamInput): TQuestionSpamFeatures {\n  const text = input.question.text;\n  const containsExternal =\n    URL_RE.test(text) || PHONE_RE.test(text) || EMAIL_RE.test(text);\n  const repetitions = (input.recentQuestionsByThisAsker ?? []).filter(\n    (t) => t === text,\n  ).length;\n  return QuestionSpamFeatures.parse({\n    asker_account_age_days: input.askerProfile?.account_age_days,\n    asker_answered_questions: input.askerProfile?.answered_questions,\n    contains_external_contact: containsExternal,\n    cross_listing_repetition: repetitions >= 2,\n    text_length: text.length,\n  });\n}\n\n/**\n * Score 0..1 — higher is more likely spam. Uses a transparent heuristic so\n * agents can explain their decision.\n */\nexport function scoreSpam(features: TQuestionSpamFeatures): number {\n  let score = 0;\n  if (features.contains_external_contact) score += 0.45;\n  if (features.cross_listing_repetition) score += 0.35;\n  if (features.text_length < 8) score += 0.15;\n  if (features.text_length > 500) score += 0.05;\n  if (\n    features.asker_account_age_days !== undefined &&\n    features.asker_account_age_days < 7\n  ) {\n    score += 0.15;\n  }\n  if (\n    features.asker_answered_questions !== undefined &&\n    features.asker_answered_questions === 0\n  ) {\n    score += 0.1;\n  }\n  return Math.max(0, Math.min(1, score));\n}\n\nexport type SpamLabel = \"spam\" | \"borderline\" | \"ham\";\n\nexport function classifySpam(\n  input: ClassifySpamInput,\n): { label: SpamLabel; score: number; features: TQuestionSpamFeatures } {\n  const features = extractSpamFeatures(input);\n  const score = scoreSpam(features);\n  const label: SpamLabel =\n    score >= 0.7 ? \"spam\" : score <= 0.3 ? \"ham\" : \"borderline\";\n  return { label, score, features };\n}\n","import { z } from \"zod\";\nimport { Currency, MeliItemId } from \"./common\";\n\n// ---------------------------------------------------------------------------\n// Order — `/orders/search` + `/orders/{id}`\n// ---------------------------------------------------------------------------\n\nexport const OrderStatus = z.enum([\n  \"confirmed\",\n  \"payment_required\",\n  \"payment_in_process\",\n  \"partially_paid\",\n  \"paid\",\n  \"cancelled\",\n  \"invalid\",\n]);\nexport type OrderStatus = z.infer<typeof OrderStatus>;\n\nexport const OrderItem = z.object({\n  item: z.object({\n    id: MeliItemId,\n    title: z.string(),\n    category_id: z.string().optional(),\n    variation_id: z.union([z.string(), z.number()]).nullable().optional(),\n    seller_custom_field: z.string().nullable().optional(),\n    variation_attributes: z\n      .array(z.object({ name: z.string(), id: z.string(), value_name: z.string().optional() }))\n      .optional(),\n    warranty: z.string().nullable().optional(),\n    condition: z.enum([\"new\", \"used\", \"not_specified\"]).optional(),\n  }),\n  quantity: z.number().int().positive(),\n  unit_price: z.number().nonnegative(),\n  full_unit_price: z.number().nonnegative().optional(),\n  currency_id: Currency,\n  manufacturing_days: z.number().int().nullable().optional(),\n  sale_fee: z.number().nullable().optional(),\n  listing_type_id: z.string().optional(),\n});\nexport type OrderItem = z.infer<typeof OrderItem>;\n\nexport const OrderPayment = z.object({\n  id: z.union([z.string(), z.number()]),\n  status: z\n    .enum([\n      \"pending\",\n      \"approved\",\n      \"authorized\",\n      \"in_process\",\n      \"in_mediation\",\n      \"rejected\",\n      \"cancelled\",\n      \"refunded\",\n      \"charged_back\",\n    ])\n    .optional(),\n  status_detail: z.string().nullable().optional(),\n  transaction_amount: z.number().optional(),\n  total_paid_amount: z.number().optional(),\n  currency_id: Currency.optional(),\n  payer_id: z.number().int().optional(),\n  installments: z.number().int().optional(),\n  payment_method_id: z.string().optional(),\n  payment_type: z.string().optional(),\n  date_approved: z.string().nullable().optional(),\n  date_created: z.string().optional(),\n});\nexport type OrderPayment = z.infer<typeof OrderPayment>;\n\nexport const OrderBuyer = z.object({\n  id: z.number().int(),\n  nickname: z.string().optional(),\n  first_name: z.string().nullable().optional(),\n  last_name: z.string().nullable().optional(),\n  email: z.string().nullable().optional(),\n  billing_info: z\n    .object({\n      doc_type: z.string().nullable().optional(),\n      doc_number: z.string().nullable().optional(),\n    })\n    .nullable()\n    .optional(),\n});\nexport type OrderBuyer = z.infer<typeof OrderBuyer>;\n\nexport const Order = z.object({\n  id: z.number().int(),\n  date_created: z.string(),\n  date_closed: z.string().optional(),\n  last_updated: z.string().optional(),\n  expiration_date: z.string().nullable().optional(),\n  status: OrderStatus,\n  status_detail: z.unknown().nullable().optional(),\n  total_amount: z.number().nonnegative(),\n  paid_amount: z.number().nullable().optional(),\n  currency_id: Currency,\n  pack_id: z.number().int().nullable().optional(),\n  pickup_id: z.number().int().nullable().optional(),\n  fulfilled: z.boolean().optional(),\n  shipping: z\n    .object({\n      id: z.number().int().nullable().optional(),\n    })\n    .optional(),\n  order_items: z.array(OrderItem),\n  payments: z.array(OrderPayment).optional(),\n  buyer: OrderBuyer,\n  seller: z\n    .object({\n      id: z.number().int(),\n      nickname: z.string().optional(),\n    })\n    .optional(),\n  feedback: z.unknown().nullable().optional(),\n  tags: z.array(z.string()).optional(),\n  manufacturing_ending_date: z.string().nullable().optional(),\n  application_id: z.string().optional(),\n  context: z\n    .object({\n      channel: z.string().optional(),\n      site: z.string().optional(),\n      flows: z.array(z.string()).optional(),\n    })\n    .optional(),\n});\nexport type Order = z.infer<typeof Order>;\n\nexport const OrdersSearchResponse = z.object({\n  results: z.array(Order),\n  paging: z.object({\n    total: z.number().int().nonnegative(),\n    offset: z.number().int().nonnegative().optional(),\n    limit: z.number().int().positive().optional(),\n  }),\n});\nexport type OrdersSearchResponse = z.infer<typeof OrdersSearchResponse>;\n\n// ---------------------------------------------------------------------------\n// Pack — `/marketplace/orders/pack/{pack_id}`\n// ---------------------------------------------------------------------------\n\nexport const Pack = z.object({\n  id: z.number().int(),\n  status: z.string(),\n  /** Each entry corresponds to one Order id within the pack. */\n  orders: z.array(\n    z.object({\n      id: z.number().int(),\n      buyer: z.object({ id: z.number().int() }).optional(),\n    }),\n  ),\n  shipment: z\n    .object({\n      id: z.number().int(),\n    })\n    .optional(),\n});\nexport type Pack = z.infer<typeof Pack>;\n","// Orders + Packs — `/orders/search`, `/orders/{id}`,\n// `/marketplace/orders/pack/{pack_id}`, `/orders/{id}/billing_info`.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  Order,\n  OrdersSearchResponse,\n  Pack,\n  type Order as TOrder,\n  type OrdersSearchResponse as TOrdersSearchResponse,\n  type Pack as TPack,\n} from \"./schemas/order\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Search — `/orders/search?seller=...`\n// ---------------------------------------------------------------------------\n\nexport interface SearchOrdersOptions {\n  /** Filter by order status. */\n  status?:\n    | \"paid\"\n    | \"confirmed\"\n    | \"payment_in_process\"\n    | \"cancelled\"\n    | \"invalid\";\n  /** Date filter: ISO 8601. */\n  dateCreatedFrom?: string;\n  dateCreatedTo?: string;\n  dateLastUpdatedFrom?: string;\n  /** Sort. Default `date_desc`. */\n  sort?: \"date_desc\" | \"date_asc\";\n  limit?: number;\n  offset?: number;\n  /** Tag filter (e.g. `paid`, `not_delivered`). */\n  tags?: string[];\n}\n\nexport async function searchOrders(\n  client: MeliClient,\n  sellerId: number,\n  options: SearchOrdersOptions = {},\n): Promise<TOrdersSearchResponse> {\n  const query: Record<string, string | number> = {\n    seller: sellerId,\n  };\n  if (options.status) query[\"order.status\"] = options.status;\n  if (options.dateCreatedFrom) query[\"order.date_created.from\"] = options.dateCreatedFrom;\n  if (options.dateCreatedTo) query[\"order.date_created.to\"] = options.dateCreatedTo;\n  if (options.dateLastUpdatedFrom) {\n    query[\"order.date_last_updated.from\"] = options.dateLastUpdatedFrom;\n  }\n  if (options.sort) query[\"sort\"] = options.sort;\n  if (options.limit) query[\"limit\"] = options.limit;\n  if (options.offset) query[\"offset\"] = options.offset;\n  if (options.tags && options.tags.length) query[\"tags\"] = options.tags.join(\",\");\n  return client.fetch<TOrdersSearchResponse>({\n    method: \"GET\",\n    path: `/orders/search`,\n    query,\n    responseSchema: OrdersSearchResponse,\n  });\n}\n\nexport async function getOrder(\n  client: MeliClient,\n  orderId: number,\n): Promise<TOrder> {\n  return client.fetch<TOrder>({\n    method: \"GET\",\n    path: `/orders/${orderId}`,\n    responseSchema: Order,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Billing info — `/orders/{id}/billing_info`\n// Returns the buyer's tax data (CUIT/CFDI) needed for invoice emission.\n// ---------------------------------------------------------------------------\n\nexport const OrderBillingInfo = z.object({\n  buyer: z.object({\n    billing_info: z\n      .object({\n        doc_type: z.string().nullable().optional(),\n        doc_number: z.string().nullable().optional(),\n      })\n      .optional(),\n  }),\n});\nexport type OrderBillingInfo = z.infer<typeof OrderBillingInfo>;\n\nexport async function getOrderBillingInfo(\n  client: MeliClient,\n  orderId: number,\n): Promise<OrderBillingInfo> {\n  return client.fetch<OrderBillingInfo>({\n    method: \"GET\",\n    path: `/orders/${orderId}/billing_info`,\n    responseSchema: OrderBillingInfo,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Packs — `/marketplace/orders/pack/{pack_id}`\n//\n// 30%+ of MELI sales go through carts (one buyer → multiple orders sharing\n// a single shipment). Naive `/orders/search` iterators miss the\n// pack-level coordination. Use `getPack(packId)` to load all orders in a\n// cart together.\n// ---------------------------------------------------------------------------\n\nexport async function getPack(\n  client: MeliClient,\n  packId: number,\n): Promise<TPack> {\n  return client.fetch<TPack>({\n    method: \"GET\",\n    path: `/marketplace/orders/pack/${packId}`,\n    responseSchema: Pack,\n  });\n}\n\n/**\n * Given an array of orders, group cart-orders by `pack_id` and return\n * (single-order, packs) so callers can iterate without double-counting.\n */\nexport function partitionByPack(\n  orders: TOrder[],\n): {\n  singleOrders: TOrder[];\n  packs: Map<number, TOrder[]>;\n} {\n  const singleOrders: TOrder[] = [];\n  const packs = new Map<number, TOrder[]>();\n  for (const order of orders) {\n    if (order.pack_id) {\n      const existing = packs.get(order.pack_id) ?? [];\n      existing.push(order);\n      packs.set(order.pack_id, existing);\n    } else {\n      singleOrders.push(order);\n    }\n  }\n  return { singleOrders, packs };\n}\n","import { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Claim / Mediation — `/post-purchase/v1/claims/{id}` + `/v2/claims/{id}/returns`\n// ---------------------------------------------------------------------------\n\nexport const ClaimStage = z.enum([\n  \"claim\",\n  \"dispute\",\n  \"mediation\",\n  \"resolved\",\n  \"cancelled\",\n]);\nexport type ClaimStage = z.infer<typeof ClaimStage>;\n\nexport const ClaimStatus = z.enum([\n  \"opened\",\n  \"closed\",\n  \"expired\",\n  \"potential_claim\",\n]);\nexport type ClaimStatus = z.infer<typeof ClaimStatus>;\n\nexport const ClaimReason = z.object({\n  id: z.string(),\n  name: z.string(),\n  detail: z.string().optional(),\n});\nexport type ClaimReason = z.infer<typeof ClaimReason>;\n\nexport const ClaimPlayer = z.object({\n  role: z.enum([\"complainant\", \"respondent\", \"mediator\"]),\n  type: z.enum([\"buyer\", \"seller\", \"ml\"]),\n  user_id: z.number().int(),\n  available_actions: z.array(z.string()).optional(),\n});\nexport type ClaimPlayer = z.infer<typeof ClaimPlayer>;\n\nexport const Claim = z.object({\n  id: z.number().int(),\n  resource: z.enum([\"order\", \"shipment\", \"payment\"]),\n  resource_id: z.number().int(),\n  status: ClaimStatus,\n  stage: ClaimStage,\n  parent_id: z.number().int().nullable().optional(),\n  type: z.string().optional(),\n  reason_id: z.string().optional(),\n  reason: ClaimReason.optional(),\n  fulfilled: z.boolean().optional(),\n  quantity_type: z.string().optional(),\n  date_created: z.string(),\n  last_updated: z.string().optional(),\n  resolution: z\n    .object({\n      reason: z.string().nullable().optional(),\n      decision: z.string().nullable().optional(),\n      benefited: z.array(z.string()).optional(),\n      date_created: z.string().optional(),\n    })\n    .nullable()\n    .optional(),\n  players: z.array(ClaimPlayer).optional(),\n  related_entities: z.array(z.unknown()).optional(),\n  site_id: z.string().optional(),\n});\nexport type Claim = z.infer<typeof Claim>;\n\n// ---------------------------------------------------------------------------\n// Evidence upload — one-shot, immutable per spec.\n// ---------------------------------------------------------------------------\n\nexport const EvidenceType = z.enum([\n  \"PROOF_OF_SHIPMENT\",\n  \"ITEM_DESCRIPTION_VS_RECEIVED\",\n  \"VIDEO_OF_PRODUCT\",\n  \"INVOICE\",\n  \"MESSAGE_THREAD\",\n  \"DELIVERY_PROOF\",\n  \"RETURN_PROOF\",\n  \"OTHER\",\n]);\nexport type EvidenceType = z.infer<typeof EvidenceType>;\n\nexport const ClaimEvidence = z.object({\n  id: z.string().optional(),\n  type: EvidenceType,\n  /** Free-form text evidence description. */\n  text: z.string().optional(),\n  /** URL of the uploaded file (returned by attachment upload). */\n  attachment_url: z.string().url().optional(),\n  /** Attachment id once uploaded via /messages/attachments. */\n  attachment_id: z.string().optional(),\n  /** ISO 8601. */\n  date_created: z.string().optional(),\n});\nexport type ClaimEvidence = z.infer<typeof ClaimEvidence>;\n\nexport const EvidenceUploadRequest = z.object({\n  evidence_type: EvidenceType,\n  text: z.string().optional(),\n  attachment_id: z.string().optional(),\n});\nexport type EvidenceUploadRequest = z.infer<typeof EvidenceUploadRequest>;\n\n// ---------------------------------------------------------------------------\n// Claim message thread\n// ---------------------------------------------------------------------------\n\nexport const ClaimMessage = z.object({\n  id: z.string().optional(),\n  date: z.string().optional(),\n  sender_role: z.enum([\"complainant\", \"respondent\", \"mediator\"]).optional(),\n  sender_user_id: z.number().int().optional(),\n  message: z.string(),\n  attachments: z\n    .array(z.object({ url: z.string().url().optional(), name: z.string().optional() }))\n    .optional(),\n});\nexport type ClaimMessage = z.infer<typeof ClaimMessage>;\n","// Claims / Mediation — `/post-purchase/v1/claims/{id}`,\n// `/post-purchase/v2/claims/{id}/returns`,\n// `/post-purchase/v1/claims/{id}/evidences`,\n// `/post-purchase/v1/claims/{id}/messages`.\n//\n// Implements the 2-day SLA defender pattern: list open claims, fetch\n// details, upload evidence (one-shot, immutable per spec), respond in the\n// mediation thread.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  Claim,\n  ClaimEvidence,\n  ClaimMessage,\n  EvidenceUploadRequest,\n  type Claim as TClaim,\n  type ClaimEvidence as TClaimEvidence,\n  type ClaimMessage as TClaimMessage,\n  type EvidenceUploadRequest as TEvidenceUploadRequest,\n} from \"./schemas/claim\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// List claims — `/post-purchase/v1/claims/search?stage=...`\n// ---------------------------------------------------------------------------\n\nconst ClaimsSearchResponse = z.object({\n  paging: z.object({\n    total: z.number().int().nonnegative(),\n    offset: z.number().int().nonnegative().optional(),\n    limit: z.number().int().positive().optional(),\n  }),\n  data: z.array(Claim),\n});\nexport type ClaimsSearchResponse = z.infer<typeof ClaimsSearchResponse>;\n\nexport interface SearchClaimsOptions {\n  stage?: \"claim\" | \"dispute\" | \"mediation\";\n  status?: \"opened\" | \"closed\" | \"expired\";\n  resource?: \"order\" | \"shipment\" | \"payment\";\n  resourceId?: number;\n  limit?: number;\n  offset?: number;\n}\n\nexport async function searchClaims(\n  client: MeliClient,\n  options: SearchClaimsOptions = {},\n): Promise<ClaimsSearchResponse> {\n  const query: Record<string, string | number> = {};\n  if (options.stage !== undefined) query[\"stage\"] = options.stage;\n  if (options.status !== undefined) query[\"status\"] = options.status;\n  if (options.resource !== undefined) query[\"resource\"] = options.resource;\n  if (options.resourceId !== undefined) query[\"resource_id\"] = options.resourceId;\n  if (options.limit !== undefined) query[\"limit\"] = options.limit;\n  if (options.offset !== undefined) query[\"offset\"] = options.offset;\n  return client.fetch<ClaimsSearchResponse>({\n    method: \"GET\",\n    path: `/post-purchase/v1/claims/search`,\n    query,\n    responseSchema: ClaimsSearchResponse,\n  });\n}\n\nexport async function getClaim(client: MeliClient, claimId: number): Promise<TClaim> {\n  return client.fetch<TClaim>({\n    method: \"GET\",\n    path: `/post-purchase/v1/claims/${claimId}`,\n    responseSchema: Claim,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Evidence — one-shot upload per spec\n// ---------------------------------------------------------------------------\n\nconst ClaimEvidenceListResponse = z.object({\n  evidences: z.array(ClaimEvidence),\n});\nexport type ClaimEvidenceListResponse = z.infer<typeof ClaimEvidenceListResponse>;\n\nexport async function listClaimEvidences(\n  client: MeliClient,\n  claimId: number,\n): Promise<ClaimEvidenceListResponse> {\n  return client.fetch<ClaimEvidenceListResponse>({\n    method: \"GET\",\n    path: `/post-purchase/v1/claims/${claimId}/evidences`,\n    responseSchema: ClaimEvidenceListResponse,\n  });\n}\n\n/**\n * Upload evidence to a claim. **Immutable per spec** — once submitted,\n * cannot be changed. The agent flow should compose all evidence in one\n * call; rejected submissions cannot be amended without opening a new\n * claim cycle.\n */\nexport async function uploadClaimEvidence(\n  client: MeliClient,\n  claimId: number,\n  payload: TEvidenceUploadRequest,\n): Promise<TClaimEvidence> {\n  const validated = EvidenceUploadRequest.parse(payload);\n  return client.fetch<TClaimEvidence>({\n    method: \"POST\",\n    path: `/post-purchase/v1/claims/${claimId}/evidences`,\n    body: validated,\n    responseSchema: ClaimEvidence,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Mediation message thread\n// ---------------------------------------------------------------------------\n\nconst ClaimMessagesResponse = z.object({\n  messages: z.array(ClaimMessage),\n});\nexport type ClaimMessagesResponse = z.infer<typeof ClaimMessagesResponse>;\n\nexport async function listClaimMessages(\n  client: MeliClient,\n  claimId: number,\n): Promise<ClaimMessagesResponse> {\n  return client.fetch<ClaimMessagesResponse>({\n    method: \"GET\",\n    path: `/post-purchase/v1/claims/${claimId}/messages`,\n    responseSchema: ClaimMessagesResponse,\n  });\n}\n\nexport async function postClaimMessage(\n  client: MeliClient,\n  claimId: number,\n  message: string,\n): Promise<TClaimMessage> {\n  return client.fetch<TClaimMessage>({\n    method: \"POST\",\n    path: `/post-purchase/v1/claims/${claimId}/messages`,\n    body: { message },\n    responseSchema: ClaimMessage,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Returns — `/post-purchase/v2/claims/{id}/returns`\n// ---------------------------------------------------------------------------\n\nconst ReturnReviewRequest = z.object({\n  decision: z.enum([\"accepted\", \"rejected\"]),\n  reason: z.string().optional(),\n});\nexport type ReturnReviewRequest = z.infer<typeof ReturnReviewRequest>;\n\nconst ReturnReviewResponse = z.object({\n  status: z.string(),\n  decision: z.enum([\"accepted\", \"rejected\"]).optional(),\n  date: z.string().optional(),\n});\nexport type ReturnReviewResponse = z.infer<typeof ReturnReviewResponse>;\n\nexport async function reviewReturn(\n  client: MeliClient,\n  returnId: number,\n  payload: ReturnReviewRequest,\n): Promise<ReturnReviewResponse> {\n  const validated = ReturnReviewRequest.parse(payload);\n  return client.fetch<ReturnReviewResponse>({\n    method: \"POST\",\n    path: `/post-purchase/v1/returns/${returnId}/return-review`,\n    body: validated,\n    responseSchema: ReturnReviewResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Defender pattern — orchestration helper\n// ---------------------------------------------------------------------------\n\nexport interface DefendClaimInput {\n  claimId: number;\n  evidences: TEvidenceUploadRequest[];\n  /** Optional message to post in the mediation thread alongside evidence. */\n  message?: string;\n}\n\nexport interface DefendClaimResult {\n  claim: TClaim;\n  uploadedEvidences: TClaimEvidence[];\n  /** Evidences that failed to upload, in the same order they were submitted.\n   *  When non-empty, the claim is partially defended — surface this to the\n   *  human for manual review. */\n  failedEvidences: { evidence: TEvidenceUploadRequest; error: unknown }[];\n  messagePosted: TClaimMessage | null;\n}\n\n/**\n * The 2-day SLA defender flow. Loads claim metadata, uploads evidences\n * **sequentially** (NOT in parallel — see below), and optionally posts a\n * closing message.\n *\n * Why sequential. MELI's `/claims/{id}/evidences` endpoint has one-shot\n * semantics per evidence-type: if N requests land concurrently, MELI may\n * persist some, reject others as duplicates, or close the evidence window\n * mid-batch — leaving the claim half-defended with no way to amend.\n * Sequential uploads cap the blast radius: on failure, we stop and return\n * the partial state so the caller can decide whether to retry, escalate, or\n * proceed with the message.\n *\n * The cost is latency (~N × 200ms instead of ~200ms). For a typical 3-piece\n * defence under MELI's 2-day SLA, that's a non-issue.\n */\nexport async function defendClaim(\n  client: MeliClient,\n  input: DefendClaimInput,\n): Promise<DefendClaimResult> {\n  const claim = await getClaim(client, input.claimId);\n  const uploaded: TClaimEvidence[] = [];\n  const failed: { evidence: TEvidenceUploadRequest; error: unknown }[] = [];\n  for (const evidence of input.evidences) {\n    try {\n      uploaded.push(await uploadClaimEvidence(client, input.claimId, evidence));\n    } catch (err) {\n      failed.push({ evidence, error: err });\n      // Stop on first failure — we don't know whether MELI persisted partial\n      // state, and we don't want the agent to keep stomping on the claim.\n      break;\n    }\n  }\n  let messagePosted: TClaimMessage | null = null;\n  if (input.message && failed.length === 0) {\n    messagePosted = await postClaimMessage(client, input.claimId, input.message);\n  }\n  return {\n    claim,\n    uploadedEvidences: uploaded,\n    failedEvidences: failed,\n    messagePosted,\n  };\n}\n","// Shipments — `/shipments/{id}`, `/shipments/{id}/history`,\n// `/shipment_labels?...`, `/items/{id}/shipping_options`.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  LabelFormat,\n  Shipment,\n  ShipmentHistoryEntry,\n  ShippingOption,\n  type LabelFormat as TLabelFormat,\n  type Shipment as TShipment,\n  type ShipmentHistoryEntry as TShipmentHistoryEntry,\n  type ShippingOption as TShippingOption,\n} from \"./schemas/shipment\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Single shipment\n// ---------------------------------------------------------------------------\n\nexport async function getShipment(\n  client: MeliClient,\n  shipmentId: number,\n): Promise<TShipment> {\n  return client.fetch<TShipment>({\n    method: \"GET\",\n    path: `/shipments/${shipmentId}`,\n    responseSchema: Shipment,\n  });\n}\n\nconst ShipmentHistoryResponse = z.array(ShipmentHistoryEntry);\nexport async function getShipmentHistory(\n  client: MeliClient,\n  shipmentId: number,\n): Promise<TShipmentHistoryEntry[]> {\n  return client.fetch<TShipmentHistoryEntry[]>({\n    method: \"GET\",\n    path: `/shipments/${shipmentId}/history`,\n    responseSchema: ShipmentHistoryResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Labels — returns binary (PDF / ZPL). Use the raw fetch path because the\n// response is NOT JSON.\n// ---------------------------------------------------------------------------\n\nexport interface FetchLabelsInput {\n  shipmentIds: number[];\n  format: TLabelFormat;\n}\n\n/**\n * Fetch shipment labels as a Blob. Caller decides what to do (save to disk,\n * stream to user, attach to email).\n *\n * Goes through the same auth + rate-limit + retry + telemetry plumbing as\n * the rest of the client (via `client.fetchRaw`) — labels never get a\n * silent unauthenticated request and aren't excluded from per-seller rate\n * limiting.\n *\n * NOTE: labels invalidate after 7 days — re-fetch close to ship time.\n */\nexport async function fetchLabelsBlob(\n  client: MeliClient,\n  input: FetchLabelsInput,\n): Promise<Blob> {\n  const response = await client.fetchRaw({\n    method: \"GET\",\n    path: \"/shipment_labels\",\n    query: {\n      shipment_ids: input.shipmentIds.join(\",\"),\n      response_type: input.format,\n    },\n    acceptHeader: input.format === \"pdf\" ? \"application/pdf\" : \"text/plain\",\n  });\n  return response.blob();\n}\n\n// ---------------------------------------------------------------------------\n// Shipping options for an item — `/items/{id}/shipping_options`\n// ---------------------------------------------------------------------------\n\nconst ShippingOptionsResponse = z.object({\n  options: z.array(ShippingOption),\n  destination: z\n    .object({\n      type: z.string().optional(),\n      zip_code: z.string().optional(),\n    })\n    .optional(),\n});\nexport type ShippingOptionsResponse = z.infer<typeof ShippingOptionsResponse>;\n\nexport async function getShippingOptions(\n  client: MeliClient,\n  itemId: string,\n  options: { zipCode?: string; quantity?: number } = {},\n): Promise<ShippingOptionsResponse> {\n  const query: Record<string, string | number> = {};\n  if (options.zipCode !== undefined) query[\"zip_code\"] = options.zipCode;\n  if (options.quantity !== undefined) query[\"quantity\"] = options.quantity;\n  return client.fetch<ShippingOptionsResponse>({\n    method: \"GET\",\n    path: `/items/${itemId}/shipping_options`,\n    query,\n    responseSchema: ShippingOptionsResponse,\n  });\n}\n\n// Re-export so consumers don't need a deep import.\nexport { LabelFormat, type TLabelFormat as LabelFormatType };\n","import { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Shipment — `/shipments/{id}` + `/shipments/{id}/history`\n// ---------------------------------------------------------------------------\n\nexport const ShipmentStatus = z.enum([\n  \"pending\",\n  \"handling\",\n  \"ready_to_ship\",\n  \"shipped\",\n  \"delivered\",\n  \"not_delivered\",\n  \"cancelled\",\n  \"returned\",\n]);\nexport type ShipmentStatus = z.infer<typeof ShipmentStatus>;\n\nexport const ShipmentMode = z.enum([\"me1\", \"me2\", \"custom\", \"not_specified\"]);\nexport type ShipmentMode = z.infer<typeof ShipmentMode>;\n\nexport const ShipmentLogisticType = z.enum([\n  \"self_service\", // Flex\n  \"cross_docking\", // Colecta\n  \"xd_drop_off\", // Drop-off\n  \"fulfillment\", // Full\n  \"drop_off\",\n  \"default\",\n]);\nexport type ShipmentLogisticType = z.infer<typeof ShipmentLogisticType>;\n\nexport const ShipmentItem = z.object({\n  id: z.string(),\n  description: z.string().optional(),\n  quantity: z.number().int().positive().optional(),\n});\nexport type ShipmentItem = z.infer<typeof ShipmentItem>;\n\nexport const ShipmentReceiverAddress = z.object({\n  id: z.number().int().optional(),\n  address_line: z.string().optional(),\n  street_name: z.string().optional(),\n  street_number: z.string().nullable().optional(),\n  comment: z.string().nullable().optional(),\n  zip_code: z.string().optional(),\n  city: z.object({ id: z.string().optional(), name: z.string().optional() }).optional(),\n  state: z.object({ id: z.string().optional(), name: z.string().optional() }).optional(),\n  country: z.object({ id: z.string().optional(), name: z.string().optional() }).optional(),\n  receiver_name: z.string().nullable().optional(),\n  receiver_phone: z.string().nullable().optional(),\n  latitude: z.number().nullable().optional(),\n  longitude: z.number().nullable().optional(),\n});\nexport type ShipmentReceiverAddress = z.infer<typeof ShipmentReceiverAddress>;\n\nexport const Shipment = z.object({\n  id: z.number().int(),\n  status: ShipmentStatus,\n  substatus: z.string().nullable().optional(),\n  mode: ShipmentMode.optional(),\n  logistic_type: ShipmentLogisticType.optional(),\n  date_created: z.string(),\n  last_updated: z.string().optional(),\n  tracking_number: z.string().nullable().optional(),\n  tracking_method: z.string().nullable().optional(),\n  service_id: z.number().int().nullable().optional(),\n  base_cost: z.number().nullable().optional(),\n  /** USD-denominated insurance value. */\n  declared_value: z.number().nullable().optional(),\n  origin: z\n    .object({\n      type: z.string().optional(),\n      sender_id: z.number().int().optional(),\n      shipping_address: ShipmentReceiverAddress.optional(),\n    })\n    .optional(),\n  destination: z\n    .object({\n      receiver_address: ShipmentReceiverAddress.optional(),\n      type: z.string().optional(),\n      receiver_id: z.number().int().optional(),\n    })\n    .optional(),\n  shipping_items: z.array(ShipmentItem).optional(),\n  /** Free-shipping or paid? */\n  cost: z.number().nullable().optional(),\n  estimated_delivery_time: z\n    .object({\n      date: z.string().nullable().optional(),\n      time_from: z.string().nullable().optional(),\n      time_to: z.string().nullable().optional(),\n    })\n    .optional(),\n  /** Window required to dispatch (Flex SLA). */\n  estimated_handling_limit: z\n    .object({\n      date: z.string().nullable().optional(),\n    })\n    .optional(),\n});\nexport type Shipment = z.infer<typeof Shipment>;\n\nexport const ShipmentHistoryEntry = z.object({\n  status: ShipmentStatus.optional(),\n  substatus: z.string().nullable().optional(),\n  date: z.string(),\n  comment: z.string().nullable().optional(),\n});\nexport type ShipmentHistoryEntry = z.infer<typeof ShipmentHistoryEntry>;\n\n// ---------------------------------------------------------------------------\n// Labels — `/shipment_labels?shipment_ids=...&response_type=pdf|zpl`\n// ---------------------------------------------------------------------------\n\nexport const LabelFormat = z.enum([\"pdf\", \"zpl\"]);\nexport type LabelFormat = z.infer<typeof LabelFormat>;\n\n// ---------------------------------------------------------------------------\n// Shipping options — `/items/{id}/shipping_options`\n// ---------------------------------------------------------------------------\n\nexport const ShippingOption = z.object({\n  id: z.number().int().optional(),\n  name: z.string(),\n  cost: z.number(),\n  currency_id: z.string(),\n  estimated_delivery_time: z\n    .object({\n      date: z.string().nullable().optional(),\n      handling_time: z\n        .object({\n          date: z.string().optional(),\n          time_from: z.string().optional(),\n          time_to: z.string().optional(),\n        })\n        .optional(),\n    })\n    .optional(),\n  display: z.string().optional(),\n});\nexport type ShippingOption = z.infer<typeof ShippingOption>;\n","// Typed errors for `@ar-agents/mercadolibre`. All client failures funnel\n// through one of these so consumers can `if (err instanceof MeliApiError)`\n// without parsing strings.\n//\n// `MeliError` extends `ArAgentsError` from `@ar-agents/core` so the\n// family contract (code / retryable / context) is uniform across every\n// `@ar-agents/*` integration.\n\nimport { ArAgentsError } from \"@ar-agents/core\";\n\n/** Common base. */\nexport abstract class MeliError extends ArAgentsError {\n  abstract override readonly code: string;\n  constructor(message: string, init: { retryable?: boolean; context?: Record<string, unknown>; cause?: unknown } = {}) {\n    super(message, {\n      code: \"meli_error\",\n      retryable: init.retryable ?? false,\n      context: init.context ?? {},\n      cause: init.cause,\n    });\n    this.name = this.constructor.name;\n  }\n}\n\n/** Shape of MELI's typical error envelope. The fields are not guaranteed —\n *  legacy endpoints sometimes use `{ status, message }` only, and some\n *  post-purchase routes return `{ error_code, description }`. We extract\n *  both shapes opportunistically. */\nexport interface MeliErrorBody {\n  /** MELI's machine-readable error slug (e.g., \"rate_limited\",\n   *  \"forbidden\", \"validation_error\"). */\n  error?: string;\n  /** Human-readable message MELI returns alongside `error`. */\n  message?: string;\n  /** Echoed status code (some MELI endpoints duplicate it in the body). */\n  status?: number;\n  /** Multi-issue causes — typically array of `{ code, message }` for\n   *  validation failures on `createItem` / `updateItem`. */\n  cause?: Array<{ code?: string | number; message?: string; [k: string]: unknown }>;\n}\n\n/** A MELI API call returned a non-2xx after retries are exhausted. */\nexport class MeliApiError extends MeliError {\n  readonly code = \"meli_api_error\";\n  /** MELI's error slug if present (`error` field on the body). Stable +\n   *  documented; safe to switch on in your code. */\n  readonly meliCode: string | null;\n  /** MELI's human-readable error message if present. */\n  readonly meliMessage: string | null;\n  /** Multi-issue causes (validation failures usually). */\n  readonly meliCauses: ReadonlyArray<{\n    code?: string | number;\n    message?: string;\n    [k: string]: unknown;\n  }>;\n\n  constructor(\n    message: string,\n    public readonly status: number,\n    public readonly url: string,\n    public readonly body: unknown,\n    public readonly requestId?: string,\n  ) {\n    super(message);\n    const parsed = parseMeliErrorBody(body);\n    this.meliCode = parsed.error ?? null;\n    this.meliMessage = parsed.message ?? null;\n    this.meliCauses = parsed.cause ?? [];\n  }\n\n  /** Back-compat — same as `meliCode`. New code should read `meliCode` directly. */\n  meliErrorCode(): string | null {\n    return this.meliCode;\n  }\n\n  /**\n   * True if MELI explicitly told us this was a rate-limit hit\n   * (vs. a 429 with no body, or a 5xx). Use this to drive a longer backoff\n   * in your retry loop.\n   */\n  isRateLimited(): boolean {\n    return this.status === 429 || this.meliCode === \"rate_limited\";\n  }\n\n  /**\n   * True if the request hit the seller's permission boundary — typically\n   * because the bearer token doesn't own the resource being addressed.\n   * Don't retry; surface to the user.\n   */\n  isForbidden(): boolean {\n    return this.status === 403 || this.meliCode === \"forbidden\";\n  }\n\n  /**\n   * True if MELI says this access_token is invalid / expired.\n   * The OAuth flow's `ensureAccessToken` should be re-driven before retrying.\n   */\n  isUnauthorized(): boolean {\n    return this.status === 401 || this.meliCode === \"unauthorized\" || this.meliCode === \"invalid_token\";\n  }\n\n  /** True if MELI's body identifies this as validation-failure on inputs. */\n  isValidationError(): boolean {\n    return this.meliCode === \"validation_error\" || this.status === 400;\n  }\n}\n\n/** Best-effort parse of MELI's error envelope. Tolerates missing fields\n *  and the post-purchase `{ error_code, description }` variant. */\nfunction parseMeliErrorBody(body: unknown): MeliErrorBody {\n  if (!body || typeof body !== \"object\") return {};\n  const b = body as Record<string, unknown>;\n  const out: MeliErrorBody = {};\n  if (typeof b[\"error\"] === \"string\") out.error = b[\"error\"];\n  else if (typeof b[\"error_code\"] === \"string\") out.error = b[\"error_code\"];\n  if (typeof b[\"message\"] === \"string\") out.message = b[\"message\"];\n  else if (typeof b[\"description\"] === \"string\") out.message = b[\"description\"];\n  if (typeof b[\"status\"] === \"number\") out.status = b[\"status\"];\n  if (Array.isArray(b[\"cause\"])) {\n    out.cause = b[\"cause\"].filter(\n      (c): c is { code?: string | number; message?: string } =>\n        typeof c === \"object\" && c !== null,\n    );\n  }\n  return out;\n}\n\n/** OAuth-related failure (token refresh, callback, etc.). */\nexport class MeliAuthError extends MeliError {\n  readonly code = \"meli_auth_error\";\n  constructor(\n    message: string,\n    public override readonly cause?: unknown,\n  ) {\n    super(message);\n  }\n}\n\n/** Rate limit hit and retries are exhausted. */\nexport class MeliRateLimitError extends MeliError {\n  readonly code = \"meli_rate_limit\";\n  constructor(\n    public readonly retryAfterSeconds: number,\n    public readonly url: string,\n  ) {\n    super(\n      `MELI rate limit exhausted on ${url}; retry in ${retryAfterSeconds}s`,\n    );\n  }\n}\n\n/** The host's network failed (DNS, TLS, fetch threw). */\nexport class MeliNetworkError extends MeliError {\n  readonly code = \"meli_network_error\";\n  constructor(\n    message: string,\n    public override readonly cause?: unknown,\n  ) {\n    super(message);\n  }\n}\n\n/** A response body failed Zod validation. */\nexport class MeliValidationError extends MeliError {\n  readonly code = \"meli_validation_error\";\n  constructor(\n    message: string,\n    public readonly issues: unknown,\n  ) {\n    super(message);\n  }\n}\n\n/** Webhook signature verification failed (where ML supports it). */\nexport class MeliWebhookError extends MeliError {\n  readonly code = \"meli_webhook_error\";\n  constructor(\n    public readonly detail:\n      | \"missing_topic\"\n      | \"missing_resource\"\n      | \"unknown_topic\"\n      | \"malformed_body\"\n      | \"missed_feeds_unauthorized\",\n    message: string,\n  ) {\n    super(message);\n  }\n}\n\n/** Convenience type guard. */\nexport function isMeliError(e: unknown): e is MeliError {\n  return e instanceof MeliError;\n}\n","import { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Seller reputation — `/users/{id}/seller_reputation`\n// ---------------------------------------------------------------------------\n\nexport const ReputationLevel = z.enum([\n  \"5_green\",\n  \"4_light_green\",\n  \"3_yellow\",\n  \"2_orange\",\n  \"1_red\",\n  \"newbie\",\n]);\nexport type ReputationLevel = z.infer<typeof ReputationLevel>;\n\nexport const PowerSellerStatus = z.enum([\"platinum\", \"gold\", \"silver\"]).nullable();\nexport type PowerSellerStatus = z.infer<typeof PowerSellerStatus>;\n\nexport const ReputationMetric = z.object({\n  rate: z.number().min(0).max(1).optional(),\n  value: z.number().nonnegative().optional(),\n});\nexport type ReputationMetric = z.infer<typeof ReputationMetric>;\n\nexport const ReputationMetrics = z.object({\n  claims: z\n    .object({\n      rate: z.number().min(0).max(1).optional(),\n      value: z.number().nonnegative().optional(),\n      period: z.string().optional(),\n      excluded: z.unknown().optional(),\n    })\n    .optional(),\n  delayed_handling_time: z\n    .object({\n      rate: z.number().min(0).max(1).optional(),\n      value: z.number().nonnegative().optional(),\n      period: z.string().optional(),\n    })\n    .optional(),\n  cancellations: z\n    .object({\n      rate: z.number().min(0).max(1).optional(),\n      value: z.number().nonnegative().optional(),\n      period: z.string().optional(),\n    })\n    .optional(),\n  sales: z\n    .object({\n      period: z.string().optional(),\n      completed: z.number().int().nonnegative().optional(),\n    })\n    .optional(),\n});\nexport type ReputationMetrics = z.infer<typeof ReputationMetrics>;\n\nexport const SellerReputation = z.object({\n  level_id: ReputationLevel.nullable().optional(),\n  power_seller_status: PowerSellerStatus.optional(),\n  protection_end_date: z.string().nullable().optional(),\n  status: z\n    .object({\n      list: z\n        .object({\n          allow: z.boolean().optional(),\n          codes: z.array(z.string()).optional(),\n        })\n        .optional(),\n      buy: z\n        .object({\n          allow: z.boolean().optional(),\n          codes: z.array(z.string()).optional(),\n        })\n        .optional(),\n      sell: z\n        .object({\n          allow: z.boolean().optional(),\n          codes: z.array(z.string()).optional(),\n        })\n        .optional(),\n      billing: z\n        .object({\n          allow: z.boolean().optional(),\n          codes: z.array(z.string()).optional(),\n        })\n        .optional(),\n    })\n    .optional(),\n  transactions: z\n    .object({\n      canceled: z.number().int().nonnegative().optional(),\n      completed: z.number().int().nonnegative().optional(),\n      period: z.string().optional(),\n      ratings: z\n        .object({\n          negative: z.number().min(0).max(1).optional(),\n          neutral: z.number().min(0).max(1).optional(),\n          positive: z.number().min(0).max(1).optional(),\n        })\n        .optional(),\n      total: z.number().int().nonnegative().optional(),\n    })\n    .optional(),\n  metrics: ReputationMetrics.optional(),\n});\nexport type SellerReputation = z.infer<typeof SellerReputation>;\n\n// ---------------------------------------------------------------------------\n// Reputation alert (synthesized by the monitor — not part of MELI's API).\n// ---------------------------------------------------------------------------\n\nexport const ReputationAlertSeverity = z.enum([\"info\", \"warning\", \"critical\"]);\nexport type ReputationAlertSeverity = z.infer<typeof ReputationAlertSeverity>;\n\nexport const ReputationAlert = z.object({\n  severity: ReputationAlertSeverity,\n  title: z.string(),\n  detail: z.string(),\n  metric: z.string().optional(),\n  current_value: z.number().optional(),\n  threshold: z.number().optional(),\n});\nexport type ReputationAlert = z.infer<typeof ReputationAlert>;\n","// Seller reputation — `/users/{id}/seller_reputation`.\n//\n// Plus a lightweight monitor pattern that polls the reputation snapshot\n// and emits typed alerts when metrics cross configurable thresholds.\n// MELI demotes sellers when claim_rate, late_handling, or cancel_rate\n// exceed silent thresholds; this monitor catches them BEFORE the\n// thermometer drops.\n\nimport type { MeliClient } from \"./client\";\nimport { MeliApiError, MeliAuthError, MeliValidationError } from \"./errors\";\nimport {\n  ReputationAlert,\n  SellerReputation,\n  type ReputationAlert as TReputationAlert,\n  type SellerReputation as TSellerReputation,\n} from \"./schemas/reputation\";\n\n// ---------------------------------------------------------------------------\n// Snapshot\n// ---------------------------------------------------------------------------\n\nexport async function getSellerReputation(\n  client: MeliClient,\n  sellerId: number,\n): Promise<TSellerReputation> {\n  // The endpoint returns the reputation envelope directly — `/users/{id}`\n  // is the parent shape, but we expose a cleaner client by hitting the\n  // dedicated subresource that MELI serves.\n  return client.fetch<TSellerReputation>({\n    method: \"GET\",\n    path: `/users/${sellerId}/seller_reputation`,\n    responseSchema: SellerReputation,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Threshold-based alert generator\n// ---------------------------------------------------------------------------\n\nexport interface ReputationThresholds {\n  /** Fire `warning` when claim rate >= warningClaimRate. Default 0.04. */\n  warningClaimRate?: number;\n  /** Fire `critical` when claim rate >= criticalClaimRate. Default 0.07. */\n  criticalClaimRate?: number;\n  /** Same for delayed handling time. Defaults 0.03 / 0.06. */\n  warningDelayedHandlingRate?: number;\n  criticalDelayedHandlingRate?: number;\n  /** Cancellation rate. Defaults 0.02 / 0.05. */\n  warningCancellationRate?: number;\n  criticalCancellationRate?: number;\n}\n\nconst DEFAULTS: Required<ReputationThresholds> = {\n  warningClaimRate: 0.04,\n  criticalClaimRate: 0.07,\n  warningDelayedHandlingRate: 0.03,\n  criticalDelayedHandlingRate: 0.06,\n  warningCancellationRate: 0.02,\n  criticalCancellationRate: 0.05,\n};\n\nexport function evaluateReputationAlerts(\n  reputation: TSellerReputation,\n  thresholds: ReputationThresholds = {},\n): TReputationAlert[] {\n  const t = { ...DEFAULTS, ...thresholds };\n  const alerts: TReputationAlert[] = [];\n\n  // Helper that pushes a typed alert.\n  const push = (\n    severity: \"info\" | \"warning\" | \"critical\",\n    title: string,\n    detail: string,\n    metric: string,\n    current_value: number | undefined,\n    threshold: number,\n  ) => {\n    const a: Record<string, unknown> = {\n      severity,\n      title,\n      detail,\n      metric,\n      threshold,\n    };\n    if (current_value !== undefined) a[\"current_value\"] = current_value;\n    alerts.push(ReputationAlert.parse(a));\n  };\n\n  // Level alert (thermometer color).\n  if (reputation.level_id === \"3_yellow\") {\n    push(\n      \"warning\",\n      \"Reputation thermometer is YELLOW\",\n      \"Listing cap may already have been reduced. Resolve open claims and improve handling time to recover.\",\n      \"level_id\",\n      undefined,\n      0,\n    );\n  } else if (\n    reputation.level_id === \"2_orange\" ||\n    reputation.level_id === \"1_red\"\n  ) {\n    push(\n      \"critical\",\n      `Reputation thermometer is ${reputation.level_id.toUpperCase()}`,\n      \"Listings will be heavily restricted. Pause non-critical operations and run a save-play on the most-recent reclamos.\",\n      \"level_id\",\n      undefined,\n      0,\n    );\n  }\n\n  // Claim rate.\n  const claimRate = reputation.metrics?.claims?.rate;\n  if (typeof claimRate === \"number\") {\n    if (claimRate >= t.criticalClaimRate) {\n      push(\n        \"critical\",\n        `Claim rate is ${(claimRate * 100).toFixed(2)}%`,\n        `Above critical threshold (${t.criticalClaimRate * 100}%). Demotion likely imminent.`,\n        \"claims.rate\",\n        claimRate,\n        t.criticalClaimRate,\n      );\n    } else if (claimRate >= t.warningClaimRate) {\n      push(\n        \"warning\",\n        `Claim rate is ${(claimRate * 100).toFixed(2)}%`,\n        `Above warning threshold (${t.warningClaimRate * 100}%). Trigger a defense pass on open claims.`,\n        \"claims.rate\",\n        claimRate,\n        t.warningClaimRate,\n      );\n    }\n  }\n\n  // Delayed handling rate.\n  const delayedRate = reputation.metrics?.delayed_handling_time?.rate;\n  if (typeof delayedRate === \"number\") {\n    if (delayedRate >= t.criticalDelayedHandlingRate) {\n      push(\n        \"critical\",\n        `Late dispatch rate is ${(delayedRate * 100).toFixed(2)}%`,\n        \"Mercado Envíos Flex de-listing risk is high.\",\n        \"delayed_handling_time.rate\",\n        delayedRate,\n        t.criticalDelayedHandlingRate,\n      );\n    } else if (delayedRate >= t.warningDelayedHandlingRate) {\n      push(\n        \"warning\",\n        `Late dispatch rate is ${(delayedRate * 100).toFixed(2)}%`,\n        \"Catch up on shipping cutoffs to avoid de-listing.\",\n        \"delayed_handling_time.rate\",\n        delayedRate,\n        t.warningDelayedHandlingRate,\n      );\n    }\n  }\n\n  // Cancellation rate.\n  const cancelRate = reputation.metrics?.cancellations?.rate;\n  if (typeof cancelRate === \"number\") {\n    if (cancelRate >= t.criticalCancellationRate) {\n      push(\n        \"critical\",\n        `Cancellation rate is ${(cancelRate * 100).toFixed(2)}%`,\n        \"Suspension risk; review stock-out cases and inventory sync.\",\n        \"cancellations.rate\",\n        cancelRate,\n        t.criticalCancellationRate,\n      );\n    } else if (cancelRate >= t.warningCancellationRate) {\n      push(\n        \"warning\",\n        `Cancellation rate is ${(cancelRate * 100).toFixed(2)}%`,\n        \"Investigate stock desync between channels.\",\n        \"cancellations.rate\",\n        cancelRate,\n        t.warningCancellationRate,\n      );\n    }\n  }\n\n  return alerts;\n}\n\n// ---------------------------------------------------------------------------\n// Polling monitor (returns an AsyncIterable for streaming alerts)\n// ---------------------------------------------------------------------------\n\nexport interface MonitorReputationOptions {\n  /** Poll interval in milliseconds. Default 5 minutes. */\n  intervalMs?: number;\n  thresholds?: ReputationThresholds;\n  /** AbortSignal to stop the monitor. */\n  signal?: AbortSignal;\n  /** Callback fired when a transient (recoverable) error is swallowed. Use\n   *  this to wire your telemetry/Sentry without breaking the polling loop. */\n  onTransientError?: (error: unknown) => void;\n}\n\n/**\n * Yields `{ snapshot, alerts }` on every poll.\n *\n * Error handling:\n *   - **`MeliAuthError`** (revoked seller, banned app, OAuth refresh dead) →\n *     RE-THROWN. The connection is permanently broken; the caller needs to\n *     stop polling and surface this to the human.\n *   - **`MeliValidationError`** (programmer error — schema drift) →\n *     RE-THROWN. Bugs should fail loud, not silently.\n *   - **`MeliApiError`** that `isUnauthorized()` / `isForbidden()` (401/403 —\n *     revoked or expired token) → RE-THROWN. The endpoint is dead; polling it\n *     forever is useless.\n *   - **`MeliApiError`** with 5xx, **`MeliNetworkError`**, anything else →\n *     swallowed and reported via `onTransientError`. The loop keeps polling\n *     because transient failures are normal.\n */\nexport async function* monitorReputation(\n  client: MeliClient,\n  sellerId: number,\n  options: MonitorReputationOptions = {},\n): AsyncGenerator<\n  { snapshot: TSellerReputation | null; alerts: TReputationAlert[] },\n  void,\n  void\n> {\n  const interval = options.intervalMs ?? 5 * 60 * 1000;\n  while (!options.signal?.aborted) {\n    let snapshot: TSellerReputation | null = null;\n    let alerts: TReputationAlert[] = [];\n    try {\n      snapshot = await getSellerReputation(client, sellerId);\n      alerts = evaluateReputationAlerts(snapshot, options.thresholds);\n    } catch (err) {\n      // Permanent errors must surface — never silently retry forever.\n      if (\n        err instanceof MeliAuthError ||\n        err instanceof MeliValidationError ||\n        // A revoked/expired token surfaces as a 401/403 MeliApiError, not a\n        // MeliAuthError. Treat those as permanent too — otherwise the loop\n        // polls a dead endpoint forever.\n        (err instanceof MeliApiError &&\n          (err.isUnauthorized() || err.isForbidden()))\n      ) {\n        throw err;\n      }\n      options.onTransientError?.(err);\n    }\n    yield { snapshot, alerts };\n    if (options.signal?.aborted) return;\n    await sleep(interval, options.signal);\n  }\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n  return new Promise((resolve) => {\n    const timer = setTimeout(resolve, ms);\n    signal?.addEventListener(\n      \"abort\",\n      () => {\n        clearTimeout(timer);\n        resolve();\n      },\n      { once: true },\n    );\n  });\n}\n","import { z } from \"zod\";\nimport { Currency, MeliItemId } from \"./common\";\n\n// ---------------------------------------------------------------------------\n// Promotions — `/seller-promotions/promotions` + `/seller-promotions/candidates`\n// ---------------------------------------------------------------------------\n\nexport const PromotionType = z.enum([\n  \"DEAL\",\n  \"DOD\", // Deal of the day\n  \"LIGHTNING\",\n  \"SMART\",\n  \"PRICE_DISCOUNT\",\n  \"PRICE_MATCHING\",\n  \"UNHEALTHY_STOCK\",\n  \"SELLER_COUPON_CAMPAIGN\",\n  \"MARKETPLACE_CAMPAIGN\",\n  \"VOLUME\",\n  \"PRE_NEGOTIATED\",\n]);\nexport type PromotionType = z.infer<typeof PromotionType>;\n\nexport const PromotionCandidate = z.object({\n  promotion_id: z.string(),\n  promotion_type: z.union([PromotionType, z.string()]),\n  /** When the seller can opt in. */\n  start_date: z.string().optional(),\n  finish_date: z.string().optional(),\n  /** Suggested discount percent (1..100). */\n  suggested_discount_percentage: z.number().nonnegative().nullable().optional(),\n  /** Maximum discount the platform will allow on this candidate. */\n  max_discount_percentage: z.number().nonnegative().nullable().optional(),\n  /** Minimum discount required to qualify. */\n  min_discount_percentage: z.number().nonnegative().nullable().optional(),\n  /** Items eligible to opt in to this candidate. */\n  items: z\n    .array(\n      z.object({\n        id: MeliItemId,\n        original_price: z.number().nonnegative().optional(),\n        suggested_price: z.number().nonnegative().nullable().optional(),\n        max_price: z.number().nonnegative().nullable().optional(),\n        min_price: z.number().nonnegative().nullable().optional(),\n        currency_id: Currency.optional(),\n      }),\n    )\n    .optional(),\n});\nexport type PromotionCandidate = z.infer<typeof PromotionCandidate>;\n\nexport const PromotionOptInRequest = z.object({\n  promotion_id: z.string(),\n  promotion_type: z.union([PromotionType, z.string()]).optional(),\n  /** Discounted price the seller commits to. */\n  deal_price: z.number().nonnegative(),\n});\nexport type PromotionOptInRequest = z.infer<typeof PromotionOptInRequest>;\n\nexport const PromotionOptInResponse = z.object({\n  id: MeliItemId,\n  status: z.enum([\"started\", \"finished\", \"candidate\", \"rejected\"]).optional(),\n  promotion_id: z.string().optional(),\n  deal_price: z.number().nonnegative().optional(),\n  original_price: z.number().nonnegative().optional(),\n});\nexport type PromotionOptInResponse = z.infer<typeof PromotionOptInResponse>;\n","// Promotions — `/seller-promotions/promotions`,\n// `/seller-promotions/candidates`,\n// `/seller-promotions/items/{id}` (opt-in).\n//\n// One of MELI's biggest blindspots: ML invites items into promotions via\n// `/candidates`, but the surface is buried in seller hub. Auto-opt-in\n// based on margin guards is dollar-printing.\n\nimport type { MeliClient } from \"./client\";\nimport {\n  PromotionCandidate,\n  PromotionOptInRequest,\n  PromotionOptInResponse,\n  type PromotionCandidate as TPromotionCandidate,\n  type PromotionOptInRequest as TPromotionOptInRequest,\n  type PromotionOptInResponse as TPromotionOptInResponse,\n} from \"./schemas/promotion\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Candidates list\n// ---------------------------------------------------------------------------\n\nconst PromotionCandidatesResponse = z.object({\n  results: z.array(PromotionCandidate),\n  paging: z\n    .object({\n      total: z.number().int().nonnegative(),\n      offset: z.number().int().nonnegative().optional(),\n      limit: z.number().int().positive().optional(),\n    })\n    .optional(),\n});\nexport type PromotionCandidatesResponse = z.infer<typeof PromotionCandidatesResponse>;\n\nexport interface ListPromotionCandidatesOptions {\n  promotionType?:\n    | \"DEAL\"\n    | \"DOD\"\n    | \"LIGHTNING\"\n    | \"SMART\"\n    | \"PRICE_DISCOUNT\"\n    | \"SELLER_COUPON_CAMPAIGN\"\n    | \"MARKETPLACE_CAMPAIGN\";\n  limit?: number;\n  offset?: number;\n}\n\nexport async function listPromotionCandidates(\n  client: MeliClient,\n  sellerId: number,\n  options: ListPromotionCandidatesOptions = {},\n): Promise<PromotionCandidatesResponse> {\n  const query: Record<string, string | number> = { app_version: \"v2\" };\n  if (options.promotionType !== undefined) query[\"promotion_type\"] = options.promotionType;\n  if (options.limit !== undefined) query[\"limit\"] = options.limit;\n  if (options.offset !== undefined) query[\"offset\"] = options.offset;\n  return client.fetch<PromotionCandidatesResponse>({\n    method: \"GET\",\n    path: `/seller-promotions/users/${sellerId}/candidates`,\n    query,\n    responseSchema: PromotionCandidatesResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Active promotions list\n// ---------------------------------------------------------------------------\n\nconst ActivePromotionsResponse = z.object({\n  results: z.array(PromotionCandidate),\n  paging: z\n    .object({\n      total: z.number().int().nonnegative(),\n    })\n    .optional(),\n});\nexport async function listActivePromotions(\n  client: MeliClient,\n  sellerId: number,\n): Promise<TPromotionCandidate[]> {\n  const r = await client.fetch<z.infer<typeof ActivePromotionsResponse>>({\n    method: \"GET\",\n    path: `/seller-promotions/users/${sellerId}/promotions`,\n    responseSchema: ActivePromotionsResponse,\n  });\n  return r.results;\n}\n\n// ---------------------------------------------------------------------------\n// Opt-in for an item\n// ---------------------------------------------------------------------------\n\nexport async function optInPromotion(\n  client: MeliClient,\n  itemId: string,\n  payload: TPromotionOptInRequest,\n): Promise<TPromotionOptInResponse> {\n  const validated = PromotionOptInRequest.parse(payload);\n  return client.fetch<TPromotionOptInResponse>({\n    method: \"POST\",\n    path: `/seller-promotions/items/${itemId}`,\n    body: validated,\n    responseSchema: PromotionOptInResponse,\n  });\n}\n\n// ---------------------------------------------------------------------------\n// Margin-aware auto-opt-in\n// ---------------------------------------------------------------------------\n\nexport interface MarginGuard {\n  /** Item id → minimum margin we accept (decimal, e.g. 0.15 for 15%). */\n  minimumMarginByItem?: Record<string, number>;\n  /** Default minimum margin when item-specific isn't set. Default 0.15. */\n  defaultMinimumMargin?: number;\n  /** Item id → COGS in major units (used to compute margin from candidate's\n   *  suggested_price). When absent, the candidate is SKIPPED (we'd rather\n   *  miss revenue than auto-opt-in below cost). */\n  cogsByItem: Record<string, number>;\n}\n\nexport interface AutoOptInResult {\n  optedIn: TPromotionOptInResponse[];\n  skipped: Array<{\n    itemId: string;\n    promotionId: string;\n    reason: \"no_cogs\" | \"below_margin\" | \"no_suggested_price\";\n    detail: string;\n  }>;\n}\n\n/**\n * Iterate candidates and opt-in to those that respect the configured\n * margin guard. Returns both opted-in items and skipped ones (with reason\n * codes for telemetry).\n */\nexport async function autoOptInPromotions(\n  client: MeliClient,\n  sellerId: number,\n  guard: MarginGuard,\n  options: ListPromotionCandidatesOptions = {},\n): Promise<AutoOptInResult> {\n  const result: AutoOptInResult = { optedIn: [], skipped: [] };\n  const candidates = await listPromotionCandidates(client, sellerId, options);\n  const minDefault = guard.defaultMinimumMargin ?? 0.15;\n\n  for (const cand of candidates.results) {\n    if (!cand.items) continue;\n    for (const item of cand.items) {\n      const cogs = guard.cogsByItem[item.id];\n      if (cogs === undefined) {\n        result.skipped.push({\n          itemId: item.id,\n          promotionId: cand.promotion_id,\n          reason: \"no_cogs\",\n          detail:\n            \"No COGS configured for this item; refusing to auto-opt-in without a margin floor.\",\n        });\n        continue;\n      }\n      // Margin is computed against the SUGGESTED (discounted) price — that's\n      // the revenue we'd actually book if we opt in. Falling back to\n      // `original_price` would compute margin against full price and then\n      // opt in at full price, defeating the entire promotion. If MELI didn't\n      // suggest a discount, skip the candidate.\n      const suggested = item.suggested_price;\n      if (suggested === undefined || suggested === null || suggested <= 0) {\n        result.skipped.push({\n          itemId: item.id,\n          promotionId: cand.promotion_id,\n          reason: \"no_suggested_price\",\n          detail: \"MELI did not suggest a discount price for this candidate.\",\n        });\n        continue;\n      }\n      const margin = (suggested - cogs) / suggested;\n      const minMargin = guard.minimumMarginByItem?.[item.id] ?? minDefault;\n      if (margin < minMargin) {\n        result.skipped.push({\n          itemId: item.id,\n          promotionId: cand.promotion_id,\n          reason: \"below_margin\",\n          detail: `Margin at suggested_price (${(margin * 100).toFixed(1)}%) below floor ${(minMargin * 100).toFixed(1)}%.`,\n        });\n        continue;\n      }\n      const optInResult = await optInPromotion(client, item.id, {\n        promotion_id: cand.promotion_id,\n        promotion_type: cand.promotion_type,\n        deal_price: suggested,\n      });\n      result.optedIn.push(optInResult);\n    }\n  }\n  return result;\n}\n","// Vercel AI SDK 6 tools wrapper for `@ar-agents/mercadolibre`.\n//\n// Drop the result of `meliTools(client, options)` directly into an\n// `Experimental_Agent`'s `tools` field. Each tool is a `tool({...})` from\n// the `ai` package, with discriminated success/failure return shapes.\n//\n// Usage:\n//\n//   import { Experimental_Agent as Agent, stepCountIs } from \"ai\";\n//   import { MeliClient, meliTools } from \"@ar-agents/mercadolibre\";\n//\n//   const client = new MeliClient({ auth: { kind: \"oauth\", userId, app, store } });\n//   const agent = new Agent({\n//     model: \"anthropic/claude-sonnet-4-6\",\n//     tools: meliTools(client, { siteId: \"MLA\", sellerId }),\n//     stopWhen: stepCountIs(8),\n//   });\n\nimport { tool, type ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport type { MeliClient } from \"./client\";\nimport {\n  classifyHitlSeverity,\n  gateHitl,\n  HitlRejectedError,\n  type HitlConfig,\n  type HitlContext,\n  type HitlOpKind,\n} from \"./hitl\";\nimport * as items from \"./items\";\nimport * as categories from \"./categories\";\nimport * as questions from \"./questions\";\nimport * as orders from \"./orders\";\nimport * as claims from \"./claims\";\nimport * as shipments from \"./shipments\";\nimport * as reputation from \"./reputation\";\nimport * as promotions from \"./promotions\";\nimport { isMeliError } from \"./errors\";\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport type MeliToolName =\n  | \"list_my_items\"\n  | \"get_item\"\n  | \"create_item\"\n  | \"update_item_price_or_stock\"\n  | \"categorize_listing_and_plan_attributes\"\n  | \"list_unanswered_questions\"\n  | \"answer_question\"\n  | \"classify_question_spam\"\n  | \"list_recent_orders\"\n  | \"get_order\"\n  | \"list_open_claims\"\n  | \"defend_claim\"\n  | \"get_seller_reputation\"\n  | \"list_promotion_candidates\";\n\nexport interface MeliToolsOptions {\n  /** MELI site id this seller operates on (MLA / MLB / MLM / etc.). */\n  siteId: \"MLA\" | \"MLB\" | \"MLM\" | \"MLC\" | \"MCO\" | \"MLU\" | \"MPE\";\n  /** MELI seller id (numeric). Required for any seller-side query. */\n  sellerId: number;\n  /** Override agent-facing descriptions. */\n  descriptions?: Partial<Record<MeliToolName, string>>;\n  /** Human-in-the-loop gate for irreversible operations\n   *  (`create_item`, `update_item_price_or_stock`, `answer_question`,\n   *  `defend_claim`). Without this, the LLM can execute every tool\n   *  freely. With it, the destructive tools wait for the host's\n   *  `requireConfirmation` callback before firing the HTTP request. */\n  hitl?: HitlConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Default descriptions, written for LLM consumption\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_DESCRIPTIONS: Record<MeliToolName, string> = {\n  list_my_items:\n    \"List the seller's own Mercado Libre listings (mis publicaciones de Mercado Libre). USE THIS WHEN: the agent needs to inventory the seller's catalog or filter by status. Pagination via `scroll_id` is automatic; pass `cursor` if you got one back. Returns `{ ok: true, item_ids, scroll_id?, total }`.\",\n  get_item:\n    \"Fetch a Mercado Libre listing by id (consultar una publicación; e.g. `MLA1234567890`). USE THIS WHEN: you need the listing's title, price, status, attributes, or pictures. Public endpoint, no seller scope needed. Returns `{ ok: true, item }`.\",\n  create_item:\n    \"Publish a new Mercado Libre listing (publicar un producto en Mercado Libre). USE THIS WHEN the seller has decided to publish. Requires title + category_id + price + currency_id + available_quantity + at least one picture. Pair with `categorize_listing_and_plan_attributes` first to fill required attributes. Returns `{ ok: true, item }`.\",\n  update_item_price_or_stock:\n    \"Update price or stock on a Mercado Libre listing (cambiar precio, actualizar stock). USE THIS WHEN: a stock change or repricing decision has been made. Pass `id` plus any of `price` / `available_quantity` / `status`. Returns `{ ok: true, item }`.\",\n  categorize_listing_and_plan_attributes:\n    \"Predict the Mercado Libre category for a listing (predecir categoría) AND fetch its required attributes. USE THIS BEFORE `create_item`: it returns the canonical category_id, the domain_id, and the list of MAIN attributes the seller MUST fill before publishing (so a downstream agent can either auto-fill or ask the user). Returns `{ ok: true, prediction, requiredAttributeIds, technicalSpecs }`.\",\n  list_unanswered_questions:\n    \"List unanswered Mercado Libre questions (preguntas sin responder) on this seller's items. USE THIS WHEN: the agent is doing a triage pass. Returns `{ ok: true, questions, total }`. Combine with `classify_question_spam` to filter spam before drafting answers.\",\n  answer_question:\n    \"Answer a Mercado Libre pre-sale question (responder una pregunta). USE THIS WHEN: the question is real (not spam) and the agent has drafted a response in the seller's voice. Max 2000 chars. Returns `{ ok: true, answer }`.\",\n  classify_question_spam:\n    \"Classify a pre-sale question as spam / borderline / ham (detectar spam en preguntas) using a transparent heuristic. USE THIS BEFORE answering at scale to avoid wasting response time on spam waves. Returns `{ ok: true, label, score, features }`.\",\n  list_recent_orders:\n    \"List the seller's recent Mercado Libre orders (ventas recientes, listar órdenes). USE THIS WHEN: doing a fulfillment audit, billing reconciliation, or building a daily summary. Returns `{ ok: true, orders, total }`.\",\n  get_order:\n    \"Fetch a Mercado Libre order by id (consultar una venta), including buyer, payments, shipping, items. USE THIS WHEN: investigating a specific order. Returns `{ ok: true, order }`.\",\n  list_open_claims:\n    \"List open Mercado Libre claims (listar reclamos abiertos) at the requested mediation stage. USE THIS WHEN: the agent is running a defense pass. Returns `{ ok: true, claims, total }`. Pair with `defend_claim` to upload evidence.\",\n  defend_claim:\n    \"Defend a Mercado Libre claim (defender un reclamo) via the 2-day-SLA flow: upload all evidences in one call (one-shot per spec) and optionally post a closing message. USE THIS WHEN: a claim needs response within the SLA window and the agent has gathered evidence (proof of shipment, invoice, video, etc.). Returns `{ ok: true, claim, uploadedEvidences, messagePosted }`.\",\n  get_seller_reputation:\n    \"Fetch the seller's Mercado Libre reputation (reputación del vendedor), thermometer color, claim/handling/cancel rates, transactions, status. USE THIS WHEN: dashboarding or before a big-volume action like batch repricing. Returns `{ ok: true, reputation, alerts }`, alerts are pre-evaluated against thermometer thresholds.\",\n  list_promotion_candidates:\n    \"List available Mercado Libre promotions (promociones disponibles) the seller has been invited to but hasn't opted into yet. USE THIS WHEN: the seller wants to find money-printing opportunities. Returns `{ ok: true, candidates }`. Use `autoOptInPromotions` (programmatic) for bulk opt-in with margin guards.\",\n};\n\n// ---------------------------------------------------------------------------\n// Tool factory\n// ---------------------------------------------------------------------------\n\nexport function meliTools(\n  client: MeliClient,\n  options: MeliToolsOptions,\n): ToolSet {\n  const desc = (n: MeliToolName) =>\n    options.descriptions?.[n] ?? DEFAULT_DESCRIPTIONS[n];\n\n  return {\n    list_my_items: tool({\n      description: desc(\"list_my_items\"),\n      inputSchema: z.object({\n        status: z.enum([\"active\", \"paused\", \"closed\", \"all\"]).optional(),\n        cursor: z.string().optional(),\n        limit: z.number().int().min(1).max(100).optional(),\n      }),\n      execute: wrap(async (input) => {\n        const opts: items.SearchSellerItemsOptions = {};\n        if (input.status !== undefined) opts.status = input.status;\n        if (input.cursor !== undefined) opts.scrollId = input.cursor;\n        if (input.limit !== undefined) opts.limit = input.limit;\n        const r = await items.searchSellerItems(client, options.sellerId, opts);\n        return {\n          item_ids: r.results,\n          total: r.paging.total,\n          ...(r.scroll_id !== undefined ? { scroll_id: r.scroll_id } : {}),\n        };\n      }),\n    }),\n\n    get_item: tool({\n      description: desc(\"get_item\"),\n      inputSchema: z.object({ id: z.string() }),\n      execute: wrap(async ({ id }) => ({ item: await items.getItem(client, id) })),\n    }),\n\n    create_item: tool({\n      description: desc(\"create_item\"),\n      inputSchema: z.object({\n        title: z.string().min(1),\n        category_id: z.string(),\n        price: z.number().nonnegative(),\n        currency_id: z.string(),\n        available_quantity: z.number().int().nonnegative(),\n        condition: z.enum([\"new\", \"used\", \"not_specified\"]).optional(),\n        description: z.string().optional(),\n        pictures: z.array(z.string().url()).min(1).optional(),\n        attributes: z\n          .array(z.object({ id: z.string(), value_name: z.string() }))\n          .optional(),\n        listing_type_id: z\n          .enum([\"free\", \"bronze\", \"silver\", \"gold\", \"gold_special\", \"gold_pro\"])\n          .optional(),\n      }),\n      execute: hitlWrap(\n        options.hitl,\n        (input) => ({\n          kind: \"create_item\",\n          resourceId: input.title.slice(0, 80),\n          summary: `Publicar listing nuevo: \"${input.title}\" a ${input.currency_id} ${input.price} (${input.available_quantity} disponibles).`,\n          input,\n        }),\n        async (input) => {\n          const payload: Parameters<typeof items.createItem>[1] = {\n            title: input.title,\n            category_id: input.category_id,\n            price: input.price,\n            currency_id: input.currency_id as never,\n            available_quantity: input.available_quantity,\n            buying_mode: \"buy_it_now\",\n            condition: input.condition ?? \"new\",\n            listing_type_id: input.listing_type_id ?? \"gold_special\",\n          };\n          if (input.description) payload.description = { plain_text: input.description };\n          if (input.pictures) {\n            payload.pictures = input.pictures.map((source: string) => ({ source }));\n          }\n          if (input.attributes) {\n            payload.attributes = input.attributes.map(\n              (a: { id: string; value_name: string }) => ({\n                id: a.id,\n                value_name: a.value_name,\n              }),\n            );\n          }\n          return { item: await items.createItem(client, payload) };\n        },\n      ),\n    }),\n\n    update_item_price_or_stock: tool({\n      description: desc(\"update_item_price_or_stock\"),\n      inputSchema: z.object({\n        id: z.string(),\n        price: z.number().nonnegative().optional(),\n        available_quantity: z.number().int().nonnegative().optional(),\n        status: z.enum([\"active\", \"paused\", \"closed\"]).optional(),\n      }),\n      execute: hitlWrap(\n        options.hitl,\n        (input) => {\n          const parts: string[] = [];\n          if (input.price !== undefined) parts.push(`precio → ${input.price}`);\n          if (input.available_quantity !== undefined)\n            parts.push(`stock → ${input.available_quantity}`);\n          if (input.status !== undefined) parts.push(`estado → ${input.status}`);\n          return {\n            kind: input.status === \"paused\" || input.status === \"closed\"\n              ? (input.status === \"paused\" ? \"pause_item\" : \"close_item\")\n              : \"update_item_price_or_stock\",\n            resourceId: input.id,\n            summary: `Modificar item ${input.id}: ${parts.join(\", \")}.`,\n            input,\n          };\n        },\n        async ({ id, price, available_quantity, status }) => {\n          const payload: Parameters<typeof items.updateItem>[2] = {};\n          if (price !== undefined) payload.price = price;\n          if (available_quantity !== undefined) payload.available_quantity = available_quantity;\n          if (status !== undefined) payload.status = status;\n          return { item: await items.updateItem(client, id, payload) };\n        },\n      ),\n    }),\n\n    categorize_listing_and_plan_attributes: tool({\n      description: desc(\"categorize_listing_and_plan_attributes\"),\n      inputSchema: z.object({\n        title: z.string().min(1),\n        price: z.number().nonnegative().optional(),\n        condition: z.enum([\"new\", \"used\"]).optional(),\n      }),\n      execute: wrap(async (input) => {\n        return categories.categorizeAndPlan(client, options.siteId, input);\n      }),\n    }),\n\n    list_unanswered_questions: tool({\n      description: desc(\"list_unanswered_questions\"),\n      inputSchema: z.object({\n        item_id: z.string().optional(),\n        limit: z.number().int().min(1).max(100).optional(),\n      }),\n      execute: wrap(async (input) => {\n        const opts: questions.ListQuestionsOptions = { status: \"UNANSWERED\" };\n        if (input.item_id !== undefined) opts.itemId = input.item_id;\n        if (input.limit !== undefined) opts.limit = input.limit;\n        const r = await questions.listQuestions(client, options.sellerId, opts);\n        return { questions: r.questions, total: r.total };\n      }),\n    }),\n\n    answer_question: tool({\n      description: desc(\"answer_question\"),\n      inputSchema: z.object({\n        question_id: z.number().int(),\n        text: z.string().min(1).max(2000),\n      }),\n      execute: hitlWrap(\n        options.hitl,\n        (input) => ({\n          kind: \"answer_question\",\n          resourceId: input.question_id,\n          summary: `Responder pregunta ${input.question_id} con: \"${input.text.slice(0, 140)}${input.text.length > 140 ? \"…\" : \"\"}\".`,\n          input,\n        }),\n        async (input) => {\n          const r = await questions.answerQuestion(client, input);\n          return { answer: r };\n        },\n      ),\n    }),\n\n    classify_question_spam: tool({\n      description: desc(\"classify_question_spam\"),\n      inputSchema: z.object({\n        question_text: z.string().min(1),\n        asker_account_age_days: z.number().nonnegative().optional(),\n        asker_answered_questions: z.number().int().nonnegative().optional(),\n        recent_questions_by_this_asker: z.array(z.string()).optional(),\n      }),\n      execute: wrap(async (input) => {\n        // Synthesize a Question-shaped object for the classifier.\n        const question = {\n          id: 0,\n          date_created: new Date().toISOString(),\n          item_id: \"MLA0\",\n          seller_id: options.sellerId,\n          status: \"UNANSWERED\" as const,\n          text: input.question_text,\n        };\n        const askerProfile: NonNullable<questions.ClassifySpamInput[\"askerProfile\"]> = {};\n        if (input.asker_account_age_days !== undefined) {\n          askerProfile.account_age_days = input.asker_account_age_days;\n        }\n        if (input.asker_answered_questions !== undefined) {\n          askerProfile.answered_questions = input.asker_answered_questions;\n        }\n        const cs: questions.ClassifySpamInput = { question };\n        if (Object.keys(askerProfile).length > 0) cs.askerProfile = askerProfile;\n        if (input.recent_questions_by_this_asker !== undefined) {\n          cs.recentQuestionsByThisAsker = input.recent_questions_by_this_asker;\n        }\n        return questions.classifySpam(cs);\n      }),\n    }),\n\n    list_recent_orders: tool({\n      description: desc(\"list_recent_orders\"),\n      inputSchema: z.object({\n        status: z.enum([\"paid\", \"confirmed\", \"cancelled\"]).optional(),\n        date_from: z.string().optional(),\n        limit: z.number().int().min(1).max(50).optional(),\n      }),\n      execute: wrap(async (input) => {\n        const opts: orders.SearchOrdersOptions = {};\n        if (input.status !== undefined) opts.status = input.status;\n        if (input.date_from !== undefined) opts.dateCreatedFrom = input.date_from;\n        if (input.limit !== undefined) opts.limit = input.limit;\n        const r = await orders.searchOrders(client, options.sellerId, opts);\n        return { orders: r.results, total: r.paging.total };\n      }),\n    }),\n\n    get_order: tool({\n      description: desc(\"get_order\"),\n      inputSchema: z.object({ order_id: z.number().int() }),\n      execute: wrap(async ({ order_id }) => ({\n        order: await orders.getOrder(client, order_id),\n      })),\n    }),\n\n    list_open_claims: tool({\n      description: desc(\"list_open_claims\"),\n      inputSchema: z.object({\n        stage: z.enum([\"claim\", \"dispute\", \"mediation\"]).optional(),\n        limit: z.number().int().min(1).max(50).optional(),\n      }),\n      execute: wrap(async (input) => {\n        const opts: claims.SearchClaimsOptions = { status: \"opened\" };\n        if (input.stage !== undefined) opts.stage = input.stage;\n        if (input.limit !== undefined) opts.limit = input.limit;\n        const r = await claims.searchClaims(client, opts);\n        return { claims: r.data, total: r.paging.total };\n      }),\n    }),\n\n    defend_claim: tool({\n      description: desc(\"defend_claim\"),\n      inputSchema: z.object({\n        claim_id: z.number().int(),\n        evidences: z\n          .array(\n            z.object({\n              evidence_type: z.enum([\n                \"PROOF_OF_SHIPMENT\",\n                \"ITEM_DESCRIPTION_VS_RECEIVED\",\n                \"VIDEO_OF_PRODUCT\",\n                \"INVOICE\",\n                \"MESSAGE_THREAD\",\n                \"DELIVERY_PROOF\",\n                \"RETURN_PROOF\",\n                \"OTHER\",\n              ]),\n              text: z.string().optional(),\n              attachment_id: z.string().optional(),\n            }),\n          )\n          .min(1),\n        message: z.string().optional(),\n      }),\n      execute: hitlWrap(\n        options.hitl,\n        (input) => ({\n          kind: \"defend_claim\",\n          resourceId: input.claim_id,\n          summary: `Defender claim ${input.claim_id} con ${input.evidences.length} evidencia(s)${input.message ? \" + mensaje\" : \"\"}.`,\n          input,\n        }),\n        async (input) => {\n          const defendInput: claims.DefendClaimInput = {\n            claimId: input.claim_id,\n            evidences: input.evidences,\n          };\n          if (input.message !== undefined) defendInput.message = input.message;\n          return claims.defendClaim(client, defendInput);\n        },\n      ),\n    }),\n\n    get_seller_reputation: tool({\n      description: desc(\"get_seller_reputation\"),\n      inputSchema: z.object({}).optional(),\n      execute: wrap(async () => {\n        const snapshot = await reputation.getSellerReputation(client, options.sellerId);\n        const alerts = reputation.evaluateReputationAlerts(snapshot);\n        return { reputation: snapshot, alerts };\n      }),\n    }),\n\n    list_promotion_candidates: tool({\n      description: desc(\"list_promotion_candidates\"),\n      inputSchema: z.object({\n        promotion_type: z\n          .enum([\n            \"DEAL\",\n            \"DOD\",\n            \"LIGHTNING\",\n            \"SMART\",\n            \"PRICE_DISCOUNT\",\n            \"SELLER_COUPON_CAMPAIGN\",\n            \"MARKETPLACE_CAMPAIGN\",\n          ])\n          .optional(),\n        limit: z.number().int().min(1).max(50).optional(),\n      }),\n      execute: wrap(async (input) => {\n        const opts: promotions.ListPromotionCandidatesOptions = {};\n        if (input.promotion_type !== undefined) opts.promotionType = input.promotion_type;\n        if (input.limit !== undefined) opts.limit = input.limit;\n        const r = await promotions.listPromotionCandidates(client, options.sellerId, opts);\n        return { candidates: r.results };\n      }),\n    }),\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction wrap<I, O>(fn: (input: I) => Promise<O>) {\n  return async (input: I) => {\n    try {\n      const result = await fn(input);\n      return { ok: true as const, ...(result as object) };\n    } catch (err) {\n      if (err instanceof HitlRejectedError) {\n        return {\n          ok: false as const,\n          code: err.code,\n          message: err.message,\n          ...(err.reason !== undefined ? { reason: err.reason } : {}),\n        };\n      }\n      if (isMeliError(err)) {\n        return {\n          ok: false as const,\n          code: err.code,\n          message: err.message,\n        };\n      }\n      return {\n        ok: false as const,\n        code: \"unknown_error\",\n        message: err instanceof Error ? err.message : String(err),\n      };\n    }\n  };\n}\n\n/**\n * Higher-order wrapper for irreversible tools. Builds the HITL context,\n * runs the gate, applies any host-supplied input overrides, then calls\n * the underlying executor.\n */\nfunction hitlWrap<I extends Record<string, unknown>, O>(\n  hitl: HitlConfig | undefined,\n  buildContext: (input: I) => Omit<HitlContext, \"severity\"> & { kind: HitlOpKind },\n  fn: (input: I) => Promise<O>,\n) {\n  return wrap(async (input: I) => {\n    const partial = buildContext(input);\n    const ctx: HitlContext = {\n      ...partial,\n      severity: classifyHitlSeverity(partial.kind),\n    };\n    const decision = await gateHitl(hitl, ctx);\n    const finalInput = decision.overrides\n      ? ({ ...input, ...decision.overrides } as I)\n      : input;\n    return fn(finalInput);\n  });\n}\n\n// Re-export shipments helpers for tools that call them via the public lib.\nexport { shipments };\n"]}