@yoryoboy/bi-mcp 1.14.3 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/mcp-use.json +2 -2
- package/dist/src/tools/mercadolibre/get-order-details.js +18 -4
- package/dist/src/tools/mercadolibre/get-order-details.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-orders-summary.js +6 -2
- package/dist/src/tools/mercadolibre/get-orders-summary.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-shipping-summary.js +50 -14
- package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js +16 -4
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js +25 -3
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js +141 -5
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js +3 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js.map +2 -2
- package/package.json +1 -1
|
@@ -38,8 +38,12 @@ const shipmentsSchema = [
|
|
|
38
38
|
"logistic_type",
|
|
39
39
|
"mode",
|
|
40
40
|
"currency_id",
|
|
41
|
-
"cost"
|
|
41
|
+
"cost",
|
|
42
|
+
"buyer_shipping_paid"
|
|
42
43
|
];
|
|
44
|
+
function getFirstPayment(order) {
|
|
45
|
+
return asRecord(asArray(order.payments)[0]);
|
|
46
|
+
}
|
|
43
47
|
function safeRate(numerator, denominator) {
|
|
44
48
|
if (!Number.isFinite(denominator) || denominator <= 0) {
|
|
45
49
|
return 0;
|
|
@@ -150,7 +154,8 @@ function formatCompactShipmentRow(params) {
|
|
|
150
154
|
params.logisticType,
|
|
151
155
|
params.mode,
|
|
152
156
|
params.currencyId,
|
|
153
|
-
params.cost
|
|
157
|
+
params.cost,
|
|
158
|
+
params.buyerShippingPaid
|
|
154
159
|
];
|
|
155
160
|
}
|
|
156
161
|
function buildShippingCalculations(params) {
|
|
@@ -162,6 +167,11 @@ function buildShippingCalculations(params) {
|
|
|
162
167
|
shipments: bucket.shipments,
|
|
163
168
|
shipments_with_cost: bucket.shipments_with_cost,
|
|
164
169
|
zero_cost_shipments: bucket.zero_cost_shipments,
|
|
170
|
+
buyer_shipping_paid_total: roundMoney(bucket.total_buyer_shipping_paid),
|
|
171
|
+
orders_with_buyer_shipping_paid: bucket.orders_with_buyer_shipping_paid,
|
|
172
|
+
avg_buyer_shipping_paid_per_order_with_payment: roundMoney(
|
|
173
|
+
bucket.total_buyer_shipping_paid / Math.max(1, bucket.orders_with_buyer_shipping_paid)
|
|
174
|
+
),
|
|
165
175
|
avg_cost_per_shipment: roundMoney(bucket.total_cost / Math.max(1, bucket.shipments)),
|
|
166
176
|
avg_cost_per_shipment_with_cost: roundMoney(
|
|
167
177
|
bucket.total_cost / Math.max(1, bucket.shipments_with_cost)
|
|
@@ -315,14 +325,22 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
315
325
|
const ordersWithShipping = allOrders.reduce((count, order) => {
|
|
316
326
|
return normalizeScalarString(asRecord(order.shipping).id) ? count + 1 : count;
|
|
317
327
|
}, 0);
|
|
318
|
-
const
|
|
328
|
+
const ordersByShipmentId = /* @__PURE__ */ new Map();
|
|
329
|
+
const primaryOrderByShipmentId = /* @__PURE__ */ new Map();
|
|
319
330
|
for (const order of allOrders) {
|
|
320
331
|
const shipmentId = normalizeScalarString(asRecord(order.shipping).id);
|
|
321
|
-
if (
|
|
322
|
-
|
|
332
|
+
if (!shipmentId) {
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
const shipmentOrders = ordersByShipmentId.get(shipmentId);
|
|
336
|
+
if (shipmentOrders) {
|
|
337
|
+
shipmentOrders.push(order);
|
|
338
|
+
} else {
|
|
339
|
+
ordersByShipmentId.set(shipmentId, [order]);
|
|
340
|
+
primaryOrderByShipmentId.set(shipmentId, order);
|
|
323
341
|
}
|
|
324
342
|
}
|
|
325
|
-
const shipmentIds = [...
|
|
343
|
+
const shipmentIds = [...ordersByShipmentId.keys()];
|
|
326
344
|
const statusCounts = /* @__PURE__ */ new Map();
|
|
327
345
|
const substatusCounts = /* @__PURE__ */ new Map();
|
|
328
346
|
const logisticTypeCounts = /* @__PURE__ */ new Map();
|
|
@@ -354,7 +372,7 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
354
372
|
);
|
|
355
373
|
shipmentsBatch.failed.forEach((failure) => {
|
|
356
374
|
failures.push({
|
|
357
|
-
order_id: normalizeScalarString(
|
|
375
|
+
order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),
|
|
358
376
|
shipment_id: failure.id,
|
|
359
377
|
stage: "shipment",
|
|
360
378
|
message: failure.message,
|
|
@@ -365,7 +383,7 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
365
383
|
});
|
|
366
384
|
costsBatch.failed.forEach((failure) => {
|
|
367
385
|
failures.push({
|
|
368
|
-
order_id: normalizeScalarString(
|
|
386
|
+
order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),
|
|
369
387
|
shipment_id: failure.id,
|
|
370
388
|
stage: "costs",
|
|
371
389
|
message: failure.message,
|
|
@@ -380,14 +398,26 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
380
398
|
if (!shipment || !costs) {
|
|
381
399
|
continue;
|
|
382
400
|
}
|
|
383
|
-
const
|
|
401
|
+
const shipmentOrders = ordersByShipmentId.get(shipmentId) ?? [];
|
|
402
|
+
const primaryOrder = primaryOrderByShipmentId.get(shipmentId);
|
|
384
403
|
const shipmentStatus = normalizeString(shipment.status, "unknown");
|
|
385
404
|
const shipmentSubstatus = normalizeString(shipment.substatus, "unknown");
|
|
386
405
|
const logisticType = normalizeString(shipment.logistic_type);
|
|
387
406
|
const mode = normalizeString(shipment.mode);
|
|
388
|
-
const currencyId = normalizeString(
|
|
407
|
+
const currencyId = normalizeString(primaryOrder?.currency_id, "UNKNOWN");
|
|
389
408
|
const shipmentCost = roundMoney(extractShipmentCost(costs));
|
|
390
|
-
const
|
|
409
|
+
const buyerShippingPaid = roundMoney(
|
|
410
|
+
shipmentOrders.reduce((sum, shipmentOrder) => {
|
|
411
|
+
return sum + roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost));
|
|
412
|
+
}, 0)
|
|
413
|
+
);
|
|
414
|
+
const ordersWithBuyerShippingPaid = shipmentOrders.reduce((count, shipmentOrder) => {
|
|
415
|
+
return roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost)) > 0 ? count + 1 : count;
|
|
416
|
+
}, 0);
|
|
417
|
+
const dayBucket = getLocalDateBucket(
|
|
418
|
+
normalizeString(primaryOrder?.date_created),
|
|
419
|
+
BUSINESS_TIME_ZONE
|
|
420
|
+
);
|
|
391
421
|
shipmentsInspected += 1;
|
|
392
422
|
incrementCount(statusCounts, shipmentStatus);
|
|
393
423
|
incrementCount(substatusCounts, shipmentSubstatus);
|
|
@@ -406,15 +436,19 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
406
436
|
shipments: 0,
|
|
407
437
|
shipments_with_cost: 0,
|
|
408
438
|
zero_cost_shipments: 0,
|
|
409
|
-
total_cost: 0
|
|
439
|
+
total_cost: 0,
|
|
440
|
+
total_buyer_shipping_paid: 0,
|
|
441
|
+
orders_with_buyer_shipping_paid: 0
|
|
410
442
|
}));
|
|
411
443
|
bucket.shipments += 1;
|
|
412
444
|
bucket.total_cost += shipmentCost;
|
|
445
|
+
bucket.total_buyer_shipping_paid += buyerShippingPaid;
|
|
413
446
|
if (shipmentCost > 0) {
|
|
414
447
|
bucket.shipments_with_cost += 1;
|
|
415
448
|
} else {
|
|
416
449
|
bucket.zero_cost_shipments += 1;
|
|
417
450
|
}
|
|
451
|
+
bucket.orders_with_buyer_shipping_paid += ordersWithBuyerShippingPaid;
|
|
418
452
|
if (dayBucket) {
|
|
419
453
|
const dayMetric = dailyMetrics.get(dayBucket) ?? {
|
|
420
454
|
date: dayBucket,
|
|
@@ -440,14 +474,15 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
440
474
|
if (responseMode === "shipments_chunk") {
|
|
441
475
|
shipmentRows.push(
|
|
442
476
|
formatCompactShipmentRow({
|
|
443
|
-
orderId: normalizeScalarString(
|
|
477
|
+
orderId: normalizeScalarString(primaryOrder?.id),
|
|
444
478
|
shipmentId,
|
|
445
479
|
status: shipmentStatus,
|
|
446
480
|
substatus: shipmentSubstatus,
|
|
447
481
|
logisticType,
|
|
448
482
|
mode,
|
|
449
483
|
currencyId,
|
|
450
|
-
cost: shipmentCost
|
|
484
|
+
cost: shipmentCost,
|
|
485
|
+
buyerShippingPaid
|
|
451
486
|
})
|
|
452
487
|
);
|
|
453
488
|
}
|
|
@@ -455,6 +490,7 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
455
490
|
}
|
|
456
491
|
for (const metrics of Object.values(costsByCurrency)) {
|
|
457
492
|
metrics.total_cost = roundMoney(metrics.total_cost);
|
|
493
|
+
metrics.total_buyer_shipping_paid = roundMoney(metrics.total_buyer_shipping_paid);
|
|
458
494
|
}
|
|
459
495
|
const metadata = buildShippingSummaryMetadata({
|
|
460
496
|
total: paging.total,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-shipping-summary.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreShipmentBatch,\n getMercadoLibreShipmentCostsBatch,\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeScalarString,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst SHIPPING_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_CALCULATIONS_PAGE_LIMIT = 50;\nconst DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT = 50;\nconst BUSINESS_TIME_ZONE = \"America/Argentina/Buenos_Aires\";\nconst TOP_LIMIT = 10;\nconst shipmentsSchema = [\n \"order_id\",\n \"shipment_id\",\n \"status\",\n \"substatus\",\n \"logistic_type\",\n \"mode\",\n \"currency_id\",\n \"cost\",\n] as const;\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype ShipmentFailure = {\n order_id?: string;\n shipment_id?: string;\n stage: \"shipment\" | \"costs\";\n message: string;\n status_code?: number;\n attempts?: number;\n retryable?: boolean;\n};\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype ShippingMode = \"calculations\" | \"shipments_chunk\";\n\ntype ShippingMetadata = ReturnType<typeof buildShippingSummaryMetadata>;\n\ntype ShippingCostBucket = {\n shipments: number;\n shipments_with_cost: number;\n zero_cost_shipments: number;\n total_cost: number;\n};\n\ntype DailyShippingMetric = {\n date: string;\n shipments: number;\n delivered_shipments: number;\n cancelled_shipments: number;\n not_delivered_shipments: number;\n shipping_cost_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n total: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, total),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, total) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction topSingleValue(counts: Map<string, number>): string {\n return Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, amount]) => [currencyId, roundMoney(amount)])\n );\n}\n\nfunction formatDateInTimeZone(dateValue: Date, timeZone: string): string {\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n\n const parts = formatter.formatToParts(dateValue);\n const year = parts.find((part) => part.type === \"year\")?.value;\n const month = parts.find((part) => part.type === \"month\")?.value;\n const day = parts.find((part) => part.type === \"day\")?.value;\n\n if (!year || !month || !day) {\n return \"\";\n }\n\n return `${year}-${month}-${day}`;\n}\n\nfunction getLocalDateBucket(createdAt: string, timeZone: string): string {\n if (!createdAt) {\n return \"\";\n }\n\n const date = new Date(createdAt);\n if (Number.isNaN(date.getTime())) {\n return \"\";\n }\n\n return formatDateInTimeZone(date, timeZone);\n}\n\nfunction buildShippingSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: ShippingMode;\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n shipmentFailures: number;\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset =\n params.responseMode === \"shipments_chunk\"\n ? requestedWindowEndOffset\n : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const hasFailures = params.pagesFailed > 0 || params.shipmentFailures > 0;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && !hasFailures && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"shipments_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.shipmentFailures > 0) {\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron shipments parciales. Reintentar la misma tool con responseMode=\"shipments_chunk\", offset=${params.effectiveOffset} y limit=${params.effectiveLimit}${hasMoreOrders ? `. Luego continuar con offset=${nextOffset} si hace falta.` : \".\"}`\n : 'Calculos parciales por fallas al consultar shipments o costos. Reintentar la misma tool con responseMode=\"calculations\".';\n } else if (params.responseMode === \"shipments_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo shipments, volver a invocar meli_get_shipping_summary con los mismos filtros, responseMode=\"shipments_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de shipments, invocar la misma tool con responseMode=\"shipments_chunk\", offset=0 y limit=50.';\n }\n\n return stripNulls({\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"shipments_chunk\" ? hasMoreOrders || hasFailures : hasFailures,\n next_offset: params.responseMode === \"shipments_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"shipments_chunk\" ? \"shipments_chunk\" : \"full_calculations\",\n pages_per_call_limit:\n params.responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n shipment_failures: params.shipmentFailures,\n universe_fully_fetched: universeFullyFetched,\n });\n}\n\nfunction extractShipmentCost(costs: Record<string, unknown>) {\n return (\n toNumber(asRecord(costs.senders).cost) ||\n toNumber(asRecord(costs.receiver).cost) ||\n toNumber(costs.gross_amount) ||\n toNumber(costs.cost)\n );\n}\n\nfunction formatCompactShipmentRow(params: {\n orderId: string;\n shipmentId: string;\n status: string;\n substatus: string;\n logisticType: string;\n mode: string;\n currencyId: string;\n cost: number;\n}) {\n return [\n params.orderId,\n params.shipmentId,\n params.status,\n params.substatus,\n params.logisticType,\n params.mode,\n params.currencyId,\n params.cost,\n ];\n}\n\nfunction buildShippingCalculations(params: {\n ordersTotal: number;\n ordersWithShipping: number;\n shipmentsRequested: number;\n shipmentsInspected: number;\n deliveredShipments: number;\n cancelledShipments: number;\n notDeliveredShipments: number;\n statusCounts: Map<string, number>;\n substatusCounts: Map<string, number>;\n logisticTypeCounts: Map<string, number>;\n modeCounts: Map<string, number>;\n costsByCurrency: Record<string, ShippingCostBucket>;\n dailyMetrics: Map<string, DailyShippingMetric>;\n metadata: ShippingMetadata;\n failedPages: FailedPage[];\n shipmentFailures: ShipmentFailure[];\n}) {\n const costsByCurrency = Object.fromEntries(\n Object.entries(params.costsByCurrency)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [\n currencyId,\n {\n total_shipping_cost: roundMoney(bucket.total_cost),\n shipments: bucket.shipments,\n shipments_with_cost: bucket.shipments_with_cost,\n zero_cost_shipments: bucket.zero_cost_shipments,\n avg_cost_per_shipment: roundMoney(bucket.total_cost / Math.max(1, bucket.shipments)),\n avg_cost_per_shipment_with_cost: roundMoney(\n bucket.total_cost / Math.max(1, bucket.shipments_with_cost)\n ),\n shipping_cost_rate_by_shipment: safeRate(bucket.shipments_with_cost, bucket.shipments),\n },\n ])\n );\n\n const dailyTrend = Array.from(params.dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, metric]) =>\n stripNulls({\n date: metric.date,\n shipments: metric.shipments,\n delivered_shipments: metric.delivered_shipments,\n cancelled_shipments: metric.cancelled_shipments,\n not_delivered_shipments: metric.not_delivered_shipments,\n shipping_cost_by_currency: sortedCurrencyTotals(metric.shipping_cost_by_currency),\n })\n );\n\n return {\n overview: {\n orders_total: params.ordersTotal,\n orders_with_shipping: params.ordersWithShipping,\n shipments_total: params.shipmentsInspected,\n shipments_requested: params.shipmentsRequested,\n shipping_attachment_rate: safeRate(params.ordersWithShipping, params.ordersTotal),\n delivered_shipments: params.deliveredShipments,\n cancelled_shipments: params.cancelledShipments,\n not_delivered_shipments: params.notDeliveredShipments,\n },\n delivery_health: {\n status_breakdown: topBreakdownFromMap(params.statusCounts, Math.max(1, params.shipmentsInspected)),\n substatus_breakdown: topBreakdownFromMap(params.substatusCounts, Math.max(1, params.shipmentsInspected)),\n delivered_rate: safeRate(params.deliveredShipments, params.shipmentsInspected),\n cancelled_rate: safeRate(params.cancelledShipments, params.shipmentsInspected),\n not_delivered_rate: safeRate(params.notDeliveredShipments, params.shipmentsInspected),\n },\n costs_by_currency: costsByCurrency,\n logistics_mix: {\n logistic_type_breakdown: topBreakdownFromMap(\n params.logisticTypeCounts,\n Math.max(1, params.shipmentsInspected)\n ),\n mode_breakdown: topBreakdownFromMap(params.modeCounts, Math.max(1, params.shipmentsInspected)),\n top_logistic_type_by_shipments: topSingleValue(params.logisticTypeCounts),\n top_mode_by_shipments: topSingleValue(params.modeCounts),\n },\n daily_trend: dailyTrend,\n coverage: {\n fetch_mode: params.metadata.fetch_mode,\n universe_fully_fetched: params.metadata.universe_fully_fetched,\n orders_returned: params.metadata.returned,\n shipments_requested: params.shipmentsRequested,\n shipments_inspected: params.shipmentsInspected,\n pages_requested: params.metadata.pages_requested,\n pages_succeeded: params.metadata.pages_succeeded,\n pages_failed: params.metadata.pages_failed,\n failed_pages_count: params.failedPages.length,\n shipment_failures_count: params.shipmentFailures.length,\n failed_pages: params.failedPages,\n },\n };\n}\n\nexport const meliGetShippingSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\n responseMode: z\n .enum([\"calculations\", \"shipments_chunk\"])\n .optional()\n .default(\"calculations\")\n .describe(\n 'Response mode. calculations (default) fetches all matching orders internally and returns only aggregate shipping KPIs. shipments_chunk returns compact shipment rows for up to 15 MercadoLibre pages and includes continuation metadata.'\n ),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n 'MercadoLibre page size for responseMode=\"shipments_chunk\" (1-50). Defaults to 50.'\n ),\n offset: z\n .number()\n .int()\n .min(0)\n .max(5000)\n .optional()\n .describe(\n 'Starting offset for responseMode=\"shipments_chunk\". Use metadata.next_offset to continue.'\n ),\n});\n\nexport async function meliGetShippingSummaryHandler(\n params: z.infer<typeof meliGetShippingSummarySchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit =\n responseMode === \"shipments_chunk\"\n ? params.limit ?? DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT\n : DEFAULT_CALCULATIONS_PAGE_LIMIT;\n const requestedOffset = responseMode === \"shipments_chunk\" ? params.offset ?? 0 : 0;\n const maxPagesForResponse =\n responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: requestedLimit,\n offset: requestedOffset,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"shipments_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const ordersWithShipping = allOrders.reduce((count, order) => {\n return normalizeScalarString(asRecord(order.shipping).id) ? count + 1 : count;\n }, 0);\n\n const orderByShipmentId = new Map<string, Record<string, unknown>>();\n for (const order of allOrders) {\n const shipmentId = normalizeScalarString(asRecord(order.shipping).id);\n if (shipmentId && !orderByShipmentId.has(shipmentId)) {\n orderByShipmentId.set(shipmentId, order);\n }\n }\n\n const shipmentIds = [...orderByShipmentId.keys()];\n const statusCounts = new Map<string, number>();\n const substatusCounts = new Map<string, number>();\n const logisticTypeCounts = new Map<string, number>();\n const modeCounts = new Map<string, number>();\n const costsByCurrency: Record<string, ShippingCostBucket> = {};\n const dailyMetrics = new Map<string, DailyShippingMetric>();\n const failures: ShipmentFailure[] = [];\n const shipmentRows: Array<(string | number)[]> = [];\n let shipmentsInspected = 0;\n let deliveredShipments = 0;\n let cancelledShipments = 0;\n let notDeliveredShipments = 0;\n\n if (shipmentIds.length > 0) {\n const [shipmentsBatch, costsBatch] = await Promise.all([\n getMercadoLibreShipmentBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n getMercadoLibreShipmentCostsBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n ]);\n\n const shipmentById = new Map(\n shipmentsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n const costsByShipmentId = new Map(\n costsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n\n shipmentsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(orderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"shipment\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n costsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(orderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"costs\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n for (const shipmentId of shipmentIds) {\n const shipment = shipmentById.get(shipmentId);\n const costs = costsByShipmentId.get(shipmentId);\n if (!shipment || !costs) {\n continue;\n }\n\n const order = orderByShipmentId.get(shipmentId);\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\n const logisticType = normalizeString(shipment.logistic_type);\n const mode = normalizeString(shipment.mode);\n const currencyId = normalizeString(order?.currency_id, \"UNKNOWN\");\n const shipmentCost = roundMoney(extractShipmentCost(costs));\n const dayBucket = getLocalDateBucket(normalizeString(order?.date_created), BUSINESS_TIME_ZONE);\n\n shipmentsInspected += 1;\n incrementCount(statusCounts, shipmentStatus);\n incrementCount(substatusCounts, shipmentSubstatus);\n incrementCount(logisticTypeCounts, logisticType || \"unknown\");\n incrementCount(modeCounts, mode || \"unknown\");\n\n if (shipmentStatus === \"delivered\") {\n deliveredShipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n cancelledShipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n notDeliveredShipments += 1;\n }\n\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({\n shipments: 0,\n shipments_with_cost: 0,\n zero_cost_shipments: 0,\n total_cost: 0,\n }));\n bucket.shipments += 1;\n bucket.total_cost += shipmentCost;\n if (shipmentCost > 0) {\n bucket.shipments_with_cost += 1;\n } else {\n bucket.zero_cost_shipments += 1;\n }\n\n if (dayBucket) {\n const dayMetric = dailyMetrics.get(dayBucket) ?? {\n date: dayBucket,\n shipments: 0,\n delivered_shipments: 0,\n cancelled_shipments: 0,\n not_delivered_shipments: 0,\n shipping_cost_by_currency: {},\n };\n dayMetric.shipments += 1;\n if (shipmentStatus === \"delivered\") {\n dayMetric.delivered_shipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n dayMetric.cancelled_shipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n dayMetric.not_delivered_shipments += 1;\n }\n incrementCurrency(dayMetric.shipping_cost_by_currency, currencyId, shipmentCost);\n dailyMetrics.set(dayBucket, dayMetric);\n }\n\n if (responseMode === \"shipments_chunk\") {\n shipmentRows.push(\n formatCompactShipmentRow({\n orderId: normalizeScalarString(order?.id),\n shipmentId,\n status: shipmentStatus,\n substatus: shipmentSubstatus,\n logisticType,\n mode,\n currencyId,\n cost: shipmentCost,\n })\n );\n }\n }\n }\n\n for (const metrics of Object.values(costsByCurrency)) {\n metrics.total_cost = roundMoney(metrics.total_cost);\n }\n\n const metadata = buildShippingSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned: allOrders.length,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n shipmentFailures: failures.length,\n });\n\n const calculations =\n responseMode === \"calculations\"\n ? buildShippingCalculations({\n ordersTotal: allOrders.length,\n ordersWithShipping,\n shipmentsRequested: shipmentIds.length,\n shipmentsInspected,\n deliveredShipments,\n cancelledShipments,\n notDeliveredShipments,\n statusCounts,\n substatusCounts,\n logisticTypeCounts,\n modeCounts,\n costsByCurrency,\n dailyMetrics,\n metadata,\n failedPages,\n shipmentFailures: failures,\n })\n : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata,\n shipments_schema: responseMode === \"shipments_chunk\" ? shipmentsSchema : undefined,\n shipments: responseMode === \"shipments_chunk\" ? shipmentRows : undefined,\n calculations,\n failures: failures.length > 0 ? failures : undefined,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to summarize MercadoLibre shipping\"));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreShipmentBatch,\n getMercadoLibreShipmentCostsBatch,\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeScalarString,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst SHIPPING_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_CALCULATIONS_PAGE_LIMIT = 50;\nconst DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT = 50;\nconst BUSINESS_TIME_ZONE = \"America/Argentina/Buenos_Aires\";\nconst TOP_LIMIT = 10;\nconst shipmentsSchema = [\n \"order_id\",\n \"shipment_id\",\n \"status\",\n \"substatus\",\n \"logistic_type\",\n \"mode\",\n \"currency_id\",\n \"cost\",\n \"buyer_shipping_paid\",\n] as const;\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype ShipmentFailure = {\n order_id?: string;\n shipment_id?: string;\n stage: \"shipment\" | \"costs\";\n message: string;\n status_code?: number;\n attempts?: number;\n retryable?: boolean;\n};\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype ShippingMode = \"calculations\" | \"shipments_chunk\";\n\ntype ShippingMetadata = ReturnType<typeof buildShippingSummaryMetadata>;\n\ntype ShippingCostBucket = {\n shipments: number;\n shipments_with_cost: number;\n zero_cost_shipments: number;\n total_cost: number;\n total_buyer_shipping_paid: number;\n orders_with_buyer_shipping_paid: number;\n};\n\nfunction getFirstPayment(order: Record<string, unknown>) {\n return asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n}\n\ntype DailyShippingMetric = {\n date: string;\n shipments: number;\n delivered_shipments: number;\n cancelled_shipments: number;\n not_delivered_shipments: number;\n shipping_cost_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n total: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, total),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, total) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction topSingleValue(counts: Map<string, number>): string {\n return Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, amount]) => [currencyId, roundMoney(amount)])\n );\n}\n\nfunction formatDateInTimeZone(dateValue: Date, timeZone: string): string {\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n\n const parts = formatter.formatToParts(dateValue);\n const year = parts.find((part) => part.type === \"year\")?.value;\n const month = parts.find((part) => part.type === \"month\")?.value;\n const day = parts.find((part) => part.type === \"day\")?.value;\n\n if (!year || !month || !day) {\n return \"\";\n }\n\n return `${year}-${month}-${day}`;\n}\n\nfunction getLocalDateBucket(createdAt: string, timeZone: string): string {\n if (!createdAt) {\n return \"\";\n }\n\n const date = new Date(createdAt);\n if (Number.isNaN(date.getTime())) {\n return \"\";\n }\n\n return formatDateInTimeZone(date, timeZone);\n}\n\nfunction buildShippingSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: ShippingMode;\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n shipmentFailures: number;\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset =\n params.responseMode === \"shipments_chunk\"\n ? requestedWindowEndOffset\n : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const hasFailures = params.pagesFailed > 0 || params.shipmentFailures > 0;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && !hasFailures && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"shipments_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.shipmentFailures > 0) {\n continuation =\n params.responseMode === \"shipments_chunk\"\n ? `Se recuperaron shipments parciales. Reintentar la misma tool con responseMode=\"shipments_chunk\", offset=${params.effectiveOffset} y limit=${params.effectiveLimit}${hasMoreOrders ? `. Luego continuar con offset=${nextOffset} si hace falta.` : \".\"}`\n : 'Calculos parciales por fallas al consultar shipments o costos. Reintentar la misma tool con responseMode=\"calculations\".';\n } else if (params.responseMode === \"shipments_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo shipments, volver a invocar meli_get_shipping_summary con los mismos filtros, responseMode=\"shipments_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de shipments, invocar la misma tool con responseMode=\"shipments_chunk\", offset=0 y limit=50.';\n }\n\n return stripNulls({\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"shipments_chunk\" ? hasMoreOrders || hasFailures : hasFailures,\n next_offset: params.responseMode === \"shipments_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"shipments_chunk\" ? \"shipments_chunk\" : \"full_calculations\",\n pages_per_call_limit:\n params.responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n shipment_failures: params.shipmentFailures,\n universe_fully_fetched: universeFullyFetched,\n });\n}\n\nfunction extractShipmentCost(costs: Record<string, unknown>) {\n return (\n toNumber(asRecord(costs.senders).cost) ||\n toNumber(asRecord(costs.receiver).cost) ||\n toNumber(costs.gross_amount) ||\n toNumber(costs.cost)\n );\n}\n\nfunction formatCompactShipmentRow(params: {\n orderId: string;\n shipmentId: string;\n status: string;\n substatus: string;\n logisticType: string;\n mode: string;\n currencyId: string;\n cost: number;\n buyerShippingPaid: number;\n}) {\n return [\n params.orderId,\n params.shipmentId,\n params.status,\n params.substatus,\n params.logisticType,\n params.mode,\n params.currencyId,\n params.cost,\n params.buyerShippingPaid,\n ];\n}\n\nfunction buildShippingCalculations(params: {\n ordersTotal: number;\n ordersWithShipping: number;\n shipmentsRequested: number;\n shipmentsInspected: number;\n deliveredShipments: number;\n cancelledShipments: number;\n notDeliveredShipments: number;\n statusCounts: Map<string, number>;\n substatusCounts: Map<string, number>;\n logisticTypeCounts: Map<string, number>;\n modeCounts: Map<string, number>;\n costsByCurrency: Record<string, ShippingCostBucket>;\n dailyMetrics: Map<string, DailyShippingMetric>;\n metadata: ShippingMetadata;\n failedPages: FailedPage[];\n shipmentFailures: ShipmentFailure[];\n}) {\n const costsByCurrency = Object.fromEntries(\n Object.entries(params.costsByCurrency)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [\n currencyId,\n {\n total_shipping_cost: roundMoney(bucket.total_cost),\n shipments: bucket.shipments,\n shipments_with_cost: bucket.shipments_with_cost,\n zero_cost_shipments: bucket.zero_cost_shipments,\n buyer_shipping_paid_total: roundMoney(bucket.total_buyer_shipping_paid),\n orders_with_buyer_shipping_paid: bucket.orders_with_buyer_shipping_paid,\n avg_buyer_shipping_paid_per_order_with_payment: roundMoney(\n bucket.total_buyer_shipping_paid / Math.max(1, bucket.orders_with_buyer_shipping_paid)\n ),\n avg_cost_per_shipment: roundMoney(bucket.total_cost / Math.max(1, bucket.shipments)),\n avg_cost_per_shipment_with_cost: roundMoney(\n bucket.total_cost / Math.max(1, bucket.shipments_with_cost)\n ),\n shipping_cost_rate_by_shipment: safeRate(bucket.shipments_with_cost, bucket.shipments),\n },\n ])\n );\n\n const dailyTrend = Array.from(params.dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, metric]) =>\n stripNulls({\n date: metric.date,\n shipments: metric.shipments,\n delivered_shipments: metric.delivered_shipments,\n cancelled_shipments: metric.cancelled_shipments,\n not_delivered_shipments: metric.not_delivered_shipments,\n shipping_cost_by_currency: sortedCurrencyTotals(metric.shipping_cost_by_currency),\n })\n );\n\n return {\n overview: {\n orders_total: params.ordersTotal,\n orders_with_shipping: params.ordersWithShipping,\n shipments_total: params.shipmentsInspected,\n shipments_requested: params.shipmentsRequested,\n shipping_attachment_rate: safeRate(params.ordersWithShipping, params.ordersTotal),\n delivered_shipments: params.deliveredShipments,\n cancelled_shipments: params.cancelledShipments,\n not_delivered_shipments: params.notDeliveredShipments,\n },\n delivery_health: {\n status_breakdown: topBreakdownFromMap(params.statusCounts, Math.max(1, params.shipmentsInspected)),\n substatus_breakdown: topBreakdownFromMap(params.substatusCounts, Math.max(1, params.shipmentsInspected)),\n delivered_rate: safeRate(params.deliveredShipments, params.shipmentsInspected),\n cancelled_rate: safeRate(params.cancelledShipments, params.shipmentsInspected),\n not_delivered_rate: safeRate(params.notDeliveredShipments, params.shipmentsInspected),\n },\n costs_by_currency: costsByCurrency,\n logistics_mix: {\n logistic_type_breakdown: topBreakdownFromMap(\n params.logisticTypeCounts,\n Math.max(1, params.shipmentsInspected)\n ),\n mode_breakdown: topBreakdownFromMap(params.modeCounts, Math.max(1, params.shipmentsInspected)),\n top_logistic_type_by_shipments: topSingleValue(params.logisticTypeCounts),\n top_mode_by_shipments: topSingleValue(params.modeCounts),\n },\n daily_trend: dailyTrend,\n coverage: {\n fetch_mode: params.metadata.fetch_mode,\n universe_fully_fetched: params.metadata.universe_fully_fetched,\n orders_returned: params.metadata.returned,\n shipments_requested: params.shipmentsRequested,\n shipments_inspected: params.shipmentsInspected,\n pages_requested: params.metadata.pages_requested,\n pages_succeeded: params.metadata.pages_succeeded,\n pages_failed: params.metadata.pages_failed,\n failed_pages_count: params.failedPages.length,\n shipment_failures_count: params.shipmentFailures.length,\n failed_pages: params.failedPages,\n },\n };\n}\n\nexport const meliGetShippingSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\n responseMode: z\n .enum([\"calculations\", \"shipments_chunk\"])\n .optional()\n .default(\"calculations\")\n .describe(\n 'Response mode. calculations (default) fetches all matching orders internally and returns only aggregate shipping KPIs. shipments_chunk returns compact shipment rows for up to 15 MercadoLibre pages and includes continuation metadata.'\n ),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n 'MercadoLibre page size for responseMode=\"shipments_chunk\" (1-50). Defaults to 50.'\n ),\n offset: z\n .number()\n .int()\n .min(0)\n .max(5000)\n .optional()\n .describe(\n 'Starting offset for responseMode=\"shipments_chunk\". Use metadata.next_offset to continue.'\n ),\n});\n\nexport async function meliGetShippingSummaryHandler(\n params: z.infer<typeof meliGetShippingSummarySchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit =\n responseMode === \"shipments_chunk\"\n ? params.limit ?? DEFAULT_SHIPPING_DETAIL_PAGE_LIMIT\n : DEFAULT_CALCULATIONS_PAGE_LIMIT;\n const requestedOffset = responseMode === \"shipments_chunk\" ? params.offset ?? 0 : 0;\n const maxPagesForResponse =\n responseMode === \"shipments_chunk\" ? SHIPPING_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: requestedLimit,\n offset: requestedOffset,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"shipments_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const ordersWithShipping = allOrders.reduce((count, order) => {\n return normalizeScalarString(asRecord(order.shipping).id) ? count + 1 : count;\n }, 0);\n\n const ordersByShipmentId = new Map<string, Record<string, unknown>[]>();\n const primaryOrderByShipmentId = new Map<string, Record<string, unknown>>();\n for (const order of allOrders) {\n const shipmentId = normalizeScalarString(asRecord(order.shipping).id);\n if (!shipmentId) {\n continue;\n }\n\n const shipmentOrders = ordersByShipmentId.get(shipmentId);\n if (shipmentOrders) {\n shipmentOrders.push(order);\n } else {\n ordersByShipmentId.set(shipmentId, [order]);\n primaryOrderByShipmentId.set(shipmentId, order);\n }\n }\n\n const shipmentIds = [...ordersByShipmentId.keys()];\n const statusCounts = new Map<string, number>();\n const substatusCounts = new Map<string, number>();\n const logisticTypeCounts = new Map<string, number>();\n const modeCounts = new Map<string, number>();\n const costsByCurrency: Record<string, ShippingCostBucket> = {};\n const dailyMetrics = new Map<string, DailyShippingMetric>();\n const failures: ShipmentFailure[] = [];\n const shipmentRows: Array<(string | number)[]> = [];\n let shipmentsInspected = 0;\n let deliveredShipments = 0;\n let cancelledShipments = 0;\n let notDeliveredShipments = 0;\n\n if (shipmentIds.length > 0) {\n const [shipmentsBatch, costsBatch] = await Promise.all([\n getMercadoLibreShipmentBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n getMercadoLibreShipmentCostsBatch(profileId, shipmentIds, {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }),\n ]);\n\n const shipmentById = new Map(\n shipmentsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n const costsByShipmentId = new Map(\n costsBatch.successful.map((entry) => [entry.id, entry.document] as const)\n );\n\n shipmentsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"shipment\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n costsBatch.failed.forEach((failure) => {\n failures.push({\n order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),\n shipment_id: failure.id,\n stage: \"costs\",\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n\n for (const shipmentId of shipmentIds) {\n const shipment = shipmentById.get(shipmentId);\n const costs = costsByShipmentId.get(shipmentId);\n if (!shipment || !costs) {\n continue;\n }\n\n const shipmentOrders = ordersByShipmentId.get(shipmentId) ?? [];\n const primaryOrder = primaryOrderByShipmentId.get(shipmentId);\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\n const logisticType = normalizeString(shipment.logistic_type);\n const mode = normalizeString(shipment.mode);\n const currencyId = normalizeString(primaryOrder?.currency_id, \"UNKNOWN\");\n const shipmentCost = roundMoney(extractShipmentCost(costs));\n const buyerShippingPaid = roundMoney(\n shipmentOrders.reduce((sum, shipmentOrder) => {\n return sum + roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost));\n }, 0)\n );\n const ordersWithBuyerShippingPaid = shipmentOrders.reduce((count, shipmentOrder) => {\n return roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost)) > 0 ? count + 1 : count;\n }, 0);\n const dayBucket = getLocalDateBucket(\n normalizeString(primaryOrder?.date_created),\n BUSINESS_TIME_ZONE\n );\n\n shipmentsInspected += 1;\n incrementCount(statusCounts, shipmentStatus);\n incrementCount(substatusCounts, shipmentSubstatus);\n incrementCount(logisticTypeCounts, logisticType || \"unknown\");\n incrementCount(modeCounts, mode || \"unknown\");\n\n if (shipmentStatus === \"delivered\") {\n deliveredShipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n cancelledShipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n notDeliveredShipments += 1;\n }\n\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({\n shipments: 0,\n shipments_with_cost: 0,\n zero_cost_shipments: 0,\n total_cost: 0,\n total_buyer_shipping_paid: 0,\n orders_with_buyer_shipping_paid: 0,\n }));\n bucket.shipments += 1;\n bucket.total_cost += shipmentCost;\n bucket.total_buyer_shipping_paid += buyerShippingPaid;\n if (shipmentCost > 0) {\n bucket.shipments_with_cost += 1;\n } else {\n bucket.zero_cost_shipments += 1;\n }\n bucket.orders_with_buyer_shipping_paid += ordersWithBuyerShippingPaid;\n\n if (dayBucket) {\n const dayMetric = dailyMetrics.get(dayBucket) ?? {\n date: dayBucket,\n shipments: 0,\n delivered_shipments: 0,\n cancelled_shipments: 0,\n not_delivered_shipments: 0,\n shipping_cost_by_currency: {},\n };\n dayMetric.shipments += 1;\n if (shipmentStatus === \"delivered\") {\n dayMetric.delivered_shipments += 1;\n }\n if (shipmentStatus === \"cancelled\") {\n dayMetric.cancelled_shipments += 1;\n }\n if (shipmentStatus === \"not_delivered\") {\n dayMetric.not_delivered_shipments += 1;\n }\n incrementCurrency(dayMetric.shipping_cost_by_currency, currencyId, shipmentCost);\n dailyMetrics.set(dayBucket, dayMetric);\n }\n\n if (responseMode === \"shipments_chunk\") {\n shipmentRows.push(\n formatCompactShipmentRow({\n orderId: normalizeScalarString(primaryOrder?.id),\n shipmentId,\n status: shipmentStatus,\n substatus: shipmentSubstatus,\n logisticType,\n mode,\n currencyId,\n cost: shipmentCost,\n buyerShippingPaid,\n })\n );\n }\n }\n }\n\n for (const metrics of Object.values(costsByCurrency)) {\n metrics.total_cost = roundMoney(metrics.total_cost);\n metrics.total_buyer_shipping_paid = roundMoney(metrics.total_buyer_shipping_paid);\n }\n\n const metadata = buildShippingSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned: allOrders.length,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n shipmentFailures: failures.length,\n });\n\n const calculations =\n responseMode === \"calculations\"\n ? buildShippingCalculations({\n ordersTotal: allOrders.length,\n ordersWithShipping,\n shipmentsRequested: shipmentIds.length,\n shipmentsInspected,\n deliveredShipments,\n cancelledShipments,\n notDeliveredShipments,\n statusCounts,\n substatusCounts,\n logisticTypeCounts,\n modeCounts,\n costsByCurrency,\n dailyMetrics,\n metadata,\n failedPages,\n shipmentFailures: failures,\n })\n : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata,\n shipments_schema: responseMode === \"shipments_chunk\" ? shipmentsSchema : undefined,\n shipments: responseMode === \"shipments_chunk\" ? shipmentRows : undefined,\n calculations,\n failures: failures.length > 0 ? failures : undefined,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to summarize MercadoLibre shipping\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -525,9 +525,15 @@ describe("MercadoLibre medium tool handlers batch 4", () => {
|
|
|
525
525
|
{
|
|
526
526
|
id: 999,
|
|
527
527
|
status: "approved",
|
|
528
|
+
status_detail: "accredited",
|
|
529
|
+
payment_method_id: "visa",
|
|
528
530
|
payment_type: "credit_card",
|
|
529
531
|
installments: 3,
|
|
530
|
-
total_paid_amount: 200
|
|
532
|
+
total_paid_amount: 200,
|
|
533
|
+
transaction_amount: 210,
|
|
534
|
+
transaction_amount_refunded: 10,
|
|
535
|
+
shipping_cost: 15,
|
|
536
|
+
coupon_amount: 5
|
|
531
537
|
}
|
|
532
538
|
],
|
|
533
539
|
tags: ["packed"]
|
|
@@ -568,16 +574,22 @@ describe("MercadoLibre medium tool handlers batch 4", () => {
|
|
|
568
574
|
paid_amount: 200,
|
|
569
575
|
payments: [
|
|
570
576
|
{
|
|
571
|
-
id: "",
|
|
577
|
+
id: "999",
|
|
572
578
|
status: "approved",
|
|
579
|
+
status_detail: "accredited",
|
|
580
|
+
payment_method_id: "visa",
|
|
573
581
|
payment_type: "credit_card",
|
|
574
582
|
installments: 3,
|
|
575
|
-
total_paid_amount: 200
|
|
583
|
+
total_paid_amount: 200,
|
|
584
|
+
transaction_amount: 210,
|
|
585
|
+
transaction_amount_refunded: 10,
|
|
586
|
+
shipping_cost: 15,
|
|
587
|
+
coupon_amount: 5
|
|
576
588
|
}
|
|
577
589
|
],
|
|
578
590
|
seller: { id: "", nickname: "seller-1" },
|
|
579
591
|
shipping: {
|
|
580
|
-
id: "",
|
|
592
|
+
id: "1",
|
|
581
593
|
status: "ready_to_ship",
|
|
582
594
|
substatus: "",
|
|
583
595
|
mode: "",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../tests/meli/mercadolibre-tool-handlers-medium-batch4.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { meliSearchItemsHandler } from \"../../src/tools/mercadolibre/search-items.js\";\nimport { meliGetStorePerformanceHandler } from \"../../src/tools/mercadolibre/get-store-performance.js\";\nimport { meliGetSalesByItemHandler } from \"../../src/tools/mercadolibre/get-sales-by-item.js\";\nimport { meliGetSalesTrendHandler } from \"../../src/tools/mercadolibre/get-sales-trend.js\";\nimport { meliGetOrderDetailsHandler } from \"../../src/tools/mercadolibre/get-order-details.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"../../src/tools/mercadolibre/profile-resolution.js\";\nimport { getMercadoLibreAccessForProfile } from \"../../src/config/mercadolibre.js\";\nimport {\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../src/services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreItemDetailsBatch,\n getMercadoLibreItemDetailsWithFallbackBatch,\n getMercadoLibreUserItemsVisits,\n searchMercadoLibreItems,\n searchMercadoLibreItemsBatch,\n} from \"../../src/services/mercadolibre/mercadolibre-items.js\";\nimport {\n getMercadoLibreOrder,\n getMercadoLibreOrderDetailsBatch,\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../src/services/mercadolibre/mercadolibre-orders.js\";\n\nvi.mock(\"mcp-use/server\", () => ({\n object: vi.fn((payload: unknown) => ({ kind: \"object\", payload })),\n error: vi.fn((message: string) => ({ kind: \"error\", message })),\n}));\n\nvi.mock(\"../../src/tools/mercadolibre/profile-resolution.js\", () => ({\n resolveMercadoLibreProfileOrSelection: vi.fn(),\n}));\n\nvi.mock(\"../../src/config/mercadolibre.js\", () => ({\n getMercadoLibreAccessForProfile: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-api.js\", () => ({\n formatMercadoLibreError: vi.fn(\n (err: unknown, fallback: string) =>\n `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`\n ),\n normalizeMercadoLibrePaging: vi.fn((paging: unknown) => paging),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-items.js\", () => ({\n searchMercadoLibreItems: vi.fn(),\n searchMercadoLibreItemsBatch: vi.fn(),\n getMercadoLibreItemDetailsBatch: vi.fn(),\n getMercadoLibreItemDetailsWithFallbackBatch: vi.fn(),\n getMercadoLibreUserItemsVisits: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-orders.js\", () => ({\n searchMercadoLibreOrders: vi.fn(),\n searchMercadoLibreOrdersBatch: vi.fn(),\n getMercadoLibreOrder: vi.fn(),\n getMercadoLibreOrderDetailsBatch: vi.fn(),\n}));\n\ndescribe(\"MercadoLibre medium tool handlers batch 4\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n\n vi.mocked(getMercadoLibreAccessForProfile).mockResolvedValue({\n sellerId: \"seller-99\",\n scopes: [\"read\"],\n expiresAt: \"2026-07-01T00:00:00.000Z\",\n } as never);\n\n vi.mocked(normalizeMercadoLibrePaging).mockImplementation((paging) => paging as never);\n });\n\n it(\"searches items with the default active status and compact item rows\", async () => {\n vi.mocked(searchMercadoLibreItems).mockResolvedValue({\n results: [\"MLA1\", \"MLA2\"],\n paging: { total: 2, limit: 50, offset: 0 },\n } as never);\n vi.mocked(getMercadoLibreItemDetailsBatch).mockResolvedValue([\n {\n id: \"MLA1\",\n title: \"Boots\",\n status: \"active\",\n price: 100,\n currency_id: \"ARS\",\n available_quantity: 3,\n sold_quantity: 8,\n listing_type_id: \"gold_special\",\n category_id: \"MLA123\",\n },\n {\n id: \"MLA2\",\n title: \"Sneakers\",\n status: \"paused\",\n price: 250,\n currency_id: \"USD\",\n available_quantity: 1,\n sold_quantity: 2,\n listing_type_id: \"gold_pro\",\n category_id: \"MLA456\",\n },\n ] as never);\n vi.mocked(getMercadoLibreItemDetailsWithFallbackBatch).mockResolvedValue({\n successful: [],\n failed: [],\n } as never);\n\n const result = await meliSearchItemsHandler({ profileId: \"meli-profile-1\" });\n\n expect(searchMercadoLibreItems).toHaveBeenCalledWith(\"meli-profile-1\", {\n sellerId: \"seller-99\",\n status: \"active\",\n q: undefined,\n category: undefined,\n listingTypeId: undefined,\n orders: undefined,\n limit: 50,\n offset: 0,\n });\n expect(getMercadoLibreItemDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA1\", \"MLA2\"], [\n \"id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"category_id\",\n ]);\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 2,\n limit: 2,\n offset: 0,\n returned: 2,\n has_more: false,\n continuation: \"No more pages for this query.\",\n applied_status: \"active\",\n default_status_notice:\n \"Solo se devolvieron publicaciones active por default. Tambi\u00E9n se puede pedir status expl\u00EDcito como paused, closed, under_review, inactive, not_yet_active, payment_required o deleted.\",\n available_status_filters: [\n \"active\",\n \"paused\",\n \"closed\",\n \"under_review\",\n \"inactive\",\n \"not_yet_active\",\n \"payment_required\",\n \"deleted\",\n ],\n detail_coverage: {\n detail_failures: 0,\n details_complete: true,\n },\n pages_requested: 1,\n pages_succeeded: 1,\n pages_failed: 0,\n universe_fully_fetched: true,\n },\n items_schema: [\n \"item_id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"category_id\",\n ],\n items: [\n [\"MLA1\", \"Boots\", \"active\", 100, \"ARS\", 3, 8, \"gold_special\", \"MLA123\"],\n [\"MLA2\", \"Sneakers\", \"paused\", 250, \"USD\", 1, 2, \"gold_pro\", \"MLA456\"],\n ],\n },\n });\n });\n\n it(\"reports partial item detail coverage when fallback misses items\", async () => {\n vi.mocked(searchMercadoLibreItems).mockResolvedValue({\n results: [\"MLA1\", \"MLA2\", \"MLA3\"],\n paging: { total: 3, limit: 50, offset: 0 },\n } as never);\n vi.mocked(getMercadoLibreItemDetailsBatch).mockResolvedValue([{ id: \"MLA1\", title: \"Boots\" }] as never);\n vi.mocked(getMercadoLibreItemDetailsWithFallbackBatch).mockResolvedValue({\n successful: [{ id: \"MLA2\", document: { id: \"MLA2\", title: \"Sneakers\" } }],\n failed: [{ id: \"MLA3\", message: \"missing\", attempts: 2, retryable: false, statusCode: 404 }],\n } as never);\n\n const result = await meliSearchItemsHandler({\n profileId: \"meli-profile-1\",\n status: \"paused\",\n limit: 3,\n offset: 0,\n });\n\n expect(getMercadoLibreItemDetailsWithFallbackBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA2\", \"MLA3\"], {\n maxConcurrency: 10,\n maxRetries: 1,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 3,\n limit: 3,\n offset: 0,\n returned: 2,\n has_more: true,\n next_offset: 2,\n continuation:\n \"Se recuper\u00F3 cobertura parcial. Reintentar la misma tool con offset=0 y limit=3. Luego continuar con offset=2 si hace falta.\",\n applied_status: \"paused\",\n available_status_filters: [\n \"active\",\n \"paused\",\n \"closed\",\n \"under_review\",\n \"inactive\",\n \"not_yet_active\",\n \"payment_required\",\n \"deleted\",\n ],\n detail_coverage: {\n detail_failures: 1,\n details_complete: false,\n },\n pages_requested: 1,\n pages_succeeded: 1,\n pages_failed: 0,\n universe_fully_fetched: true,\n },\n items_schema: [\n \"item_id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"category_id\",\n ],\n items: [\n [\"MLA1\", \"Boots\", \"\", 0, \"UNKNOWN\", 0, 0, \"\", \"\"],\n [\"MLA2\", \"Sneakers\", \"\", 0, \"UNKNOWN\", 0, 0, \"\", \"\"],\n ],\n },\n });\n });\n\n it(\"builds store performance summaries with service wiring, ordering, and warnings\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockResolvedValue({\n results: [\n {\n currency_id: \"ARS\",\n total_amount: 200.5,\n order_items: [\n {\n quantity: 2,\n unit_price: 50.25,\n item: { id: \"MLA1\", title: \"Boots\" },\n },\n ],\n },\n {\n currency_id: \"USD\",\n total_amount: 75.255,\n order_items: [\n {\n quantity: 1,\n unit_price: 75.255,\n item: { id: \"MLA2\", title: \"Sneakers\" },\n },\n ],\n },\n ],\n } as never);\n vi.mocked(searchMercadoLibreItems).mockResolvedValue({\n results: [\"MLA1\", \"MLA2\", \"MLA3\"],\n } as never);\n vi.mocked(getMercadoLibreUserItemsVisits).mockResolvedValue({ results: [] } as never);\n\n const result = await meliGetStorePerformanceHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n ordersLimit: 2,\n itemsLimit: 5,\n });\n\n expect(searchMercadoLibreOrders).toHaveBeenCalledWith(\"meli-profile-1\", {\n seller: \"seller-99\",\n from: \"2026-03-01\",\n to: \"2026-03-31\",\n limit: 2,\n offset: 0,\n });\n expect(searchMercadoLibreItems).toHaveBeenCalledWith(\"meli-profile-1\", {\n sellerId: \"seller-99\",\n limit: 5,\n offset: 0,\n });\n expect(getMercadoLibreUserItemsVisits).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"seller-99\",\n \"2026-03-01\",\n \"2026-03-31\"\n );\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n seller_id: \"seller-99\",\n executive_summary: {\n orders_sampled: 2,\n active_items_sampled: 3,\n total_visits: 0,\n revenue_by_currency: {\n ARS: { orders: 1, revenue: 200.5 },\n USD: { orders: 1, revenue: 75.25 },\n },\n },\n top_items: [\n { item_id: \"MLA1\", title: \"Boots\", units: 2, revenue: 100.5 },\n { item_id: \"MLA2\", title: \"Sneakers\", units: 1, revenue: 75.25 },\n ],\n warnings: [\n \"La muestra de \u00F3rdenes puede ser parcial. Si necesit\u00E1s totales completos, reenviar con mayor rango paginado.\",\n \"MercadoLibre no devolvi\u00F3 filas de visitas para el rango indicado.\",\n ],\n },\n });\n });\n\n it(\"aggregates sales by item across paginated order batches\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockResolvedValue({\n paging: { total: 3, limit: 2, offset: 0 },\n results: [\n {\n currency_id: \"ARS\",\n date_created: \"2026-03-10T14:45:55.000Z\",\n order_items: [\n {\n quantity: 2,\n unit_price: 100,\n item: { id: \"MLA1\", title: \"Boots\", variation_id: \"V1\" },\n },\n ],\n },\n {\n currency_id: \"USD\",\n date_created: \"2026-03-11T08:10:00.000Z\",\n order_items: [\n {\n quantity: 1,\n unit_price: 50,\n item: { id: \"MLA2\", title: \"Sneakers\" },\n },\n ],\n },\n ],\n } as never);\n vi.mocked(searchMercadoLibreOrdersBatch).mockResolvedValue({\n successful: [\n {\n id: \"2\",\n document: {\n results: [\n {\n currency_id: \"ARS\",\n date_created: \"2026-03-12T09:15:00.000Z\",\n order_items: [\n {\n quantity: 1,\n unit_price: 120,\n item: { id: \"MLA1\", title: \"Boots\", variation_id: \"V1\" },\n },\n ],\n },\n ],\n },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetSalesByItemHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n status: \"paid\",\n limit: 2,\n offset: 0,\n });\n\n expect(searchMercadoLibreOrders).toHaveBeenCalledWith(\"meli-profile-1\", {\n seller: \"\",\n from: \"2026-03-01\",\n to: \"2026-03-31\",\n status: \"paid\",\n limit: 2,\n offset: 0,\n });\n expect(searchMercadoLibreOrdersBatch).toHaveBeenCalledWith(\n \"meli-profile-1\",\n {\n seller: \"\",\n from: \"2026-03-01\",\n to: \"2026-03-31\",\n status: \"paid\",\n limit: 2,\n },\n [2],\n {\n maxConcurrency: 15,\n maxRetries: 2,\n }\n );\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 3,\n limit: 2,\n offset: 0,\n returned: 3,\n orders_aggregated: 3,\n has_more: false,\n continuation: \"Agregado completo. No more pages for this query.\",\n fetch_mode: \"full_aggregate\",\n pages_requested: 2,\n pages_succeeded: 2,\n pages_failed: 0,\n universe_fully_fetched: true,\n },\n sales_by_item_schema: [\n \"item_id\",\n \"title\",\n \"variation_id\",\n \"orders\",\n \"units\",\n \"revenue\",\n \"last_order_date\",\n ],\n sales_by_currency: {\n ARS: [[\"MLA1\", \"Boots\", \"V1\", 2, 3, 320, \"2026-03-12 09:15\"]],\n USD: [[\"MLA2\", \"Sneakers\", \"\", 1, 1, 50, \"2026-03-11 08:10\"]],\n },\n },\n });\n });\n\n it(\"reports partial weekly sales trends when follow-up pages fail\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockResolvedValue({\n paging: { total: 3, limit: 2, offset: 0 },\n results: [\n {\n currency_id: \"ARS\",\n total_amount: 100,\n date_created: \"2026-03-10T23:30:00.000Z\",\n },\n {\n currency_id: \"ARS\",\n total_amount: 50,\n date_created: \"2026-03-13T03:00:00.000Z\",\n },\n ],\n } as never);\n vi.mocked(searchMercadoLibreOrdersBatch).mockResolvedValue({\n successful: [],\n failed: [{ id: \"2\", message: \"timeout\", attempts: 2, retryable: true, statusCode: 504 }],\n } as never);\n\n const result = await meliGetSalesTrendHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n granularity: \"week\",\n limit: 2,\n offset: 0,\n });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n granularity: \"week\",\n trend_by_currency: {\n ARS: [{ bucket: \"2026-03-09\", orders: 2, revenue: 150 }],\n },\n metadata: {\n total_matching_orders: 3,\n limit: 2,\n offset: 0,\n returned: 2,\n orders_aggregated: 2,\n continuation:\n \"Agregado parcial por paginas fallidas. Reintentar la misma tool con los mismos filtros para recomputar el trend completo. Offsets fallidos: 2.\",\n fetch_mode: \"full_aggregate\",\n pages_requested: 2,\n pages_succeeded: 1,\n pages_failed: 1,\n universe_fully_fetched: false,\n },\n failed_pages: [\n {\n offset: 2,\n limit: 2,\n page_number: 2,\n message: \"timeout\",\n status_code: 504,\n attempts: 2,\n retryable: true,\n },\n ],\n },\n });\n });\n\n it(\"uses the single-order path when all requested order ids collapse to one unique id\", async () => {\n vi.mocked(getMercadoLibreOrder).mockResolvedValue({\n id: 100,\n status: \"paid\",\n status_detail: \"accredited\",\n date_created: \"2026-03-10T14:45:55.000Z\",\n date_closed: \"2026-03-10T15:00:00.000Z\",\n currency_id: \"ARS\",\n total_amount: 200,\n paid_amount: 200,\n shipping: { id: 1, status: \"ready_to_ship\", logistic_type: \"drop_off\" },\n buyer: { id: 10, nickname: \"buyer-1\" },\n seller: { id: 20, nickname: \"seller-1\" },\n order_items: [\n {\n quantity: 2,\n unit_price: 100,\n full_unit_price: 120,\n item: { id: \"MLA1\", title: \"Boots\", variation_id: \"V1\" },\n },\n ],\n payments: [\n {\n id: 999,\n status: \"approved\",\n payment_type: \"credit_card\",\n installments: 3,\n total_paid_amount: 200,\n },\n ],\n tags: [\"packed\"],\n } as never);\n\n const result = await meliGetOrderDetailsHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"100\", \"100\"],\n });\n\n expect(getMercadoLibreOrder).toHaveBeenCalledWith(\"meli-profile-1\", \"100\");\n expect(getMercadoLibreOrderDetailsBatch).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n metadata: {\n profile_id: \"meli-profile-1\",\n requested: 1,\n successful: 1,\n failed: 0,\n },\n orders: [\n {\n buyer: { id: \"\", nickname: \"buyer-1\" },\n currency_id: \"ARS\",\n date_closed: \"2026-03-10 15:00\",\n date_created: \"2026-03-10 14:45\",\n items: [\n {\n item_id: \"MLA1\",\n title: \"Boots\",\n variation_id: \"V1\",\n quantity: 2,\n unit_price: 100,\n full_unit_price: 120,\n },\n ],\n order_id: \"\",\n total_amount: 200,\n paid_amount: 200,\n payments: [\n {\n id: \"\",\n status: \"approved\",\n payment_type: \"credit_card\",\n installments: 3,\n total_paid_amount: 200,\n },\n ],\n seller: { id: \"\", nickname: \"seller-1\" },\n shipping: {\n id: \"\",\n status: \"ready_to_ship\",\n substatus: \"\",\n mode: \"\",\n logistic_type: \"drop_off\",\n },\n status: \"paid\",\n status_detail: \"accredited\",\n tags: [\"packed\"],\n },\n ],\n },\n });\n });\n\n it(\"returns batch order details with normalized failures\", async () => {\n vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({\n successful: [\n {\n id: \"100\",\n document: {\n id: \"100\",\n status: \"paid\",\n currency_id: \"ARS\",\n total_amount: 100,\n paid_amount: 100,\n order_items: [],\n payments: [],\n },\n },\n ],\n failed: [{ id: \"101\", message: \"not found\", statusCode: 404, attempts: 2, retryable: false }],\n } as never);\n\n const result = await meliGetOrderDetailsHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"100\", \"101\", \"100\"],\n });\n\n expect(getMercadoLibreOrderDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"100\", \"101\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n metadata: {\n profile_id: \"meli-profile-1\",\n requested: 2,\n successful: 1,\n failed: 1,\n has_failures: true,\n },\n orders: [\n {\n buyer: { id: \"\", nickname: \"\" },\n order_id: \"100\",\n status: \"paid\",\n status_detail: \"\",\n currency_id: \"ARS\",\n total_amount: 100,\n paid_amount: 100,\n shipping: {\n id: \"\",\n status: \"\",\n substatus: \"\",\n mode: \"\",\n logistic_type: \"\",\n },\n seller: { id: \"\", nickname: \"\" },\n },\n ],\n failures: [\n {\n order_id: \"101\",\n message: \"not found\",\n status_code: 404,\n attempts: 2,\n retryable: false,\n },\n ],\n },\n });\n });\n\n it(\"formats medium-handler failures through MercadoLibre error helpers\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockRejectedValue(new Error(\"orders-boom\"));\n\n const result = await meliGetSalesTrendHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n });\n\n expect(formatMercadoLibreError).toHaveBeenCalledWith(\n expect.any(Error),\n \"Failed to build MercadoLibre sales trend\"\n );\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to build MercadoLibre sales trend:orders-boom\",\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { meliSearchItemsHandler } from \"../../src/tools/mercadolibre/search-items.js\";\nimport { meliGetStorePerformanceHandler } from \"../../src/tools/mercadolibre/get-store-performance.js\";\nimport { meliGetSalesByItemHandler } from \"../../src/tools/mercadolibre/get-sales-by-item.js\";\nimport { meliGetSalesTrendHandler } from \"../../src/tools/mercadolibre/get-sales-trend.js\";\nimport { meliGetOrderDetailsHandler } from \"../../src/tools/mercadolibre/get-order-details.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"../../src/tools/mercadolibre/profile-resolution.js\";\nimport { getMercadoLibreAccessForProfile } from \"../../src/config/mercadolibre.js\";\nimport {\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../src/services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreItemDetailsBatch,\n getMercadoLibreItemDetailsWithFallbackBatch,\n getMercadoLibreUserItemsVisits,\n searchMercadoLibreItems,\n searchMercadoLibreItemsBatch,\n} from \"../../src/services/mercadolibre/mercadolibre-items.js\";\nimport {\n getMercadoLibreOrder,\n getMercadoLibreOrderDetailsBatch,\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../src/services/mercadolibre/mercadolibre-orders.js\";\n\nvi.mock(\"mcp-use/server\", () => ({\n object: vi.fn((payload: unknown) => ({ kind: \"object\", payload })),\n error: vi.fn((message: string) => ({ kind: \"error\", message })),\n}));\n\nvi.mock(\"../../src/tools/mercadolibre/profile-resolution.js\", () => ({\n resolveMercadoLibreProfileOrSelection: vi.fn(),\n}));\n\nvi.mock(\"../../src/config/mercadolibre.js\", () => ({\n getMercadoLibreAccessForProfile: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-api.js\", () => ({\n formatMercadoLibreError: vi.fn(\n (err: unknown, fallback: string) =>\n `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`\n ),\n normalizeMercadoLibrePaging: vi.fn((paging: unknown) => paging),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-items.js\", () => ({\n searchMercadoLibreItems: vi.fn(),\n searchMercadoLibreItemsBatch: vi.fn(),\n getMercadoLibreItemDetailsBatch: vi.fn(),\n getMercadoLibreItemDetailsWithFallbackBatch: vi.fn(),\n getMercadoLibreUserItemsVisits: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-orders.js\", () => ({\n searchMercadoLibreOrders: vi.fn(),\n searchMercadoLibreOrdersBatch: vi.fn(),\n getMercadoLibreOrder: vi.fn(),\n getMercadoLibreOrderDetailsBatch: vi.fn(),\n}));\n\ndescribe(\"MercadoLibre medium tool handlers batch 4\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n\n vi.mocked(getMercadoLibreAccessForProfile).mockResolvedValue({\n sellerId: \"seller-99\",\n scopes: [\"read\"],\n expiresAt: \"2026-07-01T00:00:00.000Z\",\n } as never);\n\n vi.mocked(normalizeMercadoLibrePaging).mockImplementation((paging) => paging as never);\n });\n\n it(\"searches items with the default active status and compact item rows\", async () => {\n vi.mocked(searchMercadoLibreItems).mockResolvedValue({\n results: [\"MLA1\", \"MLA2\"],\n paging: { total: 2, limit: 50, offset: 0 },\n } as never);\n vi.mocked(getMercadoLibreItemDetailsBatch).mockResolvedValue([\n {\n id: \"MLA1\",\n title: \"Boots\",\n status: \"active\",\n price: 100,\n currency_id: \"ARS\",\n available_quantity: 3,\n sold_quantity: 8,\n listing_type_id: \"gold_special\",\n category_id: \"MLA123\",\n },\n {\n id: \"MLA2\",\n title: \"Sneakers\",\n status: \"paused\",\n price: 250,\n currency_id: \"USD\",\n available_quantity: 1,\n sold_quantity: 2,\n listing_type_id: \"gold_pro\",\n category_id: \"MLA456\",\n },\n ] as never);\n vi.mocked(getMercadoLibreItemDetailsWithFallbackBatch).mockResolvedValue({\n successful: [],\n failed: [],\n } as never);\n\n const result = await meliSearchItemsHandler({ profileId: \"meli-profile-1\" });\n\n expect(searchMercadoLibreItems).toHaveBeenCalledWith(\"meli-profile-1\", {\n sellerId: \"seller-99\",\n status: \"active\",\n q: undefined,\n category: undefined,\n listingTypeId: undefined,\n orders: undefined,\n limit: 50,\n offset: 0,\n });\n expect(getMercadoLibreItemDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA1\", \"MLA2\"], [\n \"id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"category_id\",\n ]);\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 2,\n limit: 2,\n offset: 0,\n returned: 2,\n has_more: false,\n continuation: \"No more pages for this query.\",\n applied_status: \"active\",\n default_status_notice:\n \"Solo se devolvieron publicaciones active por default. Tambi\u00E9n se puede pedir status expl\u00EDcito como paused, closed, under_review, inactive, not_yet_active, payment_required o deleted.\",\n available_status_filters: [\n \"active\",\n \"paused\",\n \"closed\",\n \"under_review\",\n \"inactive\",\n \"not_yet_active\",\n \"payment_required\",\n \"deleted\",\n ],\n detail_coverage: {\n detail_failures: 0,\n details_complete: true,\n },\n pages_requested: 1,\n pages_succeeded: 1,\n pages_failed: 0,\n universe_fully_fetched: true,\n },\n items_schema: [\n \"item_id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"category_id\",\n ],\n items: [\n [\"MLA1\", \"Boots\", \"active\", 100, \"ARS\", 3, 8, \"gold_special\", \"MLA123\"],\n [\"MLA2\", \"Sneakers\", \"paused\", 250, \"USD\", 1, 2, \"gold_pro\", \"MLA456\"],\n ],\n },\n });\n });\n\n it(\"reports partial item detail coverage when fallback misses items\", async () => {\n vi.mocked(searchMercadoLibreItems).mockResolvedValue({\n results: [\"MLA1\", \"MLA2\", \"MLA3\"],\n paging: { total: 3, limit: 50, offset: 0 },\n } as never);\n vi.mocked(getMercadoLibreItemDetailsBatch).mockResolvedValue([{ id: \"MLA1\", title: \"Boots\" }] as never);\n vi.mocked(getMercadoLibreItemDetailsWithFallbackBatch).mockResolvedValue({\n successful: [{ id: \"MLA2\", document: { id: \"MLA2\", title: \"Sneakers\" } }],\n failed: [{ id: \"MLA3\", message: \"missing\", attempts: 2, retryable: false, statusCode: 404 }],\n } as never);\n\n const result = await meliSearchItemsHandler({\n profileId: \"meli-profile-1\",\n status: \"paused\",\n limit: 3,\n offset: 0,\n });\n\n expect(getMercadoLibreItemDetailsWithFallbackBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA2\", \"MLA3\"], {\n maxConcurrency: 10,\n maxRetries: 1,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 3,\n limit: 3,\n offset: 0,\n returned: 2,\n has_more: true,\n next_offset: 2,\n continuation:\n \"Se recuper\u00F3 cobertura parcial. Reintentar la misma tool con offset=0 y limit=3. Luego continuar con offset=2 si hace falta.\",\n applied_status: \"paused\",\n available_status_filters: [\n \"active\",\n \"paused\",\n \"closed\",\n \"under_review\",\n \"inactive\",\n \"not_yet_active\",\n \"payment_required\",\n \"deleted\",\n ],\n detail_coverage: {\n detail_failures: 1,\n details_complete: false,\n },\n pages_requested: 1,\n pages_succeeded: 1,\n pages_failed: 0,\n universe_fully_fetched: true,\n },\n items_schema: [\n \"item_id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"category_id\",\n ],\n items: [\n [\"MLA1\", \"Boots\", \"\", 0, \"UNKNOWN\", 0, 0, \"\", \"\"],\n [\"MLA2\", \"Sneakers\", \"\", 0, \"UNKNOWN\", 0, 0, \"\", \"\"],\n ],\n },\n });\n });\n\n it(\"builds store performance summaries with service wiring, ordering, and warnings\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockResolvedValue({\n results: [\n {\n currency_id: \"ARS\",\n total_amount: 200.5,\n order_items: [\n {\n quantity: 2,\n unit_price: 50.25,\n item: { id: \"MLA1\", title: \"Boots\" },\n },\n ],\n },\n {\n currency_id: \"USD\",\n total_amount: 75.255,\n order_items: [\n {\n quantity: 1,\n unit_price: 75.255,\n item: { id: \"MLA2\", title: \"Sneakers\" },\n },\n ],\n },\n ],\n } as never);\n vi.mocked(searchMercadoLibreItems).mockResolvedValue({\n results: [\"MLA1\", \"MLA2\", \"MLA3\"],\n } as never);\n vi.mocked(getMercadoLibreUserItemsVisits).mockResolvedValue({ results: [] } as never);\n\n const result = await meliGetStorePerformanceHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n ordersLimit: 2,\n itemsLimit: 5,\n });\n\n expect(searchMercadoLibreOrders).toHaveBeenCalledWith(\"meli-profile-1\", {\n seller: \"seller-99\",\n from: \"2026-03-01\",\n to: \"2026-03-31\",\n limit: 2,\n offset: 0,\n });\n expect(searchMercadoLibreItems).toHaveBeenCalledWith(\"meli-profile-1\", {\n sellerId: \"seller-99\",\n limit: 5,\n offset: 0,\n });\n expect(getMercadoLibreUserItemsVisits).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"seller-99\",\n \"2026-03-01\",\n \"2026-03-31\"\n );\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n seller_id: \"seller-99\",\n executive_summary: {\n orders_sampled: 2,\n active_items_sampled: 3,\n total_visits: 0,\n revenue_by_currency: {\n ARS: { orders: 1, revenue: 200.5 },\n USD: { orders: 1, revenue: 75.25 },\n },\n },\n top_items: [\n { item_id: \"MLA1\", title: \"Boots\", units: 2, revenue: 100.5 },\n { item_id: \"MLA2\", title: \"Sneakers\", units: 1, revenue: 75.25 },\n ],\n warnings: [\n \"La muestra de \u00F3rdenes puede ser parcial. Si necesit\u00E1s totales completos, reenviar con mayor rango paginado.\",\n \"MercadoLibre no devolvi\u00F3 filas de visitas para el rango indicado.\",\n ],\n },\n });\n });\n\n it(\"aggregates sales by item across paginated order batches\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockResolvedValue({\n paging: { total: 3, limit: 2, offset: 0 },\n results: [\n {\n currency_id: \"ARS\",\n date_created: \"2026-03-10T14:45:55.000Z\",\n order_items: [\n {\n quantity: 2,\n unit_price: 100,\n item: { id: \"MLA1\", title: \"Boots\", variation_id: \"V1\" },\n },\n ],\n },\n {\n currency_id: \"USD\",\n date_created: \"2026-03-11T08:10:00.000Z\",\n order_items: [\n {\n quantity: 1,\n unit_price: 50,\n item: { id: \"MLA2\", title: \"Sneakers\" },\n },\n ],\n },\n ],\n } as never);\n vi.mocked(searchMercadoLibreOrdersBatch).mockResolvedValue({\n successful: [\n {\n id: \"2\",\n document: {\n results: [\n {\n currency_id: \"ARS\",\n date_created: \"2026-03-12T09:15:00.000Z\",\n order_items: [\n {\n quantity: 1,\n unit_price: 120,\n item: { id: \"MLA1\", title: \"Boots\", variation_id: \"V1\" },\n },\n ],\n },\n ],\n },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetSalesByItemHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n status: \"paid\",\n limit: 2,\n offset: 0,\n });\n\n expect(searchMercadoLibreOrders).toHaveBeenCalledWith(\"meli-profile-1\", {\n seller: \"\",\n from: \"2026-03-01\",\n to: \"2026-03-31\",\n status: \"paid\",\n limit: 2,\n offset: 0,\n });\n expect(searchMercadoLibreOrdersBatch).toHaveBeenCalledWith(\n \"meli-profile-1\",\n {\n seller: \"\",\n from: \"2026-03-01\",\n to: \"2026-03-31\",\n status: \"paid\",\n limit: 2,\n },\n [2],\n {\n maxConcurrency: 15,\n maxRetries: 2,\n }\n );\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 3,\n limit: 2,\n offset: 0,\n returned: 3,\n orders_aggregated: 3,\n has_more: false,\n continuation: \"Agregado completo. No more pages for this query.\",\n fetch_mode: \"full_aggregate\",\n pages_requested: 2,\n pages_succeeded: 2,\n pages_failed: 0,\n universe_fully_fetched: true,\n },\n sales_by_item_schema: [\n \"item_id\",\n \"title\",\n \"variation_id\",\n \"orders\",\n \"units\",\n \"revenue\",\n \"last_order_date\",\n ],\n sales_by_currency: {\n ARS: [[\"MLA1\", \"Boots\", \"V1\", 2, 3, 320, \"2026-03-12 09:15\"]],\n USD: [[\"MLA2\", \"Sneakers\", \"\", 1, 1, 50, \"2026-03-11 08:10\"]],\n },\n },\n });\n });\n\n it(\"reports partial weekly sales trends when follow-up pages fail\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockResolvedValue({\n paging: { total: 3, limit: 2, offset: 0 },\n results: [\n {\n currency_id: \"ARS\",\n total_amount: 100,\n date_created: \"2026-03-10T23:30:00.000Z\",\n },\n {\n currency_id: \"ARS\",\n total_amount: 50,\n date_created: \"2026-03-13T03:00:00.000Z\",\n },\n ],\n } as never);\n vi.mocked(searchMercadoLibreOrdersBatch).mockResolvedValue({\n successful: [],\n failed: [{ id: \"2\", message: \"timeout\", attempts: 2, retryable: true, statusCode: 504 }],\n } as never);\n\n const result = await meliGetSalesTrendHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n granularity: \"week\",\n limit: 2,\n offset: 0,\n });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n granularity: \"week\",\n trend_by_currency: {\n ARS: [{ bucket: \"2026-03-09\", orders: 2, revenue: 150 }],\n },\n metadata: {\n total_matching_orders: 3,\n limit: 2,\n offset: 0,\n returned: 2,\n orders_aggregated: 2,\n continuation:\n \"Agregado parcial por paginas fallidas. Reintentar la misma tool con los mismos filtros para recomputar el trend completo. Offsets fallidos: 2.\",\n fetch_mode: \"full_aggregate\",\n pages_requested: 2,\n pages_succeeded: 1,\n pages_failed: 1,\n universe_fully_fetched: false,\n },\n failed_pages: [\n {\n offset: 2,\n limit: 2,\n page_number: 2,\n message: \"timeout\",\n status_code: 504,\n attempts: 2,\n retryable: true,\n },\n ],\n },\n });\n });\n\n it(\"uses the single-order path when all requested order ids collapse to one unique id\", async () => {\n vi.mocked(getMercadoLibreOrder).mockResolvedValue({\n id: 100,\n status: \"paid\",\n status_detail: \"accredited\",\n date_created: \"2026-03-10T14:45:55.000Z\",\n date_closed: \"2026-03-10T15:00:00.000Z\",\n currency_id: \"ARS\",\n total_amount: 200,\n paid_amount: 200,\n shipping: { id: 1, status: \"ready_to_ship\", logistic_type: \"drop_off\" },\n buyer: { id: 10, nickname: \"buyer-1\" },\n seller: { id: 20, nickname: \"seller-1\" },\n order_items: [\n {\n quantity: 2,\n unit_price: 100,\n full_unit_price: 120,\n item: { id: \"MLA1\", title: \"Boots\", variation_id: \"V1\" },\n },\n ],\n payments: [\n {\n id: 999,\n status: \"approved\",\n status_detail: \"accredited\",\n payment_method_id: \"visa\",\n payment_type: \"credit_card\",\n installments: 3,\n total_paid_amount: 200,\n transaction_amount: 210,\n transaction_amount_refunded: 10,\n shipping_cost: 15,\n coupon_amount: 5,\n },\n ],\n tags: [\"packed\"],\n } as never);\n\n const result = await meliGetOrderDetailsHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"100\", \"100\"],\n });\n\n expect(getMercadoLibreOrder).toHaveBeenCalledWith(\"meli-profile-1\", \"100\");\n expect(getMercadoLibreOrderDetailsBatch).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n metadata: {\n profile_id: \"meli-profile-1\",\n requested: 1,\n successful: 1,\n failed: 0,\n },\n orders: [\n {\n buyer: { id: \"\", nickname: \"buyer-1\" },\n currency_id: \"ARS\",\n date_closed: \"2026-03-10 15:00\",\n date_created: \"2026-03-10 14:45\",\n items: [\n {\n item_id: \"MLA1\",\n title: \"Boots\",\n variation_id: \"V1\",\n quantity: 2,\n unit_price: 100,\n full_unit_price: 120,\n },\n ],\n order_id: \"\",\n total_amount: 200,\n paid_amount: 200,\n payments: [\n {\n id: \"999\",\n status: \"approved\",\n status_detail: \"accredited\",\n payment_method_id: \"visa\",\n payment_type: \"credit_card\",\n installments: 3,\n total_paid_amount: 200,\n transaction_amount: 210,\n transaction_amount_refunded: 10,\n shipping_cost: 15,\n coupon_amount: 5,\n },\n ],\n seller: { id: \"\", nickname: \"seller-1\" },\n shipping: {\n id: \"1\",\n status: \"ready_to_ship\",\n substatus: \"\",\n mode: \"\",\n logistic_type: \"drop_off\",\n },\n status: \"paid\",\n status_detail: \"accredited\",\n tags: [\"packed\"],\n },\n ],\n },\n });\n });\n\n it(\"returns batch order details with normalized failures\", async () => {\n vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({\n successful: [\n {\n id: \"100\",\n document: {\n id: \"100\",\n status: \"paid\",\n currency_id: \"ARS\",\n total_amount: 100,\n paid_amount: 100,\n order_items: [],\n payments: [],\n },\n },\n ],\n failed: [{ id: \"101\", message: \"not found\", statusCode: 404, attempts: 2, retryable: false }],\n } as never);\n\n const result = await meliGetOrderDetailsHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"100\", \"101\", \"100\"],\n });\n\n expect(getMercadoLibreOrderDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"100\", \"101\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n metadata: {\n profile_id: \"meli-profile-1\",\n requested: 2,\n successful: 1,\n failed: 1,\n has_failures: true,\n },\n orders: [\n {\n buyer: { id: \"\", nickname: \"\" },\n order_id: \"100\",\n status: \"paid\",\n status_detail: \"\",\n currency_id: \"ARS\",\n total_amount: 100,\n paid_amount: 100,\n shipping: {\n id: \"\",\n status: \"\",\n substatus: \"\",\n mode: \"\",\n logistic_type: \"\",\n },\n seller: { id: \"\", nickname: \"\" },\n },\n ],\n failures: [\n {\n order_id: \"101\",\n message: \"not found\",\n status_code: 404,\n attempts: 2,\n retryable: false,\n },\n ],\n },\n });\n });\n\n it(\"formats medium-handler failures through MercadoLibre error helpers\", async () => {\n vi.mocked(searchMercadoLibreOrders).mockRejectedValue(new Error(\"orders-boom\"));\n\n const result = await meliGetSalesTrendHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-31\",\n });\n\n expect(formatMercadoLibreError).toHaveBeenCalledWith(\n expect.any(Error),\n \"Failed to build MercadoLibre sales trend\"\n );\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to build MercadoLibre sales trend:orders-boom\",\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|