@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.
Files changed (158) hide show
  1. package/README.md +12 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +179 -6
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +3 -6
  6. package/dist/src/config/__tests__/google-store.test.js +30 -0
  7. package/dist/src/config/__tests__/google-store.test.js.map +7 -0
  8. package/dist/src/config/__tests__/mcp-tool-deadline.test.js +64 -0
  9. package/dist/src/config/__tests__/mcp-tool-deadline.test.js.map +7 -0
  10. package/dist/src/config/google-store.js +18 -0
  11. package/dist/src/config/google-store.js.map +2 -2
  12. package/dist/src/config/mcp-tool-deadline-context.js +34 -0
  13. package/dist/src/config/mcp-tool-deadline-context.js.map +7 -0
  14. package/dist/src/config/mcp-tool-deadline.js +67 -0
  15. package/dist/src/config/mcp-tool-deadline.js.map +7 -0
  16. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +38 -3
  17. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +2 -2
  18. package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js +226 -0
  19. package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js.map +7 -0
  20. package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js +127 -0
  21. package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js.map +7 -0
  22. package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js +103 -0
  23. package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js.map +7 -0
  24. package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js +582 -0
  25. package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js.map +7 -0
  26. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +10 -0
  27. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +2 -2
  28. package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js +36 -0
  29. package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js.map +7 -0
  30. package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js +137 -0
  31. package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js.map +7 -0
  32. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js +105 -0
  33. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js.map +7 -0
  34. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js +143 -0
  35. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js.map +7 -0
  36. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js +100 -0
  37. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js.map +7 -0
  38. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js +350 -0
  39. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js.map +7 -0
  40. package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js +228 -0
  41. package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js.map +7 -0
  42. package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js +58 -0
  43. package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js.map +7 -0
  44. package/dist/src/services/mercadolibre/mercadolibre-api.js +15 -3
  45. package/dist/src/services/mercadolibre/mercadolibre-api.js.map +2 -2
  46. package/dist/src/services/mercadolibre/mercadolibre-billing.js +110 -3
  47. package/dist/src/services/mercadolibre/mercadolibre-billing.js.map +2 -2
  48. package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js +368 -0
  49. package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js.map +7 -0
  50. package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js +399 -0
  51. package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js.map +7 -0
  52. package/dist/src/services/mercadolibre/mercadolibre-kits.js +55 -0
  53. package/dist/src/services/mercadolibre/mercadolibre-kits.js.map +7 -0
  54. package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js +392 -0
  55. package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js.map +7 -0
  56. package/dist/src/services/mercadolibre/mercadolibre-orders.js +8 -8
  57. package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
  58. package/dist/src/services/mercadolibre/mercadolibre-packs.js +21 -0
  59. package/dist/src/services/mercadolibre/mercadolibre-packs.js.map +7 -0
  60. package/dist/src/services/mercadolibre/mercadolibre-payments.js +60 -0
  61. package/dist/src/services/mercadolibre/mercadolibre-payments.js.map +7 -0
  62. package/dist/src/services/mercadolibre/mercadolibre-product-ads.js +429 -0
  63. package/dist/src/services/mercadolibre/mercadolibre-product-ads.js.map +7 -0
  64. package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js +436 -0
  65. package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js.map +7 -0
  66. package/dist/src/services/mercadolibre/mercadolibre-shipping.js +35 -0
  67. package/dist/src/services/mercadolibre/mercadolibre-shipping.js.map +7 -0
  68. package/dist/src/services/vtex/__tests__/vtex-api.test.js +67 -0
  69. package/dist/src/services/vtex/__tests__/vtex-api.test.js.map +7 -0
  70. package/dist/src/services/vtex/vtex-api.js +6 -0
  71. package/dist/src/services/vtex/vtex-api.js.map +2 -2
  72. package/dist/src/tools/config/__tests__/list-profiles.test.js +154 -0
  73. package/dist/src/tools/config/__tests__/list-profiles.test.js.map +7 -0
  74. package/dist/src/tools/config/list-profiles.js +39 -3
  75. package/dist/src/tools/config/list-profiles.js.map +2 -2
  76. package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js +339 -0
  77. package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js.map +7 -0
  78. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js +225 -0
  79. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js.map +7 -0
  80. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js +148 -0
  81. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js.map +7 -0
  82. package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js +60 -0
  83. package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js.map +7 -0
  84. package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js +128 -0
  85. package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js.map +7 -0
  86. package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js +435 -0
  87. package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js.map +7 -0
  88. package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js +31 -0
  89. package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js.map +7 -0
  90. package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js +36 -0
  91. package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js.map +7 -0
  92. package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js +205 -0
  93. package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js.map +7 -0
  94. package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js +313 -0
  95. package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js.map +7 -0
  96. package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js +176 -0
  97. package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js.map +7 -0
  98. package/dist/src/tools/mercadolibre/get-full-storage-charges.js +183 -0
  99. package/dist/src/tools/mercadolibre/get-full-storage-charges.js.map +7 -0
  100. package/dist/src/tools/mercadolibre/get-order-billing-info.js +189 -0
  101. package/dist/src/tools/mercadolibre/get-order-billing-info.js.map +7 -0
  102. package/dist/src/tools/mercadolibre/get-pack-context-by-order.js +150 -0
  103. package/dist/src/tools/mercadolibre/get-pack-context-by-order.js.map +7 -0
  104. package/dist/src/tools/mercadolibre/get-payment-details.js +322 -0
  105. package/dist/src/tools/mercadolibre/get-payment-details.js.map +7 -0
  106. package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js +144 -0
  107. package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js.map +7 -0
  108. package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js +59 -0
  109. package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js.map +7 -0
  110. package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js +104 -0
  111. package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js.map +7 -0
  112. package/dist/src/tools/mercadolibre/index.js +32 -0
  113. package/dist/src/tools/mercadolibre/index.js.map +2 -2
  114. package/dist/src/tools/mercadolibre/product-ads-helpers.js +130 -0
  115. package/dist/src/tools/mercadolibre/product-ads-helpers.js.map +7 -0
  116. package/dist/src/tools/mercadolibre/reconcile-buyer-data.js +27 -0
  117. package/dist/src/tools/mercadolibre/reconcile-buyer-data.js.map +7 -0
  118. package/dist/src/tools/mercadolibre/reconcile-claim-data.js +46 -0
  119. package/dist/src/tools/mercadolibre/reconcile-claim-data.js.map +7 -0
  120. package/dist/src/tools/mercadolibre/reconcile-return-data.js +25 -0
  121. package/dist/src/tools/mercadolibre/reconcile-return-data.js.map +7 -0
  122. package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js +162 -0
  123. package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js.map +7 -0
  124. package/dist/src/tools/mercadolibre/search-product-ads-ads.js +216 -0
  125. package/dist/src/tools/mercadolibre/search-product-ads-ads.js.map +7 -0
  126. package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js +116 -0
  127. package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js.map +7 -0
  128. package/dist/src/tools/mercadolibre/validate-connection.js +40 -12
  129. package/dist/src/tools/mercadolibre/validate-connection.js.map +2 -2
  130. package/dist/tests/meli/mercadolibre-billing-provisions.test.js +378 -0
  131. package/dist/tests/meli/mercadolibre-billing-provisions.test.js.map +2 -2
  132. package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js +123 -0
  133. package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js.map +7 -0
  134. package/dist/tests/meli/mercadolibre-payment-details.test.js +356 -0
  135. package/dist/tests/meli/mercadolibre-payment-details.test.js.map +7 -0
  136. package/dist/tests/meli/mercadolibre-payments.test.js +62 -0
  137. package/dist/tests/meli/mercadolibre-payments.test.js.map +7 -0
  138. package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js +90 -0
  139. package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js.map +7 -0
  140. package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js +72 -0
  141. package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js.map +7 -0
  142. package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js +400 -0
  143. package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js.map +7 -0
  144. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +31 -12
  145. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +2 -2
  146. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +1 -1
  147. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +1 -1
  148. package/package.json +1 -1
  149. package/dist/src/google-ads/report-utils.js +0 -78
  150. package/dist/src/google-ads/report-utils.js.map +0 -7
  151. package/dist/src/search-console/search-console-utils.js +0 -275
  152. package/dist/src/search-console/search-console-utils.js.map +0 -7
  153. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +0 -165
  154. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +0 -7
  155. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +0 -233
  156. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +0 -7
  157. package/dist/src/tools/vtex/catalog-admin-batch.js +0 -298
  158. package/dist/src/tools/vtex/catalog-admin-batch.js.map +0 -7
