ponch-mcp-server 1.0.1

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.
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Schemas / Builders del modulo de Marketing — copia para TypeScript
3
+ *
4
+ * OBS-3: Copia de src/schemas/marketing.js adaptada a TypeScript.
5
+ * Si cambian en src/schemas/marketing.js → actualizar aqui tambien.
6
+ *
7
+ * Son funciones puras, no dependen de React ni Firebase.
8
+ */
9
+ // ═══════════════════════════════════════════════════════════
10
+ // CONSTANTES
11
+ // ═══════════════════════════════════════════════════════════
12
+ export const ESTADO_FOTO = {
13
+ NUEVA: 'nueva',
14
+ POR_EDITAR: 'por_editar',
15
+ EDITADA: 'editada',
16
+ PUBLICADA: 'publicada',
17
+ DESCARTADA: 'descartada',
18
+ };
19
+ export const TIPO_FOTO = {
20
+ PRODUCTO: 'producto',
21
+ ARREGLO: 'arreglo',
22
+ ENTREGA: 'entrega',
23
+ TALLER: 'taller',
24
+ EQUIPO: 'equipo',
25
+ EVENTO: 'evento',
26
+ };
27
+ export const PLATAFORMA = {
28
+ GBP: 'gbp',
29
+ SHOPIFY_BLOG: 'shopify_blog',
30
+ INSTAGRAM: 'instagram',
31
+ REVIEW: 'review',
32
+ };
33
+ export const TIPO_CONTENIDO = {
34
+ POST: 'post',
35
+ BLOG: 'blog',
36
+ CAROUSEL: 'carousel',
37
+ REEL: 'reel',
38
+ STORY: 'story',
39
+ REVIEW_RESPONSE: 'review_response',
40
+ };
41
+ export const TIPO_GBP_POST = {
42
+ STANDARD: 'STANDARD',
43
+ OFFER: 'OFFER',
44
+ EVENT: 'EVENT',
45
+ };
46
+ export const CTA_GBP = {
47
+ SHOP: 'SHOP',
48
+ LEARN_MORE: 'LEARN_MORE',
49
+ SIGN_UP: 'SIGN_UP',
50
+ CALL: 'CALL',
51
+ };
52
+ export const ESTADO_CONTENIDO = {
53
+ BORRADOR: 'borrador',
54
+ GENERADO: 'generado',
55
+ PENDIENTE_APROBACION: 'pendiente_aprobacion',
56
+ APROBADO: 'aprobado',
57
+ PUBLICADO: 'publicado',
58
+ RECHAZADO: 'rechazado',
59
+ EDITADO: 'editado',
60
+ ERROR_PUBLICACION: 'error_publicacion',
61
+ };
62
+ export const TRANSICIONES_CONTENIDO = {
63
+ [ESTADO_CONTENIDO.BORRADOR]: [ESTADO_CONTENIDO.GENERADO],
64
+ [ESTADO_CONTENIDO.GENERADO]: [ESTADO_CONTENIDO.PENDIENTE_APROBACION],
65
+ [ESTADO_CONTENIDO.PENDIENTE_APROBACION]: [ESTADO_CONTENIDO.APROBADO, ESTADO_CONTENIDO.RECHAZADO],
66
+ [ESTADO_CONTENIDO.APROBADO]: [ESTADO_CONTENIDO.PUBLICADO, ESTADO_CONTENIDO.ERROR_PUBLICACION],
67
+ [ESTADO_CONTENIDO.PUBLICADO]: [],
68
+ [ESTADO_CONTENIDO.RECHAZADO]: [ESTADO_CONTENIDO.EDITADO],
69
+ [ESTADO_CONTENIDO.EDITADO]: [ESTADO_CONTENIDO.PENDIENTE_APROBACION],
70
+ [ESTADO_CONTENIDO.ERROR_PUBLICACION]: [ESTADO_CONTENIDO.PENDIENTE_APROBACION],
71
+ };
72
+ export function esTransicionValida(estadoActual, estadoNuevo) {
73
+ const permitidos = TRANSICIONES_CONTENIDO[estadoActual];
74
+ if (!permitidos)
75
+ return false;
76
+ return permitidos.includes(estadoNuevo);
77
+ }
78
+ export const ESTADO_CALENDARIO_ITEM = {
79
+ PLANIFICADO: 'planificado',
80
+ GENERADO: 'generado',
81
+ APROBADO: 'aprobado',
82
+ PUBLICADO: 'publicado',
83
+ RECHAZADO: 'rechazado',
84
+ };
85
+ export const TRANSICIONES_FOTO = {
86
+ [ESTADO_FOTO.NUEVA]: [ESTADO_FOTO.POR_EDITAR, ESTADO_FOTO.EDITADA, ESTADO_FOTO.DESCARTADA],
87
+ [ESTADO_FOTO.POR_EDITAR]: [ESTADO_FOTO.EDITADA, ESTADO_FOTO.DESCARTADA],
88
+ [ESTADO_FOTO.EDITADA]: [ESTADO_FOTO.PUBLICADA, ESTADO_FOTO.DESCARTADA],
89
+ [ESTADO_FOTO.PUBLICADA]: [],
90
+ [ESTADO_FOTO.DESCARTADA]: [],
91
+ };
92
+ export function validarTransicionFoto(estadoActual, estadoNuevo) {
93
+ const permitidos = TRANSICIONES_FOTO[estadoActual];
94
+ if (!permitidos)
95
+ return false;
96
+ return permitidos.includes(estadoNuevo);
97
+ }
98
+ export function buildFoto(data) {
99
+ return {
100
+ id: data.id,
101
+ tenantId: data.tenantId,
102
+ brandId: data.brandId,
103
+ archivoOriginal: data.archivoOriginal ?? null,
104
+ archivoEditado: data.archivoEditado ?? null,
105
+ estado: data.estado ?? ESTADO_FOTO.NUEVA,
106
+ tipo: data.tipo ?? null,
107
+ flores: data.flores ?? [],
108
+ productos: data.productos ?? [],
109
+ fechaIngesta: data.fechaIngesta ?? null,
110
+ fechaEdicion: data.fechaEdicion ?? null,
111
+ usadaEn: data.usadaEn ?? [],
112
+ metadata: data.metadata ?? { ancho: null, alto: null, peso: null, formato: null },
113
+ creadoPorId: data.creadoPorId ?? null,
114
+ creadoPorNombre: data.creadoPorNombre ?? null,
115
+ };
116
+ }
117
+ export function buildDatosGBP(data = {}) {
118
+ return {
119
+ summary: data.summary ?? null,
120
+ topicType: data.topicType ?? TIPO_GBP_POST.STANDARD,
121
+ callToAction: data.callToAction ?? null,
122
+ perfilId: data.perfilId ?? null,
123
+ };
124
+ }
125
+ export function buildDatosBlog(data = {}) {
126
+ return {
127
+ title: data.title ?? null,
128
+ body: data.body ?? null,
129
+ handle: data.handle ?? null,
130
+ metaTitle: data.metaTitle ?? null,
131
+ metaDescription: data.metaDescription ?? null,
132
+ tags: data.tags ?? [],
133
+ imageAltText: data.imageAltText ?? null,
134
+ keywordsSecundarios: data.keywordsSecundarios ?? [],
135
+ productosLinkeados: data.productosLinkeados ?? [],
136
+ structuredData: data.structuredData ?? null,
137
+ };
138
+ }
139
+ export function buildDatosIG(data = {}) {
140
+ return {
141
+ caption: data.caption ?? null,
142
+ altText: data.altText ?? null,
143
+ mediaType: data.mediaType ?? 'IMAGE',
144
+ productTags: data.productTags ?? [],
145
+ hashtags: data.hashtags ?? [],
146
+ };
147
+ }
148
+ export function buildDatosReview(data = {}) {
149
+ return {
150
+ reviewText: data.reviewText ?? null,
151
+ rating: data.rating ?? null,
152
+ reviewerName: data.reviewerName ?? null,
153
+ responseText: data.responseText ?? null,
154
+ googleReviewId: data.googleReviewId ?? null,
155
+ };
156
+ }
157
+ export function buildContenido(data) {
158
+ return {
159
+ id: data.id,
160
+ tenantId: data.tenantId,
161
+ brandId: data.brandId,
162
+ plataforma: data.plataforma ?? null,
163
+ tipo: data.tipo ?? TIPO_CONTENIDO.POST,
164
+ keyword: data.keyword ?? null,
165
+ languageCode: data.languageCode ?? 'es',
166
+ estado: data.estado ?? ESTADO_CONTENIDO.BORRADOR,
167
+ fotoId: data.fotoId ?? null,
168
+ mediaUrl: data.mediaUrl ?? null,
169
+ calendarioItemRef: data.calendarioItemRef ?? null,
170
+ datos: data.datos ?? {},
171
+ creadoAt: data.creadoAt ?? null,
172
+ creadoPorId: data.creadoPorId ?? null,
173
+ aprobadoAt: data.aprobadoAt ?? null,
174
+ aprobadoPorId: data.aprobadoPorId ?? null,
175
+ aprobadoPorNombre: data.aprobadoPorNombre ?? null,
176
+ rechazadoAt: data.rechazadoAt ?? null,
177
+ rechazadoMotivo: data.rechazadoMotivo ?? null,
178
+ editadoAt: data.editadoAt ?? null,
179
+ publicadoAt: data.publicadoAt ?? null,
180
+ errorPublicacion: data.errorPublicacion ?? null,
181
+ externalId: data.externalId ?? null,
182
+ };
183
+ }
184
+ export function buildCalendario(data) {
185
+ return {
186
+ id: data.id,
187
+ tenantId: data.tenantId,
188
+ brandId: data.brandId,
189
+ mes: data.mes ?? null,
190
+ semanas: data.semanas ?? [],
191
+ creadoAt: data.creadoAt ?? null,
192
+ creadoPorId: data.creadoPorId ?? null,
193
+ updatedAt: data.updatedAt ?? null,
194
+ };
195
+ }
196
+ export function buildCalendarioItem(data = {}) {
197
+ return {
198
+ dia: data.dia ?? null,
199
+ plataforma: data.plataforma ?? null,
200
+ tipo: data.tipo ?? null,
201
+ keyword: data.keyword ?? null,
202
+ tema: data.tema ?? null,
203
+ productoId: data.productoId ?? null,
204
+ estado: data.estado ?? ESTADO_CALENDARIO_ITEM.PLANIFICADO,
205
+ contenidoRef: data.contenidoRef ?? null,
206
+ };
207
+ }
208
+ export function buildBrandConfig(data) {
209
+ return {
210
+ nombre: data.nombre ?? null,
211
+ dominio: data.dominio ?? null,
212
+ semrushDatabase: data.semrushDatabase ?? null,
213
+ seoSnapshot: data.seoSnapshot ?? null,
214
+ plan: data.plan ?? null,
215
+ gbpPerfiles: data.gbpPerfiles ?? [],
216
+ frecuencia: data.frecuencia ?? null,
217
+ idiomas: data.idiomas ?? null,
218
+ igCuenta: data.igCuenta ?? null,
219
+ canvaTeamId: data.canvaTeamId ?? null,
220
+ shopifyDomain: data.shopifyDomain ?? null,
221
+ conexiones: data.conexiones ?? { gbp: null, shopify: null, instagram: null, canva: null },
222
+ };
223
+ }
224
+ export function buildConfig(data) {
225
+ return {
226
+ id: data.id,
227
+ tenantId: data.tenantId,
228
+ brands: data.brands ?? {},
229
+ semrushUsage: data.semrushUsage ?? null,
230
+ updatedAt: data.updatedAt ?? null,
231
+ };
232
+ }
233
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Context tools
3
+ *
4
+ * set_context — Modo A (Cowork): selecciona tenant y brand
5
+ * connect_account — Modo B (Tenant): intercambia codigo por custom token
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { Session } from '../auth.js';
9
+ export declare function registerContextTools(server: McpServer, session: Session): void;
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAkJ9E"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Context tools
3
+ *
4
+ * set_context — Modo A (Cowork): selecciona tenant y brand
5
+ * connect_account — Modo B (Tenant): intercambia codigo por custom token
6
+ */
7
+ import { z } from 'zod';
8
+ import { saveCredentials, FIREBASE_CONFIG } from '../auth.js';
9
+ import { readDoc, reauthClient } from '../firestore.js';
10
+ import { getFunctions, httpsCallable } from 'firebase/functions';
11
+ import { initializeApp, getApps, getApp } from 'firebase/app';
12
+ export function registerContextTools(server, session) {
13
+ // ─── set_context (solo Modo A) ───
14
+ if (session.mode === 'cowork') {
15
+ server.tool('set_context', 'Establece el tenant y brand para esta sesion. Solo disponible en Modo Cowork (admin).', {
16
+ tenantId: z.string().describe('ID del tenant (ej: "atteyo")'),
17
+ brandId: z.string().describe('ID de la brand (ej: "ponch")'),
18
+ }, async ({ tenantId, brandId }) => {
19
+ const config = await readDoc('marketing_config', tenantId);
20
+ if (!config) {
21
+ return {
22
+ content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `Tenant "${tenantId}" no tiene marketing_config` }) }],
23
+ };
24
+ }
25
+ const brands = (config.brands ?? {});
26
+ if (!brands[brandId]) {
27
+ return {
28
+ content: [{
29
+ type: 'text',
30
+ text: JSON.stringify({
31
+ ok: false,
32
+ error: `Brand "${brandId}" no existe en tenant "${tenantId}"`,
33
+ brandsDisponibles: Object.keys(brands),
34
+ }),
35
+ }],
36
+ };
37
+ }
38
+ session.setContext(tenantId, brandId);
39
+ const brand = brands[brandId];
40
+ return {
41
+ content: [{
42
+ type: 'text',
43
+ text: JSON.stringify({
44
+ ok: true,
45
+ tenant: tenantId,
46
+ brand: brand.nombre ?? brandId,
47
+ dominio: brand.dominio ?? null,
48
+ }),
49
+ }],
50
+ };
51
+ });
52
+ }
53
+ // ─── connect_account (solo Modo B) ───
54
+ if (session.mode === 'tenant') {
55
+ server.tool('connect_account', 'Conecta tu cuenta de Ponch para acceder a tus datos. Primero visita https://atpops.vercel.app/auth/mcp-connect para obtener el codigo.', {
56
+ code: z.string().describe('Codigo de conexion de 8 caracteres (ej: ABCD-EFGH) obtenido de la pagina web'),
57
+ }, async ({ code }) => {
58
+ try {
59
+ // Inicializar Firebase App para poder llamar Cloud Functions
60
+ const app = getApps().length > 0 ? getApp() : initializeApp(FIREBASE_CONFIG);
61
+ const functions = getFunctions(app);
62
+ // Llamar Cloud Function para intercambiar codigo por custom token
63
+ const exchangeFn = httpsCallable(functions, 'mcpExchangeCode');
64
+ const result = await exchangeFn({ code });
65
+ const data = result.data;
66
+ // Guardar credentials en ~/.ponch/credentials.json
67
+ saveCredentials({
68
+ tenantId: data.tenantId,
69
+ userId: data.userId,
70
+ userName: data.userName,
71
+ rol: data.rol,
72
+ brands: data.brands,
73
+ customToken: data.customToken,
74
+ idToken: null,
75
+ refreshToken: null,
76
+ connectedAt: new Date().toISOString(),
77
+ });
78
+ // Autenticar Firebase Client SDK
79
+ const authOk = await reauthClient(data.customToken);
80
+ if (!authOk) {
81
+ return {
82
+ content: [{
83
+ type: 'text',
84
+ text: JSON.stringify({
85
+ ok: false,
86
+ error: 'Codigo aceptado pero error autenticando con Firebase. Reinicia el MCP.',
87
+ }),
88
+ }],
89
+ };
90
+ }
91
+ // Actualizar contexto de sesion
92
+ const defaultBrand = data.brands[0]?.id ?? null;
93
+ session.setTenantContext(data.tenantId, defaultBrand ?? '', data.brands, data.userId, data.userName);
94
+ return {
95
+ content: [{
96
+ type: 'text',
97
+ text: JSON.stringify({
98
+ ok: true,
99
+ tenant: data.tenantId,
100
+ usuario: data.userName,
101
+ rol: data.rol,
102
+ brands: data.brands,
103
+ brandActiva: defaultBrand,
104
+ multiTenant: data.rol === 'super_admin',
105
+ mensaje: data.rol === 'super_admin'
106
+ ? 'Cuenta super_admin conectada. Puedes usar set_context para cambiar de tenant. Reinicia el MCP para activar set_context.'
107
+ : 'Cuenta conectada exitosamente. Tus datos quedan guardados para futuras sesiones.',
108
+ }),
109
+ }],
110
+ };
111
+ }
112
+ catch (err) {
113
+ const message = err instanceof Error ? err.message : 'Error desconocido';
114
+ return {
115
+ content: [{
116
+ type: 'text',
117
+ text: JSON.stringify({
118
+ ok: false,
119
+ error: `Error conectando: ${message}`,
120
+ instruccion: 'Verifica que el codigo es correcto y no ha expirado. Genera uno nuevo en https://atpops.vercel.app/auth/mcp-connect',
121
+ }),
122
+ }],
123
+ };
124
+ }
125
+ });
126
+ }
127
+ }
128
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Core tools — siempre cargados (defer_loading: false)
3
+ *
4
+ * get_business_summary — Resumen general del negocio
5
+ * get_pending_actions — Todo lo que necesita atencion
6
+ * execute_action — Ejecuta acciones sobre contenido/fotos
7
+ */
8
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
+ import type { Session } from '../auth.js';
10
+ export declare function registerCoreTools(server: McpServer, session: Session): void;
11
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/tools/core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAuO3E"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Core tools — siempre cargados (defer_loading: false)
3
+ *
4
+ * get_business_summary — Resumen general del negocio
5
+ * get_pending_actions — Todo lo que necesita atencion
6
+ * execute_action — Ejecuta acciones sobre contenido/fotos
7
+ */
8
+ import { z } from 'zod';
9
+ import { queryByTenant, readDoc, updateDoc, serverTimestamp } from '../firestore.js';
10
+ import { esTransicionValida, validarTransicionFoto, ESTADO_CONTENIDO, ESTADO_FOTO } from '../schemas/index.js';
11
+ export function registerCoreTools(server, session) {
12
+ // ═══════════════════════════════════════════════════════════
13
+ // get_business_summary
14
+ // ═══════════════════════════════════════════════════════════
15
+ server.tool('get_business_summary', 'Resumen general del negocio: metricas clave, contenido pendiente, estado de conexiones, alertas.', {
16
+ brandId: z.string().optional().describe('ID de la brand. Si no se pasa, usa la brand del contexto.'),
17
+ }, async ({ brandId: inputBrandId }) => {
18
+ const tenantId = session.requireTenant();
19
+ const brandId = inputBrandId ?? session.brandId;
20
+ // Leer config
21
+ const config = await readDoc('marketing_config', tenantId);
22
+ if (!config) {
23
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'No hay marketing_config para este tenant' }) }] };
24
+ }
25
+ const brands = (config.brands ?? {});
26
+ // Si no hay brandId, listar brands disponibles
27
+ if (!brandId) {
28
+ const brandList = Object.entries(brands).map(([id, b]) => ({
29
+ id,
30
+ nombre: b.nombre,
31
+ dominio: b.dominio,
32
+ }));
33
+ return {
34
+ content: [{
35
+ type: 'text',
36
+ text: JSON.stringify({
37
+ mensaje: 'No hay brand seleccionada. Brands disponibles:',
38
+ brands: brandList,
39
+ instruccion: 'Usa set_context o pasa brandId al tool.',
40
+ }),
41
+ }],
42
+ };
43
+ }
44
+ const brand = brands[brandId];
45
+ if (!brand) {
46
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `Brand "${brandId}" no existe` }) }] };
47
+ }
48
+ // Queries paralelos
49
+ const [contenidoPendiente, fotosNuevas, contenidoPublicado] = await Promise.all([
50
+ queryByTenant(session, 'marketing_contenido', [
51
+ { field: 'brandId', op: '==', value: brandId },
52
+ { field: 'estado', op: '==', value: ESTADO_CONTENIDO.PENDIENTE_APROBACION },
53
+ ]),
54
+ queryByTenant(session, 'marketing_fotos', [
55
+ { field: 'brandId', op: '==', value: brandId },
56
+ { field: 'estado', op: '==', value: ESTADO_FOTO.NUEVA },
57
+ ]),
58
+ queryByTenant(session, 'marketing_contenido', [
59
+ { field: 'brandId', op: '==', value: brandId },
60
+ { field: 'estado', op: '==', value: ESTADO_CONTENIDO.PUBLICADO },
61
+ ], { limit: 50 }),
62
+ ]);
63
+ const seo = brand.seoSnapshot;
64
+ const conexiones = brand.conexiones;
65
+ const alertas = [];
66
+ if (!seo)
67
+ alertas.push('No hay snapshot SEO. Ejecuta el snapshot primero.');
68
+ if (!brand.plan)
69
+ alertas.push('No hay plan de marketing. Genera uno desde el snapshot SEO.');
70
+ if (contenidoPendiente.length > 5)
71
+ alertas.push(`${contenidoPendiente.length} contenidos pendientes de aprobacion.`);
72
+ if (fotosNuevas.length > 10)
73
+ alertas.push(`${fotosNuevas.length} fotos sin procesar en inbox.`);
74
+ const result = {
75
+ brand: { nombre: brand.nombre, dominio: brand.dominio },
76
+ seo: seo ? {
77
+ rank: seo.rank,
78
+ totalKeywords: seo.totalKeywords,
79
+ traficoOrganico: seo.traficoOrganico,
80
+ ultimoSnapshot: seo.fechaSnapshot,
81
+ } : null,
82
+ contenido: {
83
+ pendientesAprobacion: contenidoPendiente.length,
84
+ publicadosTotal: contenidoPublicado.length,
85
+ },
86
+ fotos: {
87
+ enInbox: fotosNuevas.length,
88
+ },
89
+ conexiones: conexiones ?? { gbp: null, shopify: null, instagram: null, canva: null },
90
+ alertas,
91
+ };
92
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
93
+ });
94
+ // ═══════════════════════════════════════════════════════════
95
+ // get_pending_actions
96
+ // ═══════════════════════════════════════════════════════════
97
+ server.tool('get_pending_actions', 'Lista todo lo que necesita atencion: contenido por aprobar, fotos sin procesar.', {
98
+ brandId: z.string().optional().describe('ID de la brand'),
99
+ }, async ({ brandId: inputBrandId }) => {
100
+ const tenantId = session.requireTenant();
101
+ const brandId = inputBrandId ?? session.requireBrand();
102
+ const [contenidoPendiente, fotosNuevas] = await Promise.all([
103
+ queryByTenant(session, 'marketing_contenido', [
104
+ { field: 'brandId', op: '==', value: brandId },
105
+ { field: 'estado', op: '==', value: ESTADO_CONTENIDO.PENDIENTE_APROBACION },
106
+ ]),
107
+ queryByTenant(session, 'marketing_fotos', [
108
+ { field: 'brandId', op: '==', value: brandId },
109
+ { field: 'estado', op: '==', value: ESTADO_FOTO.NUEVA },
110
+ ]),
111
+ ]);
112
+ // Leer config para verificar snapshot
113
+ const config = await readDoc('marketing_config', tenantId);
114
+ const brands = (config?.brands ?? {});
115
+ const brand = brands[brandId];
116
+ const seo = brand?.seoSnapshot;
117
+ const result = {
118
+ contenidoPorAprobar: contenidoPendiente.map((c) => ({
119
+ id: c.id,
120
+ plataforma: c.plataforma,
121
+ tipo: c.tipo,
122
+ keyword: c.keyword,
123
+ preview: (() => {
124
+ const datos = (c.datos ?? {});
125
+ if (c.plataforma === 'gbp')
126
+ return datos.summary?.substring(0, 100) ?? null;
127
+ if (c.plataforma === 'shopify_blog')
128
+ return datos.title ?? null;
129
+ if (c.plataforma === 'instagram')
130
+ return datos.caption?.substring(0, 100) ?? null;
131
+ if (c.plataforma === 'review')
132
+ return datos.responseText?.substring(0, 100) ?? null;
133
+ return null;
134
+ })(),
135
+ })),
136
+ fotosSinProcesar: fotosNuevas.length,
137
+ snapshotDesactualizado: !seo,
138
+ };
139
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
140
+ });
141
+ // ═══════════════════════════════════════════════════════════
142
+ // execute_action
143
+ // ═══════════════════════════════════════════════════════════
144
+ server.tool('execute_action', 'Ejecuta una accion sobre contenido o foto: aprobar, rechazar, descartar foto, usar foto tal cual.', {
145
+ accion: z.enum(['aprobar', 'rechazar', 'descartar_foto', 'usar_foto_tal_cual'])
146
+ .describe('Accion a ejecutar'),
147
+ targetId: z.string().describe('ID del contenido o foto'),
148
+ motivo: z.string().optional().describe('Motivo del rechazo (requerido para rechazar)'),
149
+ }, async ({ accion, targetId, motivo }) => {
150
+ session.requireTenant();
151
+ if (accion === 'aprobar') {
152
+ const doc = await readDoc('marketing_contenido', targetId);
153
+ if (!doc)
154
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Contenido no encontrado' }) }] };
155
+ if (!esTransicionValida(doc.estado, ESTADO_CONTENIDO.APROBADO)) {
156
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `No se puede aprobar desde estado "${doc.estado}"` }) }] };
157
+ }
158
+ await updateDoc('marketing_contenido', targetId, {
159
+ estado: ESTADO_CONTENIDO.APROBADO,
160
+ aprobadoAt: serverTimestamp(),
161
+ aprobadoPorId: 'mcp-cowork',
162
+ aprobadoPorNombre: 'Cowork AI',
163
+ });
164
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: true, nuevoEstado: ESTADO_CONTENIDO.APROBADO }) }] };
165
+ }
166
+ if (accion === 'rechazar') {
167
+ if (!motivo)
168
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Motivo es requerido para rechazar' }) }] };
169
+ const doc = await readDoc('marketing_contenido', targetId);
170
+ if (!doc)
171
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Contenido no encontrado' }) }] };
172
+ if (!esTransicionValida(doc.estado, ESTADO_CONTENIDO.RECHAZADO)) {
173
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `No se puede rechazar desde estado "${doc.estado}"` }) }] };
174
+ }
175
+ await updateDoc('marketing_contenido', targetId, {
176
+ estado: ESTADO_CONTENIDO.RECHAZADO,
177
+ rechazadoAt: serverTimestamp(),
178
+ rechazadoMotivo: motivo,
179
+ });
180
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: true, nuevoEstado: ESTADO_CONTENIDO.RECHAZADO }) }] };
181
+ }
182
+ if (accion === 'descartar_foto') {
183
+ const doc = await readDoc('marketing_fotos', targetId);
184
+ if (!doc)
185
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Foto no encontrada' }) }] };
186
+ if (!validarTransicionFoto(doc.estado, ESTADO_FOTO.DESCARTADA)) {
187
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `No se puede descartar desde estado "${doc.estado}"` }) }] };
188
+ }
189
+ await updateDoc('marketing_fotos', targetId, { estado: ESTADO_FOTO.DESCARTADA });
190
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: true, nuevoEstado: ESTADO_FOTO.DESCARTADA }) }] };
191
+ }
192
+ if (accion === 'usar_foto_tal_cual') {
193
+ const doc = await readDoc('marketing_fotos', targetId);
194
+ if (!doc)
195
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Foto no encontrada' }) }] };
196
+ if (!validarTransicionFoto(doc.estado, ESTADO_FOTO.EDITADA)) {
197
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `No se puede marcar como editada desde estado "${doc.estado}"` }) }] };
198
+ }
199
+ await updateDoc('marketing_fotos', targetId, {
200
+ estado: ESTADO_FOTO.EDITADA,
201
+ archivoEditado: doc.archivoOriginal, // usa la original como editada
202
+ fechaEdicion: serverTimestamp(),
203
+ });
204
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: true, nuevoEstado: ESTADO_FOTO.EDITADA }) }] };
205
+ }
206
+ return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `Accion "${accion}" no reconocida` }) }] };
207
+ });
208
+ }
209
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/tools/core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE/G,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,OAAgB;IACnE,8DAA8D;IAC9D,uBAAuB;IACvB,8DAA8D;IAC9D,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,kGAAkG,EAClG;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;KACrG,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;QAEhD,cAAc;QACd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/H,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAA4C,CAAC;QAEhF,+CAA+C;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzD,EAAE;gBACF,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;YACJ,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,OAAO,EAAE,gDAAgD;4BACzD,MAAM,EAAE,SAAS;4BACjB,WAAW,EAAE,yCAAyC;yBACvD,CAAC;qBACH,CAAC;aACH,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACnH,CAAC;QAED,oBAAoB;QACpB,MAAM,CAAC,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9E,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE;gBAC5C,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC9C,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,oBAAoB,EAAE;aAC5E,CAAC;YACF,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE;gBACxC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC9C,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE;aACxD,CAAC;YACF,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE;gBAC5C,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC9C,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,SAAS,EAAE;aACjE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SAClB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,KAAK,CAAC,WAA6C,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,UAA4C,CAAC;QACtE,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC7F,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,uCAAuC,CAAC,CAAC;QACrH,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,+BAA+B,CAAC,CAAC;QAEhG,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YACvD,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACT,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,cAAc,EAAE,GAAG,CAAC,aAAa;aAClC,CAAC,CAAC,CAAC,IAAI;YACR,SAAS,EAAE;gBACT,oBAAoB,EAAE,kBAAkB,CAAC,MAAM;gBAC/C,eAAe,EAAE,kBAAkB,CAAC,MAAM;aAC3C;YACD,KAAK,EAAE;gBACL,OAAO,EAAE,WAAW,CAAC,MAAM;aAC5B;YACD,UAAU,EAAE,UAAU,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;YACpF,OAAO;SACR,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,8DAA8D;IAC9D,sBAAsB;IACtB,8DAA8D;IAC9D,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,iFAAiF,EACjF;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;KAC1D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAEvD,MAAM,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE;gBAC5C,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC9C,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,CAAC,oBAAoB,EAAE;aAC5E,CAAC;YACF,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE;gBACxC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC9C,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE;aACxD,CAAC;SACH,CAAC,CAAC;QAEH,sCAAsC;QACtC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAA6C,CAAC;QACnF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,EAAE,WAA6C,CAAC;QAEjE,MAAM,MAAM,GAAG;YACb,mBAAmB,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClD,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,GAAG,EAAE;oBACb,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAuC,CAAC;oBACpE,IAAI,CAAC,CAAC,UAAU,KAAK,KAAK;wBAAE,OAAO,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;oBAC5E,IAAI,CAAC,CAAC,UAAU,KAAK,cAAc;wBAAE,OAAO,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;oBAChE,IAAI,CAAC,CAAC,UAAU,KAAK,WAAW;wBAAE,OAAO,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;oBAClF,IAAI,CAAC,CAAC,UAAU,KAAK,QAAQ;wBAAE,OAAO,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;oBACpF,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,EAAE;aACL,CAAC,CAAC;YACH,gBAAgB,EAAE,WAAW,CAAC,MAAM;YACpC,sBAAsB,EAAE,CAAC,GAAG;SAC7B,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,8DAA8D;IAC9D,iBAAiB;IACjB,8DAA8D;IAC9D,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,mGAAmG,EACnG;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;aAC5E,QAAQ,CAAC,mBAAmB,CAAC;QAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACvF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE;QACrC,OAAO,CAAC,aAAa,EAAE,CAAC;QAExB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAEjI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAgB,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAClJ,CAAC;YAED,MAAM,SAAS,CAAC,qBAAqB,EAAE,QAAQ,EAAE;gBAC/C,MAAM,EAAE,gBAAgB,CAAC,QAAQ;gBACjC,UAAU,EAAE,eAAe,EAAE;gBAC7B,aAAa,EAAE,YAAY;gBAC3B,iBAAiB,EAAE,WAAW;aAC/B,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9H,CAAC;QAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAE9I,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAEjI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAgB,EAAE,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACnJ,CAAC;YAED,MAAM,SAAS,CAAC,qBAAqB,EAAE,QAAQ,EAAE;gBAC/C,MAAM,EAAE,gBAAgB,CAAC,SAAS;gBAClC,WAAW,EAAE,eAAe,EAAE;gBAC9B,eAAe,EAAE,MAAM;aACxB,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/H,CAAC;QAED,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAE5H,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAgB,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACpJ,CAAC;YAED,MAAM,SAAS,CAAC,iBAAiB,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;YACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3H,CAAC;QAED,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAE5H,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAgB,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iDAAiD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9J,CAAC;YAED,MAAM,SAAS,CAAC,iBAAiB,EAAE,QAAQ,EAAE;gBAC3C,MAAM,EAAE,WAAW,CAAC,OAAO;gBAC3B,cAAc,EAAE,GAAG,CAAC,eAAe,EAAE,+BAA+B;gBACpE,YAAY,EAAE,eAAe,EAAE;aAChC,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACxH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAClI,CAAC,CACF,CAAC;AACJ,CAAC"}