@yoryoboy/bi-mcp 1.1.0 → 1.3.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 (126) hide show
  1. package/README.md +126 -9
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +332 -2
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +2 -2
  6. package/dist/scripts/_helpers.js +44 -0
  7. package/dist/scripts/_helpers.js.map +7 -0
  8. package/dist/scripts/admin-profile-delete.js +72 -0
  9. package/dist/scripts/admin-profile-delete.js.map +7 -0
  10. package/dist/scripts/admin-profile-list.js +24 -0
  11. package/dist/scripts/admin-profile-list.js.map +7 -0
  12. package/dist/scripts/admin-profile-upsert.js +25 -0
  13. package/dist/scripts/admin-profile-upsert.js.map +7 -0
  14. package/dist/scripts/admin-vtex-list.js +28 -0
  15. package/dist/scripts/admin-vtex-list.js.map +7 -0
  16. package/dist/scripts/admin-vtex-upsert.js +73 -0
  17. package/dist/scripts/admin-vtex-upsert.js.map +7 -0
  18. package/dist/scripts/admin-vtex-validate.js +55 -0
  19. package/dist/scripts/admin-vtex-validate.js.map +7 -0
  20. package/dist/scripts/run-migrations.js +50 -0
  21. package/dist/scripts/run-migrations.js.map +7 -0
  22. package/dist/scripts/test-db-connection.js +19 -0
  23. package/dist/scripts/test-db-connection.js.map +7 -0
  24. package/dist/src/config/profile-store.js +86 -0
  25. package/dist/src/config/profile-store.js.map +7 -0
  26. package/dist/src/config/vtex-crypto.js +43 -0
  27. package/dist/src/config/vtex-crypto.js.map +7 -0
  28. package/dist/src/config/vtex-profile-store.js +132 -0
  29. package/dist/src/config/vtex-profile-store.js.map +7 -0
  30. package/dist/src/config/vtex.js +27 -21
  31. package/dist/src/config/vtex.js.map +2 -2
  32. package/dist/src/db/client.js +58 -0
  33. package/dist/src/db/client.js.map +7 -0
  34. package/dist/src/services/vtex/vtex-api.js +24 -8
  35. package/dist/src/services/vtex/vtex-api.js.map +2 -2
  36. package/dist/src/services/vtex/vtex-catalog-write.js +233 -0
  37. package/dist/src/services/vtex/vtex-catalog-write.js.map +7 -0
  38. package/dist/src/services/vtex/vtex-catalog.js +5 -3
  39. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  40. package/dist/src/services/vtex/vtex-logistics.js +18 -9
  41. package/dist/src/services/vtex/vtex-logistics.js.map +2 -2
  42. package/dist/src/services/vtex/vtex-orders-write.js +152 -0
  43. package/dist/src/services/vtex/vtex-orders-write.js.map +7 -0
  44. package/dist/src/services/vtex/vtex-orders.js +13 -7
  45. package/dist/src/services/vtex/vtex-orders.js.map +2 -2
  46. package/dist/src/services/vtex/vtex-pricing-write.js +24 -0
  47. package/dist/src/services/vtex/vtex-pricing-write.js.map +7 -0
  48. package/dist/src/services/vtex/vtex-pricing.js +5 -3
  49. package/dist/src/services/vtex/vtex-pricing.js.map +2 -2
  50. package/dist/src/services/vtex/vtex-write.js +38 -0
  51. package/dist/src/services/vtex/vtex-write.js.map +7 -0
  52. package/dist/src/tools/config/check-database-connection.js +59 -0
  53. package/dist/src/tools/config/check-database-connection.js.map +7 -0
  54. package/dist/src/tools/config/index.js +3 -0
  55. package/dist/src/tools/config/index.js.map +7 -0
  56. package/dist/src/tools/config/list-profiles.js +26 -0
  57. package/dist/src/tools/config/list-profiles.js.map +7 -0
  58. package/dist/src/tools/index.js +1 -0
  59. package/dist/src/tools/index.js.map +2 -2
  60. package/dist/src/tools/vtex/activate-sku.js +53 -0
  61. package/dist/src/tools/vtex/activate-sku.js.map +7 -0
  62. package/dist/src/tools/vtex/add-order-tracking.js +103 -0
  63. package/dist/src/tools/vtex/add-order-tracking.js.map +7 -0
  64. package/dist/src/tools/vtex/associate-specification.js +60 -0
  65. package/dist/src/tools/vtex/associate-specification.js.map +7 -0
  66. package/dist/src/tools/vtex/attach-catalog-image.js +63 -0
  67. package/dist/src/tools/vtex/attach-catalog-image.js.map +7 -0
  68. package/dist/src/tools/vtex/cancel-order.js +67 -0
  69. package/dist/src/tools/vtex/cancel-order.js.map +7 -0
  70. package/dist/src/tools/vtex/computed-price.js +12 -1
  71. package/dist/src/tools/vtex/computed-price.js.map +2 -2
  72. package/dist/src/tools/vtex/create-brand.js +69 -0
  73. package/dist/src/tools/vtex/create-brand.js.map +7 -0
  74. package/dist/src/tools/vtex/create-category.js +81 -0
  75. package/dist/src/tools/vtex/create-category.js.map +7 -0
  76. package/dist/src/tools/vtex/create-product-with-sku.js +120 -0
  77. package/dist/src/tools/vtex/create-product-with-sku.js.map +7 -0
  78. package/dist/src/tools/vtex/create-product.js +111 -0
  79. package/dist/src/tools/vtex/create-product.js.map +7 -0
  80. package/dist/src/tools/vtex/create-sku.js +103 -0
  81. package/dist/src/tools/vtex/create-sku.js.map +7 -0
  82. package/dist/src/tools/vtex/create-specification-value.js +53 -0
  83. package/dist/src/tools/vtex/create-specification-value.js.map +7 -0
  84. package/dist/src/tools/vtex/create-specification.js +85 -0
  85. package/dist/src/tools/vtex/create-specification.js.map +7 -0
  86. package/dist/src/tools/vtex/deactivate-sku.js +53 -0
  87. package/dist/src/tools/vtex/deactivate-sku.js.map +7 -0
  88. package/dist/src/tools/vtex/delete-fixed-price.js +53 -0
  89. package/dist/src/tools/vtex/delete-fixed-price.js.map +7 -0
  90. package/dist/src/tools/vtex/index.js +21 -0
  91. package/dist/src/tools/vtex/index.js.map +2 -2
  92. package/dist/src/tools/vtex/inventory-check.js +15 -2
  93. package/dist/src/tools/vtex/inventory-check.js.map +2 -2
  94. package/dist/src/tools/vtex/invoice-order.js +84 -0
  95. package/dist/src/tools/vtex/invoice-order.js.map +7 -0
  96. package/dist/src/tools/vtex/order-details.js +16 -2
  97. package/dist/src/tools/vtex/order-details.js.map +2 -2
  98. package/dist/src/tools/vtex/orders-summary.js +11 -1
  99. package/dist/src/tools/vtex/orders-summary.js.map +2 -2
  100. package/dist/src/tools/vtex/product-offers.js +15 -2
  101. package/dist/src/tools/vtex/product-offers.js.map +2 -2
  102. package/dist/src/tools/vtex/profile-resolution.js +57 -0
  103. package/dist/src/tools/vtex/profile-resolution.js.map +7 -0
  104. package/dist/src/tools/vtex/sku-offers.js +16 -2
  105. package/dist/src/tools/vtex/sku-offers.js.map +2 -2
  106. package/dist/src/tools/vtex/sku-price.js +12 -2
  107. package/dist/src/tools/vtex/sku-price.js.map +2 -2
  108. package/dist/src/tools/vtex/toggle-unlimited-quantity.js +65 -0
  109. package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +7 -0
  110. package/dist/src/tools/vtex/update-inventory.js +40 -14
  111. package/dist/src/tools/vtex/update-inventory.js.map +2 -2
  112. package/dist/src/tools/vtex/update-lead-time.js +40 -12
  113. package/dist/src/tools/vtex/update-lead-time.js.map +2 -2
  114. package/dist/src/tools/vtex/update-product-basic-fields.js +71 -0
  115. package/dist/src/tools/vtex/update-product-basic-fields.js.map +7 -0
  116. package/dist/src/tools/vtex/update-sku-basic-fields.js +92 -0
  117. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +7 -0
  118. package/dist/src/tools/vtex/update-sku-price.js +81 -0
  119. package/dist/src/tools/vtex/update-sku-price.js.map +7 -0
  120. package/dist/src/tools/vtex/upsert-fixed-price.js +69 -0
  121. package/dist/src/tools/vtex/upsert-fixed-price.js.map +7 -0
  122. package/dist/src/tools/vtex/warehouse-inventory.js +12 -1
  123. package/dist/src/tools/vtex/warehouse-inventory.js.map +2 -2
  124. package/dist/src/tools/vtex/write-helpers.js +73 -0
  125. package/dist/src/tools/vtex/write-helpers.js.map +7 -0
  126. package/package.json +12 -2