@@ -0,0 +1,72 @@
1
+ import { describe, expect, it } from "vitest";
2
+ describe("MercadoLibre Product Ads campaigns MCP surface", () => {
3
+ it("registers the actual index tool and rejects invalid calendar dates through MCP tools/call", async () => {
4
+ const previousNodeEnv = process.env.NODE_ENV;
5
+ const previousTelemetry = process.env.MCP_USE_ANONYMIZED_TELEMETRY;
6
+ const previousGoogleOAuthClientId = process.env.GOOGLE_OAUTH_CLIENT_ID;
7
+ const previousGoogleOAuthClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET;
8
+ process.env.NODE_ENV = "test";
9
+ process.env.MCP_USE_ANONYMIZED_TELEMETRY = "false";
10
+ process.env.GOOGLE_OAUTH_CLIENT_ID = "safe-test-google-client-id";
11
+ process.env.GOOGLE_OAUTH_CLIENT_SECRET = "safe-test-google-client-secret";
12
+ try {
13
+ const [{ MCPClient }, { server }] = await Promise.all([
14
+ import("mcp-use"),
15
+ import("../../index.js")
16
+ ]);
17
+ const handler = await server.getHandler();
18
+ const client = new MCPClient({
19
+ mcpServers: {
20
+ local: {
21
+ url: "http://localhost:3000/mcp",
22
+ transport: "http",
23
+ fetch: (input, init) => handler(input instanceof Request ? init === void 0 ? input : new Request(input, init) : new Request(input, init))
24
+ }
25
+ }
26
+ });
27
+ try {
28
+ const session = await client.createSession("local");
29
+ const tools = await session.listTools();
30
+ const tool = tools.find((candidate) => candidate.name === "meli_search_product_ads_campaigns");
31
+ expect(tool).toEqual(
32
+ expect.objectContaining({
33
+ name: "meli_search_product_ads_campaigns",
34
+ inputSchema: expect.objectContaining({
35
+ properties: expect.objectContaining({
36
+ profileId: expect.any(Object),
37
+ siteId: expect.any(Object),
38
+ advertiserId: expect.any(Object),
39
+ dateFrom: expect.any(Object),
40
+ dateTo: expect.any(Object),
41
+ mode: expect.any(Object),
42
+ limit: expect.any(Object),
43
+ offset: expect.any(Object)
44
+ })
45
+ })
46
+ })
47
+ );
48
+ const result = await session.callTool("meli_search_product_ads_campaigns", {
49
+ profileId: "safe-test-profile",
50
+ siteId: "MLA",
51
+ advertiserId: "safe-test-advertiser",
52
+ dateFrom: "2026-02-30",
53
+ dateTo: "2026-03-01"
54
+ });
55
+ expect(result.isError).toBe(true);
56
+ expect(JSON.stringify(result.content)).toContain("valid calendar date");
57
+ } finally {
58
+ await client.closeAllSessions();
59
+ }
60
+ } finally {
61
+ if (previousNodeEnv === void 0) delete process.env.NODE_ENV;
62
+ else process.env.NODE_ENV = previousNodeEnv;
63
+ if (previousTelemetry === void 0) delete process.env.MCP_USE_ANONYMIZED_TELEMETRY;
64
+ else process.env.MCP_USE_ANONYMIZED_TELEMETRY = previousTelemetry;
65
+ if (previousGoogleOAuthClientId === void 0) delete process.env.GOOGLE_OAUTH_CLIENT_ID;
66
+ else process.env.GOOGLE_OAUTH_CLIENT_ID = previousGoogleOAuthClientId;
67
+ if (previousGoogleOAuthClientSecret === void 0) delete process.env.GOOGLE_OAUTH_CLIENT_SECRET;
68
+ else process.env.GOOGLE_OAUTH_CLIENT_SECRET = previousGoogleOAuthClientSecret;
69
+ }
70
+ });
71
+ });
72
+ //# sourceMappingURL=mercadolibre-product-ads-campaigns-surface.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../tests/meli/mercadolibre-product-ads-campaigns-surface.test.ts"],
4
+ "sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\ndescribe(\"MercadoLibre Product Ads campaigns MCP surface\", () => {\n it(\"registers the actual index tool and rejects invalid calendar dates through MCP tools/call\", async () => {\n const previousNodeEnv = process.env.NODE_ENV;\n const previousTelemetry = process.env.MCP_USE_ANONYMIZED_TELEMETRY;\n const previousGoogleOAuthClientId = process.env.GOOGLE_OAUTH_CLIENT_ID;\n const previousGoogleOAuthClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET;\n\n process.env.NODE_ENV = \"test\";\n process.env.MCP_USE_ANONYMIZED_TELEMETRY = \"false\";\n process.env.GOOGLE_OAUTH_CLIENT_ID = \"safe-test-google-client-id\";\n process.env.GOOGLE_OAUTH_CLIENT_SECRET = \"safe-test-google-client-secret\";\n\n try {\n const [{ MCPClient }, { server }] = await Promise.all([\n import(\"mcp-use\"),\n import(\"../../index.js\"),\n ]);\n const handler = await server.getHandler();\n const client = new MCPClient({\n mcpServers: {\n local: {\n url: \"http://localhost:3000/mcp\",\n transport: \"http\",\n fetch: (input: Request | URL | string, init?: RequestInit) =>\n handler(input instanceof Request ? (init === undefined ? input : new Request(input, init)) : new Request(input, init)),\n },\n },\n });\n\n try {\n const session = await client.createSession(\"local\");\n const tools = await session.listTools();\n const tool = tools.find((candidate) => candidate.name === \"meli_search_product_ads_campaigns\");\n\n expect(tool).toEqual(\n expect.objectContaining({\n name: \"meli_search_product_ads_campaigns\",\n inputSchema: expect.objectContaining({\n properties: expect.objectContaining({\n profileId: expect.any(Object),\n siteId: expect.any(Object),\n advertiserId: expect.any(Object),\n dateFrom: expect.any(Object),\n dateTo: expect.any(Object),\n mode: expect.any(Object),\n limit: expect.any(Object),\n offset: expect.any(Object),\n }),\n }),\n })\n );\n\n const result = await session.callTool(\"meli_search_product_ads_campaigns\", {\n profileId: \"safe-test-profile\",\n siteId: \"MLA\",\n advertiserId: \"safe-test-advertiser\",\n dateFrom: \"2026-02-30\",\n dateTo: \"2026-03-01\",\n });\n\n expect(result.isError).toBe(true);\n expect(JSON.stringify(result.content)).toContain(\"valid calendar date\");\n } finally {\n await client.closeAllSessions();\n }\n } finally {\n if (previousNodeEnv === undefined) delete process.env.NODE_ENV;\n else process.env.NODE_ENV = previousNodeEnv;\n\n if (previousTelemetry === undefined) delete process.env.MCP_USE_ANONYMIZED_TELEMETRY;\n else process.env.MCP_USE_ANONYMIZED_TELEMETRY = previousTelemetry;\n\n if (previousGoogleOAuthClientId === undefined) delete process.env.GOOGLE_OAUTH_CLIENT_ID;\n else process.env.GOOGLE_OAUTH_CLIENT_ID = previousGoogleOAuthClientId;\n\n if (previousGoogleOAuthClientSecret === undefined) delete process.env.GOOGLE_OAUTH_CLIENT_SECRET;\n else process.env.GOOGLE_OAUTH_CLIENT_SECRET = previousGoogleOAuthClientSecret;\n }\n });\n});\n"],
5
+ "mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,kDAAkD,MAAM;AAC/D,KAAG,6FAA6F,YAAY;AAC1G,UAAM,kBAAkB,QAAQ,IAAI;AACpC,UAAM,oBAAoB,QAAQ,IAAI;AACtC,UAAM,8BAA8B,QAAQ,IAAI;AAChD,UAAM,kCAAkC,QAAQ,IAAI;AAEpD,YAAQ,IAAI,WAAW;AACvB,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,IAAI,yBAAyB;AACrC,YAAQ,IAAI,6BAA6B;AAEzC,QAAI;AACF,YAAM,CAAC,EAAE,UAAU,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpD,OAAO,SAAS;AAAA,QAChB,OAAO,gBAAgB;AAAA,MACzB,CAAC;AACD,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,IAAI,UAAU;AAAA,QAC3B,YAAY;AAAA,UACV,OAAO;AAAA,YACL,KAAK;AAAA,YACL,WAAW;AAAA,YACX,OAAO,CAAC,OAA+B,SACrC,QAAQ,iBAAiB,UAAW,SAAS,SAAY,QAAQ,IAAI,QAAQ,OAAO,IAAI,IAAK,IAAI,QAAQ,OAAO,IAAI,CAAC;AAAA,UACzH;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,cAAc,OAAO;AAClD,cAAM,QAAQ,MAAM,QAAQ,UAAU;AACtC,cAAM,OAAO,MAAM,KAAK,CAAC,cAAc,UAAU,SAAS,mCAAmC;AAE7F,eAAO,IAAI,EAAE;AAAA,UACX,OAAO,iBAAiB;AAAA,YACtB,MAAM;AAAA,YACN,aAAa,OAAO,iBAAiB;AAAA,cACnC,YAAY,OAAO,iBAAiB;AAAA,gBAClC,WAAW,OAAO,IAAI,MAAM;AAAA,gBAC5B,QAAQ,OAAO,IAAI,MAAM;AAAA,gBACzB,cAAc,OAAO,IAAI,MAAM;AAAA,gBAC/B,UAAU,OAAO,IAAI,MAAM;AAAA,gBAC3B,QAAQ,OAAO,IAAI,MAAM;AAAA,gBACzB,MAAM,OAAO,IAAI,MAAM;AAAA,gBACvB,OAAO,OAAO,IAAI,MAAM;AAAA,gBACxB,QAAQ,OAAO,IAAI,MAAM;AAAA,cAC3B,CAAC;AAAA,YACH,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAEA,cAAM,SAAS,MAAM,QAAQ,SAAS,qCAAqC;AAAA,UACzE,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC;AAED,eAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAChC,eAAO,KAAK,UAAU,OAAO,OAAO,CAAC,EAAE,UAAU,qBAAqB;AAAA,MACxE,UAAE;AACA,cAAM,OAAO,iBAAiB;AAAA,MAChC;AAAA,IACF,UAAE;AACA,UAAI,oBAAoB,OAAW,QAAO,QAAQ,IAAI;AAAA,UACjD,SAAQ,IAAI,WAAW;AAE5B,UAAI,sBAAsB,OAAW,QAAO,QAAQ,IAAI;AAAA,UACnD,SAAQ,IAAI,+BAA+B;AAEhD,UAAI,gCAAgC,OAAW,QAAO,QAAQ,IAAI;AAAA,UAC7D,SAAQ,IAAI,yBAAyB;AAE1C,UAAI,oCAAoC,OAAW,QAAO,QAAQ,IAAI;AAAA,UACjE,SAAQ,IAAI,6BAA6B;AAAA,IAChD;AAAA,EACF,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,400 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { meliGetBundleContextByItemHandler } from "../../src/tools/mercadolibre/get-bundle-context-by-item.js";
3
+ import { meliGetPackContextByOrderHandler } from "../../src/tools/mercadolibre/get-pack-context-by-order.js";
4
+ import {
5
+ meliGetShippingQuoteByDeclaredDimensionsHandler
6
+ } from "../../src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js";
7
+ import { resolveMercadoLibreProfileOrSelection } from "../../src/tools/mercadolibre/profile-resolution.js";
8
+ import {
9
+ getMercadoLibreOrderDetailsBatch
10
+ } from "../../src/services/mercadolibre/mercadolibre-orders.js";
11
+ import { getMercadoLibrePackBatch } from "../../src/services/mercadolibre/mercadolibre-packs.js";
12
+ import {
13
+ getMercadoLibreDeclaredDimensionsShippingQuote
14
+ } from "../../src/services/mercadolibre/mercadolibre-shipping.js";
15
+ import {
16
+ getMercadoLibreUserProductBundlesBatch,
17
+ getMercadoLibreUserProductsBatch,
18
+ resolveMercadoLibreUserProductsFromItems
19
+ } from "../../src/services/mercadolibre/mercadolibre-kits.js";
20
+ import { getMercadoLibreItem } from "../../src/services/mercadolibre/mercadolibre-items.js";
21
+ vi.mock("mcp-use/server", () => ({
22
+ object: vi.fn((payload) => ({ kind: "object", payload })),
23
+ error: vi.fn((message) => ({ kind: "error", message }))
24
+ }));
25
+ vi.mock("../../src/tools/mercadolibre/profile-resolution.js", () => ({
26
+ resolveMercadoLibreProfileOrSelection: vi.fn()
27
+ }));
28
+ vi.mock("../../src/services/mercadolibre/mercadolibre-orders.js", () => ({
29
+ getMercadoLibreOrderDetailsBatch: vi.fn()
30
+ }));
31
+ vi.mock("../../src/services/mercadolibre/mercadolibre-packs.js", () => ({
32
+ getMercadoLibrePackBatch: vi.fn()
33
+ }));
34
+ vi.mock("../../src/services/mercadolibre/mercadolibre-kits.js", () => ({
35
+ resolveMercadoLibreUserProductsFromItems: vi.fn(),
36
+ getMercadoLibreUserProductsBatch: vi.fn(),
37
+ getMercadoLibreUserProductBundlesBatch: vi.fn()
38
+ }));
39
+ vi.mock("../../src/services/mercadolibre/mercadolibre-items.js", () => ({
40
+ getMercadoLibreItem: vi.fn()
41
+ }));
42
+ vi.mock("../../src/services/mercadolibre/mercadolibre-shipping.js", () => ({
43
+ getMercadoLibreDeclaredDimensionsShippingQuote: vi.fn()
44
+ }));
45
+ describe("MercadoLibre pack/kit/shipping handlers", () => {
46
+ beforeEach(() => {
47
+ vi.clearAllMocks();
48
+ vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
49
+ ok: true,
50
+ value: { profileId: "meli-profile-1" }
51
+ });
52
+ });
53
+ it("reconstructs pack context by order and flags multi-order packs", async () => {
54
+ vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({
55
+ successful: [
56
+ {
57
+ id: "ORD-1",
58
+ document: {
59
+ id: "ORD-1",
60
+ pack_id: "PACK-1",
61
+ status: "paid",
62
+ status_detail: null,
63
+ buyer: { id: 111 },
64
+ date_created: "2026-06-01T10:00:00Z",
65
+ last_updated: "2026-06-01T10:01:00Z"
66
+ }
67
+ },
68
+ {
69
+ id: "ORD-2",
70
+ document: {
71
+ id: "ORD-2",
72
+ pack_id: "PACK-1",
73
+ status: "paid",
74
+ status_detail: null,
75
+ buyer: { id: 111 },
76
+ date_created: "2026-06-01T10:00:00Z",
77
+ last_updated: "2026-06-01T10:01:00Z"
78
+ }
79
+ }
80
+ ],
81
+ failed: []
82
+ });
83
+ vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({
84
+ successful: [
85
+ {
86
+ id: "PACK-1",
87
+ document: {
88
+ id: "PACK-1",
89
+ status: "released",
90
+ shipment: { id: 222 },
91
+ buyer: { id: 111 },
92
+ date_created: "2026-06-01T10:00:00Z",
93
+ last_updated: "2026-06-01T10:02:00Z",
94
+ orders: [{ id: "ORD-1" }, { id: "ORD-2" }]
95
+ }
96
+ }
97
+ ],
98
+ failed: []
99
+ });
100
+ const result = await meliGetPackContextByOrderHandler({
101
+ profileId: "meli-profile-1",
102
+ orderIds: ["ORD-1", "ORD-2", "ORD-2"]
103
+ });
104
+ expect(getMercadoLibreOrderDetailsBatch).toHaveBeenCalledWith("meli-profile-1", ["ORD-1", "ORD-2"], {
105
+ maxConcurrency: 10,
106
+ maxRetries: 2
107
+ });
108
+ expect(getMercadoLibrePackBatch).toHaveBeenCalledWith("meli-profile-1", ["PACK-1"], {
109
+ maxConcurrency: 10,
110
+ maxRetries: 2
111
+ });
112
+ expect(result).toEqual({
113
+ kind: "object",
114
+ payload: {
115
+ profile_id: "meli-profile-1",
116
+ metadata: {
117
+ requested: 2,
118
+ successful: 2,
119
+ failed: 0,
120
+ multi_order_packs: 2,
121
+ single_order_packs: 0,
122
+ packless_orders: 0,
123
+ has_failures: false
124
+ },
125
+ pack_contexts_schema: [
126
+ "order_id",
127
+ "requested_pack_id",
128
+ "resolved_pack_id",
129
+ "pack_status",
130
+ "shipment_id",
131
+ "orders_in_pack_count",
132
+ "is_multi_order_pack",
133
+ "buyer_id",
134
+ "pack_created_at",
135
+ "pack_last_updated",
136
+ "order_status",
137
+ "order_status_detail",
138
+ "pack_order_ids"
139
+ ],
140
+ pack_contexts: [
141
+ ["ORD-1", "PACK-1", "PACK-1", "released", "222", 2, true, "111", "2026-06-01T10:00:00Z", "2026-06-01T10:02:00Z", "paid", "", "ORD-1 | ORD-2"],
142
+ ["ORD-2", "PACK-1", "PACK-1", "released", "222", 2, true, "111", "2026-06-01T10:00:00Z", "2026-06-01T10:02:00Z", "paid", "", "ORD-1 | ORD-2"]
143
+ ]
144
+ }
145
+ });
146
+ });
147
+ it("keeps numeric pack ids attached to multi-order packs", async () => {
148
+ vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({
149
+ successful: [
150
+ {
151
+ id: "ORD-10",
152
+ document: {
153
+ id: "ORD-10",
154
+ pack_id: 987654,
155
+ status: "paid",
156
+ status_detail: null,
157
+ buyer: { id: 222 },
158
+ date_created: "2026-06-02T10:00:00Z",
159
+ last_updated: "2026-06-02T10:01:00Z"
160
+ }
161
+ },
162
+ {
163
+ id: "ORD-11",
164
+ document: {
165
+ id: "ORD-11",
166
+ pack_id: 987654,
167
+ status: "paid",
168
+ status_detail: null,
169
+ buyer: { id: 222 },
170
+ date_created: "2026-06-02T10:00:00Z",
171
+ last_updated: "2026-06-02T10:01:00Z"
172
+ }
173
+ }
174
+ ],
175
+ failed: []
176
+ });
177
+ vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({
178
+ successful: [
179
+ {
180
+ id: "987654",
181
+ document: {
182
+ id: "987654",
183
+ status: "packed",
184
+ shipment: { id: 333 },
185
+ buyer: { id: 222 },
186
+ date_created: "2026-06-02T10:00:00Z",
187
+ last_updated: "2026-06-02T10:02:00Z",
188
+ orders: [{ id: "ORD-10" }, { id: "ORD-11" }]
189
+ }
190
+ }
191
+ ],
192
+ failed: []
193
+ });
194
+ const result = await meliGetPackContextByOrderHandler({
195
+ profileId: "meli-profile-1",
196
+ orderIds: ["ORD-10", "ORD-11"]
197
+ });
198
+ expect(getMercadoLibrePackBatch).toHaveBeenCalledWith("meli-profile-1", ["987654"], {
199
+ maxConcurrency: 10,
200
+ maxRetries: 2
201
+ });
202
+ expect(result).toEqual({
203
+ kind: "object",
204
+ payload: {
205
+ profile_id: "meli-profile-1",
206
+ metadata: {
207
+ requested: 2,
208
+ successful: 2,
209
+ failed: 0,
210
+ multi_order_packs: 2,
211
+ single_order_packs: 0,
212
+ packless_orders: 0,
213
+ has_failures: false
214
+ },
215
+ pack_contexts_schema: [
216
+ "order_id",
217
+ "requested_pack_id",
218
+ "resolved_pack_id",
219
+ "pack_status",
220
+ "shipment_id",
221
+ "orders_in_pack_count",
222
+ "is_multi_order_pack",
223
+ "buyer_id",
224
+ "pack_created_at",
225
+ "pack_last_updated",
226
+ "order_status",
227
+ "order_status_detail",
228
+ "pack_order_ids"
229
+ ],
230
+ pack_contexts: [
231
+ ["ORD-10", "987654", "987654", "packed", "333", 2, true, "222", "2026-06-02T10:00:00Z", "2026-06-02T10:02:00Z", "paid", "", "ORD-10 | ORD-11"],
232
+ ["ORD-11", "987654", "987654", "packed", "333", 2, true, "222", "2026-06-02T10:00:00Z", "2026-06-02T10:02:00Z", "paid", "", "ORD-10 | ORD-11"]
233
+ ]
234
+ }
235
+ });
236
+ });
237
+ it("resolves bundle context from items and user products", async () => {
238
+ vi.mocked(resolveMercadoLibreUserProductsFromItems).mockResolvedValue([
239
+ { itemId: "MLA1", userProductId: "MLAU1", title: "Kit" },
240
+ { itemId: "MLA2", userProductId: "MLAU2", title: "Component" }
241
+ ]);
242
+ vi.mocked(getMercadoLibreUserProductsBatch).mockResolvedValue({
243
+ successful: [
244
+ {
245
+ id: "MLAU1",
246
+ document: {
247
+ id: "MLAU1",
248
+ name: "Kit",
249
+ domain_id: "MLA-DOM",
250
+ last_updated: "2026-06-01T10:00:00Z",
251
+ tags: ["bundle"],
252
+ bundle: {
253
+ type: "kit",
254
+ components: [{ type: "user_product", user_product_id: "MLAU2", quantity: 1 }]
255
+ }
256
+ }
257
+ },
258
+ {
259
+ id: "MLAU2",
260
+ document: {
261
+ id: "MLAU2",
262
+ name: "Component",
263
+ domain_id: "MLA-DOM",
264
+ last_updated: "2026-06-01T10:00:00Z",
265
+ tags: ["kit_component"]
266
+ }
267
+ }
268
+ ],
269
+ failed: []
270
+ });
271
+ vi.mocked(getMercadoLibreUserProductBundlesBatch).mockResolvedValue({
272
+ successful: [
273
+ {
274
+ id: "MLAU1",
275
+ document: { user_product_id: "MLAU1", bundles: [] }
276
+ },
277
+ {
278
+ id: "MLAU2",
279
+ document: { user_product_id: "MLAU2", bundles: ["MLAU1"] }
280
+ }
281
+ ],
282
+ failed: []
283
+ });
284
+ const result = await meliGetBundleContextByItemHandler({
285
+ profileId: "meli-profile-1",
286
+ itemIds: ["MLA1", "MLA2"]
287
+ });
288
+ expect(resolveMercadoLibreUserProductsFromItems).toHaveBeenCalledWith("meli-profile-1", ["MLA1", "MLA2"]);
289
+ expect(getMercadoLibreUserProductsBatch).toHaveBeenCalledWith("meli-profile-1", ["MLAU1", "MLAU2"], {
290
+ maxConcurrency: 10,
291
+ maxRetries: 2
292
+ });
293
+ expect(getMercadoLibreUserProductBundlesBatch).toHaveBeenCalledWith("meli-profile-1", ["MLAU1", "MLAU2"], {
294
+ maxConcurrency: 10,
295
+ maxRetries: 2
296
+ });
297
+ expect(result).toEqual({
298
+ kind: "object",
299
+ payload: {
300
+ profile_id: "meli-profile-1",
301
+ metadata: {
302
+ requested_items: 2,
303
+ requested_user_products: 0,
304
+ resolved_user_products: 2,
305
+ kits_found: 1,
306
+ components_found: 1,
307
+ failed: 0,
308
+ has_failures: false
309
+ },
310
+ bundle_contexts_schema: [
311
+ "user_product_id",
312
+ "name",
313
+ "domain_id",
314
+ "input_refs",
315
+ "is_kit",
316
+ "bundle_type",
317
+ "kit_component_count",
318
+ "kit_components",
319
+ "bundle_membership_count",
320
+ "bundle_ids",
321
+ "last_updated"
322
+ ],
323
+ bundle_contexts: [
324
+ ["MLAU1", "Kit", "MLA-DOM", "item:MLA1", true, "kit", 1, "MLAU2 x1", 0, "", "2026-06-01T10:00:00Z"],
325
+ ["MLAU2", "Component", "MLA-DOM", "item:MLA2", false, "", 0, "", 1, "MLAU1", "2026-06-01T10:00:00Z"]
326
+ ]
327
+ }
328
+ });
329
+ });
330
+ it("hydrates shipping quotes from a real item snapshot when itemId is provided", async () => {
331
+ vi.mocked(getMercadoLibreItem).mockResolvedValue({
332
+ id: "MLA1",
333
+ price: 5e3,
334
+ listing_type_id: "gold_special",
335
+ category_id: "MLA123",
336
+ currency_id: "ARS",
337
+ condition: "new",
338
+ shipping: {
339
+ mode: "me2",
340
+ logistic_type: "drop_off",
341
+ free_shipping: true
342
+ }
343
+ });
344
+ vi.mocked(getMercadoLibreDeclaredDimensionsShippingQuote).mockResolvedValue({
345
+ coverage: { all_country: { list_cost: 8106.49, currency_id: "ARS", billable_weight: 462 } },
346
+ custom_message: { display_mode: null, reason: "" }
347
+ });
348
+ const result = await meliGetShippingQuoteByDeclaredDimensionsHandler({
349
+ profileId: "meli-profile-1",
350
+ itemId: "MLA1",
351
+ heightCm: 9,
352
+ widthCm: 17,
353
+ lengthCm: 22,
354
+ weightGrams: 462,
355
+ verbose: true
356
+ });
357
+ expect(getMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", "MLA1");
358
+ expect(getMercadoLibreDeclaredDimensionsShippingQuote).toHaveBeenCalledWith("meli-profile-1", {
359
+ dimensions: "9x17x22,462",
360
+ verbose: true,
361
+ itemId: "MLA1",
362
+ itemPrice: 5e3,
363
+ listingTypeId: "gold_special",
364
+ mode: "me2",
365
+ condition: "new",
366
+ logisticType: "drop_off",
367
+ freeShipping: true,
368
+ currencyId: "ARS",
369
+ categoryId: "MLA123",
370
+ tags: void 0
371
+ });
372
+ expect(result).toEqual({
373
+ kind: "object",
374
+ payload: {
375
+ profile_id: "meli-profile-1",
376
+ metadata: {
377
+ source: "item_hydrated",
378
+ item_id: "MLA1",
379
+ dimensions: "9x17x22,462",
380
+ height_cm: 9,
381
+ width_cm: 17,
382
+ length_cm: 22,
383
+ weight_grams: 462,
384
+ item_price: 5e3,
385
+ listing_type_id: "gold_special",
386
+ mode: "me2",
387
+ logistic_type: "drop_off",
388
+ free_shipping: true,
389
+ currency_id: "ARS",
390
+ condition: "new",
391
+ category_id: "MLA123",
392
+ verbose: true
393
+ },
394
+ coverage: { all_country: { list_cost: 8106.49, currency_id: "ARS", billable_weight: 462 } },
395
+ custom_message: { reason: "" }
396
+ }
397
+ });
398
+ });
399
+ });
400
+ //# sourceMappingURL=mercadolibre-tool-handlers-pack-kit-shipping.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { meliGetBundleContextByItemHandler } from \"../../src/tools/mercadolibre/get-bundle-context-by-item.js\";\nimport { meliGetPackContextByOrderHandler } from \"../../src/tools/mercadolibre/get-pack-context-by-order.js\";\nimport {\n meliGetShippingQuoteByDeclaredDimensionsHandler,\n meliGetShippingQuoteByDeclaredDimensionsSchema,\n} from \"../../src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"../../src/tools/mercadolibre/profile-resolution.js\";\nimport {\n getMercadoLibreOrderDetailsBatch,\n} from \"../../src/services/mercadolibre/mercadolibre-orders.js\";\nimport { getMercadoLibrePackBatch } from \"../../src/services/mercadolibre/mercadolibre-packs.js\";\nimport {\n getMercadoLibreDeclaredDimensionsShippingQuote,\n} from \"../../src/services/mercadolibre/mercadolibre-shipping.js\";\nimport {\n getMercadoLibreUserProductBundlesBatch,\n getMercadoLibreUserProductsBatch,\n resolveMercadoLibreUserProductsFromItems,\n} from \"../../src/services/mercadolibre/mercadolibre-kits.js\";\nimport { getMercadoLibreItem } from \"../../src/services/mercadolibre/mercadolibre-items.js\";\n\nvi.mock(\"mcp-use/server\", () => ({\n object: vi.fn((payload: unknown) => ({ kind: \"object\", payload })),\n error: vi.fn((message: string) => ({ kind: \"error\", message })),\n}));\n\nvi.mock(\"../../src/tools/mercadolibre/profile-resolution.js\", () => ({\n resolveMercadoLibreProfileOrSelection: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-orders.js\", () => ({\n getMercadoLibreOrderDetailsBatch: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-packs.js\", () => ({\n getMercadoLibrePackBatch: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-kits.js\", () => ({\n resolveMercadoLibreUserProductsFromItems: vi.fn(),\n getMercadoLibreUserProductsBatch: vi.fn(),\n getMercadoLibreUserProductBundlesBatch: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-items.js\", () => ({\n getMercadoLibreItem: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-shipping.js\", () => ({\n getMercadoLibreDeclaredDimensionsShippingQuote: vi.fn(),\n}));\n\ndescribe(\"MercadoLibre pack/kit/shipping handlers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n });\n\n it(\"reconstructs pack context by order and flags multi-order packs\", async () => {\n vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({\n successful: [\n {\n id: \"ORD-1\",\n document: {\n id: \"ORD-1\",\n pack_id: \"PACK-1\",\n status: \"paid\",\n status_detail: null,\n buyer: { id: 111 },\n date_created: \"2026-06-01T10:00:00Z\",\n last_updated: \"2026-06-01T10:01:00Z\",\n },\n },\n {\n id: \"ORD-2\",\n document: {\n id: \"ORD-2\",\n pack_id: \"PACK-1\",\n status: \"paid\",\n status_detail: null,\n buyer: { id: 111 },\n date_created: \"2026-06-01T10:00:00Z\",\n last_updated: \"2026-06-01T10:01:00Z\",\n },\n },\n ],\n failed: [],\n } as never);\n vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({\n successful: [\n {\n id: \"PACK-1\",\n document: {\n id: \"PACK-1\",\n status: \"released\",\n shipment: { id: 222 },\n buyer: { id: 111 },\n date_created: \"2026-06-01T10:00:00Z\",\n last_updated: \"2026-06-01T10:02:00Z\",\n orders: [{ id: \"ORD-1\" }, { id: \"ORD-2\" }],\n },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetPackContextByOrderHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"ORD-1\", \"ORD-2\", \"ORD-2\"],\n });\n\n expect(getMercadoLibreOrderDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"ORD-1\", \"ORD-2\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(getMercadoLibrePackBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"PACK-1\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n requested: 2,\n successful: 2,\n failed: 0,\n multi_order_packs: 2,\n single_order_packs: 0,\n packless_orders: 0,\n has_failures: false,\n },\n pack_contexts_schema: [\n \"order_id\",\n \"requested_pack_id\",\n \"resolved_pack_id\",\n \"pack_status\",\n \"shipment_id\",\n \"orders_in_pack_count\",\n \"is_multi_order_pack\",\n \"buyer_id\",\n \"pack_created_at\",\n \"pack_last_updated\",\n \"order_status\",\n \"order_status_detail\",\n \"pack_order_ids\",\n ],\n pack_contexts: [\n [\"ORD-1\", \"PACK-1\", \"PACK-1\", \"released\", \"222\", 2, true, \"111\", \"2026-06-01T10:00:00Z\", \"2026-06-01T10:02:00Z\", \"paid\", \"\", \"ORD-1 | ORD-2\"],\n [\"ORD-2\", \"PACK-1\", \"PACK-1\", \"released\", \"222\", 2, true, \"111\", \"2026-06-01T10:00:00Z\", \"2026-06-01T10:02:00Z\", \"paid\", \"\", \"ORD-1 | ORD-2\"],\n ],\n },\n });\n });\n\n it(\"keeps numeric pack ids attached to multi-order packs\", async () => {\n vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({\n successful: [\n {\n id: \"ORD-10\",\n document: {\n id: \"ORD-10\",\n pack_id: 987654,\n status: \"paid\",\n status_detail: null,\n buyer: { id: 222 },\n date_created: \"2026-06-02T10:00:00Z\",\n last_updated: \"2026-06-02T10:01:00Z\",\n },\n },\n {\n id: \"ORD-11\",\n document: {\n id: \"ORD-11\",\n pack_id: 987654,\n status: \"paid\",\n status_detail: null,\n buyer: { id: 222 },\n date_created: \"2026-06-02T10:00:00Z\",\n last_updated: \"2026-06-02T10:01:00Z\",\n },\n },\n ],\n failed: [],\n } as never);\n vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({\n successful: [\n {\n id: \"987654\",\n document: {\n id: \"987654\",\n status: \"packed\",\n shipment: { id: 333 },\n buyer: { id: 222 },\n date_created: \"2026-06-02T10:00:00Z\",\n last_updated: \"2026-06-02T10:02:00Z\",\n orders: [{ id: \"ORD-10\" }, { id: \"ORD-11\" }],\n },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetPackContextByOrderHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"ORD-10\", \"ORD-11\"],\n });\n\n expect(getMercadoLibrePackBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"987654\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n requested: 2,\n successful: 2,\n failed: 0,\n multi_order_packs: 2,\n single_order_packs: 0,\n packless_orders: 0,\n has_failures: false,\n },\n pack_contexts_schema: [\n \"order_id\",\n \"requested_pack_id\",\n \"resolved_pack_id\",\n \"pack_status\",\n \"shipment_id\",\n \"orders_in_pack_count\",\n \"is_multi_order_pack\",\n \"buyer_id\",\n \"pack_created_at\",\n \"pack_last_updated\",\n \"order_status\",\n \"order_status_detail\",\n \"pack_order_ids\",\n ],\n pack_contexts: [\n [\"ORD-10\", \"987654\", \"987654\", \"packed\", \"333\", 2, true, \"222\", \"2026-06-02T10:00:00Z\", \"2026-06-02T10:02:00Z\", \"paid\", \"\", \"ORD-10 | ORD-11\"],\n [\"ORD-11\", \"987654\", \"987654\", \"packed\", \"333\", 2, true, \"222\", \"2026-06-02T10:00:00Z\", \"2026-06-02T10:02:00Z\", \"paid\", \"\", \"ORD-10 | ORD-11\"],\n ],\n },\n });\n });\n\n it(\"resolves bundle context from items and user products\", async () => {\n vi.mocked(resolveMercadoLibreUserProductsFromItems).mockResolvedValue([\n { itemId: \"MLA1\", userProductId: \"MLAU1\", title: \"Kit\" },\n { itemId: \"MLA2\", userProductId: \"MLAU2\", title: \"Component\" },\n ] as never);\n vi.mocked(getMercadoLibreUserProductsBatch).mockResolvedValue({\n successful: [\n {\n id: \"MLAU1\",\n document: {\n id: \"MLAU1\",\n name: \"Kit\",\n domain_id: \"MLA-DOM\",\n last_updated: \"2026-06-01T10:00:00Z\",\n tags: [\"bundle\"],\n bundle: {\n type: \"kit\",\n components: [{ type: \"user_product\", user_product_id: \"MLAU2\", quantity: 1 }],\n },\n },\n },\n {\n id: \"MLAU2\",\n document: {\n id: \"MLAU2\",\n name: \"Component\",\n domain_id: \"MLA-DOM\",\n last_updated: \"2026-06-01T10:00:00Z\",\n tags: [\"kit_component\"],\n },\n },\n ],\n failed: [],\n } as never);\n vi.mocked(getMercadoLibreUserProductBundlesBatch).mockResolvedValue({\n successful: [\n {\n id: \"MLAU1\",\n document: { user_product_id: \"MLAU1\", bundles: [] },\n },\n {\n id: \"MLAU2\",\n document: { user_product_id: \"MLAU2\", bundles: [\"MLAU1\"] },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetBundleContextByItemHandler({\n profileId: \"meli-profile-1\",\n itemIds: [\"MLA1\", \"MLA2\"],\n });\n\n expect(resolveMercadoLibreUserProductsFromItems).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA1\", \"MLA2\"]);\n expect(getMercadoLibreUserProductsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLAU1\", \"MLAU2\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(getMercadoLibreUserProductBundlesBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLAU1\", \"MLAU2\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n requested_items: 2,\n requested_user_products: 0,\n resolved_user_products: 2,\n kits_found: 1,\n components_found: 1,\n failed: 0,\n has_failures: false,\n },\n bundle_contexts_schema: [\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 ],\n bundle_contexts: [\n [\"MLAU1\", \"Kit\", \"MLA-DOM\", \"item:MLA1\", true, \"kit\", 1, \"MLAU2 x1\", 0, \"\", \"2026-06-01T10:00:00Z\"],\n [\"MLAU2\", \"Component\", \"MLA-DOM\", \"item:MLA2\", false, \"\", 0, \"\", 1, \"MLAU1\", \"2026-06-01T10:00:00Z\"],\n ],\n },\n });\n });\n\n it(\"hydrates shipping quotes from a real item snapshot when itemId is provided\", async () => {\n vi.mocked(getMercadoLibreItem).mockResolvedValue({\n id: \"MLA1\",\n price: 5000,\n listing_type_id: \"gold_special\",\n category_id: \"MLA123\",\n currency_id: \"ARS\",\n condition: \"new\",\n shipping: {\n mode: \"me2\",\n logistic_type: \"drop_off\",\n free_shipping: true,\n },\n } as never);\n vi.mocked(getMercadoLibreDeclaredDimensionsShippingQuote).mockResolvedValue({\n coverage: { all_country: { list_cost: 8106.49, currency_id: \"ARS\", billable_weight: 462 } },\n custom_message: { display_mode: null, reason: \"\" },\n } as never);\n\n const result = await meliGetShippingQuoteByDeclaredDimensionsHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA1\",\n heightCm: 9,\n widthCm: 17,\n lengthCm: 22,\n weightGrams: 462,\n verbose: true,\n });\n\n expect(getMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", \"MLA1\");\n expect(getMercadoLibreDeclaredDimensionsShippingQuote).toHaveBeenCalledWith(\"meli-profile-1\", {\n dimensions: \"9x17x22,462\",\n verbose: true,\n itemId: \"MLA1\",\n itemPrice: 5000,\n listingTypeId: \"gold_special\",\n mode: \"me2\",\n condition: \"new\",\n logisticType: \"drop_off\",\n freeShipping: true,\n currencyId: \"ARS\",\n categoryId: \"MLA123\",\n tags: undefined,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n source: \"item_hydrated\",\n item_id: \"MLA1\",\n dimensions: \"9x17x22,462\",\n height_cm: 9,\n width_cm: 17,\n length_cm: 22,\n weight_grams: 462,\n item_price: 5000,\n listing_type_id: \"gold_special\",\n mode: \"me2\",\n logistic_type: \"drop_off\",\n free_shipping: true,\n currency_id: \"ARS\",\n condition: \"new\",\n category_id: \"MLA123\",\n verbose: true,\n },\n coverage: { all_country: { list_cost: 8106.49, currency_id: \"ARS\", billable_weight: 462 } },\n custom_message: { reason: \"\" },\n },\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -18,10 +18,12 @@ import {
18
18
  } from "../../src/tools/mercadolibre/write-helpers.js";
