@cgalaviz/easysell-mcp 0.4.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/LICENSE +21 -0
- package/README.md +256 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +372 -0
- package/dist/client.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +49 -0
- package/dist/main.js.map +1 -0
- package/dist/registry/audit.d.ts +3 -0
- package/dist/registry/audit.d.ts.map +1 -0
- package/dist/registry/audit.js +23 -0
- package/dist/registry/audit.js.map +1 -0
- package/dist/registry/binary-downloads.d.ts +3 -0
- package/dist/registry/binary-downloads.d.ts.map +1 -0
- package/dist/registry/binary-downloads.js +80 -0
- package/dist/registry/binary-downloads.js.map +1 -0
- package/dist/registry/canned-responses.d.ts +11 -0
- package/dist/registry/canned-responses.d.ts.map +1 -0
- package/dist/registry/canned-responses.js +54 -0
- package/dist/registry/canned-responses.js.map +1 -0
- package/dist/registry/catalog-images.d.ts +3 -0
- package/dist/registry/catalog-images.d.ts.map +1 -0
- package/dist/registry/catalog-images.js +48 -0
- package/dist/registry/catalog-images.js.map +1 -0
- package/dist/registry/catalog.d.ts +3 -0
- package/dist/registry/catalog.d.ts.map +1 -0
- package/dist/registry/catalog.js +156 -0
- package/dist/registry/catalog.js.map +1 -0
- package/dist/registry/conversations.d.ts +9 -0
- package/dist/registry/conversations.d.ts.map +1 -0
- package/dist/registry/conversations.js +246 -0
- package/dist/registry/conversations.js.map +1 -0
- package/dist/registry/customers.d.ts +3 -0
- package/dist/registry/customers.d.ts.map +1 -0
- package/dist/registry/customers.js +242 -0
- package/dist/registry/customers.js.map +1 -0
- package/dist/registry/iam.d.ts +3 -0
- package/dist/registry/iam.d.ts.map +1 -0
- package/dist/registry/iam.js +116 -0
- package/dist/registry/iam.js.map +1 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +37 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/integrations.d.ts +3 -0
- package/dist/registry/integrations.d.ts.map +1 -0
- package/dist/registry/integrations.js +65 -0
- package/dist/registry/integrations.js.map +1 -0
- package/dist/registry/notifications.d.ts +3 -0
- package/dist/registry/notifications.d.ts.map +1 -0
- package/dist/registry/notifications.js +44 -0
- package/dist/registry/notifications.js.map +1 -0
- package/dist/registry/orders.d.ts +3 -0
- package/dist/registry/orders.d.ts.map +1 -0
- package/dist/registry/orders.js +134 -0
- package/dist/registry/orders.js.map +1 -0
- package/dist/registry/payments.d.ts +3 -0
- package/dist/registry/payments.d.ts.map +1 -0
- package/dist/registry/payments.js +39 -0
- package/dist/registry/payments.js.map +1 -0
- package/dist/registry/pricing.d.ts +3 -0
- package/dist/registry/pricing.d.ts.map +1 -0
- package/dist/registry/pricing.js +20 -0
- package/dist/registry/pricing.js.map +1 -0
- package/dist/registry/quotes.d.ts +19 -0
- package/dist/registry/quotes.d.ts.map +1 -0
- package/dist/registry/quotes.js +81 -0
- package/dist/registry/quotes.js.map +1 -0
- package/dist/registry/reports.d.ts +3 -0
- package/dist/registry/reports.d.ts.map +1 -0
- package/dist/registry/reports.js +33 -0
- package/dist/registry/reports.js.map +1 -0
- package/dist/registry/shipping.d.ts +3 -0
- package/dist/registry/shipping.d.ts.map +1 -0
- package/dist/registry/shipping.js +85 -0
- package/dist/registry/shipping.js.map +1 -0
- package/dist/registry/super-admin.d.ts +11 -0
- package/dist/registry/super-admin.d.ts.map +1 -0
- package/dist/registry/super-admin.js +222 -0
- package/dist/registry/super-admin.js.map +1 -0
- package/dist/registry/tenants.d.ts +13 -0
- package/dist/registry/tenants.d.ts.map +1 -0
- package/dist/registry/tenants.js +78 -0
- package/dist/registry/tenants.js.map +1 -0
- package/dist/registry/types.d.ts +67 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +10 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/uploads.d.ts +3 -0
- package/dist/registry/uploads.d.ts.map +1 -0
- package/dist/registry/uploads.js +86 -0
- package/dist/registry/uploads.js.map +1 -0
- package/dist/registry/usage.d.ts +9 -0
- package/dist/registry/usage.d.ts.map +1 -0
- package/dist/registry/usage.js +33 -0
- package/dist/registry/usage.js.map +1 -0
- package/dist/tools.d.ts +8 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +150 -0
- package/dist/tools.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
const addressFields = {
|
|
2
|
+
label: { type: "string", required: true, description: "Etiqueta, p. ej. \"Casa\" o \"Bodega\"." },
|
|
3
|
+
line1: { type: "string", required: true },
|
|
4
|
+
line2: { type: "string" },
|
|
5
|
+
city: { type: "string", required: true },
|
|
6
|
+
state: { type: "string", required: true },
|
|
7
|
+
postalCode: { type: "string", required: true, description: "5 dígitos." },
|
|
8
|
+
country: { type: "string" },
|
|
9
|
+
isDefault: { type: "boolean" },
|
|
10
|
+
};
|
|
11
|
+
export const customerRoutes = [
|
|
12
|
+
{
|
|
13
|
+
name: "customers_list",
|
|
14
|
+
method: "GET",
|
|
15
|
+
path: "/customers",
|
|
16
|
+
description: "Lista clientes del tenant, con búsqueda opcional por nombre/teléfono/correo.",
|
|
17
|
+
scopes: ["customers.read"],
|
|
18
|
+
query: {
|
|
19
|
+
q: { type: "string" },
|
|
20
|
+
includeArchived: { type: "string", enum: ["true", "false"], description: "Default false: no incluye archivados." },
|
|
21
|
+
tag: { type: "string", description: "Filtra por etiqueta exacta." },
|
|
22
|
+
hasPendingPayment: { type: "string", enum: ["true", "false"] },
|
|
23
|
+
limit: { type: "number", description: "Default 50, tope 200." },
|
|
24
|
+
offset: { type: "number" },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "customers_list_tags",
|
|
29
|
+
method: "GET",
|
|
30
|
+
path: "/customers/tags",
|
|
31
|
+
description: "Lista las etiquetas de clientes con conteo de uso.",
|
|
32
|
+
scopes: ["customers.read"],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "customers_get",
|
|
36
|
+
method: "GET",
|
|
37
|
+
path: "/customers/:id",
|
|
38
|
+
description: "Detalle de un cliente: datos de contacto, direcciones, identidades de canal.",
|
|
39
|
+
scopes: ["customers.read"],
|
|
40
|
+
pathParams: { id: { type: "string" } },
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "customers_get_summary",
|
|
44
|
+
method: "GET",
|
|
45
|
+
path: "/customers/:id/summary",
|
|
46
|
+
description: "Agregados lifetime del cliente: órdenes totales, pagadas, ticket promedio, cotizaciones abiertas, gasto total.",
|
|
47
|
+
scopes: ["customers.read"],
|
|
48
|
+
pathParams: { id: { type: "string" } },
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "customers_get_timeline",
|
|
52
|
+
method: "GET",
|
|
53
|
+
path: "/customers/:id/timeline",
|
|
54
|
+
description: "Timeline unificado del cliente (cotizaciones, pedidos, pagos, notas, conversaciones) en una sola lectura, " +
|
|
55
|
+
"ordenado por fecha. kind filtra por tipo de evento.",
|
|
56
|
+
scopes: ["customers.read"],
|
|
57
|
+
pathParams: { id: { type: "string" } },
|
|
58
|
+
query: {
|
|
59
|
+
kind: { type: "string", description: "Filtra por tipo, p. ej. \"ORDER\", \"QUOTE\", \"PAYMENT\"." },
|
|
60
|
+
limit: { type: "number", description: "Default 50, tope 200." },
|
|
61
|
+
offset: { type: "number" },
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "customers_history",
|
|
66
|
+
method: "GET",
|
|
67
|
+
path: "/customers/:id/history",
|
|
68
|
+
description: "Historial de cotizaciones y pedidos de un cliente (formato legacy, separado por tipo). " +
|
|
69
|
+
"Para UI moderna, prefiere `customers_get_timeline`.",
|
|
70
|
+
scopes: ["customers.read"],
|
|
71
|
+
pathParams: { id: { type: "string" } },
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "customers_archive",
|
|
75
|
+
method: "POST",
|
|
76
|
+
path: "/customers/:id/archive",
|
|
77
|
+
description: "Archiva un cliente (no lo borra; queda oculto de las listas por defecto).",
|
|
78
|
+
scopes: ["customers.write"],
|
|
79
|
+
destructiveHint: true,
|
|
80
|
+
pathParams: { id: { type: "string" } },
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "customers_unarchive",
|
|
84
|
+
method: "POST",
|
|
85
|
+
path: "/customers/:id/unarchive",
|
|
86
|
+
description: "Revierte el archivado de un cliente.",
|
|
87
|
+
scopes: ["customers.write"],
|
|
88
|
+
pathParams: { id: { type: "string" } },
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: "customers_create",
|
|
92
|
+
method: "POST",
|
|
93
|
+
path: "/customers",
|
|
94
|
+
description: "Crea un cliente nuevo, con direcciones opcionales (hasta 20).",
|
|
95
|
+
scopes: ["customers.write"],
|
|
96
|
+
body: {
|
|
97
|
+
fullName: { type: "string", required: true },
|
|
98
|
+
email: { type: "string", description: "Correo válido." },
|
|
99
|
+
phone: { type: "string" },
|
|
100
|
+
taxId: { type: "string" },
|
|
101
|
+
addresses: { type: "array", items: { type: "object", fields: addressFields } },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "customers_resolve_channel",
|
|
106
|
+
method: "POST",
|
|
107
|
+
path: "/customers/resolve-channel",
|
|
108
|
+
description: "Crea o encuentra el cliente de un contacto de WhatsApp y lo liga a la conversación en una sola llamada " +
|
|
109
|
+
"(pensada para el agente de chat). Con conversationId, el backend resuelve canal/teléfono desde el hilo real.",
|
|
110
|
+
scopes: ["customers.write"],
|
|
111
|
+
body: {
|
|
112
|
+
fullName: { type: "string", required: true },
|
|
113
|
+
email: { type: "string" },
|
|
114
|
+
phone: { type: "string" },
|
|
115
|
+
conversationId: { type: "string", description: "id de la conversación de WhatsApp de origen." },
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: "customers_update",
|
|
120
|
+
method: "PATCH",
|
|
121
|
+
path: "/customers/:id",
|
|
122
|
+
description: "Actualiza datos de contacto de un cliente. Control de concurrencia optimista por expectedVersion. " +
|
|
123
|
+
"También acepta campos fiscales (legalName, fiscalPostalCode, fiscalCfdiUse, fiscalRegimenFiscal, tags) " +
|
|
124
|
+
"que se persisten en el perfil 360°.",
|
|
125
|
+
scopes: ["customers.write"],
|
|
126
|
+
pathParams: { id: { type: "string" } },
|
|
127
|
+
body: {
|
|
128
|
+
expectedVersion: { type: "number", required: true },
|
|
129
|
+
fullName: { type: "string" },
|
|
130
|
+
email: { type: "string" },
|
|
131
|
+
phone: { type: "string" },
|
|
132
|
+
taxId: { type: "string" },
|
|
133
|
+
notes: { type: "string", description: "Máx. 2000 caracteres." },
|
|
134
|
+
legalName: { type: "string", description: "Razón social para CFDI." },
|
|
135
|
+
fiscalPostalCode: { type: "string", description: "5 dígitos." },
|
|
136
|
+
fiscalCfdiUse: { type: "string", description: "Clave SAT c_UsoCFDI, p. ej. G03." },
|
|
137
|
+
fiscalRegimenFiscal: { type: "string", description: "Clave c_RegimenFiscal, 3 dígitos, p. ej. 626." },
|
|
138
|
+
tags: { type: "array", items: { type: "string" }, description: "Hasta 20 etiquetas; se normalizan en minúsculas." },
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "customers_add_address",
|
|
143
|
+
method: "POST",
|
|
144
|
+
path: "/customers/:id/addresses",
|
|
145
|
+
description: "Agrega una dirección al cliente.",
|
|
146
|
+
scopes: ["customers.write"],
|
|
147
|
+
pathParams: { id: { type: "string" } },
|
|
148
|
+
body: addressFields,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: "customers_update_address",
|
|
152
|
+
method: "PATCH",
|
|
153
|
+
path: "/customers/:id/addresses/:addressId",
|
|
154
|
+
description: "Actualiza una dirección existente (todos los campos opcionales — solo se actualiza lo enviado).",
|
|
155
|
+
scopes: ["customers.write"],
|
|
156
|
+
pathParams: { id: { type: "string" }, addressId: { type: "string" } },
|
|
157
|
+
body: {
|
|
158
|
+
label: { type: "string" },
|
|
159
|
+
line1: { type: "string" },
|
|
160
|
+
line2: { type: "string" },
|
|
161
|
+
city: { type: "string" },
|
|
162
|
+
state: { type: "string" },
|
|
163
|
+
postalCode: { type: "string", description: "5 dígitos." },
|
|
164
|
+
country: { type: "string" },
|
|
165
|
+
isDefault: { type: "boolean" },
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: "customers_delete_address",
|
|
170
|
+
method: "DELETE",
|
|
171
|
+
path: "/customers/:id/addresses/:addressId",
|
|
172
|
+
description: "Borra una dirección del cliente.",
|
|
173
|
+
scopes: ["customers.write"],
|
|
174
|
+
destructiveHint: true,
|
|
175
|
+
pathParams: { id: { type: "string" }, addressId: { type: "string" } },
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: "customers_list_notes",
|
|
179
|
+
method: "GET",
|
|
180
|
+
path: "/customers/:id/notes",
|
|
181
|
+
description: "Lista las notas internas del cliente (no las ve el cliente).",
|
|
182
|
+
scopes: ["customers.read"],
|
|
183
|
+
pathParams: { id: { type: "string" } },
|
|
184
|
+
query: {
|
|
185
|
+
limit: { type: "number", description: "Default 50, tope 200." },
|
|
186
|
+
offset: { type: "number" },
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
name: "customers_add_note",
|
|
191
|
+
method: "POST",
|
|
192
|
+
path: "/customers/:id/notes",
|
|
193
|
+
description: "Agrega una nota interna al cliente (no la ve el cliente).",
|
|
194
|
+
scopes: ["customers.write"],
|
|
195
|
+
pathParams: { id: { type: "string" } },
|
|
196
|
+
body: { body: { type: "string", required: true, description: "Texto de la nota, máx. 4000 caracteres." } },
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "customers_delete_note",
|
|
200
|
+
method: "DELETE",
|
|
201
|
+
path: "/customers/:id/notes/:noteId",
|
|
202
|
+
description: "Borra una nota interna del cliente.",
|
|
203
|
+
scopes: ["customers.write"],
|
|
204
|
+
destructiveHint: true,
|
|
205
|
+
pathParams: { id: { type: "string" }, noteId: { type: "string" } },
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: "customers_link_identity",
|
|
209
|
+
method: "POST",
|
|
210
|
+
path: "/customers/:id/identities",
|
|
211
|
+
description: "Liga una identidad de canal (WhatsApp Meta o Evolution) al cliente por su id externo.",
|
|
212
|
+
scopes: ["customers.write"],
|
|
213
|
+
pathParams: { id: { type: "string" } },
|
|
214
|
+
body: {
|
|
215
|
+
channel: { type: "string", required: true, enum: ["WHATSAPP_META", "WHATSAPP_EVOLUTION"] },
|
|
216
|
+
externalId: { type: "string", required: true },
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "customers_grant_consent",
|
|
221
|
+
method: "POST",
|
|
222
|
+
path: "/customers/:id/consents/:scope",
|
|
223
|
+
description: "Registra el consentimiento del cliente para un propósito dado.",
|
|
224
|
+
scopes: ["customers.write"],
|
|
225
|
+
pathParams: {
|
|
226
|
+
id: { type: "string" },
|
|
227
|
+
scope: { type: "string", enum: ["WHATSAPP", "MARKETING", "DATA_PROCESSING"] },
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: "customers_revoke_consent",
|
|
232
|
+
method: "DELETE",
|
|
233
|
+
path: "/customers/:id/consents/:scope",
|
|
234
|
+
description: "Revoca un consentimiento previamente otorgado.",
|
|
235
|
+
scopes: ["customers.write"],
|
|
236
|
+
pathParams: {
|
|
237
|
+
id: { type: "string" },
|
|
238
|
+
scope: { type: "string", enum: ["WHATSAPP", "MARKETING", "DATA_PROCESSING"] },
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
//# sourceMappingURL=customers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/registry/customers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam.d.ts","sourceRoot":"","sources":["../../src/registry/iam.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoB3C,eAAO,MAAM,SAAS,EAAE,QAAQ,EAuG/B,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IAM del tenant: gestión de API keys, invitaciones y membresías
|
|
3
|
+
* (`/iam/*`). Cubre todo lo que un admin necesita para dar/quitar acceso
|
|
4
|
+
* a personas y a integraciones.
|
|
5
|
+
*
|
|
6
|
+
* `Assignable roles` se mantiene en sync con `apps/commerce-api/src/auth/membership.service.ts`
|
|
7
|
+
* (el backend lo lee del mismo lugar).
|
|
8
|
+
*
|
|
9
|
+
* IMPORTANTE: muchos de estos endpoints son SESSION-ONLY (el backend
|
|
10
|
+
* rechaza API keys con `!userId`). Las marqué igual en el scope para que
|
|
11
|
+
* el cliente MCP sepa que existen, pero la descripción lo aclara — si la
|
|
12
|
+
* key intenta llamarlos, va a recibir un 403 con un mensaje útil, no un
|
|
13
|
+
* stack trace. Las tres tools que sí funcionan con API key son
|
|
14
|
+
* `iam_list_api_keys`, `iam_revoke_api_key` (apikeys.manage, funcionan
|
|
15
|
+
* con API key) y el resto son session-only.
|
|
16
|
+
*/
|
|
17
|
+
const ASSIGNABLE_ROLES = ["OWNER", "ADMIN", "VENDOR", "FINANCE", "CATALOG", "SUPPORT", "VIEWER"];
|
|
18
|
+
export const iamRoutes = [
|
|
19
|
+
// --- API keys del propio tenant ---
|
|
20
|
+
{
|
|
21
|
+
name: "iam_list_api_keys",
|
|
22
|
+
method: "GET",
|
|
23
|
+
path: "/iam/api-keys",
|
|
24
|
+
description: "Lista las API keys del propio tenant (id, name, scopes, expira, última vez usada). " +
|
|
25
|
+
"La key completa (npk_...) solo se devuelve una vez al crearla. Funciona con API key " +
|
|
26
|
+
"(scope apikeys.manage).",
|
|
27
|
+
scopes: ["apikeys.manage"],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "iam_create_api_key",
|
|
31
|
+
method: "POST",
|
|
32
|
+
path: "/iam/api-keys",
|
|
33
|
+
description: "Crea una API key para el propio tenant con los scopes indicados. **SESSION-ONLY**: " +
|
|
34
|
+
"el backend exige `RequestContext.userId`; una API key sola no puede crear otra key " +
|
|
35
|
+
"(sería un canal de escalada de privilegios). Hazlo desde el panel del tenant. La key " +
|
|
36
|
+
"completa (npk_...) solo se devuelve en esta respuesta — guárdala.",
|
|
37
|
+
scopes: ["apikeys.manage"],
|
|
38
|
+
destructiveHint: true,
|
|
39
|
+
body: {
|
|
40
|
+
name: { type: "string", required: true },
|
|
41
|
+
scopes: { type: "array", required: true, items: { type: "string" }, description: "Lista de scopes del catálogo de policies." },
|
|
42
|
+
expiresInDays: { type: "number", description: "1 a 730. Sin esto, no vence." },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "iam_revoke_api_key",
|
|
47
|
+
method: "DELETE",
|
|
48
|
+
path: "/iam/api-keys/:id",
|
|
49
|
+
description: "Revoca una API key del propio tenant. Funciona con API key (apikeys.manage).",
|
|
50
|
+
scopes: ["apikeys.manage"],
|
|
51
|
+
destructiveHint: true,
|
|
52
|
+
pathParams: { id: { type: "string" } },
|
|
53
|
+
},
|
|
54
|
+
// --- Invitaciones ---
|
|
55
|
+
{
|
|
56
|
+
name: "iam_invite_user",
|
|
57
|
+
method: "POST",
|
|
58
|
+
path: "/iam/invitations",
|
|
59
|
+
description: "Invita a alguien al tenant con un rol. **SESSION-ONLY**: el backend exige usuario en " +
|
|
60
|
+
"sesión. Además, `assertCanGrantRole` rechaza授予 OWNER desde una API key. " +
|
|
61
|
+
"Desde el panel del tenant o con sesión humana.",
|
|
62
|
+
scopes: ["users.invite"],
|
|
63
|
+
body: {
|
|
64
|
+
email: { type: "string", required: true, description: "Correo del invitado." },
|
|
65
|
+
fullName: { type: "string", required: true },
|
|
66
|
+
role: { type: "string", required: true, enum: [...ASSIGNABLE_ROLES] },
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: "iam_revoke_invitation",
|
|
71
|
+
method: "DELETE",
|
|
72
|
+
path: "/iam/invitations/:id",
|
|
73
|
+
description: "Cancela una invitación pendiente. **SESSION-ONLY**.",
|
|
74
|
+
scopes: ["users.manage"],
|
|
75
|
+
pathParams: { id: { type: "string" } },
|
|
76
|
+
},
|
|
77
|
+
// --- Membresías ---
|
|
78
|
+
{
|
|
79
|
+
name: "iam_list_memberships",
|
|
80
|
+
method: "GET",
|
|
81
|
+
path: "/iam/memberships",
|
|
82
|
+
description: "Lista los miembros del tenant con su rol y status. **SESSION-ONLY**.",
|
|
83
|
+
scopes: ["users.manage"],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "iam_change_role",
|
|
87
|
+
method: "PATCH",
|
|
88
|
+
path: "/iam/memberships/:id",
|
|
89
|
+
description: "Cambia el rol de un miembro. **SESSION-ONLY**. El backend valida que el actor pueda " +
|
|
90
|
+
"otorgar el rol objetivo (no puedes ascender a alguien por encima de ti).",
|
|
91
|
+
scopes: ["users.manage"],
|
|
92
|
+
pathParams: { id: { type: "string" } },
|
|
93
|
+
body: { role: { type: "string", required: true, enum: [...ASSIGNABLE_ROLES] } },
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: "iam_set_agent_flag",
|
|
97
|
+
method: "PATCH",
|
|
98
|
+
path: "/iam/memberships/:id/agent",
|
|
99
|
+
description: "Marca/desmarca al miembro como agente humano de WhatsApp (lo incluye en `conversations_list_agents` " +
|
|
100
|
+
"y le permite tomar hilos con `conversations_claim`). **SESSION-ONLY**.",
|
|
101
|
+
scopes: ["users.manage"],
|
|
102
|
+
pathParams: { id: { type: "string" } },
|
|
103
|
+
body: { isAgent: { type: "boolean", required: true } },
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "iam_remove_membership",
|
|
107
|
+
method: "DELETE",
|
|
108
|
+
path: "/iam/memberships/:id",
|
|
109
|
+
description: "Pasa al miembro a DISABLED (no borra la fila; preserva el historial de auditoría). " +
|
|
110
|
+
"**SESSION-ONLY**.",
|
|
111
|
+
scopes: ["users.manage"],
|
|
112
|
+
destructiveHint: true,
|
|
113
|
+
pathParams: { id: { type: "string" } },
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
//# sourceMappingURL=iam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam.js","sourceRoot":"","sources":["../../src/registry/iam.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmB3C,eAAO,MAAM,SAAS,EAAE,QAAQ,EAkB/B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { catalogRoutes } from "./catalog.js";
|
|
2
|
+
import { quoteRoutes } from "./quotes.js";
|
|
3
|
+
import { customerRoutes } from "./customers.js";
|
|
4
|
+
import { orderRoutes } from "./orders.js";
|
|
5
|
+
import { paymentRoutes } from "./payments.js";
|
|
6
|
+
import { pricingRoutes } from "./pricing.js";
|
|
7
|
+
import { shippingRoutes } from "./shipping.js";
|
|
8
|
+
import { reportRoutes } from "./reports.js";
|
|
9
|
+
import { notificationRoutes } from "./notifications.js";
|
|
10
|
+
import { integrationRoutes } from "./integrations.js";
|
|
11
|
+
import { usageRoutes } from "./usage.js";
|
|
12
|
+
import { conversationRoutes } from "./conversations.js";
|
|
13
|
+
import { auditRoutes } from "./audit.js";
|
|
14
|
+
import { superAdminRoutes } from "./super-admin.js";
|
|
15
|
+
import { cannedResponseRoutes } from "./canned-responses.js";
|
|
16
|
+
import { tenantRoutes } from "./tenants.js";
|
|
17
|
+
import { iamRoutes } from "./iam.js";
|
|
18
|
+
export const allRoutes = [
|
|
19
|
+
...catalogRoutes,
|
|
20
|
+
...quoteRoutes,
|
|
21
|
+
...customerRoutes,
|
|
22
|
+
...orderRoutes,
|
|
23
|
+
...paymentRoutes,
|
|
24
|
+
...pricingRoutes,
|
|
25
|
+
...shippingRoutes,
|
|
26
|
+
...reportRoutes,
|
|
27
|
+
...notificationRoutes,
|
|
28
|
+
...integrationRoutes,
|
|
29
|
+
...usageRoutes,
|
|
30
|
+
...conversationRoutes,
|
|
31
|
+
...auditRoutes,
|
|
32
|
+
...cannedResponseRoutes,
|
|
33
|
+
...tenantRoutes,
|
|
34
|
+
...iamRoutes,
|
|
35
|
+
...superAdminRoutes,
|
|
36
|
+
];
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC,GAAG,aAAa;IAChB,GAAG,WAAW;IACd,GAAG,cAAc;IACjB,GAAG,WAAW;IACd,GAAG,aAAa;IAChB,GAAG,aAAa;IAChB,GAAG,cAAc;IACjB,GAAG,YAAY;IACf,GAAG,kBAAkB;IACrB,GAAG,iBAAiB;IACpB,GAAG,WAAW;IACd,GAAG,kBAAkB;IACrB,GAAG,WAAW;IACd,GAAG,oBAAoB;IACvB,GAAG,YAAY;IACf,GAAG,SAAS;IACZ,GAAG,gBAAgB;CACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/registry/integrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,iBAAiB,EAAE,QAAQ,EAgEvC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export const integrationRoutes = [
|
|
2
|
+
{
|
|
3
|
+
name: "integrations_list",
|
|
4
|
+
method: "GET",
|
|
5
|
+
path: "/integrations",
|
|
6
|
+
description: "Lista las integraciones (webhooks salientes/entrantes) configuradas por el tenant.",
|
|
7
|
+
scopes: ["integrations.read"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
name: "integrations_create",
|
|
11
|
+
method: "POST",
|
|
12
|
+
path: "/integrations",
|
|
13
|
+
description: "Da de alta una integración. Con direction INBOUND o BIDIRECTIONAL, el backend emite webhookUrl y cifra el secreto.",
|
|
14
|
+
scopes: ["integrations.write"],
|
|
15
|
+
body: {
|
|
16
|
+
name: { type: "string", required: true },
|
|
17
|
+
provider: { type: "string", required: true, description: "Letras, números, punto, guion y guion bajo." },
|
|
18
|
+
direction: { type: "string", required: true, enum: ["INBOUND", "OUTBOUND", "BIDIRECTIONAL"] },
|
|
19
|
+
endpoint: { type: "string", description: "URL destino, para OUTBOUND/BIDIRECTIONAL." },
|
|
20
|
+
secret: { type: "string", description: "8 a 256 caracteres; firma HMAC de los eventos." },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "integrations_disable",
|
|
25
|
+
method: "POST",
|
|
26
|
+
path: "/integrations/:id/disable",
|
|
27
|
+
description: "Desactiva una integración.",
|
|
28
|
+
scopes: ["integrations.write"],
|
|
29
|
+
destructiveHint: true,
|
|
30
|
+
pathParams: { id: { type: "string" } },
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "integrations_list_events",
|
|
34
|
+
method: "GET",
|
|
35
|
+
path: "/integrations/events",
|
|
36
|
+
description: "Lista eventos de integración (entrantes/salientes), opcionalmente filtrados por status.",
|
|
37
|
+
scopes: ["integrations.read"],
|
|
38
|
+
query: { status: { type: "string" } },
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "integrations_reprocess_event",
|
|
42
|
+
method: "POST",
|
|
43
|
+
path: "/integrations/events/:eventId/reprocess",
|
|
44
|
+
description: "Reintenta el procesamiento de un evento de integración fallido.",
|
|
45
|
+
scopes: ["integrations.write"],
|
|
46
|
+
pathParams: { eventId: { type: "string" } },
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: "integrations_publish",
|
|
50
|
+
method: "POST",
|
|
51
|
+
path: "/integrations/:id/publish",
|
|
52
|
+
description: "Publica un evento saliente hacia el endpoint de una integración OUTBOUND/BIDIRECTIONAL, firmado con su secreto. " +
|
|
53
|
+
"ADVERTENCIA: el secreto viaja en el body y queda registrado en cualquier log del cliente MCP que persista argumentos " +
|
|
54
|
+
"(Claude Code, Claude Desktop y otros lo hacen para debug). No llames esta tool desde contextos donde el log de tool " +
|
|
55
|
+
"args sea visible a terceros.",
|
|
56
|
+
scopes: ["integrations.write"],
|
|
57
|
+
pathParams: { id: { type: "string" } },
|
|
58
|
+
body: {
|
|
59
|
+
eventName: { type: "string", required: true },
|
|
60
|
+
payload: { type: "any", required: true },
|
|
61
|
+
secret: { type: "string", required: true, description: "Debe coincidir con el secreto de la integración. Viaja en el body — ver ADVERTENCIA en la descripción." },
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/registry/integrations.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C;QACE,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,oFAAoF;QACjG,MAAM,EAAE,CAAC,mBAAmB,CAAC;KAC9B;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,oHAAoH;QACjI,MAAM,EAAE,CAAC,oBAAoB,CAAC;QAC9B,IAAI,EAAE;YACJ,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6CAA6C,EAAE;YACxG,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE;YAC7F,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACtF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;SAC1F;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE,CAAC,oBAAoB,CAAC;QAC9B,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACvC;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,yFAAyF;QACtG,MAAM,EAAE,CAAC,mBAAmB,CAAC;QAC7B,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACtC;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,yCAAyC;QAC/C,WAAW,EAAE,iEAAiE;QAC9E,MAAM,EAAE,CAAC,oBAAoB,CAAC;QAC9B,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KAC5C;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,2BAA2B;QACjC,WAAW,EACT,kHAAkH;YAClH,uHAAuH;YACvH,sHAAsH;YACtH,8BAA8B;QAChC,MAAM,EAAE,CAAC,oBAAoB,CAAC;QAC9B,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;QACtC,IAAI,EAAE;YACJ,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7C,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wGAAwG,EAAE;SAClK;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/registry/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EA0CxC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const notificationRoutes = [
|
|
2
|
+
{
|
|
3
|
+
name: "notifications_list",
|
|
4
|
+
method: "GET",
|
|
5
|
+
path: "/notifications",
|
|
6
|
+
description: "Lista notificaciones (WhatsApp/email/SMS/push) programadas o enviadas por el tenant.",
|
|
7
|
+
scopes: ["notifications.read"],
|
|
8
|
+
query: { status: { type: "string" } },
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "notifications_timeline",
|
|
12
|
+
method: "GET",
|
|
13
|
+
path: "/notifications/timeline/:subjectType/:subjectId",
|
|
14
|
+
description: "Línea de tiempo de notificaciones de un sujeto dado (p. ej. un pedido o un cliente).",
|
|
15
|
+
scopes: ["notifications.read"],
|
|
16
|
+
pathParams: {
|
|
17
|
+
subjectType: { type: "string", description: "Tipo del sujeto, p. ej. \"Order\" o \"Customer\"." },
|
|
18
|
+
subjectId: { type: "string" },
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "notifications_cohort_report",
|
|
23
|
+
method: "GET",
|
|
24
|
+
path: "/notifications/report/cohort",
|
|
25
|
+
description: "Reporte de entregabilidad/engagement de notificaciones por cohorte.",
|
|
26
|
+
scopes: ["notifications.read"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "notifications_schedule",
|
|
30
|
+
method: "POST",
|
|
31
|
+
path: "/notifications/schedule",
|
|
32
|
+
description: "Programa una notificación a un cliente o usuario, por una plantilla ya definida en el sistema.",
|
|
33
|
+
scopes: ["notifications.write"],
|
|
34
|
+
body: {
|
|
35
|
+
recipientType: { type: "string", required: true, enum: ["CUSTOMER", "USER"] },
|
|
36
|
+
recipientId: { type: "string", required: true, description: "UUID del cliente o usuario." },
|
|
37
|
+
channel: { type: "string", required: true, enum: ["EMAIL", "WHATSAPP", "SMS", "PUSH"] },
|
|
38
|
+
templateKey: { type: "string", required: true },
|
|
39
|
+
payload: { type: "any", required: true, description: "Objeto con las variables que la plantilla espera." },
|
|
40
|
+
scheduledAt: { type: "string", description: "Fecha ISO; ausente = lo antes posible." },
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/registry/notifications.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,sFAAsF;QACnG,MAAM,EAAE,CAAC,oBAAoB,CAAC;QAC9B,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACtC;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,iDAAiD;QACvD,WAAW,EAAE,sFAAsF;QACnG,MAAM,EAAE,CAAC,oBAAoB,CAAC;QAC9B,UAAU,EAAE;YACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;YACjG,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC9B;KACF;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,qEAAqE;QAClF,MAAM,EAAE,CAAC,oBAAoB,CAAC;KAC/B;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EAAE,gGAAgG;QAC7G,MAAM,EAAE,CAAC,qBAAqB,CAAC;QAC/B,IAAI,EAAE;YACJ,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE;YAC7E,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6BAA6B,EAAE;YAC3F,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;YACvF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC/C,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mDAAmD,EAAE;YAC1G,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;SACvF;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/registry/orders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQ3C,eAAO,MAAM,WAAW,EAAE,QAAQ,EAoIjC,CAAC"}
|