@yoryoboy/bi-mcp 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +87 -87
  2. package/bin/bi-mcp.js +9 -9
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/mcp-use.json +2 -2
  7. package/dist/public/icon.svg +6 -6
  8. package/dist/scripts/_helpers.js.map +1 -1
  9. package/dist/scripts/admin-profile-delete.js.map +1 -1
  10. package/dist/scripts/admin-profile-list.js.map +1 -1
  11. package/dist/scripts/admin-profile-upsert.js.map +1 -1
  12. package/dist/scripts/admin-vtex-list.js.map +1 -1
  13. package/dist/scripts/admin-vtex-upsert.js.map +1 -1
  14. package/dist/scripts/admin-vtex-validate.js.map +1 -1
  15. package/dist/scripts/decrypt-secret.js +36 -0
  16. package/dist/scripts/decrypt-secret.js.map +7 -0
  17. package/dist/scripts/run-migrations.js.map +1 -1
  18. package/dist/scripts/test-db-connection.js.map +1 -1
  19. package/dist/src/analytics/ga4-channel-groups.js.map +1 -1
  20. package/dist/src/analytics/ga4-report-utils.js.map +1 -1
  21. package/dist/src/config/benchmarks.js.map +1 -1
  22. package/dist/src/config/google-store.js.map +1 -1
  23. package/dist/src/config/google.js.map +1 -1
  24. package/dist/src/config/mercadolibre-profile-store.js.map +1 -1
  25. package/dist/src/config/mercadolibre.js.map +1 -1
  26. package/dist/src/config/meta.js.map +1 -1
  27. package/dist/src/config/profile-store.js.map +1 -1
  28. package/dist/src/config/vtex-crypto.js.map +1 -1
  29. package/dist/src/config/vtex-profile-store.js.map +1 -1
  30. package/dist/src/config/vtex.js.map +1 -1
  31. package/dist/src/db/client.js.map +1 -1
  32. package/dist/src/meta/meta-utils.js.map +1 -1
  33. package/dist/src/prompts/reporte-ventas.js.map +1 -1
  34. package/dist/src/services/analytics/ga4-client.js.map +1 -1
  35. package/dist/src/services/analytics/oauth.js.map +1 -1
  36. package/dist/src/services/google-ads/google-ads-client.js.map +1 -1
  37. package/dist/src/services/mercadolibre/mercadolibre-api.js.map +1 -1
  38. package/dist/src/services/mercadolibre/mercadolibre-items.js.map +1 -1
  39. package/dist/src/services/mercadolibre/mercadolibre-orders.js +19 -5
  40. package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
  41. package/dist/src/services/mercadolibre/mercadolibre-questions.js.map +1 -1
  42. package/dist/src/services/meta/meta-ads.js.map +1 -1
  43. package/dist/src/services/meta/meta-api.js.map +1 -1
  44. package/dist/src/services/search-console/search-console-client.js.map +1 -1
  45. package/dist/src/services/search-console/search-console-utils.js.map +1 -1
  46. package/dist/src/services/vtex/vtex-api.js.map +1 -1
  47. package/dist/src/services/vtex/vtex-catalog-write.js.map +1 -1
  48. package/dist/src/services/vtex/vtex-catalog.js.map +1 -1
  49. package/dist/src/services/vtex/vtex-logistics.js.map +1 -1
  50. package/dist/src/services/vtex/vtex-orders-write.js.map +1 -1
  51. package/dist/src/services/vtex/vtex-orders.js.map +1 -1
  52. package/dist/src/services/vtex/vtex-pricing-write.js.map +1 -1
  53. package/dist/src/services/vtex/vtex-pricing.js.map +1 -1
  54. package/dist/src/services/vtex/vtex-write.js.map +1 -1
  55. package/dist/src/tools/analytics/attribution-gaps.js.map +1 -1
  56. package/dist/src/tools/analytics/channel-mix.js.map +1 -1
  57. package/dist/src/tools/analytics/ecommerce-tracking-health.js.map +1 -1
  58. package/dist/src/tools/analytics/engagement-overview.js.map +1 -1
  59. package/dist/src/tools/analytics/index.js.map +1 -1
  60. package/dist/src/tools/analytics/list-accessible-properties.js.map +1 -1
  61. package/dist/src/tools/analytics/property-info.js.map +1 -1
  62. package/dist/src/tools/analytics/revenue-by-channel.js.map +1 -1
  63. package/dist/src/tools/analytics/revenue-overview.js.map +1 -1
  64. package/dist/src/tools/analytics/revenue-trend.js.map +1 -1
  65. package/dist/src/tools/analytics/source-medium-breakdown.js.map +1 -1
  66. package/dist/src/tools/analytics/top-landing-pages.js.map +1 -1
  67. package/dist/src/tools/config/check-database-connection.js.map +1 -1
  68. package/dist/src/tools/config/index.js.map +1 -1
  69. package/dist/src/tools/config/list-profiles.js.map +1 -1
  70. package/dist/src/tools/google-ads/account-overview.js.map +1 -1
  71. package/dist/src/tools/google-ads/account-risks.js.map +1 -1
  72. package/dist/src/tools/google-ads/break-even-analysis.js.map +1 -1
  73. package/dist/src/tools/google-ads/campaign-performance.js.map +1 -1
  74. package/dist/src/tools/google-ads/channel-mix.js.map +1 -1
  75. package/dist/src/tools/google-ads/compare-accounts.js.map +1 -1
  76. package/dist/src/tools/google-ads/customer-clients.js.map +1 -1
  77. package/dist/src/tools/google-ads/customer-info.js.map +1 -1
  78. package/dist/src/tools/google-ads/index.js.map +1 -1
  79. package/dist/src/tools/google-ads/scaling-health.js.map +1 -1
  80. package/dist/src/tools/google-ads/search-terms-summary.js.map +1 -1
  81. package/dist/src/tools/google-ads/time-series.js.map +1 -1
  82. package/dist/src/tools/index.js.map +1 -1
  83. package/dist/src/tools/mercadolibre/answer-question.js.map +1 -1
  84. package/dist/src/tools/mercadolibre/create-item.js.map +1 -1
  85. package/dist/src/tools/mercadolibre/estimate-listing-fee.js.map +1 -1
  86. package/dist/src/tools/mercadolibre/get-account-context.js.map +1 -1
  87. package/dist/src/tools/mercadolibre/get-category-requirements.js.map +1 -1
  88. package/dist/src/tools/mercadolibre/get-item-details.js.map +1 -1
  89. package/dist/src/tools/mercadolibre/get-item-visits.js.map +1 -1
  90. package/dist/src/tools/mercadolibre/get-listing-quality.js.map +1 -1
  91. package/dist/src/tools/mercadolibre/get-order-details.js.map +1 -1
  92. package/dist/src/tools/mercadolibre/get-orders-summary.js +670 -38
  93. package/dist/src/tools/mercadolibre/get-orders-summary.js.map +2 -2
  94. package/dist/src/tools/mercadolibre/get-sales-by-item.js.map +1 -1
  95. package/dist/src/tools/mercadolibre/get-sales-trend.js.map +1 -1
  96. package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +1 -1
  97. package/dist/src/tools/mercadolibre/get-store-performance.js.map +1 -1
  98. package/dist/src/tools/mercadolibre/helpers.js +13 -0
  99. package/dist/src/tools/mercadolibre/helpers.js.map +2 -2
  100. package/dist/src/tools/mercadolibre/index.js.map +1 -1
  101. package/dist/src/tools/mercadolibre/pause-or-reactivate-item.js.map +1 -1
  102. package/dist/src/tools/mercadolibre/predict-category.js.map +1 -1
  103. package/dist/src/tools/mercadolibre/profile-resolution.js.map +1 -1
  104. package/dist/src/tools/mercadolibre/search-items.js.map +1 -1
  105. package/dist/src/tools/mercadolibre/search-questions.js.map +1 -1
  106. package/dist/src/tools/mercadolibre/update-item-basic-fields.js.map +1 -1
  107. package/dist/src/tools/mercadolibre/update-item-description.js.map +1 -1
  108. package/dist/src/tools/mercadolibre/update-item-pictures.js.map +1 -1
  109. package/dist/src/tools/mercadolibre/validate-connection.js.map +1 -1
  110. package/dist/src/tools/mercadolibre/write-helpers.js.map +1 -1
  111. package/dist/src/tools/meta/account-overview.js.map +1 -1
  112. package/dist/src/tools/meta/ad-account-info.js.map +1 -1
  113. package/dist/src/tools/meta/ads-performance.js.map +1 -1
  114. package/dist/src/tools/meta/campaign-performance.js.map +1 -1
  115. package/dist/src/tools/meta/index.js.map +1 -1
  116. package/dist/src/tools/meta/list-accessible-ad-accounts.js.map +1 -1
  117. package/dist/src/tools/meta/list-accessible-businesses.js.map +1 -1
  118. package/dist/src/tools/meta/placement-mix.js.map +1 -1
  119. package/dist/src/tools/meta/time-series.js.map +1 -1
  120. package/dist/src/tools/search-console/country-breakdown.js.map +1 -1
  121. package/dist/src/tools/search-console/device-breakdown.js.map +1 -1
  122. package/dist/src/tools/search-console/high-impression-low-click-queries.js.map +1 -1
  123. package/dist/src/tools/search-console/index.js.map +1 -1
  124. package/dist/src/tools/search-console/list-accessible-sites.js.map +1 -1
  125. package/dist/src/tools/search-console/low-ctr-opportunities.js.map +1 -1
  126. package/dist/src/tools/search-console/page-performance.js.map +1 -1
  127. package/dist/src/tools/search-console/product-demand-low-capture-queries.js.map +1 -1
  128. package/dist/src/tools/search-console/query-page-matrix.js.map +1 -1
  129. package/dist/src/tools/search-console/query-performance.js.map +1 -1
  130. package/dist/src/tools/search-console/quick-win-opportunities.js.map +1 -1
  131. package/dist/src/tools/search-console/rising-non-brand-queries.js.map +1 -1
  132. package/dist/src/tools/search-console/search-performance.js.map +1 -1
  133. package/dist/src/tools/search-console/site-context.js.map +1 -1
  134. package/dist/src/tools/search-console/visibility-declines.js.map +1 -1
  135. package/dist/src/tools/vtex/activate-sku.js.map +1 -1
  136. package/dist/src/tools/vtex/add-order-tracking.js.map +1 -1
  137. package/dist/src/tools/vtex/associate-specification.js.map +1 -1
  138. package/dist/src/tools/vtex/attach-catalog-image.js.map +1 -1
  139. package/dist/src/tools/vtex/cancel-order.js.map +1 -1
  140. package/dist/src/tools/vtex/computed-price.js.map +1 -1
  141. package/dist/src/tools/vtex/create-brand.js.map +1 -1
  142. package/dist/src/tools/vtex/create-category.js.map +1 -1
  143. package/dist/src/tools/vtex/create-product-with-sku.js.map +1 -1
  144. package/dist/src/tools/vtex/create-product.js.map +1 -1
  145. package/dist/src/tools/vtex/create-sku.js.map +1 -1
  146. package/dist/src/tools/vtex/create-specification-value.js.map +1 -1
  147. package/dist/src/tools/vtex/create-specification.js.map +1 -1
  148. package/dist/src/tools/vtex/deactivate-sku.js.map +1 -1
  149. package/dist/src/tools/vtex/delete-fixed-price.js.map +1 -1
  150. package/dist/src/tools/vtex/index.js.map +1 -1
  151. package/dist/src/tools/vtex/inventory-check.js.map +1 -1
  152. package/dist/src/tools/vtex/invoice-order.js.map +1 -1
  153. package/dist/src/tools/vtex/order-details.js.map +1 -1
  154. package/dist/src/tools/vtex/orders-summary.js.map +1 -1
  155. package/dist/src/tools/vtex/product-offers.js.map +1 -1
  156. package/dist/src/tools/vtex/profile-resolution.js.map +1 -1
  157. package/dist/src/tools/vtex/sku-offers.js.map +1 -1
  158. package/dist/src/tools/vtex/sku-price.js.map +1 -1
  159. package/dist/src/tools/vtex/toggle-unlimited-quantity.js.map +1 -1
  160. package/dist/src/tools/vtex/update-inventory.js.map +1 -1
  161. package/dist/src/tools/vtex/update-lead-time.js.map +1 -1
  162. package/dist/src/tools/vtex/update-product-basic-fields.js.map +1 -1
  163. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +1 -1
  164. package/dist/src/tools/vtex/update-sku-price.js.map +1 -1
  165. package/dist/src/tools/vtex/upsert-fixed-price.js.map +1 -1
  166. package/dist/src/tools/vtex/warehouse-inventory.js.map +1 -1
  167. package/dist/src/tools/vtex/write-helpers.js.map +1 -1
  168. package/dist/src/utils/case-conversion.js.map +1 -1
  169. package/dist/src/utils/currency.js.map +1 -1
  170. package/dist/src/utils/format-order-details.js.map +1 -1
  171. package/dist/src/utils/google-ads.js.map +1 -1
  172. package/dist/src/utils/money.js.map +1 -1
  173. package/dist/src/utils/order-status.js.map +1 -1
  174. package/dist/src/utils/pagination.js.map +1 -1
  175. package/dist/src/utils/strip-payload.js.map +1 -1
  176. package/dist/src/utils/type-guards.js.map +1 -1
  177. package/package.json +4 -3
  178. package/public/icon.svg +6 -6
  179. package/dist/src/google-ads/report-utils.js +0 -78
  180. package/dist/src/google-ads/report-utils.js.map +0 -7
  181. package/dist/src/search-console/search-console-utils.js +0 -275
  182. package/dist/src/search-console/search-console-utils.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/search-console/query-performance.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\nimport {\n brandTermsSchemaField,\n buildPaginationMetadata,\n buildSearchConsoleQueryBody,\n classifyBrandLabel,\n endDateSchemaField,\n profileIdSchemaField,\n resolveSearchConsoleSiteUrl,\n rowLimitSchemaField,\n searchTypeSchemaField,\n siteUrlSchemaField,\n startDateSchemaField,\n startRowSchemaField,\n sumSearchConsoleRows,\n normalizeSearchConsoleRow,\n} from \"../../services/search-console/search-console-utils.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const searchConsoleQueryPerformanceSchema = z.object({\n startDate: startDateSchemaField,\n endDate: endDateSchemaField,\n siteUrl: siteUrlSchemaField,\n profileId: profileIdSchemaField,\n searchType: searchTypeSchemaField,\n brandTerms: brandTermsSchemaField,\n includeBrand: z\n .enum([\"all\", \"only_brand\", \"only_non_brand\"])\n .optional()\n .describe(\"How to filter the query list when brandTerms are provided.\"),\n rowLimit: rowLimitSchemaField,\n startRow: startRowSchemaField,\n});\n\nexport async function searchConsoleQueryPerformanceHandler(\n params: z.infer<typeof searchConsoleQueryPerformanceSchema>\n) {\n try {\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\n const response = await querySearchConsolePerformance(\n siteUrl,\n buildSearchConsoleQueryBody({\n startDate: params.startDate,\n endDate: params.endDate,\n dimensions: [\"query\"],\n searchType: params.searchType,\n rowLimit: params.rowLimit,\n startRow: params.startRow,\n })\n );\n\n const includeBrand = params.includeBrand ?? \"all\";\n const rows = (response.rows ?? [])\n .map((row) => normalizeSearchConsoleRow(row, [\"query\"]))\n .map((row) => ({\n query: row.dimensions.query,\n clicks: row.clicks,\n impressions: row.impressions,\n ctr_percent: row.ctr_percent,\n position: row.position,\n brand_classification: classifyBrandLabel(row.dimensions.query, params.brandTerms),\n }))\n .filter((row) => {\n if (includeBrand === \"only_brand\") {\n return row.brand_classification === \"brand\";\n }\n\n if (includeBrand === \"only_non_brand\") {\n return row.brand_classification === \"non_brand\";\n }\n\n return true;\n });\n\n const totals = sumSearchConsoleRows(\n rows.map((row) => ({\n keys: [row.query],\n dimensions: { query: row.query },\n clicks: row.clicks,\n impressions: row.impressions,\n ctr_percent: row.ctr_percent,\n position: row.position,\n }))\n );\n\n return object(\n stripNulls({\n site_url: siteUrl,\n date_range: {\n start_date: params.startDate,\n end_date: params.endDate,\n },\n filters: {\n search_type: params.searchType ?? \"web\",\n include_brand: includeBrand,\n brand_terms: params.brandTerms,\n },\n overview: {\n total_clicks: totals.clicks,\n total_impressions: totals.impressions,\n average_ctr_percent: totals.ctrPercent,\n average_position: totals.averagePosition,\n },\n queries: rows,\n metadata: buildPaginationMetadata({\n startRow: params.startRow,\n rowLimit: params.rowLimit,\n returnedRows: response.rows?.length ?? 0,\n }),\n })\n );\n } catch (err) {\n return error(\n err instanceof Error ? err.message : \"Failed to fetch Search Console query performance\"\n );\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\r\nimport {\r\n brandTermsSchemaField,\r\n buildPaginationMetadata,\r\n buildSearchConsoleQueryBody,\r\n classifyBrandLabel,\r\n endDateSchemaField,\r\n profileIdSchemaField,\r\n resolveSearchConsoleSiteUrl,\r\n rowLimitSchemaField,\r\n searchTypeSchemaField,\r\n siteUrlSchemaField,\r\n startDateSchemaField,\r\n startRowSchemaField,\r\n sumSearchConsoleRows,\r\n normalizeSearchConsoleRow,\r\n} from \"../../services/search-console/search-console-utils.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\n\r\nexport const searchConsoleQueryPerformanceSchema = z.object({\r\n startDate: startDateSchemaField,\r\n endDate: endDateSchemaField,\r\n siteUrl: siteUrlSchemaField,\r\n profileId: profileIdSchemaField,\r\n searchType: searchTypeSchemaField,\r\n brandTerms: brandTermsSchemaField,\r\n includeBrand: z\r\n .enum([\"all\", \"only_brand\", \"only_non_brand\"])\r\n .optional()\r\n .describe(\"How to filter the query list when brandTerms are provided.\"),\r\n rowLimit: rowLimitSchemaField,\r\n startRow: startRowSchemaField,\r\n});\r\n\r\nexport async function searchConsoleQueryPerformanceHandler(\r\n params: z.infer<typeof searchConsoleQueryPerformanceSchema>\r\n) {\r\n try {\r\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\r\n const response = await querySearchConsolePerformance(\r\n siteUrl,\r\n buildSearchConsoleQueryBody({\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n dimensions: [\"query\"],\r\n searchType: params.searchType,\r\n rowLimit: params.rowLimit,\r\n startRow: params.startRow,\r\n })\r\n );\r\n\r\n const includeBrand = params.includeBrand ?? \"all\";\r\n const rows = (response.rows ?? [])\r\n .map((row) => normalizeSearchConsoleRow(row, [\"query\"]))\r\n .map((row) => ({\r\n query: row.dimensions.query,\r\n clicks: row.clicks,\r\n impressions: row.impressions,\r\n ctr_percent: row.ctr_percent,\r\n position: row.position,\r\n brand_classification: classifyBrandLabel(row.dimensions.query, params.brandTerms),\r\n }))\r\n .filter((row) => {\r\n if (includeBrand === \"only_brand\") {\r\n return row.brand_classification === \"brand\";\r\n }\r\n\r\n if (includeBrand === \"only_non_brand\") {\r\n return row.brand_classification === \"non_brand\";\r\n }\r\n\r\n return true;\r\n });\r\n\r\n const totals = sumSearchConsoleRows(\r\n rows.map((row) => ({\r\n keys: [row.query],\r\n dimensions: { query: row.query },\r\n clicks: row.clicks,\r\n impressions: row.impressions,\r\n ctr_percent: row.ctr_percent,\r\n position: row.position,\r\n }))\r\n );\r\n\r\n return object(\r\n stripNulls({\r\n site_url: siteUrl,\r\n date_range: {\r\n start_date: params.startDate,\r\n end_date: params.endDate,\r\n },\r\n filters: {\r\n search_type: params.searchType ?? \"web\",\r\n include_brand: includeBrand,\r\n brand_terms: params.brandTerms,\r\n },\r\n overview: {\r\n total_clicks: totals.clicks,\r\n total_impressions: totals.impressions,\r\n average_ctr_percent: totals.ctrPercent,\r\n average_position: totals.averagePosition,\r\n },\r\n queries: rows,\r\n metadata: buildPaginationMetadata({\r\n startRow: params.startRow,\r\n rowLimit: params.rowLimit,\r\n returnedRows: response.rows?.length ?? 0,\r\n }),\r\n })\r\n );\r\n } catch (err) {\r\n return error(\r\n err instanceof Error ? err.message : \"Failed to fetch Search Console query performance\"\r\n );\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,qCAAqC;AAC9C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAEpB,MAAM,sCAAsC,EAAE,OAAO;AAAA,EAC1D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc,EACX,KAAK,CAAC,OAAO,cAAc,gBAAgB,CAAC,EAC5C,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,UAAU;AAAA,EACV,UAAU;AACZ,CAAC;AAED,eAAsB,qCACpB,QACA;AACA,MAAI;AACF,UAAM,UAAU,MAAM,4BAA4B,OAAO,SAAS,OAAO,SAAS;AAClF,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,4BAA4B;AAAA,QAC1B,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,QAChB,YAAY,CAAC,OAAO;AAAA,QACpB,YAAY,OAAO;AAAA,QACnB,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,OAAO,gBAAgB;AAC5C,UAAM,QAAQ,SAAS,QAAQ,CAAC,GAC7B,IAAI,CAAC,QAAQ,0BAA0B,KAAK,CAAC,OAAO,CAAC,CAAC,EACtD,IAAI,CAAC,SAAS;AAAA,MACb,OAAO,IAAI,WAAW;AAAA,MACtB,QAAQ,IAAI;AAAA,MACZ,aAAa,IAAI;AAAA,MACjB,aAAa,IAAI;AAAA,MACjB,UAAU,IAAI;AAAA,MACd,sBAAsB,mBAAmB,IAAI,WAAW,OAAO,OAAO,UAAU;AAAA,IAClF,EAAE,EACD,OAAO,CAAC,QAAQ;AACf,UAAI,iBAAiB,cAAc;AACjC,eAAO,IAAI,yBAAyB;AAAA,MACtC;AAEA,UAAI,iBAAiB,kBAAkB;AACrC,eAAO,IAAI,yBAAyB;AAAA,MACtC;AAEA,aAAO;AAAA,IACT,CAAC;AAEH,UAAM,SAAS;AAAA,MACb,KAAK,IAAI,CAAC,SAAS;AAAA,QACjB,MAAM,CAAC,IAAI,KAAK;AAAA,QAChB,YAAY,EAAE,OAAO,IAAI,MAAM;AAAA,QAC/B,QAAQ,IAAI;AAAA,QACZ,aAAa,IAAI;AAAA,QACjB,aAAa,IAAI;AAAA,QACjB,UAAU,IAAI;AAAA,MAChB,EAAE;AAAA,IACJ;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,UACV,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,QACnB;AAAA,QACA,SAAS;AAAA,UACP,aAAa,OAAO,cAAc;AAAA,UAClC,eAAe;AAAA,UACf,aAAa,OAAO;AAAA,QACtB;AAAA,QACA,UAAU;AAAA,UACR,cAAc,OAAO;AAAA,UACrB,mBAAmB,OAAO;AAAA,UAC1B,qBAAqB,OAAO;AAAA,UAC5B,kBAAkB,OAAO;AAAA,QAC3B;AAAA,QACA,SAAS;AAAA,QACT,UAAU,wBAAwB;AAAA,UAChC,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO;AAAA,UACjB,cAAc,SAAS,MAAM,UAAU;AAAA,QACzC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,eAAe,QAAQ,IAAI,UAAU;AAAA,IACvC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/search-console/quick-win-opportunities.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\nimport {\n brandTermsSchemaField,\n buildSearchConsoleQueryBody,\n classifyBrandLabel,\n classifyQuickWinType,\n endDateSchemaField,\n profileIdSchemaField,\n resolveSearchConsoleSiteUrl,\n scoreQuickWinOpportunity,\n searchTypeSchemaField,\n siteUrlSchemaField,\n startDateSchemaField,\n normalizeSearchConsoleRow,\n} from \"../../services/search-console/search-console-utils.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const searchConsoleQuickWinOpportunitiesSchema = z.object({\n startDate: startDateSchemaField,\n endDate: endDateSchemaField,\n siteUrl: siteUrlSchemaField,\n profileId: profileIdSchemaField,\n searchType: searchTypeSchemaField,\n brandTerms: brandTermsSchemaField,\n minImpressions: z\n .number()\n .min(1)\n .optional()\n .describe(\"Minimum impressions required to consider a quick win.\"),\n quickWinMode: z\n .enum([\"ctr\", \"position\", \"mixed\"])\n .optional()\n .describe(\"Whether to prioritize CTR fixes, ranking improvements, or both.\"),\n});\n\nexport async function searchConsoleQuickWinOpportunitiesHandler(\n params: z.infer<typeof searchConsoleQuickWinOpportunitiesSchema>\n) {\n try {\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\n const minImpressions = params.minImpressions ?? 80;\n const quickWinMode = params.quickWinMode ?? \"mixed\";\n\n const response = await querySearchConsolePerformance(\n siteUrl,\n buildSearchConsoleQueryBody({\n startDate: params.startDate,\n endDate: params.endDate,\n dimensions: [\"query\"],\n searchType: params.searchType,\n rowLimit: 250,\n })\n );\n\n const opportunities = (response.rows ?? [])\n .map((row) => normalizeSearchConsoleRow(row, [\"query\"]))\n .filter((row) => row.impressions >= minImpressions)\n .map((row) => {\n const quickWinType = classifyQuickWinType(row.position, row.ctr_percent);\n return {\n query: row.dimensions.query,\n clicks: row.clicks,\n impressions: row.impressions,\n ctr_percent: row.ctr_percent,\n position: row.position,\n quick_win_type: quickWinType,\n brand_classification: classifyBrandLabel(row.dimensions.query, params.brandTerms),\n opportunity_score: scoreQuickWinOpportunity({\n impressions: row.impressions,\n ctrPercent: row.ctr_percent,\n position: row.position,\n }),\n };\n })\n .filter((row) => {\n if (quickWinMode === \"mixed\") {\n return row.position > 0 && row.position <= 20;\n }\n\n return row.quick_win_type === quickWinMode;\n })\n .sort((left, right) => right.opportunity_score - left.opportunity_score)\n .map((row) => ({\n ...row,\n reason:\n row.quick_win_type === \"ctr\"\n ? \"The query already ranks fairly well, so a CTR lift is the fastest path.\"\n : \"The query has traction, but ranking improvement appears to be the faster lever.\",\n }));\n\n return object(\n stripNulls({\n site_url: siteUrl,\n date_range: {\n start_date: params.startDate,\n end_date: params.endDate,\n },\n thresholds: {\n min_impressions: minImpressions,\n quick_win_mode: quickWinMode,\n },\n opportunities,\n })\n );\n } catch (err) {\n return error(\n err instanceof Error ? err.message : \"Failed to find Search Console quick-win opportunities\"\n );\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\r\nimport {\r\n brandTermsSchemaField,\r\n buildSearchConsoleQueryBody,\r\n classifyBrandLabel,\r\n classifyQuickWinType,\r\n endDateSchemaField,\r\n profileIdSchemaField,\r\n resolveSearchConsoleSiteUrl,\r\n scoreQuickWinOpportunity,\r\n searchTypeSchemaField,\r\n siteUrlSchemaField,\r\n startDateSchemaField,\r\n normalizeSearchConsoleRow,\r\n} from \"../../services/search-console/search-console-utils.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\n\r\nexport const searchConsoleQuickWinOpportunitiesSchema = z.object({\r\n startDate: startDateSchemaField,\r\n endDate: endDateSchemaField,\r\n siteUrl: siteUrlSchemaField,\r\n profileId: profileIdSchemaField,\r\n searchType: searchTypeSchemaField,\r\n brandTerms: brandTermsSchemaField,\r\n minImpressions: z\r\n .number()\r\n .min(1)\r\n .optional()\r\n .describe(\"Minimum impressions required to consider a quick win.\"),\r\n quickWinMode: z\r\n .enum([\"ctr\", \"position\", \"mixed\"])\r\n .optional()\r\n .describe(\"Whether to prioritize CTR fixes, ranking improvements, or both.\"),\r\n});\r\n\r\nexport async function searchConsoleQuickWinOpportunitiesHandler(\r\n params: z.infer<typeof searchConsoleQuickWinOpportunitiesSchema>\r\n) {\r\n try {\r\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\r\n const minImpressions = params.minImpressions ?? 80;\r\n const quickWinMode = params.quickWinMode ?? \"mixed\";\r\n\r\n const response = await querySearchConsolePerformance(\r\n siteUrl,\r\n buildSearchConsoleQueryBody({\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n dimensions: [\"query\"],\r\n searchType: params.searchType,\r\n rowLimit: 250,\r\n })\r\n );\r\n\r\n const opportunities = (response.rows ?? [])\r\n .map((row) => normalizeSearchConsoleRow(row, [\"query\"]))\r\n .filter((row) => row.impressions >= minImpressions)\r\n .map((row) => {\r\n const quickWinType = classifyQuickWinType(row.position, row.ctr_percent);\r\n return {\r\n query: row.dimensions.query,\r\n clicks: row.clicks,\r\n impressions: row.impressions,\r\n ctr_percent: row.ctr_percent,\r\n position: row.position,\r\n quick_win_type: quickWinType,\r\n brand_classification: classifyBrandLabel(row.dimensions.query, params.brandTerms),\r\n opportunity_score: scoreQuickWinOpportunity({\r\n impressions: row.impressions,\r\n ctrPercent: row.ctr_percent,\r\n position: row.position,\r\n }),\r\n };\r\n })\r\n .filter((row) => {\r\n if (quickWinMode === \"mixed\") {\r\n return row.position > 0 && row.position <= 20;\r\n }\r\n\r\n return row.quick_win_type === quickWinMode;\r\n })\r\n .sort((left, right) => right.opportunity_score - left.opportunity_score)\r\n .map((row) => ({\r\n ...row,\r\n reason:\r\n row.quick_win_type === \"ctr\"\r\n ? \"The query already ranks fairly well, so a CTR lift is the fastest path.\"\r\n : \"The query has traction, but ranking improvement appears to be the faster lever.\",\r\n }));\r\n\r\n return object(\r\n stripNulls({\r\n site_url: siteUrl,\r\n date_range: {\r\n start_date: params.startDate,\r\n end_date: params.endDate,\r\n },\r\n thresholds: {\r\n min_impressions: minImpressions,\r\n quick_win_mode: quickWinMode,\r\n },\r\n opportunities,\r\n })\r\n );\r\n } catch (err) {\r\n return error(\r\n err instanceof Error ? err.message : \"Failed to find Search Console quick-win opportunities\"\r\n );\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,qCAAqC;AAC9C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAEpB,MAAM,2CAA2C,EAAE,OAAO;AAAA,EAC/D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB,EACb,OAAO,EACP,IAAI,CAAC,EACL,SAAS,EACT,SAAS,uDAAuD;AAAA,EACnE,cAAc,EACX,KAAK,CAAC,OAAO,YAAY,OAAO,CAAC,EACjC,SAAS,EACT,SAAS,iEAAiE;AAC/E,CAAC;AAED,eAAsB,0CACpB,QACA;AACA,MAAI;AACF,UAAM,UAAU,MAAM,4BAA4B,OAAO,SAAS,OAAO,SAAS;AAClF,UAAM,iBAAiB,OAAO,kBAAkB;AAChD,UAAM,eAAe,OAAO,gBAAgB;AAE5C,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,4BAA4B;AAAA,QAC1B,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,QAChB,YAAY,CAAC,OAAO;AAAA,QACpB,YAAY,OAAO;AAAA,QACnB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,SAAS,QAAQ,CAAC,GACtC,IAAI,CAAC,QAAQ,0BAA0B,KAAK,CAAC,OAAO,CAAC,CAAC,EACtD,OAAO,CAAC,QAAQ,IAAI,eAAe,cAAc,EACjD,IAAI,CAAC,QAAQ;AACZ,YAAM,eAAe,qBAAqB,IAAI,UAAU,IAAI,WAAW;AACvE,aAAO;AAAA,QACL,OAAO,IAAI,WAAW;AAAA,QACtB,QAAQ,IAAI;AAAA,QACZ,aAAa,IAAI;AAAA,QACjB,aAAa,IAAI;AAAA,QACjB,UAAU,IAAI;AAAA,QACd,gBAAgB;AAAA,QAChB,sBAAsB,mBAAmB,IAAI,WAAW,OAAO,OAAO,UAAU;AAAA,QAChF,mBAAmB,yBAAyB;AAAA,UAC1C,aAAa,IAAI;AAAA,UACjB,YAAY,IAAI;AAAA,UAChB,UAAU,IAAI;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,CAAC,EACA,OAAO,CAAC,QAAQ;AACf,UAAI,iBAAiB,SAAS;AAC5B,eAAO,IAAI,WAAW,KAAK,IAAI,YAAY;AAAA,MAC7C;AAEA,aAAO,IAAI,mBAAmB;AAAA,IAChC,CAAC,EACA,KAAK,CAAC,MAAM,UAAU,MAAM,oBAAoB,KAAK,iBAAiB,EACtE,IAAI,CAAC,SAAS;AAAA,MACb,GAAG;AAAA,MACH,QACE,IAAI,mBAAmB,QACnB,4EACA;AAAA,IACR,EAAE;AAEJ,WAAO;AAAA,MACL,WAAW;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,UACV,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,QACnB;AAAA,QACA,YAAY;AAAA,UACV,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,eAAe,QAAQ,IAAI,UAAU;AAAA,IACvC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/search-console/rising-non-brand-queries.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\nimport {\n brandTermsSchemaField,\n buildComparisonMap,\n buildSearchConsoleQueryBody,\n classifyBrandLabel,\n computeChangePercent,\n currentEndDateSchemaField,\n currentStartDateSchemaField,\n previousEndDateSchemaField,\n previousStartDateSchemaField,\n profileIdSchemaField,\n resolveSearchConsoleSiteUrl,\n searchTypeSchemaField,\n siteUrlSchemaField,\n normalizeSearchConsoleRow,\n} from \"../../services/search-console/search-console-utils.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const searchConsoleRisingNonBrandQueriesSchema = z.object({\n currentStartDate: currentStartDateSchemaField,\n currentEndDate: currentEndDateSchemaField,\n previousStartDate: previousStartDateSchemaField,\n previousEndDate: previousEndDateSchemaField,\n siteUrl: siteUrlSchemaField,\n profileId: profileIdSchemaField,\n searchType: searchTypeSchemaField,\n brandTerms: brandTermsSchemaField,\n minImpressions: z\n .number()\n .min(1)\n .optional()\n .describe(\"Minimum current-period impressions required to include a query.\"),\n minGrowthRate: z\n .number()\n .min(0)\n .optional()\n .describe(\"Minimum impressions growth percentage required to consider a query rising.\"),\n});\n\nexport async function searchConsoleRisingNonBrandQueriesHandler(\n params: z.infer<typeof searchConsoleRisingNonBrandQueriesSchema>\n) {\n try {\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\n const minImpressions = params.minImpressions ?? 50;\n const minGrowthRate = params.minGrowthRate ?? 20;\n\n const [currentResponse, previousResponse] = await Promise.all([\n querySearchConsolePerformance(\n siteUrl,\n buildSearchConsoleQueryBody({\n startDate: params.currentStartDate,\n endDate: params.currentEndDate,\n dimensions: [\"query\"],\n searchType: params.searchType,\n rowLimit: 250,\n })\n ),\n querySearchConsolePerformance(\n siteUrl,\n buildSearchConsoleQueryBody({\n startDate: params.previousStartDate,\n endDate: params.previousEndDate,\n dimensions: [\"query\"],\n searchType: params.searchType,\n rowLimit: 250,\n })\n ),\n ]);\n\n const currentRows = (currentResponse.rows ?? []).map((row) =>\n normalizeSearchConsoleRow(row, [\"query\"])\n );\n const previousRows = (previousResponse.rows ?? []).map((row) =>\n normalizeSearchConsoleRow(row, [\"query\"])\n );\n const previousMap = buildComparisonMap(previousRows, (row) => row.dimensions.query);\n\n const risingQueries = currentRows\n .map((row) => {\n const previousRow = previousMap.get(row.dimensions.query);\n return {\n query: row.dimensions.query,\n current_clicks: row.clicks,\n previous_clicks: previousRow?.clicks ?? 0,\n current_impressions: row.impressions,\n previous_impressions: previousRow?.impressions ?? 0,\n current_ctr_percent: row.ctr_percent,\n previous_ctr_percent: previousRow?.ctr_percent ?? 0,\n current_position: row.position,\n previous_position: previousRow?.position ?? 0,\n brand_classification: classifyBrandLabel(row.dimensions.query, params.brandTerms),\n };\n })\n .filter((row) => row.brand_classification === \"non_brand\")\n .filter((row) => row.current_impressions >= minImpressions)\n .map((row) => ({\n ...row,\n impressions_growth_percent: computeChangePercent(\n row.current_impressions,\n row.previous_impressions\n ),\n clicks_growth_percent: computeChangePercent(row.current_clicks, row.previous_clicks),\n }))\n .filter((row) => (row.impressions_growth_percent ?? 0) >= minGrowthRate)\n .sort(\n (left, right) =>\n (right.impressions_growth_percent ?? 0) - (left.impressions_growth_percent ?? 0)\n );\n\n return object(\n stripNulls({\n site_url: siteUrl,\n comparison: {\n current_period: {\n start_date: params.currentStartDate,\n end_date: params.currentEndDate,\n },\n previous_period: {\n start_date: params.previousStartDate,\n end_date: params.previousEndDate,\n },\n },\n thresholds: {\n min_impressions: minImpressions,\n min_growth_rate_percent: minGrowthRate,\n },\n rising_queries: risingQueries,\n })\n );\n } catch (err) {\n return error(\n err instanceof Error ? err.message : \"Failed to find Search Console rising non-brand queries\"\n );\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\r\nimport {\r\n brandTermsSchemaField,\r\n buildComparisonMap,\r\n buildSearchConsoleQueryBody,\r\n classifyBrandLabel,\r\n computeChangePercent,\r\n currentEndDateSchemaField,\r\n currentStartDateSchemaField,\r\n previousEndDateSchemaField,\r\n previousStartDateSchemaField,\r\n profileIdSchemaField,\r\n resolveSearchConsoleSiteUrl,\r\n searchTypeSchemaField,\r\n siteUrlSchemaField,\r\n normalizeSearchConsoleRow,\r\n} from \"../../services/search-console/search-console-utils.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\n\r\nexport const searchConsoleRisingNonBrandQueriesSchema = z.object({\r\n currentStartDate: currentStartDateSchemaField,\r\n currentEndDate: currentEndDateSchemaField,\r\n previousStartDate: previousStartDateSchemaField,\r\n previousEndDate: previousEndDateSchemaField,\r\n siteUrl: siteUrlSchemaField,\r\n profileId: profileIdSchemaField,\r\n searchType: searchTypeSchemaField,\r\n brandTerms: brandTermsSchemaField,\r\n minImpressions: z\r\n .number()\r\n .min(1)\r\n .optional()\r\n .describe(\"Minimum current-period impressions required to include a query.\"),\r\n minGrowthRate: z\r\n .number()\r\n .min(0)\r\n .optional()\r\n .describe(\"Minimum impressions growth percentage required to consider a query rising.\"),\r\n});\r\n\r\nexport async function searchConsoleRisingNonBrandQueriesHandler(\r\n params: z.infer<typeof searchConsoleRisingNonBrandQueriesSchema>\r\n) {\r\n try {\r\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\r\n const minImpressions = params.minImpressions ?? 50;\r\n const minGrowthRate = params.minGrowthRate ?? 20;\r\n\r\n const [currentResponse, previousResponse] = await Promise.all([\r\n querySearchConsolePerformance(\r\n siteUrl,\r\n buildSearchConsoleQueryBody({\r\n startDate: params.currentStartDate,\r\n endDate: params.currentEndDate,\r\n dimensions: [\"query\"],\r\n searchType: params.searchType,\r\n rowLimit: 250,\r\n })\r\n ),\r\n querySearchConsolePerformance(\r\n siteUrl,\r\n buildSearchConsoleQueryBody({\r\n startDate: params.previousStartDate,\r\n endDate: params.previousEndDate,\r\n dimensions: [\"query\"],\r\n searchType: params.searchType,\r\n rowLimit: 250,\r\n })\r\n ),\r\n ]);\r\n\r\n const currentRows = (currentResponse.rows ?? []).map((row) =>\r\n normalizeSearchConsoleRow(row, [\"query\"])\r\n );\r\n const previousRows = (previousResponse.rows ?? []).map((row) =>\r\n normalizeSearchConsoleRow(row, [\"query\"])\r\n );\r\n const previousMap = buildComparisonMap(previousRows, (row) => row.dimensions.query);\r\n\r\n const risingQueries = currentRows\r\n .map((row) => {\r\n const previousRow = previousMap.get(row.dimensions.query);\r\n return {\r\n query: row.dimensions.query,\r\n current_clicks: row.clicks,\r\n previous_clicks: previousRow?.clicks ?? 0,\r\n current_impressions: row.impressions,\r\n previous_impressions: previousRow?.impressions ?? 0,\r\n current_ctr_percent: row.ctr_percent,\r\n previous_ctr_percent: previousRow?.ctr_percent ?? 0,\r\n current_position: row.position,\r\n previous_position: previousRow?.position ?? 0,\r\n brand_classification: classifyBrandLabel(row.dimensions.query, params.brandTerms),\r\n };\r\n })\r\n .filter((row) => row.brand_classification === \"non_brand\")\r\n .filter((row) => row.current_impressions >= minImpressions)\r\n .map((row) => ({\r\n ...row,\r\n impressions_growth_percent: computeChangePercent(\r\n row.current_impressions,\r\n row.previous_impressions\r\n ),\r\n clicks_growth_percent: computeChangePercent(row.current_clicks, row.previous_clicks),\r\n }))\r\n .filter((row) => (row.impressions_growth_percent ?? 0) >= minGrowthRate)\r\n .sort(\r\n (left, right) =>\r\n (right.impressions_growth_percent ?? 0) - (left.impressions_growth_percent ?? 0)\r\n );\r\n\r\n return object(\r\n stripNulls({\r\n site_url: siteUrl,\r\n comparison: {\r\n current_period: {\r\n start_date: params.currentStartDate,\r\n end_date: params.currentEndDate,\r\n },\r\n previous_period: {\r\n start_date: params.previousStartDate,\r\n end_date: params.previousEndDate,\r\n },\r\n },\r\n thresholds: {\r\n min_impressions: minImpressions,\r\n min_growth_rate_percent: minGrowthRate,\r\n },\r\n rising_queries: risingQueries,\r\n })\r\n );\r\n } catch (err) {\r\n return error(\r\n err instanceof Error ? err.message : \"Failed to find Search Console rising non-brand queries\"\r\n );\r\n }\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/search-console/search-performance.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\nimport {\n buildPaginationMetadata,\n buildSearchConsoleQueryBody,\n endDateSchemaField,\n profileIdSchemaField,\n resolveSearchConsoleSiteUrl,\n rowLimitSchemaField,\n searchConsoleAggregationTypes,\n searchConsoleDimensionFilterSchema,\n searchConsoleDimensions,\n searchTypeSchemaField,\n siteUrlSchemaField,\n startDateSchemaField,\n startRowSchemaField,\n sumSearchConsoleRows,\n normalizeSearchConsoleRow,\n} from \"../../services/search-console/search-console-utils.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const searchConsoleSearchPerformanceSchema = z.object({\n startDate: startDateSchemaField,\n endDate: endDateSchemaField,\n siteUrl: siteUrlSchemaField,\n profileId: profileIdSchemaField,\n dimensions: z\n .array(z.enum(searchConsoleDimensions))\n .max(5)\n .optional()\n .describe(\"Dimensions to group the Search Console query by.\"),\n searchType: searchTypeSchemaField,\n dimensionFilters: z\n .array(searchConsoleDimensionFilterSchema)\n .max(10)\n .optional()\n .describe(\"Optional Search Console dimension filters.\"),\n aggregationType: z\n .enum(searchConsoleAggregationTypes)\n .optional()\n .describe(\"Aggregation type for the Search Console query.\"),\n rowLimit: rowLimitSchemaField,\n startRow: startRowSchemaField,\n});\n\nexport async function searchConsoleSearchPerformanceHandler(\n params: z.infer<typeof searchConsoleSearchPerformanceSchema>\n) {\n try {\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\n const dimensions = params.dimensions ?? [];\n const body = buildSearchConsoleQueryBody({\n startDate: params.startDate,\n endDate: params.endDate,\n dimensions,\n searchType: params.searchType,\n dimensionFilters: params.dimensionFilters,\n aggregationType: params.aggregationType,\n rowLimit: params.rowLimit,\n startRow: params.startRow,\n });\n\n const response = await querySearchConsolePerformance(siteUrl, body);\n const rows = (response.rows ?? []).map((row) => normalizeSearchConsoleRow(row, dimensions));\n const totals = sumSearchConsoleRows(rows);\n\n return object(\n stripNulls({\n site_url: siteUrl,\n profile_id: params.profileId?.trim() || undefined,\n date_range: {\n start_date: params.startDate,\n end_date: params.endDate,\n },\n query: {\n dimensions,\n search_type: params.searchType ?? \"web\",\n aggregation_type: params.aggregationType ?? response.responseAggregationType,\n dimension_filters: params.dimensionFilters,\n },\n overview: {\n total_clicks: totals.clicks,\n total_impressions: totals.impressions,\n average_ctr_percent: totals.ctrPercent,\n average_position: totals.averagePosition,\n },\n rows,\n metadata: buildPaginationMetadata({\n startRow: params.startRow,\n rowLimit: params.rowLimit,\n returnedRows: rows.length,\n }),\n })\n );\n } catch (err) {\n return error(\n err instanceof Error ? err.message : \"Failed to fetch Search Console search performance\"\n );\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\r\nimport {\r\n buildPaginationMetadata,\r\n buildSearchConsoleQueryBody,\r\n endDateSchemaField,\r\n profileIdSchemaField,\r\n resolveSearchConsoleSiteUrl,\r\n rowLimitSchemaField,\r\n searchConsoleAggregationTypes,\r\n searchConsoleDimensionFilterSchema,\r\n searchConsoleDimensions,\r\n searchTypeSchemaField,\r\n siteUrlSchemaField,\r\n startDateSchemaField,\r\n startRowSchemaField,\r\n sumSearchConsoleRows,\r\n normalizeSearchConsoleRow,\r\n} from \"../../services/search-console/search-console-utils.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\n\r\nexport const searchConsoleSearchPerformanceSchema = z.object({\r\n startDate: startDateSchemaField,\r\n endDate: endDateSchemaField,\r\n siteUrl: siteUrlSchemaField,\r\n profileId: profileIdSchemaField,\r\n dimensions: z\r\n .array(z.enum(searchConsoleDimensions))\r\n .max(5)\r\n .optional()\r\n .describe(\"Dimensions to group the Search Console query by.\"),\r\n searchType: searchTypeSchemaField,\r\n dimensionFilters: z\r\n .array(searchConsoleDimensionFilterSchema)\r\n .max(10)\r\n .optional()\r\n .describe(\"Optional Search Console dimension filters.\"),\r\n aggregationType: z\r\n .enum(searchConsoleAggregationTypes)\r\n .optional()\r\n .describe(\"Aggregation type for the Search Console query.\"),\r\n rowLimit: rowLimitSchemaField,\r\n startRow: startRowSchemaField,\r\n});\r\n\r\nexport async function searchConsoleSearchPerformanceHandler(\r\n params: z.infer<typeof searchConsoleSearchPerformanceSchema>\r\n) {\r\n try {\r\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\r\n const dimensions = params.dimensions ?? [];\r\n const body = buildSearchConsoleQueryBody({\r\n startDate: params.startDate,\r\n endDate: params.endDate,\r\n dimensions,\r\n searchType: params.searchType,\r\n dimensionFilters: params.dimensionFilters,\r\n aggregationType: params.aggregationType,\r\n rowLimit: params.rowLimit,\r\n startRow: params.startRow,\r\n });\r\n\r\n const response = await querySearchConsolePerformance(siteUrl, body);\r\n const rows = (response.rows ?? []).map((row) => normalizeSearchConsoleRow(row, dimensions));\r\n const totals = sumSearchConsoleRows(rows);\r\n\r\n return object(\r\n stripNulls({\r\n site_url: siteUrl,\r\n profile_id: params.profileId?.trim() || undefined,\r\n date_range: {\r\n start_date: params.startDate,\r\n end_date: params.endDate,\r\n },\r\n query: {\r\n dimensions,\r\n search_type: params.searchType ?? \"web\",\r\n aggregation_type: params.aggregationType ?? response.responseAggregationType,\r\n dimension_filters: params.dimensionFilters,\r\n },\r\n overview: {\r\n total_clicks: totals.clicks,\r\n total_impressions: totals.impressions,\r\n average_ctr_percent: totals.ctrPercent,\r\n average_position: totals.averagePosition,\r\n },\r\n rows,\r\n metadata: buildPaginationMetadata({\r\n startRow: params.startRow,\r\n rowLimit: params.rowLimit,\r\n returnedRows: rows.length,\r\n }),\r\n })\r\n );\r\n } catch (err) {\r\n return error(\r\n err instanceof Error ? err.message : \"Failed to fetch Search Console search performance\"\r\n );\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,qCAAqC;AAC9C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAEpB,MAAM,uCAAuC,EAAE,OAAO;AAAA,EAC3D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY,EACT,MAAM,EAAE,KAAK,uBAAuB,CAAC,EACrC,IAAI,CAAC,EACL,SAAS,EACT,SAAS,kDAAkD;AAAA,EAC9D,YAAY;AAAA,EACZ,kBAAkB,EACf,MAAM,kCAAkC,EACxC,IAAI,EAAE,EACN,SAAS,EACT,SAAS,4CAA4C;AAAA,EACxD,iBAAiB,EACd,KAAK,6BAA6B,EAClC,SAAS,EACT,SAAS,gDAAgD;AAAA,EAC5D,UAAU;AAAA,EACV,UAAU;AACZ,CAAC;AAED,eAAsB,sCACpB,QACA;AACA,MAAI;AACF,UAAM,UAAU,MAAM,4BAA4B,OAAO,SAAS,OAAO,SAAS;AAClF,UAAM,aAAa,OAAO,cAAc,CAAC;AACzC,UAAM,OAAO,4BAA4B;AAAA,MACvC,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,kBAAkB,OAAO;AAAA,MACzB,iBAAiB,OAAO;AAAA,MACxB,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,IACnB,CAAC;AAED,UAAM,WAAW,MAAM,8BAA8B,SAAS,IAAI;AAClE,UAAM,QAAQ,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,0BAA0B,KAAK,UAAU,CAAC;AAC1F,UAAM,SAAS,qBAAqB,IAAI;AAExC,WAAO;AAAA,MACL,WAAW;AAAA,QACT,UAAU;AAAA,QACV,YAAY,OAAO,WAAW,KAAK,KAAK;AAAA,QACxC,YAAY;AAAA,UACV,YAAY,OAAO;AAAA,UACnB,UAAU,OAAO;AAAA,QACnB;AAAA,QACA,OAAO;AAAA,UACL;AAAA,UACA,aAAa,OAAO,cAAc;AAAA,UAClC,kBAAkB,OAAO,mBAAmB,SAAS;AAAA,UACrD,mBAAmB,OAAO;AAAA,QAC5B;AAAA,QACA,UAAU;AAAA,UACR,cAAc,OAAO;AAAA,UACrB,mBAAmB,OAAO;AAAA,UAC1B,qBAAqB,OAAO;AAAA,UAC5B,kBAAkB,OAAO;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,UAAU,wBAAwB;AAAA,UAChC,UAAU,OAAO;AAAA,UACjB,UAAU,OAAO;AAAA,UACjB,cAAc,KAAK;AAAA,QACrB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,eAAe,QAAQ,IAAI,UAAU;AAAA,IACvC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/search-console/site-context.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { listSearchConsoleSites } from \"../../services/search-console/search-console-client.js\";\nimport {\n inferSearchConsolePropertyType,\n profileIdSchemaField,\n resolveSearchConsoleSiteUrl,\n siteUrlSchemaField,\n} from \"../../services/search-console/search-console-utils.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const searchConsoleSiteContextSchema = z.object({\n siteUrl: siteUrlSchemaField,\n profileId: profileIdSchemaField,\n});\n\nexport async function searchConsoleSiteContextHandler(\n params: z.infer<typeof searchConsoleSiteContextSchema>\n) {\n try {\n const resolvedSiteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\n const sites = await listSearchConsoleSites();\n const matchingSite = sites.find((site) => site.siteUrl === resolvedSiteUrl);\n\n if (!matchingSite) {\n throw new Error(\n `Search Console site \"${resolvedSiteUrl}\" is not accessible with the current credentials. Call gsc_list_accessible_sites to see the available properties.`\n );\n }\n\n return object(\n stripNulls({\n site_url: resolvedSiteUrl,\n source: params.siteUrl?.trim() ? \"explicit_parameter\" : \"profile_mapping\",\n property_type: inferSearchConsolePropertyType(resolvedSiteUrl),\n permission_level: matchingSite.permissionLevel?.toLowerCase(),\n profile_id: params.profileId?.trim() || undefined,\n is_accessible: true,\n })\n );\n } catch (err) {\n return error(err instanceof Error ? err.message : \"Failed to resolve Search Console site context\");\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { listSearchConsoleSites } from \"../../services/search-console/search-console-client.js\";\r\nimport {\r\n inferSearchConsolePropertyType,\r\n profileIdSchemaField,\r\n resolveSearchConsoleSiteUrl,\r\n siteUrlSchemaField,\r\n} from \"../../services/search-console/search-console-utils.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\n\r\nexport const searchConsoleSiteContextSchema = z.object({\r\n siteUrl: siteUrlSchemaField,\r\n profileId: profileIdSchemaField,\r\n});\r\n\r\nexport async function searchConsoleSiteContextHandler(\r\n params: z.infer<typeof searchConsoleSiteContextSchema>\r\n) {\r\n try {\r\n const resolvedSiteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\r\n const sites = await listSearchConsoleSites();\r\n const matchingSite = sites.find((site) => site.siteUrl === resolvedSiteUrl);\r\n\r\n if (!matchingSite) {\r\n throw new Error(\r\n `Search Console site \"${resolvedSiteUrl}\" is not accessible with the current credentials. Call gsc_list_accessible_sites to see the available properties.`\r\n );\r\n }\r\n\r\n return object(\r\n stripNulls({\r\n site_url: resolvedSiteUrl,\r\n source: params.siteUrl?.trim() ? \"explicit_parameter\" : \"profile_mapping\",\r\n property_type: inferSearchConsolePropertyType(resolvedSiteUrl),\r\n permission_level: matchingSite.permissionLevel?.toLowerCase(),\r\n profile_id: params.profileId?.trim() || undefined,\r\n is_accessible: true,\r\n })\r\n );\r\n } catch (err) {\r\n return error(err instanceof Error ? err.message : \"Failed to resolve Search Console site context\");\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAEpB,MAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,eAAsB,gCACpB,QACA;AACA,MAAI;AACF,UAAM,kBAAkB,MAAM,4BAA4B,OAAO,SAAS,OAAO,SAAS;AAC1F,UAAM,QAAQ,MAAM,uBAAuB;AAC3C,UAAM,eAAe,MAAM,KAAK,CAAC,SAAS,KAAK,YAAY,eAAe;AAE1E,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI;AAAA,QACR,wBAAwB,eAAe;AAAA,MACzC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,OAAO,SAAS,KAAK,IAAI,uBAAuB;AAAA,QACxD,eAAe,+BAA+B,eAAe;AAAA,QAC7D,kBAAkB,aAAa,iBAAiB,YAAY;AAAA,QAC5D,YAAY,OAAO,WAAW,KAAK,KAAK;AAAA,QACxC,eAAe;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,+CAA+C;AAAA,EACnG;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/search-console/visibility-declines.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\nimport {\n buildComparisonMap,\n buildSearchConsoleQueryBody,\n computeChangePercent,\n currentEndDateSchemaField,\n currentStartDateSchemaField,\n previousEndDateSchemaField,\n previousStartDateSchemaField,\n profileIdSchemaField,\n resolveSearchConsoleSiteUrl,\n searchTypeSchemaField,\n siteUrlSchemaField,\n normalizeSearchConsoleRow,\n} from \"../../services/search-console/search-console-utils.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\n\nexport const searchConsoleVisibilityDeclinesSchema = z.object({\n currentStartDate: currentStartDateSchemaField,\n currentEndDate: currentEndDateSchemaField,\n previousStartDate: previousStartDateSchemaField,\n previousEndDate: previousEndDateSchemaField,\n siteUrl: siteUrlSchemaField,\n profileId: profileIdSchemaField,\n searchType: searchTypeSchemaField,\n entityType: z\n .enum([\"page\", \"pattern\"])\n .optional()\n .describe(\"Analyze individual pages or a filtered page pattern.\"),\n pageContains: z\n .string()\n .optional()\n .describe(\"Optional page substring filter to focus the visibility decline analysis.\"),\n pageRegex: z\n .string()\n .optional()\n .describe(\"Optional regex page filter to focus the decline analysis.\"),\n minImpressions: z\n .number()\n .min(1)\n .optional()\n .describe(\"Minimum previous-period impressions required to include an entity in the decline analysis.\"),\n});\n\nexport async function searchConsoleVisibilityDeclinesHandler(\n params: z.infer<typeof searchConsoleVisibilityDeclinesSchema>\n) {\n try {\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\n const entityType = params.entityType ?? \"page\";\n const minImpressions = params.minImpressions ?? 50;\n const dimensionFilters = [];\n\n if (params.pageContains?.trim()) {\n dimensionFilters.push({\n dimension: \"page\",\n operator: \"contains\",\n expression: params.pageContains.trim(),\n });\n }\n\n if (params.pageRegex?.trim()) {\n dimensionFilters.push({\n dimension: \"page\",\n operator: \"includingRegex\",\n expression: params.pageRegex.trim(),\n });\n }\n\n const [currentResponse, previousResponse] = await Promise.all([\n querySearchConsolePerformance(\n siteUrl,\n buildSearchConsoleQueryBody({\n startDate: params.currentStartDate,\n endDate: params.currentEndDate,\n dimensions: [\"page\"],\n searchType: params.searchType,\n dimensionFilters,\n rowLimit: 250,\n })\n ),\n querySearchConsolePerformance(\n siteUrl,\n buildSearchConsoleQueryBody({\n startDate: params.previousStartDate,\n endDate: params.previousEndDate,\n dimensions: [\"page\"],\n searchType: params.searchType,\n dimensionFilters,\n rowLimit: 250,\n })\n ),\n ]);\n\n const currentRows = (currentResponse.rows ?? []).map((row) =>\n normalizeSearchConsoleRow(row, [\"page\"])\n );\n const previousRows = (previousResponse.rows ?? []).map((row) =>\n normalizeSearchConsoleRow(row, [\"page\"])\n );\n const previousMap = buildComparisonMap(previousRows, (row) => row.dimensions.page);\n\n const currentMap = buildComparisonMap(currentRows, (row) => row.dimensions.page);\n const allPages = new Set([\n ...currentRows.map((row) => row.dimensions.page),\n ...previousRows.map((row) => row.dimensions.page),\n ]);\n\n const declines = Array.from(allPages)\n .map((page) => {\n const currentRow = currentMap.get(page);\n const previousRow = previousMap.get(page);\n return {\n page,\n current_clicks: currentRow?.clicks ?? 0,\n previous_clicks: previousRow?.clicks ?? 0,\n current_impressions: currentRow?.impressions ?? 0,\n previous_impressions: previousRow?.impressions ?? 0,\n current_ctr_percent: currentRow?.ctr_percent ?? 0,\n previous_ctr_percent: previousRow?.ctr_percent ?? 0,\n current_position: currentRow?.position ?? 0,\n previous_position: previousRow?.position ?? 0,\n };\n })\n .filter((row) => row.previous_impressions >= minImpressions)\n .map((row) => ({\n ...row,\n clicks_change_percent: computeChangePercent(row.current_clicks, row.previous_clicks),\n impressions_change_percent: computeChangePercent(\n row.current_impressions,\n row.previous_impressions\n ),\n ctr_change_percent: computeChangePercent(row.current_ctr_percent, row.previous_ctr_percent),\n position_change: row.current_position - row.previous_position,\n }))\n .filter(\n (row) =>\n (row.clicks_change_percent ?? 0) < 0 ||\n (row.impressions_change_percent ?? 0) < 0 ||\n row.position_change > 0\n )\n .sort((left, right) => (left.clicks_change_percent ?? 0) - (right.clicks_change_percent ?? 0));\n\n return object(\n stripNulls({\n site_url: siteUrl,\n comparison: {\n current_period: {\n start_date: params.currentStartDate,\n end_date: params.currentEndDate,\n },\n previous_period: {\n start_date: params.previousStartDate,\n end_date: params.previousEndDate,\n },\n },\n filters: {\n entity_type: entityType,\n page_contains: params.pageContains,\n page_regex: params.pageRegex,\n min_impressions: minImpressions,\n },\n declines,\n })\n );\n } catch (err) {\n return error(\n err instanceof Error ? err.message : \"Failed to detect Search Console visibility declines\"\n );\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { querySearchConsolePerformance } from \"../../services/search-console/search-console-client.js\";\r\nimport {\r\n buildComparisonMap,\r\n buildSearchConsoleQueryBody,\r\n computeChangePercent,\r\n currentEndDateSchemaField,\r\n currentStartDateSchemaField,\r\n previousEndDateSchemaField,\r\n previousStartDateSchemaField,\r\n profileIdSchemaField,\r\n resolveSearchConsoleSiteUrl,\r\n searchTypeSchemaField,\r\n siteUrlSchemaField,\r\n normalizeSearchConsoleRow,\r\n} from \"../../services/search-console/search-console-utils.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\n\r\nexport const searchConsoleVisibilityDeclinesSchema = z.object({\r\n currentStartDate: currentStartDateSchemaField,\r\n currentEndDate: currentEndDateSchemaField,\r\n previousStartDate: previousStartDateSchemaField,\r\n previousEndDate: previousEndDateSchemaField,\r\n siteUrl: siteUrlSchemaField,\r\n profileId: profileIdSchemaField,\r\n searchType: searchTypeSchemaField,\r\n entityType: z\r\n .enum([\"page\", \"pattern\"])\r\n .optional()\r\n .describe(\"Analyze individual pages or a filtered page pattern.\"),\r\n pageContains: z\r\n .string()\r\n .optional()\r\n .describe(\"Optional page substring filter to focus the visibility decline analysis.\"),\r\n pageRegex: z\r\n .string()\r\n .optional()\r\n .describe(\"Optional regex page filter to focus the decline analysis.\"),\r\n minImpressions: z\r\n .number()\r\n .min(1)\r\n .optional()\r\n .describe(\"Minimum previous-period impressions required to include an entity in the decline analysis.\"),\r\n});\r\n\r\nexport async function searchConsoleVisibilityDeclinesHandler(\r\n params: z.infer<typeof searchConsoleVisibilityDeclinesSchema>\r\n) {\r\n try {\r\n const siteUrl = await resolveSearchConsoleSiteUrl(params.siteUrl, params.profileId);\r\n const entityType = params.entityType ?? \"page\";\r\n const minImpressions = params.minImpressions ?? 50;\r\n const dimensionFilters = [];\r\n\r\n if (params.pageContains?.trim()) {\r\n dimensionFilters.push({\r\n dimension: \"page\",\r\n operator: \"contains\",\r\n expression: params.pageContains.trim(),\r\n });\r\n }\r\n\r\n if (params.pageRegex?.trim()) {\r\n dimensionFilters.push({\r\n dimension: \"page\",\r\n operator: \"includingRegex\",\r\n expression: params.pageRegex.trim(),\r\n });\r\n }\r\n\r\n const [currentResponse, previousResponse] = await Promise.all([\r\n querySearchConsolePerformance(\r\n siteUrl,\r\n buildSearchConsoleQueryBody({\r\n startDate: params.currentStartDate,\r\n endDate: params.currentEndDate,\r\n dimensions: [\"page\"],\r\n searchType: params.searchType,\r\n dimensionFilters,\r\n rowLimit: 250,\r\n })\r\n ),\r\n querySearchConsolePerformance(\r\n siteUrl,\r\n buildSearchConsoleQueryBody({\r\n startDate: params.previousStartDate,\r\n endDate: params.previousEndDate,\r\n dimensions: [\"page\"],\r\n searchType: params.searchType,\r\n dimensionFilters,\r\n rowLimit: 250,\r\n })\r\n ),\r\n ]);\r\n\r\n const currentRows = (currentResponse.rows ?? []).map((row) =>\r\n normalizeSearchConsoleRow(row, [\"page\"])\r\n );\r\n const previousRows = (previousResponse.rows ?? []).map((row) =>\r\n normalizeSearchConsoleRow(row, [\"page\"])\r\n );\r\n const previousMap = buildComparisonMap(previousRows, (row) => row.dimensions.page);\r\n\r\n const currentMap = buildComparisonMap(currentRows, (row) => row.dimensions.page);\r\n const allPages = new Set([\r\n ...currentRows.map((row) => row.dimensions.page),\r\n ...previousRows.map((row) => row.dimensions.page),\r\n ]);\r\n\r\n const declines = Array.from(allPages)\r\n .map((page) => {\r\n const currentRow = currentMap.get(page);\r\n const previousRow = previousMap.get(page);\r\n return {\r\n page,\r\n current_clicks: currentRow?.clicks ?? 0,\r\n previous_clicks: previousRow?.clicks ?? 0,\r\n current_impressions: currentRow?.impressions ?? 0,\r\n previous_impressions: previousRow?.impressions ?? 0,\r\n current_ctr_percent: currentRow?.ctr_percent ?? 0,\r\n previous_ctr_percent: previousRow?.ctr_percent ?? 0,\r\n current_position: currentRow?.position ?? 0,\r\n previous_position: previousRow?.position ?? 0,\r\n };\r\n })\r\n .filter((row) => row.previous_impressions >= minImpressions)\r\n .map((row) => ({\r\n ...row,\r\n clicks_change_percent: computeChangePercent(row.current_clicks, row.previous_clicks),\r\n impressions_change_percent: computeChangePercent(\r\n row.current_impressions,\r\n row.previous_impressions\r\n ),\r\n ctr_change_percent: computeChangePercent(row.current_ctr_percent, row.previous_ctr_percent),\r\n position_change: row.current_position - row.previous_position,\r\n }))\r\n .filter(\r\n (row) =>\r\n (row.clicks_change_percent ?? 0) < 0 ||\r\n (row.impressions_change_percent ?? 0) < 0 ||\r\n row.position_change > 0\r\n )\r\n .sort((left, right) => (left.clicks_change_percent ?? 0) - (right.clicks_change_percent ?? 0));\r\n\r\n return object(\r\n stripNulls({\r\n site_url: siteUrl,\r\n comparison: {\r\n current_period: {\r\n start_date: params.currentStartDate,\r\n end_date: params.currentEndDate,\r\n },\r\n previous_period: {\r\n start_date: params.previousStartDate,\r\n end_date: params.previousEndDate,\r\n },\r\n },\r\n filters: {\r\n entity_type: entityType,\r\n page_contains: params.pageContains,\r\n page_regex: params.pageRegex,\r\n min_impressions: minImpressions,\r\n },\r\n declines,\r\n })\r\n );\r\n } catch (err) {\r\n return error(\r\n err instanceof Error ? err.message : \"Failed to detect Search Console visibility declines\"\r\n );\r\n }\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n buildSkuUpdatePayload,\r\n getSku,\r\n updateSku,\r\n} from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const activateSkuSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n skuId: z.string().min(1).describe(\"VTEX SKU identifier to activate.\"),\r\n});\r\n\r\nexport async function activateSkuHandler({\r\n profileId,\r\n skuId,\r\n}: z.infer<typeof activateSkuSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const beforeSku = await getSku(resolvedProfileId, skuId);\r\n const afterSku = await updateSku(\r\n resolvedProfileId,\r\n skuId,\r\n buildSkuUpdatePayload(beforeSku, { isActive: true })\r\n );\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"activate_sku\",\r\n resourceId: skuId,\r\n riskLevel: \"low\",\r\n message: \"SKU activated successfully.\",\r\n before: beforeSku,\r\n after: afterSku,\r\n details: {\r\n sku_id: skuId,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, `Failed to activate SKU ${skuId}`);\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n getOrderStateSnapshot,\r\n updateOrderTrackingStatus,\r\n updatePartialInvoiceTracking,\r\n validateOrderForTracking,\r\n} from \"../../services/vtex/vtex-orders-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n confirmationNoteSchemaField,\r\n confirmationSchemaField,\r\n handleVtexWriteError,\r\n requireExplicitConfirmation,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nconst trackingEventSchema = z.object({\r\n city: z.string().min(1).describe(\"Tracking event city.\"),\r\n state: z.string().min(1).describe(\"Tracking event state.\"),\r\n description: z.string().min(1).describe(\"Tracking event description.\"),\r\n date: z.string().min(1).describe(\"Tracking event date string.\"),\r\n});\r\n\r\nexport const addOrderTrackingSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n orderId: z.string().min(1).describe(\"VTEX order identifier.\"),\r\n invoiceNumber: z.string().min(1).describe(\"Invoice number that will receive tracking data.\"),\r\n confirmed: confirmationSchemaField,\r\n confirmationNote: confirmationNoteSchemaField,\r\n trackingNumber: z.string().min(1).describe(\"Tracking number.\"),\r\n trackingUrl: z.string().url().optional().describe(\"Tracking URL.\"),\r\n courier: z.string().optional().describe(\"Carrier name.\"),\r\n dispatchedDate: z.string().min(1).describe(\"Dispatch timestamp.\"),\r\n isDelivered: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Optional delivery status to send to VTEX tracking timeline.\"),\r\n deliveredDate: z\r\n .string()\r\n .optional()\r\n .describe(\"Optional delivered date in `yyyy-mm-dd hh:mm` format.\"),\r\n events: z.array(trackingEventSchema).optional().describe(\"Optional tracking events timeline.\"),\r\n});\r\n\r\nexport async function addOrderTrackingHandler({\r\n profileId,\r\n orderId,\r\n invoiceNumber,\r\n confirmed,\r\n confirmationNote,\r\n trackingNumber,\r\n trackingUrl,\r\n courier,\r\n dispatchedDate,\r\n isDelivered,\r\n deliveredDate,\r\n events,\r\n}: z.infer<typeof addOrderTrackingSchema>) {\r\n const confirmationResponse = requireExplicitConfirmation(confirmed, \"add_order_tracking\", {\r\n order_id: orderId,\r\n invoice_number: invoiceNumber,\r\n });\r\n if (confirmationResponse) {\r\n return confirmationResponse;\r\n }\r\n\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const beforeOrder = await validateOrderForTracking(resolvedProfileId, orderId, invoiceNumber);\r\n\r\n await updatePartialInvoiceTracking(resolvedProfileId, orderId, invoiceNumber, {\r\n trackingNumber,\r\n trackingUrl,\r\n courier,\r\n dispatchedDate,\r\n });\r\n\r\n if (events?.length || isDelivered !== undefined) {\r\n await updateOrderTrackingStatus(resolvedProfileId, orderId, invoiceNumber, {\r\n isDelivered: isDelivered ?? false,\r\n deliveredDate: deliveredDate ?? null,\r\n events: events ?? [],\r\n });\r\n }\r\n\r\n const afterOrder = await getOrderStateSnapshot(resolvedProfileId, orderId);\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"add_order_tracking\",\r\n resourceId: orderId,\r\n riskLevel: \"high\",\r\n confirmed: true,\r\n confirmationNote,\r\n message: \"Order tracking updated successfully.\",\r\n before: beforeOrder as unknown as Record<string, unknown>,\r\n after: afterOrder as unknown as Record<string, unknown>,\r\n details: {\r\n order_id: orderId,\r\n invoice_number: invoiceNumber,\r\n tracking_number: trackingNumber,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, `Failed to update tracking for order ${orderId}`);\r\n }\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n associateProductSpecification,\r\n associateSkuSpecification,\r\n} from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const associateSpecificationSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n entityType: z.enum([\"product\", \"sku\"]).describe(\"Whether the specification should be associated to a product or an SKU.\"),\r\n resourceId: z.string().min(1).describe(\"Product ID or SKU ID depending on entityType.\"),\r\n fieldId: z.number().int().positive().describe(\"Specification field ID.\"),\r\n fieldValueId: z\r\n .number()\r\n .int()\r\n .positive()\r\n .optional()\r\n .describe(\"Specification value ID. Required for combo, radio, and checkbox fields.\"),\r\n text: z\r\n .string()\r\n .optional()\r\n .describe(\"Raw text value. Use for free text specifications instead of fieldValueId.\"),\r\n});\r\n\r\nexport async function associateSpecificationHandler({\r\n profileId,\r\n entityType,\r\n resourceId,\r\n fieldId,\r\n fieldValueId,\r\n text,\r\n}: z.infer<typeof associateSpecificationSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const payload: Record<string, unknown> = {\r\n FieldId: fieldId,\r\n };\r\n if (fieldValueId !== undefined) payload.FieldValueId = fieldValueId;\r\n if (text !== undefined) payload.Text = text;\r\n\r\n const association =\r\n entityType === \"product\"\r\n ? await associateProductSpecification(resolvedProfileId, resourceId, payload)\r\n : await associateSkuSpecification(resolvedProfileId, resourceId, payload);\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"associate_specification\",\r\n resourceId,\r\n riskLevel: \"low\",\r\n message: \"Specification associated successfully.\",\r\n before: null,\r\n after: association,\r\n details: {\r\n entity_type: entityType,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, `Failed to associate specification to ${entityType} ${resourceId}`);\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,+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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createSkuFile } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const attachCatalogImageSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n skuId: z.string().min(1).describe(\"SKU identifier that will receive the image.\"),\r\n name: z.string().min(1).describe(\"Image name.\"),\r\n url: z\r\n .string()\r\n .url()\r\n .describe(\"Public image URL. VTEX expects http(s) and a valid image extension.\"),\r\n isMain: z.boolean().optional().describe(\"Whether this image should be the main image.\"),\r\n label: z.string().optional().describe(\"Optional image label.\"),\r\n text: z.string().optional().describe(\"Optional image text.\"),\r\n position: z.number().int().nonnegative().optional().describe(\"Image position in storefront.\"),\r\n});\r\n\r\nexport async function attachCatalogImageHandler({\r\n profileId,\r\n skuId,\r\n name,\r\n url,\r\n isMain,\r\n label,\r\n text,\r\n position,\r\n}: z.infer<typeof attachCatalogImageSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const createdImage = await createSkuFile(resolvedProfileId, skuId, {\r\n Name: name,\r\n Url: url,\r\n IsMain: isMain,\r\n Label: label,\r\n Text: text,\r\n Position: position,\r\n });\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"attach_catalog_image\",\r\n resourceId: skuId,\r\n riskLevel: \"low\",\r\n message: \"Catalog image attached successfully.\",\r\n before: null,\r\n after: createdImage,\r\n details: {\r\n sku_id: skuId,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, `Failed to attach image to SKU ${skuId}`);\r\n }\r\n}\r\n"],