19
19
  import { getMercadoLibreAccessForProfile } from "../../src/config/mercadolibre.js";
20
20
  import { getMercadoLibreConnectionRow } from "../../src/config/mercadolibre-profile-store.js";
21
+ import { decryptSecret } from "../../src/config/vtex-crypto.js";
21
22
  import {
22
23
  buildMercadoLibrePaginationMetadata,
23
24
  formatMercadoLibreError,
24
25
  getMercadoLibreUsersMe,
26
+ getMercadoLibreUsersMeWithAccessToken,
25
27
  normalizeMercadoLibrePaging
26
28
  } from "../../src/services/mercadolibre/mercadolibre-api.js";
27
29
  import {
@@ -67,8 +69,12 @@ vi.mock("../../src/config/mercadolibre.js", () => ({
67
69
  vi.mock("../../src/config/mercadolibre-profile-store.js", () => ({
68
70
  getMercadoLibreConnectionRow: vi.fn()
69
71
  }));
72
+ vi.mock("../../src/config/vtex-crypto.js", () => ({
73
+ decryptSecret: vi.fn()
74
+ }));
70
75
  vi.mock("../../src/services/mercadolibre/mercadolibre-api.js", () => ({
71
76
  getMercadoLibreUsersMe: vi.fn(),
77
+ getMercadoLibreUsersMeWithAccessToken: vi.fn(),
72
78
  formatMercadoLibreError: vi.fn(
73
79
  (err, fallback) => `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`
74
80
  ),
@@ -142,26 +148,31 @@ describe("MercadoLibre small and medium tool handlers", () => {
142
148
  expect(result).toEqual({ selection_required: true });
143
149
  expect(getMercadoLibreAccessForProfile).not.toHaveBeenCalled();
144
150
  });
145
- it("validates connection and reports refresh detection", async () => {
146
- vi.mocked(getMercadoLibreConnectionRow).mockResolvedValueOnce({
147
- expiresAt: /* @__PURE__ */ new Date("2026-06-01T00:00:00.000Z"),
148
- encryptedAccessToken: "old-token"
149
- }).mockResolvedValueOnce({
150
- status: "active",
151
- expiresAt: /* @__PURE__ */ new Date("2026-07-01T00:00:00.000Z"),
152
- encryptedAccessToken: "new-token"
151
+ it("validates connection with its persisted unexpired token without refresh", async () => {
152
+ vi.mocked(getMercadoLibreConnectionRow).mockResolvedValue({
153
+ sellerId: "seller-99",
154
+ scopes: ["read", "write"],
155
+ expiresAt: /* @__PURE__ */ new Date("2099-07-01T00:00:00.000Z"),
156
+ encryptedAccessToken: "stored-token",
157
+ status: "error"
158
+ });
159
+ vi.mocked(decryptSecret).mockReturnValue("stored-access-token");
160
+ vi.mocked(getMercadoLibreUsersMeWithAccessToken).mockResolvedValue({
161
+ id: 12345,
162
+ nickname: "meli-store"
153
163
  });
154
164
  const result = await meliValidateConnectionHandler({ profileId: "meli-profile-1" });
165
+ expect(getMercadoLibreUsersMeWithAccessToken).toHaveBeenCalledWith("stored-access-token");
155
166
  expect(result).toEqual({
156
167
  kind: "object",
157
168
  payload: {
158
169
  profile_id: "meli-profile-1",
159
- validation_status: "active",
160
- refreshed: true,
170
+ observation_only: true,
171
+ validation_status: "valid",
161
172
  seller_id: "seller-99",
162
173
  account_id: 12345,
163
174
  nickname: "meli-store",
164
- expires_at: "2026-07-01T00:00:00.000Z",
175
+ expires_at: "2099-07-01T00:00:00.000Z",
165
176
  scopes: ["read", "write"]
166
177
  }
167
178
  });
@@ -582,7 +593,15 @@ describe("MercadoLibre small and medium tool handlers", () => {
582
593
  });
583
594
  });
584
595
  it("formats service failures through MercadoLibre error helpers", async () => {
585
- vi.mocked(getMercadoLibreUsersMe).mockRejectedValue(new Error("boom"));
596
+ vi.mocked(getMercadoLibreConnectionRow).mockResolvedValue({
597
+ sellerId: "seller-99",
598
+ scopes: ["read"],
599
+ expiresAt: /* @__PURE__ */ new Date("2099-07-01T00:00:00.000Z"),
600
+ encryptedAccessToken: "stored-token",
601
+ status: "active"
602
+ });
603
+ vi.mocked(decryptSecret).mockReturnValue("stored-access-token");
604
+ vi.mocked(getMercadoLibreUsersMeWithAccessToken).mockRejectedValue(new Error("boom"));
586
605
  const result = await meliValidateConnectionHandler({ profileId: "meli-profile-1" });
587
606
  expect(formatMercadoLibreError).toHaveBeenCalledWith(
588
607
  expect.any(Error),