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