5
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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport {\r\n cancelOrder,\r\n getOrderStateSnapshot,\r\n validateOrderForCancellation,\r\n} from \"../../services/vtex/vtex-orders-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n confirmationNoteSchemaField,\r\n confirmationSchemaField,\r\n handleVtexWriteError,\r\n requireExplicitConfirmation,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const cancelOrderSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n orderId: z.string().min(1).describe(\"VTEX order identifier to cancel.\"),\r\n confirmed: confirmationSchemaField,\r\n reason: z\r\n .string()\r\n .trim()\r\n .min(1)\r\n .describe(\"Reason for canceling the order. VTEX persists this reason.\")\r\n .optional(),\r\n confirmationNote: confirmationNoteSchemaField,\r\n});\r\n\r\nexport async function cancelOrderHandler({\r\n profileId,\r\n orderId,\r\n confirmed,\r\n reason,\r\n confirmationNote,\r\n}: z.infer<typeof cancelOrderSchema>) {\r\n const confirmationResponse = requireExplicitConfirmation(confirmed, \"cancel_order\", {\r\n order_id: orderId,\r\n });\r\n if (confirmationResponse) {\r\n return confirmationResponse;\r\n }\r\n\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const beforeOrder = await validateOrderForCancellation(resolvedProfileId, orderId, reason);\r\n await cancelOrder(resolvedProfileId, orderId, reason);\r\n const afterOrder = await getOrderStateSnapshot(resolvedProfileId, orderId, reason);\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"cancel_order\",\r\n resourceId: orderId,\r\n riskLevel: \"high\",\r\n confirmed: true,\r\n confirmationNote,\r\n message: \"Order canceled successfully.\",\r\n before: beforeOrder as unknown as Record<string, unknown>,\r\n after: afterOrder as unknown as Record<string, unknown>,\r\n details: {\r\n order_id: orderId,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, `Failed to cancel order ${orderId}`);\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS;AAElB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/computed-price.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { getComputedPrice } from \"../../services/vtex/vtex-pricing.js\";\nimport { moneyFromCentsOptional } from \"../../utils/money.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nexport const computedPriceSchema = z.object({\n profileId: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\n ),\n itemId: z.string().min(1).describe(\"SKU item identifier\"),\n priceTableId: z.string().min(1).describe(\"Price table or trade policy identifier\"),\n categoryId: z.number().int().positive().describe(\"Category identifier\"),\n brandId: z.number().int().positive().describe(\"Brand identifier\"),\n quantity: z.number().int().positive().describe(\"SKU quantity context\"),\n});\n\nexport async function computedPriceHandler({\n profileId,\n itemId,\n priceTableId,\n categoryId,\n brandId,\n quantity,\n}: z.infer<typeof computedPriceSchema>) {\n try {\n const profileResolution = await resolveVtexProfileOrSelection(profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const computedPrice = await getComputedPrice(resolvedProfileId, itemId, priceTableId, {\n categoryId,\n brandId,\n quantity,\n });\n\n return object(\n stripNulls({\n profile_id: resolvedProfileId,\n item_id: itemId,\n price_table_id: priceTableId,\n trade_policy_id: computedPrice.tradePolicyId,\n list_price: moneyFromCentsOptional(computedPrice.listPrice),\n cost_price: moneyFromCentsOptional(computedPrice.costPrice),\n selling_price: moneyFromCentsOptional(computedPrice.sellingPrice),\n price_valid_until: computedPrice.priceValidUntil,\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch computed price for item ${itemId} and table ${priceTableId}`)\n );\n }\n}\n"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\r\nimport { getComputedPrice } from \"../../services/vtex/vtex-pricing.js\";\r\nimport { moneyFromCentsOptional } from \"../../utils/money.js\";\r\nimport { stripNulls } from \"../../utils/strip-payload.js\";\r\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\r\n\r\nexport const computedPriceSchema = z.object({\r\n profileId: z\r\n .string()\r\n .trim()\r\n .min(1)\r\n .optional()\r\n .describe(\r\n \"Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\r\n ),\r\n itemId: z.string().min(1).describe(\"SKU item identifier\"),\r\n priceTableId: z.string().min(1).describe(\"Price table or trade policy identifier\"),\r\n categoryId: z.number().int().positive().describe(\"Category identifier\"),\r\n brandId: z.number().int().positive().describe(\"Brand identifier\"),\r\n quantity: z.number().int().positive().describe(\"SKU quantity context\"),\r\n});\r\n\r\nexport async function computedPriceHandler({\r\n profileId,\r\n itemId,\r\n priceTableId,\r\n categoryId,\r\n brandId,\r\n quantity,\r\n}: z.infer<typeof computedPriceSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexProfileOrSelection(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const computedPrice = await getComputedPrice(resolvedProfileId, itemId, priceTableId, {\r\n categoryId,\r\n brandId,\r\n quantity,\r\n });\r\n\r\n return object(\r\n stripNulls({\r\n profile_id: resolvedProfileId,\r\n item_id: itemId,\r\n price_table_id: priceTableId,\r\n trade_policy_id: computedPrice.tradePolicyId,\r\n list_price: moneyFromCentsOptional(computedPrice.listPrice),\r\n cost_price: moneyFromCentsOptional(computedPrice.costPrice),\r\n selling_price: moneyFromCentsOptional(computedPrice.sellingPrice),\r\n price_valid_until: computedPrice.priceValidUntil,\r\n })\r\n );\r\n } catch (err) {\r\n return error(\r\n formatVtexError(err, `Failed to fetch computed price for item ${itemId} and table ${priceTableId}`)\r\n );\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAC3B,SAAS,qCAAqC;AAEvC,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,WAAW,EACR,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,qBAAqB;AAAA,EACxD,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,wCAAwC;AAAA,EACjF,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,EACtE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAChE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,sBAAsB;AACvE,CAAC;AAED,eAAsB,qBAAqB;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,MAAI;AACF,UAAM,oBAAoB,MAAM,8BAA8B,SAAS;AACvE,QAAI,CAAC,kBAAkB,IAAI;AACzB,aAAO,kBAAkB;AAAA,IAC3B;AAEA,UAAM,oBAAoB,kBAAkB,MAAM;AAClD,UAAM,gBAAgB,MAAM,iBAAiB,mBAAmB,QAAQ,cAAc;AAAA,MACpF;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,iBAAiB,cAAc;AAAA,QAC/B,YAAY,uBAAuB,cAAc,SAAS;AAAA,QAC1D,YAAY,uBAAuB,cAAc,SAAS;AAAA,QAC1D,eAAe,uBAAuB,cAAc,YAAY;AAAA,QAChE,mBAAmB,cAAc;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,gBAAgB,KAAK,2CAA2C,MAAM,cAAc,YAAY,EAAE;AAAA,IACpG;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createBrand } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const createBrandSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n id: z.number().int().positive().describe(\"Brand ID required by VTEX Catalog API.\"),\r\n name: z.string().min(1).describe(\"Brand name.\"),\r\n text: z.string().optional().describe(\"Meta description text.\"),\r\n keywords: z.string().optional().describe(\"Alternative search terms.\"),\r\n siteTitle: z.string().optional().describe(\"Brand page title.\"),\r\n active: z.boolean().optional().describe(\"Whether the brand should be active.\"),\r\n menuHome: z.boolean().optional().describe(\"Whether the brand should appear in the home menu.\"),\r\n linkId: z.string().optional().describe(\"Brand slug.\"),\r\n score: z.number().int().optional().describe(\"Search score.\"),\r\n});\r\n\r\nexport async function createBrandHandler({\r\n profileId,\r\n id,\r\n name,\r\n text,\r\n keywords,\r\n siteTitle,\r\n active,\r\n menuHome,\r\n linkId,\r\n score,\r\n}: z.infer<typeof createBrandSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const createdBrand = await createBrand(resolvedProfileId, {\r\n Id: id,\r\n Name: name,\r\n Text: text ?? name,\r\n Keywords: keywords ?? \"\",\r\n SiteTitle: siteTitle ?? name,\r\n Active: active ?? true,\r\n MenuHome: menuHome ?? false,\r\n LinkId: linkId,\r\n Score: score ?? null,\r\n AdWordsRemarketingCode: null,\r\n LomadeeCampaignCode: null,\r\n });\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"create_brand\",\r\n resourceId: String(createdBrand.Id ?? id),\r\n riskLevel: \"low\",\r\n message: \"Brand created successfully.\",\r\n before: null,\r\n after: createdBrand,\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, \"Failed to create brand in VTEX\");\r\n }\r\n}\r\n"],
5
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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createCategory } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const createCategorySchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n id: z.number().int().positive().optional().describe(\"Optional category ID. VTEX can generate it.\"),\r\n name: z.string().min(1).describe(\"Category name.\"),\r\n title: z.string().min(1).describe(\"Category page title.\"),\r\n description: z.string().min(1).describe(\"Category meta description.\"),\r\n fatherCategoryId: z\r\n .number()\r\n .int()\r\n .positive()\r\n .nullable()\r\n .optional()\r\n .describe(\"Parent category ID. Use null for a top-level category.\"),\r\n globalCategoryId: z.number().int().nonnegative().describe(\"Google global category ID.\"),\r\n stockKeepingUnitSelectionMode: z\r\n .enum([\"SPECIFICATION\", \"LIST\"])\r\n .describe(\"How shoppers should choose SKUs in storefront.\"),\r\n keywords: z.string().optional().describe(\"Alternative search terms.\"),\r\n showInStoreFront: z.boolean().optional().describe(\"Whether the category should appear in menus.\"),\r\n isActive: z.boolean().optional().describe(\"Whether the category should be active.\"),\r\n activeStoreFrontLink: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Whether the category link should be active in storefront.\"),\r\n showBrandFilter: z.boolean().optional().describe(\"Whether the category page should show brand filters.\"),\r\n score: z.number().int().nullable().optional().describe(\"Search score.\"),\r\n});\r\n\r\nexport async function createCategoryHandler({\r\n profileId,\r\n id,\r\n name,\r\n title,\r\n description,\r\n fatherCategoryId,\r\n globalCategoryId,\r\n stockKeepingUnitSelectionMode,\r\n keywords,\r\n showInStoreFront,\r\n isActive,\r\n activeStoreFrontLink,\r\n showBrandFilter,\r\n score,\r\n}: z.infer<typeof createCategorySchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const createdCategory = await createCategory(resolvedProfileId, {\r\n Id: id,\r\n Name: name,\r\n Keywords: keywords ?? \"\",\r\n Title: title,\r\n Description: description,\r\n AdWordsRemarketingCode: null,\r\n LomadeeCampaignCode: null,\r\n FatherCategoryId: fatherCategoryId ?? null,\r\n GlobalCategoryId: globalCategoryId,\r\n ShowInStoreFront: showInStoreFront ?? true,\r\n IsActive: isActive ?? true,\r\n ActiveStoreFrontLink: activeStoreFrontLink ?? true,\r\n ShowBrandFilter: showBrandFilter ?? true,\r\n Score: score ?? null,\r\n StockKeepingUnitSelectionMode: stockKeepingUnitSelectionMode,\r\n });\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"create_category\",\r\n resourceId: String(createdCategory.Id ?? id ?? \"\"),\r\n riskLevel: \"low\",\r\n message: \"Category created successfully.\",\r\n before: null,\r\n after: createdCategory,\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, \"Failed to create category in VTEX\");\r\n }\r\n}\r\n"],
5
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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createProduct, createSku, createSkuEan } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nconst productInputSchema = z\r\n .object({\r\n name: z.string().min(1).describe(\"Product name.\"),\r\n categoryId: z.number().int().positive().optional().describe(\"Existing category ID.\"),\r\n categoryPath: z.string().min(1).optional().describe(\"Category path to create or reuse.\"),\r\n brandId: z.number().int().positive().optional().describe(\"Existing brand ID.\"),\r\n brandName: z.string().min(1).optional().describe(\"Brand name to create or reuse.\"),\r\n departmentId: z.number().int().positive().optional().describe(\"Department ID.\"),\r\n refId: z.string().optional().describe(\"Product reference code.\"),\r\n title: z.string().optional().describe(\"SEO title.\"),\r\n description: z.string().optional().describe(\"Product description.\"),\r\n descriptionShort: z.string().optional().describe(\"Short description.\"),\r\n linkId: z.string().optional().describe(\"Product slug.\"),\r\n })\r\n .refine((value) => value.categoryId !== undefined || value.categoryPath !== undefined, {\r\n message: \"Provide either categoryId or categoryPath for the product.\",\r\n path: [\"categoryId\"],\r\n })\r\n .refine((value) => value.brandId !== undefined || value.brandName !== undefined, {\r\n message: \"Provide either brandId or brandName for the product.\",\r\n path: [\"brandId\"],\r\n });\r\n\r\nconst skuInputSchema = z.object({\r\n name: z.string().min(1).describe(\"SKU name.\"),\r\n refId: z.string().min(1).describe(\"Internal SKU reference code.\"),\r\n ean: z.string().optional().describe(\"Optional EAN to attach after creation.\"),\r\n packagedHeight: z.number().nonnegative().describe(\"Packaged height.\"),\r\n packagedLength: z.number().nonnegative().describe(\"Packaged length.\"),\r\n packagedWidth: z.number().nonnegative().describe(\"Packaged width.\"),\r\n packagedWeightKg: z.number().nonnegative().describe(\"Packaged weight in kg.\"),\r\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\r\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\r\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\r\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\r\n activateIfPossible: z.boolean().optional().describe(\"Whether VTEX should auto-activate the SKU.\"),\r\n measurementUnit: z.string().optional().describe(\"Measurement unit.\"),\r\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\r\n});\r\n\r\nexport const createProductWithSkuSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n product: productInputSchema.describe(\"Product payload.\"),\r\n sku: skuInputSchema.describe(\"SKU payload.\"),\r\n});\r\n\r\nexport async function createProductWithSkuHandler({\r\n profileId,\r\n product,\r\n sku,\r\n}: z.infer<typeof createProductWithSkuSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const createdProduct = await createProduct(resolvedProfileId, {\r\n Name: product.name,\r\n CategoryId: product.categoryId,\r\n CategoryPath: product.categoryPath,\r\n BrandId: product.brandId,\r\n BrandName: product.brandName,\r\n DepartmentId: product.departmentId,\r\n RefId: product.refId,\r\n Title: product.title,\r\n Description: product.description,\r\n DescriptionShort: product.descriptionShort,\r\n LinkId: product.linkId,\r\n });\r\n\r\n const productId = Number(createdProduct.Id);\r\n const createdSku = await createSku(resolvedProfileId, {\r\n ProductId: productId,\r\n Name: sku.name,\r\n RefId: sku.refId,\r\n PackagedHeight: sku.packagedHeight,\r\n PackagedLength: sku.packagedLength,\r\n PackagedWidth: sku.packagedWidth,\r\n PackagedWeightKg: sku.packagedWeightKg,\r\n Height: sku.height,\r\n Length: sku.length,\r\n Width: sku.width,\r\n WeightKg: sku.weightKg,\r\n ActivateIfPossible: sku.activateIfPossible ?? true,\r\n IsActive: false,\r\n MeasurementUnit: sku.measurementUnit,\r\n UnitMultiplier: sku.unitMultiplier,\r\n });\r\n\r\n const skuId = createdSku.Id == null ? undefined : String(createdSku.Id);\r\n if (skuId && sku.ean?.trim()) {\r\n await createSkuEan(resolvedProfileId, skuId, sku.ean.trim());\r\n createdSku.Eans = [sku.ean.trim()];\r\n }\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"create_product_with_sku\",\r\n resourceId: String(createdProduct.Id),\r\n riskLevel: \"low\",\r\n message: \"Product and SKU created successfully.\",\r\n before: null,\r\n after: {\r\n product: createdProduct,\r\n sku: createdSku,\r\n },\r\n details: {\r\n product_id: createdProduct.Id,\r\n sku_id: createdSku.Id,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, \"Failed to create product with SKU in VTEX\");\r\n }\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/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"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createProduct } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const createProductSchema = z\r\n .object({\r\n profileId: vtexProfileIdSchemaField,\r\n name: z.string().min(1).describe(\"Product name.\"),\r\n categoryId: z.number().int().positive().optional().describe(\"Existing VTEX category ID.\"),\r\n categoryPath: z\r\n .string()\r\n .min(1)\r\n .optional()\r\n .describe(\"Category path to create or reuse, for example `Mens/Clothing/T-Shirts`.\"),\r\n brandId: z.number().int().positive().optional().describe(\"Existing VTEX brand ID.\"),\r\n brandName: z\r\n .string()\r\n .min(1)\r\n .optional()\r\n .describe(\"Brand name to create or reuse when `brandId` is not provided.\"),\r\n departmentId: z.number().int().positive().optional().describe(\"Department ID for the category.\"),\r\n refId: z.string().optional().describe(\"Internal product reference code.\"),\r\n title: z.string().optional().describe(\"SEO title.\"),\r\n description: z.string().optional().describe(\"Product description.\"),\r\n descriptionShort: z.string().optional().describe(\"Short product description.\"),\r\n linkId: z.string().optional().describe(\"Product slug.\"),\r\n releaseDate: z.string().optional().describe(\"Product release date in ISO format.\"),\r\n keyWords: z.string().optional().describe(\"Keywords string.\"),\r\n isVisible: z.boolean().optional().describe(\"Whether the product should be visible in listings.\"),\r\n isActive: z.boolean().optional().describe(\"Whether the product should be active.\"),\r\n taxCode: z.string().optional().describe(\"Tax code.\"),\r\n metaTagDescription: z.string().optional().describe(\"Meta description.\"),\r\n supplierId: z.number().int().positive().optional().describe(\"Supplier identifier.\"),\r\n showWithoutStock: z.boolean().optional().describe(\"Whether the product stays visible without stock.\"),\r\n score: z.number().int().optional().describe(\"Search score.\"),\r\n })\r\n .refine((value) => value.categoryId !== undefined || value.categoryPath !== undefined, {\r\n message: \"Provide either categoryId or categoryPath.\",\r\n path: [\"categoryId\"],\r\n })\r\n .refine((value) => value.brandId !== undefined || value.brandName !== undefined, {\r\n message: \"Provide either brandId or brandName.\",\r\n path: [\"brandId\"],\r\n });\r\n\r\nexport async function createProductHandler({\r\n profileId,\r\n name,\r\n categoryId,\r\n categoryPath,\r\n brandId,\r\n brandName,\r\n departmentId,\r\n refId,\r\n title,\r\n description,\r\n descriptionShort,\r\n linkId,\r\n releaseDate,\r\n keyWords,\r\n isVisible,\r\n isActive,\r\n taxCode,\r\n metaTagDescription,\r\n supplierId,\r\n showWithoutStock,\r\n score,\r\n}: z.infer<typeof createProductSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const payload: Record<string, unknown> = {\r\n Name: name,\r\n };\r\n\r\n if (categoryId !== undefined) payload.CategoryId = categoryId;\r\n if (categoryPath !== undefined) payload.CategoryPath = categoryPath;\r\n if (brandId !== undefined) payload.BrandId = brandId;\r\n if (brandName !== undefined) payload.BrandName = brandName;\r\n if (departmentId !== undefined) payload.DepartmentId = departmentId;\r\n if (refId !== undefined) payload.RefId = refId;\r\n if (title !== undefined) payload.Title = title;\r\n if (description !== undefined) payload.Description = description;\r\n if (descriptionShort !== undefined) payload.DescriptionShort = descriptionShort;\r\n if (linkId !== undefined) payload.LinkId = linkId;\r\n if (releaseDate !== undefined) payload.ReleaseDate = releaseDate;\r\n if (keyWords !== undefined) payload.KeyWords = keyWords;\r\n if (isVisible !== undefined) payload.IsVisible = isVisible;\r\n if (isActive !== undefined) payload.IsActive = isActive;\r\n if (taxCode !== undefined) payload.TaxCode = taxCode;\r\n if (metaTagDescription !== undefined) payload.MetaTagDescription = metaTagDescription;\r\n if (supplierId !== undefined) payload.SupplierId = supplierId;\r\n if (showWithoutStock !== undefined) payload.ShowWithoutStock = showWithoutStock;\r\n if (score !== undefined) payload.Score = score;\r\n\r\n const createdProduct = await createProduct(resolvedProfileId, payload);\r\n const resourceId = createdProduct.Id == null ? undefined : String(createdProduct.Id);\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"create_product\",\r\n resourceId,\r\n riskLevel: \"low\",\r\n message: \"Product created successfully.\",\r\n before: null,\r\n after: createdProduct,\r\n details: {\r\n product_id: resourceId,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, \"Failed to create product in VTEX\");\r\n }\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/create-sku.ts"],
4
- "sourcesContent": ["import { z } from \"zod\";\n\nimport { createSku, createSkuEan } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const createSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.number().int().positive().describe(\"Parent product ID.\"),\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 SKU 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 isActive: z\n .boolean()\n .optional()\n .describe(\"Whether the SKU should be created as active. VTEX recommends false during creation.\"),\n activateIfPossible: z\n .boolean()\n .optional()\n .describe(\"Whether VTEX should auto-activate the SKU when an image or active component exists.\"),\n measurementUnit: z.string().optional().describe(\"Measurement unit, for example `un`.\"),\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\n manufacturerCode: z.string().optional().describe(\"Manufacturer code.\"),\n commercialConditionId: z.number().int().positive().optional().describe(\"Commercial condition ID.\"),\n});\n\nexport async function createSkuHandler({\n profileId,\n productId,\n name,\n refId,\n ean,\n packagedHeight,\n packagedLength,\n packagedWidth,\n packagedWeightKg,\n height,\n length,\n width,\n weightKg,\n isActive,\n activateIfPossible,\n measurementUnit,\n unitMultiplier,\n manufacturerCode,\n commercialConditionId,\n}: z.infer<typeof createSkuSchema>) {\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 ProductId: productId,\n Name: name,\n RefId: refId,\n PackagedHeight: packagedHeight,\n PackagedLength: packagedLength,\n PackagedWidth: packagedWidth,\n PackagedWeightKg: packagedWeightKg,\n ActivateIfPossible: activateIfPossible ?? true,\n IsActive: isActive ?? false,\n };\n\n if (height !== undefined) payload.Height = height;\n if (length !== undefined) payload.Length = length;\n if (width !== undefined) payload.Width = width;\n if (weightKg !== undefined) payload.WeightKg = weightKg;\n if (measurementUnit !== undefined) payload.MeasurementUnit = measurementUnit;\n if (unitMultiplier !== undefined) payload.UnitMultiplier = unitMultiplier;\n if (manufacturerCode !== undefined) payload.ManufacturerCode = manufacturerCode;\n if (commercialConditionId !== undefined) payload.CommercialConditionId = commercialConditionId;\n\n const createdSku = await createSku(resolvedProfileId, payload);\n const resourceId = createdSku.Id == null ? undefined : String(createdSku.Id);\n\n if (resourceId && ean?.trim()) {\n await createSkuEan(resolvedProfileId, resourceId, ean.trim());\n createdSku.Eans = [ean.trim()];\n }\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"create_sku\",\n resourceId,\n riskLevel: \"low\",\n message: \"SKU created successfully.\",\n before: null,\n after: createdSku,\n details: {\n product_id: productId,\n sku_id: resourceId,\n },\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create SKU in VTEX\");\n }\n}\n"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createSku, createSkuEan } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const createSkuSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n productId: z.number().int().positive().describe(\"Parent product ID.\"),\r\n name: z.string().min(1).describe(\"SKU name.\"),\r\n refId: z.string().min(1).describe(\"Internal SKU reference code.\"),\r\n ean: z.string().optional().describe(\"Optional EAN to attach after SKU creation.\"),\r\n packagedHeight: z.number().nonnegative().describe(\"Packaged height.\"),\r\n packagedLength: z.number().nonnegative().describe(\"Packaged length.\"),\r\n packagedWidth: z.number().nonnegative().describe(\"Packaged width.\"),\r\n packagedWeightKg: z.number().nonnegative().describe(\"Packaged weight in kg.\"),\r\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\r\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\r\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\r\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\r\n isActive: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Whether the SKU should be created as active. VTEX recommends false during creation.\"),\r\n activateIfPossible: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Whether VTEX should auto-activate the SKU when an image or active component exists.\"),\r\n measurementUnit: z.string().optional().describe(\"Measurement unit, for example `un`.\"),\r\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\r\n manufacturerCode: z.string().optional().describe(\"Manufacturer code.\"),\r\n commercialConditionId: z.number().int().positive().optional().describe(\"Commercial condition ID.\"),\r\n});\r\n\r\nexport async function createSkuHandler({\r\n profileId,\r\n productId,\r\n name,\r\n refId,\r\n ean,\r\n packagedHeight,\r\n packagedLength,\r\n packagedWidth,\r\n packagedWeightKg,\r\n height,\r\n length,\r\n width,\r\n weightKg,\r\n isActive,\r\n activateIfPossible,\r\n measurementUnit,\r\n unitMultiplier,\r\n manufacturerCode,\r\n commercialConditionId,\r\n}: z.infer<typeof createSkuSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const payload: Record<string, unknown> = {\r\n ProductId: productId,\r\n Name: name,\r\n RefId: refId,\r\n PackagedHeight: packagedHeight,\r\n PackagedLength: packagedLength,\r\n PackagedWidth: packagedWidth,\r\n PackagedWeightKg: packagedWeightKg,\r\n ActivateIfPossible: activateIfPossible ?? true,\r\n IsActive: isActive ?? false,\r\n };\r\n\r\n if (height !== undefined) payload.Height = height;\r\n if (length !== undefined) payload.Length = length;\r\n if (width !== undefined) payload.Width = width;\r\n if (weightKg !== undefined) payload.WeightKg = weightKg;\r\n if (measurementUnit !== undefined) payload.MeasurementUnit = measurementUnit;\r\n if (unitMultiplier !== undefined) payload.UnitMultiplier = unitMultiplier;\r\n if (manufacturerCode !== undefined) payload.ManufacturerCode = manufacturerCode;\r\n if (commercialConditionId !== undefined) payload.CommercialConditionId = commercialConditionId;\r\n\r\n const createdSku = await createSku(resolvedProfileId, payload);\r\n const resourceId = createdSku.Id == null ? undefined : String(createdSku.Id);\r\n\r\n if (resourceId && ean?.trim()) {\r\n await createSkuEan(resolvedProfileId, resourceId, ean.trim());\r\n createdSku.Eans = [ean.trim()];\r\n }\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"create_sku\",\r\n resourceId,\r\n riskLevel: \"low\",\r\n message: \"SKU created successfully.\",\r\n before: null,\r\n after: createdSku,\r\n details: {\r\n product_id: productId,\r\n sku_id: resourceId,\r\n },\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, \"Failed to create SKU in VTEX\");\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,WAAW,oBAAoB;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,WAAW;AAAA,EACX,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,EACpE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,WAAW;AAAA,EAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,8BAA8B;AAAA,EAChE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,EAChF,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,kBAAkB;AAAA,EACpE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,kBAAkB;AAAA,EACpE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,iBAAiB;AAAA,EAClE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,wBAAwB;AAAA,EAC5E,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EACvE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EACvE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EACrE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EAC/E,UAAU,EACP,QAAQ,EACR,SAAS,EACT,SAAS,qFAAqF;AAAA,EACjG,oBAAoB,EACjB,QAAQ,EACR,SAAS,EACT,SAAS,qFAAqF;AAAA,EACjG,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,EACrF,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAC5E,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,EACrE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,0BAA0B;AACnG,CAAC;AAED,eAAsB,iBAAiB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoC;AAClC,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,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,oBAAoB,sBAAsB;AAAA,MAC1C,UAAU,YAAY;AAAA,IACxB;AAEA,QAAI,WAAW,OAAW,SAAQ,SAAS;AAC3C,QAAI,WAAW,OAAW,SAAQ,SAAS;AAC3C,QAAI,UAAU,OAAW,SAAQ,QAAQ;AACzC,QAAI,aAAa,OAAW,SAAQ,WAAW;AAC/C,QAAI,oBAAoB,OAAW,SAAQ,kBAAkB;AAC7D,QAAI,mBAAmB,OAAW,SAAQ,iBAAiB;AAC3D,QAAI,qBAAqB,OAAW,SAAQ,mBAAmB;AAC/D,QAAI,0BAA0B,OAAW,SAAQ,wBAAwB;AAEzE,UAAM,aAAa,MAAM,UAAU,mBAAmB,OAAO;AAC7D,UAAM,aAAa,WAAW,MAAM,OAAO,SAAY,OAAO,WAAW,EAAE;AAE3E,QAAI,cAAc,KAAK,KAAK,GAAG;AAC7B,YAAM,aAAa,mBAAmB,YAAY,IAAI,KAAK,CAAC;AAC5D,iBAAW,OAAO,CAAC,IAAI,KAAK,CAAC;AAAA,IAC/B;AAEA,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,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,8BAA8B;AAAA,EACjE;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/create-specification-value.ts"],
4
- "sourcesContent": ["import { z } from \"zod\";\n\nimport { createSpecificationValue } from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nexport const createSpecificationValueSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n fieldId: z.number().int().positive().describe(\"Specification field ID.\"),\n name: z.string().min(1).describe(\"Specification value name.\"),\n isActive: z.boolean().optional().describe(\"Whether the value should be active.\"),\n position: z.number().int().nonnegative().optional().describe(\"Display position.\"),\n});\n\nexport async function createSpecificationValueHandler({\n profileId,\n fieldId,\n name,\n isActive,\n position,\n}: z.infer<typeof createSpecificationValueSchema>) {\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 createdValue = await createSpecificationValue(resolvedProfileId, {\n FieldId: fieldId,\n Name: name,\n IsActive: isActive ?? true,\n Position: position ?? 0,\n Text: null,\n });\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation: \"create_specification_value\",\n resourceId: String(createdValue.FieldValueId ?? \"\"),\n riskLevel: \"low\",\n message: \"Specification value created successfully.\",\n before: null,\n after: createdValue,\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create specification value in VTEX\");\n }\n}\n"],
4
+ "sourcesContent": ["import { z } from \"zod\";\r\n\r\nimport { createSpecificationValue } from \"../../services/vtex/vtex-catalog-write.js\";\r\nimport {\r\n buildWriteSuccessResponse,\r\n handleVtexWriteError,\r\n resolveVtexWriteProfile,\r\n vtexProfileIdSchemaField,\r\n} from \"./write-helpers.js\";\r\n\r\nexport const createSpecificationValueSchema = z.object({\r\n profileId: vtexProfileIdSchemaField,\r\n fieldId: z.number().int().positive().describe(\"Specification field ID.\"),\r\n name: z.string().min(1).describe(\"Specification value name.\"),\r\n isActive: z.boolean().optional().describe(\"Whether the value should be active.\"),\r\n position: z.number().int().nonnegative().optional().describe(\"Display position.\"),\r\n});\r\n\r\nexport async function createSpecificationValueHandler({\r\n profileId,\r\n fieldId,\r\n name,\r\n isActive,\r\n position,\r\n}: z.infer<typeof createSpecificationValueSchema>) {\r\n try {\r\n const profileResolution = await resolveVtexWriteProfile(profileId);\r\n if (!profileResolution.ok) {\r\n return profileResolution.response;\r\n }\r\n\r\n const resolvedProfileId = profileResolution.value.profileId;\r\n const createdValue = await createSpecificationValue(resolvedProfileId, {\r\n FieldId: fieldId,\r\n Name: name,\r\n IsActive: isActive ?? true,\r\n Position: position ?? 0,\r\n Text: null,\r\n });\r\n\r\n return buildWriteSuccessResponse({\r\n profileId: resolvedProfileId,\r\n operation: \"create_specification_value\",\r\n resourceId: String(createdValue.FieldValueId ?? \"\"),\r\n riskLevel: \"low\",\r\n message: \"Specification value created successfully.\",\r\n before: null,\r\n after: createdValue,\r\n });\r\n } catch (err) {\r\n return handleVtexWriteError(err, \"Failed to create specification value in VTEX\");\r\n }\r\n}\r\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,gCAAgC;AACzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,MAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,WAAW;AAAA,EACX,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,EACvE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,2BAA2B;AAAA,EAC5D,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,EAC/E,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAClF,CAAC;AAED,eAAsB,gCAAgC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmD;AACjD,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,yBAAyB,mBAAmB;AAAA,MACrE,SAAS;AAAA,MACT,MAAM;AAAA,MACN,UAAU,YAAY;AAAA,MACtB,UAAU,YAAY;AAAA,MACtB,MAAM;AAAA,IACR,CAAC;AAED,WAAO,0BAA0B;AAAA,MAC/B,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY,OAAO,aAAa,gBAAgB,EAAE;AAAA,MAClD,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,qBAAqB,KAAK,8CAA8C;AAAA,EACjF;AACF;",
6
6
  "names": []
7
7
  }