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.
- package/README.md +2 -0
- package/dist/src/index.js +26 -1
- package/dist/src/prompts.js +39 -0
- package/dist/src/scaffold.js +57 -0
- package/package.json +1 -1
- package/templates/base/orchestrator/_common/.env.example +14 -0
- package/templates/base/orchestrator/_common/package.json +16 -0
- package/templates/base/orchestrator/blank/flows/.gitkeep +0 -0
- package/templates/base/orchestrator/blank/orchestrator.yaml +34 -0
- package/templates/base/orchestrator/blank/vault/lecciones/.gitkeep +0 -0
- package/templates/base/orchestrator/marketing/flows/articulo-blog.yaml +97 -0
- package/templates/base/orchestrator/marketing/flows/campana-leads.yaml +115 -0
- package/templates/base/orchestrator/marketing/orchestrator.yaml +92 -0
- package/templates/base/orchestrator/marketing/test-flow.mjs +205 -0
- package/templates/base/orchestrator/marketing/vault/audiencia/buyer-personas.md +87 -0
- package/templates/base/orchestrator/marketing/vault/canales/estrategia-canales.md +53 -0
- package/templates/base/orchestrator/marketing/vault/contenido/tipos-de-contenido.md +71 -0
- package/templates/base/orchestrator/marketing/vault/lecciones/.gitkeep +0 -0
- package/templates/base/orchestrator/marketing/vault/marca/tono-y-voz.md +49 -0
- package/templates/base/orchestrator/marketing/vault/metricas/kpis-y-benchmarks.md +72 -0
- package/templates/base/orchestrator/marketing/vault/procesos/calendario-editorial.md +65 -0
- package/templates/base/orchestrator/soporte/flows/atencion-ticket.yaml +159 -0
- package/templates/base/orchestrator/soporte/flows/incidente-critico.yaml +218 -0
- package/templates/base/orchestrator/soporte/orchestrator.yaml +98 -0
- package/templates/base/orchestrator/soporte/test-flow.mjs +210 -0
- package/templates/base/orchestrator/soporte/vault/comunicacion/plantillas.md +211 -0
- package/templates/base/orchestrator/soporte/vault/lecciones/.gitkeep +0 -0
- package/templates/base/orchestrator/soporte/vault/procesos/escalacion.md +106 -0
- package/templates/base/orchestrator/soporte/vault/procesos/manejo-de-tickets.md +101 -0
- package/templates/base/orchestrator/soporte/vault/productos/coberturas-de-soporte.md +94 -0
- package/templates/base/orchestrator/soporte/vault/sla/niveles-de-servicio.md +104 -0
- package/templates/base/orchestrator/ventas/flows/calificacion-lead.yaml +113 -0
- package/templates/base/orchestrator/ventas/flows/propuesta-comercial.yaml +179 -0
- package/templates/base/orchestrator/ventas/orchestrator.yaml +93 -0
- package/templates/base/orchestrator/ventas/test-flow.mjs +207 -0
- package/templates/base/orchestrator/ventas/vault/lecciones/.gitkeep +0 -0
- package/templates/base/orchestrator/ventas/vault/politicas/condiciones-comerciales.md +65 -0
- package/templates/base/orchestrator/ventas/vault/procesos/calificacion-bant.md +50 -0
- package/templates/base/orchestrator/ventas/vault/procesos/ciclo-venta.md +61 -0
- package/templates/base/orchestrator/ventas/vault/productos/catalogo-servicios.md +103 -0
- 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); });
|
|
File without changes
|
|
@@ -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
|