Skip to content
 
 

Repository files navigation

GxBrain

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.

Tabla de contenidos

Interfaces disponibles

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.

Arquitectura

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
Loading

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)

Contexto que recibe el LLM

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.

Snapshot de la KB (archivos JSON)

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.

Envelope por prompt: cómo se elige el RAG/skill

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 en knowledge_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.

Flujo de una escritura

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
Loading

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.

Validación y auto-corrección

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
Loading

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.

División de pedidos en fases

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
Loading

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.

Herramientas (GxTools)

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.

XPZ

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.

MCP: protocolo del servidor

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).

Memoria y persistencia (GxMemory)

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.

Caché de respuestas

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.

Papelera de reciclaje

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).

Generación de documentación de la KB

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.

Conocimiento personalizado (RAG/skill del usuario)

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.

Idioma

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 la explanation (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 de parm(), 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).

Estadísticas de uso del LLM

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_stats devuelve 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.

Seguridad y guardrails

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).

Estructura del repositorio

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

Requisitos

  • 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)

Build

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.ps1

dotnet 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.

Tests

cd Plugins
.\Run-Tests.ps1                                          # todos los tests
.\Run-Tests.ps1 -Filter "FullyQualifiedName~KbObjectPart" # filtro NUnit sobre un subconjunto

Corre 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.

Instalación

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.

Estado del proyecto

Módulo Estado
shared Implementado
cortex Implementado
nexus Implementado
sentinel Implementado

Documentación adicional

  • 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/LLM
  • Plugins/knowledge/rag/ — documentación técnica de GeneXus que el LLM consulta en tiempo de ejecución
  • Plugins/knowledge/skill/ — definiciones de cuándo y cómo usar cada herramienta

Licencia

Este proyecto se distribuye bajo los términos de la GNU General Public License v3.0.

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages