@yoryoboy/bi-mcp 1.5.2 → 1.6.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/README.md +87 -87
- package/bin/bi-mcp.js +9 -9
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-use.json +2 -2
- package/dist/public/icon.svg +6 -6
- package/dist/scripts/_helpers.js.map +1 -1
- package/dist/scripts/admin-profile-delete.js.map +1 -1
- package/dist/scripts/admin-profile-list.js.map +1 -1
- package/dist/scripts/admin-profile-upsert.js.map +1 -1
- package/dist/scripts/admin-vtex-list.js.map +1 -1
- package/dist/scripts/admin-vtex-upsert.js.map +1 -1
- package/dist/scripts/admin-vtex-validate.js.map +1 -1
- package/dist/scripts/decrypt-secret.js +36 -0
- package/dist/scripts/decrypt-secret.js.map +7 -0
- package/dist/scripts/run-migrations.js.map +1 -1
- package/dist/scripts/test-db-connection.js.map +1 -1
- package/dist/src/analytics/ga4-channel-groups.js.map +1 -1
- package/dist/src/analytics/ga4-report-utils.js.map +1 -1
- package/dist/src/config/benchmarks.js.map +1 -1
- package/dist/src/config/google-store.js.map +1 -1
- package/dist/src/config/google.js.map +1 -1
- package/dist/src/config/mercadolibre-profile-store.js.map +1 -1
- package/dist/src/config/mercadolibre.js.map +1 -1
- package/dist/src/config/meta.js.map +1 -1
- package/dist/src/config/profile-store.js.map +1 -1
- package/dist/src/config/vtex-crypto.js.map +1 -1
- package/dist/src/config/vtex-profile-store.js.map +1 -1
- package/dist/src/config/vtex.js.map +1 -1
- package/dist/src/db/client.js.map +1 -1
- package/dist/src/meta/meta-utils.js.map +1 -1
- package/dist/src/prompts/reporte-ventas.js.map +1 -1
- package/dist/src/services/analytics/ga4-client.js.map +1 -1
- package/dist/src/services/analytics/oauth.js.map +1 -1
- package/dist/src/services/google-ads/google-ads-client.js.map +1 -1
- package/dist/src/services/mercadolibre/mercadolibre-api.js.map +1 -1
- package/dist/src/services/mercadolibre/mercadolibre-items.js.map +1 -1
- package/dist/src/services/mercadolibre/mercadolibre-orders.js +19 -5
- package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-questions.js.map +1 -1
- package/dist/src/services/meta/meta-ads.js.map +1 -1
- package/dist/src/services/meta/meta-api.js.map +1 -1
- package/dist/src/services/search-console/search-console-client.js.map +1 -1
- package/dist/src/services/search-console/search-console-utils.js.map +1 -1
- package/dist/src/services/vtex/vtex-api.js.map +1 -1
- package/dist/src/services/vtex/vtex-catalog-write.js.map +1 -1
- package/dist/src/services/vtex/vtex-catalog.js.map +1 -1
- package/dist/src/services/vtex/vtex-logistics.js.map +1 -1
- package/dist/src/services/vtex/vtex-orders-write.js.map +1 -1
- package/dist/src/services/vtex/vtex-orders.js.map +1 -1
- package/dist/src/services/vtex/vtex-pricing-write.js.map +1 -1
- package/dist/src/services/vtex/vtex-pricing.js.map +1 -1
- package/dist/src/services/vtex/vtex-write.js.map +1 -1
- package/dist/src/tools/analytics/attribution-gaps.js.map +1 -1
- package/dist/src/tools/analytics/channel-mix.js.map +1 -1
- package/dist/src/tools/analytics/ecommerce-tracking-health.js.map +1 -1
- package/dist/src/tools/analytics/engagement-overview.js.map +1 -1
- package/dist/src/tools/analytics/index.js.map +1 -1
- package/dist/src/tools/analytics/list-accessible-properties.js.map +1 -1
- package/dist/src/tools/analytics/property-info.js.map +1 -1
- package/dist/src/tools/analytics/revenue-by-channel.js.map +1 -1
- package/dist/src/tools/analytics/revenue-overview.js.map +1 -1
- package/dist/src/tools/analytics/revenue-trend.js.map +1 -1
- package/dist/src/tools/analytics/source-medium-breakdown.js.map +1 -1
- package/dist/src/tools/analytics/top-landing-pages.js.map +1 -1
- package/dist/src/tools/config/check-database-connection.js.map +1 -1
- package/dist/src/tools/config/index.js.map +1 -1
- package/dist/src/tools/config/list-profiles.js.map +1 -1
- package/dist/src/tools/google-ads/account-overview.js.map +1 -1
- package/dist/src/tools/google-ads/account-risks.js.map +1 -1
- package/dist/src/tools/google-ads/break-even-analysis.js.map +1 -1
- package/dist/src/tools/google-ads/campaign-performance.js.map +1 -1
- package/dist/src/tools/google-ads/channel-mix.js.map +1 -1
- package/dist/src/tools/google-ads/compare-accounts.js.map +1 -1
- package/dist/src/tools/google-ads/customer-clients.js.map +1 -1
- package/dist/src/tools/google-ads/customer-info.js.map +1 -1
- package/dist/src/tools/google-ads/index.js.map +1 -1
- package/dist/src/tools/google-ads/scaling-health.js.map +1 -1
- package/dist/src/tools/google-ads/search-terms-summary.js.map +1 -1
- package/dist/src/tools/google-ads/time-series.js.map +1 -1
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/mercadolibre/answer-question.js.map +1 -1
- package/dist/src/tools/mercadolibre/create-item.js.map +1 -1
- package/dist/src/tools/mercadolibre/estimate-listing-fee.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-account-context.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-category-requirements.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-item-details.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-item-visits.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-listing-quality.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-order-details.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-orders-summary.js +670 -38
- package/dist/src/tools/mercadolibre/get-orders-summary.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-sales-by-item.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-sales-trend.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +1 -1
- package/dist/src/tools/mercadolibre/get-store-performance.js.map +1 -1
- package/dist/src/tools/mercadolibre/helpers.js +13 -0
- package/dist/src/tools/mercadolibre/helpers.js.map +2 -2
- package/dist/src/tools/mercadolibre/index.js.map +1 -1
- package/dist/src/tools/mercadolibre/pause-or-reactivate-item.js.map +1 -1
- package/dist/src/tools/mercadolibre/predict-category.js.map +1 -1
- package/dist/src/tools/mercadolibre/profile-resolution.js.map +1 -1
- package/dist/src/tools/mercadolibre/search-items.js.map +1 -1
- package/dist/src/tools/mercadolibre/search-questions.js.map +1 -1
- package/dist/src/tools/mercadolibre/update-item-basic-fields.js.map +1 -1
- package/dist/src/tools/mercadolibre/update-item-description.js.map +1 -1
- package/dist/src/tools/mercadolibre/update-item-pictures.js.map +1 -1
- package/dist/src/tools/mercadolibre/validate-connection.js.map +1 -1
- package/dist/src/tools/mercadolibre/write-helpers.js.map +1 -1
- package/dist/src/tools/meta/account-overview.js.map +1 -1
- package/dist/src/tools/meta/ad-account-info.js.map +1 -1
- package/dist/src/tools/meta/ads-performance.js.map +1 -1
- package/dist/src/tools/meta/campaign-performance.js.map +1 -1
- package/dist/src/tools/meta/index.js.map +1 -1
- package/dist/src/tools/meta/list-accessible-ad-accounts.js.map +1 -1
- package/dist/src/tools/meta/list-accessible-businesses.js.map +1 -1
- package/dist/src/tools/meta/placement-mix.js.map +1 -1
- package/dist/src/tools/meta/time-series.js.map +1 -1
- package/dist/src/tools/search-console/country-breakdown.js.map +1 -1
- package/dist/src/tools/search-console/device-breakdown.js.map +1 -1
- package/dist/src/tools/search-console/high-impression-low-click-queries.js.map +1 -1
- package/dist/src/tools/search-console/index.js.map +1 -1
- package/dist/src/tools/search-console/list-accessible-sites.js.map +1 -1
- package/dist/src/tools/search-console/low-ctr-opportunities.js.map +1 -1
- package/dist/src/tools/search-console/page-performance.js.map +1 -1
- package/dist/src/tools/search-console/product-demand-low-capture-queries.js.map +1 -1
- package/dist/src/tools/search-console/query-page-matrix.js.map +1 -1
- package/dist/src/tools/search-console/query-performance.js.map +1 -1
- package/dist/src/tools/search-console/quick-win-opportunities.js.map +1 -1
- package/dist/src/tools/search-console/rising-non-brand-queries.js.map +1 -1
- package/dist/src/tools/search-console/search-performance.js.map +1 -1
- package/dist/src/tools/search-console/site-context.js.map +1 -1
- package/dist/src/tools/search-console/visibility-declines.js.map +1 -1
- package/dist/src/tools/vtex/activate-sku.js.map +1 -1
- package/dist/src/tools/vtex/add-order-tracking.js.map +1 -1
- package/dist/src/tools/vtex/associate-specification.js.map +1 -1
- package/dist/src/tools/vtex/attach-catalog-image.js.map +1 -1
- package/dist/src/tools/vtex/cancel-order.js.map +1 -1
- package/dist/src/tools/vtex/computed-price.js.map +1 -1
- package/dist/src/tools/vtex/create-brand.js.map +1 -1
- package/dist/src/tools/vtex/create-category.js.map +1 -1
- package/dist/src/tools/vtex/create-product-with-sku.js.map +1 -1
- package/dist/src/tools/vtex/create-product.js.map +1 -1
- package/dist/src/tools/vtex/create-sku.js.map +1 -1
- package/dist/src/tools/vtex/create-specification-value.js.map +1 -1
- package/dist/src/tools/vtex/create-specification.js.map +1 -1
- package/dist/src/tools/vtex/deactivate-sku.js.map +1 -1
- package/dist/src/tools/vtex/delete-fixed-price.js.map +1 -1
- package/dist/src/tools/vtex/index.js.map +1 -1
- package/dist/src/tools/vtex/inventory-check.js.map +1 -1
- package/dist/src/tools/vtex/invoice-order.js.map +1 -1
- package/dist/src/tools/vtex/order-details.js.map +1 -1
- package/dist/src/tools/vtex/orders-summary.js.map +1 -1
- package/dist/src/tools/vtex/product-offers.js.map +1 -1
- package/dist/src/tools/vtex/profile-resolution.js.map +1 -1
- package/dist/src/tools/vtex/sku-offers.js.map +1 -1
- package/dist/src/tools/vtex/sku-price.js.map +1 -1
- package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +1 -1
- package/dist/src/tools/vtex/update-inventory.js.map +1 -1
- package/dist/src/tools/vtex/update-lead-time.js.map +1 -1
- package/dist/src/tools/vtex/update-product-basic-fields.js.map +1 -1
- package/dist/src/tools/vtex/update-sku-basic-fields.js.map +1 -1
- package/dist/src/tools/vtex/update-sku-price.js.map +1 -1
- package/dist/src/tools/vtex/upsert-fixed-price.js.map +1 -1
- package/dist/src/tools/vtex/warehouse-inventory.js.map +1 -1
- package/dist/src/tools/vtex/write-helpers.js.map +1 -1
- package/dist/src/utils/case-conversion.js.map +1 -1
- package/dist/src/utils/currency.js.map +1 -1
- package/dist/src/utils/format-order-details.js.map +1 -1
- package/dist/src/utils/google-ads.js.map +1 -1
- package/dist/src/utils/money.js.map +1 -1
- package/dist/src/utils/order-status.js.map +1 -1
- package/dist/src/utils/pagination.js.map +1 -1
- package/dist/src/utils/strip-payload.js.map +1 -1
- package/dist/src/utils/type-guards.js.map +1 -1
- package/package.json +4 -3
- package/public/icon.svg +6 -6
- package/dist/src/google-ads/report-utils.js +0 -78
- package/dist/src/google-ads/report-utils.js.map +0 -7
- package/dist/src/search-console/search-console-utils.js +0 -275
- package/dist/src/search-console/search-console-utils.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-orders-summary.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst ordersSchema = [\"id\", \"date\", \"status\", \"total\", \"currency\", \"buyer\", \"shipping\", \"items\"] as const;\n\nexport const meliGetOrdersSummarySchema = 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 MercadoLibre order status filter.\"),\n q: z.string().trim().min(1).optional().describe(\"Optional free-text search query supported by MercadoLibre orders search.\"),\n sort: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Pagination offset.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page (1-50).\"),\n});\n\nexport async function meliGetOrdersSummaryHandler(\n params: z.infer<typeof meliGetOrdersSummarySchema>\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 response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n offset: params.offset,\n limit: params.limit,\n });\n\n const orders = asArray<Record<string, unknown>>(response.results);\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }> = {};\n\n const compactOrders = orders.map((order) => {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const totalAmount = toNumber(order.total_amount);\n const bucket = currencyBucket(metricsByCurrency, currencyId, () => ({\n orders: 0,\n revenue: 0,\n avg_order_value: 0,\n }));\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.avg_order_value = bucket.orders > 0 ? bucket.revenue / bucket.orders : 0;\n\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const shipping = asRecord(order.shipping);\n const buyer = asRecord(order.buyer);\n\n return [\n normalizeString(order.id),\n compactDateTime(order.date_created),\n normalizeString(order.status),\n totalAmount,\n currencyId,\n normalizeString(buyer.nickname) || normalizeString(buyer.id),\n normalizeString(shipping.status),\n orderItems.length,\n ];\n });\n\n for (const metrics of Object.values(metricsByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n metrics.avg_order_value = roundMoney(metrics.avg_order_value);\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: paging.limit || params.limit || compactOrders.length,\n offset: paging.offset || params.offset || 0,\n returned: compactOrders.length,\n nextField: \"offset\",\n }),\n metrics_by_currency: metricsByCurrency,\n orders_schema: ordersSchema,\n orders: compactOrders,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre orders summary\"));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\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 = 4;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst TOP_LIMIT = 10;\n\nconst ordersSchema = [\n \"id\",\n \"date_created\",\n \"status\",\n \"total_amount\",\n \"currency\",\n \"buyer\",\n \"shipping_status\",\n \"items\",\n \"date_closed\",\n \"last_updated\",\n \"paid_amount\",\n \"buyer_id\",\n \"seller\",\n \"seller_id\",\n \"shipping_id\",\n \"pack_id\",\n \"fulfilled\",\n \"tags\",\n \"channel\",\n \"site\",\n \"payment_id\",\n \"payment_status\",\n \"payment_status_detail\",\n \"payment_method\",\n \"payment_type\",\n \"payment_total_paid\",\n \"payment_transaction_amount\",\n \"installments\",\n \"coupon_amount\",\n \"available_actions\",\n \"feedback_buyer\",\n \"feedback_seller\",\n \"order_request_change\",\n \"order_request_return\",\n \"first_item_id\",\n \"first_item_title\",\n \"first_item_sku\",\n \"first_item_quantity\",\n \"first_item_unit_price\",\n \"first_item_sale_fee\",\n \"first_item_listing_type\",\n \"variation_attributes\",\n \"stock_node_id\",\n] as const;\n\nfunction compactStringList(values: unknown, separator = \" | \"): string {\n return asArray(values)\n .map((value) => normalizeScalarString(value).trim())\n .filter(Boolean)\n .join(separator);\n}\n\nfunction compactNestedValue(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n\n const scalar = normalizeScalarString(value);\n if (scalar) {\n return scalar;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => compactNestedValue(entry))\n .filter(Boolean)\n .join(\" | \");\n }\n\n const record = asRecord(value);\n return Object.entries(record)\n .map(([key, entryValue]) => {\n const normalized = compactNestedValue(entryValue);\n return normalized ? `${key}:${normalized}` : \"\";\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction compactVariationAttributes(value: unknown): string {\n return asArray<Record<string, unknown>>(value)\n .map((attribute) => {\n const name = normalizeString(attribute.name) || normalizeString(attribute.id);\n const normalizedValue =\n normalizeString(attribute.value_name) ||\n normalizeString(attribute.value_id) ||\n normalizeScalarString(attribute.value);\n\n if (!name || !normalizedValue) {\n return \"\";\n }\n\n return `${name}: ${normalizedValue}`;\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction createMetricsBucket() {\n return {\n orders: 0,\n revenue: 0,\n avg_order_value: 0,\n };\n}\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 OrderSummaryMetadata = ReturnType<typeof buildOrdersSummaryMetadata>;\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 CurrencyCalculation = {\n revenue_total: number;\n paid_amount_total: number;\n payment_total_paid_amount: number;\n transaction_amount_total: number;\n coupon_amount_total: number;\n sale_fee_total: number;\n avg_order_value: number;\n avg_paid_amount_per_order: number;\n avg_units_per_order: number;\n avg_distinct_items_per_order: number;\n avg_sale_fee_per_order: number;\n sale_fee_rate: number;\n};\n\ntype BuyerAggregate = {\n buyer_id: string;\n nickname: string;\n orders: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype ItemAggregate = {\n item_id: string;\n title: string;\n seller_sku: string;\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype VariationAggregate = {\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype SkuAggregate = {\n seller_sku: string;\n orders: number;\n units: number;\n revenue_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 totalOrders: 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, totalOrders),\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, totalOrders) : 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 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(([currency, amount]) => [currency, roundMoney(amount)])\n );\n}\n\nfunction compactFeedbackValue(value: unknown): string {\n const compact = compactNestedValue(value);\n return compact.trim();\n}\n\nfunction getFirstPayment(order: Record<string, unknown>) {\n return asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n}\n\nfunction getOrderCurrency(order: Record<string, unknown>) {\n return normalizeString(order.currency_id, \"UNKNOWN\");\n}\n\nfunction buildCalculations(\n orders: Array<Record<string, unknown>>,\n metadata: OrderSummaryMetadata,\n failedPages: FailedPage[]\n) {\n const ordersTotal = orders.length;\n const statusCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const channelCounts = new Map<string, number>();\n const siteCounts = new Map<string, number>();\n const paymentStatusCounts = new Map<string, number>();\n const paymentStatusDetailCounts = new Map<string, number>();\n const paymentMethodCounts = new Map<string, number>();\n const paymentTypeCounts = new Map<string, number>();\n const installmentsCounts = new Map<string, number>();\n const stockNodeCounts = new Map<string, number>();\n const listingTypeCounts = new Map<string, number>();\n const variationValueCounts = new Map<string, number>();\n const buyers = new Map<string, BuyerAggregate>();\n const items = new Map<string, ItemAggregate>();\n const variations = new Map<string, VariationAggregate>();\n const skus = new Map<string, SkuAggregate>();\n\n let unitsTotal = 0;\n let fulfilledOrders = 0;\n let deliveredOrders = 0;\n let packOrders = 0;\n let discountedOrders = 0;\n let catalogOrders = 0;\n let ordersWithFeedback = 0;\n let ordersWithChangeRequest = 0;\n let ordersWithReturnRequest = 0;\n let feedbackBuyerCount = 0;\n let feedbackSellerCount = 0;\n let ordersWithShipping = 0;\n let singleItemOrders = 0;\n let multiItemOrders = 0;\n let ordersWithoutPaymentData = 0;\n let paymentApprovedOrders = 0;\n let itemLineCount = 0;\n let ordersWithAnyPostSaleIssue = 0;\n\n const itemsSeen = new Set<string>();\n const buyerSeen = new Set<string>();\n const financialRaw: Record<\n string,\n {\n orders: number;\n units: number;\n distinctItems: number;\n revenue: number;\n paidAmount: number;\n paymentTotalPaidAmount: number;\n transactionAmount: number;\n couponAmount: number;\n saleFee: number;\n }\n > = {};\n\n for (const order of orders) {\n const currencyId = getOrderCurrency(order);\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const couponAmount = toNumber(asRecord(order.coupon).amount);\n const payment = getFirstPayment(order);\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const shipping = asRecord(order.shipping);\n const context = asRecord(order.context);\n const paymentStatus = normalizeString(payment.status);\n const paymentStatusDetail = normalizeString(payment.status_detail);\n const paymentMethod = normalizeString(payment.payment_method_id);\n const paymentType = normalizeString(payment.payment_type);\n const installments = normalizeScalarString(payment.installments);\n const tags = asArray(order.tags).map((tag) => normalizeScalarString(tag)).filter(Boolean);\n const orderItemDistinctIds = new Set<string>();\n\n financialRaw[currencyId] = financialRaw[currencyId] ?? {\n orders: 0,\n units: 0,\n distinctItems: 0,\n revenue: 0,\n paidAmount: 0,\n paymentTotalPaidAmount: 0,\n transactionAmount: 0,\n couponAmount: 0,\n saleFee: 0,\n };\n\n financialRaw[currencyId].orders += 1;\n financialRaw[currencyId].revenue += totalAmount;\n financialRaw[currencyId].paidAmount += paidAmount;\n financialRaw[currencyId].paymentTotalPaidAmount += toNumber(payment.total_paid_amount);\n financialRaw[currencyId].transactionAmount += toNumber(payment.transaction_amount);\n financialRaw[currencyId].couponAmount += couponAmount;\n\n incrementCount(statusCounts, normalizeString(order.status));\n incrementCount(channelCounts, normalizeString(context.channel));\n incrementCount(siteCounts, normalizeString(context.site));\n\n if (paymentStatus) {\n incrementCount(paymentStatusCounts, paymentStatus);\n } else {\n ordersWithoutPaymentData += 1;\n }\n incrementCount(paymentStatusDetailCounts, paymentStatusDetail);\n incrementCount(paymentMethodCounts, paymentMethod);\n incrementCount(paymentTypeCounts, paymentType);\n incrementCount(installmentsCounts, installments);\n\n if (paymentStatus === \"approved\") {\n paymentApprovedOrders += 1;\n }\n\n if (order.fulfilled === true) {\n fulfilledOrders += 1;\n }\n\n if (normalizeScalarString(shipping.id)) {\n ordersWithShipping += 1;\n }\n\n if (orderItems.length === 1) {\n singleItemOrders += 1;\n } else if (orderItems.length > 1) {\n multiItemOrders += 1;\n }\n\n for (const tag of tags) {\n incrementCount(tagCounts, tag);\n }\n\n if (tags.includes(\"delivered\")) {\n deliveredOrders += 1;\n }\n if (tags.includes(\"pack_order\")) {\n packOrders += 1;\n }\n if (tags.includes(\"order_has_discount\")) {\n discountedOrders += 1;\n }\n if (tags.includes(\"catalog\")) {\n catalogOrders += 1;\n }\n\n const feedbackBuyer = compactFeedbackValue(feedback.buyer);\n const feedbackSeller = compactFeedbackValue(feedback.seller);\n const hasFeedback = Boolean(feedbackBuyer || feedbackSeller);\n if (hasFeedback) {\n ordersWithFeedback += 1;\n }\n if (feedbackBuyer) {\n feedbackBuyerCount += 1;\n }\n if (feedbackSeller) {\n feedbackSellerCount += 1;\n }\n\n const hasChangeRequest = Boolean(compactFeedbackValue(orderRequest.change));\n const hasReturnRequest = Boolean(compactFeedbackValue(orderRequest.return));\n if (hasChangeRequest) {\n ordersWithChangeRequest += 1;\n }\n if (hasReturnRequest) {\n ordersWithReturnRequest += 1;\n }\n if (hasFeedback || hasChangeRequest || hasReturnRequest) {\n ordersWithAnyPostSaleIssue += 1;\n }\n\n const buyerId = normalizeScalarString(buyer.id);\n const buyerNickname = normalizeString(buyer.nickname);\n if (buyerId || buyerNickname) {\n const buyerKey = buyerId || buyerNickname;\n buyerSeen.add(buyerKey);\n const currentBuyer = buyers.get(buyerKey) ?? {\n buyer_id: buyerId,\n nickname: buyerNickname,\n orders: 0,\n revenue_by_currency: {},\n };\n currentBuyer.orders += 1;\n incrementCurrency(currentBuyer.revenue_by_currency, currencyId, totalAmount);\n buyers.set(buyerKey, currentBuyer);\n }\n\n for (const orderItem of orderItems) {\n itemLineCount += 1;\n const item = asRecord(orderItem.item);\n const stock = asRecord(orderItem.stock);\n const itemId = normalizeString(item.id);\n const title = normalizeString(item.title);\n const sellerSku = normalizeString(item.seller_sku);\n const quantity = toNumber(orderItem.quantity);\n const unitPrice = toNumber(orderItem.unit_price);\n const saleFee = toNumber(orderItem.sale_fee);\n const listingType = normalizeString(orderItem.listing_type_id);\n const stockNode = normalizeString(stock.node_id);\n const variationSummary = compactVariationAttributes(item.variation_attributes);\n const itemKey = `${itemId}::${variationSummary}::${sellerSku}`;\n const skuKey = sellerSku || itemId || title;\n const variationKey = variationSummary || \"NO_VARIATION\";\n\n unitsTotal += quantity;\n financialRaw[currencyId].units += quantity;\n financialRaw[currencyId].saleFee += saleFee;\n\n if (itemId) {\n itemsSeen.add(itemId);\n orderItemDistinctIds.add(itemId);\n }\n\n incrementCount(listingTypeCounts, listingType);\n incrementCount(stockNodeCounts, stockNode);\n incrementCount(variationValueCounts, variationKey);\n\n const itemAggregate = items.get(itemKey) ?? {\n item_id: itemId,\n title,\n seller_sku: sellerSku,\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n itemAggregate.orders += 1;\n itemAggregate.units += quantity;\n incrementCurrency(itemAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n incrementCurrency(itemAggregate.sale_fee_by_currency, currencyId, saleFee);\n items.set(itemKey, itemAggregate);\n\n const variationAggregate = variations.get(variationKey) ?? {\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n variationAggregate.orders += 1;\n variationAggregate.units += quantity;\n incrementCurrency(variationAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n variations.set(variationKey, variationAggregate);\n\n const skuAggregate = skus.get(skuKey) ?? {\n seller_sku: sellerSku,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n skuAggregate.orders += 1;\n skuAggregate.units += quantity;\n incrementCurrency(skuAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n skus.set(skuKey, skuAggregate);\n }\n\n financialRaw[currencyId].distinctItems += orderItemDistinctIds.size;\n }\n\n const financialByCurrency: Record<string, CurrencyCalculation> = {};\n for (const [currencyId, raw] of Object.entries(financialRaw)) {\n financialByCurrency[currencyId] = {\n revenue_total: roundMoney(raw.revenue),\n paid_amount_total: roundMoney(raw.paidAmount),\n payment_total_paid_amount: roundMoney(raw.paymentTotalPaidAmount),\n transaction_amount_total: roundMoney(raw.transactionAmount),\n coupon_amount_total: roundMoney(raw.couponAmount),\n sale_fee_total: roundMoney(raw.saleFee),\n avg_order_value: roundMoney(raw.revenue / Math.max(1, raw.orders)),\n avg_paid_amount_per_order: roundMoney(raw.paidAmount / Math.max(1, raw.orders)),\n avg_units_per_order: roundMoney(raw.units / Math.max(1, raw.orders)),\n avg_distinct_items_per_order: roundMoney(raw.distinctItems / Math.max(1, raw.orders)),\n avg_sale_fee_per_order: roundMoney(raw.saleFee / Math.max(1, raw.orders)),\n sale_fee_rate: safeRate(raw.saleFee, raw.revenue),\n };\n }\n\n const topItemsByRevenue = Array.from(items.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.item_id.localeCompare(right.item_id);\n })\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByUnits = Array.from(items.values())\n .sort((left, right) => right.units - left.units || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByOrders = Array.from(items.values())\n .sort((left, right) => right.orders - left.orders || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topVariations = Array.from(variations.values())\n .filter((variation) => variation.variation_summary)\n .sort((left, right) => right.units - left.units || left.variation_summary.localeCompare(right.variation_summary))\n .slice(0, TOP_LIMIT)\n .map((variation) => ({\n ...variation,\n revenue_by_currency: sortedCurrencyTotals(variation.revenue_by_currency),\n }));\n\n const topSkus = Array.from(skus.values())\n .filter((sku) => sku.seller_sku)\n .sort((left, right) => right.units - left.units || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n ...sku,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n }));\n\n const topBuyersByRevenue = Array.from(buyers.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.buyer_id.localeCompare(right.buyer_id);\n })\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const topBuyersByOrders = Array.from(buyers.values())\n .sort((left, right) => right.orders - left.orders || left.buyer_id.localeCompare(right.buyer_id))\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const buyersWithMultipleOrders = Array.from(buyers.values()).filter((buyer) => buyer.orders > 1).length;\n\n const topVariationValues = Array.from(variationValueCounts.entries())\n .filter(([key]) => key && key !== \"NO_VARIATION\")\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))\n .slice(0, TOP_LIMIT)\n .map(([key, occurrences]) => ({ key, occurrences }));\n\n const topSingleValue = (counts: Map<string, number>) =>\n 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 return {\n overview: {\n orders_total: ordersTotal,\n units_total: unitsTotal,\n distinct_items_total: itemsSeen.size,\n distinct_buyers_total: buyerSeen.size,\n fulfilled_orders: fulfilledOrders,\n delivered_orders: deliveredOrders,\n pack_orders: packOrders,\n orders_with_discount: discountedOrders,\n orders_with_feedback: ordersWithFeedback,\n orders_with_change_request: ordersWithChangeRequest,\n orders_with_return_request: ordersWithReturnRequest,\n },\n financial_by_currency: financialByCurrency,\n order_mix: {\n status_breakdown: topBreakdownFromMap(statusCounts, ordersTotal),\n tags_breakdown: topBreakdownFromMap(tagCounts, ordersTotal),\n channel_breakdown: topBreakdownFromMap(channelCounts, ordersTotal),\n site_breakdown: topBreakdownFromMap(siteCounts, ordersTotal),\n single_item_order_rate: safeRate(singleItemOrders, ordersTotal),\n multi_item_order_rate: safeRate(multiItemOrders, ordersTotal),\n fulfilled_rate: safeRate(fulfilledOrders, ordersTotal),\n delivered_rate: safeRate(deliveredOrders, ordersTotal),\n pack_order_rate: safeRate(packOrders, ordersTotal),\n discounted_order_rate: safeRate(discountedOrders, ordersTotal),\n catalog_order_rate: safeRate(catalogOrders, ordersTotal),\n },\n payment_mix: {\n payment_status_breakdown: topBreakdownFromMap(paymentStatusCounts, ordersTotal),\n payment_status_detail_breakdown: topBreakdownFromMap(paymentStatusDetailCounts, ordersTotal),\n payment_method_breakdown: topBreakdownFromMap(paymentMethodCounts, ordersTotal),\n payment_type_breakdown: topBreakdownFromMap(paymentTypeCounts, ordersTotal),\n installments_breakdown: topBreakdownFromMap(installmentsCounts, ordersTotal),\n payment_approved_rate: safeRate(paymentApprovedOrders, ordersTotal),\n orders_without_payment_data: ordersWithoutPaymentData,\n },\n fulfillment: {\n orders_with_shipping: ordersWithShipping,\n shipping_attached_rate: safeRate(ordersWithShipping, ordersTotal),\n shipping_id_coverage: ordersWithShipping,\n stock_node_breakdown: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n listing_type_breakdown: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n },\n post_sale_friction: {\n orders_with_feedback_rate: safeRate(ordersWithFeedback, ordersTotal),\n feedback_buyer_count: feedbackBuyerCount,\n feedback_seller_count: feedbackSellerCount,\n change_request_rate: safeRate(ordersWithChangeRequest, ordersTotal),\n return_request_rate: safeRate(ordersWithReturnRequest, ordersTotal),\n orders_with_any_post_sale_issue_rate: safeRate(ordersWithAnyPostSaleIssue, ordersTotal),\n },\n product_insights: {\n top_items_by_revenue: topItemsByRevenue,\n top_items_by_units: topItemsByUnits,\n top_items_by_orders: topItemsByOrders,\n top_variations: topVariations,\n top_skus: topSkus,\n top_listing_types: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n top_stock_nodes: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n },\n customer_insights: {\n top_buyers_by_revenue: topBuyersByRevenue,\n top_buyers_by_orders: topBuyersByOrders,\n repeat_buyer_rate: safeRate(buyersWithMultipleOrders, buyerSeen.size),\n buyers_with_multiple_orders: buyersWithMultipleOrders,\n },\n operational_context: {\n most_used_payment_method: topSingleValue(paymentMethodCounts),\n most_used_listing_type: topSingleValue(listingTypeCounts),\n most_used_stock_node: topSingleValue(stockNodeCounts),\n most_used_channel: topSingleValue(channelCounts),\n most_common_tag: topSingleValue(tagCounts),\n most_common_variation_values: topVariationValues,\n },\n coverage: {\n fetch_mode: metadata.fetch_mode,\n universe_fully_fetched: metadata.universe_fully_fetched,\n orders_returned: metadata.returned,\n pages_requested: metadata.pages_requested,\n pages_succeeded: metadata.pages_succeeded,\n pages_failed: metadata.pages_failed,\n failed_pages_count: failedPages.length,\n failed_pages: failedPages,\n },\n };\n}\n\nfunction buildOrdersSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n paginated: boolean;\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n}) {\n const hasMoreForPage = params.effectiveOffset + params.returned < params.total;\n const universeFullyFetched =\n !params.paginated && params.pagesFailed === 0 && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.paginated && hasMoreForPage) {\n continuation = `Reenviar la misma tool con offset=${params.effectiveOffset + params.effectiveLimit} para continuar.`;\n } else 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 = `Se recuperaron paginas parciales. Reintentar la misma tool con los offsets fallidos (${offsets}${moreOffsets}) y limit=${params.effectiveLimit}.`;\n } else if (!params.paginated) {\n continuation = \"Universe fetched successfully.\";\n }\n\n return {\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.paginated ? hasMoreForPage : params.pagesFailed > 0,\n continuation,\n fetch_mode: params.paginated ? \"page\" : \"full\",\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n universe_fully_fetched: universeFullyFetched,\n };\n}\n\nfunction formatCompactOrder(\n order: Record<string, unknown>,\n metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }>\n) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const bucket = currencyBucket(metricsByCurrency, currencyId, createMetricsBucket);\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.avg_order_value = bucket.orders > 0 ? bucket.revenue / bucket.orders : 0;\n\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const firstOrderItem = asRecord(orderItems[0]);\n const firstItem = asRecord(firstOrderItem.item);\n const firstPayment = asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n const shipping = asRecord(order.shipping);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const context = asRecord(order.context);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const coupon = asRecord(order.coupon);\n const stock = asRecord(firstOrderItem.stock);\n\n return [\n normalizeScalarString(order.id),\n compactDateTime(order.date_created),\n normalizeString(order.status),\n totalAmount,\n currencyId,\n normalizeString(buyer.nickname) || normalizeScalarString(buyer.id),\n normalizeString(shipping.status),\n orderItems.length,\n compactDateTime(order.date_closed),\n compactDateTime(order.date_last_updated) || compactDateTime(order.last_updated),\n paidAmount,\n normalizeScalarString(buyer.id),\n normalizeString(seller.nickname) || normalizeScalarString(seller.id),\n normalizeScalarString(seller.id),\n normalizeScalarString(shipping.id),\n normalizeScalarString(order.pack_id),\n Boolean(order.fulfilled),\n compactStringList(order.tags),\n normalizeString(context.channel),\n normalizeString(context.site),\n normalizeScalarString(firstPayment.id),\n normalizeString(firstPayment.status),\n normalizeString(firstPayment.status_detail),\n normalizeString(firstPayment.payment_method_id),\n normalizeString(firstPayment.payment_type),\n toNumber(firstPayment.total_paid_amount),\n toNumber(firstPayment.transaction_amount),\n toNumber(firstPayment.installments),\n toNumber(coupon.amount),\n compactStringList(firstPayment.available_actions),\n compactNestedValue(feedback.buyer),\n compactNestedValue(feedback.seller),\n compactNestedValue(orderRequest.change),\n compactNestedValue(orderRequest.return),\n normalizeString(firstItem.id),\n normalizeString(firstItem.title),\n normalizeString(firstItem.seller_sku),\n toNumber(firstOrderItem.quantity),\n toNumber(firstOrderItem.unit_price),\n toNumber(firstOrderItem.sale_fee),\n normalizeString(firstOrderItem.listing_type_id),\n compactVariationAttributes(firstItem.variation_attributes),\n normalizeString(stock.node_id),\n ];\n}\n\nexport const meliGetOrdersSummarySchema = 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 MercadoLibre order status filter.\"),\n q: z.string().trim().min(1).optional().describe(\"Optional free-text search query supported by MercadoLibre orders search.\"),\n sort: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Optional pagination offset. If provided, the tool returns only that page instead of trying to fetch the full universe.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Optional page size (1-50). If provided, the tool returns only that page instead of trying to fetch the full universe.\"),\n});\n\r\nexport async function meliGetOrdersSummaryHandler(\r\n params: z.infer<typeof meliGetOrdersSummarySchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\r\n sort: params.sort,\r\n offset: params.offset,\r\n limit: params.limit,\r\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }> = {};\n const paginatedMode = params.offset !== undefined || params.limit !== undefined;\n const effectiveLimit = paging.limit || params.limit || baseOrders.length;\n const effectiveOffset = paging.offset || params.offset || 0;\n\n const allOrders = [...baseOrders];\n const failedPages: Array<{\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 let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (!paginatedMode && effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n nextOffsets.push(nextOffset);\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 q: params.q,\n sort: params.sort,\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 compactOrders = allOrders.map((order) => formatCompactOrder(order, metricsByCurrency));\n\n for (const metrics of Object.values(metricsByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n metrics.avg_order_value = roundMoney(metrics.avg_order_value);\n }\n\n const metadata = buildOrdersSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned: compactOrders.length,\n paginated: paginatedMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n });\n\n const calculations = buildCalculations(allOrders, metadata, failedPages);\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: paginatedMode\n ? {\n ...buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: effectiveLimit,\n offset: effectiveOffset,\n returned: compactOrders.length,\n nextField: \"offset\",\n }),\n ...metadata,\n }\n : metadata,\n metrics_by_currency: metricsByCurrency,\n orders_schema: ordersSchema,\n orders: compactOrders,\n calculations,\n failed_pages: failedPages,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre orders summary\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,6CAA6C;AACtD,SAAS,wCAAwC;AAEjD,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAC/B,MAAM,YAAY;AAElB,MAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,kBAAkB,QAAiB,YAAY,OAAe;AACrE,SAAO,QAAQ,MAAM,EAClB,IAAI,CAAC,UAAU,sBAAsB,KAAK,EAAE,KAAK,CAAC,EAClD,OAAO,OAAO,EACd,KAAK,SAAS;AACnB;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,sBAAsB,KAAK;AAC1C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MACJ,IAAI,CAAC,UAAU,mBAAmB,KAAK,CAAC,EACxC,OAAO,OAAO,EACd,KAAK,KAAK;AAAA,EACf;AAEA,QAAM,SAAS,SAAS,KAAK;AAC7B,SAAO,OAAO,QAAQ,MAAM,EACzB,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AAC1B,UAAM,aAAa,mBAAmB,UAAU;AAChD,WAAO,aAAa,GAAG,GAAG,IAAI,UAAU,KAAK;AAAA,EAC/C,CAAC,EACA,OAAO,OAAO,EACd,KAAK,KAAK;AACf;AAEA,SAAS,2BAA2B,OAAwB;AAC1D,SAAO,QAAiC,KAAK,EAC1C,IAAI,CAAC,cAAc;AAClB,UAAM,OAAO,gBAAgB,UAAU,IAAI,KAAK,gBAAgB,UAAU,EAAE;AAC5E,UAAM,kBACJ,gBAAgB,UAAU,UAAU,KACpC,gBAAgB,UAAU,QAAQ,KAClC,sBAAsB,UAAU,KAAK;AAEvC,QAAI,CAAC,QAAQ,CAAC,iBAAiB;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,IAAI,KAAK,eAAe;AAAA,EACpC,CAAC,EACA,OAAO,OAAO,EACd,KAAK,KAAK;AACf;AAEA,SAAS,sBAAsB;AAC7B,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,iBAAiB;AAAA,EACnB;AACF;AAyEA,SAAS,SAAS,WAAmB,aAA6B;AAChE,MAAI,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,YAAY,aAAa,QAAQ,CAAC,CAAC;AACpD;AAEA,SAAS,oBACP,QACA,aACA,QAAQ,WACS;AACjB,QAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,EACvC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC;AAE9E,QAAM,UAAU,OAAO,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,OAAO;AAAA,IAC7D;AAAA,IACA;AAAA,IACA,MAAM,SAAS,QAAQ,WAAW;AAAA,EACpC,EAAE;AAEF,QAAM,cAAc,OAAO,MAAM,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,CAAC;AACjF,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,cAAc,cAAc,IAAI,cAAc;AAAA,IAC9C,YAAY,cAAc,IAAI,SAAS,aAAa,WAAW,IAAI;AAAA,EACrE,CAAC;AACH;AAEA,SAAS,eAAe,KAA0B,KAAa;AAC7D,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,MAAI,IAAI,MAAM,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;AACtC;AAEA,SAAS,kBAAkB,KAA6B,YAAoB,QAAgB;AAC1F,MAAI,UAAU,IAAI,YAAY,IAAI,UAAU,KAAK,KAAK,MAAM;AAC9D;AAEA,SAAS,qBAAqB,OAA+B;AAC3D,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EACjB,OAAO,CAAC,CAAC,EAAE,MAAM,MAAM,WAAW,CAAC,EACnC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,UAAU,MAAM,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,EAC/D;AACF;AAEA,SAAS,qBAAqB,OAAwB;AACpD,QAAM,UAAU,mBAAmB,KAAK;AACxC,SAAO,QAAQ,KAAK;AACtB;AAEA,SAAS,gBAAgB,OAAgC;AACvD,SAAO,SAAS,QAAiC,MAAM,QAAQ,EAAE,CAAC,CAAC;AACrE;AAEA,SAAS,iBAAiB,OAAgC;AACxD,SAAO,gBAAgB,MAAM,aAAa,SAAS;AACrD;AAEA,SAAS,kBACP,QACA,UACA,aACA;AACA,QAAM,cAAc,OAAO;AAC3B,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,4BAA4B,oBAAI,IAAoB;AAC1D,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,uBAAuB,oBAAI,IAAoB;AACrD,QAAM,SAAS,oBAAI,IAA4B;AAC/C,QAAM,QAAQ,oBAAI,IAA2B;AAC7C,QAAM,aAAa,oBAAI,IAAgC;AACvD,QAAM,OAAO,oBAAI,IAA0B;AAE3C,MAAI,aAAa;AACjB,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AACtB,MAAI,aAAa;AACjB,MAAI,mBAAmB;AACvB,MAAI,gBAAgB;AACpB,MAAI,qBAAqB;AACzB,MAAI,0BAA0B;AAC9B,MAAI,0BAA0B;AAC9B,MAAI,qBAAqB;AACzB,MAAI,sBAAsB;AAC1B,MAAI,qBAAqB;AACzB,MAAI,mBAAmB;AACvB,MAAI,kBAAkB;AACtB,MAAI,2BAA2B;AAC/B,MAAI,wBAAwB;AAC5B,MAAI,gBAAgB;AACpB,MAAI,6BAA6B;AAEjC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,eAaF,CAAC;AAEL,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,iBAAiB,KAAK;AACzC,UAAM,cAAc,SAAS,MAAM,YAAY;AAC/C,UAAM,aAAa,SAAS,MAAM,WAAW;AAC7C,UAAM,eAAe,SAAS,SAAS,MAAM,MAAM,EAAE,MAAM;AAC3D,UAAM,UAAU,gBAAgB,KAAK;AACrC,UAAM,aAAa,QAAiC,MAAM,WAAW;AACrE,UAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,UAAM,SAAS,SAAS,MAAM,MAAM;AACpC,UAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,UAAM,eAAe,SAAS,MAAM,aAAa;AACjD,UAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,UAAM,UAAU,SAAS,MAAM,OAAO;AACtC,UAAM,gBAAgB,gBAAgB,QAAQ,MAAM;AACpD,UAAM,sBAAsB,gBAAgB,QAAQ,aAAa;AACjE,UAAM,gBAAgB,gBAAgB,QAAQ,iBAAiB;AAC/D,UAAM,cAAc,gBAAgB,QAAQ,YAAY;AACxD,UAAM,eAAe,sBAAsB,QAAQ,YAAY;AAC/D,UAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,QAAQ,sBAAsB,GAAG,CAAC,EAAE,OAAO,OAAO;AACxF,UAAM,uBAAuB,oBAAI,IAAY;AAE7C,iBAAa,UAAU,IAAI,aAAa,UAAU,KAAK;AAAA,MACrD,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,eAAe;AAAA,MACf,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,wBAAwB;AAAA,MACxB,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,SAAS;AAAA,IACX;AAEA,iBAAa,UAAU,EAAE,UAAU;AACnC,iBAAa,UAAU,EAAE,WAAW;AACpC,iBAAa,UAAU,EAAE,cAAc;AACvC,iBAAa,UAAU,EAAE,0BAA0B,SAAS,QAAQ,iBAAiB;AACrF,iBAAa,UAAU,EAAE,qBAAqB,SAAS,QAAQ,kBAAkB;AACjF,iBAAa,UAAU,EAAE,gBAAgB;AAEzC,mBAAe,cAAc,gBAAgB,MAAM,MAAM,CAAC;AAC1D,mBAAe,eAAe,gBAAgB,QAAQ,OAAO,CAAC;AAC9D,mBAAe,YAAY,gBAAgB,QAAQ,IAAI,CAAC;AAExD,QAAI,eAAe;AACjB,qBAAe,qBAAqB,aAAa;AAAA,IACnD,OAAO;AACL,kCAA4B;AAAA,IAC9B;AACA,mBAAe,2BAA2B,mBAAmB;AAC7D,mBAAe,qBAAqB,aAAa;AACjD,mBAAe,mBAAmB,WAAW;AAC7C,mBAAe,oBAAoB,YAAY;AAE/C,QAAI,kBAAkB,YAAY;AAChC,+BAAyB;AAAA,IAC3B;AAEA,QAAI,MAAM,cAAc,MAAM;AAC5B,yBAAmB;AAAA,IACrB;AAEA,QAAI,sBAAsB,SAAS,EAAE,GAAG;AACtC,4BAAsB;AAAA,IACxB;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,0BAAoB;AAAA,IACtB,WAAW,WAAW,SAAS,GAAG;AAChC,yBAAmB;AAAA,IACrB;AAEA,eAAW,OAAO,MAAM;AACtB,qBAAe,WAAW,GAAG;AAAA,IAC/B;AAEA,QAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,yBAAmB;AAAA,IACrB;AACA,QAAI,KAAK,SAAS,YAAY,GAAG;AAC/B,oBAAc;AAAA,IAChB;AACA,QAAI,KAAK,SAAS,oBAAoB,GAAG;AACvC,0BAAoB;AAAA,IACtB;AACA,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,uBAAiB;AAAA,IACnB;AAEA,UAAM,gBAAgB,qBAAqB,SAAS,KAAK;AACzD,UAAM,iBAAiB,qBAAqB,SAAS,MAAM;AAC3D,UAAM,cAAc,QAAQ,iBAAiB,cAAc;AAC3D,QAAI,aAAa;AACf,4BAAsB;AAAA,IACxB;AACA,QAAI,eAAe;AACjB,4BAAsB;AAAA,IACxB;AACA,QAAI,gBAAgB;AAClB,6BAAuB;AAAA,IACzB;AAEA,UAAM,mBAAmB,QAAQ,qBAAqB,aAAa,MAAM,CAAC;AAC1E,UAAM,mBAAmB,QAAQ,qBAAqB,aAAa,MAAM,CAAC;AAC1E,QAAI,kBAAkB;AACpB,iCAA2B;AAAA,IAC7B;AACA,QAAI,kBAAkB;AACpB,iCAA2B;AAAA,IAC7B;AACA,QAAI,eAAe,oBAAoB,kBAAkB;AACvD,oCAA8B;AAAA,IAChC;AAEA,UAAM,UAAU,sBAAsB,MAAM,EAAE;AAC9C,UAAM,gBAAgB,gBAAgB,MAAM,QAAQ;AACpD,QAAI,WAAW,eAAe;AAC5B,YAAM,WAAW,WAAW;AAC5B,gBAAU,IAAI,QAAQ;AACtB,YAAM,eAAe,OAAO,IAAI,QAAQ,KAAK;AAAA,QAC3C,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,qBAAqB,CAAC;AAAA,MACxB;AACA,mBAAa,UAAU;AACvB,wBAAkB,aAAa,qBAAqB,YAAY,WAAW;AAC3E,aAAO,IAAI,UAAU,YAAY;AAAA,IACnC;AAEA,eAAW,aAAa,YAAY;AAClC,uBAAiB;AACjB,YAAM,OAAO,SAAS,UAAU,IAAI;AACpC,YAAM,QAAQ,SAAS,UAAU,KAAK;AACtC,YAAM,SAAS,gBAAgB,KAAK,EAAE;AACtC,YAAM,QAAQ,gBAAgB,KAAK,KAAK;AACxC,YAAM,YAAY,gBAAgB,KAAK,UAAU;AACjD,YAAM,WAAW,SAAS,UAAU,QAAQ;AAC5C,YAAM,YAAY,SAAS,UAAU,UAAU;AAC/C,YAAM,UAAU,SAAS,UAAU,QAAQ;AAC3C,YAAM,cAAc,gBAAgB,UAAU,eAAe;AAC7D,YAAM,YAAY,gBAAgB,MAAM,OAAO;AAC/C,YAAM,mBAAmB,2BAA2B,KAAK,oBAAoB;AAC7E,YAAM,UAAU,GAAG,MAAM,KAAK,gBAAgB,KAAK,SAAS;AAC5D,YAAM,SAAS,aAAa,UAAU;AACtC,YAAM,eAAe,oBAAoB;AAEzC,oBAAc;AACd,mBAAa,UAAU,EAAE,SAAS;AAClC,mBAAa,UAAU,EAAE,WAAW;AAEpC,UAAI,QAAQ;AACV,kBAAU,IAAI,MAAM;AACpB,6BAAqB,IAAI,MAAM;AAAA,MACjC;AAEA,qBAAe,mBAAmB,WAAW;AAC7C,qBAAe,iBAAiB,SAAS;AACzC,qBAAe,sBAAsB,YAAY;AAEjD,YAAM,gBAAgB,MAAM,IAAI,OAAO,KAAK;AAAA,QAC1C,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,mBAAmB;AAAA,QACnB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,QACtB,sBAAsB,CAAC;AAAA,MACzB;AACA,oBAAc,UAAU;AACxB,oBAAc,SAAS;AACvB,wBAAkB,cAAc,qBAAqB,YAAY,YAAY,QAAQ;AACrF,wBAAkB,cAAc,sBAAsB,YAAY,OAAO;AACzE,YAAM,IAAI,SAAS,aAAa;AAEhC,YAAM,qBAAqB,WAAW,IAAI,YAAY,KAAK;AAAA,QACzD,mBAAmB;AAAA,QACnB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,MACxB;AACA,yBAAmB,UAAU;AAC7B,yBAAmB,SAAS;AAC5B,wBAAkB,mBAAmB,qBAAqB,YAAY,YAAY,QAAQ;AAC1F,iBAAW,IAAI,cAAc,kBAAkB;AAE/C,YAAM,eAAe,KAAK,IAAI,MAAM,KAAK;AAAA,QACvC,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,qBAAqB,CAAC;AAAA,MACxB;AACA,mBAAa,UAAU;AACvB,mBAAa,SAAS;AACtB,wBAAkB,aAAa,qBAAqB,YAAY,YAAY,QAAQ;AACpF,WAAK,IAAI,QAAQ,YAAY;AAAA,IAC/B;AAEA,iBAAa,UAAU,EAAE,iBAAiB,qBAAqB;AAAA,EACjE;AAEA,QAAM,sBAA2D,CAAC;AAClE,aAAW,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC5D,wBAAoB,UAAU,IAAI;AAAA,MAChC,eAAe,WAAW,IAAI,OAAO;AAAA,MACrC,mBAAmB,WAAW,IAAI,UAAU;AAAA,MAC5C,2BAA2B,WAAW,IAAI,sBAAsB;AAAA,MAChE,0BAA0B,WAAW,IAAI,iBAAiB;AAAA,MAC1D,qBAAqB,WAAW,IAAI,YAAY;AAAA,MAChD,gBAAgB,WAAW,IAAI,OAAO;AAAA,MACtC,iBAAiB,WAAW,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACjE,2BAA2B,WAAW,IAAI,aAAa,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MAC9E,qBAAqB,WAAW,IAAI,QAAQ,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACnE,8BAA8B,WAAW,IAAI,gBAAgB,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACpF,wBAAwB,WAAW,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MACxE,eAAe,SAAS,IAAI,SAAS,IAAI,OAAO;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAM,KAAK,MAAM,OAAO,CAAC,EAChD,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,cAAc,OAAO,OAAO,KAAK,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACjG,UAAM,eAAe,OAAO,OAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACnG,WAAO,eAAe,eAAe,KAAK,QAAQ,cAAc,MAAM,OAAO;AAAA,EAC/E,CAAC,EACA,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,EACtE,EAAE;AAEJ,QAAM,kBAAkB,MAAM,KAAK,MAAM,OAAO,CAAC,EAC9C,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC,EAC3F,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,EACtE,EAAE;AAEJ,QAAM,mBAAmB,MAAM,KAAK,MAAM,OAAO,CAAC,EAC/C,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC,EAC7F,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,UAAU;AAAA,IACd,GAAG;AAAA,IACH,qBAAqB,qBAAqB,KAAK,mBAAmB;AAAA,IAClE,sBAAsB,qBAAqB,KAAK,oBAAoB;AAAA,EACtE,EAAE;AAEJ,QAAM,gBAAgB,MAAM,KAAK,WAAW,OAAO,CAAC,EACjD,OAAO,CAAC,cAAc,UAAU,iBAAiB,EACjD,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,kBAAkB,cAAc,MAAM,iBAAiB,CAAC,EAC/G,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,eAAe;AAAA,IACnB,GAAG;AAAA,IACH,qBAAqB,qBAAqB,UAAU,mBAAmB;AAAA,EACzE,EAAE;AAEJ,QAAM,UAAU,MAAM,KAAK,KAAK,OAAO,CAAC,EACrC,OAAO,CAAC,QAAQ,IAAI,UAAU,EAC9B,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK,WAAW,cAAc,MAAM,UAAU,CAAC,EACjG,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,SAAS;AAAA,IACb,GAAG;AAAA,IACH,qBAAqB,qBAAqB,IAAI,mBAAmB;AAAA,EACnE,EAAE;AAEJ,QAAM,qBAAqB,MAAM,KAAK,OAAO,OAAO,CAAC,EAClD,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,cAAc,OAAO,OAAO,KAAK,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACjG,UAAM,eAAe,OAAO,OAAO,MAAM,mBAAmB,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACnG,WAAO,eAAe,eAAe,KAAK,SAAS,cAAc,MAAM,QAAQ;AAAA,EACjF,CAAC,EACA,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,qBAAqB,qBAAqB,MAAM,mBAAmB;AAAA,EACrE,EAAE;AAEJ,QAAM,oBAAoB,MAAM,KAAK,OAAO,OAAO,CAAC,EACjD,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,UAAU,KAAK,SAAS,cAAc,MAAM,QAAQ,CAAC,EAC/F,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,qBAAqB,qBAAqB,MAAM,mBAAmB;AAAA,EACrE,EAAE;AAEJ,QAAM,2BAA2B,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,EAAE;AAEjG,QAAM,qBAAqB,MAAM,KAAK,qBAAqB,QAAQ,CAAC,EACjE,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,QAAQ,cAAc,EAC/C,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC,EAC3E,MAAM,GAAG,SAAS,EAClB,IAAI,CAAC,CAAC,KAAK,WAAW,OAAO,EAAE,KAAK,YAAY,EAAE;AAErD,QAAM,iBAAiB,CAAC,WACtB,MAAM,KAAK,OAAO,QAAQ,CAAC,EACxB,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,EACrB,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,cAAc,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAE7F,SAAO;AAAA,IACL,UAAU;AAAA,MACR,cAAc;AAAA,MACd,aAAa;AAAA,MACb,sBAAsB,UAAU;AAAA,MAChC,uBAAuB,UAAU;AAAA,MACjC,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,4BAA4B;AAAA,MAC5B,4BAA4B;AAAA,IAC9B;AAAA,IACA,uBAAuB;AAAA,IACvB,WAAW;AAAA,MACT,kBAAkB,oBAAoB,cAAc,WAAW;AAAA,MAC/D,gBAAgB,oBAAoB,WAAW,WAAW;AAAA,MAC1D,mBAAmB,oBAAoB,eAAe,WAAW;AAAA,MACjE,gBAAgB,oBAAoB,YAAY,WAAW;AAAA,MAC3D,wBAAwB,SAAS,kBAAkB,WAAW;AAAA,MAC9D,uBAAuB,SAAS,iBAAiB,WAAW;AAAA,MAC5D,gBAAgB,SAAS,iBAAiB,WAAW;AAAA,MACrD,gBAAgB,SAAS,iBAAiB,WAAW;AAAA,MACrD,iBAAiB,SAAS,YAAY,WAAW;AAAA,MACjD,uBAAuB,SAAS,kBAAkB,WAAW;AAAA,MAC7D,oBAAoB,SAAS,eAAe,WAAW;AAAA,IACzD;AAAA,IACA,aAAa;AAAA,MACX,0BAA0B,oBAAoB,qBAAqB,WAAW;AAAA,MAC9E,iCAAiC,oBAAoB,2BAA2B,WAAW;AAAA,MAC3F,0BAA0B,oBAAoB,qBAAqB,WAAW;AAAA,MAC9E,wBAAwB,oBAAoB,mBAAmB,WAAW;AAAA,MAC1E,wBAAwB,oBAAoB,oBAAoB,WAAW;AAAA,MAC3E,uBAAuB,SAAS,uBAAuB,WAAW;AAAA,MAClE,6BAA6B;AAAA,IAC/B;AAAA,IACA,aAAa;AAAA,MACX,sBAAsB;AAAA,MACtB,wBAAwB,SAAS,oBAAoB,WAAW;AAAA,MAChE,sBAAsB;AAAA,MACtB,sBAAsB,oBAAoB,iBAAiB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,MACrF,wBAAwB,oBAAoB,mBAAmB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,IAC3F;AAAA,IACA,oBAAoB;AAAA,MAClB,2BAA2B,SAAS,oBAAoB,WAAW;AAAA,MACnE,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB,qBAAqB,SAAS,yBAAyB,WAAW;AAAA,MAClE,qBAAqB,SAAS,yBAAyB,WAAW;AAAA,MAClE,sCAAsC,SAAS,4BAA4B,WAAW;AAAA,IACxF;AAAA,IACA,kBAAkB;AAAA,MAChB,sBAAsB;AAAA,MACtB,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,mBAAmB,oBAAoB,mBAAmB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,MACpF,iBAAiB,oBAAoB,iBAAiB,KAAK,IAAI,GAAG,aAAa,CAAC;AAAA,IAClF;AAAA,IACA,mBAAmB;AAAA,MACjB,uBAAuB;AAAA,MACvB,sBAAsB;AAAA,MACtB,mBAAmB,SAAS,0BAA0B,UAAU,IAAI;AAAA,MACpE,6BAA6B;AAAA,IAC/B;AAAA,IACA,qBAAqB;AAAA,MACnB,0BAA0B,eAAe,mBAAmB;AAAA,MAC5D,wBAAwB,eAAe,iBAAiB;AAAA,MACxD,sBAAsB,eAAe,eAAe;AAAA,MACpD,mBAAmB,eAAe,aAAa;AAAA,MAC/C,iBAAiB,eAAe,SAAS;AAAA,MACzC,8BAA8B;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,YAAY,SAAS;AAAA,MACrB,wBAAwB,SAAS;AAAA,MACjC,iBAAiB,SAAS;AAAA,MAC1B,iBAAiB,SAAS;AAAA,MAC1B,iBAAiB,SAAS;AAAA,MAC1B,cAAc,SAAS;AAAA,MACvB,oBAAoB,YAAY;AAAA,MAChC,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,QAUjC;AACD,QAAM,iBAAiB,OAAO,kBAAkB,OAAO,WAAW,OAAO;AACzE,QAAM,uBACJ,CAAC,OAAO,aAAa,OAAO,gBAAgB,KAAK,OAAO,YAAY,OAAO;AAE7E,MAAI,eAAe;AACnB,MAAI,OAAO,aAAa,gBAAgB;AACtC,mBAAe,qCAAqC,OAAO,kBAAkB,OAAO,cAAc;AAAA,EACpG,WAAW,OAAO,cAAc,GAAG;AACjC,UAAM,UAAU,OAAO,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAC1D,UAAM,cACJ,OAAO,cAAc,SAAS,IAC1B,MAAM,OAAO,cAAc,SAAS,CAAC,yBACrC;AACN,mBAAe,wFAAwF,OAAO,GAAG,WAAW,aAAa,OAAO,cAAc;AAAA,EAChK,WAAW,CAAC,OAAO,WAAW;AAC5B,mBAAe;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO,YAAY,iBAAiB,OAAO,cAAc;AAAA,IACnE;AAAA,IACA,YAAY,OAAO,YAAY,SAAS;AAAA,IACxC,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,OAAO;AAAA,IACxB,cAAc,OAAO;AAAA,IACrB,wBAAwB;AAAA,EAC1B;AACF;AAEA,SAAS,mBACP,OACA,mBACA;AACA,QAAM,aAAa,gBAAgB,MAAM,aAAa,SAAS;AAC/D,QAAM,cAAc,SAAS,MAAM,YAAY;AAC/C,QAAM,aAAa,SAAS,MAAM,WAAW;AAC7C,QAAM,SAAS,eAAe,mBAAmB,YAAY,mBAAmB;AAChF,SAAO,UAAU;AACjB,SAAO,WAAW;AAClB,SAAO,kBAAkB,OAAO,SAAS,IAAI,OAAO,UAAU,OAAO,SAAS;AAE9E,QAAM,aAAa,QAAiC,MAAM,WAAW;AACrE,QAAM,iBAAiB,SAAS,WAAW,CAAC,CAAC;AAC7C,QAAM,YAAY,SAAS,eAAe,IAAI;AAC9C,QAAM,eAAe,SAAS,QAAiC,MAAM,QAAQ,EAAE,CAAC,CAAC;AACjF,QAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,QAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,QAAM,SAAS,SAAS,MAAM,MAAM;AACpC,QAAM,UAAU,SAAS,MAAM,OAAO;AACtC,QAAM,WAAW,SAAS,MAAM,QAAQ;AACxC,QAAM,eAAe,SAAS,MAAM,aAAa;AACjD,QAAM,SAAS,SAAS,MAAM,MAAM;AACpC,QAAM,QAAQ,SAAS,eAAe,KAAK;AAE3C,SAAO;AAAA,IACL,sBAAsB,MAAM,EAAE;AAAA,IAC9B,gBAAgB,MAAM,YAAY;AAAA,IAClC,gBAAgB,MAAM,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,gBAAgB,MAAM,QAAQ,KAAK,sBAAsB,MAAM,EAAE;AAAA,IACjE,gBAAgB,SAAS,MAAM;AAAA,IAC/B,WAAW;AAAA,IACX,gBAAgB,MAAM,WAAW;AAAA,IACjC,gBAAgB,MAAM,iBAAiB,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC9E;AAAA,IACA,sBAAsB,MAAM,EAAE;AAAA,IAC9B,gBAAgB,OAAO,QAAQ,KAAK,sBAAsB,OAAO,EAAE;AAAA,IACnE,sBAAsB,OAAO,EAAE;AAAA,IAC/B,sBAAsB,SAAS,EAAE;AAAA,IACjC,sBAAsB,MAAM,OAAO;AAAA,IACnC,QAAQ,MAAM,SAAS;AAAA,IACvB,kBAAkB,MAAM,IAAI;AAAA,IAC5B,gBAAgB,QAAQ,OAAO;AAAA,IAC/B,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,sBAAsB,aAAa,EAAE;AAAA,IACrC,gBAAgB,aAAa,MAAM;AAAA,IACnC,gBAAgB,aAAa,aAAa;AAAA,IAC1C,gBAAgB,aAAa,iBAAiB;AAAA,IAC9C,gBAAgB,aAAa,YAAY;AAAA,IACzC,SAAS,aAAa,iBAAiB;AAAA,IACvC,SAAS,aAAa,kBAAkB;AAAA,IACxC,SAAS,aAAa,YAAY;AAAA,IAClC,SAAS,OAAO,MAAM;AAAA,IACtB,kBAAkB,aAAa,iBAAiB;AAAA,IAChD,mBAAmB,SAAS,KAAK;AAAA,IACjC,mBAAmB,SAAS,MAAM;AAAA,IAClC,mBAAmB,aAAa,MAAM;AAAA,IACtC,mBAAmB,aAAa,MAAM;AAAA,IACtC,gBAAgB,UAAU,EAAE;AAAA,IAC5B,gBAAgB,UAAU,KAAK;AAAA,IAC/B,gBAAgB,UAAU,UAAU;AAAA,IACpC,SAAS,eAAe,QAAQ;AAAA,IAChC,SAAS,eAAe,UAAU;AAAA,IAClC,SAAS,eAAe,QAAQ;AAAA,IAChC,gBAAgB,eAAe,eAAe;AAAA,IAC9C,2BAA2B,UAAU,oBAAoB;AAAA,IACzD,gBAAgB,MAAM,OAAO;AAAA,EAC/B;AACF;AAEO,MAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,WAAW;AAAA,EACX,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,EAAE,SAAS,kCAAkC;AAAA,EAC9F,SAAS,EAAE,OAAO,EAAE,MAAM,qBAAqB,EAAE,SAAS,gCAAgC;AAAA,EAC1F,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EACjG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,0EAA0E;AAAA,EAC1H,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EAC3F,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,SAAS,wHAAwH;AAAA,EACtL,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,uHAAuH;AACpL,CAAC;AAED,eAAsB,4BACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,sCAAsC,OAAO,SAAS;AACtF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,WAAW,MAAM,yBAAyB,WAAW;AAAA,MACzD,QAAQ;AAAA,MACR,MAAM,OAAO;AAAA,MACb,IAAI,OAAO;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,GAAG,OAAO;AAAA,MACV,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,IAChB,CAAC;AAED,UAAM,SAAS,4BAA4B,SAAS,SAAS,MAAM,CAAC;AACpE,UAAM,aAAa,QAAiC,SAAS,OAAO;AACpE,UAAM,oBAAkG,CAAC;AACzG,UAAM,gBAAgB,OAAO,WAAW,UAAa,OAAO,UAAU;AACtE,UAAM,iBAAiB,OAAO,SAAS,OAAO,SAAS,WAAW;AAClE,UAAM,kBAAkB,OAAO,UAAU,OAAO,UAAU;AAE1D,UAAM,YAAY,CAAC,GAAG,UAAU;AAChC,UAAM,cAQD,CAAC;AACN,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AAErB,QAAI,CAAC,iBAAiB,iBAAiB,KAAK,OAAO,QAAQ,WAAW,QAAQ;AAC5E,YAAM,cAAwB,CAAC;AAC/B,eAAS,aAAa,kBAAkB,gBAAgB,aAAa,OAAO,OAAO,cAAc,gBAAgB;AAC/G,oBAAY,KAAK,UAAU;AAAA,MAC7B;AAEA,wBAAkB,YAAY;AAE9B,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,QAAQ,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM,OAAO;AAAA,YACb,IAAI,OAAO;AAAA,YACX,QAAQ,OAAO;AAAA,YACf,GAAG,OAAO;AAAA,YACV,MAAM,OAAO;AAAA,YACb,OAAO;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,YACE,gBAAgB;AAAA,YAChB,YAAY;AAAA,UACd;AAAA,QACF;AAEA,0BAAkB,MAAM,WAAW;AACnC,cAAM,WAAW,QAAQ,CAAC,UAAU;AAClC,oBAAU,KAAK,GAAG,QAAiC,MAAM,SAAS,OAAO,CAAC;AAAA,QAC5E,CAAC;AACD,cAAM,OAAO,QAAQ,CAAC,YAAY;AAChC,gBAAM,eAAe,OAAO,QAAQ,EAAE;AACtC,sBAAY,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,aAAa,KAAK,MAAM,eAAe,cAAc,IAAI;AAAA,YACzD,SAAS,QAAQ;AAAA,YACjB,aAAa,QAAQ;AAAA,YACrB,UAAU,QAAQ;AAAA,YAClB,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,gBAAgB,UAAU,IAAI,CAAC,UAAU,mBAAmB,OAAO,iBAAiB,CAAC;AAE3F,eAAW,WAAW,OAAO,OAAO,iBAAiB,GAAG;AACtD,cAAQ,UAAU,WAAW,QAAQ,OAAO;AAC5C,cAAQ,kBAAkB,WAAW,QAAQ,eAAe;AAAA,IAC9D;AAEA,UAAM,WAAW,2BAA2B;AAAA,MAC1C,OAAO,OAAO;AAAA,MACd;AAAA,MACA;AAAA,MACA,UAAU,cAAc;AAAA,MACxB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,aAAa,YAAY;AAAA,MACzB,eAAe,YAAY,IAAI,CAAC,YAAY,QAAQ,MAAM;AAAA,IAC5D,CAAC;AAED,UAAM,eAAe,kBAAkB,WAAW,UAAU,WAAW;AAEvE,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,UAAU,gBACN;AAAA,UACE,GAAG,oCAAoC;AAAA,YACrC,OAAO,OAAO;AAAA,YACd,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,UAAU,cAAc;AAAA,YACxB,WAAW;AAAA,UACb,CAAC;AAAA,UACD,GAAG;AAAA,QACL,IACA;AAAA,QACJ,qBAAqB;AAAA,QACrB,eAAe;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAwB,KAAK,6CAA6C,CAAC;AAAA,EAC1F;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-sales-by-item.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliGetSalesByItemSchema = 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 limit: z.number().int().min(1).max(50).optional().describe(\"Orders page size to aggregate.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to aggregate.\"),\n});\n\nexport async function meliGetSalesByItemHandler(\n params: z.infer<typeof meliGetSalesByItemSchema>\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 response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n });\n\n const orders = asArray<Record<string, unknown>>(response.results);\n type SalesByItemRow = {\n item_id: string;\n title: string;\n variation_id: string;\n orders: number;\n units: number;\n revenue: number;\n last_order_date?: string | null;\n };\n const salesByCurrency: Record<string, Record<string, SalesByItemRow>> = {};\n\n for (const order of orders) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const orderDate = compactDateTime(order.date_created);\n for (const orderItem of asArray<Record<string, unknown>>(order.order_items)) {\n const item = asRecord(orderItem.item);\n const itemId = normalizeString(item.id);\n const variationId = normalizeString(item.variation_id);\n const itemKey = `${itemId}::${variationId}`;\n const bucket = currencyBucket<Record<string, SalesByItemRow>>(\n salesByCurrency,\n currencyId,\n () => ({})\n );\n bucket[itemKey] = bucket[itemKey] ?? {\n item_id: itemId,\n title: normalizeString(item.title),\n variation_id: variationId,\n orders: 0,\n units: 0,\n revenue: 0,\n last_order_date: orderDate,\n };\n bucket[itemKey].orders += 1;\n bucket[itemKey].units += toNumber(orderItem.quantity);\n bucket[itemKey].revenue += toNumber(orderItem.unit_price) * toNumber(orderItem.quantity);\n bucket[itemKey].last_order_date = orderDate ?? bucket[itemKey].last_order_date;\n }\n }\n\n const result = Object.fromEntries(\n Object.entries(salesByCurrency).map(([currencyId, items]) => [\n currencyId,\n Object.values(items)\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\n .sort((left, right) => right.revenue - left.revenue),\n ])\n );\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n orders_aggregated: orders.length,\n offset: params.offset ?? 0,\n limit: params.limit ?? 50,\n note: \"If metadata.total is higher than orders_aggregated, reenviar la misma tool con un offset mayor para completar el agregado.\",\n },\n sales_by_currency: result,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to aggregate MercadoLibre sales by item\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport {\r\n asArray,\r\n asRecord,\r\n compactDateTime,\r\n currencyBucket,\r\n mercadoLibreDateRegex,\r\n normalizeString,\r\n roundMoney,\r\n toNumber,\r\n} from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nexport const meliGetSalesByItemSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\r\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\r\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\r\n limit: z.number().int().min(1).max(50).optional().describe(\"Orders page size to aggregate.\"),\r\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to aggregate.\"),\r\n});\r\n\r\nexport async function meliGetSalesByItemHandler(\r\n params: z.infer<typeof meliGetSalesByItemSchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const response = await searchMercadoLibreOrders(profileId, {\r\n seller: \"\",\r\n from: params.startDate,\r\n to: params.endDate,\r\n status: params.status,\r\n limit: params.limit ?? 50,\r\n offset: params.offset ?? 0,\r\n });\r\n\r\n const orders = asArray<Record<string, unknown>>(response.results);\r\n type SalesByItemRow = {\r\n item_id: string;\r\n title: string;\r\n variation_id: string;\r\n orders: number;\r\n units: number;\r\n revenue: number;\r\n last_order_date?: string | null;\r\n };\r\n const salesByCurrency: Record<string, Record<string, SalesByItemRow>> = {};\r\n\r\n for (const order of orders) {\r\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\r\n const orderDate = compactDateTime(order.date_created);\r\n for (const orderItem of asArray<Record<string, unknown>>(order.order_items)) {\r\n const item = asRecord(orderItem.item);\r\n const itemId = normalizeString(item.id);\r\n const variationId = normalizeString(item.variation_id);\r\n const itemKey = `${itemId}::${variationId}`;\r\n const bucket = currencyBucket<Record<string, SalesByItemRow>>(\r\n salesByCurrency,\r\n currencyId,\r\n () => ({})\r\n );\r\n bucket[itemKey] = bucket[itemKey] ?? {\r\n item_id: itemId,\r\n title: normalizeString(item.title),\r\n variation_id: variationId,\r\n orders: 0,\r\n units: 0,\r\n revenue: 0,\r\n last_order_date: orderDate,\r\n };\r\n bucket[itemKey].orders += 1;\r\n bucket[itemKey].units += toNumber(orderItem.quantity);\r\n bucket[itemKey].revenue += toNumber(orderItem.unit_price) * toNumber(orderItem.quantity);\r\n bucket[itemKey].last_order_date = orderDate ?? bucket[itemKey].last_order_date;\r\n }\r\n }\r\n\r\n const result = Object.fromEntries(\r\n Object.entries(salesByCurrency).map(([currencyId, items]) => [\r\n currencyId,\r\n Object.values(items)\r\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\r\n .sort((left, right) => right.revenue - left.revenue),\r\n ])\r\n );\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileId,\r\n metadata: {\r\n orders_aggregated: orders.length,\r\n offset: params.offset ?? 0,\r\n limit: params.limit ?? 50,\r\n note: \"If metadata.total is higher than orders_aggregated, reenviar la misma tool con un offset mayor para completar el agregado.\",\r\n },\r\n sales_by_currency: result,\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to aggregate MercadoLibre sales by item\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-sales-trend.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, mercadoLibreDateRegex, normalizeString, roundMoney, toNumber } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nfunction getWeekBucket(dateValue: string): string {\n const date = new Date(`${dateValue}T00:00:00.000Z`);\n const day = date.getUTCDay() || 7;\n date.setUTCDate(date.getUTCDate() - day + 1);\n return date.toISOString().slice(0, 10);\n}\n\nexport const meliGetSalesTrendSchema = 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 granularity: z.enum([\"day\", \"week\"]).optional().describe(\"Trend granularity. Defaults to day.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Orders page size to aggregate.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to aggregate.\"),\n});\n\nexport async function meliGetSalesTrendHandler(params: z.infer<typeof meliGetSalesTrendSchema>) {\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 granularity = params.granularity ?? \"day\";\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n });\n\n const buckets: Record<string, Record<string, { bucket: string; orders: number; revenue: number }>> = {};\n\n for (const order of asArray<Record<string, unknown>>(response.results)) {\n const createdAt = normalizeString(order.date_created);\n const dateBucket = createdAt.slice(0, 10);\n if (!dateBucket) {\n continue;\n }\n\n const bucketKey = granularity === \"week\" ? getWeekBucket(dateBucket) : dateBucket;\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n buckets[currencyId] = buckets[currencyId] ?? {};\n buckets[currencyId][bucketKey] = buckets[currencyId][bucketKey] ?? {\n bucket: bucketKey,\n orders: 0,\n revenue: 0,\n };\n buckets[currencyId][bucketKey].orders += 1;\n buckets[currencyId][bucketKey].revenue += toNumber(order.total_amount);\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n granularity,\n trend_by_currency: Object.fromEntries(\n Object.entries(buckets).map(([currencyId, items]) => [\n currencyId,\n Object.values(items)\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\n .sort((left, right) => left.bucket.localeCompare(right.bucket)),\n ])\n ),\n metadata: {\n orders_aggregated: asArray(response.results).length,\n limit: params.limit ?? 50,\n offset: params.offset ?? 0,\n },\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to build MercadoLibre sales trend\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport { asArray, mercadoLibreDateRegex, normalizeString, roundMoney, toNumber } from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nfunction getWeekBucket(dateValue: string): string {\r\n const date = new Date(`${dateValue}T00:00:00.000Z`);\r\n const day = date.getUTCDay() || 7;\r\n date.setUTCDate(date.getUTCDate() - day + 1);\r\n return date.toISOString().slice(0, 10);\r\n}\r\n\r\nexport const meliGetSalesTrendSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\r\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\r\n granularity: z.enum([\"day\", \"week\"]).optional().describe(\"Trend granularity. Defaults to day.\"),\r\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\r\n limit: z.number().int().min(1).max(50).optional().describe(\"Orders page size to aggregate.\"),\r\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to aggregate.\"),\r\n});\r\n\r\nexport async function meliGetSalesTrendHandler(params: z.infer<typeof meliGetSalesTrendSchema>) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const granularity = params.granularity ?? \"day\";\r\n const response = await searchMercadoLibreOrders(profileId, {\r\n seller: \"\",\r\n from: params.startDate,\r\n to: params.endDate,\r\n status: params.status,\r\n limit: params.limit ?? 50,\r\n offset: params.offset ?? 0,\r\n });\r\n\r\n const buckets: Record<string, Record<string, { bucket: string; orders: number; revenue: number }>> = {};\r\n\r\n for (const order of asArray<Record<string, unknown>>(response.results)) {\r\n const createdAt = normalizeString(order.date_created);\r\n const dateBucket = createdAt.slice(0, 10);\r\n if (!dateBucket) {\r\n continue;\r\n }\r\n\r\n const bucketKey = granularity === \"week\" ? getWeekBucket(dateBucket) : dateBucket;\r\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\r\n buckets[currencyId] = buckets[currencyId] ?? {};\r\n buckets[currencyId][bucketKey] = buckets[currencyId][bucketKey] ?? {\r\n bucket: bucketKey,\r\n orders: 0,\r\n revenue: 0,\r\n };\r\n buckets[currencyId][bucketKey].orders += 1;\r\n buckets[currencyId][bucketKey].revenue += toNumber(order.total_amount);\r\n }\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileId,\r\n granularity,\r\n trend_by_currency: Object.fromEntries(\r\n Object.entries(buckets).map(([currencyId, items]) => [\r\n currencyId,\r\n Object.values(items)\r\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\r\n .sort((left, right) => left.bucket.localeCompare(right.bucket)),\r\n ])\r\n ),\r\n metadata: {\r\n orders_aggregated: asArray(response.results).length,\r\n limit: params.limit ?? 50,\r\n offset: params.offset ?? 0,\r\n },\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to build MercadoLibre sales trend\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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 { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreShipment,\n getMercadoLibreShipmentCosts,\n searchMercadoLibreOrders,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\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 limit: z.number().int().min(1).max(30).optional().describe(\"Orders page size to inspect for shipping data.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to inspect.\"),\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 ordersResponse = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n });\n\n const statusCounts: Record<string, number> = {};\n const substatusCounts: Record<string, number> = {};\n const costsByCurrency: Record<string, { shipments: number; total_cost: number }> = {};\n const partialFailures: Array<{ order_id?: string; shipment_id?: string; message: string }> = [];\n const shipmentRows: Array<Record<string, unknown>> = [];\n\n for (const order of asArray<Record<string, unknown>>(ordersResponse.results)) {\n const shipping = asRecord(order.shipping);\n const shipmentId = normalizeString(shipping.id);\n if (!shipmentId) {\n continue;\n }\n\n try {\n const [shipment, costs] = await Promise.all([\n getMercadoLibreShipment(profileId, shipmentId),\n getMercadoLibreShipmentCosts(profileId, shipmentId),\n ]);\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\n statusCounts[shipmentStatus] = (statusCounts[shipmentStatus] ?? 0) + 1;\n substatusCounts[shipmentSubstatus] = (substatusCounts[shipmentSubstatus] ?? 0) + 1;\n\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({ shipments: 0, total_cost: 0 }));\n bucket.shipments += 1;\n bucket.total_cost +=\n toNumber(asRecord(costs.senders).cost) ||\n toNumber(asRecord(costs.receiver).cost) ||\n toNumber(costs.gross_amount) ||\n toNumber(costs.cost);\n\n shipmentRows.push(\n stripNulls({\n order_id: normalizeString(order.id),\n shipment_id: shipmentId,\n status: shipmentStatus,\n substatus: shipmentSubstatus,\n logistic_type: normalizeString(shipment.logistic_type),\n mode: normalizeString(shipment.mode),\n currency_id: currencyId,\n cost: roundMoney(bucket.total_cost),\n })\n );\n } catch (shipmentError) {\n partialFailures.push({\n order_id: normalizeString(order.id),\n shipment_id: shipmentId,\n message: formatMercadoLibreError(shipmentError, `Failed to inspect shipment ${shipmentId}`),\n });\n }\n }\n\n for (const metrics of Object.values(costsByCurrency)) {\n metrics.total_cost = roundMoney(metrics.total_cost);\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n orders_inspected: asArray(ordersResponse.results).length,\n shipments_inspected: shipmentRows.length,\n partial_failures: partialFailures.length,\n has_partial_failures: partialFailures.length > 0,\n },\n status_counts: statusCounts,\n substatus_counts: substatusCounts,\n costs_by_currency: costsByCurrency,\n shipments: shipmentRows,\n failures: partialFailures,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to summarize MercadoLibre shipping\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport {\r\n getMercadoLibreShipment,\r\n getMercadoLibreShipmentCosts,\r\n searchMercadoLibreOrders,\r\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport {\r\n asArray,\r\n asRecord,\r\n currencyBucket,\r\n mercadoLibreDateRegex,\r\n normalizeString,\r\n roundMoney,\r\n toNumber,\r\n} from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nexport const meliGetShippingSummarySchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\r\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\r\n status: z.string().trim().min(1).optional().describe(\"Optional order status filter.\"),\r\n limit: z.number().int().min(1).max(30).optional().describe(\"Orders page size to inspect for shipping data.\"),\r\n offset: z.number().int().min(0).max(5000).optional().describe(\"Orders offset to inspect.\"),\r\n});\r\n\r\nexport async function meliGetShippingSummaryHandler(\r\n params: z.infer<typeof meliGetShippingSummarySchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const ordersResponse = await searchMercadoLibreOrders(profileId, {\r\n seller: \"\",\r\n from: params.startDate,\r\n to: params.endDate,\r\n status: params.status,\r\n limit: params.limit ?? 20,\r\n offset: params.offset ?? 0,\r\n });\r\n\r\n const statusCounts: Record<string, number> = {};\r\n const substatusCounts: Record<string, number> = {};\r\n const costsByCurrency: Record<string, { shipments: number; total_cost: number }> = {};\r\n const partialFailures: Array<{ order_id?: string; shipment_id?: string; message: string }> = [];\r\n const shipmentRows: Array<Record<string, unknown>> = [];\r\n\r\n for (const order of asArray<Record<string, unknown>>(ordersResponse.results)) {\r\n const shipping = asRecord(order.shipping);\r\n const shipmentId = normalizeString(shipping.id);\r\n if (!shipmentId) {\r\n continue;\r\n }\r\n\r\n try {\r\n const [shipment, costs] = await Promise.all([\r\n getMercadoLibreShipment(profileId, shipmentId),\r\n getMercadoLibreShipmentCosts(profileId, shipmentId),\r\n ]);\r\n const shipmentStatus = normalizeString(shipment.status, \"unknown\");\r\n const shipmentSubstatus = normalizeString(shipment.substatus, \"unknown\");\r\n statusCounts[shipmentStatus] = (statusCounts[shipmentStatus] ?? 0) + 1;\r\n substatusCounts[shipmentSubstatus] = (substatusCounts[shipmentSubstatus] ?? 0) + 1;\r\n\r\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\r\n const bucket = currencyBucket(costsByCurrency, currencyId, () => ({ shipments: 0, total_cost: 0 }));\r\n bucket.shipments += 1;\r\n bucket.total_cost +=\r\n toNumber(asRecord(costs.senders).cost) ||\r\n toNumber(asRecord(costs.receiver).cost) ||\r\n toNumber(costs.gross_amount) ||\r\n toNumber(costs.cost);\r\n\r\n shipmentRows.push(\r\n stripNulls({\r\n order_id: normalizeString(order.id),\r\n shipment_id: shipmentId,\r\n status: shipmentStatus,\r\n substatus: shipmentSubstatus,\r\n logistic_type: normalizeString(shipment.logistic_type),\r\n mode: normalizeString(shipment.mode),\r\n currency_id: currencyId,\r\n cost: roundMoney(bucket.total_cost),\r\n })\r\n );\r\n } catch (shipmentError) {\r\n partialFailures.push({\r\n order_id: normalizeString(order.id),\r\n shipment_id: shipmentId,\r\n message: formatMercadoLibreError(shipmentError, `Failed to inspect shipment ${shipmentId}`),\r\n });\r\n }\r\n }\r\n\r\n for (const metrics of Object.values(costsByCurrency)) {\r\n metrics.total_cost = roundMoney(metrics.total_cost);\r\n }\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileId,\r\n metadata: {\r\n orders_inspected: asArray(ordersResponse.results).length,\r\n shipments_inspected: shipmentRows.length,\r\n partial_failures: partialFailures.length,\r\n has_partial_failures: partialFailures.length > 0,\r\n },\r\n status_counts: statusCounts,\r\n substatus_counts: substatusCounts,\r\n costs_by_currency: costsByCurrency,\r\n shipments: shipmentRows,\r\n failures: partialFailures,\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to summarize MercadoLibre shipping\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-store-performance.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreItems, getMercadoLibreUserItemsVisits } from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n currencyBucket,\n mercadoLibreDateRegex,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliGetStorePerformanceSchema = 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 ordersLimit: z.number().int().min(1).max(50).optional().describe(\"Orders sample size to analyze. Defaults to 30.\"),\n itemsLimit: z.number().int().min(1).max(50).optional().describe(\"Items sample size to analyze. Defaults to 20.\"),\n});\n\nexport async function meliGetStorePerformanceHandler(\n params: z.infer<typeof meliGetStorePerformanceSchema>\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 access = await getMercadoLibreAccessForProfile(profileId);\n const [ordersResponse, itemsResponse, visitsResponse] = await Promise.all([\n searchMercadoLibreOrders(profileId, {\n seller: access.sellerId,\n from: params.startDate,\n to: params.endDate,\n limit: params.ordersLimit ?? 30,\n offset: 0,\n }),\n searchMercadoLibreItems(profileId, {\n sellerId: access.sellerId,\n limit: params.itemsLimit ?? 20,\n offset: 0,\n }),\n getMercadoLibreUserItemsVisits(profileId, access.sellerId, params.startDate, params.endDate),\n ]);\n\n const orders = asArray<Record<string, unknown>>(ordersResponse.results);\n const items = asArray<string | Record<string, unknown>>(itemsResponse.results);\n const visitsRows = asArray<Record<string, unknown>>(visitsResponse.results ?? visitsResponse.items ?? visitsResponse.visits);\n\n const revenueByCurrency: Record<string, { orders: number; revenue: number }> = {};\n const topItems = new Map<string, { item_id: string; title: string; units: number; revenue: number }>();\n for (const order of orders) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const bucket = currencyBucket(revenueByCurrency, currencyId, () => ({ orders: 0, revenue: 0 }));\n bucket.orders += 1;\n bucket.revenue += toNumber(order.total_amount);\n for (const orderItem of asArray<Record<string, unknown>>(order.order_items)) {\n const item = asRecord(orderItem.item);\n const key = normalizeString(item.id);\n topItems.set(key, {\n item_id: key,\n title: normalizeString(item.title),\n units: (topItems.get(key)?.units ?? 0) + toNumber(orderItem.quantity),\n revenue: (topItems.get(key)?.revenue ?? 0) + toNumber(orderItem.unit_price) * toNumber(orderItem.quantity),\n });\n }\n }\n\n for (const metrics of Object.values(revenueByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n }\n\n const warnings: string[] = [];\n if (orders.length >= (params.ordersLimit ?? 30)) {\n warnings.push(\"La muestra de \u00F3rdenes puede ser parcial. Si necesit\u00E1s totales completos, reenviar con mayor rango paginado.\");\n }\n if (visitsRows.length === 0) {\n warnings.push(\"MercadoLibre no devolvi\u00F3 filas de visitas para el rango indicado.\");\n }\n\n return object(\n stripNulls({\n profile_id: profileId,\n seller_id: access.sellerId,\n executive_summary: {\n orders_sampled: orders.length,\n active_items_sampled: items.length,\n total_visits: toNumber(visitsResponse.total_visits) || visitsRows.reduce((sum, row) => sum + toNumber(row.total_visits ?? row.visits), 0),\n revenue_by_currency: revenueByCurrency,\n },\n top_items: Array.from(topItems.values())\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\n .sort((left, right) => right.revenue - left.revenue)\n .slice(0, 10),\n warnings,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to build MercadoLibre store performance summary\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\r\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport { searchMercadoLibreItems, getMercadoLibreUserItemsVisits } from \"../../services/mercadolibre/mercadolibre-items.js\";\r\nimport { searchMercadoLibreOrders } from \"../../services/mercadolibre/mercadolibre-orders.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport {\r\n asArray,\r\n asRecord,\r\n currencyBucket,\r\n mercadoLibreDateRegex,\r\n normalizeString,\r\n roundMoney,\r\n toNumber,\r\n} from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nexport const meliGetStorePerformanceSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\r\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\r\n ordersLimit: z.number().int().min(1).max(50).optional().describe(\"Orders sample size to analyze. Defaults to 30.\"),\r\n itemsLimit: z.number().int().min(1).max(50).optional().describe(\"Items sample size to analyze. Defaults to 20.\"),\r\n});\r\n\r\nexport async function meliGetStorePerformanceHandler(\r\n params: z.infer<typeof meliGetStorePerformanceSchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const access = await getMercadoLibreAccessForProfile(profileId);\r\n const [ordersResponse, itemsResponse, visitsResponse] = await Promise.all([\r\n searchMercadoLibreOrders(profileId, {\r\n seller: access.sellerId,\r\n from: params.startDate,\r\n to: params.endDate,\r\n limit: params.ordersLimit ?? 30,\r\n offset: 0,\r\n }),\r\n searchMercadoLibreItems(profileId, {\r\n sellerId: access.sellerId,\r\n limit: params.itemsLimit ?? 20,\r\n offset: 0,\r\n }),\r\n getMercadoLibreUserItemsVisits(profileId, access.sellerId, params.startDate, params.endDate),\r\n ]);\r\n\r\n const orders = asArray<Record<string, unknown>>(ordersResponse.results);\r\n const items = asArray<string | Record<string, unknown>>(itemsResponse.results);\r\n const visitsRows = asArray<Record<string, unknown>>(visitsResponse.results ?? visitsResponse.items ?? visitsResponse.visits);\r\n\r\n const revenueByCurrency: Record<string, { orders: number; revenue: number }> = {};\r\n const topItems = new Map<string, { item_id: string; title: string; units: number; revenue: number }>();\r\n for (const order of orders) {\r\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\r\n const bucket = currencyBucket(revenueByCurrency, currencyId, () => ({ orders: 0, revenue: 0 }));\r\n bucket.orders += 1;\r\n bucket.revenue += toNumber(order.total_amount);\r\n for (const orderItem of asArray<Record<string, unknown>>(order.order_items)) {\r\n const item = asRecord(orderItem.item);\r\n const key = normalizeString(item.id);\r\n topItems.set(key, {\r\n item_id: key,\r\n title: normalizeString(item.title),\r\n units: (topItems.get(key)?.units ?? 0) + toNumber(orderItem.quantity),\r\n revenue: (topItems.get(key)?.revenue ?? 0) + toNumber(orderItem.unit_price) * toNumber(orderItem.quantity),\r\n });\r\n }\r\n }\r\n\r\n for (const metrics of Object.values(revenueByCurrency)) {\r\n metrics.revenue = roundMoney(metrics.revenue);\r\n }\r\n\r\n const warnings: string[] = [];\r\n if (orders.length >= (params.ordersLimit ?? 30)) {\r\n warnings.push(\"La muestra de \u00F3rdenes puede ser parcial. Si necesit\u00E1s totales completos, reenviar con mayor rango paginado.\");\r\n }\r\n if (visitsRows.length === 0) {\r\n warnings.push(\"MercadoLibre no devolvi\u00F3 filas de visitas para el rango indicado.\");\r\n }\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileId,\r\n seller_id: access.sellerId,\r\n executive_summary: {\r\n orders_sampled: orders.length,\r\n active_items_sampled: items.length,\r\n total_visits: toNumber(visitsResponse.total_visits) || visitsRows.reduce((sum, row) => sum + toNumber(row.total_visits ?? row.visits), 0),\r\n revenue_by_currency: revenueByCurrency,\r\n },\r\n top_items: Array.from(topItems.values())\r\n .map((item) => ({ ...item, revenue: roundMoney(item.revenue) }))\r\n .sort((left, right) => right.revenue - left.revenue)\r\n .slice(0, 10),\r\n warnings,\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to build MercadoLibre store performance summary\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -30,12 +30,25 @@ function roundMoney(value) {
|
|
|
30
30
|
function normalizeString(value, fallback = "") {
|
|
31
31
|
return typeof value === "string" ? value : fallback;
|
|
32
32
|
}
|
|
33
|
+
function normalizeScalarString(value, fallback = "") {
|
|
34
|
+
if (typeof value === "string") {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === "number" || typeof value === "bigint") {
|
|
38
|
+
return String(value);
|
|
39
|
+
}
|
|
40
|
+
if (typeof value === "boolean") {
|
|
41
|
+
return value ? "true" : "false";
|
|
42
|
+
}
|
|
43
|
+
return fallback;
|
|
44
|
+
}
|
|
33
45
|
export {
|
|
34
46
|
asArray,
|
|
35
47
|
asRecord,
|
|
36
48
|
compactDateTime,
|
|
37
49
|
currencyBucket,
|
|
38
50
|
mercadoLibreDateRegex,
|
|
51
|
+
normalizeScalarString,
|
|
39
52
|
normalizeString,
|
|
40
53
|
roundMoney,
|
|
41
54
|
toNumber
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/helpers.ts"],
|
|
4
|
-
"sourcesContent": ["export const mercadoLibreDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function toNumber(value: unknown): number {\n const numericValue = typeof value === \"number\" ? value : Number(value ?? 0);\n return Number.isFinite(numericValue) ? numericValue : 0;\n}\n\nexport function compactDateTime(value: unknown): string | null {\n if (typeof value !== \"string\" || !value) {\n return null;\n }\n\n const match = value.match(/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})/);\n if (!match) {\n return value;\n }\n\n return `${match[1]} ${match[2]}`;\n}\n\nexport function asArray<T = Record<string, unknown>>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\n}\n\nexport function currencyBucket<T>(store: Record<string, T>, currencyId: string, initial: () => T): T {\n const key = currencyId.trim() || \"UNKNOWN\";\n store[key] = store[key] ?? initial();\n return store[key];\n}\n\nexport function roundMoney(value: number): number {\n return Number(value.toFixed(2));\n}\n\nexport function normalizeString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n"],
|
|
5
|
-
"mappings": "AAAO,MAAM,wBAAwB;AAE9B,SAAS,SAAS,OAAwB;AAC/C,QAAM,eAAe,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,CAAC;AAC1E,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AACxD;AAEO,SAAS,gBAAgB,OAA+B;AAC7D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,uCAAuC;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAChC;AAEO,SAAS,QAAqC,OAAqB;AACxE,SAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEO,SAAS,SAAS,OAAyC;AAChE,SAAO,SAAS,OAAO,UAAU,WAAY,QAAoC,CAAC;AACpF;AAEO,SAAS,eAAkB,OAA0B,YAAoB,SAAqB;AACnG,QAAM,MAAM,WAAW,KAAK,KAAK;AACjC,QAAM,GAAG,IAAI,MAAM,GAAG,KAAK,QAAQ;AACnC,SAAO,MAAM,GAAG;AAClB;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEO,SAAS,gBAAgB,OAAgB,WAAW,IAAY;AACrE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;",
|
|
4
|
+
"sourcesContent": ["export const mercadoLibreDateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n\r\nexport function toNumber(value: unknown): number {\r\n const numericValue = typeof value === \"number\" ? value : Number(value ?? 0);\r\n return Number.isFinite(numericValue) ? numericValue : 0;\r\n}\r\n\r\nexport function compactDateTime(value: unknown): string | null {\r\n if (typeof value !== \"string\" || !value) {\r\n return null;\r\n }\r\n\r\n const match = value.match(/^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2})/);\r\n if (!match) {\r\n return value;\r\n }\r\n\r\n return `${match[1]} ${match[2]}`;\r\n}\r\n\r\nexport function asArray<T = Record<string, unknown>>(value: unknown): T[] {\r\n return Array.isArray(value) ? (value as T[]) : [];\r\n}\r\n\r\nexport function asRecord(value: unknown): Record<string, unknown> {\r\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : {};\r\n}\r\n\r\nexport function currencyBucket<T>(store: Record<string, T>, currencyId: string, initial: () => T): T {\r\n const key = currencyId.trim() || \"UNKNOWN\";\r\n store[key] = store[key] ?? initial();\r\n return store[key];\r\n}\r\n\r\nexport function roundMoney(value: number): number {\r\n return Number(value.toFixed(2));\r\n}\r\n\r\nexport function normalizeString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function normalizeScalarString(value: unknown, fallback = \"\"): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return String(value);\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n\n return fallback;\n}\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,wBAAwB;AAE9B,SAAS,SAAS,OAAwB;AAC/C,QAAM,eAAe,OAAO,UAAU,WAAW,QAAQ,OAAO,SAAS,CAAC;AAC1E,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AACxD;AAEO,SAAS,gBAAgB,OAA+B;AAC7D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,uCAAuC;AACjE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAChC;AAEO,SAAS,QAAqC,OAAqB;AACxE,SAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEO,SAAS,SAAS,OAAyC;AAChE,SAAO,SAAS,OAAO,UAAU,WAAY,QAAoC,CAAC;AACpF;AAEO,SAAS,eAAkB,OAA0B,YAAoB,SAAqB;AACnG,QAAM,MAAM,WAAW,KAAK,KAAK;AACjC,QAAM,GAAG,IAAI,MAAM,GAAG,KAAK,QAAQ;AACnC,SAAO,MAAM,GAAG;AAClB;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEO,SAAS,gBAAgB,OAAgB,WAAW,IAAY;AACrE,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEO,SAAS,sBAAsB,OAAgB,WAAW,IAAY;AAC3E,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * from \"./get-account-context.js\";\nexport * from \"./validate-connection.js\";\nexport * from \"./get-orders-summary.js\";\nexport * from \"./get-order-details.js\";\nexport * from \"./get-sales-by-item.js\";\nexport * from \"./get-sales-trend.js\";\nexport * from \"./get-shipping-summary.js\";\nexport * from \"./get-item-visits.js\";\nexport * from \"./get-store-performance.js\";\nexport * from \"./search-items.js\";\nexport * from \"./get-item-details.js\";\nexport * from \"./get-listing-quality.js\";\nexport * from \"./predict-category.js\";\nexport * from \"./get-category-requirements.js\";\nexport * from \"./estimate-listing-fee.js\";\nexport * from \"./create-item.js\";\nexport * from \"./update-item-basic-fields.js\";\nexport * from \"./update-item-description.js\";\nexport * from \"./update-item-pictures.js\";\nexport * from \"./pause-or-reactivate-item.js\";\nexport * from \"./search-questions.js\";\nexport * from \"./answer-question.js\";\nexport * from \"./profile-resolution.js\";\n"],
|
|
4
|
+
"sourcesContent": ["export * from \"./get-account-context.js\";\r\nexport * from \"./validate-connection.js\";\r\nexport * from \"./get-orders-summary.js\";\r\nexport * from \"./get-order-details.js\";\r\nexport * from \"./get-sales-by-item.js\";\r\nexport * from \"./get-sales-trend.js\";\r\nexport * from \"./get-shipping-summary.js\";\r\nexport * from \"./get-item-visits.js\";\r\nexport * from \"./get-store-performance.js\";\r\nexport * from \"./search-items.js\";\r\nexport * from \"./get-item-details.js\";\r\nexport * from \"./get-listing-quality.js\";\r\nexport * from \"./predict-category.js\";\r\nexport * from \"./get-category-requirements.js\";\r\nexport * from \"./estimate-listing-fee.js\";\r\nexport * from \"./create-item.js\";\r\nexport * from \"./update-item-basic-fields.js\";\r\nexport * from \"./update-item-description.js\";\r\nexport * from \"./update-item-pictures.js\";\r\nexport * from \"./pause-or-reactivate-item.js\";\r\nexport * from \"./search-questions.js\";\r\nexport * from \"./answer-question.js\";\r\nexport * from \"./profile-resolution.js\";\r\n"],
|
|
5
5
|
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/pause-or-reactivate-item.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\n\nimport {\n getMercadoLibreItem,\n updateMercadoLibreItem,\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport {\n buildMercadoLibreWriteSuccessResponse,\n handleMercadoLibreWriteError,\n mercadolibreProfileIdSchemaField,\n resolveMercadoLibreWriteProfile,\n} from \"./write-helpers.js\";\n\nexport const meliPauseOrReactivateItemSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\n status: z.enum([\"active\", \"paused\"]).describe(\"Target status for the item.\"),\n});\n\nexport async function meliPauseOrReactivateItemHandler(\n params: z.infer<typeof meliPauseOrReactivateItemSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const before = await getMercadoLibreItem(profileId, params.itemId);\n const after = await updateMercadoLibreItem(profileId, params.itemId, {\n status: params.status,\n });\n\n return buildMercadoLibreWriteSuccessResponse({\n profileId,\n operation: \"pause_or_reactivate_item\",\n resourceId: params.itemId,\n message: `MercadoLibre item status changed to ${params.status}.`,\n before,\n after,\n });\n } catch (err) {\n return handleMercadoLibreWriteError(err, `Failed to change status for ${params.itemId}`);\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n getMercadoLibreItem,\r\n updateMercadoLibreItem,\r\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\r\nimport {\r\n buildMercadoLibreWriteSuccessResponse,\r\n handleMercadoLibreWriteError,\r\n mercadolibreProfileIdSchemaField,\r\n resolveMercadoLibreWriteProfile,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const meliPauseOrReactivateItemSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\r\n status: z.enum([\"active\", \"paused\"]).describe(\"Target status for the item.\"),\r\n});\r\n\r\nexport async function meliPauseOrReactivateItemHandler(\r\n params: z.infer<typeof meliPauseOrReactivateItemSchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const before = await getMercadoLibreItem(profileId, params.itemId);\r\n const after = await updateMercadoLibreItem(profileId, params.itemId, {\r\n status: params.status,\r\n });\r\n\r\n return buildMercadoLibreWriteSuccessResponse({\r\n profileId,\r\n operation: \"pause_or_reactivate_item\",\r\n resourceId: params.itemId,\r\n message: `MercadoLibre item status changed to ${params.status}.`,\r\n before,\r\n after,\r\n });\r\n } catch (err) {\r\n return handleMercadoLibreWriteError(err, `Failed to change status for ${params.itemId}`);\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,WAAW;AAAA,EACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,uBAAuB;AAAA,EACjE,QAAQ,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS,6BAA6B;AAC7E,CAAC;AAED,eAAsB,iCACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,gCAAgC,OAAO,SAAS;AAChF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,SAAS,MAAM,oBAAoB,WAAW,OAAO,MAAM;AACjE,UAAM,QAAQ,MAAM,uBAAuB,WAAW,OAAO,QAAQ;AAAA,MACnE,QAAQ,OAAO;AAAA,IACjB,CAAC;AAED,WAAO,sCAAsC;AAAA,MAC3C;AAAA,MACA,WAAW;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,SAAS,uCAAuC,OAAO,MAAM;AAAA,MAC7D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,6BAA6B,KAAK,+BAA+B,OAAO,MAAM,EAAE;AAAA,EACzF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/predict-category.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreDomainDiscovery } from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, normalizeString, toNumber } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliPredictCategorySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n query: z.string().trim().min(2).describe(\"Search phrase describing the product to categorize.\"),\n siteId: z.string().trim().min(3).optional().describe(\"MercadoLibre site id. Defaults to MLA.\"),\n limit: z.number().int().min(1).max(8).optional().describe(\"Maximum candidate categories to return. Defaults to 5.\"),\n});\n\nexport async function meliPredictCategoryHandler(params: z.infer<typeof meliPredictCategorySchema>) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const candidates = await searchMercadoLibreDomainDiscovery(\n profileResolution.value.profileId,\n params.query,\n params.limit ?? 5,\n params.siteId ?? \"MLA\"\n );\n\n return object(\n stripNulls({\n profile_id: profileResolution.value.profileId,\n query: params.query,\n site_id: params.siteId ?? \"MLA\",\n candidates: asArray<Record<string, unknown>>(candidates).map((candidate) => ({\n category_id: normalizeString(candidate.category_id),\n category_name: normalizeString(candidate.category_name),\n domain_id: normalizeString(candidate.domain_id),\n domain_name: normalizeString(candidate.domain_name),\n attributes_matched: toNumber(candidate.attributes_matched),\n })),\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to predict MercadoLibre category\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport { searchMercadoLibreDomainDiscovery } from \"../../services/mercadolibre/mercadolibre-items.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport { asArray, normalizeString, toNumber } from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nexport const meliPredictCategorySchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n query: z.string().trim().min(2).describe(\"Search phrase describing the product to categorize.\"),\r\n siteId: z.string().trim().min(3).optional().describe(\"MercadoLibre site id. Defaults to MLA.\"),\r\n limit: z.number().int().min(1).max(8).optional().describe(\"Maximum candidate categories to return. Defaults to 5.\"),\r\n});\r\n\r\nexport async function meliPredictCategoryHandler(params: z.infer<typeof meliPredictCategorySchema>) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const candidates = await searchMercadoLibreDomainDiscovery(\r\n profileResolution.value.profileId,\r\n params.query,\r\n params.limit ?? 5,\r\n params.siteId ?? \"MLA\"\r\n );\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileResolution.value.profileId,\r\n query: params.query,\r\n site_id: params.siteId ?? \"MLA\",\r\n candidates: asArray<Record<string, unknown>>(candidates).map((candidate) => ({\r\n category_id: normalizeString(candidate.category_id),\r\n category_name: normalizeString(candidate.category_name),\r\n domain_id: normalizeString(candidate.domain_id),\r\n domain_name: normalizeString(candidate.domain_name),\r\n attributes_matched: toNumber(candidate.attributes_matched),\r\n })),\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to predict MercadoLibre category\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,+BAA+B;AACxC,SAAS,yCAAyC;AAClD,SAAS,kBAAkB;AAC3B,SAAS,SAAS,iBAAiB,gBAAgB;AACnD,SAAS,6CAA6C;AACtD,SAAS,wCAAwC;AAE1C,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,WAAW;AAAA,EACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,qDAAqD;AAAA,EAC9F,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EAC7F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wDAAwD;AACpH,CAAC;AAED,eAAsB,2BAA2B,QAAmD;AAClG,MAAI;AACF,UAAM,oBAAoB,MAAM,sCAAsC,OAAO,SAAS;AACtF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,aAAa,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,OAAO;AAAA,MACP,OAAO,SAAS;AAAA,MAChB,OAAO,UAAU;AAAA,IACnB;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY,kBAAkB,MAAM;AAAA,QACpC,OAAO,OAAO;AAAA,QACd,SAAS,OAAO,UAAU;AAAA,QAC1B,YAAY,QAAiC,UAAU,EAAE,IAAI,CAAC,eAAe;AAAA,UAC3E,aAAa,gBAAgB,UAAU,WAAW;AAAA,UAClD,eAAe,gBAAgB,UAAU,aAAa;AAAA,UACtD,WAAW,gBAAgB,UAAU,SAAS;AAAA,UAC9C,aAAa,gBAAgB,UAAU,WAAW;AAAA,UAClD,oBAAoB,SAAS,UAAU,kBAAkB;AAAA,QAC3D,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAwB,KAAK,yCAAyC,CAAC;AAAA,EACtF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/profile-resolution.ts"],
|
|
4
|
-
"sourcesContent": ["import { object } from \"mcp-use/server\";\n\nimport { getProfile, listProfiles } from \"../../config/profile-store.js\";\n\nexport type MercadoLibreProfileSelectionReason =\n | \"missing_profile\"\n | \"profile_not_found\"\n | \"profile_inactive\";\n\nexport interface ResolvedMercadoLibreProfile {\n profileId: string;\n}\n\nfunction buildSelectionMessage(\n reason: MercadoLibreProfileSelectionReason,\n profileId?: string\n): string {\n switch (reason) {\n case \"missing_profile\":\n return \"MercadoLibre requiere seleccion explicita de profileId. Reenviar la misma tool con uno de los perfiles activos disponibles.\";\n case \"profile_not_found\":\n return `El profileId \"${profileId}\" no existe. Reenviar la misma tool con uno de los perfiles activos disponibles.`;\n case \"profile_inactive\":\n return `El profileId \"${profileId}\" esta inactivo. Reenviar la misma tool con uno de los perfiles activos disponibles.`;\n }\n}\n\nasync function buildSelectionResponse(\n reason: MercadoLibreProfileSelectionReason,\n profileId?: string\n) {\n const profiles = await listProfiles({ activeOnly: true });\n return object({\n selection_required: true,\n reason,\n message: buildSelectionMessage(reason, profileId),\n available_profiles: profiles.map((profile) => ({\n profile_id: profile.id,\n name: profile.name,\n })),\n });\n}\n\nexport async function resolveMercadoLibreProfileOrSelection(\n profileId?: string\n): Promise<\n | { ok: true; value: ResolvedMercadoLibreProfile }\n | { ok: false; response: ReturnType<typeof object<Record<string, unknown>>> }\n> {\n const requestedProfileId = profileId?.trim();\n\n if (!requestedProfileId) {\n return {\n ok: false,\n response: await buildSelectionResponse(\"missing_profile\"),\n };\n }\n\n const profile = await getProfile(requestedProfileId);\n if (!profile) {\n return {\n ok: false,\n response: await buildSelectionResponse(\"profile_not_found\", requestedProfileId),\n };\n }\n\n if (!profile.isActive) {\n return {\n ok: false,\n response: await buildSelectionResponse(\"profile_inactive\", requestedProfileId),\n };\n }\n\n return {\n ok: true,\n value: {\n profileId: profile.id,\n },\n };\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { object } from \"mcp-use/server\";\r\n\r\nimport { getProfile, listProfiles } from \"../../config/profile-store.js\";\r\n\r\nexport type MercadoLibreProfileSelectionReason =\r\n | \"missing_profile\"\r\n | \"profile_not_found\"\r\n | \"profile_inactive\";\r\n\r\nexport interface ResolvedMercadoLibreProfile {\r\n profileId: string;\r\n}\r\n\r\nfunction buildSelectionMessage(\r\n reason: MercadoLibreProfileSelectionReason,\r\n profileId?: string\r\n): string {\r\n switch (reason) {\r\n case \"missing_profile\":\r\n return \"MercadoLibre requiere seleccion explicita de profileId. Reenviar la misma tool con uno de los perfiles activos disponibles.\";\r\n case \"profile_not_found\":\r\n return `El profileId \"${profileId}\" no existe. Reenviar la misma tool con uno de los perfiles activos disponibles.`;\r\n case \"profile_inactive\":\r\n return `El profileId \"${profileId}\" esta inactivo. Reenviar la misma tool con uno de los perfiles activos disponibles.`;\r\n }\r\n}\r\n\r\nasync function buildSelectionResponse(\r\n reason: MercadoLibreProfileSelectionReason,\r\n profileId?: string\r\n) {\r\n const profiles = await listProfiles({ activeOnly: true });\r\n return object({\r\n selection_required: true,\r\n reason,\r\n message: buildSelectionMessage(reason, profileId),\r\n available_profiles: profiles.map((profile) => ({\r\n profile_id: profile.id,\r\n name: profile.name,\r\n })),\r\n });\r\n}\r\n\r\nexport async function resolveMercadoLibreProfileOrSelection(\r\n profileId?: string\r\n): Promise<\r\n | { ok: true; value: ResolvedMercadoLibreProfile }\r\n | { ok: false; response: ReturnType<typeof object<Record<string, unknown>>> }\r\n> {\r\n const requestedProfileId = profileId?.trim();\r\n\r\n if (!requestedProfileId) {\r\n return {\r\n ok: false,\r\n response: await buildSelectionResponse(\"missing_profile\"),\r\n };\r\n }\r\n\r\n const profile = await getProfile(requestedProfileId);\r\n if (!profile) {\r\n return {\r\n ok: false,\r\n response: await buildSelectionResponse(\"profile_not_found\", requestedProfileId),\r\n };\r\n }\r\n\r\n if (!profile.isActive) {\r\n return {\r\n ok: false,\r\n response: await buildSelectionResponse(\"profile_inactive\", requestedProfileId),\r\n };\r\n }\r\n\r\n return {\r\n ok: true,\r\n value: {\r\n profileId: profile.id,\r\n },\r\n };\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,cAAc;AAEvB,SAAS,YAAY,oBAAoB;AAWzC,SAAS,sBACP,QACA,WACQ;AACR,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,iBAAiB,SAAS;AAAA,IACnC,KAAK;AACH,aAAO,iBAAiB,SAAS;AAAA,EACrC;AACF;AAEA,eAAe,uBACb,QACA,WACA;AACA,QAAM,WAAW,MAAM,aAAa,EAAE,YAAY,KAAK,CAAC;AACxD,SAAO,OAAO;AAAA,IACZ,oBAAoB;AAAA,IACpB;AAAA,IACA,SAAS,sBAAsB,QAAQ,SAAS;AAAA,IAChD,oBAAoB,SAAS,IAAI,CAAC,aAAa;AAAA,MAC7C,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,IAChB,EAAE;AAAA,EACJ,CAAC;AACH;AAEA,eAAsB,sCACpB,WAIA;AACA,QAAM,qBAAqB,WAAW,KAAK;AAE3C,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU,MAAM,uBAAuB,iBAAiB;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,WAAW,kBAAkB;AACnD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU,MAAM,uBAAuB,qBAAqB,kBAAkB;AAAA,IAChF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,UAAU;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU,MAAM,uBAAuB,oBAAoB,kBAAkB;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/search-items.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreItemDetailsBatch,\n searchMercadoLibreItems,\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, normalizeString, toNumber } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliSearchItemsSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n status: z.string().trim().min(1).optional().describe(\"Optional item status filter.\"),\n category: z.string().trim().min(1).optional().describe(\"Optional category id filter.\"),\n listingTypeId: z.string().trim().min(1).optional().describe(\"Optional listing type filter.\"),\n orders: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression for items search.\"),\n includeDetails: z.boolean().optional().describe(\"Whether to multiget compact item details for returned item ids.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page (1-50).\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Pagination offset.\"),\n});\n\nexport async function meliSearchItemsHandler(params: z.infer<typeof meliSearchItemsSchema>) {\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 access = await getMercadoLibreAccessForProfile(profileId);\n const searchResponse = await searchMercadoLibreItems(profileId, {\n sellerId: access.sellerId,\n status: params.status,\n category: params.category,\n listingTypeId: params.listingTypeId,\n orders: params.orders,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n });\n\n const itemIds = asArray<string>(searchResponse.results).map((value) => normalizeString(value)).filter(Boolean);\n const compactItems = params.includeDetails\n ? await getMercadoLibreItemDetailsBatch(profileId, itemIds.slice(0, 20), [\n \"id\",\n \"title\",\n \"status\",\n \"price\",\n \"currency_id\",\n \"available_quantity\",\n \"sold_quantity\",\n \"listing_type_id\",\n \"permalink\",\n \"thumbnail\",\n ])\n : [];\n\n const paging = normalizeMercadoLibrePaging(searchResponse.paging as Record<string, unknown>);\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: paging.limit || params.limit || itemIds.length,\n offset: paging.offset || params.offset || 0,\n returned: itemIds.length,\n nextField: \"offset\",\n }),\n item_ids: itemIds,\n items: compactItems.map((item) => ({\n item_id: normalizeString(item.id),\n title: normalizeString(item.title),\n status: normalizeString(item.status),\n price: toNumber(item.price),\n currency_id: normalizeString(item.currency_id, \"UNKNOWN\"),\n available_quantity: toNumber(item.available_quantity),\n sold_quantity: toNumber(item.sold_quantity),\n listing_type_id: normalizeString(item.listing_type_id),\n permalink: normalizeString(item.permalink),\n thumbnail: normalizeString(item.thumbnail),\n })),\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to search MercadoLibre items\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\r\nimport {\r\n buildMercadoLibrePaginationMetadata,\r\n formatMercadoLibreError,\r\n normalizeMercadoLibrePaging,\r\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport {\r\n getMercadoLibreItemDetailsBatch,\r\n searchMercadoLibreItems,\r\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport { asArray, normalizeString, toNumber } from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nexport const meliSearchItemsSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n status: z.string().trim().min(1).optional().describe(\"Optional item status filter.\"),\r\n category: z.string().trim().min(1).optional().describe(\"Optional category id filter.\"),\r\n listingTypeId: z.string().trim().min(1).optional().describe(\"Optional listing type filter.\"),\r\n orders: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression for items search.\"),\r\n includeDetails: z.boolean().optional().describe(\"Whether to multiget compact item details for returned item ids.\"),\r\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page (1-50).\"),\r\n offset: z.number().int().min(0).max(5000).optional().describe(\"Pagination offset.\"),\r\n});\r\n\r\nexport async function meliSearchItemsHandler(params: z.infer<typeof meliSearchItemsSchema>) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const access = await getMercadoLibreAccessForProfile(profileId);\r\n const searchResponse = await searchMercadoLibreItems(profileId, {\r\n sellerId: access.sellerId,\r\n status: params.status,\r\n category: params.category,\r\n listingTypeId: params.listingTypeId,\r\n orders: params.orders,\r\n limit: params.limit ?? 20,\r\n offset: params.offset ?? 0,\r\n });\r\n\r\n const itemIds = asArray<string>(searchResponse.results).map((value) => normalizeString(value)).filter(Boolean);\r\n const compactItems = params.includeDetails\r\n ? await getMercadoLibreItemDetailsBatch(profileId, itemIds.slice(0, 20), [\r\n \"id\",\r\n \"title\",\r\n \"status\",\r\n \"price\",\r\n \"currency_id\",\r\n \"available_quantity\",\r\n \"sold_quantity\",\r\n \"listing_type_id\",\r\n \"permalink\",\r\n \"thumbnail\",\r\n ])\r\n : [];\r\n\r\n const paging = normalizeMercadoLibrePaging(searchResponse.paging as Record<string, unknown>);\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileId,\r\n metadata: buildMercadoLibrePaginationMetadata({\r\n total: paging.total,\r\n limit: paging.limit || params.limit || itemIds.length,\r\n offset: paging.offset || params.offset || 0,\r\n returned: itemIds.length,\r\n nextField: \"offset\",\r\n }),\r\n item_ids: itemIds,\r\n items: compactItems.map((item) => ({\r\n item_id: normalizeString(item.id),\r\n title: normalizeString(item.title),\r\n status: normalizeString(item.status),\r\n price: toNumber(item.price),\r\n currency_id: normalizeString(item.currency_id, \"UNKNOWN\"),\r\n available_quantity: toNumber(item.available_quantity),\r\n sold_quantity: toNumber(item.sold_quantity),\r\n listing_type_id: normalizeString(item.listing_type_id),\r\n permalink: normalizeString(item.permalink),\r\n thumbnail: normalizeString(item.thumbnail),\r\n })),\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to search MercadoLibre items\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/search-questions.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { searchMercadoLibreQuestions } from \"../../services/mercadolibre/mercadolibre-questions.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, asRecord, compactDateTime, normalizeString } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nexport const meliSearchQuestionsSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n itemId: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre item id filter.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional question status filter.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page (1-50).\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Pagination offset.\"),\n});\n\nexport async function meliSearchQuestionsHandler(\n params: z.infer<typeof meliSearchQuestionsSchema>\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 access = await getMercadoLibreAccessForProfile(profileId);\n const response = await searchMercadoLibreQuestions(profileId, {\n sellerId: access.sellerId,\n itemId: params.itemId,\n status: params.status,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n });\n\n const questions = asArray<Record<string, unknown>>(response.questions ?? response.results);\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: buildMercadoLibrePaginationMetadata({\n total: paging.total || questions.length,\n limit: paging.limit || params.limit || questions.length,\n offset: paging.offset || params.offset || 0,\n returned: questions.length,\n nextField: \"offset\",\n }),\n questions: questions.map((question) => ({\n question_id: question.id,\n item_id: normalizeString(question.item_id),\n item_title: normalizeString(asRecord(question.item).title),\n status: normalizeString(question.status),\n text: normalizeString(question.text),\n date_created: compactDateTime(question.date_created),\n from: stripNulls({\n id: normalizeString(asRecord(question.from).id),\n nickname: normalizeString(asRecord(question.from).nickname),\n }),\n answer_status: normalizeString(asRecord(question.answer).status),\n })),\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to search MercadoLibre questions\"));\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { getMercadoLibreAccessForProfile } from \"../../config/mercadolibre.js\";\r\nimport {\r\n buildMercadoLibrePaginationMetadata,\r\n formatMercadoLibreError,\r\n normalizeMercadoLibrePaging,\r\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\r\nimport { searchMercadoLibreQuestions } from \"../../services/mercadolibre/mercadolibre-questions.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport { asArray, asRecord, compactDateTime, normalizeString } from \"./helpers.js\";\r\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\r\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\r\n\r\nexport const meliSearchQuestionsSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n itemId: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre item id filter.\"),\r\n status: z.string().trim().min(1).optional().describe(\"Optional question status filter.\"),\r\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page (1-50).\"),\r\n offset: z.number().int().min(0).max(5000).optional().describe(\"Pagination offset.\"),\r\n});\r\n\r\nexport async function meliSearchQuestionsHandler(\r\n params: z.infer<typeof meliSearchQuestionsSchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const access = await getMercadoLibreAccessForProfile(profileId);\r\n const response = await searchMercadoLibreQuestions(profileId, {\r\n sellerId: access.sellerId,\r\n itemId: params.itemId,\r\n status: params.status,\r\n limit: params.limit ?? 20,\r\n offset: params.offset ?? 0,\r\n });\r\n\r\n const questions = asArray<Record<string, unknown>>(response.questions ?? response.results);\r\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: profileId,\r\n metadata: buildMercadoLibrePaginationMetadata({\r\n total: paging.total || questions.length,\r\n limit: paging.limit || params.limit || questions.length,\r\n offset: paging.offset || params.offset || 0,\r\n returned: questions.length,\r\n nextField: \"offset\",\r\n }),\r\n questions: questions.map((question) => ({\r\n question_id: question.id,\r\n item_id: normalizeString(question.item_id),\r\n item_title: normalizeString(asRecord(question.item).title),\r\n status: normalizeString(question.status),\r\n text: normalizeString(question.text),\r\n date_created: compactDateTime(question.date_created),\r\n from: stripNulls({\r\n id: normalizeString(asRecord(question.from).id),\r\n nickname: normalizeString(asRecord(question.from).nickname),\r\n }),\r\n answer_status: normalizeString(asRecord(question.answer).status),\r\n })),\r\n })\r\n );\r\n } catch (err) {\r\n return error(formatMercadoLibreError(err, \"Failed to search MercadoLibre questions\"));\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uCAAuC;AAChD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mCAAmC;AAC5C,SAAS,kBAAkB;AAC3B,SAAS,SAAS,UAAU,iBAAiB,uBAAuB;AACpE,SAAS,6CAA6C;AACtD,SAAS,wCAAwC;AAE1C,MAAM,4BAA4B,EAAE,OAAO;AAAA,EAChD,WAAW;AAAA,EACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,EAC5F,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,EACvF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EACrF,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS,EAAE,SAAS,oBAAoB;AACpF,CAAC;AAED,eAAsB,2BACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,sCAAsC,OAAO,SAAS;AACtF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAM,SAAS,MAAM,gCAAgC,SAAS;AAC9D,UAAM,WAAW,MAAM,4BAA4B,WAAW;AAAA,MAC5D,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO,SAAS;AAAA,MACvB,QAAQ,OAAO,UAAU;AAAA,IAC3B,CAAC;AAED,UAAM,YAAY,QAAiC,SAAS,aAAa,SAAS,OAAO;AACzF,UAAM,SAAS,4BAA4B,SAAS,SAAS,MAAM,CAAC;AAEpE,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,UAAU,oCAAoC;AAAA,UAC5C,OAAO,OAAO,SAAS,UAAU;AAAA,UACjC,OAAO,OAAO,SAAS,OAAO,SAAS,UAAU;AAAA,UACjD,QAAQ,OAAO,UAAU,OAAO,UAAU;AAAA,UAC1C,UAAU,UAAU;AAAA,UACpB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,WAAW,UAAU,IAAI,CAAC,cAAc;AAAA,UACtC,aAAa,SAAS;AAAA,UACtB,SAAS,gBAAgB,SAAS,OAAO;AAAA,UACzC,YAAY,gBAAgB,SAAS,SAAS,IAAI,EAAE,KAAK;AAAA,UACzD,QAAQ,gBAAgB,SAAS,MAAM;AAAA,UACvC,MAAM,gBAAgB,SAAS,IAAI;AAAA,UACnC,cAAc,gBAAgB,SAAS,YAAY;AAAA,UACnD,MAAM,WAAW;AAAA,YACf,IAAI,gBAAgB,SAAS,SAAS,IAAI,EAAE,EAAE;AAAA,YAC9C,UAAU,gBAAgB,SAAS,SAAS,IAAI,EAAE,QAAQ;AAAA,UAC5D,CAAC;AAAA,UACD,eAAe,gBAAgB,SAAS,SAAS,MAAM,EAAE,MAAM;AAAA,QACjE,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,wBAAwB,KAAK,yCAAyC,CAAC;AAAA,EACtF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/update-item-basic-fields.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\n\nimport {\n getMercadoLibreItem,\n updateMercadoLibreItem,\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport {\n buildMercadoLibreWriteSuccessResponse,\n handleMercadoLibreWriteError,\n mercadolibreProfileIdSchemaField,\n resolveMercadoLibreWriteProfile,\n} from \"./write-helpers.js\";\n\nconst attributeSchema = z.object({\n id: z.string().trim().min(1).describe(\"MercadoLibre attribute id.\"),\n value_name: z.string().trim().min(1).optional().describe(\"Human-readable attribute value.\"),\n value_id: z.string().trim().min(1).optional().describe(\"MercadoLibre attribute value id when known.\"),\n});\n\nexport const meliUpdateItemBasicFieldsSchema = z\n .object({\n profileId: mercadolibreProfileIdSchemaField,\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\n title: z.string().trim().min(3).optional().describe(\"New listing title.\"),\n price: z.number().positive().optional().describe(\"New listing price.\"),\n availableQuantity: z.number().int().min(0).optional().describe(\"New available quantity.\"),\n attributes: z.array(attributeSchema).optional().describe(\"Updated attributes array.\"),\n saleTerms: z.array(z.record(z.string(), z.unknown())).optional().describe(\"Updated sale terms array.\"),\n shipping: z.record(z.string(), z.unknown()).optional().describe(\"Updated shipping payload.\"),\n status: z.enum([\"active\", \"paused\", \"closed\", \"under_review\"]).optional().describe(\"New listing status.\"),\n listingTypeId: z.string().trim().min(1).optional().describe(\"Optional new listing type id if supported by MercadoLibre for the item.\"),\n channels: z.array(z.string().trim().min(1)).optional().describe(\"Optional replacement channels array if supported.\"),\n })\n .refine(\n (value) =>\n value.title !== undefined ||\n value.price !== undefined ||\n value.availableQuantity !== undefined ||\n value.attributes !== undefined ||\n value.saleTerms !== undefined ||\n value.shipping !== undefined ||\n value.status !== undefined ||\n value.listingTypeId !== undefined ||\n value.channels !== undefined,\n {\n message: \"At least one item field must be provided.\",\n path: [\"title\"],\n }\n );\n\nexport async function meliUpdateItemBasicFieldsHandler(\n params: z.infer<typeof meliUpdateItemBasicFieldsSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const before = await getMercadoLibreItem(profileId, params.itemId);\n const after = await updateMercadoLibreItem(profileId, params.itemId, {\n title: params.title,\n price: params.price,\n available_quantity: params.availableQuantity,\n attributes: params.attributes,\n sale_terms: params.saleTerms,\n shipping: params.shipping,\n status: params.status,\n listing_type_id: params.listingTypeId,\n channels: params.channels,\n });\n\n return buildMercadoLibreWriteSuccessResponse({\n profileId,\n operation: \"update_item_basic_fields\",\n resourceId: params.itemId,\n message: \"MercadoLibre item updated successfully.\",\n before,\n after,\n });\n } catch (err) {\n return handleMercadoLibreWriteError(err, `Failed to update MercadoLibre item ${params.itemId}`);\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n getMercadoLibreItem,\r\n updateMercadoLibreItem,\r\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\r\nimport {\r\n buildMercadoLibreWriteSuccessResponse,\r\n handleMercadoLibreWriteError,\r\n mercadolibreProfileIdSchemaField,\r\n resolveMercadoLibreWriteProfile,\r\n} from \"./write-helpers.js\";\r\n\r\nconst attributeSchema = z.object({\r\n id: z.string().trim().min(1).describe(\"MercadoLibre attribute id.\"),\r\n value_name: z.string().trim().min(1).optional().describe(\"Human-readable attribute value.\"),\r\n value_id: z.string().trim().min(1).optional().describe(\"MercadoLibre attribute value id when known.\"),\r\n});\r\n\r\nexport const meliUpdateItemBasicFieldsSchema = z\r\n .object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\r\n title: z.string().trim().min(3).optional().describe(\"New listing title.\"),\r\n price: z.number().positive().optional().describe(\"New listing price.\"),\r\n availableQuantity: z.number().int().min(0).optional().describe(\"New available quantity.\"),\r\n attributes: z.array(attributeSchema).optional().describe(\"Updated attributes array.\"),\r\n saleTerms: z.array(z.record(z.string(), z.unknown())).optional().describe(\"Updated sale terms array.\"),\r\n shipping: z.record(z.string(), z.unknown()).optional().describe(\"Updated shipping payload.\"),\r\n status: z.enum([\"active\", \"paused\", \"closed\", \"under_review\"]).optional().describe(\"New listing status.\"),\r\n listingTypeId: z.string().trim().min(1).optional().describe(\"Optional new listing type id if supported by MercadoLibre for the item.\"),\r\n channels: z.array(z.string().trim().min(1)).optional().describe(\"Optional replacement channels array if supported.\"),\r\n })\r\n .refine(\r\n (value) =>\r\n value.title !== undefined ||\r\n value.price !== undefined ||\r\n value.availableQuantity !== undefined ||\r\n value.attributes !== undefined ||\r\n value.saleTerms !== undefined ||\r\n value.shipping !== undefined ||\r\n value.status !== undefined ||\r\n value.listingTypeId !== undefined ||\r\n value.channels !== undefined,\r\n {\r\n message: \"At least one item field must be provided.\",\r\n path: [\"title\"],\r\n }\r\n );\r\n\r\nexport async function meliUpdateItemBasicFieldsHandler(\r\n params: z.infer<typeof meliUpdateItemBasicFieldsSchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n const before = await getMercadoLibreItem(profileId, params.itemId);\r\n const after = await updateMercadoLibreItem(profileId, params.itemId, {\r\n title: params.title,\r\n price: params.price,\r\n available_quantity: params.availableQuantity,\r\n attributes: params.attributes,\r\n sale_terms: params.saleTerms,\r\n shipping: params.shipping,\r\n status: params.status,\r\n listing_type_id: params.listingTypeId,\r\n channels: params.channels,\r\n });\r\n\r\n return buildMercadoLibreWriteSuccessResponse({\r\n profileId,\r\n operation: \"update_item_basic_fields\",\r\n resourceId: params.itemId,\r\n message: \"MercadoLibre item updated successfully.\",\r\n before,\r\n after,\r\n });\r\n } catch (err) {\r\n return handleMercadoLibreWriteError(err, `Failed to update MercadoLibre item ${params.itemId}`);\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/update-item-description.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\n\nimport {\n createMercadoLibreItemDescription,\n getMercadoLibreItemDescription,\n replaceMercadoLibreItemDescription,\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\nimport {\n buildMercadoLibreWriteSuccessResponse,\n handleMercadoLibreWriteError,\n mercadolibreProfileIdSchemaField,\n resolveMercadoLibreWriteProfile,\n} from \"./write-helpers.js\";\n\nexport const meliUpdateItemDescriptionSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\n plainText: z.string().trim().min(1).describe(\"Plain-text description to publish.\"),\n});\n\nexport async function meliUpdateItemDescriptionHandler(\n params: z.infer<typeof meliUpdateItemDescriptionSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n let before: Record<string, unknown> | null = null;\n let after: Record<string, unknown>;\n\n try {\n before = await getMercadoLibreItemDescription(profileId, params.itemId);\n after = await replaceMercadoLibreItemDescription(profileId, params.itemId, params.plainText);\n } catch {\n after = await createMercadoLibreItemDescription(profileId, params.itemId, params.plainText);\n }\n\n return buildMercadoLibreWriteSuccessResponse({\n profileId,\n operation: \"update_item_description\",\n resourceId: params.itemId,\n message: \"MercadoLibre item description updated successfully.\",\n before,\n after,\n });\n } catch (err) {\n return handleMercadoLibreWriteError(err, `Failed to update description for ${params.itemId}`);\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n createMercadoLibreItemDescription,\r\n getMercadoLibreItemDescription,\r\n replaceMercadoLibreItemDescription,\r\n} from \"../../services/mercadolibre/mercadolibre-items.js\";\r\nimport {\r\n buildMercadoLibreWriteSuccessResponse,\r\n handleMercadoLibreWriteError,\r\n mercadolibreProfileIdSchemaField,\r\n resolveMercadoLibreWriteProfile,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const meliUpdateItemDescriptionSchema = z.object({\r\n profileId: mercadolibreProfileIdSchemaField,\r\n itemId: z.string().trim().min(1).describe(\"MercadoLibre item id.\"),\r\n plainText: z.string().trim().min(1).describe(\"Plain-text description to publish.\"),\r\n});\r\n\r\nexport async function meliUpdateItemDescriptionHandler(\r\n params: z.infer<typeof meliUpdateItemDescriptionSchema>\r\n) {\r\n try {\r\n const profileResolution = await resolveMercadoLibreWriteProfile(params.profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const profileId = profileResolution.value.profileId;\r\n let before: Record<string, unknown> | null = null;\r\n let after: Record<string, unknown>;\r\n\r\n try {\r\n before = await getMercadoLibreItemDescription(profileId, params.itemId);\r\n after = await replaceMercadoLibreItemDescription(profileId, params.itemId, params.plainText);\r\n } catch {\r\n after = await createMercadoLibreItemDescription(profileId, params.itemId, params.plainText);\r\n }\r\n\r\n return buildMercadoLibreWriteSuccessResponse({\r\n profileId,\r\n operation: \"update_item_description\",\r\n resourceId: params.itemId,\r\n message: \"MercadoLibre item description updated successfully.\",\r\n before,\r\n after,\r\n });\r\n } catch (err) {\r\n return handleMercadoLibreWriteError(err, `Failed to update description for ${params.itemId}`);\r\n }\r\n}\r\n"],
|
|
5
5
|
"mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,WAAW;AAAA,EACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,uBAAuB;AAAA,EACjE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,oCAAoC;AACnF,CAAC;AAED,eAAsB,iCACpB,QACA;AACA,MAAI;AACF,UAAM,oBAAoB,MAAM,gCAAgC,OAAO,SAAS;AAChF,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,YAAY,kBAAkB,MAAM;AAC1C,QAAI,SAAyC;AAC7C,QAAI;AAEJ,QAAI;AACF,eAAS,MAAM,+BAA+B,WAAW,OAAO,MAAM;AACtE,cAAQ,MAAM,mCAAmC,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC7F,QAAQ;AACN,cAAQ,MAAM,kCAAkC,WAAW,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC5F;AAEA,WAAO,sCAAsC;AAAA,MAC3C;AAAA,MACA,WAAW;AAAA,MACX,YAAY,OAAO;AAAA,MACnB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,6BAA6B,KAAK,oCAAoC,OAAO,MAAM,EAAE;AAAA,EAC9F;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|