create-bk-agent 0.21.2 → 0.22.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.
Files changed (41) hide show
  1. package/README.md +2 -0
  2. package/dist/src/index.js +26 -1
  3. package/dist/src/prompts.js +39 -0
  4. package/dist/src/scaffold.js +57 -0
  5. package/package.json +1 -1
  6. package/templates/base/orchestrator/_common/.env.example +14 -0
  7. package/templates/base/orchestrator/_common/package.json +16 -0
  8. package/templates/base/orchestrator/blank/flows/.gitkeep +0 -0
  9. package/templates/base/orchestrator/blank/orchestrator.yaml +34 -0
  10. package/templates/base/orchestrator/blank/vault/lecciones/.gitkeep +0 -0
  11. package/templates/base/orchestrator/marketing/flows/articulo-blog.yaml +97 -0
  12. package/templates/base/orchestrator/marketing/flows/campana-leads.yaml +115 -0
  13. package/templates/base/orchestrator/marketing/orchestrator.yaml +92 -0
  14. package/templates/base/orchestrator/marketing/test-flow.mjs +205 -0
  15. package/templates/base/orchestrator/marketing/vault/audiencia/buyer-personas.md +87 -0
  16. package/templates/base/orchestrator/marketing/vault/canales/estrategia-canales.md +53 -0
  17. package/templates/base/orchestrator/marketing/vault/contenido/tipos-de-contenido.md +71 -0
  18. package/templates/base/orchestrator/marketing/vault/lecciones/.gitkeep +0 -0
  19. package/templates/base/orchestrator/marketing/vault/marca/tono-y-voz.md +49 -0
  20. package/templates/base/orchestrator/marketing/vault/metricas/kpis-y-benchmarks.md +72 -0
  21. package/templates/base/orchestrator/marketing/vault/procesos/calendario-editorial.md +65 -0
  22. package/templates/base/orchestrator/soporte/flows/atencion-ticket.yaml +159 -0
  23. package/templates/base/orchestrator/soporte/flows/incidente-critico.yaml +218 -0
  24. package/templates/base/orchestrator/soporte/orchestrator.yaml +98 -0
  25. package/templates/base/orchestrator/soporte/test-flow.mjs +210 -0
  26. package/templates/base/orchestrator/soporte/vault/comunicacion/plantillas.md +211 -0
  27. package/templates/base/orchestrator/soporte/vault/lecciones/.gitkeep +0 -0
  28. package/templates/base/orchestrator/soporte/vault/procesos/escalacion.md +106 -0
  29. package/templates/base/orchestrator/soporte/vault/procesos/manejo-de-tickets.md +101 -0
  30. package/templates/base/orchestrator/soporte/vault/productos/coberturas-de-soporte.md +94 -0
  31. package/templates/base/orchestrator/soporte/vault/sla/niveles-de-servicio.md +104 -0
  32. package/templates/base/orchestrator/ventas/flows/calificacion-lead.yaml +113 -0
  33. package/templates/base/orchestrator/ventas/flows/propuesta-comercial.yaml +179 -0
  34. package/templates/base/orchestrator/ventas/orchestrator.yaml +93 -0
  35. package/templates/base/orchestrator/ventas/test-flow.mjs +207 -0
  36. package/templates/base/orchestrator/ventas/vault/lecciones/.gitkeep +0 -0
  37. package/templates/base/orchestrator/ventas/vault/politicas/condiciones-comerciales.md +65 -0
  38. package/templates/base/orchestrator/ventas/vault/procesos/calificacion-bant.md +50 -0
  39. package/templates/base/orchestrator/ventas/vault/procesos/ciclo-venta.md +61 -0
  40. package/templates/base/orchestrator/ventas/vault/productos/catalogo-servicios.md +103 -0
  41. package/templates/base/orchestrator/ventas/vault/productos/pricing-policy.md +84 -0
@@ -0,0 +1,113 @@
1
+ version: 1
2
+ id: calificacion-lead
3
+ name: "Calificación de Lead — {{payload.empresa}}"
4
+ description: >
5
+ Investiga y califica un nuevo lead aplicando BANT. Estima el valor de la
6
+ oportunidad, genera el email de primer contacto y registra todo en el CRM.
7
+
8
+ steps:
9
+ - id: s1-investigar
10
+ agent: lead-agent
11
+ depends_on: []
12
+ task: >
13
+ Investigar y calificar el siguiente prospecto aplicando metodología BANT.
14
+
15
+ DATOS DEL LEAD:
16
+ - Empresa: {{payload.empresa}}
17
+ - Contacto: {{payload.contacto}} — {{payload.cargo}}
18
+ - Email: {{payload.email}}
19
+ - Información inicial disponible: {{payload.descripcion}}
20
+
21
+ Producir un análisis estructurado con:
22
+
23
+ 1. ANÁLISIS BANT
24
+ - Budget: ¿hay presupuesto asignado? ¿cuál es el rango probable?
25
+ - Authority: ¿es el decisor o hay comité? ¿quién firma?
26
+ - Need: ¿cuál es la necesidad real y qué tan urgente es?
27
+ - Timeline: ¿cuándo esperan tener la solución?
28
+
29
+ 2. CALIFICACIÓN DEL LEAD
30
+ - HOT: intención de cierre clara en menos de 90 días
31
+ - WARM: oportunidad real pero en evaluación, 90-180 días
32
+ - COLD: exploratorio, sin presupuesto definido o > 180 días
33
+
34
+ 3. FIT CON NUESTRO PORTAFOLIO
35
+ - Qué servicio(s) resuelven mejor su necesidad
36
+ - Fortaleza del fit (alto / medio / bajo) y por qué
37
+
38
+ 4. SEÑALES DE ALERTA
39
+ - Riesgos o red flags detectados
40
+
41
+ 5. PREGUNTAS CLAVE PARA VALIDAR
42
+ - 3-5 preguntas para el primer contacto que validen o corrijan los supuestos
43
+
44
+ - id: s2-estimar-valor
45
+ agent: pricing-agent
46
+ depends_on: [s1-investigar]
47
+ task: >
48
+ Estimar el valor económico de la oportunidad con {{payload.empresa}}.
49
+
50
+ ANÁLISIS DEL LEAD:
51
+ {{steps.s1-investigar.output}}
52
+
53
+ Calcular:
54
+ 1. Servicio(s) recomendados del catálogo y su precio de lista
55
+ 2. Rango de valor del contrato:
56
+ - Escenario conservador (mínimo viable para el cliente)
57
+ - Escenario esperado (propuesta óptima)
58
+ - Escenario expansión (si se amplía el alcance post-inicio)
59
+ 3. Descuento máximo aplicable según calificación del lead y tamaño de oportunidad
60
+ 4. ARR potencial si la relación se consolida a largo plazo
61
+ 5. Tiempo estimado para recuperar el costo de adquisición del cliente
62
+
63
+ - id: s3-email-contacto
64
+ agent: writer-agent
65
+ depends_on: [s1-investigar, s2-estimar-valor]
66
+ task: >
67
+ Redactar el email de contacto inicial para {{payload.contacto}} de {{payload.empresa}}.
68
+
69
+ REGLAS para este email:
70
+ - Personalizado: mencionar algo específico de su empresa, sector o desafío detectado
71
+ - Valor concreto: qué problema específico podemos resolver (no presentación genérica)
72
+ - Call-to-action único: proponer una llamada de 30 minutos
73
+ - Subject line: máximo 60 caracteres, específico y que invite a abrir
74
+ - Cuerpo: máximo 150 palabras, directo al punto
75
+ - Tono: ejecutivo pero cercano, no comercial ni agresivo
76
+
77
+ CONTEXTO:
78
+ Análisis del lead: {{steps.s1-investigar.output}}
79
+ Valor potencial: {{steps.s2-estimar-valor.output}}
80
+
81
+ Entregar: subject line + cuerpo del email.
82
+
83
+ - id: s4-registrar-crm
84
+ agent: crm-agent
85
+ depends_on: [s1-investigar, s2-estimar-valor, s3-email-contacto]
86
+ task: >
87
+ Registrar el nuevo lead y todas las actividades en el CRM.
88
+
89
+ DATOS DEL PROSPECTO:
90
+ Empresa: {{payload.empresa}}
91
+ Contacto: {{payload.contacto}} | Cargo: {{payload.cargo}} | Email: {{payload.email}}
92
+
93
+ CALIFICACIÓN:
94
+ {{steps.s1-investigar.output}}
95
+
96
+ VALOR ESTIMADO:
97
+ {{steps.s2-estimar-valor.output}}
98
+
99
+ EMAIL DE CONTACTO GENERADO:
100
+ {{steps.s3-email-contacto.output}}
101
+
102
+ Generar el registro CRM completo con:
103
+ 1. Ficha del prospecto (empresa, contacto, cargo, email, sector)
104
+ 2. Etapa del pipeline: PROSPECTING
105
+ 3. Calificación: HOT / WARM / COLD con justificación
106
+ 4. Valor de la oportunidad: rango estimado (conservador / esperado / expansión)
107
+ 5. Resumen del análisis BANT
108
+ 6. Plan de seguimiento:
109
+ - Acción inmediata: envío del email de contacto
110
+ - Seguimiento #1: +5 días hábiles si no hay respuesta
111
+ - Seguimiento #2: +10 días hábiles (reencuadre del mensaje)
112
+ - Revisión de calificación: +15 días hábiles
113
+ 7. Notas de contexto para el ejecutivo de cuenta
@@ -0,0 +1,179 @@
1
+ version: 1
2
+ id: propuesta-comercial
3
+ name: "Propuesta Comercial — {{payload.empresa}}"
4
+ description: >
5
+ Elabora una propuesta comercial completa para un lead calificado: propuesta técnica
6
+ con gate de aprobación, pricing estructurado, revisión legal con gate, documento
7
+ final integrado y actualización del CRM.
8
+
9
+ steps:
10
+ - id: s1-propuesta-tecnica
11
+ agent: proposal-agent
12
+ depends_on: []
13
+ gate: true
14
+ gate_criteria:
15
+ - "El alcance refleja correctamente la necesidad del cliente"
16
+ - "Los entregables son concretos, verificables y comprometibles"
17
+ - "La metodología es apropiada para el tipo y tamaño del proyecto"
18
+ task: >
19
+ Elaborar la propuesta técnica para {{payload.empresa}}.
20
+
21
+ DATOS DEL CLIENTE:
22
+ - Empresa: {{payload.empresa}}
23
+ - Contacto: {{payload.contacto}} — {{payload.cargo}}
24
+ - Servicio solicitado: {{payload.servicio}}
25
+ - Necesidad principal: {{payload.necesidad}}
26
+ - Presupuesto indicativo: {{payload.presupuesto}}
27
+ - Timeline esperado: {{payload.timeline}}
28
+ - Contexto adicional: {{payload.contexto}}
29
+
30
+ Estructura de la propuesta técnica:
31
+
32
+ ## 1. Resumen Ejecutivo
33
+ Problema que enfrenta el cliente y nuestra propuesta de valor en 3-4 oraciones.
34
+
35
+ ## 2. Nuestra Comprensión del Desafío
36
+ Demostrar que entendemos su contexto, pain points y objetivos de negocio.
37
+
38
+ ## 3. Solución Propuesta
39
+ Descripción de los servicios específicos del catálogo que aplicamos a su caso.
40
+
41
+ ## 4. Alcance y Entregables
42
+ Desglose por fase con entregables específicos y criterios de aceptación.
43
+
44
+ ## 5. Metodología y Gobernanza
45
+ Cómo trabajamos, frecuencia de reuniones, canales de comunicación, herramientas.
46
+
47
+ ## 6. Cronograma
48
+ Fases, hitos y duración estimada. Incluir dependencias del cliente.
49
+
50
+ ## 7. Equipo Propuesto
51
+ Perfiles necesarios (sin nombres) con dedicación estimada por fase.
52
+
53
+ ## 8. Por Qué Nosotros
54
+ 3-4 diferenciadores concretos relevantes para este cliente y su contexto.
55
+
56
+ - id: s2-pricing
57
+ agent: pricing-agent
58
+ depends_on: [s1-propuesta-tecnica]
59
+ task: >
60
+ Estructurar la propuesta económica para {{payload.empresa}}.
61
+
62
+ PROPUESTA TÉCNICA APROBADA:
63
+ {{steps.s1-propuesta-tecnica.output}}
64
+
65
+ CONTEXTO ECONÓMICO:
66
+ Presupuesto indicativo del cliente: {{payload.presupuesto}}
67
+ Timeline: {{payload.timeline}}
68
+
69
+ Definir:
70
+
71
+ ## Estructura de Costos
72
+ Desglose por fase, perfil de recurso y dedicación.
73
+
74
+ ## Precio de Lista (sin descuento)
75
+ Total según catálogo de servicios vigente.
76
+
77
+ ## Descuento Estratégico
78
+ Descuento propuesto, justificación y límite máximo según política.
79
+
80
+ ## Precio Final
81
+ Tabla con precio por fase y total con descuento aplicado.
82
+
83
+ ## Condiciones de Pago
84
+ Recomendación de estructura (anticipo / hitos / mensual).
85
+
86
+ ## Hitos de Facturación
87
+ Fechas o entregables que disparan cada factura.
88
+
89
+ ## Opciones Adicionales
90
+ Servicios o módulos nice-to-have con precio incremental que el cliente
91
+ puede activar durante el proyecto.
92
+
93
+ - id: s3-revision-legal
94
+ agent: legal-sales-agent
95
+ depends_on: [s1-propuesta-tecnica, s2-pricing]
96
+ gate: true
97
+ gate_criteria:
98
+ - "Las cláusulas de responsabilidad están limitadas al monto del contrato o 12 meses de servicio"
99
+ - "Los SLA propuestos son operativamente alcanzables sin soporte 24/7 no comprometido"
100
+ - "El NDA o cláusula de confidencialidad cubre tanto código como información del cliente"
101
+ - "La propiedad intelectual de código personalizado es del cliente (o está explícitamente negociada)"
102
+ task: >
103
+ Revisar los aspectos legales y contractuales de la propuesta para {{payload.empresa}}.
104
+
105
+ PROPUESTA TÉCNICA:
106
+ {{steps.s1-propuesta-tecnica.output}}
107
+
108
+ ESTRUCTURA DE PRECIOS:
109
+ {{steps.s2-pricing.output}}
110
+
111
+ Para cada punto, dar el análisis y proponer redacción concreta para incluir en el contrato:
112
+
113
+ ## 1. Responsabilidad y Limitación de Daños
114
+ ## 2. SLA y Garantías de Servicio
115
+ ## 3. Confidencialidad (NDA)
116
+ ## 4. Propiedad Intelectual
117
+ ## 5. Terminación Anticipada
118
+ ## 6. Penalidades por Retraso
119
+ ## 7. Jurisdicción
120
+
121
+ - id: s4-documento-final
122
+ agent: writer-agent
123
+ depends_on: [s1-propuesta-tecnica, s2-pricing, s3-revision-legal]
124
+ task: >
125
+ Redactar el documento final de propuesta comercial para {{payload.empresa}}.
126
+
127
+ INTEGRAR:
128
+ - Propuesta técnica: {{steps.s1-propuesta-tecnica.output}}
129
+ - Estructura de precios: {{steps.s2-pricing.output}}
130
+ - Observaciones legales: {{steps.s3-revision-legal.output}}
131
+
132
+ El documento final debe ser un markdown ejecutivo profesional con esta estructura:
133
+
134
+ ---
135
+ # Propuesta Comercial
136
+ **Para:** {{payload.empresa}} | **Atención:** {{payload.contacto}}
137
+ **Fecha:** [fecha de hoy] | **Nº Propuesta:** PROP-[año]-[número]
138
+ **Validez:** 30 días corridos desde la fecha de emisión
139
+ ---
140
+
141
+ 1. Resumen Ejecutivo
142
+ 2. Nuestra Comprensión del Desafío
143
+ 3. Solución Propuesta
144
+ 4. Alcance y Entregables
145
+ 5. Metodología y Cronograma
146
+ 6. Equipo
147
+ 7. Inversión (tabla de pricing integrada)
148
+ 8. Condiciones de Pago
149
+ 9. Por Qué Elegirnos
150
+ 10. Términos y Condiciones (cláusulas legales resumidas)
151
+ 11. Próximos Pasos
152
+
153
+ Tono: ejecutivo, claro, confiante. Sin jerga técnica excesiva.
154
+ Extensión: entre 1.500 y 2.500 palabras.
155
+
156
+ - id: s5-actualizar-crm
157
+ agent: crm-agent
158
+ depends_on: [s4-documento-final]
159
+ task: >
160
+ Actualizar el CRM con la propuesta comercial emitida para {{payload.empresa}}.
161
+
162
+ RESUMEN DE LA PROPUESTA:
163
+ {{steps.s4-documento-final.output}}
164
+
165
+ PRICING:
166
+ {{steps.s2-pricing.output}}
167
+
168
+ Registrar:
169
+ 1. Mover oportunidad a etapa: PROPOSAL SENT
170
+ 2. Fecha de emisión: hoy
171
+ 3. Fecha de vencimiento: +30 días corridos
172
+ 4. Valor de la oportunidad: precio final según pricing
173
+ 5. Probabilidad de cierre estimada
174
+ 6. Plan de seguimiento post-propuesta:
175
+ - Llamada de presentación: +1 día hábil
176
+ - Follow-up si no hay feedback: +5 días hábiles
177
+ - Revisión / negociación: +10 días hábiles
178
+ - Vencimiento / cierre o pérdida: +30 días
179
+ 7. Notas para el ejecutivo: qué enfatizar en la presentación, objeciones esperadas
@@ -0,0 +1,93 @@
1
+ version: 1
2
+
3
+ orchestrator:
4
+ name: "Orquestador de Ventas"
5
+ provider: __PROVIDER_ID__
6
+ vault:
7
+ path: ./vault
8
+ embedder: simple # change to "ollama" in production for better semantic search
9
+
10
+ __PROVIDERS_BLOCK__
11
+
12
+ flows:
13
+ - id: calificacion-lead
14
+ file: ./flows/calificacion-lead.yaml
15
+ trigger: "calificar|nuevo lead|prospecto|cliente potencial|lead entrante|nuevo contacto"
16
+
17
+ - id: propuesta-comercial
18
+ file: ./flows/propuesta-comercial.yaml
19
+ trigger: "propuesta|cotización|presupuesto comercial|elaborar oferta|armar propuesta"
20
+
21
+ agents:
22
+ - id: lead-agent
23
+ name: "Especialista en Calificación de Leads"
24
+ description: >
25
+ Investiga y califica prospectos aplicando metodología BANT. Determina el
26
+ potencial comercial, identifica al decisor y evalúa el fit con el portafolio
27
+ de servicios de la empresa.
28
+ capabilities: [leads, calificacion, prospeccion, investigacion, bant, scoring, fit]
29
+ provider: __PROVIDER_ID__
30
+ domain: ventas
31
+
32
+ - id: proposal-agent
33
+ name: "Especialista en Propuestas"
34
+ description: >
35
+ Redacta propuestas comerciales personalizadas. Define el alcance de servicios,
36
+ entregables concretos, cronograma por fases e hitos de control. Posiciona
37
+ el valor diferencial adaptado al perfil y necesidad de cada cliente.
38
+ capabilities: [propuestas, cotizaciones, alcance, entregables, cronograma, valor-diferencial]
39
+ provider: __PROVIDER_ID__
40
+ domain: ventas
41
+ gate: true
42
+ gate_criteria:
43
+ - "El alcance está definido con entregables concretos y medibles"
44
+ - "El cronograma tiene hitos de control reales y es comprometible con el equipo"
45
+ - "El pricing propuesto está dentro de la política de descuentos vigente"
46
+ - "El documento refleja correctamente la necesidad comunicada por el cliente"
47
+
48
+ - id: pricing-agent
49
+ name: "Especialista en Pricing"
50
+ description: >
51
+ Calcula la estructura de precios según el catálogo de servicios. Aplica
52
+ descuentos dentro de la política vigente. Define condiciones de pago,
53
+ hitos de facturación y opciones incrementales.
54
+ capabilities: [pricing, descuentos, estructura-comercial, facturacion, margen, aar]
55
+ provider: __PROVIDER_ID__
56
+ domain: ventas
57
+
58
+ - id: legal-sales-agent
59
+ name: "Revisor Legal Comercial"
60
+ description: >
61
+ Revisa contratos de servicios profesionales: SLA, cláusulas de responsabilidad,
62
+ confidencialidad, propiedad intelectual y condiciones de terminación.
63
+ Asegura el cumplimiento normativo y protege los intereses de la empresa.
64
+ capabilities: [contratos, clausulas, sla, nda, responsabilidad, ip, terminacion]
65
+ provider: __PROVIDER_ID__
66
+ domain: legal
67
+ gate: true
68
+ gate_criteria:
69
+ - "Las cláusulas de responsabilidad están limitadas al monto del contrato"
70
+ - "Los SLA son operativamente alcanzables (no se promete disponibilidad 24/7 sin soporte)"
71
+ - "El contrato incluye NDA o cláusula de confidencialidad explícita"
72
+ - "La propiedad intelectual de los entregables está definida claramente"
73
+ - "Hay cláusula de terminación anticipada por ambas partes con preaviso razonable"
74
+
75
+ - id: crm-agent
76
+ name: "Agente CRM"
77
+ description: >
78
+ Registra actividades comerciales, actualiza etapas del pipeline, genera
79
+ notas de seguimiento y define próximas acciones con fecha. Mantiene
80
+ el historial completo y accionable de cada oportunidad.
81
+ capabilities: [crm, pipeline, seguimiento, actividades, oportunidades, follow-up, registro]
82
+ provider: __PROVIDER_ID__
83
+ domain: ventas
84
+
85
+ - id: writer-agent
86
+ name: "Redactor Comercial"
87
+ description: >
88
+ Redacta emails, comunicaciones ejecutivas, resúmenes y documentos de presentación.
89
+ Adapta tono, extensión y contenido al perfil del interlocutor y al momento
90
+ del proceso de venta.
91
+ capabilities: [redaccion, emails, comunicaciones, resumen-ejecutivo, presentaciones, materiales]
92
+ provider: __PROVIDER_ID__
93
+ domain: ventas
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Test runner for the ventas orchestrator
4
+ *
5
+ * Usage:
6
+ * node test-flow.mjs calificacion-lead # lead qualification flow
7
+ * node test-flow.mjs propuesta-comercial # commercial proposal flow (2 gates)
8
+ * node test-flow.mjs dynamic # dynamic planning (no flow match)
9
+ */
10
+
11
+ import { spawn } from 'node:child_process';
12
+ import { createInterface } from 'node:readline';
13
+ import * as path from 'node:path';
14
+ import * as fs from 'node:fs';
15
+ import * as url from 'node:url';
16
+
17
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
18
+ const CONFIG_PATH = path.resolve(__dirname, 'orchestrator.yaml');
19
+ const SERVER_PATH = path.resolve(
20
+ __dirname,
21
+ 'node_modules/@backendkit-labs/orchestrator-agent/dist/server.js',
22
+ );
23
+
24
+ // ── Sample payloads ───────────────────────────────────────────────────────────
25
+
26
+ const FLOWS = {
27
+ 'calificacion-lead': {
28
+ flow_id: 'calificacion-lead',
29
+ task: 'Calificar nuevo lead: Acme Corp',
30
+ payload: {
31
+ empresa: 'Acme Corp',
32
+ contacto: 'Jane Smith',
33
+ cargo: 'CTO',
34
+ email: 'jane@acme.com',
35
+ descripcion: 'Empresa fintech de 80 personas, necesitan modernizar su stack de pagos. Mencionaron presupuesto de $80k-120k para el año.',
36
+ },
37
+ },
38
+ 'propuesta-comercial': {
39
+ flow_id: 'propuesta-comercial',
40
+ task: 'Elaborar propuesta comercial para Acme Corp',
41
+ payload: {
42
+ empresa: 'Acme Corp',
43
+ contacto: 'Jane Smith',
44
+ cargo: 'CTO',
45
+ servicio: 'Modernización de plataforma de pagos (backend Node.js + migración a cloud)',
46
+ necesidad: 'Reemplazar sistema legacy de pagos con alta deuda técnica que falla 2-3 veces por mes',
47
+ presupuesto: '$80.000 - $120.000 USD',
48
+ timeline: '6 meses, con primera fase funcional en 3 meses',
49
+ contexto: 'Lead calificado HOT, CTO es el decisor, board aprobó presupuesto Q1. Evalúan también a un competidor.',
50
+ },
51
+ },
52
+ 'dynamic': {
53
+ flow_id: undefined,
54
+ task: process.env.TASK ?? 'Preparar análisis de oportunidades de upsell para los clientes actuales que llevan más de 6 meses con soporte mensual',
55
+ payload: {},
56
+ },
57
+ };
58
+
59
+ // ── MCP Client (stdio) ────────────────────────────────────────────────────────
60
+
61
+ class McpClient {
62
+ constructor(serverPath) {
63
+ this._nextId = 1;
64
+ this._pending = new Map();
65
+
66
+ const env = { ...process.env };
67
+ const dotenv = path.join(__dirname, '.env');
68
+ if (fs.existsSync(dotenv)) {
69
+ for (const line of fs.readFileSync(dotenv, 'utf-8').split('\n')) {
70
+ const m = line.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*?)\s*$/);
71
+ if (m && m[2] && !(m[1] in env)) env[m[1]] = m[2].replace(/^["']|["']$/g, '');
72
+ }
73
+ }
74
+
75
+ this._proc = spawn('node', [serverPath], { stdio: ['pipe', 'pipe', 'inherit'], env });
76
+
77
+ const rl = createInterface({ input: this._proc.stdout });
78
+ rl.on('line', (line) => {
79
+ if (!line.trim()) return;
80
+ try {
81
+ const msg = JSON.parse(line);
82
+ if (msg.id !== undefined && this._pending.has(msg.id)) {
83
+ const { resolve, reject } = this._pending.get(msg.id);
84
+ this._pending.delete(msg.id);
85
+ if (msg.error) reject(new Error(msg.error.message ?? JSON.stringify(msg.error)));
86
+ else resolve(msg.result);
87
+ }
88
+ } catch {}
89
+ });
90
+
91
+ this._proc.on('error', (err) => console.error('[MCP] error:', err.message));
92
+ }
93
+
94
+ _send(msg) { this._proc.stdin.write(JSON.stringify(msg) + '\n'); }
95
+
96
+ async initialize() {
97
+ const id = this._nextId++;
98
+ const p = new Promise((res, rej) => this._pending.set(id, { resolve: res, reject: rej }));
99
+ this._send({ jsonrpc: '2.0', id, method: 'initialize', params: {
100
+ protocolVersion: '2024-11-05', capabilities: {},
101
+ clientInfo: { name: 'test-flow', version: '0.1.0' },
102
+ }});
103
+ await p;
104
+ this._send({ jsonrpc: '2.0', method: 'notifications/initialized', params: {} });
105
+ }
106
+
107
+ async callTool(name, args) {
108
+ const id = this._nextId++;
109
+ const p = new Promise((res, rej) => {
110
+ this._pending.set(id, { resolve: res, reject: rej });
111
+ setTimeout(() => {
112
+ if (this._pending.has(id)) { this._pending.delete(id); rej(new Error(`Timeout: ${name}`)); }
113
+ }, 120_000);
114
+ });
115
+ this._send({ jsonrpc: '2.0', id, method: 'tools/call', params: { name, arguments: args } });
116
+ return p;
117
+ }
118
+
119
+ close() { this._proc.stdin.end(); }
120
+ }
121
+
122
+ // ── Helpers ───────────────────────────────────────────────────────────────────
123
+
124
+ const extractText = (r) => r?.content?.filter(c => c.type === 'text').map(c => c.text).join('\n') ?? String(r);
125
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
126
+
127
+ function printSection(title, text) {
128
+ const line = '─'.repeat(60);
129
+ console.log(`\n${line}\n ${title}\n${line}`);
130
+ console.log(text);
131
+ }
132
+
133
+ // ── Main ──────────────────────────────────────────────────────────────────────
134
+
135
+ async function main() {
136
+ const flowKey = process.argv[2] ?? 'calificacion-lead';
137
+ const flowDef = FLOWS[flowKey];
138
+ if (!flowDef) {
139
+ console.error(`Unknown flow: ${flowKey}\nOptions: ${Object.keys(FLOWS).join(', ')}`);
140
+ process.exit(1);
141
+ }
142
+ if (!fs.existsSync(SERVER_PATH)) {
143
+ console.error(`Server not found:\n ${SERVER_PATH}\nRun: npm install`);
144
+ process.exit(1);
145
+ }
146
+
147
+ console.log(`\nStarting orchestrator (ventas)...`);
148
+ console.log(` Flow: ${flowKey}`);
149
+
150
+ const client = new McpClient(SERVER_PATH);
151
+ try {
152
+ await client.initialize();
153
+ console.log(' MCP: connected ✓\n');
154
+
155
+ const runArgs = { config_path: CONFIG_PATH, task: flowDef.task };
156
+ if (flowDef.flow_id) runArgs.flow_id = flowDef.flow_id;
157
+ if (Object.keys(flowDef.payload).length > 0) runArgs.payload = flowDef.payload;
158
+
159
+ const startText = extractText(await client.callTool('orchestrator_run', runArgs));
160
+ printSection('RUN STARTED', startText);
161
+
162
+ const runIdMatch = startText.match(/runId:\s*`?([a-z0-9-]+)`?/i);
163
+ if (!runIdMatch) { console.error('\n[ERROR] Could not extract runId.'); process.exit(1); }
164
+ const runId = runIdMatch[1];
165
+
166
+ let attempts = 0, lastStatus = '';
167
+ console.log(`\nPolling (runId: ${runId})...\n`);
168
+
169
+ while (attempts < 80) {
170
+ await sleep(5000);
171
+ attempts++;
172
+
173
+ const statusText = extractText(await client.callTool('orchestrator_status', {
174
+ config_path: CONFIG_PATH, run_id: runId,
175
+ }));
176
+ const status = statusText.match(/status:\s*\*\*([^*]+)\*\*/)?.[1]
177
+ ?? statusText.match(/^status:\s*(\S+)/m)?.[1]
178
+ ?? 'unknown';
179
+
180
+ if (status !== lastStatus) {
181
+ process.stdout.write(` [${new Date().toLocaleTimeString()}] status: ${status}\n`);
182
+ lastStatus = status;
183
+ }
184
+
185
+ if (status === 'complete') { printSection('RESULT', statusText); break; }
186
+ if (status === 'failed') { printSection('ERROR', statusText); break; }
187
+
188
+ if (status === 'waiting_gate') {
189
+ printSection('GATE — APPROVAL REQUIRED', statusText);
190
+ console.log('\nAuto-approving...\n');
191
+ await sleep(2000);
192
+ const approveText = extractText(await client.callTool('orchestrator_approve', {
193
+ config_path: CONFIG_PATH, run_id: runId,
194
+ approved: true, notes: 'Auto-approved by test-flow.mjs',
195
+ }));
196
+ printSection('GATE APPROVED', approveText);
197
+ lastStatus = '';
198
+ }
199
+ }
200
+
201
+ if (attempts >= 80) console.log('\n[TIMEOUT] Check orchestrator_status manually.');
202
+ } finally {
203
+ client.close();
204
+ }
205
+ }
206
+
207
+ main().catch(err => { console.error('\n[FATAL]', err.message); process.exit(1); });
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: Condiciones Comerciales Estándar
3
+ tags: [contratos, clausulas, legal, condiciones, sla, nda]
4
+ description: Términos y condiciones estándar para contratos de servicios profesionales
5
+ ---
6
+
7
+ # Condiciones Comerciales Estándar
8
+
9
+ ## Responsabilidad y Limitación de Daños
10
+
11
+ La responsabilidad máxima está limitada al **monto total del contrato** en el período del incidente.
12
+
13
+ No somos responsables por: pérdida de datos sin backups, daños indirectos o lucro cesante, fallas de integraciones de terceros, modificaciones no autorizadas del cliente.
14
+
15
+ **Regla:** nunca aceptar responsabilidad ilimitada — escalar a Director Comercial + Legal.
16
+
17
+ ---
18
+
19
+ ## SLA — Niveles de Servicio
20
+
21
+ ### Soporte Tier 1
22
+
23
+ | Prioridad | Tiempo de respuesta | Tiempo de resolución |
24
+ |-----------|--------------------|--------------------|
25
+ | P1 Crítico | 2 horas | 8 horas hábiles |
26
+ | P2 Alto | 4 horas | 24 horas hábiles |
27
+ | P3 Medio | 8 horas | 72 horas hábiles |
28
+ | P4 Bajo | 24 horas | Próximo sprint |
29
+
30
+ ### Soporte Tier 3 (24/7)
31
+ - P1: respuesta en 15 minutos, resolución en 2 horas
32
+ - Disponibilidad garantizada: 99.5% mensual
33
+ - **No ofrecer 99.9% o más sin validación de infraestructura**
34
+
35
+ ---
36
+
37
+ ## Confidencialidad (NDA)
38
+
39
+ Cubre: información técnica, código fuente, datos de negocio, información de clientes finales.
40
+ **Duración:** vigencia del contrato + 2 años adicionales post-terminación.
41
+
42
+ ---
43
+
44
+ ## Propiedad Intelectual
45
+
46
+ - **El código desarrollado específicamente para el cliente es del cliente** al completar el pago
47
+ - Frameworks y librerías pre-existentes de la empresa: siempre retenidas
48
+ - Modelos de ML entrenados con datos del cliente: el cliente es dueño del modelo
49
+
50
+ ---
51
+
52
+ ## Terminación del Contrato
53
+
54
+ - **Preaviso mínimo:** 30 días corridos por escrito (ambas partes)
55
+ - **Terminación inmediata:** falta de pago > 60 días, violación de NDA, actividades ilegales
56
+
57
+ ---
58
+
59
+ ## Cláusulas que No Aceptamos (sin aprobación de Dirección)
60
+
61
+ 1. Responsabilidad ilimitada o mayor al monto del contrato
62
+ 2. Cláusulas de no competencia que limiten a qué clientes servimos
63
+ 3. SLA de disponibilidad > 99.5% sin validación de infraestructura
64
+ 4. Propiedad del cliente sobre frameworks pre-existentes
65
+ 5. Penalidades por retraso > 10% del valor del contrato por mes