@@ -0,0 +1,38 @@
1
+ class VtexOperationError extends Error {
2
+ constructor(message, code, details) {
3
+ super(message);
4
+ this.code = code;
5
+ this.details = details;
6
+ this.name = "VtexOperationError";
7
+ }
8
+ }
9
+ function buildConfirmationRequiredResult(operation, details) {
10
+ return {
11
+ success: false,
12
+ error_code: "EXPLICIT_CONFIRMATION_REQUIRED",
13
+ message: "This VTEX operation is high-risk and requires explicit user confirmation before execution.",
14
+ operation,
15
+ risk_level: "high",
16
+ details
17
+ };
18
+ }
19
+ function buildWriteSuccessResult(params) {
20
+ return {
21
+ success: true,
22
+ profile_id: params.profileId,
23
+ operation: params.operation,
24
+ resource_id: params.resourceId,
25
+ risk_level: params.riskLevel,
26
+ confirmed: params.confirmed,
27
+ message: params.message,
28
+ summary: params.summary,
29
+ confirmation_note: params.confirmationNote,
30
+ details: params.details
31
+ };
32
+ }
33
+ export {
34
+ VtexOperationError,
35
+ buildConfirmationRequiredResult,
36
+ buildWriteSuccessResult
37
+ };
38
+ //# sourceMappingURL=vtex-write.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/services/vtex/vtex-write.ts"],
4
+ "sourcesContent": ["export type VtexWriteRiskLevel = \"low\" | \"high\";\n\nexport type VtexWriteErrorCode =\n | \"EXPLICIT_CONFIRMATION_REQUIRED\"\n | \"INVALID_ORDER_STATE\"\n | \"RESOURCE_NOT_FOUND\"\n | \"INVALID_OPERATION\";\n\nexport interface VtexWriteSummary extends Record<string, unknown> {\n before?: Record<string, unknown> | null;\n after?: Record<string, unknown> | null;\n}\n\nexport interface VtexWriteResult extends Record<string, unknown> {\n success: boolean;\n profile_id?: string;\n operation: string;\n resource_id?: string;\n risk_level: VtexWriteRiskLevel;\n confirmed?: boolean;\n message: string;\n summary?: VtexWriteSummary;\n confirmation_note?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface VtexWriteErrorResult extends Record<string, unknown> {\n success: false;\n error_code: VtexWriteErrorCode;\n message: string;\n operation: string;\n risk_level: VtexWriteRiskLevel;\n details?: Record<string, unknown>;\n}\n\nexport class VtexOperationError extends Error {\n constructor(\n message: string,\n public readonly code: VtexWriteErrorCode,\n public readonly details?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"VtexOperationError\";\n }\n}\n\nexport function buildConfirmationRequiredResult(\n operation: string,\n details?: Record<string, unknown>\n): VtexWriteErrorResult {\n return {\n success: false,\n error_code: \"EXPLICIT_CONFIRMATION_REQUIRED\",\n message: \"This VTEX operation is high-risk and requires explicit user confirmation before execution.\",\n operation,\n risk_level: \"high\",\n details,\n };\n}\n\nexport function buildWriteSuccessResult(params: {\n profileId: string;\n operation: string;\n resourceId?: string;\n riskLevel: VtexWriteRiskLevel;\n confirmed?: boolean;\n message: string;\n summary?: VtexWriteSummary;\n confirmationNote?: string;\n details?: Record<string, unknown>;\n}): VtexWriteResult {\n return {\n success: true,\n profile_id: params.profileId,\n operation: params.operation,\n resource_id: params.resourceId,\n risk_level: params.riskLevel,\n confirmed: params.confirmed,\n message: params.message,\n summary: params.summary,\n confirmation_note: params.confirmationNote,\n details: params.details,\n };\n}\n"],
5
+ "mappings": "AAmCO,MAAM,2BAA2B,MAAM;AAAA,EAC5C,YACE,SACgB,MACA,SAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,gCACd,WACA,SACsB;AACtB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAUpB;AAClB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,mBAAmB,OAAO;AAAA,IAC1B,SAAS,OAAO;AAAA,EAClB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,59 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { checkTableExists, getDatabaseUrl, testDatabaseConnection } from "../../db/client.js";
4
+ import { stripNulls } from "../../utils/strip-payload.js";
5
+ const checkDatabaseConnectionSchema = z.object({});
6
+ function getConnectionHints() {
7
+ const databaseUrl = getDatabaseUrl();
8
+ if (!databaseUrl) {
9
+ return {
10
+ database_url_present: false,
11
+ host_hint: void 0,
12
+ port_hint: void 0
13
+ };
14
+ }
15
+ try {
16
+ const parsedUrl = new URL(databaseUrl);
17
+ return {
18
+ database_url_present: true,
19
+ host_hint: parsedUrl.hostname || void 0,
20
+ port_hint: parsedUrl.port || void 0
21
+ };
22
+ } catch {
23
+ return {
24
+ database_url_present: true,
25
+ host_hint: void 0,
26
+ port_hint: void 0
27
+ };
28
+ }
29
+ }
30
+ async function checkDatabaseConnectionHandler() {
31
+ try {
32
+ const result = await testDatabaseConnection();
33
+ const schemaMigrationsTablePresent = await checkTableExists("schema_migrations");
34
+ const profilesTablePresent = await checkTableExists("profiles");
35
+ const profileVtexConnectionsTablePresent = await checkTableExists("profile_vtex_connections");
36
+ const hints = getConnectionHints();
37
+ return object(
38
+ stripNulls({
39
+ status: "ok",
40
+ database: result.current_database,
41
+ user: result.current_user,
42
+ server_time: result.now.toISOString(),
43
+ database_url_present: hints.database_url_present,
44
+ host_hint: hints.host_hint,
45
+ port_hint: hints.port_hint,
46
+ schema_migrations_table_present: schemaMigrationsTablePresent,
47
+ profiles_table_present: profilesTablePresent,
48
+ profile_vtex_connections_table_present: profileVtexConnectionsTablePresent
49
+ })
50
+ );
51
+ } catch (err) {
52
+ return error(err instanceof Error ? err.message : "Database connection check failed");
53
+ }
54
+ }
55
+ export {
56
+ checkDatabaseConnectionHandler,
57
+ checkDatabaseConnectionSchema
58
+ };
59
+ //# sourceMappingURL=check-database-connection.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/config/check-database-connection.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { checkTableExists, getDatabaseUrl, testDatabaseConnection } from \"../../db/client.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const checkDatabaseConnectionSchema = z.object({});\n\nfunction getConnectionHints() {\n const databaseUrl = getDatabaseUrl();\n if (!databaseUrl) {\n return {\n database_url_present: false,\n host_hint: undefined,\n port_hint: undefined,\n };\n }\n\n try {\n const parsedUrl = new URL(databaseUrl);\n\n return {\n database_url_present: true,\n host_hint: parsedUrl.hostname || undefined,\n port_hint: parsedUrl.port || undefined,\n };\n } catch {\n return {\n database_url_present: true,\n host_hint: undefined,\n port_hint: undefined,\n };\n }\n}\n\nexport async function checkDatabaseConnectionHandler() {\n try {\n const result = await testDatabaseConnection();\n const schemaMigrationsTablePresent = await checkTableExists(\"schema_migrations\");\n const profilesTablePresent = await checkTableExists(\"profiles\");\n const profileVtexConnectionsTablePresent = await checkTableExists(\"profile_vtex_connections\");\n const hints = getConnectionHints();\n\n return object(\n stripNulls({\n status: \"ok\",\n database: result.current_database,\n user: result.current_user,\n server_time: result.now.toISOString(),\n database_url_present: hints.database_url_present,\n host_hint: hints.host_hint,\n port_hint: hints.port_hint,\n schema_migrations_table_present: schemaMigrationsTablePresent,\n profiles_table_present: profilesTablePresent,\n profile_vtex_connections_table_present: profileVtexConnectionsTablePresent,\n })\n );\n } catch (err) {\n return error(err instanceof Error ? err.message : \"Database connection check failed\");\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,kBAAkB,gBAAgB,8BAA8B;AACzE,SAAS,kBAAkB;AAEpB,MAAM,gCAAgC,EAAE,OAAO,CAAC,CAAC;AAExD,SAAS,qBAAqB;AAC5B,QAAM,cAAc,eAAe;AACnC,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,sBAAsB;AAAA,MACtB,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AAEA,MAAI;AACF,UAAM,YAAY,IAAI,IAAI,WAAW;AAErC,WAAO;AAAA,MACL,sBAAsB;AAAA,MACtB,WAAW,UAAU,YAAY;AAAA,MACjC,WAAW,UAAU,QAAQ;AAAA,IAC/B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,sBAAsB;AAAA,MACtB,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEA,eAAsB,iCAAiC;AACrD,MAAI;AACF,UAAM,SAAS,MAAM,uBAAuB;AAC5C,UAAM,+BAA+B,MAAM,iBAAiB,mBAAmB;AAC/E,UAAM,uBAAuB,MAAM,iBAAiB,UAAU;AAC9D,UAAM,qCAAqC,MAAM,iBAAiB,0BAA0B;AAC5F,UAAM,QAAQ,mBAAmB;AAEjC,WAAO;AAAA,MACL,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,UAAU,OAAO;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,aAAa,OAAO,IAAI,YAAY;AAAA,QACpC,sBAAsB,MAAM;AAAA,QAC5B,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,iCAAiC;AAAA,QACjC,wBAAwB;AAAA,QACxB,wCAAwC;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,kCAAkC;AAAA,EACtF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./check-database-connection.js";
2
+ export * from "./list-profiles.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/config/index.ts"],
4
+ "sourcesContent": ["export * from \"./check-database-connection.js\";\nexport * from \"./list-profiles.js\";\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { listProfiles } from "../../config/profile-store.js";
4
+ const listProfilesSchema = z.object({});
5
+ async function listProfilesHandler() {
6
+ try {
7
+ const profiles = await listProfiles();
8
+ return object({
9
+ total_profiles: profiles.length,
10
+ profiles: profiles.map((profile) => ({
11
+ profile_id: profile.id,
12
+ name: profile.name,
13
+ is_active: profile.isActive,
14
+ created_at: profile.createdAt.toISOString(),
15
+ updated_at: profile.updatedAt.toISOString()
16
+ }))
17
+ });
18
+ } catch (err) {
19
+ return error(err instanceof Error ? err.message : "Failed to list profiles");
20
+ }
21
+ }
22
+ export {
23
+ listProfilesHandler,
24
+ listProfilesSchema
25
+ };
26
+ //# sourceMappingURL=list-profiles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/config/list-profiles.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { listProfiles } from \"../../config/profile-store.js\";\n\nexport const listProfilesSchema = z.object({});\n\nexport async function listProfilesHandler() {\n try {\n const profiles = await listProfiles();\n\n return object({\n total_profiles: profiles.length,\n profiles: profiles.map((profile) => ({\n profile_id: profile.id,\n name: profile.name,\n is_active: profile.isActive,\n created_at: profile.createdAt.toISOString(),\n updated_at: profile.updatedAt.toISOString(),\n })),\n });\n } catch (err) {\n return error(err instanceof Error ? err.message : \"Failed to list profiles\");\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,oBAAoB;AAEtB,MAAM,qBAAqB,EAAE,OAAO,CAAC,CAAC;AAE7C,eAAsB,sBAAsB;AAC1C,MAAI;AACF,UAAM,WAAW,MAAM,aAAa;AAEpC,WAAO,OAAO;AAAA,MACZ,gBAAgB,SAAS;AAAA,MACzB,UAAU,SAAS,IAAI,CAAC,aAAa;AAAA,QACnC,YAAY,QAAQ;AAAA,QACpB,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ,UAAU,YAAY;AAAA,QAC1C,YAAY,QAAQ,UAAU,YAAY;AAAA,MAC5C,EAAE;AAAA,IACJ,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,yBAAyB;AAAA,EAC7E;AACF;",
6
+ "names": []
7
+ }
@@ -1,3 +1,4 @@
1
+ export * from "./config/index.js";
1
2
  export * from "./vtex/index.js";
