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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * System Prompt loader
3
+ *
4
+ * Carga el system prompt del MCP en 3 partes:
5
+ * PARTE 1: Identidad y rol (fija)
6
+ * PARTE 2: Reglas de generacion (fija) — IP de Ponch
7
+ * PARTE 3: Contexto del tenant (dinamica, inyectada en runtime)
8
+ *
9
+ * Basado en: docs/logica/LOGICA_MARKETING_SYSTEM_PROMPT_v1.md
10
+ * El prompt es INVISIBLE para el tenant — no lo puede leer ni copiar.
11
+ */
12
+ import type { Session } from '../auth.js';
13
+ /**
14
+ * Construye el system prompt completo para una sesion.
15
+ * Partes 1+2 son fijas. Parte 3 se inyecta desde Firestore.
16
+ */
17
+ export declare function buildSystemPrompt(session: Session): Promise<string>;
18
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/prompts/system.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAmN1C;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BzE"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * System Prompt loader
3
+ *
4
+ * Carga el system prompt del MCP en 3 partes:
5
+ * PARTE 1: Identidad y rol (fija)
6
+ * PARTE 2: Reglas de generacion (fija) — IP de Ponch
7
+ * PARTE 3: Contexto del tenant (dinamica, inyectada en runtime)
8
+ *
9
+ * Basado en: docs/logica/LOGICA_MARKETING_SYSTEM_PROMPT_v1.md
10
+ * El prompt es INVISIBLE para el tenant — no lo puede leer ni copiar.
11
+ */
12
+ import { readDoc, queryByTenant } from '../firestore.js';
13
+ import { ESTADO_CONTENIDO, ESTADO_FOTO } from '../schemas/index.js';
14
+ // ═══════════════════════════════════════════════════════════
15
+ // PARTE 1: Identidad y rol
16
+ // ═══════════════════════════════════════════════════════════
17
+ const PARTE_1_IDENTIDAD = `
18
+ Eres el asistente de marketing digital de {{brand_nombre}}.
19
+ Tu trabajo es generar contenido de alta calidad para publicar en
20
+ Google Business Profile, blog de {{brand_dominio}}, e Instagram.
21
+
22
+ Tu objetivo es:
23
+ 1. Aumentar el trafico organico del negocio
24
+ 2. Mejorar el posicionamiento en Google y en AI (ChatGPT, Perplexity, Gemini)
25
+ 3. Generar contenido que convierta visitantes en clientes
26
+ 4. Mantener consistencia de marca en todas las plataformas
27
+
28
+ Operas bajo el principio: "El sistema sugiere, el usuario valida."
29
+ Generas contenido, el dueño aprueba o edita antes de publicar.
30
+ NUNCA publicas sin aprobacion.
31
+
32
+ Cuando generes contenido:
33
+ - Usa SOLO datos reales del negocio (productos, precios, ubicacion)
34
+ - NUNCA inventes productos o servicios que no existen
35
+ - NUNCA uses informacion de competidores como si fuera del negocio
36
+ - Si no tienes datos suficientes, pregunta antes de inventar
37
+ `;
38
+ // ═══════════════════════════════════════════════════════════
39
+ // PARTE 2: Reglas de generacion (IP de Ponch)
40
+ // ═══════════════════════════════════════════════════════════
41
+ const PARTE_2_REGLAS = `
42
+ ## REGLAS AEO (Answer Engine Optimization)
43
+
44
+ En 2026, 55% de las busquedas de Google muestran AI Overviews.
45
+ TODO contenido debe estar optimizado para ser CITADO por AI.
46
+
47
+ Para BLOGS:
48
+ 1. Cada H2 debe ser una PREGUNTA que un usuario haria
49
+ 2. La PRIMERA ORACION de cada seccion RESPONDE directamente — esto es lo que AI cita
50
+ 3. El 44% de las citations vienen del PRIMER 30% del texto — el intro es CRITICO
51
+ 4. Usar LISTAS y BULLET POINTS — AI extrae listas mas facilmente
52
+ 5. FAQ Schema al final: 3-5 preguntas, JSON-LD (Article + FAQ + Breadcrumb)
53
+ 6. Contenido FRESCO — publicar regularmente es senal de autoridad
54
+ 7. PROFUNDIDAD > LONGITUD: 1,500-2,000 palabras bien estructuradas
55
+
56
+ ## Google Business Profile Posts
57
+
58
+ - Texto: 150-300 caracteres. SIEMPRE incluir CTA (SHOP o LEARN_MORE) con URL real
59
+ - Keyword local en CADA post: "floreria en [ubicacion]", "envio de [producto] en [ciudad]"
60
+ - Alternar tipos: STANDARD, OFFER, EVENT
61
+ - Publicar entre 9-11 AM hora local. Posts viven ~5 dias
62
+ - NUNCA posts genericos sin CTA o sin relacion al negocio
63
+
64
+ ## Shopify Blog Articles
65
+
66
+ - TITULO: 50-60 chars, keyword al inicio
67
+ - META TITLE: 50-60 chars, keyword + ubicacion si aplica
68
+ - META DESCRIPTION: 150-160 chars, keyword + CTA
69
+ - URL HANDLE: 3-5 palabras, lowercase, hyphens
70
+ - CUERPO: 1,500-2,000 palabras. H2 como PREGUNTAS (AEO)
71
+ - 3-5 internal links a productos/colecciones REALES
72
+ - FAQ section al final. Structured data JSON-LD
73
+ - INTERNAL LINKING ES CRITICO: cada blog linkea a 2-4 productos
74
+
75
+ ## Instagram Posts
76
+
77
+ - Caption: keywords en PRIMEROS 125 chars. CTA al final
78
+ - Hashtags: 3-5 relevantes (NO 30). Mezcla: nicho + marca + local
79
+ - Alt text: describir imagen con keywords. Instagram indexa alt text
80
+ - CAROUSEL es el formato con MAS engagement (1.92%)
81
+ - Feed: 4:5 portrait (1080x1350). Solo JPEG via API
82
+ - Content mix: 40% producto, 20% behind scenes, 20% educativo, 10% seasonal, 10% UGC
83
+ - Senal mas valiosa: SHARES. Mejores dias: martes/miercoles
84
+
85
+ ## Review Responses
86
+
87
+ - Responder en < 24 horas
88
+ - POSITIVAS: nombre del reviewer, agradecer especificamente, keyword + ubicacion, invitar a volver
89
+ - NEGATIVAS: tono empatico, reconocer problema, solucion concreta, contacto directo
90
+ - NUNCA respuestas template/genericas. Google INDEXA las respuestas
91
+
92
+ ## Reglas Generales
93
+
94
+ IDIOMA: respetar distribucion configurada. No traducir literal — adaptar
95
+ NUNCA: emojis excesivos, hashtags de precio bajo (#barato), inventar datos
96
+ SIEMPRE: verificar URLs existen, respetar tono de marca, incluir CTA, variar contenido
97
+ `;
98
+ // ═══════════════════════════════════════════════════════════
99
+ // PARTE 3: Contexto dinamico del tenant
100
+ // ═══════════════════════════════════════════════════════════
101
+ async function buildTenantContext(session) {
102
+ const tenantId = session.tenantId;
103
+ const brandId = session.brandId;
104
+ if (!tenantId || !brandId)
105
+ return '';
106
+ const config = await readDoc('marketing_config', tenantId);
107
+ if (!config)
108
+ return '';
109
+ const brands = (config.brands ?? {});
110
+ const brand = brands[brandId];
111
+ if (!brand)
112
+ return '';
113
+ // Leer datos en paralelo
114
+ const [fotosEditadas, contenidoReciente, productos] = await Promise.all([
115
+ queryByTenant(session, 'marketing_fotos', [
116
+ { field: 'brandId', op: '==', value: brandId },
117
+ { field: 'estado', op: '==', value: ESTADO_FOTO.EDITADA },
118
+ ], { limit: 10 }),
119
+ queryByTenant(session, 'marketing_contenido', [
120
+ { field: 'brandId', op: '==', value: brandId },
121
+ { field: 'estado', op: '==', value: ESTADO_CONTENIDO.PUBLICADO },
122
+ ], { limit: 10 }),
123
+ queryByTenant(session, 'productos', [], { limit: 50 }),
124
+ ]);
125
+ const seo = brand.seoSnapshot;
126
+ const idiomas = brand.idiomas;
127
+ const frecuencia = brand.frecuencia;
128
+ const gbpPerfiles = (brand.gbpPerfiles ?? []);
129
+ let ctx = `
130
+ CONTEXTO DEL NEGOCIO:
131
+ Marca: ${brand.nombre}
132
+ Dominio: ${brand.dominio ?? 'sin dominio'}
133
+ `;
134
+ if (gbpPerfiles.length > 0) {
135
+ ctx += `Ubicacion: ${gbpPerfiles[0].direccion ?? 'no configurada'}\n`;
136
+ }
137
+ const plan = brand.plan;
138
+ ctx += `Tono: ${plan?.tonoMarca ?? 'profesional y cercano'}\n`;
139
+ if (idiomas) {
140
+ ctx += `Idioma principal: ${idiomas.primario ?? 'es'}\n`;
141
+ if (idiomas.distribucion) {
142
+ ctx += `Distribucion de idiomas: ${JSON.stringify(idiomas.distribucion)}\n`;
143
+ }
144
+ }
145
+ if (frecuencia) {
146
+ ctx += `\nFRECUENCIA CONFIGURADA:\n`;
147
+ ctx += `GBP: ${frecuencia.gbp ?? '?'} posts/semana\n`;
148
+ ctx += `Blog: ${frecuencia.blog ?? '?'} articulos/mes\n`;
149
+ ctx += `Instagram: ${frecuencia.instagram ?? '?'} posts/semana\n`;
150
+ }
151
+ if (productos.length > 0) {
152
+ ctx += `\nPRODUCTOS DISPONIBLES (${productos.length}):\n`;
153
+ for (const p of productos.slice(0, 20)) {
154
+ ctx += `- ${p.nombre}${p.precio ? ` ($${p.precio})` : ''}${p.categoria ? ` [${p.categoria}]` : ''}\n`;
155
+ }
156
+ if (productos.length > 20)
157
+ ctx += `... y ${productos.length - 20} mas\n`;
158
+ }
159
+ if (seo) {
160
+ ctx += `\nSNAPSHOT SEO:\n`;
161
+ ctx += `Rank: #${seo.rank} | Keywords: ${seo.totalKeywords} | Trafico: ${seo.traficoOrganico}/mes\n`;
162
+ const topKw = (seo.topKeywords ?? []);
163
+ if (topKw.length > 0) {
164
+ ctx += `Top keywords:\n`;
165
+ for (const kw of topKw.slice(0, 10)) {
166
+ ctx += ` - "${kw.keyword}" pos:${kw.posicion} vol:${kw.volumen}\n`;
167
+ }
168
+ }
169
+ const oportunidades = (seo.oportunidades ?? []);
170
+ if (oportunidades.length > 0) {
171
+ ctx += `Oportunidades:\n`;
172
+ for (const op of oportunidades.slice(0, 5)) {
173
+ ctx += ` - "${op.keyword}" pos:${op.posicion} vol:${op.volumen} dif:${op.dificultad}\n`;
174
+ }
175
+ }
176
+ }
177
+ if (fotosEditadas.length > 0) {
178
+ ctx += `\nFOTOS EDITADAS DISPONIBLES (${fotosEditadas.length}):\n`;
179
+ for (const f of fotosEditadas) {
180
+ ctx += `- ${f.id}: ${f.tipo ?? 'sin tipo'} | flores: ${f.flores?.join(', ') || 'n/a'}\n`;
181
+ }
182
+ }
183
+ if (contenidoReciente.length > 0) {
184
+ ctx += `\nHISTORIAL RECIENTE (no repetir):\n`;
185
+ for (const c of contenidoReciente) {
186
+ ctx += `- ${c.plataforma}: "${c.keyword ?? 'sin keyword'}" (${c.publicadoAt ?? '?'})\n`;
187
+ }
188
+ }
189
+ if (plan) {
190
+ const reglas = plan.reglasCustom;
191
+ if (reglas && reglas.length > 0) {
192
+ ctx += `\nREGLAS CUSTOM DEL TENANT:\n`;
193
+ for (const r of reglas) {
194
+ ctx += `- ${r}\n`;
195
+ }
196
+ }
197
+ }
198
+ return ctx;
199
+ }
200
+ // ═══════════════════════════════════════════════════════════
201
+ // Exportar: system prompt completo
202
+ // ═══════════════════════════════════════════════════════════
203
+ /**
204
+ * Construye el system prompt completo para una sesion.
205
+ * Partes 1+2 son fijas. Parte 3 se inyecta desde Firestore.
206
+ */
207
+ export async function buildSystemPrompt(session) {
208
+ const tenantId = session.tenantId;
209
+ const brandId = session.brandId;
210
+ // Si no hay contexto, solo retornar partes fijas
211
+ if (!tenantId || !brandId) {
212
+ return PARTE_1_IDENTIDAD
213
+ .replace('{{brand_nombre}}', 'el negocio')
214
+ .replace('{{brand_dominio}}', 'la tienda online')
215
+ + PARTE_2_REGLAS;
216
+ }
217
+ // Leer nombre de la brand
218
+ const config = await readDoc('marketing_config', tenantId);
219
+ const brands = (config?.brands ?? {});
220
+ const brand = brands[brandId];
221
+ let prompt = PARTE_1_IDENTIDAD
222
+ .replace('{{brand_nombre}}', brand?.nombre ?? brandId)
223
+ .replace('{{brand_dominio}}', brand?.dominio ?? 'la tienda online');
224
+ prompt += PARTE_2_REGLAS;
225
+ // Parte 3: contexto dinamico
226
+ const contexto = await buildTenantContext(session);
227
+ if (contexto) {
228
+ prompt += '\n---\n' + contexto;
229
+ }
230
+ return prompt;
231
+ }
232
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/prompts/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,306 @@
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
+ export declare const ESTADO_FOTO: {
10
+ readonly NUEVA: "nueva";
11
+ readonly POR_EDITAR: "por_editar";
12
+ readonly EDITADA: "editada";
13
+ readonly PUBLICADA: "publicada";
14
+ readonly DESCARTADA: "descartada";
15
+ };
16
+ export declare const TIPO_FOTO: {
17
+ readonly PRODUCTO: "producto";
18
+ readonly ARREGLO: "arreglo";
19
+ readonly ENTREGA: "entrega";
20
+ readonly TALLER: "taller";
21
+ readonly EQUIPO: "equipo";
22
+ readonly EVENTO: "evento";
23
+ };
24
+ export declare const PLATAFORMA: {
25
+ readonly GBP: "gbp";
26
+ readonly SHOPIFY_BLOG: "shopify_blog";
27
+ readonly INSTAGRAM: "instagram";
28
+ readonly REVIEW: "review";
29
+ };
30
+ export declare const TIPO_CONTENIDO: {
31
+ readonly POST: "post";
32
+ readonly BLOG: "blog";
33
+ readonly CAROUSEL: "carousel";
34
+ readonly REEL: "reel";
35
+ readonly STORY: "story";
36
+ readonly REVIEW_RESPONSE: "review_response";
37
+ };
38
+ export declare const TIPO_GBP_POST: {
39
+ readonly STANDARD: "STANDARD";
40
+ readonly OFFER: "OFFER";
41
+ readonly EVENT: "EVENT";
42
+ };
43
+ export declare const CTA_GBP: {
44
+ readonly SHOP: "SHOP";
45
+ readonly LEARN_MORE: "LEARN_MORE";
46
+ readonly SIGN_UP: "SIGN_UP";
47
+ readonly CALL: "CALL";
48
+ };
49
+ export declare const ESTADO_CONTENIDO: {
50
+ readonly BORRADOR: "borrador";
51
+ readonly GENERADO: "generado";
52
+ readonly PENDIENTE_APROBACION: "pendiente_aprobacion";
53
+ readonly APROBADO: "aprobado";
54
+ readonly PUBLICADO: "publicado";
55
+ readonly RECHAZADO: "rechazado";
56
+ readonly EDITADO: "editado";
57
+ readonly ERROR_PUBLICACION: "error_publicacion";
58
+ };
59
+ export declare const TRANSICIONES_CONTENIDO: Record<string, string[]>;
60
+ export declare function esTransicionValida(estadoActual: string, estadoNuevo: string): boolean;
61
+ export declare const ESTADO_CALENDARIO_ITEM: {
62
+ readonly PLANIFICADO: "planificado";
63
+ readonly GENERADO: "generado";
64
+ readonly APROBADO: "aprobado";
65
+ readonly PUBLICADO: "publicado";
66
+ readonly RECHAZADO: "rechazado";
67
+ };
68
+ export declare const TRANSICIONES_FOTO: Record<string, string[]>;
69
+ export declare function validarTransicionFoto(estadoActual: string, estadoNuevo: string): boolean;
70
+ export interface FotoData {
71
+ id: string;
72
+ tenantId: string;
73
+ brandId: string;
74
+ archivoOriginal?: string | null;
75
+ archivoEditado?: string | null;
76
+ estado?: string;
77
+ tipo?: string | null;
78
+ flores?: string[];
79
+ productos?: string[];
80
+ fechaIngesta?: unknown;
81
+ fechaEdicion?: unknown;
82
+ usadaEn?: unknown[];
83
+ metadata?: Record<string, unknown> | null;
84
+ creadoPorId?: string | null;
85
+ creadoPorNombre?: string | null;
86
+ }
87
+ export declare function buildFoto(data: FotoData): {
88
+ id: string;
89
+ tenantId: string;
90
+ brandId: string;
91
+ archivoOriginal: string | null;
92
+ archivoEditado: string | null;
93
+ estado: string;
94
+ tipo: string | null;
95
+ flores: string[];
96
+ productos: string[];
97
+ fechaIngesta: {} | null;
98
+ fechaEdicion: {} | null;
99
+ usadaEn: unknown[];
100
+ metadata: Record<string, unknown>;
101
+ creadoPorId: string | null;
102
+ creadoPorNombre: string | null;
103
+ };
104
+ export interface DatosGBP {
105
+ summary?: string | null;
106
+ topicType?: string;
107
+ callToAction?: {
108
+ type: string;
109
+ url: string;
110
+ } | null;
111
+ perfilId?: string | null;
112
+ }
113
+ export declare function buildDatosGBP(data?: DatosGBP): {
114
+ summary: string | null;
115
+ topicType: string;
116
+ callToAction: {
117
+ type: string;
118
+ url: string;
119
+ } | null;
120
+ perfilId: string | null;
121
+ };
122
+ export interface DatosBlog {
123
+ title?: string | null;
124
+ body?: string | null;
125
+ handle?: string | null;
126
+ metaTitle?: string | null;
127
+ metaDescription?: string | null;
128
+ tags?: string[];
129
+ imageAltText?: string | null;
130
+ keywordsSecundarios?: string[];
131
+ productosLinkeados?: string[];
132
+ structuredData?: unknown;
133
+ }
134
+ export declare function buildDatosBlog(data?: DatosBlog): {
135
+ title: string | null;
136
+ body: string | null;
137
+ handle: string | null;
138
+ metaTitle: string | null;
139
+ metaDescription: string | null;
140
+ tags: string[];
141
+ imageAltText: string | null;
142
+ keywordsSecundarios: string[];
143
+ productosLinkeados: string[];
144
+ structuredData: {} | null;
145
+ };
146
+ export interface DatosIG {
147
+ caption?: string | null;
148
+ altText?: string | null;
149
+ mediaType?: string;
150
+ productTags?: string[];
151
+ hashtags?: string[];
152
+ }
153
+ export declare function buildDatosIG(data?: DatosIG): {
154
+ caption: string | null;
155
+ altText: string | null;
156
+ mediaType: string;
157
+ productTags: string[];
158
+ hashtags: string[];
159
+ };
160
+ export interface DatosReview {
161
+ reviewText?: string | null;
162
+ rating?: number | null;
163
+ reviewerName?: string | null;
164
+ responseText?: string | null;
165
+ googleReviewId?: string | null;
166
+ }
167
+ export declare function buildDatosReview(data?: DatosReview): {
168
+ reviewText: string | null;
169
+ rating: number | null;
170
+ reviewerName: string | null;
171
+ responseText: string | null;
172
+ googleReviewId: string | null;
173
+ };
174
+ export interface ContenidoData {
175
+ id: string;
176
+ tenantId: string;
177
+ brandId: string;
178
+ plataforma: string;
179
+ tipo?: string;
180
+ keyword?: string | null;
181
+ languageCode?: string;
182
+ estado?: string;
183
+ fotoId?: string | null;
184
+ mediaUrl?: string | null;
185
+ calendarioItemRef?: string | null;
186
+ datos?: Record<string, unknown>;
187
+ creadoAt?: unknown;
188
+ creadoPorId?: string | null;
189
+ aprobadoAt?: unknown;
190
+ aprobadoPorId?: string | null;
191
+ aprobadoPorNombre?: string | null;
192
+ rechazadoAt?: unknown;
193
+ rechazadoMotivo?: string | null;
194
+ editadoAt?: unknown;
195
+ publicadoAt?: unknown;
196
+ errorPublicacion?: string | null;
197
+ externalId?: string | null;
198
+ }
199
+ export declare function buildContenido(data: ContenidoData): {
200
+ id: string;
201
+ tenantId: string;
202
+ brandId: string;
203
+ plataforma: string;
204
+ tipo: string;
205
+ keyword: string | null;
206
+ languageCode: string;
207
+ estado: string;
208
+ fotoId: string | null;
209
+ mediaUrl: string | null;
210
+ calendarioItemRef: string | null;
211
+ datos: Record<string, unknown>;
212
+ creadoAt: {} | null;
213
+ creadoPorId: string | null;
214
+ aprobadoAt: {} | null;
215
+ aprobadoPorId: string | null;
216
+ aprobadoPorNombre: string | null;
217
+ rechazadoAt: {} | null;
218
+ rechazadoMotivo: string | null;
219
+ editadoAt: {} | null;
220
+ publicadoAt: {} | null;
221
+ errorPublicacion: string | null;
222
+ externalId: string | null;
223
+ };
224
+ export interface CalendarioData {
225
+ id: string;
226
+ tenantId: string;
227
+ brandId: string;
228
+ mes: string;
229
+ semanas?: unknown[];
230
+ creadoAt?: unknown;
231
+ creadoPorId?: string | null;
232
+ updatedAt?: unknown;
233
+ }
234
+ export declare function buildCalendario(data: CalendarioData): {
235
+ id: string;
236
+ tenantId: string;
237
+ brandId: string;
238
+ mes: string;
239
+ semanas: unknown[];
240
+ creadoAt: {} | null;
241
+ creadoPorId: string | null;
242
+ updatedAt: {} | null;
243
+ };
244
+ export interface CalendarioItemData {
245
+ dia?: string | null;
246
+ plataforma?: string | null;
247
+ tipo?: string | null;
248
+ keyword?: string | null;
249
+ tema?: string | null;
250
+ productoId?: string | null;
251
+ estado?: string;
252
+ contenidoRef?: string | null;
253
+ }
254
+ export declare function buildCalendarioItem(data?: CalendarioItemData): {
255
+ dia: string | null;
256
+ plataforma: string | null;
257
+ tipo: string | null;
258
+ keyword: string | null;
259
+ tema: string | null;
260
+ productoId: string | null;
261
+ estado: string;
262
+ contenidoRef: string | null;
263
+ };
264
+ export interface BrandConfigData {
265
+ nombre: string;
266
+ dominio?: string | null;
267
+ semrushDatabase?: string | null;
268
+ seoSnapshot?: Record<string, unknown> | null;
269
+ plan?: Record<string, unknown> | null;
270
+ gbpPerfiles?: unknown[];
271
+ frecuencia?: Record<string, unknown> | null;
272
+ idiomas?: Record<string, unknown> | null;
273
+ igCuenta?: Record<string, unknown> | null;
274
+ canvaTeamId?: string | null;
275
+ shopifyDomain?: string | null;
276
+ conexiones?: Record<string, unknown> | null;
277
+ }
278
+ export declare function buildBrandConfig(data: BrandConfigData): {
279
+ nombre: string;
280
+ dominio: string | null;
281
+ semrushDatabase: string | null;
282
+ seoSnapshot: Record<string, unknown> | null;
283
+ plan: Record<string, unknown> | null;
284
+ gbpPerfiles: unknown[];
285
+ frecuencia: Record<string, unknown> | null;
286
+ idiomas: Record<string, unknown> | null;
287
+ igCuenta: Record<string, unknown> | null;
288
+ canvaTeamId: string | null;
289
+ shopifyDomain: string | null;
290
+ conexiones: Record<string, unknown>;
291
+ };
292
+ export interface ConfigData {
293
+ id: string;
294
+ tenantId: string;
295
+ brands?: Record<string, unknown>;
296
+ semrushUsage?: Record<string, unknown> | null;
297
+ updatedAt?: unknown;
298
+ }
299
+ export declare function buildConfig(data: ConfigData): {
300
+ id: string;
301
+ tenantId: string;
302
+ brands: Record<string, unknown>;
303
+ semrushUsage: Record<string, unknown> | null;
304
+ updatedAt: {} | null;
305
+ };
306
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}