@yoryoboy/bi-mcp 1.2.0 → 1.3.1

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 (92) hide show
  1. package/README.md +38 -427
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +302 -2
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +2 -2
  6. package/dist/src/services/search-console/search-console-utils.js +275 -0
  7. package/dist/src/services/search-console/search-console-utils.js.map +7 -0
  8. package/dist/src/services/vtex/vtex-catalog-write.js +233 -0
  9. package/dist/src/services/vtex/vtex-catalog-write.js.map +7 -0
  10. package/dist/src/services/vtex/vtex-orders-write.js +152 -0
  11. package/dist/src/services/vtex/vtex-orders-write.js.map +7 -0
  12. package/dist/src/services/vtex/vtex-pricing-write.js +24 -0
  13. package/dist/src/services/vtex/vtex-pricing-write.js.map +7 -0
  14. package/dist/src/services/vtex/vtex-write.js +38 -0
  15. package/dist/src/services/vtex/vtex-write.js.map +7 -0
  16. package/dist/src/tools/search-console/country-breakdown.js +1 -1
  17. package/dist/src/tools/search-console/country-breakdown.js.map +1 -1
  18. package/dist/src/tools/search-console/device-breakdown.js +1 -1
  19. package/dist/src/tools/search-console/device-breakdown.js.map +1 -1
  20. package/dist/src/tools/search-console/high-impression-low-click-queries.js +1 -1
  21. package/dist/src/tools/search-console/high-impression-low-click-queries.js.map +1 -1
  22. package/dist/src/tools/search-console/list-accessible-sites.js +1 -1
  23. package/dist/src/tools/search-console/list-accessible-sites.js.map +1 -1
  24. package/dist/src/tools/search-console/low-ctr-opportunities.js +1 -1
  25. package/dist/src/tools/search-console/low-ctr-opportunities.js.map +1 -1
  26. package/dist/src/tools/search-console/page-performance.js +1 -1
  27. package/dist/src/tools/search-console/page-performance.js.map +1 -1
  28. package/dist/src/tools/search-console/product-demand-low-capture-queries.js +1 -1
  29. package/dist/src/tools/search-console/product-demand-low-capture-queries.js.map +1 -1
  30. package/dist/src/tools/search-console/query-page-matrix.js +1 -1
  31. package/dist/src/tools/search-console/query-page-matrix.js.map +1 -1
  32. package/dist/src/tools/search-console/query-performance.js +1 -1
  33. package/dist/src/tools/search-console/query-performance.js.map +1 -1
  34. package/dist/src/tools/search-console/quick-win-opportunities.js +1 -1
  35. package/dist/src/tools/search-console/quick-win-opportunities.js.map +1 -1
  36. package/dist/src/tools/search-console/rising-non-brand-queries.js +1 -1
  37. package/dist/src/tools/search-console/rising-non-brand-queries.js.map +1 -1
  38. package/dist/src/tools/search-console/search-performance.js +1 -1
  39. package/dist/src/tools/search-console/search-performance.js.map +1 -1
  40. package/dist/src/tools/search-console/site-context.js +1 -1
  41. package/dist/src/tools/search-console/site-context.js.map +1 -1
  42. package/dist/src/tools/search-console/visibility-declines.js +1 -1
  43. package/dist/src/tools/search-console/visibility-declines.js.map +1 -1
  44. package/dist/src/tools/vtex/activate-sku.js +53 -0
  45. package/dist/src/tools/vtex/activate-sku.js.map +7 -0
  46. package/dist/src/tools/vtex/add-order-tracking.js +103 -0
  47. package/dist/src/tools/vtex/add-order-tracking.js.map +7 -0
  48. package/dist/src/tools/vtex/associate-specification.js +60 -0
  49. package/dist/src/tools/vtex/associate-specification.js.map +7 -0
  50. package/dist/src/tools/vtex/attach-catalog-image.js +63 -0
  51. package/dist/src/tools/vtex/attach-catalog-image.js.map +7 -0
  52. package/dist/src/tools/vtex/cancel-order.js +67 -0
  53. package/dist/src/tools/vtex/cancel-order.js.map +7 -0
  54. package/dist/src/tools/vtex/create-brand.js +69 -0
  55. package/dist/src/tools/vtex/create-brand.js.map +7 -0
  56. package/dist/src/tools/vtex/create-category.js +81 -0
  57. package/dist/src/tools/vtex/create-category.js.map +7 -0
  58. package/dist/src/tools/vtex/create-product-with-sku.js +120 -0
  59. package/dist/src/tools/vtex/create-product-with-sku.js.map +7 -0
  60. package/dist/src/tools/vtex/create-product.js +111 -0
  61. package/dist/src/tools/vtex/create-product.js.map +7 -0
  62. package/dist/src/tools/vtex/create-sku.js +103 -0
  63. package/dist/src/tools/vtex/create-sku.js.map +7 -0
  64. package/dist/src/tools/vtex/create-specification-value.js +53 -0
  65. package/dist/src/tools/vtex/create-specification-value.js.map +7 -0
  66. package/dist/src/tools/vtex/create-specification.js +85 -0
  67. package/dist/src/tools/vtex/create-specification.js.map +7 -0
  68. package/dist/src/tools/vtex/deactivate-sku.js +53 -0
  69. package/dist/src/tools/vtex/deactivate-sku.js.map +7 -0
  70. package/dist/src/tools/vtex/delete-fixed-price.js +53 -0
  71. package/dist/src/tools/vtex/delete-fixed-price.js.map +7 -0
  72. package/dist/src/tools/vtex/index.js +20 -0
  73. package/dist/src/tools/vtex/index.js.map +2 -2
  74. package/dist/src/tools/vtex/invoice-order.js +84 -0
  75. package/dist/src/tools/vtex/invoice-order.js.map +7 -0
  76. package/dist/src/tools/vtex/toggle-unlimited-quantity.js +65 -0
  77. package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +7 -0
  78. package/dist/src/tools/vtex/update-inventory.js +34 -19
  79. package/dist/src/tools/vtex/update-inventory.js.map +2 -2
  80. package/dist/src/tools/vtex/update-lead-time.js +34 -17
  81. package/dist/src/tools/vtex/update-lead-time.js.map +2 -2
  82. package/dist/src/tools/vtex/update-product-basic-fields.js +71 -0
  83. package/dist/src/tools/vtex/update-product-basic-fields.js.map +7 -0
  84. package/dist/src/tools/vtex/update-sku-basic-fields.js +92 -0
  85. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +7 -0
  86. package/dist/src/tools/vtex/update-sku-price.js +81 -0
  87. package/dist/src/tools/vtex/update-sku-price.js.map +7 -0
  88. package/dist/src/tools/vtex/upsert-fixed-price.js +69 -0
  89. package/dist/src/tools/vtex/upsert-fixed-price.js.map +7 -0
  90. package/dist/src/tools/vtex/write-helpers.js +73 -0
  91. package/dist/src/tools/vtex/write-helpers.js.map +7 -0
  92. package/package.json +1 -1
