@yoryoboy/bi-mcp 1.14.0 → 1.14.3

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 (35) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.js +3 -3
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp-use.json +2 -2
  5. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +2 -5
  6. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +2 -2
  7. package/dist/src/services/vtex/__tests__/vtex-payments.test.js +12 -9
  8. package/dist/src/services/vtex/__tests__/vtex-payments.test.js.map +2 -2
  9. package/dist/src/services/vtex/vtex-catalog.js +1 -1
  10. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  11. package/dist/src/services/vtex/vtex-payments.js +11 -5
  12. package/dist/src/services/vtex/vtex-payments.js.map +2 -2
  13. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +21 -2
  14. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +2 -2
  15. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +4 -173
  16. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +2 -2
  17. package/dist/src/tools/vtex/__tests__/payment-rules.test.js +1 -0
  18. package/dist/src/tools/vtex/__tests__/payment-rules.test.js.map +2 -2
  19. package/dist/src/tools/vtex/catalog-admin-products-skus.js +1 -1
  20. package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +1 -1
  21. package/dist/src/tools/vtex/catalog-navigation-reads.js +1 -1
  22. package/dist/src/tools/vtex/catalog-navigation-reads.js.map +2 -2
  23. package/dist/src/tools/vtex/commercial-conditions.js +35 -150
  24. package/dist/src/tools/vtex/commercial-conditions.js.map +2 -2
  25. package/dist/src/tools/vtex/create-sku.js +1 -1
  26. package/dist/src/tools/vtex/create-sku.js.map +1 -1
  27. package/dist/src/tools/vtex/payment-rules.js +81 -38
  28. package/dist/src/tools/vtex/payment-rules.js.map +2 -2
  29. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +12 -4
  30. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +2 -2
  31. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +121 -12
  32. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +2 -2
  33. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +15 -23
  34. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js.map +2 -2
  35. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/commercial-conditions.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport {\n getCommercialCondition,\n listCommercialConditions,\n} from \"../../services/vtex/vtex-payments.js\";\nimport {\n createCommercialCondition,\n deleteCommercialCondition,\n updateCommercialCondition,\n} from \"../../services/vtex/vtex-payments-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n buildWriteSuccessResponse,\n confirmationSchemaField,\n handleVtexWriteError,\n requireExplicitConfirmation,\n resolveVtexWriteProfile,\n} from \"./write-helpers.js\";\n\nconst commercialConditionWarnings = {\n delete:\n \"Deleting a commercial condition can break linked payment rules and installment visibility until dependent rules are updated.\",\n} as const;\n\nconst requiredProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .describe(\"Explicit VTEX profile id to use for this operation.\");\n\nconst commercialConditionIdSchemaField = z\n .number()\n .int()\n .positive()\n .describe(\"Positive VTEX commercial condition identifier.\");\n\nconst conditionRowsSchema = [\"id\", \"name\", \"is_active\"] as const;\n\nfunction readValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nconst listActionSchema = z.object({\n action: z.literal(\"list\"),\n profileId: requiredProfileIdSchemaField,\n search: z.string().trim().min(1).optional().describe(\"Optional text filter for condition name lookup.\"),\n});\n\nconst getActionSchema = z.object({\n action: z.literal(\"get\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: commercialConditionIdSchemaField,\n});\n\nconst createActionSchema = z.object({\n action: z.literal(\"create\"),\n profileId: requiredProfileIdSchemaField,\n name: z.string().trim().min(1).describe(\"Commercial condition name.\"),\n description: z.string().trim().min(1).optional().describe(\"Optional internal description.\"),\n isActive: z.boolean().optional().describe(\"Whether the condition should remain active.\"),\n});\n\nconst updateActionSchema = z\n .object({\n action: z.literal(\"update\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: commercialConditionIdSchemaField,\n name: z.string().trim().min(1).optional().describe(\"Updated commercial condition name.\"),\n description: z.string().trim().min(1).optional().describe(\"Updated internal description.\"),\n isActive: z.boolean().optional().describe(\"Updated condition active flag.\"),\n })\n .refine((value) => value.name !== undefined || value.description !== undefined || value.isActive !== undefined, {\n message: \"At least one commercial condition field must be provided.\",\n path: [\"name\"],\n });\n\nconst deleteActionSchema = z.object({\n action: z.literal(\"delete\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: commercialConditionIdSchemaField,\n confirmed: confirmationSchemaField,\n});\n\nexport const commercialConditionsSchema = z.discriminatedUnion(\"action\", [\n listActionSchema,\n getActionSchema,\n createActionSchema,\n updateActionSchema,\n deleteActionSchema,\n]);\n\nexport async function commercialConditionsHandler(\n params: z.infer<typeof commercialConditionsSchema>\n) {\n switch (params.action) {\n case \"list\": {\n try {\n const conditions = await listCommercialConditions(params.profileId, params.search);\n\n return object({\n metadata: stripNulls({\n total: conditions.length,\n profile_id: params.profileId,\n search: params.search,\n }),\n conditions_schema: conditionRowsSchema,\n conditions: conditions.map((condition) => [\n readValue(condition, \"id\", \"Id\"),\n readValue(condition, \"name\", \"Name\"),\n readValue(condition, \"isActive\", \"IsActive\", \"is_active\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX commercial conditions\"));\n }\n }\n\n case \"get\": {\n try {\n const condition = await getCommercialCondition(params.profileId, params.commercialConditionId);\n\n return object({\n profile_id: params.profileId,\n commercial_condition_id: params.commercialConditionId,\n condition: toSnakeCaseKeys(condition),\n });\n } catch (err) {\n return error(\n formatVtexError(\n err,\n `Failed to fetch VTEX commercial condition ${params.commercialConditionId}`\n )\n );\n }\n }\n\n case \"create\": {\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const created = await createCommercialCondition(profileResolution.value.profileId, {\n Name: params.name,\n ...(params.description !== undefined ? { Description: params.description } : {}),\n ...(params.isActive !== undefined ? { IsActive: params.isActive } : {}),\n });\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"commercial_conditions_create\",\n resourceId: created.id == null ? undefined : String(created.id),\n riskLevel: \"low\",\n message:\n \"Commercial condition created. You can now link it to payment rules or SKU assignments as needed.\",\n before: null,\n after: created,\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create VTEX commercial condition\");\n }\n }\n\n case \"update\": {\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const before = await getCommercialCondition(\n profileResolution.value.profileId,\n params.commercialConditionId\n );\n\n const updated = await updateCommercialCondition(\n profileResolution.value.profileId,\n params.commercialConditionId,\n {\n ...(params.name !== undefined ? { Name: params.name } : {}),\n ...(params.description !== undefined ? { Description: params.description } : {}),\n ...(params.isActive !== undefined ? { IsActive: params.isActive } : {}),\n }\n );\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"commercial_conditions_update\",\n resourceId: String(params.commercialConditionId),\n riskLevel: \"medium\",\n message:\n \"Commercial condition updated. Review linked payment rules and checkout behavior to confirm the intended installment strategy.\",\n before,\n after: updated,\n });\n } catch (err) {\n return handleVtexWriteError(\n err,\n `Failed to update VTEX commercial condition ${params.commercialConditionId}`\n );\n }\n }\n\n case \"delete\": {\n const confirmationResponse = requireExplicitConfirmation(\n params.confirmed,\n \"commercial_conditions_delete\",\n {\n commercial_condition_id: params.commercialConditionId,\n warnings: [commercialConditionWarnings.delete],\n }\n );\n if (confirmationResponse) {\n return confirmationResponse;\n }\n\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n await deleteCommercialCondition(\n profileResolution.value.profileId,\n params.commercialConditionId\n );\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"commercial_conditions_delete\",\n resourceId: String(params.commercialConditionId),\n riskLevel: \"high\",\n confirmed: true,\n message:\n \"Commercial condition deleted. Confirm linked payment rules and SKU assignments still reflect the intended installment strategy.\",\n warnings: [commercialConditionWarnings.delete],\n before: null,\n after: null,\n });\n } catch (err) {\n return handleVtexWriteError(\n err,\n `Failed to delete VTEX commercial condition ${params.commercialConditionId}`\n );\n }\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport {\n getCommercialCondition,\n listCommercialConditions,\n} from \"../../services/vtex/vtex-payments.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { vtexProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst requiredProfileIdSchemaField = vtexProfileIdSchemaField\n .unwrap()\n .describe(\"Explicit VTEX profile id to use for this operation.\");\n\nconst commercialConditionActionSchema = z\n .enum([\"list\", \"get\"])\n .describe(\"Action to perform for VTEX commercial conditions.\");\n\nconst commercialConditionIdSchemaField = z\n .number()\n .int()\n .positive()\n .describe(\"Positive VTEX commercial condition identifier.\");\n\nconst conditionRowsSchema = [\"id\", \"name\", \"is_active\"] as const;\n\nfunction readValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nconst listActionSchema = z.object({\n action: z.literal(\"list\"),\n profileId: requiredProfileIdSchemaField,\n search: z.string().trim().min(1).optional().describe(\"Optional text filter for condition name lookup.\"),\n});\n\nconst getActionSchema = z.object({\n action: z.literal(\"get\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: commercialConditionIdSchemaField,\n});\n\nfunction getCommercialConditionsActionSchema(\n action: z.infer<typeof commercialConditionActionSchema>\n) {\n switch (action) {\n case \"list\":\n return listActionSchema;\n case \"get\":\n return getActionSchema;\n }\n}\n\nexport const commercialConditionsSchema = z\n .object({\n action: commercialConditionActionSchema,\n profileId: requiredProfileIdSchemaField,\n search: z.string().trim().min(1).optional().describe(\"Optional text filter for condition name lookup.\"),\n commercialConditionId: commercialConditionIdSchemaField.optional(),\n })\n .superRefine((value, ctx) => {\n const validation = getCommercialConditionsActionSchema(value.action).safeParse(value);\n if (validation.success) {\n return;\n }\n\n for (const issue of validation.error.issues) {\n ctx.addIssue(issue as Parameters<typeof ctx.addIssue>[0]);\n }\n });\n\nexport async function commercialConditionsHandler(params: z.infer<typeof commercialConditionsSchema>) {\n switch (params.action) {\n case \"list\": {\n const validatedParams = listActionSchema.parse(params);\n\n try {\n const conditions = await listCommercialConditions(validatedParams.profileId, validatedParams.search);\n\n return object({\n metadata: stripNulls({\n total: conditions.length,\n profile_id: validatedParams.profileId,\n search: validatedParams.search,\n }),\n conditions_schema: conditionRowsSchema,\n conditions: conditions.map((condition) => [\n readValue(condition, \"id\", \"Id\"),\n readValue(condition, \"name\", \"Name\"),\n readValue(condition, \"isActive\", \"IsActive\", \"is_active\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX commercial conditions\"));\n }\n }\n\n case \"get\": {\n const validatedParams = getActionSchema.parse(params);\n\n try {\n const condition = await getCommercialCondition(\n validatedParams.profileId,\n validatedParams.commercialConditionId\n );\n\n return object({\n profile_id: validatedParams.profileId,\n commercial_condition_id: validatedParams.commercialConditionId,\n condition: toSnakeCaseKeys(condition),\n });\n } catch (err) {\n return error(\n formatVtexError(\n err,\n `Failed to fetch VTEX commercial condition ${validatedParams.commercialConditionId}`\n )\n );\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -26,7 +26,7 @@ const createSkuSchema = z.object({
