@yoryoboy/bi-mcp 1.16.0 → 1.19.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 +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +179 -6
- package/dist/index.js.map +2 -2
- package/dist/mcp-use.json +3 -6
- package/dist/src/config/__tests__/google-store.test.js +30 -0
- package/dist/src/config/__tests__/google-store.test.js.map +7 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js +64 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js.map +7 -0
- package/dist/src/config/google-store.js +18 -0
- package/dist/src/config/google-store.js.map +2 -2
- package/dist/src/config/mcp-tool-deadline-context.js +34 -0
- package/dist/src/config/mcp-tool-deadline-context.js.map +7 -0
- package/dist/src/config/mcp-tool-deadline.js +67 -0
- package/dist/src/config/mcp-tool-deadline.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +38 -3
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js +226 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js +127 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js +103 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js +582 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +10 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js +36 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js +137 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js +105 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js +143 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js +100 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js +350 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js +228 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js +58 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-api.js +15 -3
- package/dist/src/services/mercadolibre/mercadolibre-api.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-billing.js +110 -3
- package/dist/src/services/mercadolibre/mercadolibre-billing.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js +368 -0
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js +399 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js +55 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js +392 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-orders.js +8 -8
- package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-packs.js +21 -0
- package/dist/src/services/mercadolibre/mercadolibre-packs.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js +60 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js +429 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js +436 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js +35 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js +67 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js.map +7 -0
- package/dist/src/services/vtex/vtex-api.js +6 -0
- package/dist/src/services/vtex/vtex-api.js.map +2 -2
- package/dist/src/tools/config/__tests__/list-profiles.test.js +154 -0
- package/dist/src/tools/config/__tests__/list-profiles.test.js.map +7 -0
- package/dist/src/tools/config/list-profiles.js +39 -3
- package/dist/src/tools/config/list-profiles.js.map +2 -2
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js +339 -0
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js +225 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js +148 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js +60 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js +128 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js +435 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js +31 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js +36 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js +205 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js +313 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js +176 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js +183 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js +189 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js +150 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js +322 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js +144 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js +59 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js +104 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js.map +7 -0
- package/dist/src/tools/mercadolibre/index.js +32 -0
- package/dist/src/tools/mercadolibre/index.js.map +2 -2
- package/dist/src/tools/mercadolibre/product-ads-helpers.js +130 -0
- package/dist/src/tools/mercadolibre/product-ads-helpers.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js +27 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js +46 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js +25 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js +162 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js +216 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js +116 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js.map +7 -0
- package/dist/src/tools/mercadolibre/validate-connection.js +40 -12
- package/dist/src/tools/mercadolibre/validate-connection.js.map +2 -2
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js +378 -0
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js +123 -0
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js +356 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payments.test.js +62 -0
- package/dist/tests/meli/mercadolibre-payments.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js +90 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js +72 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js +400 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +31 -12
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +1 -1
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +1 -1
- package/package.json +1 -1
- 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
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +0 -165
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +0 -233
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/catalog-admin-batch.js +0 -298
- package/dist/src/tools/vtex/catalog-admin-batch.js.map +0 -7
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { error, object } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
|
|
4
|
+
import {
|
|
5
|
+
getMercadoLibreUserProductBundlesBatch,
|
|
6
|
+
getMercadoLibreUserProductsBatch,
|
|
7
|
+
resolveMercadoLibreUserProductsFromItems
|
|
8
|
+
} from "../../services/mercadolibre/mercadolibre-kits.js";
|
|
9
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
10
|
+
import { asArray, asRecord, normalizeScalarString, normalizeString } from "./helpers.js";
|
|
11
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
12
|
+
import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
|
|
13
|
+
const MAX_INPUT_IDS = 50;
|
|
14
|
+
const bundleContextsSchema = [
|
|
15
|
+
"user_product_id",
|
|
16
|
+
"name",
|
|
17
|
+
"domain_id",
|
|
18
|
+
"input_refs",
|
|
19
|
+
"is_kit",
|
|
20
|
+
"bundle_type",
|
|
21
|
+
"kit_component_count",
|
|
22
|
+
"kit_components",
|
|
23
|
+
"bundle_membership_count",
|
|
24
|
+
"bundle_ids",
|
|
25
|
+
"last_updated"
|
|
26
|
+
];
|
|
27
|
+
function compactKitComponents(userProduct) {
|
|
28
|
+
const bundle = asRecord(userProduct.bundle);
|
|
29
|
+
return asArray(bundle.components).map((component) => {
|
|
30
|
+
const componentId = normalizeString(component.user_product_id);
|
|
31
|
+
const quantity = normalizeScalarString(component.quantity);
|
|
32
|
+
if (!componentId || !quantity) {
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
return `${componentId} x${quantity}`;
|
|
36
|
+
}).filter(Boolean).join(" | ");
|
|
37
|
+
}
|
|
38
|
+
function buildBundleContextRow(params) {
|
|
39
|
+
const bundle = asRecord(params.userProduct.bundle);
|
|
40
|
+
const bundleIds = asArray(params.bundleMemberships?.bundles).map((value) => normalizeString(value)).filter(Boolean);
|
|
41
|
+
const isKit = Boolean(
|
|
42
|
+
params.userProduct.tags && asArray(params.userProduct.tags).includes("bundle") && normalizeString(bundle.type) === "kit"
|
|
43
|
+
);
|
|
44
|
+
return [
|
|
45
|
+
params.userProductId,
|
|
46
|
+
normalizeString(params.userProduct.name),
|
|
47
|
+
normalizeString(params.userProduct.domain_id),
|
|
48
|
+
params.inputRefs.join(" | "),
|
|
49
|
+
isKit,
|
|
50
|
+
normalizeString(bundle.type),
|
|
51
|
+
asArray(bundle.components).length,
|
|
52
|
+
isKit ? compactKitComponents(params.userProduct) : "",
|
|
53
|
+
bundleIds.length,
|
|
54
|
+
bundleIds.join(" | "),
|
|
55
|
+
normalizeString(params.userProduct.last_updated)
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
const meliGetBundleContextByItemSchema = z.object({
|
|
59
|
+
profileId: mercadolibreProfileIdSchemaField,
|
|
60
|
+
itemIds: z.array(z.string().trim().min(1).describe("MercadoLibre item id.")).max(MAX_INPUT_IDS).optional().describe(
|
|
61
|
+
"Optional MercadoLibre item ids (up to 50). The tool resolves the item to its user_product_id first and then inspects the user product bundle/kit context."
|
|
62
|
+
),
|
|
63
|
+
userProductIds: z.array(z.string().trim().min(1).describe("MercadoLibre user product id.")).max(MAX_INPUT_IDS).optional().describe(
|
|
64
|
+
"Optional MercadoLibre user_product_ids (up to 50). Use these when the item already resolves to a user product or when you want to inspect a known kit/component directly."
|
|
65
|
+
)
|
|
66
|
+
}).refine((params) => (params.itemIds?.length ?? 0) + (params.userProductIds?.length ?? 0) > 0, {
|
|
67
|
+
message: "Provide at least one itemId or userProductId.",
|
|
68
|
+
path: ["itemIds"]
|
|
69
|
+
});
|
|
70
|
+
async function meliGetBundleContextByItemHandler(params) {
|
|
71
|
+
try {
|
|
72
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
73
|
+
if (!profileResolution.ok) {
|
|
74
|
+
return profileResolution.response;
|
|
75
|
+
}
|
|
76
|
+
const profileId = profileResolution.value.profileId;
|
|
77
|
+
const itemIds = Array.from(new Set(params.itemIds ?? []));
|
|
78
|
+
const directUserProductIds = Array.from(new Set(params.userProductIds ?? []));
|
|
79
|
+
const resolvedFromItems = itemIds.length > 0 ? await resolveMercadoLibreUserProductsFromItems(profileId, itemIds) : [];
|
|
80
|
+
const userProductInputRefs = /* @__PURE__ */ new Map();
|
|
81
|
+
const resolvedUserProductIds = new Set(directUserProductIds);
|
|
82
|
+
for (const item of resolvedFromItems) {
|
|
83
|
+
if (!item.userProductId) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
resolvedUserProductIds.add(item.userProductId);
|
|
87
|
+
const refs = userProductInputRefs.get(item.userProductId) ?? [];
|
|
88
|
+
refs.push(`item:${item.itemId}`);
|
|
89
|
+
userProductInputRefs.set(item.userProductId, refs);
|
|
90
|
+
}
|
|
91
|
+
for (const userProductId of directUserProductIds) {
|
|
92
|
+
const refs = userProductInputRefs.get(userProductId) ?? [];
|
|
93
|
+
refs.push(`user_product:${userProductId}`);
|
|
94
|
+
userProductInputRefs.set(userProductId, refs);
|
|
95
|
+
}
|
|
96
|
+
const uniqueUserProductIds = Array.from(resolvedUserProductIds);
|
|
97
|
+
const [userProductsBatch, bundleMembershipsBatch] = await Promise.all([
|
|
98
|
+
getMercadoLibreUserProductsBatch(profileId, uniqueUserProductIds, {
|
|
99
|
+
maxConcurrency: 10,
|
|
100
|
+
maxRetries: 2
|
|
101
|
+
}),
|
|
102
|
+
getMercadoLibreUserProductBundlesBatch(profileId, uniqueUserProductIds, {
|
|
103
|
+
maxConcurrency: 10,
|
|
104
|
+
maxRetries: 2
|
|
105
|
+
})
|
|
106
|
+
]);
|
|
107
|
+
const userProductsById = /* @__PURE__ */ new Map();
|
|
108
|
+
userProductsBatch.successful.forEach((entry) => {
|
|
109
|
+
userProductsById.set(entry.id, entry.document);
|
|
110
|
+
});
|
|
111
|
+
const bundleMembershipsById = /* @__PURE__ */ new Map();
|
|
112
|
+
bundleMembershipsBatch.successful.forEach((entry) => {
|
|
113
|
+
bundleMembershipsById.set(entry.id, entry.document);
|
|
114
|
+
});
|
|
115
|
+
const failures = [
|
|
116
|
+
...resolvedFromItems.filter((item) => item.itemId && !item.userProductId).map((item) => ({
|
|
117
|
+
item_id: item.itemId,
|
|
118
|
+
stage: "resolution",
|
|
119
|
+
message: "MercadoLibre item did not expose a user_product_id",
|
|
120
|
+
retryable: false
|
|
121
|
+
})),
|
|
122
|
+
...userProductsBatch.failed.map((failure) => ({
|
|
123
|
+
user_product_id: failure.id,
|
|
124
|
+
stage: "user_product",
|
|
125
|
+
message: failure.message,
|
|
126
|
+
status_code: failure.statusCode,
|
|
127
|
+
attempts: failure.attempts,
|
|
128
|
+
retryable: failure.retryable
|
|
129
|
+
})),
|
|
130
|
+
...bundleMembershipsBatch.failed.map((failure) => ({
|
|
131
|
+
user_product_id: failure.id,
|
|
132
|
+
stage: "bundles",
|
|
133
|
+
message: failure.message,
|
|
134
|
+
status_code: failure.statusCode,
|
|
135
|
+
attempts: failure.attempts,
|
|
136
|
+
retryable: failure.retryable
|
|
137
|
+
}))
|
|
138
|
+
];
|
|
139
|
+
const bundleContexts = uniqueUserProductIds.map((userProductId) => {
|
|
140
|
+
const userProduct = userProductsById.get(userProductId);
|
|
141
|
+
if (!userProduct) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return buildBundleContextRow({
|
|
145
|
+
userProductId,
|
|
146
|
+
userProduct,
|
|
147
|
+
inputRefs: userProductInputRefs.get(userProductId) ?? [`user_product:${userProductId}`],
|
|
148
|
+
bundleMemberships: bundleMembershipsById.get(userProductId)
|
|
149
|
+
});
|
|
150
|
+
}).filter((row) => Boolean(row));
|
|
151
|
+
return object(
|
|
152
|
+
stripNulls({
|
|
153
|
+
profile_id: profileId,
|
|
154
|
+
metadata: {
|
|
155
|
+
requested_items: itemIds.length,
|
|
156
|
+
requested_user_products: directUserProductIds.length,
|
|
157
|
+
resolved_user_products: uniqueUserProductIds.length,
|
|
158
|
+
kits_found: bundleContexts.filter((row) => row?.[4] === true).length,
|
|
159
|
+
components_found: bundleContexts.filter((row) => Number(row[8]) > 0).length,
|
|
160
|
+
failed: failures.length,
|
|
161
|
+
has_failures: failures.length > 0
|
|
162
|
+
},
|
|
163
|
+
bundle_contexts_schema: bundleContextsSchema,
|
|
164
|
+
bundle_contexts: bundleContexts,
|
|
165
|
+
failures: failures.length > 0 ? failures : void 0
|
|
166
|
+
})
|
|
167
|
+
);
|
|
168
|
+
} catch (err) {
|
|
169
|
+
return error(formatMercadoLibreError(err, "Failed to fetch MercadoLibre bundle context"));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export {
|
|
173
|
+
meliGetBundleContextByItemHandler,
|
|
174
|
+
meliGetBundleContextByItemSchema
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=get-bundle-context-by-item.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/get-bundle-context-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 {\n getMercadoLibreUserProductBundlesBatch,\n getMercadoLibreUserProductsBatch,\n resolveMercadoLibreUserProductsFromItems,\n} from \"../../services/mercadolibre/mercadolibre-kits.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, asRecord, normalizeScalarString, normalizeString } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst MAX_INPUT_IDS = 50;\n\nconst bundleContextsSchema = [\n \"user_product_id\",\n \"name\",\n \"domain_id\",\n \"input_refs\",\n \"is_kit\",\n \"bundle_type\",\n \"kit_component_count\",\n \"kit_components\",\n \"bundle_membership_count\",\n \"bundle_ids\",\n \"last_updated\",\n] as const;\n\nfunction compactKitComponents(userProduct: Record<string, unknown>) {\n const bundle = asRecord(userProduct.bundle);\n return asArray<Record<string, unknown>>(bundle.components)\n .map((component) => {\n const componentId = normalizeString(component.user_product_id);\n const quantity = normalizeScalarString(component.quantity);\n if (!componentId || !quantity) {\n return \"\";\n }\n\n return `${componentId} x${quantity}`;\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction buildBundleContextRow(params: {\n userProductId: string;\n userProduct: Record<string, unknown>;\n inputRefs: string[];\n bundleMemberships: Record<string, unknown> | undefined;\n}): Array<string | number | boolean> {\n const bundle = asRecord(params.userProduct.bundle);\n const bundleIds = asArray<string>(params.bundleMemberships?.bundles)\n .map((value) => normalizeString(value))\n .filter(Boolean);\n const isKit = Boolean(\n params.userProduct.tags &&\n asArray<string>(params.userProduct.tags).includes(\"bundle\") &&\n normalizeString(bundle.type) === \"kit\"\n );\n\n return [\n params.userProductId,\n normalizeString(params.userProduct.name),\n normalizeString(params.userProduct.domain_id),\n params.inputRefs.join(\" | \"),\n isKit,\n normalizeString(bundle.type),\n asArray<Record<string, unknown>>(bundle.components).length,\n isKit ? compactKitComponents(params.userProduct) : \"\",\n bundleIds.length,\n bundleIds.join(\" | \"),\n normalizeString(params.userProduct.last_updated),\n ];\n}\n\nexport const meliGetBundleContextByItemSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n itemIds: z\n .array(z.string().trim().min(1).describe(\"MercadoLibre item id.\"))\n .max(MAX_INPUT_IDS)\n .optional()\n .describe(\n \"Optional MercadoLibre item ids (up to 50). The tool resolves the item to its user_product_id first and then inspects the user product bundle/kit context.\"\n ),\n userProductIds: z\n .array(z.string().trim().min(1).describe(\"MercadoLibre user product id.\"))\n .max(MAX_INPUT_IDS)\n .optional()\n .describe(\n \"Optional MercadoLibre user_product_ids (up to 50). Use these when the item already resolves to a user product or when you want to inspect a known kit/component directly.\"\n ),\n}).refine((params) => (params.itemIds?.length ?? 0) + (params.userProductIds?.length ?? 0) > 0, {\n message: \"Provide at least one itemId or userProductId.\",\n path: [\"itemIds\"],\n});\n\nexport async function meliGetBundleContextByItemHandler(\n params: z.infer<typeof meliGetBundleContextByItemSchema>\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 itemIds = Array.from(new Set(params.itemIds ?? []));\n const directUserProductIds = Array.from(new Set(params.userProductIds ?? []));\n const resolvedFromItems = itemIds.length > 0 ? await resolveMercadoLibreUserProductsFromItems(profileId, itemIds) : [];\n\n const userProductInputRefs = new Map<string, string[]>();\n const resolvedUserProductIds = new Set<string>(directUserProductIds);\n\n for (const item of resolvedFromItems) {\n if (!item.userProductId) {\n continue;\n }\n\n resolvedUserProductIds.add(item.userProductId);\n const refs = userProductInputRefs.get(item.userProductId) ?? [];\n refs.push(`item:${item.itemId}`);\n userProductInputRefs.set(item.userProductId, refs);\n }\n\n for (const userProductId of directUserProductIds) {\n const refs = userProductInputRefs.get(userProductId) ?? [];\n refs.push(`user_product:${userProductId}`);\n userProductInputRefs.set(userProductId, refs);\n }\n\n const uniqueUserProductIds = Array.from(resolvedUserProductIds);\n\n const [userProductsBatch, bundleMembershipsBatch] = await Promise.all([\n getMercadoLibreUserProductsBatch(profileId, uniqueUserProductIds, {\n maxConcurrency: 10,\n maxRetries: 2,\n }),\n getMercadoLibreUserProductBundlesBatch(profileId, uniqueUserProductIds, {\n maxConcurrency: 10,\n maxRetries: 2,\n }),\n ]);\n\n const userProductsById = new Map<string, Record<string, unknown>>();\n userProductsBatch.successful.forEach((entry) => {\n userProductsById.set(entry.id, entry.document);\n });\n\n const bundleMembershipsById = new Map<string, Record<string, unknown>>();\n bundleMembershipsBatch.successful.forEach((entry) => {\n bundleMembershipsById.set(entry.id, entry.document);\n });\n\n const failures = [\n ...resolvedFromItems\n .filter((item) => item.itemId && !item.userProductId)\n .map((item) => ({\n item_id: item.itemId,\n stage: \"resolution\" as const,\n message: \"MercadoLibre item did not expose a user_product_id\",\n retryable: false,\n })),\n ...userProductsBatch.failed.map((failure) => ({\n user_product_id: failure.id,\n stage: \"user_product\" as const,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n })),\n ...bundleMembershipsBatch.failed.map((failure) => ({\n user_product_id: failure.id,\n stage: \"bundles\" as const,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n })),\n ];\n\n const bundleContexts = uniqueUserProductIds\n .map<Array<string | number | boolean> | null>((userProductId) => {\n const userProduct = userProductsById.get(userProductId);\n if (!userProduct) {\n return null;\n }\n\n return buildBundleContextRow({\n userProductId,\n userProduct,\n inputRefs: userProductInputRefs.get(userProductId) ?? [`user_product:${userProductId}`],\n bundleMemberships: bundleMembershipsById.get(userProductId),\n });\n })\n .filter((row): row is Array<string | number | boolean> => Boolean(row));\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n requested_items: itemIds.length,\n requested_user_products: directUserProductIds.length,\n resolved_user_products: uniqueUserProductIds.length,\n kits_found: bundleContexts.filter((row) => row?.[4] === true).length,\n components_found: bundleContexts.filter((row) => Number(row[8]) > 0).length,\n failed: failures.length,\n has_failures: failures.length > 0,\n },\n bundle_contexts_schema: bundleContextsSchema,\n bundle_contexts: bundleContexts,\n failures: failures.length > 0 ? failures : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre bundle context\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { error, object } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import {
|
|
4
|
+
formatMercadoLibreError
|
|
5
|
+
} from "../../services/mercadolibre/mercadolibre-api.js";
|
|
6
|
+
import {
|
|
7
|
+
getMercadoLibreBillingProvisions
|
|
8
|
+
} from "../../services/mercadolibre/mercadolibre-billing.js";
|
|
9
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
10
|
+
import {
|
|
11
|
+
normalizeString,
|
|
12
|
+
toNumber
|
|
13
|
+
} from "./helpers.js";
|
|
14
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
15
|
+
import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
|
|
16
|
+
const meliGetFullStorageChargesSchema = z.object({
|
|
17
|
+
profileId: mercadolibreProfileIdSchemaField,
|
|
18
|
+
periodKey: z.string().regex(/^\d{4}-\d{2}-01$/).describe("Billing period key in YYYY-MM-01 format (month start only)."),
|
|
19
|
+
documentType: z.enum(["BILL", "CREDIT_NOTE"]).default("BILL").optional().describe("Document type: BILL or CREDIT_NOTE. Defaults to BILL.")
|
|
20
|
+
});
|
|
21
|
+
const detailsFullSchema = [
|
|
22
|
+
// ── charge_info (12 columns) ──
|
|
23
|
+
"detail_id",
|
|
24
|
+
// 0
|
|
25
|
+
"creation_date_time",
|
|
26
|
+
// 1
|
|
27
|
+
"detail_type",
|
|
28
|
+
// 2
|
|
29
|
+
"detail_sub_type",
|
|
30
|
+
// 3
|
|
31
|
+
"concept_type",
|
|
32
|
+
// 4
|
|
33
|
+
"transaction_detail",
|
|
34
|
+
// 5
|
|
35
|
+
"detail_amount",
|
|
36
|
+
// 6
|
|
37
|
+
"payment_id",
|
|
38
|
+
// 7
|
|
39
|
+
"charge_bonified_id",
|
|
40
|
+
// 8
|
|
41
|
+
"legal_document_number",
|
|
42
|
+
// 9
|
|
43
|
+
"legal_document_status",
|
|
44
|
+
// 10
|
|
45
|
+
"legal_document_status_description",
|
|
46
|
+
// 11
|
|
47
|
+
// ── document_info (1 column) ──
|
|
48
|
+
"document_id",
|
|
49
|
+
// 12
|
|
50
|
+
// ── fulfillment_info (14 columns) ──
|
|
51
|
+
"ff_type",
|
|
52
|
+
// 13
|
|
53
|
+
"ff_amount",
|
|
54
|
+
// 14
|
|
55
|
+
"ff_amount_per_unit",
|
|
56
|
+
// 15
|
|
57
|
+
"ff_sku",
|
|
58
|
+
// 16
|
|
59
|
+
"ff_ean",
|
|
60
|
+
// 17
|
|
61
|
+
"ff_item_id",
|
|
62
|
+
// 18
|
|
63
|
+
"ff_item_title",
|
|
64
|
+
// 19
|
|
65
|
+
"ff_variation",
|
|
66
|
+
// 20
|
|
67
|
+
"ff_quantity",
|
|
68
|
+
// 21
|
|
69
|
+
"ff_item_quantity",
|
|
70
|
+
// 22
|
|
71
|
+
"ff_inventory_id",
|
|
72
|
+
// 23
|
|
73
|
+
"ff_warehouse_id",
|
|
74
|
+
// 24
|
|
75
|
+
"ff_source_id",
|
|
76
|
+
// 25
|
|
77
|
+
"ff_volume_type"
|
|
78
|
+
// 26
|
|
79
|
+
];
|
|
80
|
+
function projectFullDetailRow(row) {
|
|
81
|
+
const chargeInfo = row.charge_info ?? {};
|
|
82
|
+
const docInfo = row.document_info ?? {};
|
|
83
|
+
const ffInfo = row.fulfillment_info ?? {};
|
|
84
|
+
return [
|
|
85
|
+
// ── charge_info ──
|
|
86
|
+
normalizeString(chargeInfo.detail_id) || null,
|
|
87
|
+
normalizeString(chargeInfo.creation_date_time) || null,
|
|
88
|
+
normalizeString(chargeInfo.detail_type) || null,
|
|
89
|
+
normalizeString(chargeInfo.detail_sub_type) || null,
|
|
90
|
+
normalizeString(chargeInfo.concept_type) || null,
|
|
91
|
+
normalizeString(chargeInfo.transaction_detail) || null,
|
|
92
|
+
toNumber(chargeInfo.detail_amount),
|
|
93
|
+
normalizeString(chargeInfo.payment_id) || null,
|
|
94
|
+
normalizeString(chargeInfo.charge_bonified_id) || null,
|
|
95
|
+
normalizeString(chargeInfo.legal_document_number) || null,
|
|
96
|
+
normalizeString(chargeInfo.legal_document_status) || null,
|
|
97
|
+
normalizeString(chargeInfo.legal_document_status_description) || null,
|
|
98
|
+
// ── document_info ──
|
|
99
|
+
normalizeString(docInfo.document_id) || null,
|
|
100
|
+
// ── fulfillment_info ──
|
|
101
|
+
normalizeString(ffInfo.type) || null,
|
|
102
|
+
toNumber(ffInfo.amount),
|
|
103
|
+
toNumber(ffInfo.amount_per_unit),
|
|
104
|
+
normalizeString(ffInfo.sku) || null,
|
|
105
|
+
normalizeString(ffInfo.ean) || null,
|
|
106
|
+
normalizeString(ffInfo.item_id) || null,
|
|
107
|
+
normalizeString(ffInfo.item_title) || null,
|
|
108
|
+
normalizeString(ffInfo.variation) || null,
|
|
109
|
+
toNumber(ffInfo.quantity),
|
|
110
|
+
toNumber(ffInfo.item_quantity),
|
|
111
|
+
normalizeString(ffInfo.inventory_id) || null,
|
|
112
|
+
normalizeString(ffInfo.warehouse_id) || null,
|
|
113
|
+
normalizeString(ffInfo.source_id) || null,
|
|
114
|
+
normalizeString(ffInfo.volume_type) || null
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
const RATE_LIMIT_NOTE = "MELI billing Full endpoint has a rate limit of approximately 5 requests per minute. This tool fetches all pages with from_id cursor at limit=1000. If coverage is incomplete, use the continuation_from_id to resume via meli_get_billing_provisions_summary.";
|
|
118
|
+
async function meliGetFullStorageChargesHandler(params) {
|
|
119
|
+
try {
|
|
120
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
121
|
+
if (!profileResolution.ok) {
|
|
122
|
+
return profileResolution.response;
|
|
123
|
+
}
|
|
124
|
+
const profileId = profileResolution.value.profileId;
|
|
125
|
+
const documentType = params.documentType ?? "BILL";
|
|
126
|
+
const result = await getMercadoLibreBillingProvisions(profileId, {
|
|
127
|
+
periodKey: params.periodKey,
|
|
128
|
+
scope: "full",
|
|
129
|
+
documentType
|
|
130
|
+
});
|
|
131
|
+
const compactRows = [];
|
|
132
|
+
for (const row of result.rows) {
|
|
133
|
+
compactRows.push(projectFullDetailRow(row));
|
|
134
|
+
}
|
|
135
|
+
const metadata = {
|
|
136
|
+
total_reported: result.detail_count_total,
|
|
137
|
+
pages_requested: result.pages_requested,
|
|
138
|
+
pages_succeeded: result.pages_succeeded,
|
|
139
|
+
pages_failed: result.pages_failed,
|
|
140
|
+
coverage_complete: result.coverage_complete,
|
|
141
|
+
rate_limit_note: RATE_LIMIT_NOTE
|
|
142
|
+
};
|
|
143
|
+
if (!result.coverage_complete && result.last_id_seen) {
|
|
144
|
+
metadata.continuation_from_id = result.last_id_seen;
|
|
145
|
+
}
|
|
146
|
+
if (result.failures.length > 0) {
|
|
147
|
+
metadata.failures = result.failures;
|
|
148
|
+
}
|
|
149
|
+
const stripped = stripNulls({
|
|
150
|
+
profile_id: profileId,
|
|
151
|
+
period_key: params.periodKey,
|
|
152
|
+
scope: "full",
|
|
153
|
+
document_type: documentType,
|
|
154
|
+
metadata
|
|
155
|
+
});
|
|
156
|
+
stripped.details_schema = detailsFullSchema;
|
|
157
|
+
stripped.details = compactRows;
|
|
158
|
+
const meta = stripped.metadata;
|
|
159
|
+
meta.total_reported = result.detail_count_total;
|
|
160
|
+
meta.pages_requested = result.pages_requested;
|
|
161
|
+
meta.pages_succeeded = result.pages_succeeded;
|
|
162
|
+
meta.pages_failed = result.pages_failed;
|
|
163
|
+
meta.coverage_complete = result.coverage_complete;
|
|
164
|
+
meta.rate_limit_note = RATE_LIMIT_NOTE;
|
|
165
|
+
if (!result.coverage_complete && result.last_id_seen) {
|
|
166
|
+
meta.continuation_from_id = result.last_id_seen;
|
|
167
|
+
}
|
|
168
|
+
if (result.failures.length > 0) {
|
|
169
|
+
meta.failures = result.failures;
|
|
170
|
+
}
|
|
171
|
+
return object(stripped);
|
|
172
|
+
} catch (err) {
|
|
173
|
+
return error(
|
|
174
|
+
formatMercadoLibreError(err, "Failed to get MercadoLibre Full storage charges")
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export {
|
|
179
|
+
detailsFullSchema,
|
|
180
|
+
meliGetFullStorageChargesHandler,
|
|
181
|
+
meliGetFullStorageChargesSchema
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=get-full-storage-charges.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/get-full-storage-charges.ts"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n formatMercadoLibreError,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreBillingProvisions,\n} from \"../../services/mercadolibre/mercadolibre-billing.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n normalizeString,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\n// \u2500\u2500 Schema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const meliGetFullStorageChargesSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n periodKey: z\n .string()\n .regex(/^\\d{4}-\\d{2}-01$/)\n .describe(\"Billing period key in YYYY-MM-01 format (month start only).\"),\n documentType: z\n .enum([\"BILL\", \"CREDIT_NOTE\"])\n .default(\"BILL\")\n .optional()\n .describe(\"Document type: BILL or CREDIT_NOTE. Defaults to BILL.\"),\n});\n\n// \u2500\u2500 Compact schema for Full storage charges \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// The Full endpoint returns a different payload shape from standard billing\n// provisions: charge_info, fulfillment_info, document_info\n// (no sales_info, items_info, currency_info, marketplace_info).\n//\n// Column order is stable and positional \u2014 consumers reconstruct rows from\n// details_schema + details arrays.\n\nexport const detailsFullSchema = [\n // \u2500\u2500 charge_info (12 columns) \u2500\u2500\n \"detail_id\", // 0\n \"creation_date_time\", // 1\n \"detail_type\", // 2\n \"detail_sub_type\", // 3\n \"concept_type\", // 4\n \"transaction_detail\", // 5\n \"detail_amount\", // 6\n \"payment_id\", // 7\n \"charge_bonified_id\", // 8\n \"legal_document_number\", // 9\n \"legal_document_status\", // 10\n \"legal_document_status_description\", // 11\n // \u2500\u2500 document_info (1 column) \u2500\u2500\n \"document_id\", // 12\n // \u2500\u2500 fulfillment_info (14 columns) \u2500\u2500\n \"ff_type\", // 13\n \"ff_amount\", // 14\n \"ff_amount_per_unit\", // 15\n \"ff_sku\", // 16\n \"ff_ean\", // 17\n \"ff_item_id\", // 18\n \"ff_item_title\", // 19\n \"ff_variation\", // 20\n \"ff_quantity\", // 21\n \"ff_item_quantity\", // 22\n \"ff_inventory_id\", // 23\n \"ff_warehouse_id\", // 24\n \"ff_source_id\", // 25\n \"ff_volume_type\", // 26\n] as const;\n\ntype FullDetailRow = (string | number | null)[];\n\n/**\n * Project a raw MELI Full billing detail row into a positional compact array.\n * The order matches `detailsFullSchema`.\n *\n * Fields come from:\n * - charge_info: detail_id, creation_date_time, detail_type, detail_sub_type,\n * concept_type, transaction_detail, detail_amount, payment_id,\n * charge_bonified_id, legal_document_number, legal_document_status,\n * legal_document_status_description\n * - document_info: document_id\n * - fulfillment_info: type, amount, amount_per_unit, sku, ean, item_id,\n * item_title, variation, quantity, item_quantity, inventory_id,\n * warehouse_id, source_id, volume_type\n */\nfunction projectFullDetailRow(row: Record<string, unknown>): FullDetailRow {\n const chargeInfo = (row.charge_info as Record<string, unknown>) ?? {};\n const docInfo = (row.document_info as Record<string, unknown>) ?? {};\n const ffInfo = (row.fulfillment_info as Record<string, unknown>) ?? {};\n\n return [\n // \u2500\u2500 charge_info \u2500\u2500\n normalizeString(chargeInfo.detail_id) || null,\n normalizeString(chargeInfo.creation_date_time) || null,\n normalizeString(chargeInfo.detail_type) || null,\n normalizeString(chargeInfo.detail_sub_type) || null,\n normalizeString(chargeInfo.concept_type) || null,\n normalizeString(chargeInfo.transaction_detail) || null,\n toNumber(chargeInfo.detail_amount),\n normalizeString(chargeInfo.payment_id) || null,\n normalizeString(chargeInfo.charge_bonified_id) || null,\n normalizeString(chargeInfo.legal_document_number) || null,\n normalizeString(chargeInfo.legal_document_status) || null,\n normalizeString(chargeInfo.legal_document_status_description) || null,\n // \u2500\u2500 document_info \u2500\u2500\n normalizeString(docInfo.document_id) || null,\n // \u2500\u2500 fulfillment_info \u2500\u2500\n normalizeString(ffInfo.type) || null,\n toNumber(ffInfo.amount),\n toNumber(ffInfo.amount_per_unit),\n normalizeString(ffInfo.sku) || null,\n normalizeString(ffInfo.ean) || null,\n normalizeString(ffInfo.item_id) || null,\n normalizeString(ffInfo.item_title) || null,\n normalizeString(ffInfo.variation) || null,\n toNumber(ffInfo.quantity),\n toNumber(ffInfo.item_quantity),\n normalizeString(ffInfo.inventory_id) || null,\n normalizeString(ffInfo.warehouse_id) || null,\n normalizeString(ffInfo.source_id) || null,\n normalizeString(ffInfo.volume_type) || null,\n ];\n}\n\n// \u2500\u2500 Handler \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst RATE_LIMIT_NOTE =\n \"MELI billing Full endpoint has a rate limit of approximately 5 requests per minute. \" +\n \"This tool fetches all pages with from_id cursor at limit=1000. \" +\n \"If coverage is incomplete, use the continuation_from_id to resume via meli_get_billing_provisions_summary.\";\n\nexport async function meliGetFullStorageChargesHandler(\n params: z.infer<typeof meliGetFullStorageChargesSchema>\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 documentType = params.documentType ?? \"BILL\";\n\n const result = await getMercadoLibreBillingProvisions(profileId, {\n periodKey: params.periodKey,\n scope: \"full\",\n documentType,\n });\n\n // \u2500\u2500 Project compact rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const compactRows: FullDetailRow[] = [];\n for (const row of result.rows) {\n compactRows.push(projectFullDetailRow(row));\n }\n\n // \u2500\u2500 Build metadata \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const metadata: Record<string, unknown> = {\n total_reported: result.detail_count_total,\n pages_requested: result.pages_requested,\n pages_succeeded: result.pages_succeeded,\n pages_failed: result.pages_failed,\n coverage_complete: result.coverage_complete,\n rate_limit_note: RATE_LIMIT_NOTE,\n };\n\n if (!result.coverage_complete && result.last_id_seen) {\n metadata.continuation_from_id = result.last_id_seen;\n }\n\n if (result.failures.length > 0) {\n metadata.failures = result.failures;\n }\n\n // \u2500\u2500 Build response \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const stripped = stripNulls({\n profile_id: profileId,\n period_key: params.periodKey,\n scope: \"full\",\n document_type: documentType,\n metadata,\n }) as Record<string, unknown>;\n\n // Always attach compact blocks (preserve positional contract)\n stripped.details_schema = detailsFullSchema;\n stripped.details = compactRows;\n\n // Ensure metadata arrays survive stripNulls\n const meta = stripped.metadata as Record<string, unknown>;\n meta.total_reported = result.detail_count_total;\n meta.pages_requested = result.pages_requested;\n meta.pages_succeeded = result.pages_succeeded;\n meta.pages_failed = result.pages_failed;\n meta.coverage_complete = result.coverage_complete;\n meta.rate_limit_note = RATE_LIMIT_NOTE;\n if (!result.coverage_complete && result.last_id_seen) {\n meta.continuation_from_id = result.last_id_seen;\n }\n if (result.failures.length > 0) {\n meta.failures = result.failures;\n }\n\n return object(stripped);\n } catch (err) {\n return error(\n formatMercadoLibreError(err, \"Failed to get MercadoLibre Full storage charges\")\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { error, object } from "mcp-use/server";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { MercadoLibreApiError } from "../../services/mercadolibre/mercadolibre-api.js";
|
|
4
|
+
import {
|
|
5
|
+
getMercadoLibreOrderBillingInfo,
|
|
6
|
+
getMercadoLibreSaleBillingInfo
|
|
7
|
+
} from "../../services/mercadolibre/mercadolibre-order-billing-info.js";
|
|
8
|
+
import { stripNulls } from "../../utils/strip-payload.js";
|
|
9
|
+
import { asRecord, normalizeScalarString } from "./helpers.js";
|
|
10
|
+
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
11
|
+
const meliGetOrderBillingInfoSchema = z.object({
|
|
12
|
+
profileId: z.string().trim().min(1).describe("Explicit MercadoLibre profile ID to use."),
|
|
13
|
+
saleReference: z.string().trim().min(1).optional().describe("Explicit workbook sale reference. The tool tries it as an order, then as a pack only when MercadoLibre reports that order as not found."),
|
|
14
|
+
orderId: z.string().trim().min(1).optional().describe("Deprecated compatibility input for one MercadoLibre order ID. Use saleReference for order-or-pack workbook values.")
|
|
15
|
+
}).refine((value) => Boolean(value.saleReference) !== Boolean(value.orderId), {
|
|
16
|
+
message: "Provide exactly one of saleReference or orderId."
|
|
17
|
+
});
|
|
18
|
+
function locationName(value) {
|
|
19
|
+
const record = asRecord(value);
|
|
20
|
+
return normalizeScalarString(record.name ?? value) || void 0;
|
|
21
|
+
}
|
|
22
|
+
function streetAddress(address) {
|
|
23
|
+
const street = [normalizeScalarString(address.street_name), normalizeScalarString(address.street_number)].filter(Boolean).join(" ");
|
|
24
|
+
return street || void 0;
|
|
25
|
+
}
|
|
26
|
+
function projectBillingInfo(billingInfo) {
|
|
27
|
+
const buyerBillingInfo = asRecord(asRecord(billingInfo.buyer).billing_info);
|
|
28
|
+
const identification = asRecord(buyerBillingInfo.identification);
|
|
29
|
+
const address = asRecord(buyerBillingInfo.address);
|
|
30
|
+
const taxpayerType = asRecord(asRecord(buyerBillingInfo.taxes).taxpayer_type);
|
|
31
|
+
return stripNulls({
|
|
32
|
+
buyer: {
|
|
33
|
+
name: normalizeScalarString(buyerBillingInfo.name) || void 0,
|
|
34
|
+
last_name: normalizeScalarString(buyerBillingInfo.last_name) || void 0,
|
|
35
|
+
identification: stripNulls({
|
|
36
|
+
type: normalizeScalarString(identification.type) || void 0,
|
|
37
|
+
number: normalizeScalarString(identification.number) || void 0
|
|
38
|
+
})
|
|
39
|
+
},
|
|
40
|
+
billing_address: {
|
|
41
|
+
street: streetAddress(address),
|
|
42
|
+
city: locationName(address.city_name),
|
|
43
|
+
state: locationName(address.state),
|
|
44
|
+
zip_code: normalizeScalarString(address.zip_code) || void 0,
|
|
45
|
+
country: normalizeScalarString(address.country_id) || void 0
|
|
46
|
+
},
|
|
47
|
+
taxpayer_type: stripNulls({
|
|
48
|
+
id: normalizeScalarString(taxpayerType.id) || void 0,
|
|
49
|
+
description: normalizeScalarString(taxpayerType.description) || void 0
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function fiscalFieldMetadata(fiscal) {
|
|
54
|
+
const availableFields = [];
|
|
55
|
+
const missingFields = [];
|
|
56
|
+
const fields = [
|
|
57
|
+
["buyer.name", asRecord(fiscal.buyer).name],
|
|
58
|
+
["buyer.last_name", asRecord(fiscal.buyer).last_name],
|
|
59
|
+
["buyer.identification.type", asRecord(asRecord(fiscal.buyer).identification).type],
|
|
60
|
+
["buyer.identification.number", asRecord(asRecord(fiscal.buyer).identification).number],
|
|
61
|
+
["billing_address.street", asRecord(fiscal.billing_address).street],
|
|
62
|
+
["billing_address.city", asRecord(fiscal.billing_address).city],
|
|
63
|
+
["billing_address.state", asRecord(fiscal.billing_address).state],
|
|
64
|
+
["billing_address.zip_code", asRecord(fiscal.billing_address).zip_code],
|
|
65
|
+
["billing_address.country", asRecord(fiscal.billing_address).country],
|
|
66
|
+
["taxpayer_type.id", asRecord(fiscal.taxpayer_type).id],
|
|
67
|
+
["taxpayer_type.description", asRecord(fiscal.taxpayer_type).description]
|
|
68
|
+
];
|
|
69
|
+
for (const [field, value] of fields) {
|
|
70
|
+
(value === void 0 ? missingFields : availableFields).push(field);
|
|
71
|
+
}
|
|
72
|
+
return { available_fields: availableFields, missing_optional_fields: missingFields };
|
|
73
|
+
}
|
|
74
|
+
function formatSafeBillingInfoFailure(error2) {
|
|
75
|
+
if (!(error2 instanceof MercadoLibreApiError)) {
|
|
76
|
+
return "MercadoLibre order billing info unavailable.";
|
|
77
|
+
}
|
|
78
|
+
const status = error2.status;
|
|
79
|
+
const statusClass = status === void 0 ? "network_or_timeout" : status >= 500 ? "http_5xx" : status >= 400 ? "http_4xx" : "upstream_error";
|
|
80
|
+
const resource = error2.resource;
|
|
81
|
+
const reason = status === 404 && resource === "pack" ? "pack_not_found" : status === 404 && resource === "order" ? "order_not_found" : status === 404 ? "upstream_resource_not_found" : status === 401 || status === 403 ? "upstream_access_denied" : status === 429 ? "upstream_rate_limited" : status !== void 0 && status >= 500 ? "upstream_unavailable" : "upstream_request_failed";
|
|
82
|
+
const statusDetail = status === void 0 ? "" : `; status=${status}`;
|
|
83
|
+
const terminalDiagnostic = error2;
|
|
84
|
+
const recoveryDetail = typeof terminalDiagnostic.attempts === "number" && Number.isSafeInteger(terminalDiagnostic.attempts) && terminalDiagnostic.attempts > 0 && typeof terminalDiagnostic.retryable === "boolean" ? `; attempts=${terminalDiagnostic.attempts}; retryable=${terminalDiagnostic.retryable}` : "";
|
|
85
|
+
return `MercadoLibre order billing info unavailable: reason=${reason}; status_class=${statusClass}${statusDetail}${recoveryDetail}.`;
|
|
86
|
+
}
|
|
87
|
+
function projectOrderBillingResult(profileId, orderId, result, resolutionKind) {
|
|
88
|
+
if (!result.available) {
|
|
89
|
+
return {
|
|
90
|
+
metadata: stripNulls({
|
|
91
|
+
profile_id: profileId,
|
|
92
|
+
order_id: orderId,
|
|
93
|
+
resolution_kind: resolutionKind,
|
|
94
|
+
fiscal_data_status: "unavailable",
|
|
95
|
+
reason: result.reason,
|
|
96
|
+
provenance: "order.buyer.billing_info"
|
|
97
|
+
})
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const fiscal = projectBillingInfo(result.billingInfo);
|
|
101
|
+
return stripNulls({
|
|
102
|
+
metadata: {
|
|
103
|
+
profile_id: profileId,
|
|
104
|
+
order_id: orderId,
|
|
105
|
+
resolution_kind: resolutionKind,
|
|
106
|
+
fiscal_data_status: "available",
|
|
107
|
+
field_provenance: {
|
|
108
|
+
buyer: "billing-info.buyer.billing_info",
|
|
109
|
+
billing_address: "billing-info.buyer.billing_info.address",
|
|
110
|
+
taxpayer_type: "billing-info.buyer.billing_info.taxes.taxpayer_type"
|
|
111
|
+
},
|
|
112
|
+
...fiscalFieldMetadata(fiscal)
|
|
113
|
+
},
|
|
114
|
+
fiscal
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function projectPackMetadata(metadata) {
|
|
118
|
+
return {
|
|
119
|
+
member_count: metadata.memberCount,
|
|
120
|
+
valid_member_count: metadata.validMemberCount,
|
|
121
|
+
invalid_member_count: metadata.invalidMemberCount,
|
|
122
|
+
accessible_count: metadata.accessibleCount,
|
|
123
|
+
available_count: metadata.availableCount,
|
|
124
|
+
unavailable_count: metadata.unavailableCount,
|
|
125
|
+
failed_count: metadata.failedCount,
|
|
126
|
+
partial_coverage: metadata.partialCoverage,
|
|
127
|
+
deadline_exceeded: metadata.deadlineExceeded,
|
|
128
|
+
recovery_guidance: metadata.recoveryGuidance
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async function meliGetOrderBillingInfoHandler(params) {
|
|
132
|
+
try {
|
|
133
|
+
const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
|
|
134
|
+
if (!profileResolution.ok) {
|
|
135
|
+
return profileResolution.response;
|
|
136
|
+
}
|
|
137
|
+
const profileId = profileResolution.value.profileId;
|
|
138
|
+
if (params.orderId) {
|
|
139
|
+
return object(projectOrderBillingResult(profileId, params.orderId, await getMercadoLibreOrderBillingInfo(profileId, params.orderId)));
|
|
140
|
+
}
|
|
141
|
+
const saleReference = params.saleReference;
|
|
142
|
+
const resolution = await getMercadoLibreSaleBillingInfo(profileId, saleReference);
|
|
143
|
+
if (resolution.resolutionKind === "order") {
|
|
144
|
+
return object(projectOrderBillingResult(profileId, resolution.orderId, resolution.result, "order"));
|
|
145
|
+
}
|
|
146
|
+
if ("unavailableReason" in resolution) {
|
|
147
|
+
return object({
|
|
148
|
+
metadata: {
|
|
149
|
+
profile_id: profileId,
|
|
150
|
+
sale_reference: saleReference,
|
|
151
|
+
resolution_kind: "pack",
|
|
152
|
+
fiscal_data_status: "unavailable",
|
|
153
|
+
reason: resolution.unavailableReason,
|
|
154
|
+
...projectPackMetadata(resolution.metadata)
|
|
155
|
+
},
|
|
156
|
+
members: []
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return object({
|
|
160
|
+
metadata: {
|
|
161
|
+
profile_id: profileId,
|
|
162
|
+
sale_reference: saleReference,
|
|
163
|
+
resolution_kind: "pack",
|
|
164
|
+
fiscal_data_status: resolution.metadata.partialCoverage ? "partial" : "available",
|
|
165
|
+
...projectPackMetadata(resolution.metadata)
|
|
166
|
+
},
|
|
167
|
+
members: resolution.members.map((member) => {
|
|
168
|
+
if (!member.accessible) {
|
|
169
|
+
return {
|
|
170
|
+
metadata: {
|
|
171
|
+
..."orderId" in member ? { order_id: member.orderId } : { member_index: member.memberIndex },
|
|
172
|
+
fiscal_data_status: "failed",
|
|
173
|
+
reason: member.failureReason,
|
|
174
|
+
..."orderId" in member && typeof member.attempts === "number" && typeof member.retryable === "boolean" ? { attempts: member.attempts, retryable: member.retryable } : {}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return projectOrderBillingResult(profileId, member.orderId, member.result, "order");
|
|
179
|
+
})
|
|
180
|
+
});
|
|
181
|
+
} catch (err) {
|
|
182
|
+
return error(formatSafeBillingInfoFailure(err));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export {
|
|
186
|
+
meliGetOrderBillingInfoHandler,
|
|
187
|
+
meliGetOrderBillingInfoSchema
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=get-order-billing-info.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/tools/mercadolibre/get-order-billing-info.ts"],
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { MercadoLibreApiError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreOrderBillingInfo,\n getMercadoLibreSaleBillingInfo,\n type MercadoLibreOrderBillingInfoResult,\n} from \"../../services/mercadolibre/mercadolibre-order-billing-info.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asRecord, normalizeScalarString } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\n\nexport const meliGetOrderBillingInfoSchema = z\n .object({\n profileId: z.string().trim().min(1).describe(\"Explicit MercadoLibre profile ID to use.\"),\n saleReference: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Explicit workbook sale reference. The tool tries it as an order, then as a pack only when MercadoLibre reports that order as not found.\"),\n orderId: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Deprecated compatibility input for one MercadoLibre order ID. Use saleReference for order-or-pack workbook values.\"),\n })\n .refine((value) => Boolean(value.saleReference) !== Boolean(value.orderId), {\n message: \"Provide exactly one of saleReference or orderId.\",\n });\n\nfunction locationName(value: unknown): string | undefined {\n const record = asRecord(value);\n return normalizeScalarString(record.name ?? value) || undefined;\n}\n\nfunction streetAddress(address: Record<string, unknown>): string | undefined {\n const street = [normalizeScalarString(address.street_name), normalizeScalarString(address.street_number)]\n .filter(Boolean)\n .join(\" \");\n return street || undefined;\n}\n\nfunction projectBillingInfo(billingInfo: Record<string, unknown>) {\n const buyerBillingInfo = asRecord(asRecord(billingInfo.buyer).billing_info);\n const identification = asRecord(buyerBillingInfo.identification);\n const address = asRecord(buyerBillingInfo.address);\n const taxpayerType = asRecord(asRecord(buyerBillingInfo.taxes).taxpayer_type);\n\n return stripNulls({\n buyer: {\n name: normalizeScalarString(buyerBillingInfo.name) || undefined,\n last_name: normalizeScalarString(buyerBillingInfo.last_name) || undefined,\n identification: stripNulls({\n type: normalizeScalarString(identification.type) || undefined,\n number: normalizeScalarString(identification.number) || undefined,\n }),\n },\n billing_address: {\n street: streetAddress(address),\n city: locationName(address.city_name),\n state: locationName(address.state),\n zip_code: normalizeScalarString(address.zip_code) || undefined,\n country: normalizeScalarString(address.country_id) || undefined,\n },\n taxpayer_type: stripNulls({\n id: normalizeScalarString(taxpayerType.id) || undefined,\n description: normalizeScalarString(taxpayerType.description) || undefined,\n }),\n });\n}\n\nfunction fiscalFieldMetadata(fiscal: Record<string, unknown>) {\n const availableFields: string[] = [];\n const missingFields: string[] = [];\n const fields = [\n [\"buyer.name\", asRecord(fiscal.buyer).name],\n [\"buyer.last_name\", asRecord(fiscal.buyer).last_name],\n [\"buyer.identification.type\", asRecord(asRecord(fiscal.buyer).identification).type],\n [\"buyer.identification.number\", asRecord(asRecord(fiscal.buyer).identification).number],\n [\"billing_address.street\", asRecord(fiscal.billing_address).street],\n [\"billing_address.city\", asRecord(fiscal.billing_address).city],\n [\"billing_address.state\", asRecord(fiscal.billing_address).state],\n [\"billing_address.zip_code\", asRecord(fiscal.billing_address).zip_code],\n [\"billing_address.country\", asRecord(fiscal.billing_address).country],\n [\"taxpayer_type.id\", asRecord(fiscal.taxpayer_type).id],\n [\"taxpayer_type.description\", asRecord(fiscal.taxpayer_type).description],\n ] as const;\n\n for (const [field, value] of fields) {\n (value === undefined ? missingFields : availableFields).push(field);\n }\n\n return { available_fields: availableFields, missing_optional_fields: missingFields };\n}\n\nfunction formatSafeBillingInfoFailure(error: unknown): string {\n if (!(error instanceof MercadoLibreApiError)) {\n return \"MercadoLibre order billing info unavailable.\";\n }\n\n const status = error.status;\n const statusClass =\n status === undefined\n ? \"network_or_timeout\"\n : status >= 500\n ? \"http_5xx\"\n : status >= 400\n ? \"http_4xx\"\n : \"upstream_error\";\n const resource = (error as MercadoLibreApiError & { resource?: string }).resource;\n const reason =\n status === 404 && resource === \"pack\"\n ? \"pack_not_found\"\n : status === 404 && resource === \"order\"\n ? \"order_not_found\"\n : status === 404\n ? \"upstream_resource_not_found\"\n : status === 401 || status === 403\n ? \"upstream_access_denied\"\n : status === 429\n ? \"upstream_rate_limited\"\n : status !== undefined && status >= 500\n ? \"upstream_unavailable\"\n : \"upstream_request_failed\";\n const statusDetail = status === undefined ? \"\" : `; status=${status}`;\n const terminalDiagnostic = error as MercadoLibreApiError & {\n attempts?: unknown;\n retryable?: unknown;\n };\n const recoveryDetail =\n typeof terminalDiagnostic.attempts === \"number\" &&\n Number.isSafeInteger(terminalDiagnostic.attempts) &&\n terminalDiagnostic.attempts > 0 &&\n typeof terminalDiagnostic.retryable === \"boolean\"\n ? `; attempts=${terminalDiagnostic.attempts}; retryable=${terminalDiagnostic.retryable}`\n : \"\";\n\n return `MercadoLibre order billing info unavailable: reason=${reason}; status_class=${statusClass}${statusDetail}${recoveryDetail}.`;\n}\n\nfunction projectOrderBillingResult(\n profileId: string,\n orderId: string,\n result: MercadoLibreOrderBillingInfoResult,\n resolutionKind?: \"order\"\n) {\n if (!result.available) {\n return {\n metadata: stripNulls({\n profile_id: profileId,\n order_id: orderId,\n resolution_kind: resolutionKind,\n fiscal_data_status: \"unavailable\",\n reason: result.reason,\n provenance: \"order.buyer.billing_info\",\n }),\n };\n }\n\n const fiscal = projectBillingInfo(result.billingInfo) as Record<string, unknown>;\n return stripNulls({\n metadata: {\n profile_id: profileId,\n order_id: orderId,\n resolution_kind: resolutionKind,\n fiscal_data_status: \"available\",\n field_provenance: {\n buyer: \"billing-info.buyer.billing_info\",\n billing_address: \"billing-info.buyer.billing_info.address\",\n taxpayer_type: \"billing-info.buyer.billing_info.taxes.taxpayer_type\",\n },\n ...fiscalFieldMetadata(fiscal),\n },\n fiscal,\n });\n}\n\nfunction projectPackMetadata(metadata: {\n memberCount: number;\n validMemberCount: number;\n invalidMemberCount: number;\n accessibleCount: number;\n availableCount: number;\n unavailableCount: number;\n failedCount: number;\n partialCoverage: boolean;\n deadlineExceeded: boolean;\n recoveryGuidance: string;\n}) {\n return {\n member_count: metadata.memberCount,\n valid_member_count: metadata.validMemberCount,\n invalid_member_count: metadata.invalidMemberCount,\n accessible_count: metadata.accessibleCount,\n available_count: metadata.availableCount,\n unavailable_count: metadata.unavailableCount,\n failed_count: metadata.failedCount,\n partial_coverage: metadata.partialCoverage,\n deadline_exceeded: metadata.deadlineExceeded,\n recovery_guidance: metadata.recoveryGuidance,\n };\n}\n\nexport async function meliGetOrderBillingInfoHandler(\n params: z.infer<typeof meliGetOrderBillingInfoSchema>\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\n if (params.orderId) {\n return object(projectOrderBillingResult(profileId, params.orderId, await getMercadoLibreOrderBillingInfo(profileId, params.orderId)));\n }\n\n const saleReference = params.saleReference!;\n const resolution = await getMercadoLibreSaleBillingInfo(profileId, saleReference);\n if (resolution.resolutionKind === \"order\") {\n return object(projectOrderBillingResult(profileId, resolution.orderId, resolution.result, \"order\"));\n }\n\n if (\"unavailableReason\" in resolution) {\n return object({\n metadata: {\n profile_id: profileId,\n sale_reference: saleReference,\n resolution_kind: \"pack\",\n fiscal_data_status: \"unavailable\",\n reason: resolution.unavailableReason,\n ...projectPackMetadata(resolution.metadata),\n },\n members: [],\n });\n }\n\n return object({\n metadata: {\n profile_id: profileId,\n sale_reference: saleReference,\n resolution_kind: \"pack\",\n fiscal_data_status: resolution.metadata.partialCoverage ? \"partial\" : \"available\",\n ...projectPackMetadata(resolution.metadata),\n },\n members: resolution.members.map((member) => {\n if (!member.accessible) {\n return {\n metadata: {\n ...(\"orderId\" in member ? { order_id: member.orderId } : { member_index: member.memberIndex }),\n fiscal_data_status: \"failed\",\n reason: member.failureReason,\n ...(\n \"orderId\" in member &&\n typeof member.attempts === \"number\" &&\n typeof member.retryable === \"boolean\"\n ? { attempts: member.attempts, retryable: member.retryable }\n : {}\n ),\n },\n };\n }\n return projectOrderBillingResult(profileId, member.orderId, member.result, \"order\");\n }),\n });\n } catch (err) {\n return error(formatSafeBillingInfoFailure(err));\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,kBAAkB;AAC3B,SAAS,UAAU,6BAA6B;AAChD,SAAS,6CAA6C;AAE/C,MAAM,gCAAgC,EAC1C,OAAO;AAAA,EACN,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EACvF,eAAe,EACZ,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT,SAAS,yIAAyI;AAAA,EACrJ,SAAS,EACN,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT,SAAS,oHAAoH;AAClI,CAAC,EACA,OAAO,CAAC,UAAU,QAAQ,MAAM,aAAa,MAAM,QAAQ,MAAM,OAAO,GAAG;AAAA,EAC1E,SAAS;AACX,CAAC;AAEH,SAAS,aAAa,OAAoC;AACxD,QAAM,SAAS,SAAS,KAAK;AAC7B,SAAO,sBAAsB,OAAO,QAAQ,KAAK,KAAK;AACxD;AAEA,SAAS,cAAc,SAAsD;AAC3E,QAAM,SAAS,CAAC,sBAAsB,QAAQ,WAAW,GAAG,sBAAsB,QAAQ,aAAa,CAAC,EACrG,OAAO,OAAO,EACd,KAAK,GAAG;AACX,SAAO,UAAU;AACnB;AAEA,SAAS,mBAAmB,aAAsC;AAChE,QAAM,mBAAmB,SAAS,SAAS,YAAY,KAAK,EAAE,YAAY;AAC1E,QAAM,iBAAiB,SAAS,iBAAiB,cAAc;AAC/D,QAAM,UAAU,SAAS,iBAAiB,OAAO;AACjD,QAAM,eAAe,SAAS,SAAS,iBAAiB,KAAK,EAAE,aAAa;AAE5E,SAAO,WAAW;AAAA,IAChB,OAAO;AAAA,MACL,MAAM,sBAAsB,iBAAiB,IAAI,KAAK;AAAA,MACtD,WAAW,sBAAsB,iBAAiB,SAAS,KAAK;AAAA,MAChE,gBAAgB,WAAW;AAAA,QACzB,MAAM,sBAAsB,eAAe,IAAI,KAAK;AAAA,QACpD,QAAQ,sBAAsB,eAAe,MAAM,KAAK;AAAA,MAC1D,CAAC;AAAA,IACH;AAAA,IACA,iBAAiB;AAAA,MACf,QAAQ,cAAc,OAAO;AAAA,MAC7B,MAAM,aAAa,QAAQ,SAAS;AAAA,MACpC,OAAO,aAAa,QAAQ,KAAK;AAAA,MACjC,UAAU,sBAAsB,QAAQ,QAAQ,KAAK;AAAA,MACrD,SAAS,sBAAsB,QAAQ,UAAU,KAAK;AAAA,IACxD;AAAA,IACA,eAAe,WAAW;AAAA,MACxB,IAAI,sBAAsB,aAAa,EAAE,KAAK;AAAA,MAC9C,aAAa,sBAAsB,aAAa,WAAW,KAAK;AAAA,IAClE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,oBAAoB,QAAiC;AAC5D,QAAM,kBAA4B,CAAC;AACnC,QAAM,gBAA0B,CAAC;AACjC,QAAM,SAAS;AAAA,IACb,CAAC,cAAc,SAAS,OAAO,KAAK,EAAE,IAAI;AAAA,IAC1C,CAAC,mBAAmB,SAAS,OAAO,KAAK,EAAE,SAAS;AAAA,IACpD,CAAC,6BAA6B,SAAS,SAAS,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI;AAAA,IAClF,CAAC,+BAA+B,SAAS,SAAS,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM;AAAA,IACtF,CAAC,0BAA0B,SAAS,OAAO,eAAe,EAAE,MAAM;AAAA,IAClE,CAAC,wBAAwB,SAAS,OAAO,eAAe,EAAE,IAAI;AAAA,IAC9D,CAAC,yBAAyB,SAAS,OAAO,eAAe,EAAE,KAAK;AAAA,IAChE,CAAC,4BAA4B,SAAS,OAAO,eAAe,EAAE,QAAQ;AAAA,IACtE,CAAC,2BAA2B,SAAS,OAAO,eAAe,EAAE,OAAO;AAAA,IACpE,CAAC,oBAAoB,SAAS,OAAO,aAAa,EAAE,EAAE;AAAA,IACtD,CAAC,6BAA6B,SAAS,OAAO,aAAa,EAAE,WAAW;AAAA,EAC1E;AAEA,aAAW,CAAC,OAAO,KAAK,KAAK,QAAQ;AACnC,KAAC,UAAU,SAAY,gBAAgB,iBAAiB,KAAK,KAAK;AAAA,EACpE;AAEA,SAAO,EAAE,kBAAkB,iBAAiB,yBAAyB,cAAc;AACrF;AAEA,SAAS,6BAA6BA,QAAwB;AAC5D,MAAI,EAAEA,kBAAiB,uBAAuB;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,SAASA,OAAM;AACrB,QAAM,cACJ,WAAW,SACP,uBACA,UAAU,MACR,aACA,UAAU,MACR,aACA;AACV,QAAM,WAAYA,OAAuD;AACzE,QAAM,SACJ,WAAW,OAAO,aAAa,SAC3B,mBACA,WAAW,OAAO,aAAa,UAC7B,oBACF,WAAW,MACT,gCACA,WAAW,OAAO,WAAW,MAC3B,2BACA,WAAW,MACT,0BACA,WAAW,UAAa,UAAU,MAChC,yBACA;AACd,QAAM,eAAe,WAAW,SAAY,KAAK,YAAY,MAAM;AACnE,QAAM,qBAAqBA;AAI3B,QAAM,iBACJ,OAAO,mBAAmB,aAAa,YACvC,OAAO,cAAc,mBAAmB,QAAQ,KAChD,mBAAmB,WAAW,KAC9B,OAAO,mBAAmB,cAAc,YACpC,cAAc,mBAAmB,QAAQ,eAAe,mBAAmB,SAAS,KACpF;AAEN,SAAO,uDAAuD,MAAM,kBAAkB,WAAW,GAAG,YAAY,GAAG,cAAc;AACnI;AAEA,SAAS,0BACP,WACA,SACA,QACA,gBACA;AACA,MAAI,CAAC,OAAO,WAAW;AACrB,WAAO;AAAA,MACL,UAAU,WAAW;AAAA,QACnB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,oBAAoB;AAAA,QACpB,QAAQ,OAAO;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAS,mBAAmB,OAAO,WAAW;AACpD,SAAO,WAAW;AAAA,IAChB,UAAU;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,QAChB,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,eAAe;AAAA,MACjB;AAAA,MACA,GAAG,oBAAoB,MAAM;AAAA,IAC/B;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,UAW1B;AACD,SAAO;AAAA,IACL,cAAc,SAAS;AAAA,IACvB,oBAAoB,SAAS;AAAA,IAC7B,sBAAsB,SAAS;AAAA,IAC/B,kBAAkB,SAAS;AAAA,IAC3B,iBAAiB,SAAS;AAAA,IAC1B,mBAAmB,SAAS;AAAA,IAC5B,cAAc,SAAS;AAAA,IACvB,kBAAkB,SAAS;AAAA,IAC3B,mBAAmB,SAAS;AAAA,IAC5B,mBAAmB,SAAS;AAAA,EAC9B;AACF;AAEA,eAAsB,+BACpB,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;AAE1C,QAAI,OAAO,SAAS;AAClB,aAAO,OAAO,0BAA0B,WAAW,OAAO,SAAS,MAAM,gCAAgC,WAAW,OAAO,OAAO,CAAC,CAAC;AAAA,IACtI;AAEA,UAAM,gBAAgB,OAAO;AAC7B,UAAM,aAAa,MAAM,+BAA+B,WAAW,aAAa;AAChF,QAAI,WAAW,mBAAmB,SAAS;AACzC,aAAO,OAAO,0BAA0B,WAAW,WAAW,SAAS,WAAW,QAAQ,OAAO,CAAC;AAAA,IACpG;AAEA,QAAI,uBAAuB,YAAY;AACrC,aAAO,OAAO;AAAA,QACZ,UAAU;AAAA,UACR,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,QAAQ,WAAW;AAAA,UACnB,GAAG,oBAAoB,WAAW,QAAQ;AAAA,QAC5C;AAAA,QACA,SAAS,CAAC;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAO,OAAO;AAAA,MACZ,UAAU;AAAA,QACR,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,oBAAoB,WAAW,SAAS,kBAAkB,YAAY;AAAA,QACtE,GAAG,oBAAoB,WAAW,QAAQ;AAAA,MAC5C;AAAA,MACA,SAAS,WAAW,QAAQ,IAAI,CAAC,WAAW;AAC1C,YAAI,CAAC,OAAO,YAAY;AACtB,iBAAO;AAAA,YACL,UAAU;AAAA,cACR,GAAI,aAAa,SAAS,EAAE,UAAU,OAAO,QAAQ,IAAI,EAAE,cAAc,OAAO,YAAY;AAAA,cAC5F,oBAAoB;AAAA,cACpB,QAAQ,OAAO;AAAA,cACf,GACE,aAAa,UACb,OAAO,OAAO,aAAa,YAC3B,OAAO,OAAO,cAAc,YACxB,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,UAAU,IACzD,CAAC;AAAA,YAET;AAAA,UACF;AAAA,QACF;AACA,eAAO,0BAA0B,WAAW,OAAO,SAAS,OAAO,QAAQ,OAAO;AAAA,MACpF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,6BAA6B,GAAG,CAAC;AAAA,EAChD;AACF;",
|
|
6
|
+
"names": ["error"]
|
|
7
|
+
}
|