@@ -0,0 +1,67 @@
1
+ import { z } from "zod";
2
+ import {
3
+ cancelOrder,
4
+ getOrderStateSnapshot,
5
+ validateOrderForCancellation
6
+ } from "../../services/vtex/vtex-orders-write.js";
7
+ import {
8
+ buildWriteSuccessResponse,
9
+ confirmationNoteSchemaField,
10
+ confirmationSchemaField,
11
+ handleVtexWriteError,
12
+ requireExplicitConfirmation,
13
+ resolveVtexWriteProfile,
14
+ vtexProfileIdSchemaField
15
+ } from "./write-helpers.js";
16
+ const cancelOrderSchema = z.object({
17
+ profileId: vtexProfileIdSchemaField,
18
+ orderId: z.string().min(1).describe("VTEX order identifier to cancel."),
19
+ confirmed: confirmationSchemaField,
20
+ reason: z.string().trim().min(1).describe("Reason for canceling the order. VTEX persists this reason.").optional(),
21
+ confirmationNote: confirmationNoteSchemaField
22
+ });
23
+ async function cancelOrderHandler({
24
+ profileId,
25
+ orderId,
26
+ confirmed,
27
+ reason,
28
+ confirmationNote
29
+ }) {
30
+ const confirmationResponse = requireExplicitConfirmation(confirmed, "cancel_order", {
31
+ order_id: orderId
32
+ });
33
+ if (confirmationResponse) {
34
+ return confirmationResponse;
35
+ }
36
+ try {
37
+ const profileResolution = await resolveVtexWriteProfile(profileId);
38
+ if (!profileResolution.ok) {
39
+ return profileResolution.response;
40
+ }
41
+ const resolvedProfileId = profileResolution.value.profileId;
42
+ const beforeOrder = await validateOrderForCancellation(resolvedProfileId, orderId, reason);
43
+ await cancelOrder(resolvedProfileId, orderId, reason);
44
+ const afterOrder = await getOrderStateSnapshot(resolvedProfileId, orderId, reason);
45
+ return buildWriteSuccessResponse({
46
+ profileId: resolvedProfileId,
47
+ operation: "cancel_order",
48
+ resourceId: orderId,
49
+ riskLevel: "high",
50
+ confirmed: true,
51
+ confirmationNote,
52
+ message: "Order canceled successfully.",
53
+ before: beforeOrder,
54
+ after: afterOrder,
55
+ details: {
56
+ order_id: orderId
57
+ }
58
+ });
59
+ } catch (err) {
60
+ return handleVtexWriteError(err, `Failed to cancel order ${orderId}`);
61
+ }
62
+ }
63
+ export {
64
+ cancelOrderHandler,
65
+ cancelOrderSchema
66
+ };
67
+ //# sourceMappingURL=cancel-order.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/cancel-order.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n cancelOrder,\n getOrderStateSnapshot,\n validateOrderForCancellation,\n} from \"../../services/vtex/vtex-orders-write.js\";\nimport {\n buildWriteSuccessResponse,\n confirmationNoteSchemaField,\n confirmationSchemaField,\n handleVtexWriteError,\n requireExplicitConfirmation,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const cancelOrderSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n orderId: z.string().min(1).describe(\"VTEX order identifier to cancel.\"),\n confirmed: confirmationSchemaField,\n reason: z\n .string()\n .trim()\n .min(1)\n .describe(\"Reason for canceling the order. VTEX persists this reason.\")\n .optional(),\n confirmationNote: confirmationNoteSchemaField,\n});\n\nexport async function cancelOrderHandler({\n profileId,\n orderId,\n confirmed,\n reason,\n confirmationNote,\n}: z.infer<typeof cancelOrderSchema>) {\n const confirmationResponse = requireExplicitConfirmation(confirmed, \"cancel_order\", {\n order_id: orderId,\n });\n if (confirmationResponse) {\n return confirmationResponse;\n }\n\n try {\n const profileResolution = await resolveVtexWriteProfile(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const beforeOrder = await validateOrderForCancellation(resolvedProfileId, orderId, reason);\n await cancelOrder(resolvedProfileId, orderId, reason);\n const afterOrder = await getOrderStateSnapshot(resolvedProfileId, orderId, reason);\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"cancel_order\",\n resourceId: orderId,\n riskLevel: \"high\",\n confirmed: true,\n confirmationNote,\n message: \"Order canceled successfully.\",\n before: beforeOrder as unknown as Record<string, unknown>,\n after: afterOrder as unknown as Record<string, unknown>,\n details: {\n order_id: orderId,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to cancel order ${orderId}`);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,WAAW;AAAA,EACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,kCAAkC;AAAA,EACtE,WAAW;AAAA,EACX,QAAQ,EACL,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,4DAA4D,EACrE,SAAS;AAAA,EACZ,kBAAkB;AACpB,CAAC;AAED,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsC;AACpC,QAAM,uBAAuB,4BAA4B,WAAW,gBAAgB;AAAA,IAClF,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,oBAAoB,MAAM,wBAAwB,SAAS;AACjE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,cAAc,MAAM,6BAA6B,mBAAmB,SAAS,MAAM;AACzF,UAAM,YAAY,mBAAmB,SAAS,MAAM;AACpD,UAAM,aAAa,MAAM,sBAAsB,mBAAmB,SAAS,MAAM;AAEjF,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,0BAA0B,OAAO,EAAE;AAAA,EACtE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,69 @@
1
+ import { z } from "zod";
2
+ import { createBrand } from "../../services/vtex/vtex-catalog-write.js";
3
+ import {
4
+ buildWriteSuccessResponse,
5
+ handleVtexWriteError,
6
+ resolveVtexWriteProfile,
7
+ vtexProfileIdSchemaField
8
+ } from "./write-helpers.js";
9
+ const createBrandSchema = z.object({
10
+ profileId: vtexProfileIdSchemaField,
11
+ id: z.number().int().positive().describe("Brand ID required by VTEX Catalog API."),
12
+ name: z.string().min(1).describe("Brand name."),
13
+ text: z.string().optional().describe("Meta description text."),
14
+ keywords: z.string().optional().describe("Alternative search terms."),
15
+ siteTitle: z.string().optional().describe("Brand page title."),
16
+ active: z.boolean().optional().describe("Whether the brand should be active."),
17
+ menuHome: z.boolean().optional().describe("Whether the brand should appear in the home menu."),
18
+ linkId: z.string().optional().describe("Brand slug."),
19
+ score: z.number().int().optional().describe("Search score.")
20
+ });
21
+ async function createBrandHandler({
22
+ profileId,
23
+ id,
24
+ name,
25
+ text,
26
+ keywords,
27
+ siteTitle,
28
+ active,
29
+ menuHome,
30
+ linkId,
31
+ score
32
+ }) {
33
+ try {
34
+ const profileResolution = await resolveVtexWriteProfile(profileId);
35
+ if (!profileResolution.ok) {
36
+ return profileResolution.response;
37
+ }
38
+ const resolvedProfileId = profileResolution.value.profileId;
39
+ const createdBrand = await createBrand(resolvedProfileId, {
40
+ Id: id,
41
+ Name: name,
42
+ Text: text ?? name,
43
+ Keywords: keywords ?? "",
44
+ SiteTitle: siteTitle ?? name,
45
+ Active: active ?? true,
46
+ MenuHome: menuHome ?? false,
47
+ LinkId: linkId,
48
+ Score: score ?? null,
49
+ AdWordsRemarketingCode: null,
50
+ LomadeeCampaignCode: null
51
+ });
52
+ return buildWriteSuccessResponse({
53
+ profileId: resolvedProfileId,
54
+ operation: "create_brand",
55
+ resourceId: String(createdBrand.Id ?? id),
56
+ riskLevel: "low",
57
+ message: "Brand created successfully.",
58
+ before: null,
59
+ after: createdBrand
60
+ });
61
+ } catch (err) {
62
+ return handleVtexWriteError(err, "Failed to create brand in VTEX");
63
+ }
64
+ }
65
+ export {
66
+ createBrandHandler,
67
+ createBrandSchema
68
+ };
69
+ //# sourceMappingURL=create-brand.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/create-brand.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport { createBrand } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const createBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n id: z.number().int().positive().describe(\"Brand ID required by VTEX Catalog API.\"),\n name: z.string().min(1).describe(\"Brand name.\"),\n text: z.string().optional().describe(\"Meta description text.\"),\n keywords: z.string().optional().describe(\"Alternative search terms.\"),\n siteTitle: z.string().optional().describe(\"Brand page title.\"),\n active: z.boolean().optional().describe(\"Whether the brand should be active.\"),\n menuHome: z.boolean().optional().describe(\"Whether the brand should appear in the home menu.\"),\n linkId: z.string().optional().describe(\"Brand slug.\"),\n score: z.number().int().optional().describe(\"Search score.\"),\n});\n\nexport async function createBrandHandler({\n profileId,\n id,\n name,\n text,\n keywords,\n siteTitle,\n active,\n menuHome,\n linkId,\n score,\n}: z.infer<typeof createBrandSchema>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const createdBrand = await createBrand(resolvedProfileId, {\n Id: id,\n Name: name,\n Text: text ?? name,\n Keywords: keywords ?? \"\",\n SiteTitle: siteTitle ?? name,\n Active: active ?? true,\n MenuHome: menuHome ?? false,\n LinkId: linkId,\n Score: score ?? null,\n AdWordsRemarketingCode: null,\n LomadeeCampaignCode: null,\n });\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"create_brand\",\n resourceId: String(createdBrand.Id ?? id),\n riskLevel: \"low\",\n message: \"Brand created successfully.\",\n before: null,\n after: createdBrand,\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create brand in VTEX\");\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,WAAW;AAAA,EACX,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EACjF,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,aAAa;AAAA,EAC9C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EAC7D,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,EACpE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,EAC7D,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,EAC7E,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mDAAmD;AAAA,EAC7F,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,EACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,eAAe;AAC7D,CAAC;AAED,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsC;AACpC,MAAI;AACF,UAAM,oBAAoB,MAAM,wBAAwB,SAAS;AACjE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,eAAe,MAAM,YAAY,mBAAmB;AAAA,MACxD,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,UAAU,YAAY;AAAA,MACtB,WAAW,aAAa;AAAA,MACxB,QAAQ,UAAU;AAAA,MAClB,UAAU,YAAY;AAAA,MACtB,QAAQ;AAAA,MACR,OAAO,SAAS;AAAA,MAChB,wBAAwB;AAAA,MACxB,qBAAqB;AAAA,IACvB,CAAC;AAED,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY,OAAO,aAAa,MAAM,EAAE;AAAA,MACxC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,gCAAgC;AAAA,EACnE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ import { createCategory } from "../../services/vtex/vtex-catalog-write.js";
3
+ import {
4
+ buildWriteSuccessResponse,
5
+ handleVtexWriteError,
6
+ resolveVtexWriteProfile,
7
+ vtexProfileIdSchemaField
8
+ } from "./write-helpers.js";
9
+ const createCategorySchema = z.object({
10
+ profileId: vtexProfileIdSchemaField,
11
+ id: z.number().int().positive().optional().describe("Optional category ID. VTEX can generate it."),
12
+ name: z.string().min(1).describe("Category name."),
13
+ title: z.string().min(1).describe("Category page title."),
14
+ description: z.string().min(1).describe("Category meta description."),
15
+ fatherCategoryId: z.number().int().positive().nullable().optional().describe("Parent category ID. Use null for a top-level category."),
16
+ globalCategoryId: z.number().int().nonnegative().describe("Google global category ID."),
17
+ stockKeepingUnitSelectionMode: z.enum(["SPECIFICATION", "LIST"]).describe("How shoppers should choose SKUs in storefront."),
18
+ keywords: z.string().optional().describe("Alternative search terms."),
19
+ showInStoreFront: z.boolean().optional().describe("Whether the category should appear in menus."),
20
+ isActive: z.boolean().optional().describe("Whether the category should be active."),
21
+ activeStoreFrontLink: z.boolean().optional().describe("Whether the category link should be active in storefront."),
22
+ showBrandFilter: z.boolean().optional().describe("Whether the category page should show brand filters."),
23
+ score: z.number().int().nullable().optional().describe("Search score.")
24
+ });
25
+ async function createCategoryHandler({
26
+ profileId,
27
+ id,
28
+ name,
29
+ title,
30
+ description,
31
+ fatherCategoryId,
32
+ globalCategoryId,
33
+ stockKeepingUnitSelectionMode,
34
+ keywords,
35
+ showInStoreFront,
36
+ isActive,
37
+ activeStoreFrontLink,
38
+ showBrandFilter,
39
+ score
40
+ }) {
41
+ try {
42
+ const profileResolution = await resolveVtexWriteProfile(profileId);
43
+ if (!profileResolution.ok) {
44
+ return profileResolution.response;
45
+ }
46
+ const resolvedProfileId = profileResolution.value.profileId;
47
+ const createdCategory = await createCategory(resolvedProfileId, {
48
+ Id: id,
49
+ Name: name,
50
+ Keywords: keywords ?? "",
51
+ Title: title,
52
+ Description: description,
53
+ AdWordsRemarketingCode: null,
54
+ LomadeeCampaignCode: null,
55
+ FatherCategoryId: fatherCategoryId ?? null,
56
+ GlobalCategoryId: globalCategoryId,
57
+ ShowInStoreFront: showInStoreFront ?? true,
58
+ IsActive: isActive ?? true,
59
+ ActiveStoreFrontLink: activeStoreFrontLink ?? true,
60
+ ShowBrandFilter: showBrandFilter ?? true,
61
+ Score: score ?? null,
62
+ StockKeepingUnitSelectionMode: stockKeepingUnitSelectionMode
63
+ });
64
+ return buildWriteSuccessResponse({
65
+ profileId: resolvedProfileId,
66
+ operation: "create_category",
67
+ resourceId: String(createdCategory.Id ?? id ?? ""),
68
+ riskLevel: "low",
69
+ message: "Category created successfully.",
70
+ before: null,
71
+ after: createdCategory
72
+ });
73
+ } catch (err) {
74
+ return handleVtexWriteError(err, "Failed to create category in VTEX");
75
+ }
76
+ }
77
+ export {
78
+ createCategoryHandler,
79
+ createCategorySchema
80
+ };
81
+ //# sourceMappingURL=create-category.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/create-category.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport { createCategory } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const createCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n id: z.number().int().positive().optional().describe(\"Optional category ID. VTEX can generate it.\"),\n name: z.string().min(1).describe(\"Category name.\"),\n title: z.string().min(1).describe(\"Category page title.\"),\n description: z.string().min(1).describe(\"Category meta description.\"),\n fatherCategoryId: z\n .number()\n .int()\n .positive()\n .nullable()\n .optional()\n .describe(\"Parent category ID. Use null for a top-level category.\"),\n globalCategoryId: z.number().int().nonnegative().describe(\"Google global category ID.\"),\n stockKeepingUnitSelectionMode: z\n .enum([\"SPECIFICATION\", \"LIST\"])\n .describe(\"How shoppers should choose SKUs in storefront.\"),\n keywords: z.string().optional().describe(\"Alternative search terms.\"),\n showInStoreFront: z.boolean().optional().describe(\"Whether the category should appear in menus.\"),\n isActive: z.boolean().optional().describe(\"Whether the category should be active.\"),\n activeStoreFrontLink: z\n .boolean()\n .optional()\n .describe(\"Whether the category link should be active in storefront.\"),\n showBrandFilter: z.boolean().optional().describe(\"Whether the category page should show brand filters.\"),\n score: z.number().int().nullable().optional().describe(\"Search score.\"),\n});\n\nexport async function createCategoryHandler({\n profileId,\n id,\n name,\n title,\n description,\n fatherCategoryId,\n globalCategoryId,\n stockKeepingUnitSelectionMode,\n keywords,\n showInStoreFront,\n isActive,\n activeStoreFrontLink,\n showBrandFilter,\n score,\n}: z.infer<typeof createCategorySchema>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const createdCategory = await createCategory(resolvedProfileId, {\n Id: id,\n Name: name,\n Keywords: keywords ?? \"\",\n Title: title,\n Description: description,\n AdWordsRemarketingCode: null,\n LomadeeCampaignCode: null,\n FatherCategoryId: fatherCategoryId ?? null,\n GlobalCategoryId: globalCategoryId,\n ShowInStoreFront: showInStoreFront ?? true,\n IsActive: isActive ?? true,\n ActiveStoreFrontLink: activeStoreFrontLink ?? true,\n ShowBrandFilter: showBrandFilter ?? true,\n Score: score ?? null,\n StockKeepingUnitSelectionMode: stockKeepingUnitSelectionMode,\n });\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"create_category\",\n resourceId: String(createdCategory.Id ?? id ?? \"\"),\n riskLevel: \"low\",\n message: \"Category created successfully.\",\n before: null,\n after: createdCategory,\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create category in VTEX\");\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,sBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW;AAAA,EACX,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,EACjG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,gBAAgB;AAAA,EACjD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,sBAAsB;AAAA,EACxD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,4BAA4B;AAAA,EACpE,kBAAkB,EACf,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,wDAAwD;AAAA,EACpE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,4BAA4B;AAAA,EACtF,+BAA+B,EAC5B,KAAK,CAAC,iBAAiB,MAAM,CAAC,EAC9B,SAAS,gDAAgD;AAAA,EAC5D,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,EACpE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EAChG,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EAClF,sBAAsB,EACnB,QAAQ,EACR,SAAS,EACT,SAAS,2DAA2D;AAAA,EACvE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,sDAAsD;AAAA,EACvG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,eAAe;AACxE,CAAC;AAED,eAAsB,sBAAsB;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,MAAI;AACF,UAAM,oBAAoB,MAAM,wBAAwB,SAAS;AACjE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,kBAAkB,MAAM,eAAe,mBAAmB;AAAA,MAC9D,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,YAAY;AAAA,MACtB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,wBAAwB;AAAA,MACxB,qBAAqB;AAAA,MACrB,kBAAkB,oBAAoB;AAAA,MACtC,kBAAkB;AAAA,MAClB,kBAAkB,oBAAoB;AAAA,MACtC,UAAU,YAAY;AAAA,MACtB,sBAAsB,wBAAwB;AAAA,MAC9C,iBAAiB,mBAAmB;AAAA,MACpC,OAAO,SAAS;AAAA,MAChB,+BAA+B;AAAA,IACjC,CAAC;AAED,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY,OAAO,gBAAgB,MAAM,MAAM,EAAE;AAAA,MACjD,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,mCAAmC;AAAA,EACtE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+ import { createProduct, createSku, createSkuEan } from "../../services/vtex/vtex-catalog-write.js";
3
+ import {
4
+ buildWriteSuccessResponse,
5
+ handleVtexWriteError,
6
+ resolveVtexWriteProfile,
7
+ vtexProfileIdSchemaField
8
+ } from "./write-helpers.js";
9
+ const productInputSchema = z.object({
10
+ name: z.string().min(1).describe("Product name."),
11
+ categoryId: z.number().int().positive().optional().describe("Existing category ID."),
12
+ categoryPath: z.string().min(1).optional().describe("Category path to create or reuse."),
13
+ brandId: z.number().int().positive().optional().describe("Existing brand ID."),
14
+ brandName: z.string().min(1).optional().describe("Brand name to create or reuse."),
15
+ departmentId: z.number().int().positive().optional().describe("Department ID."),
16
+ refId: z.string().optional().describe("Product reference code."),
17
+ title: z.string().optional().describe("SEO title."),
18
+ description: z.string().optional().describe("Product description."),
19
+ descriptionShort: z.string().optional().describe("Short description."),
20
+ linkId: z.string().optional().describe("Product slug.")
21
+ }).refine((value) => value.categoryId !== void 0 || value.categoryPath !== void 0, {
22
+ message: "Provide either categoryId or categoryPath for the product.",
23
+ path: ["categoryId"]
24
+ }).refine((value) => value.brandId !== void 0 || value.brandName !== void 0, {
25
+ message: "Provide either brandId or brandName for the product.",
26
+ path: ["brandId"]
27
+ });
28
+ const skuInputSchema = z.object({
29
+ name: z.string().min(1).describe("SKU name."),
30
+ refId: z.string().min(1).describe("Internal SKU reference code."),
31
+ ean: z.string().optional().describe("Optional EAN to attach after creation."),
32
+ packagedHeight: z.number().nonnegative().describe("Packaged height."),
33
+ packagedLength: z.number().nonnegative().describe("Packaged length."),
34
+ packagedWidth: z.number().nonnegative().describe("Packaged width."),
35
+ packagedWeightKg: z.number().nonnegative().describe("Packaged weight in kg."),
36
+ height: z.number().nonnegative().optional().describe("Physical height."),
37
+ length: z.number().nonnegative().optional().describe("Physical length."),
38
+ width: z.number().nonnegative().optional().describe("Physical width."),
39
+ weightKg: z.number().nonnegative().optional().describe("Physical weight in kg."),
40
+ activateIfPossible: z.boolean().optional().describe("Whether VTEX should auto-activate the SKU."),
41
+ measurementUnit: z.string().optional().describe("Measurement unit."),
42
+ unitMultiplier: z.number().positive().optional().describe("Unit multiplier.")
43
+ });
44
+ const createProductWithSkuSchema = z.object({
45
+ profileId: vtexProfileIdSchemaField,
46
+ product: productInputSchema.describe("Product payload."),
47
+ sku: skuInputSchema.describe("SKU payload.")
48
+ });
49
+ async function createProductWithSkuHandler({
50
+ profileId,
51
+ product,
52
+ sku
53
+ }) {
54
+ try {
55
+ const profileResolution = await resolveVtexWriteProfile(profileId);
56
+ if (!profileResolution.ok) {
57
+ return profileResolution.response;
58
+ }
59
+ const resolvedProfileId = profileResolution.value.profileId;
60
+ const createdProduct = await createProduct(resolvedProfileId, {
61
+ Name: product.name,
62
+ CategoryId: product.categoryId,
63
+ CategoryPath: product.categoryPath,
64
+ BrandId: product.brandId,
65
+ BrandName: product.brandName,
66
+ DepartmentId: product.departmentId,
67
+ RefId: product.refId,
68
+ Title: product.title,
69
+ Description: product.description,
70
+ DescriptionShort: product.descriptionShort,
71
+ LinkId: product.linkId
72
+ });
73
+ const productId = Number(createdProduct.Id);
74
+ const createdSku = await createSku(resolvedProfileId, {
75
+ ProductId: productId,
76
+ Name: sku.name,
77
+ RefId: sku.refId,
78
+ PackagedHeight: sku.packagedHeight,
79
+ PackagedLength: sku.packagedLength,
80
+ PackagedWidth: sku.packagedWidth,
81
+ PackagedWeightKg: sku.packagedWeightKg,
82
+ Height: sku.height,
83
+ Length: sku.length,
84
+ Width: sku.width,
85
+ WeightKg: sku.weightKg,
86
+ ActivateIfPossible: sku.activateIfPossible ?? true,
87
+ IsActive: false,
88
+ MeasurementUnit: sku.measurementUnit,
89
+ UnitMultiplier: sku.unitMultiplier
90
+ });
91
+ const skuId = createdSku.Id == null ? void 0 : String(createdSku.Id);
92
+ if (skuId && sku.ean?.trim()) {
93
+ await createSkuEan(resolvedProfileId, skuId, sku.ean.trim());
94
+ createdSku.Eans = [sku.ean.trim()];
95
+ }
96
+ return buildWriteSuccessResponse({
97
+ profileId: resolvedProfileId,
98
+ operation: "create_product_with_sku",
99
+ resourceId: String(createdProduct.Id),
100
+ riskLevel: "low",
101
+ message: "Product and SKU created successfully.",
102
+ before: null,
103
+ after: {
104
+ product: createdProduct,
105
+ sku: createdSku
106
+ },
107
+ details: {
108
+ product_id: createdProduct.Id,
109
+ sku_id: createdSku.Id
110
+ }
111
+ });
112
+ } catch (err) {
113
+ return handleVtexWriteError(err, "Failed to create product with SKU in VTEX");
114
+ }
115
+ }
116
+ export {
117
+ createProductWithSkuHandler,
118
+ createProductWithSkuSchema
119
+ };
120
+ //# sourceMappingURL=create-product-with-sku.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/create-product-with-sku.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport { createProduct, createSku, createSkuEan } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nconst productInputSchema = z\n .object({\n name: z.string().min(1).describe(\"Product name.\"),\n categoryId: z.number().int().positive().optional().describe(\"Existing category ID.\"),\n categoryPath: z.string().min(1).optional().describe(\"Category path to create or reuse.\"),\n brandId: z.number().int().positive().optional().describe(\"Existing brand ID.\"),\n brandName: z.string().min(1).optional().describe(\"Brand name to create or reuse.\"),\n departmentId: z.number().int().positive().optional().describe(\"Department ID.\"),\n refId: z.string().optional().describe(\"Product reference code.\"),\n title: z.string().optional().describe(\"SEO title.\"),\n description: z.string().optional().describe(\"Product description.\"),\n descriptionShort: z.string().optional().describe(\"Short description.\"),\n linkId: z.string().optional().describe(\"Product slug.\"),\n })\n .refine((value) => value.categoryId !== undefined || value.categoryPath !== undefined, {\n message: \"Provide either categoryId or categoryPath for the product.\",\n path: [\"categoryId\"],\n })\n .refine((value) => value.brandId !== undefined || value.brandName !== undefined, {\n message: \"Provide either brandId or brandName for the product.\",\n path: [\"brandId\"],\n });\n\nconst skuInputSchema = z.object({\n name: z.string().min(1).describe(\"SKU name.\"),\n refId: z.string().min(1).describe(\"Internal SKU reference code.\"),\n ean: z.string().optional().describe(\"Optional EAN to attach after creation.\"),\n packagedHeight: z.number().nonnegative().describe(\"Packaged height.\"),\n packagedLength: z.number().nonnegative().describe(\"Packaged length.\"),\n packagedWidth: z.number().nonnegative().describe(\"Packaged width.\"),\n packagedWeightKg: z.number().nonnegative().describe(\"Packaged weight in kg.\"),\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\n activateIfPossible: z.boolean().optional().describe(\"Whether VTEX should auto-activate the SKU.\"),\n measurementUnit: z.string().optional().describe(\"Measurement unit.\"),\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\n});\n\nexport const createProductWithSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n product: productInputSchema.describe(\"Product payload.\"),\n sku: skuInputSchema.describe(\"SKU payload.\"),\n});\n\nexport async function createProductWithSkuHandler({\n profileId,\n product,\n sku,\n}: z.infer<typeof createProductWithSkuSchema>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const createdProduct = await createProduct(resolvedProfileId, {\n Name: product.name,\n CategoryId: product.categoryId,\n CategoryPath: product.categoryPath,\n BrandId: product.brandId,\n BrandName: product.brandName,\n DepartmentId: product.departmentId,\n RefId: product.refId,\n Title: product.title,\n Description: product.description,\n DescriptionShort: product.descriptionShort,\n LinkId: product.linkId,\n });\n\n const productId = Number(createdProduct.Id);\n const createdSku = await createSku(resolvedProfileId, {\n ProductId: productId,\n Name: sku.name,\n RefId: sku.refId,\n PackagedHeight: sku.packagedHeight,\n PackagedLength: sku.packagedLength,\n PackagedWidth: sku.packagedWidth,\n PackagedWeightKg: sku.packagedWeightKg,\n Height: sku.height,\n Length: sku.length,\n Width: sku.width,\n WeightKg: sku.weightKg,\n ActivateIfPossible: sku.activateIfPossible ?? true,\n IsActive: false,\n MeasurementUnit: sku.measurementUnit,\n UnitMultiplier: sku.unitMultiplier,\n });\n\n const skuId = createdSku.Id == null ? undefined : String(createdSku.Id);\n if (skuId && sku.ean?.trim()) {\n await createSkuEan(resolvedProfileId, skuId, sku.ean.trim());\n createdSku.Eans = [sku.ean.trim()];\n }\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"create_product_with_sku\",\n resourceId: String(createdProduct.Id),\n riskLevel: \"low\",\n message: \"Product and SKU created successfully.\",\n before: null,\n after: {\n product: createdProduct,\n sku: createdSku,\n },\n details: {\n product_id: createdProduct.Id,\n sku_id: createdSku.Id,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create product with SKU in VTEX\");\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,111 @@
1
+ import { z } from "zod";
2
+ import { createProduct } from "../../services/vtex/vtex-catalog-write.js";
3
+ import {
4
+ buildWriteSuccessResponse,
5
+ handleVtexWriteError,
6
+ resolveVtexWriteProfile,
7
+ vtexProfileIdSchemaField
8
+ } from "./write-helpers.js";
9
+ const createProductSchema = z.object({
10
+ profileId: vtexProfileIdSchemaField,
11
+ name: z.string().min(1).describe("Product name."),
12
+ categoryId: z.number().int().positive().optional().describe("Existing VTEX category ID."),
13
+ categoryPath: z.string().min(1).optional().describe("Category path to create or reuse, for example `Mens/Clothing/T-Shirts`."),
14
+ brandId: z.number().int().positive().optional().describe("Existing VTEX brand ID."),
15
+ brandName: z.string().min(1).optional().describe("Brand name to create or reuse when `brandId` is not provided."),
16
+ departmentId: z.number().int().positive().optional().describe("Department ID for the category."),
17
+ refId: z.string().optional().describe("Internal product reference code."),
18
+ title: z.string().optional().describe("SEO title."),
19
+ description: z.string().optional().describe("Product description."),
20
+ descriptionShort: z.string().optional().describe("Short product description."),
21
+ linkId: z.string().optional().describe("Product slug."),
22
+ releaseDate: z.string().optional().describe("Product release date in ISO format."),
23
+ keyWords: z.string().optional().describe("Keywords string."),
24
+ isVisible: z.boolean().optional().describe("Whether the product should be visible in listings."),
25
+ isActive: z.boolean().optional().describe("Whether the product should be active."),
26
+ taxCode: z.string().optional().describe("Tax code."),
27
+ metaTagDescription: z.string().optional().describe("Meta description."),
28
+ supplierId: z.number().int().positive().optional().describe("Supplier identifier."),
29
+ showWithoutStock: z.boolean().optional().describe("Whether the product stays visible without stock."),
30
+ score: z.number().int().optional().describe("Search score.")
31
+ }).refine((value) => value.categoryId !== void 0 || value.categoryPath !== void 0, {
32
+ message: "Provide either categoryId or categoryPath.",
33
+ path: ["categoryId"]
34
+ }).refine((value) => value.brandId !== void 0 || value.brandName !== void 0, {
35
+ message: "Provide either brandId or brandName.",
36
+ path: ["brandId"]
37
+ });
38
+ async function createProductHandler({
39
+ profileId,
40
+ name,
41
+ categoryId,
42
+ categoryPath,
43
+ brandId,
44
+ brandName,
45
+ departmentId,
46
+ refId,
47
+ title,
48
+ description,
49
+ descriptionShort,
50
+ linkId,
51
+ releaseDate,
52
+ keyWords,
53
+ isVisible,
54
+ isActive,
55
+ taxCode,
56
+ metaTagDescription,
57
+ supplierId,
58
+ showWithoutStock,
59
+ score
60
+ }) {
61
+ try {
62
+ const profileResolution = await resolveVtexWriteProfile(profileId);
63
+ if (!profileResolution.ok) {
64
+ return profileResolution.response;
65
+ }
66
+ const resolvedProfileId = profileResolution.value.profileId;
67
+ const payload = {
68
+ Name: name
69
+ };
70
+ if (categoryId !== void 0) payload.CategoryId = categoryId;
71
+ if (categoryPath !== void 0) payload.CategoryPath = categoryPath;
72
+ if (brandId !== void 0) payload.BrandId = brandId;
73
+ if (brandName !== void 0) payload.BrandName = brandName;
74
+ if (departmentId !== void 0) payload.DepartmentId = departmentId;
75
+ if (refId !== void 0) payload.RefId = refId;
76
+ if (title !== void 0) payload.Title = title;
77
+ if (description !== void 0) payload.Description = description;
78
+ if (descriptionShort !== void 0) payload.DescriptionShort = descriptionShort;
79
+ if (linkId !== void 0) payload.LinkId = linkId;
80
+ if (releaseDate !== void 0) payload.ReleaseDate = releaseDate;
81
+ if (keyWords !== void 0) payload.KeyWords = keyWords;
82
+ if (isVisible !== void 0) payload.IsVisible = isVisible;
83
+ if (isActive !== void 0) payload.IsActive = isActive;
84
+ if (taxCode !== void 0) payload.TaxCode = taxCode;
85
+ if (metaTagDescription !== void 0) payload.MetaTagDescription = metaTagDescription;
86
+ if (supplierId !== void 0) payload.SupplierId = supplierId;
87
+ if (showWithoutStock !== void 0) payload.ShowWithoutStock = showWithoutStock;
88
+ if (score !== void 0) payload.Score = score;
89
+ const createdProduct = await createProduct(resolvedProfileId, payload);
90
+ const resourceId = createdProduct.Id == null ? void 0 : String(createdProduct.Id);
91
+ return buildWriteSuccessResponse({
92
+ profileId: resolvedProfileId,
93
+ operation: "create_product",
94
+ resourceId,
95
+ riskLevel: "low",
96
+ message: "Product created successfully.",
97
+ before: null,
98
+ after: createdProduct,
99
+ details: {
100
+ product_id: resourceId
101
+ }
102
+ });
103
+ } catch (err) {
104
+ return handleVtexWriteError(err, "Failed to create product in VTEX");
105
+ }
106
+ }
107
+ export {
108
+ createProductHandler,
109
+ createProductSchema
110
+ };
111
+ //# sourceMappingURL=create-product.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/create-product.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport { createProduct } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const createProductSchema = z\n .object({\n profileId: vtexProfileIdSchemaField,\n name: z.string().min(1).describe(\"Product name.\"),\n categoryId: z.number().int().positive().optional().describe(\"Existing VTEX category ID.\"),\n categoryPath: z\n .string()\n .min(1)\n .optional()\n .describe(\"Category path to create or reuse, for example `Mens/Clothing/T-Shirts`.\"),\n brandId: z.number().int().positive().optional().describe(\"Existing VTEX brand ID.\"),\n brandName: z\n .string()\n .min(1)\n .optional()\n .describe(\"Brand name to create or reuse when `brandId` is not provided.\"),\n departmentId: z.number().int().positive().optional().describe(\"Department ID for the category.\"),\n refId: z.string().optional().describe(\"Internal product reference code.\"),\n title: z.string().optional().describe(\"SEO title.\"),\n description: z.string().optional().describe(\"Product description.\"),\n descriptionShort: z.string().optional().describe(\"Short product description.\"),\n linkId: z.string().optional().describe(\"Product slug.\"),\n releaseDate: z.string().optional().describe(\"Product release date in ISO format.\"),\n keyWords: z.string().optional().describe(\"Keywords string.\"),\n isVisible: z.boolean().optional().describe(\"Whether the product should be visible in listings.\"),\n isActive: z.boolean().optional().describe(\"Whether the product should be active.\"),\n taxCode: z.string().optional().describe(\"Tax code.\"),\n metaTagDescription: z.string().optional().describe(\"Meta description.\"),\n supplierId: z.number().int().positive().optional().describe(\"Supplier identifier.\"),\n showWithoutStock: z.boolean().optional().describe(\"Whether the product stays visible without stock.\"),\n score: z.number().int().optional().describe(\"Search score.\"),\n })\n .refine((value) => value.categoryId !== undefined || value.categoryPath !== undefined, {\n message: \"Provide either categoryId or categoryPath.\",\n path: [\"categoryId\"],\n })\n .refine((value) => value.brandId !== undefined || value.brandName !== undefined, {\n message: \"Provide either brandId or brandName.\",\n path: [\"brandId\"],\n });\n\nexport async function createProductHandler({\n profileId,\n name,\n categoryId,\n categoryPath,\n brandId,\n brandName,\n departmentId,\n refId,\n title,\n description,\n descriptionShort,\n linkId,\n releaseDate,\n keyWords,\n isVisible,\n isActive,\n taxCode,\n metaTagDescription,\n supplierId,\n showWithoutStock,\n score,\n}: z.infer<typeof createProductSchema>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const payload: Record<string, unknown> = {\n Name: name,\n };\n\n if (categoryId !== undefined) payload.CategoryId = categoryId;\n if (categoryPath !== undefined) payload.CategoryPath = categoryPath;\n if (brandId !== undefined) payload.BrandId = brandId;\n if (brandName !== undefined) payload.BrandName = brandName;\n if (departmentId !== undefined) payload.DepartmentId = departmentId;\n if (refId !== undefined) payload.RefId = refId;\n if (title !== undefined) payload.Title = title;\n if (description !== undefined) payload.Description = description;\n if (descriptionShort !== undefined) payload.DescriptionShort = descriptionShort;\n if (linkId !== undefined) payload.LinkId = linkId;\n if (releaseDate !== undefined) payload.ReleaseDate = releaseDate;\n if (keyWords !== undefined) payload.KeyWords = keyWords;\n if (isVisible !== undefined) payload.IsVisible = isVisible;\n if (isActive !== undefined) payload.IsActive = isActive;\n if (taxCode !== undefined) payload.TaxCode = taxCode;\n if (metaTagDescription !== undefined) payload.MetaTagDescription = metaTagDescription;\n if (supplierId !== undefined) payload.SupplierId = supplierId;\n if (showWithoutStock !== undefined) payload.ShowWithoutStock = showWithoutStock;\n if (score !== undefined) payload.Score = score;\n\n const createdProduct = await createProduct(resolvedProfileId, payload);\n const resourceId = createdProduct.Id == null ? undefined : String(createdProduct.Id);\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"create_product\",\n resourceId,\n riskLevel: \"low\",\n message: \"Product created successfully.\",\n before: null,\n after: createdProduct,\n details: {\n product_id: resourceId,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create product in VTEX\");\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { createSku, createSkuEan } from "../../services/vtex/vtex-catalog-write.js";
3
+ import {
4
+ buildWriteSuccessResponse,
5
+ handleVtexWriteError,
6
+ resolveVtexWriteProfile,
7
+ vtexProfileIdSchemaField
8
+ } from "./write-helpers.js";
9
+ const createSkuSchema = z.object({
10
+ profileId: vtexProfileIdSchemaField,
11
+ productId: z.number().int().positive().describe("Parent product ID."),
12
+ name: z.string().min(1).describe("SKU name."),
13
+ refId: z.string().min(1).describe("Internal SKU reference code."),
14
+ ean: z.string().optional().describe("Optional EAN to attach after SKU creation."),
15
+ packagedHeight: z.number().nonnegative().describe("Packaged height."),
16
+ packagedLength: z.number().nonnegative().describe("Packaged length."),
17
+ packagedWidth: z.number().nonnegative().describe("Packaged width."),
18
+ packagedWeightKg: z.number().nonnegative().describe("Packaged weight in kg."),
19
+ height: z.number().nonnegative().optional().describe("Physical height."),
20
+ length: z.number().nonnegative().optional().describe("Physical length."),
21
+ width: z.number().nonnegative().optional().describe("Physical width."),
22
+ weightKg: z.number().nonnegative().optional().describe("Physical weight in kg."),
23
+ isActive: z.boolean().optional().describe("Whether the SKU should be created as active. VTEX recommends false during creation."),
24
+ activateIfPossible: z.boolean().optional().describe("Whether VTEX should auto-activate the SKU when an image or active component exists."),
25
+ measurementUnit: z.string().optional().describe("Measurement unit, for example `un`."),
26
+ unitMultiplier: z.number().positive().optional().describe("Unit multiplier."),
27
+ manufacturerCode: z.string().optional().describe("Manufacturer code."),
28
+ commercialConditionId: z.number().int().positive().optional().describe("Commercial condition ID.")
29
+ });
30
+ async function createSkuHandler({
31
+ profileId,
32
+ productId,
33
+ name,
34
+ refId,
35
+ ean,
36
+ packagedHeight,
37
+ packagedLength,
38
+ packagedWidth,
39
+ packagedWeightKg,
40
+ height,
41
+ length,
42
+ width,
43
+ weightKg,
44
+ isActive,
45
+ activateIfPossible,
46
+ measurementUnit,
47
+ unitMultiplier,
48
+ manufacturerCode,
49
+ commercialConditionId
50
+ }) {
51
+ try {
52
+ const profileResolution = await resolveVtexWriteProfile(profileId);
53
+ if (!profileResolution.ok) {
54
+ return profileResolution.response;
55
+ }
56
+ const resolvedProfileId = profileResolution.value.profileId;
57
+ const payload = {
58
+ ProductId: productId,
59
+ Name: name,
60
+ RefId: refId,
61
+ PackagedHeight: packagedHeight,
62
+ PackagedLength: packagedLength,
63
+ PackagedWidth: packagedWidth,
64
+ PackagedWeightKg: packagedWeightKg,
65
+ ActivateIfPossible: activateIfPossible ?? true,
66
+ IsActive: isActive ?? false
67
+ };
68
+ if (height !== void 0) payload.Height = height;
69
+ if (length !== void 0) payload.Length = length;
70
+ if (width !== void 0) payload.Width = width;
71
+ if (weightKg !== void 0) payload.WeightKg = weightKg;
72
+ if (measurementUnit !== void 0) payload.MeasurementUnit = measurementUnit;
73
+ if (unitMultiplier !== void 0) payload.UnitMultiplier = unitMultiplier;
74
+ if (manufacturerCode !== void 0) payload.ManufacturerCode = manufacturerCode;
75
+ if (commercialConditionId !== void 0) payload.CommercialConditionId = commercialConditionId;
76
+ const createdSku = await createSku(resolvedProfileId, payload);
77
+ const resourceId = createdSku.Id == null ? void 0 : String(createdSku.Id);
78
+ if (resourceId && ean?.trim()) {
79
+ await createSkuEan(resolvedProfileId, resourceId, ean.trim());
80
+ createdSku.Eans = [ean.trim()];
81
+ }
82
+ return buildWriteSuccessResponse({
83
+ profileId: resolvedProfileId,
84
+ operation: "create_sku",
85
+ resourceId,
86
+ riskLevel: "low",
87
+ message: "SKU created successfully.",
88
+ before: null,
89
+ after: createdSku,
90
+ details: {
91
+ product_id: productId,
92
+ sku_id: resourceId
93
+ }
94
+ });
95
+ } catch (err) {
96
+ return handleVtexWriteError(err, "Failed to create SKU in VTEX");
97
+ }
98
+ }
99
+ export {
100
+ createSkuHandler,
101
+ createSkuSchema
102
+ };
103
+ //# sourceMappingURL=create-sku.js.map