26
26
  unitMultiplier: z.number().positive().optional().describe("Unit multiplier."),
27
27
  manufacturerCode: z.string().optional().describe("Manufacturer code."),
28
28
  commercialConditionId: z.number().int().positive().optional().describe(
29
- "Commercial condition ID. Use vtex_commercial_conditions to manage condition records and vtex_payment_rules to configure linked installment/payment behavior."
29
+ "Commercial condition ID. Use vtex_commercial_conditions to inspect available condition IDs and vtex_payment_rules to configure linked installment/payment behavior."
30
30
  )
31
31
  });
32
32
  async function createSkuHandler({
@@ -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\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Commercial condition ID. Use vtex_commercial_conditions to manage condition records and vtex_payment_rules to configure linked installment/payment behavior.\"\n ),\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\";\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\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Commercial condition ID. Use vtex_commercial_conditions to inspect available condition IDs and vtex_payment_rules to configure linked installment/payment behavior.\"\n ),\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"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -14,9 +14,11 @@ import {
14
14
  confirmationSchemaField,
15
15
  handleVtexWriteError,
16
16
  requireExplicitConfirmation,
17
- resolveVtexWriteProfile
17
+ resolveVtexWriteProfile,
18
+ vtexProfileIdSchemaField
18
19
  } from "./write-helpers.js";
19
- const requiredProfileIdSchemaField = z.string().trim().min(1).describe("Explicit VTEX profile id to use for this operation.");
20
+ const requiredProfileIdSchemaField = vtexProfileIdSchemaField.unwrap().describe("Explicit VTEX profile id to use for this operation.");
21
+ const paymentRuleActionSchema = z.enum(["list", "get", "create", "update", "delete"]).describe("Action to perform for VTEX payment rules.");
20
22
  const positiveIntegerSchemaField = (description) => z.number().int().positive().describe(description);
21
23
  const installmentsSchemaField = z.array(
22
24
  z.object({
@@ -89,25 +91,54 @@ const deleteActionSchema = z.object({
89
91
  ruleId: positiveIntegerSchemaField("Positive VTEX payment rule identifier."),
90
92
  confirmed: confirmationSchemaField
91
93
  });
92
- const paymentRulesSchema = z.discriminatedUnion("action", [
93
- listActionSchema,
94
- getActionSchema,
95
- createActionSchema,
96
- updateActionSchema,
97
- deleteActionSchema
98
- ]);
94
+ function getPaymentRulesActionSchema(action) {
95
+ switch (action) {
96
+ case "list":
97
+ return listActionSchema;
98
+ case "get":
99
+ return getActionSchema;
100
+ case "create":
101
+ return createActionSchema;
102
+ case "update":
103
+ return updateActionSchema;
104
+ case "delete":
105
+ return deleteActionSchema;
106
+ }
107
+ }
108
+ const paymentRulesSchema = z.object({
109
+ action: paymentRuleActionSchema,
110
+ profileId: requiredProfileIdSchemaField,
111
+ commercialConditionId: positiveIntegerSchemaField(
112
+ "Commercial condition identifier linked to this payment rule."
113
+ ).optional(),
114
+ ruleId: positiveIntegerSchemaField("Positive VTEX payment rule identifier.").optional(),
115
+ paymentSystem: z.string().trim().min(1).optional().describe("VTEX payment system identifier."),
116
+ salesChannel: z.string().trim().min(1).optional().describe("Optional VTEX sales channel identifier."),
117
+ restrictedByCondition: z.boolean().optional().describe("Whether checkout should restrict this rule to the linked commercial condition."),
118
+ installments: installmentsSchemaField.optional(),
119
+ confirmed: confirmationSchemaField
120
+ }).superRefine((value, ctx) => {
121
+ const validation = getPaymentRulesActionSchema(value.action).safeParse(value);
122
+ if (validation.success) {
123
+ return;
124
+ }
125
+ for (const issue of validation.error.issues) {
126
+ ctx.addIssue(issue);
127
+ }
128
+ });
99
129
  async function paymentRulesHandler(params) {
100
130
  switch (params.action) {
101
131
  case "list": {
132
+ const validatedParams = listActionSchema.parse(params);
102
133
  try {
103
- const rules = await listPaymentRules(params.profileId, {
104
- commercialConditionId: params.commercialConditionId
134
+ const rules = await listPaymentRules(validatedParams.profileId, {
135
+ commercialConditionId: validatedParams.commercialConditionId
105
136
  });
106
137
  return object({
107
138
  metadata: stripNulls({
108
139
  total: rules.length,
109
- profile_id: params.profileId,
110
- filters: params.commercialConditionId === void 0 ? void 0 : { commercial_condition_id: params.commercialConditionId }
140
+ profile_id: validatedParams.profileId,
141
+ filters: validatedParams.commercialConditionId === void 0 ? void 0 : { commercial_condition_id: validatedParams.commercialConditionId }
111
142
  }),
112
143
  payment_rules_schema: paymentRuleRowsSchema,
113
144
  payment_rules: rules.map((rule) => [
@@ -128,29 +159,33 @@ async function paymentRulesHandler(params) {
128
159
  }
129
160
  }
130
161
  case "get": {
162
+ const validatedParams = getActionSchema.parse(params);
131
163
  try {
132
- const rule = await getPaymentRule(params.profileId, params.ruleId);
164
+ const rule = await getPaymentRule(validatedParams.profileId, validatedParams.ruleId);
133
165
  return object({
134
- profile_id: params.profileId,
135
- rule_id: params.ruleId,
166
+ profile_id: validatedParams.profileId,
167
+ rule_id: validatedParams.ruleId,
136
168
  payment_rule: toSnakeCaseKeys(rule)
137
169
  });
138
170
  } catch (err) {
139
- return error(formatVtexError(err, `Failed to fetch VTEX payment rule ${params.ruleId}`));
171
+ return error(
172
+ formatVtexError(err, `Failed to fetch VTEX payment rule ${validatedParams.ruleId}`)
173
+ );
140
174
  }
141
175
  }
142
176
  case "create": {
177
+ const validatedParams = createActionSchema.parse(params);
143
178
  try {
144
- const profileResolution = await resolveVtexWriteProfile(params.profileId);
179
+ const profileResolution = await resolveVtexWriteProfile(validatedParams.profileId);
145
180
  if (!profileResolution.ok) {
146
181
  return profileResolution.response;
147
182
  }
148
183
  const created = await createPaymentRule(profileResolution.value.profileId, {
149
- commercialConditionId: params.commercialConditionId,
150
- paymentSystem: params.paymentSystem,
151
- ...params.salesChannel !== void 0 ? { salesChannel: params.salesChannel } : {},
152
- ...params.restrictedByCondition !== void 0 ? { restrictedByCondition: params.restrictedByCondition } : {},
153
- installments: params.installments
184
+ commercialConditionId: validatedParams.commercialConditionId,
185
+ paymentSystem: validatedParams.paymentSystem,
186
+ ...validatedParams.salesChannel !== void 0 ? { salesChannel: validatedParams.salesChannel } : {},
187
+ ...validatedParams.restrictedByCondition !== void 0 ? { restrictedByCondition: validatedParams.restrictedByCondition } : {},
188
+ installments: validatedParams.installments
154
189
  });
155
190
  return buildWriteSuccessResponse({
156
191
  profileId: profileResolution.value.profileId,
@@ -166,49 +201,54 @@ async function paymentRulesHandler(params) {
166
201
  }
167
202
  }
168
203
  case "update": {
204
+ const validatedParams = updateActionSchema.parse(params);
169
205
  try {
170
- const profileResolution = await resolveVtexWriteProfile(params.profileId);
206
+ const profileResolution = await resolveVtexWriteProfile(validatedParams.profileId);
171
207
  if (!profileResolution.ok) {
172
208
  return profileResolution.response;
173
209
  }
174
- const updated = await updatePaymentRule(profileResolution.value.profileId, params.ruleId, {
175
- ...params.commercialConditionId !== void 0 ? { commercialConditionId: params.commercialConditionId } : {},
176
- ...params.paymentSystem !== void 0 ? { paymentSystem: params.paymentSystem } : {},
177
- ...params.salesChannel !== void 0 ? { salesChannel: params.salesChannel } : {},
178
- ...params.restrictedByCondition !== void 0 ? { restrictedByCondition: params.restrictedByCondition } : {},
179
- ...params.installments !== void 0 ? { installments: params.installments } : {}
210
+ const updated = await updatePaymentRule(profileResolution.value.profileId, validatedParams.ruleId, {
211
+ ...validatedParams.commercialConditionId !== void 0 ? { commercialConditionId: validatedParams.commercialConditionId } : {},
212
+ ...validatedParams.paymentSystem !== void 0 ? { paymentSystem: validatedParams.paymentSystem } : {},
213
+ ...validatedParams.salesChannel !== void 0 ? { salesChannel: validatedParams.salesChannel } : {},
214
+ ...validatedParams.restrictedByCondition !== void 0 ? { restrictedByCondition: validatedParams.restrictedByCondition } : {},
215
+ ...validatedParams.installments !== void 0 ? { installments: validatedParams.installments } : {}
180
216
  });
181
217
  return buildWriteSuccessResponse({
182
218
  profileId: profileResolution.value.profileId,
183
219
  operation: "payment_rules_update",
184
- resourceId: String(params.ruleId),
220
+ resourceId: String(validatedParams.ruleId),
185
221
  riskLevel: "medium",
186
222
  message: "Payment rule updated. Review checkout installments to confirm the expected payment options.",
187
223
  before: null,
188
224
  after: updated
189
225
  });
190
226
  } catch (err) {
191
- return handleVtexWriteError(err, `Failed to update VTEX payment rule ${params.ruleId}`);
227
+ return handleVtexWriteError(
228
+ err,
229
+ `Failed to update VTEX payment rule ${validatedParams.ruleId}`
230
+ );
192
231
  }
193
232
  }
194
233
  case "delete": {
195
- const confirmationResponse = requireExplicitConfirmation(params.confirmed, "payment_rules_delete", {
196
- rule_id: params.ruleId,
234
+ const validatedParams = deleteActionSchema.parse(params);
235
+ const confirmationResponse = requireExplicitConfirmation(validatedParams.confirmed, "payment_rules_delete", {
236
+ rule_id: validatedParams.ruleId,
197
237
  warnings: [paymentRuleWarnings.delete]
198
238
  });
199
239
  if (confirmationResponse) {
200
240
  return confirmationResponse;
201
241
  }
202
242
  try {
203
- const profileResolution = await resolveVtexWriteProfile(params.profileId);
243
+ const profileResolution = await resolveVtexWriteProfile(validatedParams.profileId);
204
244
  if (!profileResolution.ok) {
205
245
  return profileResolution.response;
206
246
  }
207
- await deletePaymentRule(profileResolution.value.profileId, params.ruleId);
247
+ await deletePaymentRule(profileResolution.value.profileId, validatedParams.ruleId);
208
248
  return buildWriteSuccessResponse({
209
249
  profileId: profileResolution.value.profileId,
210
250
  operation: "payment_rules_delete",
211
- resourceId: String(params.ruleId),
251
+ resourceId: String(validatedParams.ruleId),
212
252
  riskLevel: "high",
213
253
  confirmed: true,
214
254
  message: "Payment rule deleted. Verify checkout no longer exposes the removed installment option to affected shoppers.",
@@ -217,7 +257,10 @@ async function paymentRulesHandler(params) {
217
257
  after: null
218
258
  });
219
259
  } catch (err) {
220
- return handleVtexWriteError(err, `Failed to delete VTEX payment rule ${params.ruleId}`);
260
+ return handleVtexWriteError(
261
+ err,
262
+ `Failed to delete VTEX payment rule ${validatedParams.ruleId}`
263
+ );
221
264
  }
222
265
  }
223
266
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tools/vtex/payment-rules.ts"],
4
- "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { getPaymentRule, listPaymentRules } from \"../../services/vtex/vtex-payments.js\";\nimport {\n createPaymentRule,\n deletePaymentRule,\n updatePaymentRule,\n} from \"../../services/vtex/vtex-payments-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n buildWriteSuccessResponse,\n confirmationSchemaField,\n handleVtexWriteError,\n requireExplicitConfirmation,\n resolveVtexWriteProfile,\n} from \"./write-helpers.js\";\n\nconst requiredProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .describe(\"Explicit VTEX profile id to use for this operation.\");\n\nconst positiveIntegerSchemaField = (description: string) =>\n z.number().int().positive().describe(description);\n\nconst installmentsSchemaField = z\n .array(\n z.object({\n count: positiveIntegerSchemaField(\"Installment count.\"),\n interest: z.boolean().describe(\"Whether this installment carries interest.\"),\n })\n )\n .min(1)\n .describe(\"Installment configuration rows for the payment rule.\");\n\nconst paymentRuleWarnings = {\n delete:\n \"Deleting a payment rule can immediately remove installment options from checkout for affected shoppers.\",\n} as const;\n\nconst paymentRuleRowsSchema = [\n \"id\",\n \"commercial_condition_id\",\n \"payment_system\",\n \"sales_channel\",\n \"restricted_by_condition\",\n] as const;\n\nfunction readValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nconst listActionSchema = z.object({\n action: z.literal(\"list\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: positiveIntegerSchemaField(\n \"Optional commercial condition filter for payment rules.\"\n ).optional(),\n});\n\nconst getActionSchema = z.object({\n action: z.literal(\"get\"),\n profileId: requiredProfileIdSchemaField,\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\"),\n});\n\nconst createActionSchema = z.object({\n action: z.literal(\"create\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: positiveIntegerSchemaField(\n \"Commercial condition identifier linked to this payment rule.\"\n ),\n paymentSystem: z.string().trim().min(1).describe(\"VTEX payment system identifier.\"),\n salesChannel: z.string().trim().min(1).optional().describe(\"Optional VTEX sales channel identifier.\"),\n restrictedByCondition: z\n .boolean()\n .optional()\n .describe(\"Whether checkout should restrict this rule to the linked commercial condition.\"),\n installments: installmentsSchemaField,\n});\n\nconst updateActionSchema = z\n .object({\n action: z.literal(\"update\"),\n profileId: requiredProfileIdSchemaField,\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\"),\n commercialConditionId: positiveIntegerSchemaField(\n \"Commercial condition identifier linked to this payment rule.\"\n ).optional(),\n paymentSystem: z.string().trim().min(1).optional().describe(\"Updated VTEX payment system identifier.\"),\n salesChannel: z.string().trim().min(1).optional().describe(\"Updated VTEX sales channel identifier.\"),\n restrictedByCondition: z\n .boolean()\n .optional()\n .describe(\"Updated restricted-by-condition flag.\"),\n installments: installmentsSchemaField.optional(),\n })\n .refine(\n (value) =>\n value.commercialConditionId !== undefined ||\n value.paymentSystem !== undefined ||\n value.salesChannel !== undefined ||\n value.restrictedByCondition !== undefined ||\n value.installments !== undefined,\n {\n message: \"At least one payment rule field must be provided.\",\n path: [\"paymentSystem\"],\n }\n );\n\nconst deleteActionSchema = z.object({\n action: z.literal(\"delete\"),\n profileId: requiredProfileIdSchemaField,\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\"),\n confirmed: confirmationSchemaField,\n});\n\nexport const paymentRulesSchema = z.discriminatedUnion(\"action\", [\n listActionSchema,\n getActionSchema,\n createActionSchema,\n updateActionSchema,\n deleteActionSchema,\n]);\n\nexport async function paymentRulesHandler(params: z.infer<typeof paymentRulesSchema>) {\n switch (params.action) {\n case \"list\": {\n try {\n const rules = await listPaymentRules(params.profileId, {\n commercialConditionId: params.commercialConditionId,\n });\n\n return object({\n metadata: stripNulls({\n total: rules.length,\n profile_id: params.profileId,\n filters:\n params.commercialConditionId === undefined\n ? undefined\n : { commercial_condition_id: params.commercialConditionId },\n }),\n payment_rules_schema: paymentRuleRowsSchema,\n payment_rules: rules.map((rule) => [\n readValue(rule, \"id\", \"Id\"),\n readValue(rule, \"commercialConditionId\", \"CommercialConditionId\", \"commercial_condition_id\"),\n readValue(rule, \"paymentSystem\", \"PaymentSystem\", \"payment_system\"),\n readValue(rule, \"salesChannel\", \"SalesChannel\", \"sales_channel\"),\n readValue(\n rule,\n \"restrictedByCondition\",\n \"RestrictedByCondition\",\n \"restricted_by_condition\"\n ),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX payment rules\"));\n }\n }\n\n case \"get\": {\n try {\n const rule = await getPaymentRule(params.profileId, params.ruleId);\n\n return object({\n profile_id: params.profileId,\n rule_id: params.ruleId,\n payment_rule: toSnakeCaseKeys(rule),\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX payment rule ${params.ruleId}`));\n }\n }\n\n case \"create\": {\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const created = await createPaymentRule(profileResolution.value.profileId, {\n commercialConditionId: params.commercialConditionId,\n paymentSystem: params.paymentSystem,\n ...(params.salesChannel !== undefined ? { salesChannel: params.salesChannel } : {}),\n ...(params.restrictedByCondition !== undefined\n ? { restrictedByCondition: params.restrictedByCondition }\n : {}),\n installments: params.installments,\n });\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"payment_rules_create\",\n resourceId: created.id == null ? undefined : String(created.id),\n riskLevel: \"medium\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n before: null,\n after: created,\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create VTEX payment rule\");\n }\n }\n\n case \"update\": {\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const updated = await updatePaymentRule(profileResolution.value.profileId, params.ruleId, {\n ...(params.commercialConditionId !== undefined\n ? { commercialConditionId: params.commercialConditionId }\n : {}),\n ...(params.paymentSystem !== undefined ? { paymentSystem: params.paymentSystem } : {}),\n ...(params.salesChannel !== undefined ? { salesChannel: params.salesChannel } : {}),\n ...(params.restrictedByCondition !== undefined\n ? { restrictedByCondition: params.restrictedByCondition }\n : {}),\n ...(params.installments !== undefined ? { installments: params.installments } : {}),\n });\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"payment_rules_update\",\n resourceId: String(params.ruleId),\n riskLevel: \"medium\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n before: null,\n after: updated,\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to update VTEX payment rule ${params.ruleId}`);\n }\n }\n\n case \"delete\": {\n const confirmationResponse = requireExplicitConfirmation(params.confirmed, \"payment_rules_delete\", {\n rule_id: params.ruleId,\n warnings: [paymentRuleWarnings.delete],\n });\n if (confirmationResponse) {\n return confirmationResponse;\n }\n\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n await deletePaymentRule(profileResolution.value.profileId, params.ruleId);\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"payment_rules_delete\",\n resourceId: String(params.ruleId),\n riskLevel: \"high\",\n confirmed: true,\n message:\n \"Payment rule deleted. Verify checkout no longer exposes the removed installment option to affected shoppers.\",\n warnings: [paymentRuleWarnings.delete],\n before: null,\n after: null,\n });\n } catch (err) {\n return handleVtexWriteError(err, `Failed to delete VTEX payment rule ${params.ruleId}`);\n }\n }\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB,wBAAwB;AACjD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,+BAA+B,EAClC,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,qDAAqD;AAEjE,MAAM,6BAA6B,CAAC,gBAClC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,WAAW;AAElD,MAAM,0BAA0B,EAC7B;AAAA,EACC,EAAE,OAAO;AAAA,IACP,OAAO,2BAA2B,oBAAoB;AAAA,IACtD,UAAU,EAAE,QAAQ,EAAE,SAAS,4CAA4C;AAAA,EAC7E,CAAC;AACH,EACC,IAAI,CAAC,EACL,SAAS,sDAAsD;AAElE,MAAM,sBAAsB;AAAA,EAC1B,QACE;AACJ;AAEA,MAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,UAAU,WAAoC,MAAyB;AAC9E,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,QAAQ;AACjB,aAAO,OAAO,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,mBAAmB,EAAE,OAAO;AAAA,EAChC,QAAQ,EAAE,QAAQ,MAAM;AAAA,EACxB,WAAW;AAAA,EACX,uBAAuB;AAAA,IACrB;AAAA,EACF,EAAE,SAAS;AACb,CAAC;AAED,MAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACvB,WAAW;AAAA,EACX,QAAQ,2BAA2B,wCAAwC;AAC7E,CAAC;AAED,MAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,QAAQ,EAAE,QAAQ,QAAQ;AAAA,EAC1B,WAAW;AAAA,EACX,uBAAuB;AAAA,IACrB;AAAA,EACF;AAAA,EACA,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,iCAAiC;AAAA,EAClF,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,EACpG,uBAAuB,EACpB,QAAQ,EACR,SAAS,EACT,SAAS,gFAAgF;AAAA,EAC5F,cAAc;AAChB,CAAC;AAED,MAAM,qBAAqB,EACxB,OAAO;AAAA,EACN,QAAQ,EAAE,QAAQ,QAAQ;AAAA,EAC1B,WAAW;AAAA,EACX,QAAQ,2BAA2B,wCAAwC;AAAA,EAC3E,uBAAuB;AAAA,IACrB;AAAA,EACF,EAAE,SAAS;AAAA,EACX,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,EACrG,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,EACnG,uBAAuB,EACpB,QAAQ,EACR,SAAS,EACT,SAAS,uCAAuC;AAAA,EACnD,cAAc,wBAAwB,SAAS;AACjD,CAAC,EACA;AAAA,EACC,CAAC,UACC,MAAM,0BAA0B,UAChC,MAAM,kBAAkB,UACxB,MAAM,iBAAiB,UACvB,MAAM,0BAA0B,UAChC,MAAM,iBAAiB;AAAA,EACzB;AAAA,IACE,SAAS;AAAA,IACT,MAAM,CAAC,eAAe;AAAA,EACxB;AACF;AAEF,MAAM,qBAAqB,EAAE,OAAO;AAAA,EAClC,QAAQ,EAAE,QAAQ,QAAQ;AAAA,EAC1B,WAAW;AAAA,EACX,QAAQ,2BAA2B,wCAAwC;AAAA,EAC3E,WAAW;AACb,CAAC;AAEM,MAAM,qBAAqB,EAAE,mBAAmB,UAAU;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,eAAsB,oBAAoB,QAA4C;AACpF,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK,QAAQ;AACX,UAAI;AACF,cAAM,QAAQ,MAAM,iBAAiB,OAAO,WAAW;AAAA,UACrD,uBAAuB,OAAO;AAAA,QAChC,CAAC;AAED,eAAO,OAAO;AAAA,UACZ,UAAU,WAAW;AAAA,YACnB,OAAO,MAAM;AAAA,YACb,YAAY,OAAO;AAAA,YACnB,SACE,OAAO,0BAA0B,SAC7B,SACA,EAAE,yBAAyB,OAAO,sBAAsB;AAAA,UAChE,CAAC;AAAA,UACD,sBAAsB;AAAA,UACtB,eAAe,MAAM,IAAI,CAAC,SAAS;AAAA,YACjC,UAAU,MAAM,MAAM,IAAI;AAAA,YAC1B,UAAU,MAAM,yBAAyB,yBAAyB,yBAAyB;AAAA,YAC3F,UAAU,MAAM,iBAAiB,iBAAiB,gBAAgB;AAAA,YAClE,UAAU,MAAM,gBAAgB,gBAAgB,eAAe;AAAA,YAC/D;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,MAAM,gBAAgB,KAAK,mCAAmC,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IAEA,KAAK,OAAO;AACV,UAAI;AACF,cAAM,OAAO,MAAM,eAAe,OAAO,WAAW,OAAO,MAAM;AAEjE,eAAO,OAAO;AAAA,UACZ,YAAY,OAAO;AAAA,UACnB,SAAS,OAAO;AAAA,UAChB,cAAc,gBAAgB,IAAI;AAAA,QACpC,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,MAAM,gBAAgB,KAAK,qCAAqC,OAAO,MAAM,EAAE,CAAC;AAAA,MACzF;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,UAAI;AACF,cAAM,oBAAoB,MAAM,wBAAwB,OAAO,SAAS;AACxE,YAAI,CAAC,kBAAkB,IAAI;AACzB,iBAAO,kBAAkB;AAAA,QAC3B;AAEA,cAAM,UAAU,MAAM,kBAAkB,kBAAkB,MAAM,WAAW;AAAA,UACzE,uBAAuB,OAAO;AAAA,UAC9B,eAAe,OAAO;AAAA,UACtB,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,UACjF,GAAI,OAAO,0BAA0B,SACjC,EAAE,uBAAuB,OAAO,sBAAsB,IACtD,CAAC;AAAA,UACL,cAAc,OAAO;AAAA,QACvB,CAAC;AAED,eAAO,0BAA0B;AAAA,UAC/B,WAAW,kBAAkB,MAAM;AAAA,UACnC,WAAW;AAAA,UACX,YAAY,QAAQ,MAAM,OAAO,SAAY,OAAO,QAAQ,EAAE;AAAA,UAC9D,WAAW;AAAA,UACX,SACE;AAAA,UACF,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,qBAAqB,KAAK,oCAAoC;AAAA,MACvE;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,UAAI;AACF,cAAM,oBAAoB,MAAM,wBAAwB,OAAO,SAAS;AACxE,YAAI,CAAC,kBAAkB,IAAI;AACzB,iBAAO,kBAAkB;AAAA,QAC3B;AAEA,cAAM,UAAU,MAAM,kBAAkB,kBAAkB,MAAM,WAAW,OAAO,QAAQ;AAAA,UACxF,GAAI,OAAO,0BAA0B,SACjC,EAAE,uBAAuB,OAAO,sBAAsB,IACtD,CAAC;AAAA,UACL,GAAI,OAAO,kBAAkB,SAAY,EAAE,eAAe,OAAO,cAAc,IAAI,CAAC;AAAA,UACpF,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,UACjF,GAAI,OAAO,0BAA0B,SACjC,EAAE,uBAAuB,OAAO,sBAAsB,IACtD,CAAC;AAAA,UACL,GAAI,OAAO,iBAAiB,SAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;AAAA,QACnF,CAAC;AAED,eAAO,0BAA0B;AAAA,UAC/B,WAAW,kBAAkB,MAAM;AAAA,UACnC,WAAW;AAAA,UACX,YAAY,OAAO,OAAO,MAAM;AAAA,UAChC,WAAW;AAAA,UACX,SACE;AAAA,UACF,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,qBAAqB,KAAK,sCAAsC,OAAO,MAAM,EAAE;AAAA,MACxF;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,uBAAuB,4BAA4B,OAAO,WAAW,wBAAwB;AAAA,QACjG,SAAS,OAAO;AAAA,QAChB,UAAU,CAAC,oBAAoB,MAAM;AAAA,MACvC,CAAC;AACD,UAAI,sBAAsB;AACxB,eAAO;AAAA,MACT;AAEA,UAAI;AACF,cAAM,oBAAoB,MAAM,wBAAwB,OAAO,SAAS;AACxE,YAAI,CAAC,kBAAkB,IAAI;AACzB,iBAAO,kBAAkB;AAAA,QAC3B;AAEA,cAAM,kBAAkB,kBAAkB,MAAM,WAAW,OAAO,MAAM;AAExE,eAAO,0BAA0B;AAAA,UAC/B,WAAW,kBAAkB,MAAM;AAAA,UACnC,WAAW;AAAA,UACX,YAAY,OAAO,OAAO,MAAM;AAAA,UAChC,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SACE;AAAA,UACF,UAAU,CAAC,oBAAoB,MAAM;AAAA,UACrC,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,qBAAqB,KAAK,sCAAsC,OAAO,MAAM,EAAE;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport { getPaymentRule, listPaymentRules } from \"../../services/vtex/vtex-payments.js\";\nimport {\n createPaymentRule,\n deletePaymentRule,\n updatePaymentRule,\n} from \"../../services/vtex/vtex-payments-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n buildWriteSuccessResponse,\n confirmationSchemaField,\n handleVtexWriteError,\n requireExplicitConfirmation,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\nconst requiredProfileIdSchemaField = vtexProfileIdSchemaField\n .unwrap()\n .describe(\"Explicit VTEX profile id to use for this operation.\");\n\nconst paymentRuleActionSchema = z\n .enum([\"list\", \"get\", \"create\", \"update\", \"delete\"])\n .describe(\"Action to perform for VTEX payment rules.\");\n\nconst positiveIntegerSchemaField = (description: string) =>\n z.number().int().positive().describe(description);\n\nconst installmentsSchemaField = z\n .array(\n z.object({\n count: positiveIntegerSchemaField(\"Installment count.\"),\n interest: z.boolean().describe(\"Whether this installment carries interest.\"),\n })\n )\n .min(1)\n .describe(\"Installment configuration rows for the payment rule.\");\n\nconst paymentRuleWarnings = {\n delete:\n \"Deleting a payment rule can immediately remove installment options from checkout for affected shoppers.\",\n} as const;\n\nconst paymentRuleRowsSchema = [\n \"id\",\n \"commercial_condition_id\",\n \"payment_system\",\n \"sales_channel\",\n \"restricted_by_condition\",\n] as const;\n\nfunction readValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nconst listActionSchema = z.object({\n action: z.literal(\"list\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: positiveIntegerSchemaField(\n \"Optional commercial condition filter for payment rules.\"\n ).optional(),\n});\n\nconst getActionSchema = z.object({\n action: z.literal(\"get\"),\n profileId: requiredProfileIdSchemaField,\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\"),\n});\n\nconst createActionSchema = z.object({\n action: z.literal(\"create\"),\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: positiveIntegerSchemaField(\n \"Commercial condition identifier linked to this payment rule.\"\n ),\n paymentSystem: z.string().trim().min(1).describe(\"VTEX payment system identifier.\"),\n salesChannel: z.string().trim().min(1).optional().describe(\"Optional VTEX sales channel identifier.\"),\n restrictedByCondition: z\n .boolean()\n .optional()\n .describe(\"Whether checkout should restrict this rule to the linked commercial condition.\"),\n installments: installmentsSchemaField,\n});\n\nconst updateActionSchema = z\n .object({\n action: z.literal(\"update\"),\n profileId: requiredProfileIdSchemaField,\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\"),\n commercialConditionId: positiveIntegerSchemaField(\n \"Commercial condition identifier linked to this payment rule.\"\n ).optional(),\n paymentSystem: z.string().trim().min(1).optional().describe(\"Updated VTEX payment system identifier.\"),\n salesChannel: z.string().trim().min(1).optional().describe(\"Updated VTEX sales channel identifier.\"),\n restrictedByCondition: z\n .boolean()\n .optional()\n .describe(\"Updated restricted-by-condition flag.\"),\n installments: installmentsSchemaField.optional(),\n })\n .refine(\n (value) =>\n value.commercialConditionId !== undefined ||\n value.paymentSystem !== undefined ||\n value.salesChannel !== undefined ||\n value.restrictedByCondition !== undefined ||\n value.installments !== undefined,\n {\n message: \"At least one payment rule field must be provided.\",\n path: [\"paymentSystem\"],\n }\n );\n\nconst deleteActionSchema = z.object({\n action: z.literal(\"delete\"),\n profileId: requiredProfileIdSchemaField,\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\"),\n confirmed: confirmationSchemaField,\n});\n\nfunction getPaymentRulesActionSchema(action: z.infer<typeof paymentRuleActionSchema>) {\n switch (action) {\n case \"list\":\n return listActionSchema;\n case \"get\":\n return getActionSchema;\n case \"create\":\n return createActionSchema;\n case \"update\":\n return updateActionSchema;\n case \"delete\":\n return deleteActionSchema;\n }\n}\n\nexport const paymentRulesSchema = z\n .object({\n action: paymentRuleActionSchema,\n profileId: requiredProfileIdSchemaField,\n commercialConditionId: positiveIntegerSchemaField(\n \"Commercial condition identifier linked to this payment rule.\"\n ).optional(),\n ruleId: positiveIntegerSchemaField(\"Positive VTEX payment rule identifier.\").optional(),\n paymentSystem: z.string().trim().min(1).optional().describe(\"VTEX payment system identifier.\"),\n salesChannel: z.string().trim().min(1).optional().describe(\"Optional VTEX sales channel identifier.\"),\n restrictedByCondition: z\n .boolean()\n .optional()\n .describe(\"Whether checkout should restrict this rule to the linked commercial condition.\"),\n installments: installmentsSchemaField.optional(),\n confirmed: confirmationSchemaField,\n })\n .superRefine((value, ctx) => {\n const validation = getPaymentRulesActionSchema(value.action).safeParse(value);\n if (validation.success) {\n return;\n }\n\n for (const issue of validation.error.issues) {\n ctx.addIssue(issue as Parameters<typeof ctx.addIssue>[0]);\n }\n });\n\nexport async function paymentRulesHandler(params: z.infer<typeof paymentRulesSchema>) {\n switch (params.action) {\n case \"list\": {\n const validatedParams = listActionSchema.parse(params);\n\n try {\n const rules = await listPaymentRules(validatedParams.profileId, {\n commercialConditionId: validatedParams.commercialConditionId,\n });\n\n return object({\n metadata: stripNulls({\n total: rules.length,\n profile_id: validatedParams.profileId,\n filters:\n validatedParams.commercialConditionId === undefined\n ? undefined\n : { commercial_condition_id: validatedParams.commercialConditionId },\n }),\n payment_rules_schema: paymentRuleRowsSchema,\n payment_rules: rules.map((rule) => [\n readValue(rule, \"id\", \"Id\"),\n readValue(rule, \"commercialConditionId\", \"CommercialConditionId\", \"commercial_condition_id\"),\n readValue(rule, \"paymentSystem\", \"PaymentSystem\", \"payment_system\"),\n readValue(rule, \"salesChannel\", \"SalesChannel\", \"sales_channel\"),\n readValue(\n rule,\n \"restrictedByCondition\",\n \"RestrictedByCondition\",\n \"restricted_by_condition\"\n ),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX payment rules\"));\n }\n }\n\n case \"get\": {\n const validatedParams = getActionSchema.parse(params);\n\n try {\n const rule = await getPaymentRule(validatedParams.profileId, validatedParams.ruleId);\n\n return object({\n profile_id: validatedParams.profileId,\n rule_id: validatedParams.ruleId,\n payment_rule: toSnakeCaseKeys(rule),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch VTEX payment rule ${validatedParams.ruleId}`)\n );\n }\n }\n\n case \"create\": {\n const validatedParams = createActionSchema.parse(params);\n\n try {\n const profileResolution = await resolveVtexWriteProfile(validatedParams.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const created = await createPaymentRule(profileResolution.value.profileId, {\n commercialConditionId: validatedParams.commercialConditionId,\n paymentSystem: validatedParams.paymentSystem,\n ...(validatedParams.salesChannel !== undefined\n ? { salesChannel: validatedParams.salesChannel }\n : {}),\n ...(validatedParams.restrictedByCondition !== undefined\n ? { restrictedByCondition: validatedParams.restrictedByCondition }\n : {}),\n installments: validatedParams.installments,\n });\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"payment_rules_create\",\n resourceId: created.id == null ? undefined : String(created.id),\n riskLevel: \"medium\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n before: null,\n after: created,\n });\n } catch (err) {\n return handleVtexWriteError(err, \"Failed to create VTEX payment rule\");\n }\n }\n\n case \"update\": {\n const validatedParams = updateActionSchema.parse(params);\n\n try {\n const profileResolution = await resolveVtexWriteProfile(validatedParams.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const updated = await updatePaymentRule(profileResolution.value.profileId, validatedParams.ruleId, {\n ...(validatedParams.commercialConditionId !== undefined\n ? { commercialConditionId: validatedParams.commercialConditionId }\n : {}),\n ...(validatedParams.paymentSystem !== undefined\n ? { paymentSystem: validatedParams.paymentSystem }\n : {}),\n ...(validatedParams.salesChannel !== undefined\n ? { salesChannel: validatedParams.salesChannel }\n : {}),\n ...(validatedParams.restrictedByCondition !== undefined\n ? { restrictedByCondition: validatedParams.restrictedByCondition }\n : {}),\n ...(validatedParams.installments !== undefined\n ? { installments: validatedParams.installments }\n : {}),\n });\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"payment_rules_update\",\n resourceId: String(validatedParams.ruleId),\n riskLevel: \"medium\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n before: null,\n after: updated,\n });\n } catch (err) {\n return handleVtexWriteError(\n err,\n `Failed to update VTEX payment rule ${validatedParams.ruleId}`\n );\n }\n }\n\n case \"delete\": {\n const validatedParams = deleteActionSchema.parse(params);\n\n const confirmationResponse = requireExplicitConfirmation(validatedParams.confirmed, \"payment_rules_delete\", {\n rule_id: validatedParams.ruleId,\n warnings: [paymentRuleWarnings.delete],\n });\n if (confirmationResponse) {\n return confirmationResponse;\n }\n\n try {\n const profileResolution = await resolveVtexWriteProfile(validatedParams.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n await deletePaymentRule(profileResolution.value.profileId, validatedParams.ruleId);\n\n return buildWriteSuccessResponse({\n profileId: profileResolution.value.profileId,\n operation: \"payment_rules_delete\",\n resourceId: String(validatedParams.ruleId),\n riskLevel: \"high\",\n confirmed: true,\n message:\n \"Payment rule deleted. Verify checkout no longer exposes the removed installment option to affected shoppers.\",\n warnings: [paymentRuleWarnings.delete],\n before: null,\n after: null,\n });\n } catch (err) {\n return handleVtexWriteError(\n err,\n `Failed to delete VTEX payment rule ${validatedParams.ruleId}`\n );\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { describe, expect, it } from "vitest";
3
3
  describe("VTEX commercial conditions documentation", () => {
4
- it("documents the new VTEX payments capability across project docs", async () => {
4
+ it("documents the corrected VTEX commercial conditions capability across project docs", async () => {
5
5
  const projectStatus = await readFile(new URL("../../docs/PROJECT_STATUS.md", import.meta.url), "utf8");
6
6
  const keyEndpoints = await readFile(
7
7
  new URL("../../src/services/vtex/docs/vtex-key-endpoints.md", import.meta.url),
@@ -12,15 +12,23 @@ describe("VTEX commercial conditions documentation", () => {
12
12
  "utf8"
13
13
  );
14
14
  expect(projectStatus).toContain("`35` tools VTEX.");
15
- expect(projectStatus).toContain("condiciones comerciales y reglas de pago");
16
- expect(keyEndpoints).toContain("Legacy payments endpoints exposed with sandbox caveat");
17
- expect(keyEndpoints).toContain("`vtex_commercial_conditions`");
15
+ expect(projectStatus).toContain("condiciones comerciales solo lectura oficial");
16
+ expect(keyEndpoints).toContain("Commercial conditions Catalog reads and legacy payment rules writes");
17
+ expect(keyEndpoints).toContain("/api/catalog_system/pvt/commercialcondition/list");
18
+ expect(keyEndpoints).toContain("manually in VTEX Admin");
18
19
  expect(keyEndpoints).toContain("`vtex_payment_rules`");
19
20
  expect(dashboardCapabilities).toContain(
20
21
  "Gesti\xF3n de Condiciones Comerciales y Reglas de Pago"
21
22
  );
22
23
  expect(dashboardCapabilities).toContain("`vtex_commercial_conditions`");
23
24
  expect(dashboardCapabilities).toContain("`vtex_payment_rules`");
25
+ expect(dashboardCapabilities).toContain("solo permite listar y consultar condiciones comerciales");
26
+ expect(dashboardCapabilities).toContain(
27
+ "crear manualmente la condici\xF3n faltante en VTEX Admin"
28
+ );
29
+ expect(dashboardCapabilities).not.toContain(
30
+ "primero conviene administrar esa condici\xF3n y sus reglas desde `vtex_commercial_conditions`"
31
+ );
24
32
  });
25
33
  });
26
34
  //# sourceMappingURL=vtex-commercial-conditions-docs.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../tests/vtex/vtex-commercial-conditions-docs.test.ts"],
4
- "sourcesContent": ["import { readFile } from \"node:fs/promises\";\nimport { describe, expect, it } from \"vitest\";\n\ndescribe(\"VTEX commercial conditions documentation\", () => {\n it(\"documents the new VTEX payments capability across project docs\", async () => {\n const projectStatus = await readFile(new URL(\"../../docs/PROJECT_STATUS.md\", import.meta.url), \"utf8\");\n const keyEndpoints = await readFile(\n new URL(\"../../src/services/vtex/docs/vtex-key-endpoints.md\", import.meta.url),\n \"utf8\"\n );\n const dashboardCapabilities = await readFile(\n new URL(\"../../../bi-mcp-dashboard/docs/content/CAPACIDADES_MCP.md\", import.meta.url),\n \"utf8\"\n );\n\n expect(projectStatus).toContain(\"`35` tools VTEX.\");\n expect(projectStatus).toContain(\"condiciones comerciales y reglas de pago\");\n\n expect(keyEndpoints).toContain(\"Legacy payments endpoints exposed with sandbox caveat\");\n expect(keyEndpoints).toContain(\"`vtex_commercial_conditions`\");\n expect(keyEndpoints).toContain(\"`vtex_payment_rules`\");\n\n expect(dashboardCapabilities).toContain(\n \"Gesti\u00F3n de Condiciones Comerciales y Reglas de Pago\"\n );\n expect(dashboardCapabilities).toContain(\"`vtex_commercial_conditions`\");\n expect(dashboardCapabilities).toContain(\"`vtex_payment_rules`\");\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,4CAA4C,MAAM;AACzD,KAAG,kEAAkE,YAAY;AAC/E,UAAM,gBAAgB,MAAM,SAAS,IAAI,IAAI,gCAAgC,YAAY,GAAG,GAAG,MAAM;AACrG,UAAM,eAAe,MAAM;AAAA,MACzB,IAAI,IAAI,sDAAsD,YAAY,GAAG;AAAA,MAC7E;AAAA,IACF;AACA,UAAM,wBAAwB,MAAM;AAAA,MAClC,IAAI,IAAI,6DAA6D,YAAY,GAAG;AAAA,MACpF;AAAA,IACF;AAEA,WAAO,aAAa,EAAE,UAAU,kBAAkB;AAClD,WAAO,aAAa,EAAE,UAAU,0CAA0C;AAE1E,WAAO,YAAY,EAAE,UAAU,uDAAuD;AACtF,WAAO,YAAY,EAAE,UAAU,8BAA8B;AAC7D,WAAO,YAAY,EAAE,UAAU,sBAAsB;AAErD,WAAO,qBAAqB,EAAE;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,qBAAqB,EAAE,UAAU,8BAA8B;AACtE,WAAO,qBAAqB,EAAE,UAAU,sBAAsB;AAAA,EAChE,CAAC;AACH,CAAC;",
4
+ "sourcesContent": ["import { readFile } from \"node:fs/promises\";\nimport { describe, expect, it } from \"vitest\";\n\ndescribe(\"VTEX commercial conditions documentation\", () => {\n it(\"documents the corrected VTEX commercial conditions capability across project docs\", async () => {\n const projectStatus = await readFile(new URL(\"../../docs/PROJECT_STATUS.md\", import.meta.url), \"utf8\");\n const keyEndpoints = await readFile(\n new URL(\"../../src/services/vtex/docs/vtex-key-endpoints.md\", import.meta.url),\n \"utf8\"\n );\n const dashboardCapabilities = await readFile(\n new URL(\"../../../bi-mcp-dashboard/docs/content/CAPACIDADES_MCP.md\", import.meta.url),\n \"utf8\"\n );\n\n expect(projectStatus).toContain(\"`35` tools VTEX.\");\n expect(projectStatus).toContain(\"condiciones comerciales solo lectura oficial\");\n\n expect(keyEndpoints).toContain(\"Commercial conditions Catalog reads and legacy payment rules writes\");\n expect(keyEndpoints).toContain(\"/api/catalog_system/pvt/commercialcondition/list\");\n expect(keyEndpoints).toContain(\"manually in VTEX Admin\");\n expect(keyEndpoints).toContain(\"`vtex_payment_rules`\");\n\n expect(dashboardCapabilities).toContain(\n \"Gesti\u00F3n de Condiciones Comerciales y Reglas de Pago\"\n );\n expect(dashboardCapabilities).toContain(\"`vtex_commercial_conditions`\");\n expect(dashboardCapabilities).toContain(\"`vtex_payment_rules`\");\n expect(dashboardCapabilities).toContain(\"solo permite listar y consultar condiciones comerciales\");\n expect(dashboardCapabilities).toContain(\n \"crear manualmente la condici\u00F3n faltante en VTEX Admin\"\n );\n expect(dashboardCapabilities).not.toContain(\n \"primero conviene administrar esa condici\u00F3n y sus reglas desde `vtex_commercial_conditions`\"\n );\n });\n});\n"],
5
+ "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,4CAA4C,MAAM;AACzD,KAAG,qFAAqF,YAAY;AAClG,UAAM,gBAAgB,MAAM,SAAS,IAAI,IAAI,gCAAgC,YAAY,GAAG,GAAG,MAAM;AACrG,UAAM,eAAe,MAAM;AAAA,MACzB,IAAI,IAAI,sDAAsD,YAAY,GAAG;AAAA,MAC7E;AAAA,IACF;AACA,UAAM,wBAAwB,MAAM;AAAA,MAClC,IAAI,IAAI,6DAA6D,YAAY,GAAG;AAAA,MACpF;AAAA,IACF;AAEA,WAAO,aAAa,EAAE,UAAU,kBAAkB;AAClD,WAAO,aAAa,EAAE,UAAU,8CAA8C;AAE9E,WAAO,YAAY,EAAE,UAAU,qEAAqE;AACpG,WAAO,YAAY,EAAE,UAAU,kDAAkD;AACjF,WAAO,YAAY,EAAE,UAAU,wBAAwB;AACvD,WAAO,YAAY,EAAE,UAAU,sBAAsB;AAErD,WAAO,qBAAqB,EAAE;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,qBAAqB,EAAE,UAAU,8BAA8B;AACtE,WAAO,qBAAqB,EAAE,UAAU,sBAAsB;AAC9D,WAAO,qBAAqB,EAAE,UAAU,yDAAyD;AACjG,WAAO,qBAAqB,EAAE;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,qBAAqB,EAAE,IAAI;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
6
6
  "names": []
7
7
  }