2
3
  export * from "./analytics/index.js";
3
4
  export * from "./google-ads/index.js";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/index.ts"],
4
- "sourcesContent": ["export * from \"./vtex/index.js\";\nexport * from \"./analytics/index.js\";\nexport * from \"./google-ads/index.js\";\nexport * from \"./meta/index.js\";\nexport * from \"./search-console/index.js\";\n"],
5
- "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "sourcesContent": ["export * from \"./config/index.js\";\nexport * from \"./vtex/index.js\";\nexport * from \"./analytics/index.js\";\nexport * from \"./google-ads/index.js\";\nexport * from \"./meta/index.js\";\nexport * from \"./search-console/index.js\";\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import {
3
+ buildSkuUpdatePayload,
4
+ getSku,
5
+ updateSku
6
+ } from "../../services/vtex/vtex-catalog-write.js";
7
+ import {
8
+ buildWriteSuccessResponse,
9
+ handleVtexWriteError,
10
+ resolveVtexWriteProfile,
11
+ vtexProfileIdSchemaField
12
+ } from "./write-helpers.js";
13
+ const activateSkuSchema = z.object({
14
+ profileId: vtexProfileIdSchemaField,
15
+ skuId: z.string().min(1).describe("VTEX SKU identifier to activate.")
16
+ });
17
+ async function activateSkuHandler({
18
+ profileId,
19
+ skuId
20
+ }) {
21
+ try {
22
+ const profileResolution = await resolveVtexWriteProfile(profileId);
23
+ if (!profileResolution.ok) {
24
+ return profileResolution.response;
25
+ }
26
+ const resolvedProfileId = profileResolution.value.profileId;
27
+ const beforeSku = await getSku(resolvedProfileId, skuId);
28
+ const afterSku = await updateSku(
29
+ resolvedProfileId,
30
+ skuId,
31
+ buildSkuUpdatePayload(beforeSku, { isActive: true })
32
+ );
33
+ return buildWriteSuccessResponse({
34
+ profileId: resolvedProfileId,
35
+ operation: "activate_sku",
36
+ resourceId: skuId,
37
+ riskLevel: "low",
38
+ message: "SKU activated successfully.",
39
+ before: beforeSku,
40
+ after: afterSku,
41
+ details: {
42
+ sku_id: skuId
43
+ }
44
+ });
45
+ } catch (err) {
46
+ return handleVtexWriteError(err, `Failed to activate SKU ${skuId}`);
47
+ }
48
+ }
49
+ export {
50
+ activateSkuHandler,
51
+ activateSkuSchema
52
+ };
53
+ //# sourceMappingURL=activate-sku.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/activate-sku.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n buildSkuUpdatePayload,\n getSku,\n updateSku,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const activateSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier to activate.\"),\n});\n\nexport async function activateSkuHandler({\n profileId,\n skuId,\n}: z.infer<typeof activateSkuSchema>) {\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 beforeSku = await getSku(resolvedProfileId, skuId);\n const afterSku = await updateSku(\n resolvedProfileId,\n skuId,\n buildSkuUpdatePayload(beforeSku, { isActive: true })\n );\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"activate_sku\",\n resourceId: skuId,\n riskLevel: \"low\",\n message: \"SKU activated successfully.\",\n before: beforeSku,\n after: afterSku,\n details: {\n sku_id: skuId,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to activate SKU ${skuId}`);\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,OACK;AAEA,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,WAAW;AAAA,EACX,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,kCAAkC;AACtE,CAAC;AAED,eAAsB,mBAAmB;AAAA,EACvC;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,YAAY,MAAM,OAAO,mBAAmB,KAAK;AACvD,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA,sBAAsB,WAAW,EAAE,UAAU,KAAK,CAAC;AAAA,IACrD;AAEA,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,0BAA0B,KAAK,EAAE;AAAA,EACpE;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import {
3
+ getOrderStateSnapshot,
4
+ updateOrderTrackingStatus,
5
+ updatePartialInvoiceTracking,
6
+ validateOrderForTracking
7
+ } from "../../services/vtex/vtex-orders-write.js";
8
+ import {
9
+ buildWriteSuccessResponse,
10
+ confirmationNoteSchemaField,
11
+ confirmationSchemaField,
12
+ handleVtexWriteError,
13
+ requireExplicitConfirmation,
14
+ resolveVtexWriteProfile,
15
+ vtexProfileIdSchemaField
16
+ } from "./write-helpers.js";
17
+ const trackingEventSchema = z.object({
18
+ city: z.string().min(1).describe("Tracking event city."),
19
+ state: z.string().min(1).describe("Tracking event state."),
20
+ description: z.string().min(1).describe("Tracking event description."),
21
+ date: z.string().min(1).describe("Tracking event date string.")
22
+ });
23
+ const addOrderTrackingSchema = z.object({
24
+ profileId: vtexProfileIdSchemaField,
25
+ orderId: z.string().min(1).describe("VTEX order identifier."),
26
+ invoiceNumber: z.string().min(1).describe("Invoice number that will receive tracking data."),
27
+ confirmed: confirmationSchemaField,
28
+ confirmationNote: confirmationNoteSchemaField,
29
+ trackingNumber: z.string().min(1).describe("Tracking number."),
30
+ trackingUrl: z.string().url().optional().describe("Tracking URL."),
31
+ courier: z.string().optional().describe("Carrier name."),
32
+ dispatchedDate: z.string().min(1).describe("Dispatch timestamp."),
33
+ isDelivered: z.boolean().optional().describe("Optional delivery status to send to VTEX tracking timeline."),
34
+ deliveredDate: z.string().optional().describe("Optional delivered date in `yyyy-mm-dd hh:mm` format."),
35
+ events: z.array(trackingEventSchema).optional().describe("Optional tracking events timeline.")
36
+ });
37
+ async function addOrderTrackingHandler({
38
+ profileId,
39
+ orderId,
40
+ invoiceNumber,
41
+ confirmed,
42
+ confirmationNote,
43
+ trackingNumber,
44
+ trackingUrl,
45
+ courier,
46
+ dispatchedDate,
47
+ isDelivered,
48
+ deliveredDate,
49
+ events
50
+ }) {
51
+ const confirmationResponse = requireExplicitConfirmation(confirmed, "add_order_tracking", {
52
+ order_id: orderId,
53
+ invoice_number: invoiceNumber
54
+ });
55
+ if (confirmationResponse) {
56
+ return confirmationResponse;
57
+ }
58
+ try {
59
+ const profileResolution = await resolveVtexWriteProfile(profileId);
60
+ if (!profileResolution.ok) {
61
+ return profileResolution.response;
62
+ }
63
+ const resolvedProfileId = profileResolution.value.profileId;
64
+ const beforeOrder = await validateOrderForTracking(resolvedProfileId, orderId, invoiceNumber);
65
+ await updatePartialInvoiceTracking(resolvedProfileId, orderId, invoiceNumber, {
66
+ trackingNumber,
67
+ trackingUrl,
68
+ courier,
69
+ dispatchedDate
70
+ });
71
+ if (events?.length || isDelivered !== void 0) {
72
+ await updateOrderTrackingStatus(resolvedProfileId, orderId, invoiceNumber, {
73
+ isDelivered: isDelivered ?? false,
74
+ deliveredDate: deliveredDate ?? null,
75
+ events: events ?? []
76
+ });
77
+ }
78
+ const afterOrder = await getOrderStateSnapshot(resolvedProfileId, orderId);
79
+ return buildWriteSuccessResponse({
80
+ profileId: resolvedProfileId,
81
+ operation: "add_order_tracking",
82
+ resourceId: orderId,
83
+ riskLevel: "high",
84
+ confirmed: true,
85
+ confirmationNote,
86
+ message: "Order tracking updated successfully.",
87
+ before: beforeOrder,
88
+ after: afterOrder,
89
+ details: {
90
+ order_id: orderId,
91
+ invoice_number: invoiceNumber,
92
+ tracking_number: trackingNumber
93
+ }
94
+ });
95
+ } catch (err) {
96
+ return handleVtexWriteError(err, `Failed to update tracking for order ${orderId}`);
97
+ }
98
+ }
99
+ export {
100
+ addOrderTrackingHandler,
101
+ addOrderTrackingSchema
102
+ };
103
+ //# sourceMappingURL=add-order-tracking.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/add-order-tracking.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n getOrderStateSnapshot,\n updateOrderTrackingStatus,\n updatePartialInvoiceTracking,\n validateOrderForTracking,\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\nconst trackingEventSchema = z.object({\n city: z.string().min(1).describe(\"Tracking event city.\"),\n state: z.string().min(1).describe(\"Tracking event state.\"),\n description: z.string().min(1).describe(\"Tracking event description.\"),\n date: z.string().min(1).describe(\"Tracking event date string.\"),\n});\n\nexport const addOrderTrackingSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n orderId: z.string().min(1).describe(\"VTEX order identifier.\"),\n invoiceNumber: z.string().min(1).describe(\"Invoice number that will receive tracking data.\"),\n confirmed: confirmationSchemaField,\n confirmationNote: confirmationNoteSchemaField,\n trackingNumber: z.string().min(1).describe(\"Tracking number.\"),\n trackingUrl: z.string().url().optional().describe(\"Tracking URL.\"),\n courier: z.string().optional().describe(\"Carrier name.\"),\n dispatchedDate: z.string().min(1).describe(\"Dispatch timestamp.\"),\n isDelivered: z\n .boolean()\n .optional()\n .describe(\"Optional delivery status to send to VTEX tracking timeline.\"),\n deliveredDate: z\n .string()\n .optional()\n .describe(\"Optional delivered date in `yyyy-mm-dd hh:mm` format.\"),\n events: z.array(trackingEventSchema).optional().describe(\"Optional tracking events timeline.\"),\n});\n\nexport async function addOrderTrackingHandler({\n profileId,\n orderId,\n invoiceNumber,\n confirmed,\n confirmationNote,\n trackingNumber,\n trackingUrl,\n courier,\n dispatchedDate,\n isDelivered,\n deliveredDate,\n events,\n}: z.infer<typeof addOrderTrackingSchema>) {\n const confirmationResponse = requireExplicitConfirmation(confirmed, \"add_order_tracking\", {\n order_id: orderId,\n invoice_number: invoiceNumber,\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 validateOrderForTracking(resolvedProfileId, orderId, invoiceNumber);\n\n await updatePartialInvoiceTracking(resolvedProfileId, orderId, invoiceNumber, {\n trackingNumber,\n trackingUrl,\n courier,\n dispatchedDate,\n });\n\n if (events?.length || isDelivered !== undefined) {\n await updateOrderTrackingStatus(resolvedProfileId, orderId, invoiceNumber, {\n isDelivered: isDelivered ?? false,\n deliveredDate: deliveredDate ?? null,\n events: events ?? [],\n });\n }\n\n const afterOrder = await getOrderStateSnapshot(resolvedProfileId, orderId);\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"add_order_tracking\",\n resourceId: orderId,\n riskLevel: \"high\",\n confirmed: true,\n confirmationNote,\n message: \"Order tracking updated 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 invoice_number: invoiceNumber,\n tracking_number: trackingNumber,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to update tracking for order ${orderId}`);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,sBAAsB;AAAA,EACvD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,uBAAuB;AAAA,EACzD,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,6BAA6B;AAAA,EACrE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,6BAA6B;AAChE,CAAC;AAEM,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,WAAW;AAAA,EACX,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,wBAAwB;AAAA,EAC5D,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,iDAAiD;AAAA,EAC3F,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,kBAAkB;AAAA,EAC7D,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,EACjE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,EACvD,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,qBAAqB;AAAA,EAChE,aAAa,EACV,QAAQ,EACR,SAAS,EACT,SAAS,6DAA6D;AAAA,EACzE,eAAe,EACZ,OAAO,EACP,SAAS,EACT,SAAS,uDAAuD;AAAA,EACnE,QAAQ,EAAE,MAAM,mBAAmB,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAC/F,CAAC;AAED,eAAsB,wBAAwB;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AACzC,QAAM,uBAAuB,4BAA4B,WAAW,sBAAsB;AAAA,IACxF,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB,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,yBAAyB,mBAAmB,SAAS,aAAa;AAE5F,UAAM,6BAA6B,mBAAmB,SAAS,eAAe;AAAA,MAC5E;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,UAAU,gBAAgB,QAAW;AAC/C,YAAM,0BAA0B,mBAAmB,SAAS,eAAe;AAAA,QACzE,aAAa,eAAe;AAAA,QAC5B,eAAe,iBAAiB;AAAA,QAChC,QAAQ,UAAU,CAAC;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,MAAM,sBAAsB,mBAAmB,OAAO;AAEzE,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,QACV,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,uCAAuC,OAAO,EAAE;AAAA,EACnF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ import {
3
+ associateProductSpecification,
4
+ associateSkuSpecification
5
+ } from "../../services/vtex/vtex-catalog-write.js";
6
+ import {
7
+ buildWriteSuccessResponse,
8
+ handleVtexWriteError,
9
+ resolveVtexWriteProfile,
10
+ vtexProfileIdSchemaField
11
+ } from "./write-helpers.js";
12
+ const associateSpecificationSchema = z.object({
13
+ profileId: vtexProfileIdSchemaField,
14
+ entityType: z.enum(["product", "sku"]).describe("Whether the specification should be associated to a product or an SKU."),
15
+ resourceId: z.string().min(1).describe("Product ID or SKU ID depending on entityType."),
16
+ fieldId: z.number().int().positive().describe("Specification field ID."),
17
+ fieldValueId: z.number().int().positive().optional().describe("Specification value ID. Required for combo, radio, and checkbox fields."),
18
+ text: z.string().optional().describe("Raw text value. Use for free text specifications instead of fieldValueId.")
19
+ });
20
+ async function associateSpecificationHandler({
21
+ profileId,
22
+ entityType,
23
+ resourceId,
24
+ fieldId,
25
+ fieldValueId,
26
+ text
27
+ }) {
28
+ try {
29
+ const profileResolution = await resolveVtexWriteProfile(profileId);
30
+ if (!profileResolution.ok) {
31
+ return profileResolution.response;
32
+ }
33
+ const resolvedProfileId = profileResolution.value.profileId;
34
+ const payload = {
35
+ FieldId: fieldId
36
+ };
37
+ if (fieldValueId !== void 0) payload.FieldValueId = fieldValueId;
38
+ if (text !== void 0) payload.Text = text;
39
+ const association = entityType === "product" ? await associateProductSpecification(resolvedProfileId, resourceId, payload) : await associateSkuSpecification(resolvedProfileId, resourceId, payload);
40
+ return buildWriteSuccessResponse({
41
+ profileId: resolvedProfileId,
42
+ operation: "associate_specification",
43
+ resourceId,
44
+ riskLevel: "low",
45
+ message: "Specification associated successfully.",
46
+ before: null,
47
+ after: association,
48
+ details: {
49
+ entity_type: entityType
50
+ }
51
+ });
52
+ } catch (err) {
53
+ return handleVtexWriteError(err, `Failed to associate specification to ${entityType} ${resourceId}`);
54
+ }
55
+ }
56
+ export {
57
+ associateSpecificationHandler,
58
+ associateSpecificationSchema
59
+ };
60
+ //# sourceMappingURL=associate-specification.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/associate-specification.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport {\n associateProductSpecification,\n associateSkuSpecification,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const associateSpecificationSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n entityType: z.enum([\"product\", \"sku\"]).describe(\"Whether the specification should be associated to a product or an SKU.\"),\n resourceId: z.string().min(1).describe(\"Product ID or SKU ID depending on entityType.\"),\n fieldId: z.number().int().positive().describe(\"Specification field ID.\"),\n fieldValueId: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Specification value ID. Required for combo, radio, and checkbox fields.\"),\n text: z\n .string()\n .optional()\n .describe(\"Raw text value. Use for free text specifications instead of fieldValueId.\"),\n});\n\nexport async function associateSpecificationHandler({\n profileId,\n entityType,\n resourceId,\n fieldId,\n fieldValueId,\n text,\n}: z.infer<typeof associateSpecificationSchema>) {\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 FieldId: fieldId,\n };\n if (fieldValueId !== undefined) payload.FieldValueId = fieldValueId;\n if (text !== undefined) payload.Text = text;\n\n const association =\n entityType === \"product\"\n ? await associateProductSpecification(resolvedProfileId, resourceId, payload)\n : await associateSkuSpecification(resolvedProfileId, resourceId, payload);\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"associate_specification\",\n resourceId,\n riskLevel: \"low\",\n message: \"Specification associated successfully.\",\n before: null,\n after: association,\n details: {\n entity_type: entityType,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to associate specification to ${entityType} ${resourceId}`);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,WAAW;AAAA,EACX,YAAY,EAAE,KAAK,CAAC,WAAW,KAAK,CAAC,EAAE,SAAS,wEAAwE;AAAA,EACxH,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,+CAA+C;AAAA,EACtF,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,EACvE,cAAc,EACX,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,yEAAyE;AAAA,EACrF,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2EAA2E;AACzF,CAAC;AAED,eAAsB,8BAA8B;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiD;AAC/C,MAAI;AACF,UAAM,oBAAoB,MAAM,wBAAwB,SAAS;AACjE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,UAAmC;AAAA,MACvC,SAAS;AAAA,IACX;AACA,QAAI,iBAAiB,OAAW,SAAQ,eAAe;AACvD,QAAI,SAAS,OAAW,SAAQ,OAAO;AAEvC,UAAM,cACJ,eAAe,YACX,MAAM,8BAA8B,mBAAmB,YAAY,OAAO,IAC1E,MAAM,0BAA0B,mBAAmB,YAAY,OAAO;AAE5E,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,wCAAwC,UAAU,IAAI,UAAU,EAAE;AAAA,EACrG;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,63 @@
1
+ import { z } from "zod";
2
+ import { createSkuFile } from "../../services/vtex/vtex-catalog-write.js";
3
+ import {
4
+ buildWriteSuccessResponse,
5
+ handleVtexWriteError,
6
+ resolveVtexWriteProfile,
7
+ vtexProfileIdSchemaField
8
+ } from "./write-helpers.js";
9
+ const attachCatalogImageSchema = z.object({
10
+ profileId: vtexProfileIdSchemaField,
11
+ skuId: z.string().min(1).describe("SKU identifier that will receive the image."),
12
+ name: z.string().min(1).describe("Image name."),
13
+ url: z.string().url().describe("Public image URL. VTEX expects http(s) and a valid image extension."),
14
+ isMain: z.boolean().optional().describe("Whether this image should be the main image."),
15
+ label: z.string().optional().describe("Optional image label."),
16
+ text: z.string().optional().describe("Optional image text."),
17
+ position: z.number().int().nonnegative().optional().describe("Image position in storefront.")
18
+ });
19
+ async function attachCatalogImageHandler({
20
+ profileId,
21
+ skuId,
22
+ name,
23
+ url,
24
+ isMain,
25
+ label,
26
+ text,
27
+ position
28
+ }) {
29
+ try {
30
+ const profileResolution = await resolveVtexWriteProfile(profileId);
31
+ if (!profileResolution.ok) {
32
+ return profileResolution.response;
33
+ }
34
+ const resolvedProfileId = profileResolution.value.profileId;
35
+ const createdImage = await createSkuFile(resolvedProfileId, skuId, {
36
+ Name: name,
37
+ Url: url,
38
+ IsMain: isMain,
39
+ Label: label,
40
+ Text: text,
41
+ Position: position
42
+ });
43
+ return buildWriteSuccessResponse({
44
+ profileId: resolvedProfileId,
45
+ operation: "attach_catalog_image",
46
+ resourceId: skuId,
47
+ riskLevel: "low",
48
+ message: "Catalog image attached successfully.",
49
+ before: null,
50
+ after: createdImage,
51
+ details: {
52
+ sku_id: skuId
53
+ }
54
+ });
55
+ } catch (err) {
56
+ return handleVtexWriteError(err, `Failed to attach image to SKU ${skuId}`);
57
+ }
58
+ }
59
+ export {
60
+ attachCatalogImageHandler,
61
+ attachCatalogImageSchema
62
+ };
63
+ //# sourceMappingURL=attach-catalog-image.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/vtex/attach-catalog-image.ts"],
4
+ "sourcesContent": ["import { z } from \"zod\";\n\nimport { createSkuFile } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const attachCatalogImageSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"SKU identifier that will receive the image.\"),\n name: z.string().min(1).describe(\"Image name.\"),\n url: z\n .string()\n .url()\n .describe(\"Public image URL. VTEX expects http(s) and a valid image extension.\"),\n isMain: z.boolean().optional().describe(\"Whether this image should be the main image.\"),\n label: z.string().optional().describe(\"Optional image label.\"),\n text: z.string().optional().describe(\"Optional image text.\"),\n position: z.number().int().nonnegative().optional().describe(\"Image position in storefront.\"),\n});\n\nexport async function attachCatalogImageHandler({\n profileId,\n skuId,\n name,\n url,\n isMain,\n label,\n text,\n position,\n}: z.infer<typeof attachCatalogImageSchema>) {\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 createdImage = await createSkuFile(resolvedProfileId, skuId, {\n Name: name,\n Url: url,\n IsMain: isMain,\n Label: label,\n Text: text,\n Position: position,\n });\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"attach_catalog_image\",\n resourceId: skuId,\n riskLevel: \"low\",\n message: \"Catalog image attached successfully.\",\n before: null,\n after: createdImage,\n details: {\n sku_id: skuId,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to attach image to SKU ${skuId}`);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,WAAW;AAAA,EACX,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,6CAA6C;AAAA,EAC/E,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,aAAa;AAAA,EAC9C,KAAK,EACF,OAAO,EACP,IAAI,EACJ,SAAS,qEAAqE;AAAA,EACjF,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,EACtF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,EAC7D,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,EAC3D,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAC9F,CAAC;AAED,eAAsB,0BAA0B;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,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,cAAc,mBAAmB,OAAO;AAAA,MACjE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAED,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,iCAAiC,KAAK,EAAE;AAAA,EAC3E;AACF;",
6
+ "names": []
7
+ }
@@ -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
+ }