GxBrain es un plugin DLL para GeneXus 18 (MEF/AbstractPackageUI, .NET Framework 4.8, x86) que conecta el IDE con un modelo de lenguaje (LLM) para crear y modificar objetos de una Knowledge Base (KB) de GeneXus a partir de instrucciones en lenguaje natural.
El LLM no accede directamente al SDK de GeneXus: toda lectura y escritura pasa por un conjunto de herramientas (tools) expuestas vía el protocolo MCP (Model Context Protocol), con un paso de validación y aprobación antes de aplicar cualquier cambio.
- Interfaces disponibles
- Arquitectura
- Contexto que recibe el LLM
- Flujo de una escritura
- Validación y auto-corrección
- División de pedidos en fases
- Herramientas (GxTools)
- MCP: protocolo del servidor
- Memoria y persistencia (GxMemory)
- Caché de respuestas
- Papelera de reciclaje
- Generación de documentación de la KB
- Conocimiento personalizado (RAG/skill del usuario)
- Idioma
- Estadísticas de uso del LLM
- Seguridad y guardrails
- Estructura del repositorio
- Requisitos
- Build
- Tests
- Instalación
- Estado del proyecto
- Documentación adicional
- Licencia
GxBrain se usa desde dos interfaces distintas, que comparten el mismo servidor MCP:
| Interfaz | Dónde corre el LLM | Quién lanza opencode |
|---|---|---|
| Chat (panel lateral en GeneXus) | opencode serve, lanzado por el plugin |
GxBrain |
Terminal (CLI opencode del usuario) |
opencode del usuario |
El usuario |
En ambos casos, opencode es el cliente/host MCP: tiene el LLM y decide cuándo llamar a una herramienta. El servidor MCP de GxBrain expone las herramientas y responde a esas llamadas; no orquesta el LLM.
flowchart LR
subgraph CHAT["Chat GxBrain"]
direction LR
C["Panel (WebView)"] -->|prompt| OC["opencode serve<br/>(LLM)"]
end
subgraph TERM["Terminal"]
direction LR
T["opencode CLI<br/>(LLM)"]
end
OC -->|"tools/call"| MCP["Servidor MCP de GxBrain"]
T -->|"tools/call"| MCP
MCP -->|lectura directa| Tools["GxTools<br/>(71 herramientas + 6 condicionales)"]
Tools -->|SDK Artech| KB[("KB de GeneXus")]
MCP -.->|escritura: propuesta| Aprob["Aprobación del usuario"]
Aprob -->|aceptada| Diff["Diff + ejecución"]
Diff --> KB
MCP -->|resultado| OC
MCP -->|resultado| T
classDef ext fill:#f1f3f5,stroke:#868e96,color:#000
class KB ext
El código está organizado en cuatro módulos con dependencias en cascada:
| Módulo | Responsabilidad |
|---|---|
| shared | Modelos de datos, logging, memoria en SQL Server, reglas de entrada (GxBrainLaws), configuración persistida |
| cortex | Arma el contexto que recibe el LLM: manifiesto de la KB, contenido del objeto en foco, documentación técnica (RAG) y skills relevantes, reglas de comportamiento, historial, y errores ya corregidos en sesiones anteriores |
| nexus | Capa visible: panel del chat, orquestación de la sesión (Coordinator), las herramientas que tocan la KB (GxTools), el servidor MCP, el armado de diffs y la ejecución/reversión de cambios |
| sentinel | Valida que una acción propuesta pueda aplicarse contra la KB real antes de ejecutarla, y si falla, intenta corregirla usando el error real de GeneXus (máximo 5 ciclos) |
cortex arma el contexto en dos capas: un snapshot persistido de la KB (se genera una vez y se refresca), y un envelope por-prompt que combina ese snapshot con el RAG/skill relevante para el pedido puntual.
ContextService.Build() corre una vez al abrir el panel/sesión y ContextService.Refresh() la actualiza por timer. Ambos escriben en {environment activo}/web/GxBrain/context/:
| Archivo | Contenido |
|---|---|
kb-manifest.json |
Manifest general de la KB |
kb-inventory.json |
Inventario plano de objetos (nombre, tipo, módulo) |
kb-relations.json |
Grafo de relaciones entre objetos (quién llama a quién) |
context-snapshot.json |
Una "firma" por objeto (Tipo|Módulo|Referencias) usada para detectar qué cambió entre refrescos |
SnapshotBuilder arma esas firmas; ContextDiff compara el snapshot viejo contra el nuevo (por nombre+módulo, no solo nombre, porque GeneXus permite objetos homónimos en módulos distintos) y devuelve qué se agregó/eliminó/modificó. Ninguna de las dos toca disco — solo ContextStore persiste.
Por cada prompt, ObjectDetector busca el objeto en foco: recorre el inventario de la KB ordenado por longitud de nombre (de mayor a menor) y devuelve el primer nombre que aparece como palabra completa en el prompt (\bNombre\b, case-insensitive). Es un match léxico simple contra el inventario real — no hay fuzzy-matching ni un paso de LLM para desambiguar.
Con el tipo del objeto detectado, EnvelopeBuilder arma el markdown final combinando:
- RAG y skill universales — siempre presentes, sin importar el objeto en foco.
- RAG y skill del tipo detectado — la guía técnica específica de ese tipo de objeto (Transaction, Procedure, WebPanel, etc.), sumada al conocimiento personalizado del usuario si existe.
- RAG por mención (
GetMentionedRag) — documentos adicionales cuyas keywords (definidas enknowledge_catalog.json) aparecen en el texto del prompt, aunque no sean del tipo en foco; hasta 3 documentos o 30.000 bytes, ordenados por cantidad de keywords coincidentes y prioridad. - RAG de objetos de la fase activa — si el pedido está dividido en fases y una fase declara un tipo de objeto que todavía no existe en la KB (se va a crear en esa misma fase), se suma su RAG aunque el objeto en foco sea otro.
- Definiciones de SDT mencionados — estructura real (hasta 3 SDTs) de cualquier SDT nombrado en el prompt, para que el LLM no adivine su forma.
Cada sección viaja como un bloque independiente y se compone en el markdown final que ve el LLM.
sequenceDiagram
actor U as Usuario
participant IF as Chat o Terminal
participant MCP as Servidor MCP
participant Dry as Validación (DryRun)
participant Sen as Corrección (Sentinel)
participant Ex as Ejecución
U->>IF: instrucción en lenguaje natural
IF->>MCP: tools/call (escritura)
MCP-->>IF: propuesta de cambio (no se ejecuta)
IF-->>U: explicación + propuesta
U->>IF: aprueba o rechaza
alt aprobada
IF->>Dry: valida contra la KB real
alt la validación falla
Dry->>Sen: corrige con el error real
Sen-->>Dry: código corregido
end
Dry-->>Ex: acción validada
Ex->>Ex: aplica el cambio
Ex-->>IF: resultado
IF-->>U: cambio aplicado
else rechazada
IF-->>U: cambio descartado
end
Ninguna escritura se aplica sin aprobación explícita del usuario. La decisión puede darse desde el Chat o desde la Terminal; el diff y la aplicación del cambio ocurren siempre dentro de GeneXus.
Antes de aplicar un cambio, DryRunEngine lo prueba contra la KB real sin persistirlo (creación temporal + validación + eliminación). Si falla, SentinelSvc reintenta la corrección usando el mensaje de error real de GeneXus, hasta 5 ciclos.
flowchart TD
Start["Acción propuesta"] --> Cheap["Validación en memoria"]
Cheap -->|pasa| Strong["Validación fuerte<br/>(objeto temporal + guardar + borrar)"]
Cheap -->|falla| Sen["Sentinel: corrige con el LLM"]
Strong -->|pasa| Ok["Lista para aplicar"]
Strong -->|falla| Sen
Sen -->|"re-valida (máx. 5 ciclos)"| Cheap
Cada ciclo de corrección recibe: el error real de GeneXus, la documentación técnica (RAG/skill) del tipo de objeto, y un contexto acotado del objeto en foco con sus relaciones de primer nivel (no la KB completa) — así una corrección no propone algo que ya choca con un objeto relacionado existente. Los errores reales ya corregidos se guardan localmente y se reinyectan en contextos futuros para reducir la probabilidad de repetirlos.
Cada ciclo de corrección es una llamada aparte al LLM, con su propio prompt ("Sos el corrector de GeneXus...") — no es el mismo turno de conversación que generó el plan original. Reutiliza la sesión del chat (para que quede en el mismo historial), pero no un agente opencode distinto. Además, cuando una corrección tiene éxito, Sentinel dispara una llamada extra al LLM, con una sesión completamente nueva (para no ensuciar el historial del chat), pidiéndole condensar el error real en una regla general reutilizable — esa regla queda guardada localmente y es lo que se reinyecta en corridas futuras.
Un pedido que menciona varios objetos de la KB, o cuyo texto es largo, se divide automáticamente en fases más chicas antes de mandarse al LLM. El objetivo es doble: reducir la cantidad de contexto que viaja en cada llamada (menos tokens, menor costo) y evitar que una respuesta demasiado grande falle o se corte a mitad de camino.
Un pedido se divide en fases si se cumple alguna de estas condiciones:
- Se detectan 2 o más objetos ya existentes de la KB mencionados en el prompt.
- El largo del prompt supera un límite que depende del modelo usado.
El "tier" del modelo (PhaseDetector.GetModelTier) se determina por substring del nombre del modelo — no hay una consulta real a una API de capacidades ni a la ventana de contexto del modelo:
| Tier | Detección | Objetos por fase | Caracteres por fase | Parts por fase |
|---|---|---|---|---|
| Free | el nombre contiene free o trial |
1 | 600 | 2 |
| PaidStandard (default) | cualquier otro nombre | 2 | 1.500 | 3 |
| PaidLarge | el nombre contiene gpt-4, gpt-4o, claude-opus, claude-sonnet, gemini-pro, gemini-ultra, deepseek-r1, o1 u o3 |
3 | 2.000 | 4 |
Esta misma heurística de nombre (IsModelFree) se reutiliza para elegir el texto de error correcto (timeout/cuota/auth) según sea un modelo gratuito o de pago.
La descomposición del pedido en fases la hace un agente opencode separado (phase-decompose, declarado en opencode.json sin acceso a ninguna tool de lectura/escritura), con su propia sesión — no comparte historial con el chat, para que no arrastre descomposiciones de pedidos anteriores sin relación.
flowchart TD
P["Prompt del usuario"] --> D{"¿2+ objetos<br/>mencionados o<br/>prompt largo?"}
D -->|No| Single["Una sola llamada al LLM"]
D -->|Sí| Split["Dividir en fases"]
Split --> F1["Fase 1"] --> F2["Fase 2"] --> Fn["..."]
F1 -.->|checkpoint| RB["RollbackManager"]
F2 -.->|checkpoint| RB
Fn -.->|si una fase falla| Undo["Deshacer todas las fases aplicadas"]
RB -.-> Undo
Cada fase se ejecuta, valida y aplica de forma independiente, con un checkpoint de rollback propio — si una fase falla, se pueden deshacer todas las fases ya aplicadas de esa corrida en orden inverso, sin dejar la KB a mitad de camino. La decisión de aprobar o rechazar cada fase puede darse tanto desde el Chat como desde la Terminal.
Todo lo que el LLM puede hacer contra la KB pasa por un conjunto fijo de herramientas (tools), registradas centralmente en ToolRegistry. Ninguna tool implementa el acceso al SDK por su cuenta: todas heredan de una base común que valida sesión, tipo de objeto y Part antes de tocar la KB.
| Tool | Qué hace |
|---|---|
export_objects_xpz |
Exporta objetos a un .xpz — por tipo+nombres, * global, o una lista mixta Nombre:Tipo,.... Con groupByType genera un archivo por tipo. |
export_refs_xpz |
Exporta un objeto raíz + sus referencias directas (1er nivel): calls, callers o ambos. |
import_xpz |
Importa un .xpz a la KB activa, con overwrite opcional. |
open_xpz_objects |
Lee el XML del .xpz y abre en el editor los objetos que ya existen en la KB (no importa nada). |
read_xpz |
Lee un .xpz (descomprime y parsea el XML) y devuelve la lista de objetos, sin tocar la KB. |
Todas exportan/importan contra el servicio real del SDK (IKnowledgeManagerService), no hay simulación.
El SDK de GeneXus no ofrece exportación selectiva por Part de forma nativa — ExportOptions siempre opera sobre el objeto completo. El único control nativo es el flag onlyStructure (ExportOptions.OnlyStructuresForTransactions), aplicable solo a Transaction/BC, y que excluye código+variables+patterns de una sola vez (no Parts individuales).
export_objects_xpz sí soporta exclusión granular por Part vía el parámetro excludeParts (SourcePart, RulesPart, EventsPart, VariablesPart, WebFormPart — ej. exportar una Transaction sin su WebForm). Como el SDK no tiene esa capacidad nativa, se implementa clonando el objeto en memoria (IKnowledgeManagerService.Clone) y quitando la Part solicitada de la copia antes de exportar — el objeto original de la KB nunca se modifica ni se guarda. Solo aplica a los tipos que efectivamente tienen esa Part (se ignora si no corresponde).
| Categoría | Cantidad | Ejemplos |
|---|---|---|
| IDE | 3 | Info de la KB, ambiente activo, objetos abiertos |
| Navegación | 8 | Buscar/listar objetos, propiedades, Parts disponibles |
| Lectura de Parts | 6 | Source, Rules, Events, Variables, validación de sintaxis |
| Escritura de Parts | 8 | set_part_content, variables, eventos, reglas |
| CRUD de objetos | 5 | Crear, renombrar, mover, borrar |
| Transaction | 5 | Atributos, niveles, índices |
| SDT / Domain | 5 | Estructura de SDT, valores de dominio |
| XPZ | 5 | Exportar/importar objetos y referencias (detalle abajo) |
| ExternalObject | 1 | Métodos externos |
| UI / objetos varios | 7 | DataSelector, Menu, Theme, WebForm, UserControl |
| Importador de diseño (DSO generator) | 4 | Crear/listar/describir diseños importados |
| Catálogo de controles GeneXus | 2 | Vocabulario real de controles para armar pantallas |
| Design System Objects (DSO) | 7 | Master page, home, aplicar diseño, importar plantilla |
| Historial de objetos GeneXus | 2 | Diagnóstico experimental de versiones |
| Documentación | 3 | Generar/guardar reporte, layout de formularios |
| Papelera de reciclaje (condicional) | 3 | Listar, restaurar, vaciar |
| Historial de sesión (condicional) | 3 | Buscar historial, historial reciente, estadísticas de uso |
71 tools fijas + hasta 6 condicionales = 77 máx. Las condicionales solo se registran si el repositorio correspondiente (papelera / memoria) está disponible en esa sesión.
El servidor MCP de GxBrain (McpHttpServer) implementa Streamable HTTP (la variante actual de la spec MCP, no el SSE viejo): POST con el body JSON-RPC de la llamada, GET responde 405 (no se ofrece stream server-initiated), y las notificaciones (notifications/initialized, notifications/cancelled) responden 202 Accepted sin cuerpo. En el handshake (initialize), el servidor hace eco de la protocolVersion que pide el cliente. Puerto: 5100 + hash(kbPath).
Todo el estado que sobrevive entre sesiones vive en SQL Server, bajo el esquema gb (GxBrain.Memory, implementado por MemoryRepository). El schema se crea y migra solo al arrancar el Coordinator — no requiere scripts manuales:
| Tabla | Contenido |
|---|---|
gb.GxBrain_PromptHistory |
Historial de prompts/respuestas por sesión, con tokens/costo/ciclos de corrección. Full-Text Search (con fallback a LIKE + SOUNDEX si FTS no está instalado) |
gb.GxBrain_SessionMemory |
Estado de sesión (sesión activa por KB+Environment, último modelo usado) |
gb.GxBrain_Cache |
Caché de respuestas del LLM (ver abajo) |
gb.GxBrain_Settings |
Configuración persistida del panel (dock, tamaño, pineado, visibilidad), por KB+Environment |
gb.GxBrain_RecycleBin |
Objetos borrados, recuperables (ver Papelera de reciclaje) |
La búsqueda de historial combina resultados de Full-Text Search y de coincidencia difusa (Soundex + DIFFERENCE), mezclados por ranking recíproco (RRF), para tolerar tanto búsquedas exactas como con errores de tipeo.
Las respuestas informativas del LLM (sin acciones de escritura) se cachean por 24 horas, con clave hash(prompt + modelo + tipo de agente + KB + Environment). Si el mismo prompt se repite dentro de esa ventana, se devuelve la respuesta cacheada sin volver a llamar al LLM.
Escribir /nocache en cualquier parte del mensaje fuerza a ignorar el caché para ese prompt puntual y refresca la entrada cacheada con la respuesta nueva.
Borrar un objeto de la KB nunca es definitivo desde el chat: delete_object manda el objeto a gb.GxBrain_RecycleBin (XPZ completo en Base64) en vez de eliminarlo sin dejar rastro. Desde ahí se puede listar lo borrado, restaurar un objeto puntual, o vaciar la papelera explícitamente.
El guardado en la papelera es best-effort: si por algún motivo falla, no bloquea el borrado (queda logueado como warning, pero el objeto se borra igual).
La tool generate_kb_documentation arma un reporte de la KB con dos vistas — funcional y técnica — incluyendo diagramas generados automáticamente (clases, modelo de datos/MER, dependencias entre objetos, layout de formularios) en formato D2, renderizados con un binario d2.exe standalone. Si el LLM genera una sintaxis D2 inválida, un servicio de reparación (D2RepairService) intenta corregirla antes de renderizar, en vez de descartar el diagrama.
El visor HTML del reporte (Plugins/knowledge/viewer/report-template.html) arma un índice navegable automáticamente a partir de los títulos reales del reporte (H1/H2/H3) — no depende de que el LLM escriba una tabla de contenido a mano, así que nunca queda desactualizado ni con anclas rotas.
Además de la documentación técnica (RAG) y las definiciones de skill que vienen empaquetadas con el plugin (Plugins/knowledge/rag/ y Plugins/knowledge/skill/), cada Knowledge Base puede sumar su propio conocimiento por tipo de objeto, sin tocar el plugin.
GxBrain crea automáticamente, al arrancar, dos carpetas dentro del environment activo:
{environment activo}/web/GxBrain/
├── rag/
│ └── README.md # generado automáticamente, explica la convención
└── skill/
└── README.md # ídem
Ahí el usuario puede agregar archivos .md con la convención <tipo>_<contexto>.md — por ejemplo procedure_seguridad.md, procedure_reglas.md, transaction_auditoria.md:
<tipo>: uno de los tipos de objeto GeneXus soportados (Transaction,Procedure,WebPanel,SDT,BC, etc. — no distingue mayúsculas/minúsculas).<contexto>: libre, solo para organizar — puede haber varios archivos custom por tipo.
El contenido de cada archivo se suma al RAG/skill base de ese tipo, nunca lo reemplaza. Si el prefijo no matchea ningún tipo conocido (por ejemplo seguridad_general.md), el archivo se trata como universal: se suma al conocimiento que aplica siempre, sin importar el tipo de objeto en foco.
Este conocimiento custom se usa tanto al armar el contexto del prompt (KnowledgeLoader, vía ContextService) como al corregir un plan que falló la validación (SentinelSvc) — en ambos casos el LLM ve la documentación/instrucciones propias de la KB, no solo las genéricas del plugin.
El panel soporta tres idiomas — español (default), inglés y portugués — configurables desde Ajustes (⚙) en el panel del chat. El cambio es instantáneo: no hace falta recargar el panel ni reabrir la KB.
Lo que cambia con el idioma:
- Interfaz completa: botones, modal de Configuración, disclaimer de "Solo Lectura", badges, textos de los 36 tonos de personalidad.
- La respuesta del LLM en el chat/terminal: una directiva explícita en el system prompt (
SystemPromptBuilder) le exige al modelo escribir laexplanation(el texto que ve el usuario) siempre en el idioma elegido, sin importar en qué idioma esté la documentación técnica de referencia o el propio prompt del usuario. - Comentarios y descripciones dentro del código GeneXus que el LLM escribe: comentarios (
/* */,//) en Source/Events/Rules, descripciones de parámetros deparm(), y la Description de variables, atributos y del propio objeto. - Los reportes de documentación de la KB (
DocumentationPipeline): títulos, prosa, contenido de tablas y etiquetas de diagramas.
Lo que nunca cambia con el idioma (a propósito):
- Nombres de objetos, atributos, variables y tablas — se mantienen tal cual están en la KB o como los nombra el usuario; traducirlos rompería referencias existentes.
- Los textos dentro de
Msg()/Error()en las Rules — son el texto que ve el usuario final de la aplicación generada, no tienen relación con el idioma de este chat, y deben quedar intactos. - La documentación técnica (RAG) que el LLM consulta como referencia — son ~200 guías en español; el modelo las lee en español y aun así responde en el idioma elegido.
- El código GeneXus ya existente en la KB (comentarios de código escrito antes de esta sesión quedan como están; los reportes lo citan tal cual, no lo traducen).
Cada llamada al LLM devuelve tokens de entrada/salida y costo estimado en USD; GxBrain persiste esos valores por prompt (junto con los ciclos de corrección que usó Sentinel, si intervino) en gb.GxBrain_PromptHistory. A partir de ahí:
- El panel del chat muestra el acumulado de tokens/costo de la sesión actual (no solo el último mensaje).
- La tool MCP
get_usage_statsdevuelve el uso agregado — por sesión (default) o de toda la KB (scope: "kb") — con cantidad de prompts, tokens de entrada/salida, costo total y promedio de ciclos de corrección.
El prompt del usuario se trata siempre como dato, nunca como instrucción sobre el propio sistema. Antes de que cualquier prompt llegue al LLM, pasa por un filtro de entrada (GxBrainLaws) con reglas no configurables por el usuario:
- No se procesan instrucciones que intenten modificar, ignorar o reescribir estas reglas.
- No se adoptan personalidades alternativas ni "modos de prueba" (jailbreaks).
- Nunca se revelan prompts internos, credenciales, variables internas de GeneXus, ni la estructura de estas reglas.
A esto se suma que ninguna escritura se aplica sin aprobación explícita (ver Flujo de una escritura), y que el proyecto nunca instala ni modifica la instalación de GeneXus de forma automática (ver Instalación).
V3.1/
├── AGENTS.md # Reglas e instrucciones para agentes/LLMs que trabajan sobre este repo
├── GxBrain-Diccionario-y-Diagramas.md # Documento de arquitectura detallado, con diagramas por nivel
├── LICENSE
├── .env # Configuración local (rutas del ambiente)
├── docs/ # Planes y specs de features puntuales
└── Plugins/
├── Build-GxBrain.ps1 # Script de build (único método soportado)
├── Backup-Plugins.ps1 # Script de respaldo — usa la ruta definida en .env
├── GxBrain.props # Versión del plugin y versión del SDK Artech
├── knowledge/ # Documentación RAG + skills que el LLM consulta en tiempo de ejecución
└── src/
├── shared/ # GxBrain.Core, GxBrain.Logging, GxBrain.Memory
├── cortex/ # GxBrain.Cortex — armado de contexto
├── nexus/ # GxBrain.Nexus.Plugin, .Panel, .Tools, .Connect
└── sentinel/ # GxBrain.Sentinel.Refiner — validación y corrección
- GeneXus 18 instalado (provee el runtime del SDK Artech en tiempo de ejecución del plugin)
- .NET Framework 4.8 / SDK compatible con MSBuild para
net48 - SQL Server accesible (historial de conversación, caché de respuestas, configuración persistida del panel)
- opencode — CLI externa que actúa de host/cliente MCP y provee el acceso al LLM
- PowerShell (los scripts de build son
.ps1)
Backup-Plugins.ps1 lee la ruta de destino de los respaldos desde GXBRAIN_BACKUP_ROOT, definida en el archivo .env en la raíz del repo:
GXBRAIN_BACKUP_ROOT=Z:\GxBrain\V3.1
Quien clone el proyecto y use una ruta de respaldo distinta puede simplemente editar ese valor.
cd Plugins
.\Build-GxBrain.ps1 # Debug — incrementa el número de build automáticamente
.\Build-GxBrain.ps1 -DoBackup # Debug + backup explícito
.\Build-GxBrain.ps1 -Config Release # Release — requiere Backup-Plugins.ps1dotnet build directo no incrementa el número de build y no está soportado como método de compilación de este proyecto; usar siempre Build-GxBrain.ps1.
Compilar en -Config Release (o pasar -DoBackup en Debug) ejecuta automáticamente Backup-Plugins.ps1, ubicado en Plugins/ junto a Build-GxBrain.ps1. Ese script lee la ruta de destino del backup desde GXBRAIN_BACKUP_ROOT (variable de entorno o .env); si no está configurada, el script falla con un mensaje indicando cómo definirla.
El binario resultante queda en Plugins/src/nexus/GxBrain.Nexus.Panel/bin/{Config}/net48/GxBrain.dll. El post-build copia el DLL y la carpeta knowledge/ a Plugins/DEPLOY/GxBrain/.
El schema de SQL Server (tablas bajo el esquema gb) se crea y actualiza solo, de forma idempotente, la primera vez que arranca el Coordinator — no hace falta correr ningún script a mano. La excepción es Full-Text Search: si no está instalado en la instancia de SQL Server, el historial cae a búsqueda difusa (LIKE + SOUNDEX) en vez de búsqueda en lenguaje natural; el log indica cómo instalarlo si se necesita.
cd Plugins
.\Run-Tests.ps1 # todos los tests
.\Run-Tests.ps1 -Filter "FullyQualifiedName~KbObjectPart" # filtro NUnit sobre un subconjuntoCorre dos suites: GxBrain.Nexus.Tools.Test (vía dotnet test, incluye el pipeline de escritura DryRun→Sentinel→Execute→Rollback) y GxBrain.Cortex.Test (vía dotnet run, pipeline de contexto: ContextService, KnowledgeLoader, SystemPromptBuilder, etc.). Requiere GeneXus 18 instalado — varios tests ejercitan ToolRegistry/KbToolBase contra el SDK real.
La instalación en GeneXus es siempre manual: copiar el contenido de Plugins/DEPLOY/GxBrain/ a la carpeta de paquetes de GeneXus. El proyecto no ejecuta genexus.exe /Install ni copia archivos a las carpetas del IDE de forma automática.
Plugins/knowledge/d2-validator/d2.exe(renderizador de diagramas D2, binario de terceros de ~46MB) no está incluido en el repositorio por su tamaño. Para que el renderizado de diagramas D2 funcione, descargarlo desde el repositorio oficial de D2 y colocarlo en esa misma ruta.
| Módulo | Estado |
|---|---|
| shared | Implementado |
| cortex | Implementado |
| nexus | Implementado |
| sentinel | Implementado |
GxBrain-Diccionario-y-Diagramas.md— diccionario de términos y diagramas de arquitectura por nivel de detalle (componentes, puertos, modelo de reglas, secuencias completas)AGENTS.md— convenciones de código, reglas no negociables y guía de build para quienes contribuyan con ayuda de un agente/LLMPlugins/knowledge/rag/— documentación técnica de GeneXus que el LLM consulta en tiempo de ejecuciónPlugins/knowledge/skill/— definiciones de cuándo y cómo usar cada herramienta
Este proyecto se distribuye bajo los términos de la GNU General Public License v3.0.