Contexto del proyecto Cortex (HIVE)¶
Documento de referencia para desarrolladores y agentes: dónde estamos, cómo encaja todo y hacia dónde apunta el monorepo. Actualizar cuando cambie arquitectura o hitos relevantes.
Última revisión: 2026-07 (principio rector panels emergentes; products/ sandbox PMV; casos de uso; MCP/WS beta; auth JWT parcial).
Visión¶
Cortex/HIVE es una plataforma modular ensamblada por plugins Python. ¿No conoces una sigla? Consulta el Glosario.
La experiencia administrativa ofrece panels que emergen de plugins habilitados, UI declarativa y API REST bajo /api/v1:
- Los panels activos los definen los plugins (
contributes_panels, entry point opcionalcortex.panels), no un catálogo fijo del framework. - Cada panel tiene path UI, namespace API y módulos CUS (manifests + dashboards JSON).
- Los plugins no aportan páginas React; declaran JSON y REST.
- El framework no conoce plugins de dominio; sí provee mecanismos (
control, namespaces generativos, discovery por entry points). - Capa
products/— extensibilidad esperada / sandbox PMV (caso Reservas); el loader no leecomposition.pyen runtime. - Documentación de plataforma en
docs/(cortex-docs); documentación de dominio endocs/plugins/<id>/(fuente única en el sitio).
Los prototipos históricos validaron la arquitectura multi-panel y UI declarativa; no definen el dominio genérico de los módulos de negocio (ver ADR 008 y catálogo de plugins).
Mapa general del sistema¶
Diagrama de un vistazo: actores, capas Dependiente, plugins Independiente, datos e integraciones. El detalle de cada bloque está en las secciones siguientes y en los ADRs.
Leyenda: Visión holística de Cortex/HIVE. Actores: administrador (panel), apps externas (REST), agentes (MCP/WS). Estado: UI, registries, apirest — implementados; MCP/WS — beta; auth JWT — parcial; oauth2-server completo — diseño; webhooks — diseño.
flowchart TB
subgraph actores [Actores]
Admin[Administrador panel]
Apps[Apps y clientes REST]
IA[Agentes IA MCP]
end
subgraph frontend [Frontend Dependiente]
Shell["@cortex/web + skins"]
CUS[Panel CUS widgets]
end
subgraph plataforma [Plataforma HIVE Dependiente]
REST["FastAPI /api/v1"]
Auth[JWT middleware parcial ADR 005]
DB[database PG]
IO[io apirest mcp ws beta]
UIreg[forms panel registries]
end
subgraph nucleo [Nucleo ensamblador]
SPI[cortex_core SPI hooks]
FW[cortex_framework loader]
end
subgraph plugins [Plugins Independiente]
Dom[cortex_plugin descubierto por entry points]
end
subgraph datos [Infraestructura]
PG[(PostgreSQL de plataforma)]
Redis[(Redis cache NFR)]
end
subgraph externos [Externos opcionales]
IdP[IdP OAuth externo]
WH[Suscriptores webhooks]
end
Admin --> Shell
Shell --> CUS
CUS -->|HTTP| REST
Apps --> REST
IA --> IO
REST --> Auth
REST --> DB
REST --> IO
REST --> UIreg
Auth --> IdP
FW --> SPI
SPI -->|discovery bootstrap| Dom
Dom -->|api_router runtime| IO
DB --> PG
Dom --> PG
IO --> Redis
IO --> WH Flujo resumido:
- Bootstrap (arranque):
load_pluginsdescubre plugins →create_plugin+ hooksregister_*→ registries → rutas/panels,/ui,/forms. - Runtime: el panel React consume esas rutas; los plugins sirven dominio en
/api/v1/{namespace}; auth aplica en cada petición cuando esté activo. - Integración: plugins de negocio no se importan entre sí. Se integran por REST (ruta conocida) y/o events/listeners sin conocer al emisor (ADR 021). Bus de datos y puertos quedan para una fase posterior.
Arquitectura Dependiente vs Independiente¶
La pizarra de producto define dónde vive el código, no solo “core vs plugins”.
| Columna | Qué es | Dónde vive |
|---|---|---|
| Dependiente | Módulos internos del framework — la plataforma no funciona sin ellos | framework/cortex_framework/*, packages/cortex-panel-*, packages/cortex-web |
| Independiente | Dominios de negocio en plugins pip/sideload | plugins/*/cortex_plugin_* (submódulos → cortex-ia-com-co/cortex-plugin-*) |
Guía de clonado y flujo git: Repositorios y submódulos.
Los plugins consumen módulos Dependiente (auth, IO, UI, database); no reimplementan OAuth, panel shell, widgets base ni capa REST/MCP.
Convención de leyendas en diagramas¶
Cada diagrama del repo incluye un bloque Leyenda con:
- Propósito — qué muestra el diagrama.
- Actores — quién inicia cada interacción.
- Estado — Implementado (código en repo) o Diseño (ADR / pendiente).
Módulos Dependiente¶
| Módulo | Responsabilidad | Ubicación actual / objetivo |
|---|---|---|
| oauth2-server | OAuth2, ACL, permisos, JWT (Keycloak-like interno; IdP externo opcional — ADR 005) | Parcial: AuthMiddleware, login demo, scopes por panel; objetivo: cortex_framework.oauth2_server |
| database | PostgreSQL único (DATABASE_URL), sesiones async, tablas de plataforma | cortex_framework/database/ |
| io | apirest, middleware, mcp, ws, events/listeners, observers, notifications, broadcasting, webhooks, apirest2mcp (ADR 010, ADR 021) | Parcial: REST en api/; MCP + WS + dominio en io/ (beta); webhooks / apirest2mcp en diseño |
| ui / panel | Forms, componentes, dashboards, skins, multi-panel CUS | cortex_framework/forms/, panel/, dashboard/, packages/cortex-panel-* |
| observability | Logs, trazas, métricas | Diseño |
| cms | Contenido gestionado (páginas, bloques) para apps host | Diseño — módulo Dependiente |
| reportes | Motor de informes transversal sobre datos de plugins | Diseño — módulo Dependiente |
| integraciones | Conectores salida/entrada (ERP, pasarelas) vía io | Diseño — submódulo de io |
| configuración | Settings de plataforma, panel Control | settings.py, control/ |
Paneles generativos: los namespaces (operations, admin) se materializan con ensure_panel() cuando plugins habilitados inyectan módulos. El sandbox helloworld (panel samples) es referencia interna — ver API interna del framework.
Guía operación y CI: Desarrollo y CI.
Namespaces operations y admin (ADR 019)¶
| Namespace | Ruta | Rol | Módulos típicos |
|---|---|---|---|
operations | /operations/ | Operación diaria (generativo) | Ver caso Reservas |
admin | /admin/ | Parametrización (generativo) | Ver caso Reservas |
Convención de módulos por namespace (caso Reservas / UnoSportClub): casos-de-uso/reservas/bundles.md. El mecanismo generativo es de plataforma (ADR 019).
flowchart TB
subgraph namespaces [Namespaces generativos]
P[operations /operations]
A[admin /admin]
end
subgraph opMods [Modulos operacion]
BK[booking]
CL[clients]
RS[resources]
end
subgraph admMods [Modulos parametrizacion]
SL[sales]
BL[billing]
PY[payments]
PR[pricing]
end
subgraph cross [Contribucion transversal]
W[register_widgets KPI]
S[register_settings]
F[reservation-flow widgets]
end
P --> opMods
A --> admMods
SL --> W
PY --> W
BK --> F
F --> CL
F --> PY
F --> PR
SL --> S
BL --> S
PY --> S
PR --> S
BK --> S Leyenda: Convención de separación operación / parametrización. Un plugin puede registrar en varios namespaces (módulos, widgets o settings). Estado: Implementado (paneles generativos
operations+admin).
Plugins Independiente (dominio)¶
| Dominio | Plugin | Notas |
|---|---|---|
| Reserva (calendario, agenda, recursos) | cortex_plugin_booking | plugins/booking |
| Pagos | cortex_plugin_payments | |
| Facturación | cortex_plugin_billing | |
| Contabilidad | cortex_plugin_accounting | Namespace accounting — docs en repo del plugin |
| Descuentos / cupones | cortex_plugin_discounts | |
| Tarifas | cortex_plugin_pricing | |
| Clientes | cortex_plugin_clients | |
| Ventas (POS) | cortex_plugin_sales | Cajeros, apertura/cierre, mostrador |
| Tienda (e-commerce) | cortex_plugin_store | Catálogo, carrito, checkout |
| Eventos | cortex_plugin_events | |
| Suscripciones | cortex_plugin_subscriptions | |
| Bot / IA | Consumen io.mcp + dominio | No duplican reglas de negocio; tools por plugin (ADR 006) |
Ventas ≠ Tienda: dos plugins separados; comparten integraciones (pagos, clientes, tarifas) vía REST, sin código compartido de dominio.
flowchart TB
subgraph dependiente [Dependiente - modulos framework]
Auth[oauth2-server ACL JWT]
Tenant[modular logs config]
UI[forms components dashboard skins panel]
IO[io apirest webhooks mcp apirest2mcp]
end
subgraph independiente [Independiente - plugins]
BK[cortex_plugin_booking]
SL[cortex_plugin_sales POS]
ST[cortex_plugin_store e-commerce]
AC[cortex_plugin_accounting]
end
Auth --> IO
UI -->|HTTP PanelApiClient| IO
IO --> BK
IO --> SL
IO --> ST
IO --> AC Leyenda: Taxonomía Dependiente vs Independiente. Actores: módulos de plataforma habilitan plugins de negocio; la UI solo habla HTTP con REST. Estado: registries y apirest implementados; auth JWT parcial; oauth2-server y webhooks en diseño.
flowchart LR
subgraph sales [cortex_plugin_sales]
CR[cajeros]
OP[apertura cierre]
TK[ticket mostrador]
end
subgraph store [cortex_plugin_store]
CAT[catalogo]
CART[carrito]
CHK[checkout]
end
subgraph shared [integracion REST]
PAY[cortex_plugin_payments]
CLI[cortex_plugin_clients]
PRC[cortex_plugin_pricing]
end
sales --> PAY
store --> PAY
sales --> CLI
store --> CLI
store --> PRC Leyenda: Ventas (POS) y Tienda (e-commerce) como plugins distintos. Actores: cada dominio llama a otros plugins solo por API. Estado:
salesscaffold;storescaffold; integraciones reales pendientes.
Ciclo de vida del plugin¶
Principio: HIVE no conoce las reglas de negocio ni el código React de un plugin. Solo conoce contratos SPI, hooks de registro y rutas HTTP genéricas de plataforma. Al descubrir un plugin, este se coloca en la aplicación: panels, módulos CUS, formularios y API REST — usando herramientas Dependientes (forms, UI/panel, widgets, io.apirest).
El arranque en framework/cortex_framework/plugins/loader.py tiene dos fases:
- Instancia:
create_plugin()→PluginProtocol(api_router,resource_paths) — lógica REST de dominio. - Bootstrap: hooks opcionales → el framework inyecta implementaciones concretas de los registradores definidos en
core/cortex_core/registrar.py(DIP).
Bootstrap vs runtime¶
| Fase | Mecanismo | Responsabilidad del plugin |
|---|---|---|
| Bootstrap | register_resources, register_dashboards (legacy), register_settings, register_mcp_tools, register_ws_namespaces, register_listeners, register_observers, … | Panels, pantallas CUS, formularios, tools MCP, namespaces WS, listeners/observers |
| Runtime | api_router(), resource_paths(), emit/notify de dominio | Endpoints y lógica de dominio bajo /api/v1; events entre plugins activos |
Hooks disponibles¶
| Hook | Tipo inyectado (core) | Qué publica |
|---|---|---|
configure_panel (cortex.panels, opcional) | PanelBuilder | Identidad de namespace dedicado (path, brand, theme) |
register_resources(registry) | ResourceRegistry | Manifest + dashboards + forms vía ResourceBuilder (recomendado) |
register_widgets(registry) | WidgetRegistryApi | Widgets en dashboard del namespace (panel_id) |
register_settings(registry) | SettingsRegistry | Secciones de configuración por panel |
register_dashboards(registry) | DashboardRegistrar | Manifest + dashboards JSON (legacy) |
register_forms(registry) | FormRegistrar | FormDefinition → GET /api/v1/forms/{formId} |
register_layouts(registry) | LayoutRegistrar | Fragmentos de layout (merge) |
register_reports(registry) | ReportRegistrar | Reportes exportables |
register_render_hooks(registry) | RenderHookRegistrar | Slots en el shell React |
register_mcp_tools(registry) | McpToolRegistrar | Tools MCP sobre REST existente (ADR 006) |
register_ws_namespaces(registry) | WsNamespaceRegistrar | Handlers WebSocket por namespace |
register_listeners(registry) | EventListenerRegistrar | Listeners de events de dominio (ADR 021) |
register_observers(registry) | ObserverRegistrar | Observers del ciclo de vida de entidades propias (ADR 021) |
Catálogo de campos v1 (FormBuilder, emisión en forms/emit.py, renderers shadcn): ver ADR 020.
El plugin compone pantallas con widgets del UI Kit (data-table, form, section, …); no aporta componentes React propios.
Límite del desacoplamiento: HIVE sí conoce los tipos de widget y las rutas HTTP de plataforma; lo desconocido es el dominio de negocio y el JSON concreto de cada módulo.
Leyenda: Ciclo completo discovery → bootstrap → ensamblado HTTP → shell React. Actores: discovery, control embebido, plugins, registries, API, shell. Estado: Implementado.
flowchart TB
subgraph discovery [Discovery]
EP[entry_points cortex.plugins]
Load[load_plugins]
end
subgraph control [Control embebido]
BC[bootstrap_control_panel]
end
subgraph plugin [Plugin Independiente]
CP[create_plugin api_router]
HR[register_resources]
HD[register_dashboards legacy]
JSON[ui manifest dashboards]
end
subgraph framework [Framework Dependiente]
PREG[PanelRegistry ensure_panel]
RREG[ResourceRegistry DashboardRegistry FormRegistry]
HTTP["GET /api/v1/panels /ui /forms"]
IO[io.apirest guards de auth]
Store[PluginStateStore PG]
end
subgraph frontend [Shell React]
Shell["@cortex/web + panel-shadcn"]
Widgets[widgets CUS]
end
Store --> Load
EP --> Load
Load --> BC --> PREG
Load --> CP
Load --> HR
Load --> HD
JSON --> HD
HR --> PREG
HR --> RREG
HD --> RREG
CP --> IO
PREG --> HTTP
RREG --> HTTP
HTTP --> Shell --> Widgets
Widgets -->|fetchPath| IO Leyenda: Secuencia de invocación de hooks en bootstrap. Actores: loader, módulo del plugin, registries etiquetados, rutas FastAPI. Estado: Implementado.
sequenceDiagram
participant Loader as loader.py
participant Host as cortex.panels
participant Mod as cortex_plugin_*
participant Reg as TaggedRegistries
participant API as FastAPI routes
Loader->>Host: load_panel_hosts configure_panel
Host->>Reg: PanelRegistry
Loader->>Mod: import_plugin_module
Loader->>Mod: create_plugin
Loader->>Mod: register_resources registry
Mod->>Reg: manifest dashboards forms
Reg->>API: assemble GET /panels /ui /forms
Loader->>Loader: validate_panels Diseño de ingeniería (ADRs 005–010, 021)¶
Documentación de decisiones acordadas; implementación parcial según ADR (MCP/WS y dominio IO en beta; auth OIDC y webhooks pendientes).
PDF consolidado: ingenieria-hive.pdf — regenerar con docs/build-ingenieria-pdf.sh (autor: Neftali Yagua; incluye arquitectura Dependiente/Independiente y ADRs seleccionados 001–011, 018–019). Diagramas fuente: docs/diagrams/.
| ADR | Tema |
|---|---|
| 005 | oauth2-server híbrido (interno por defecto), JWT, PanelAuthPolicy |
| 006 | Servidor MCP + SPI register_mcp_tools |
| 007 | PostgreSQL de plataforma, Alembic por plugin |
| 008 | Dominio de negocio como plugin independiente |
| 009 | Rate limit Redis, /ready, idempotencia |
| 010 | Módulo IO: transports + dominio |
| 021 | Events, listeners, observers, notifications, broadcasting |
Leyenda: ADRs transversales (Dependiente) y de dominio (Independiente) que afectan al ecosistema. Estado: Parcial — ver columna Estado en cada ADR.
flowchart TB
subgraph transversal [Capas transversales]
OIDC[ADR 005 OIDC]
Redis[ADR 009 Redis NFR]
PG[ADR 007 Persistencia]
IOM[ADR 010 Modulo IO]
end
subgraph dominio [Dominio]
Booking[plugin booking]
MCP[ADR 006 MCP tools]
end
OIDC --> Booking
PG --> Booking
Redis --> Booking
IOM --> MCP
MCP --> Booking Leyenda: Dependencias entre ADRs transversales y dominio booking/MCP. Actores: capas de plataforma habilitan el módulo booking. Estado: Diseño.
Estado actual (hitos completados)¶
Backend¶
- [x] Stack HIVE: FastAPI, PostgreSQL de plataforma, Redis, uv workspace (ADR 001).
- [x] SPI en
core/cortex_core+ abstraccionesregistrar(PanelRegistrar,DashboardRegistrar,FormRegistrar) — plugins no importancortex_framework. - [x] Multi-panel registry +
GET /api/v1/panels,/panels/routes,/panels/{id}(ADR 004). - [x] CUS: manifests/dashboards JSON, validación ligera en
cortex_framework/panel/. - [x] Panel Control embebido (
/control/, toggles de plugins en caliente). - [x] Plugin accounting como PoC de dominio completo (API + UI).
- [x] Sandbox helloworld (panel
samples, To-Do) — API interna del framework. - [x] Paneles generativos: namespaces
operations,adminvíaensure_panel; dedicados (accounting,trainer) concortex.panelsopcional;controlembebido en framework. - [x] Scaffolds de dominio: booking, billing, clients, discounts, events, payments, pricing, sales, store, subscriptions (fixtures + UI; persistencia real — ADR 007/017).
- [x] Capa IO MCP (
POST /mcp, hookregister_mcp_tools) y WebSocket (WS /api/v1/ws, hookregister_ws_namespaces) — ADR 006/010. - [x] IO de dominio (beta): events, listeners, observers, notifications, broadcasting, middleware — ADR 021.
- [x] Plugin ai-agents: chat WS, widget
ask-ai, tools MCP in-process (LangGraph).
Frontend¶
- [x]
@cortex/panel-core: headless (types,PanelProvider, nav agrupada, routing,PanelApiClient). - [x]
@cortex/panel-shadcn: skin shadcn/ui + Tailwind v4 (shell, widgets,DashboardRenderer). - [x] Routing por especificidad:
matchModuleScreen/scoreScreenPath— rutas literales (create) antes que:id(ADR 018). - [x] Jerarquía de títulos: shell → dashboard (
hideTitle) → widgets; flagsshellOwnsPageTitleyshowPanelSubtitle. - [x]
@cortex/web: shell comúncreatePanelShellApp()— rutas, provider, API client. - [x] Demo:
framework/web-shadcn(:5175). - [x] Fix
resolveApiUrl: paths CUS con/api/v1/...no duplican prefijo enfetchPath.
Tooling / CI¶
- [x] npm workspaces en raíz (
packages/*,framework/web,framework/web-shadcn). - [x] Tests Vitest en
@cortex/panel-core(nav, routing, API URL).
Arquitectura en capas¶
Leyenda: Stack frontend (demos → shell → skin → core) y backend (API ensambla framework y plugins). Actores: navegador, paquetes npm, FastAPI. Estado: Implementado.
flowchart TB
subgraph demos [Demo Vite]
SH[web-shadcn :5175]
end
subgraph shell ["@cortex/web"]
CPS[createPanelShellApp]
end
subgraph skin ["@cortex/panel-shadcn"]
Skin[PanelShell widgets]
end
subgraph headless ["@cortex/panel-core"]
Core["PanelProvider navUtils PanelApiClient"]
end
subgraph backend [Backend Python]
API[FastAPI /api/v1]
FW[cortex_framework]
PLG[cortex_plugin_*]
SPI[cortex_core SPI]
end
demos --> CPS --> Skin --> Core
Core -->|HTTP| API
FW --> PLG --> SPI
API --> FW Acoplamiento entre capas¶
Fuente del diagrama: docs/diagrams/arquitectura-contexto-proyecto-09.mermaid.
Leyenda: Dependencias permitidas vs fugas conocidas del framework. Actores: core, framework, plugins, panel. Estado: Implementado con deuda documentada.
flowchart TB
subgraph core [core SPI]
SPI[hooks tipos registries]
end
subgraph framework [framework Dependiente]
FW[cortex_framework loader API]
IO[io mcp ws events]
DB[database session]
end
subgraph plugins [plugins Independiente]
PLG[cortex_plugin_*]
Hooks[register_mcp_tools register_resources]
end
subgraph panel [Frontend]
PC[panel-core]
PS[panel-shadcn]
end
SPI -->|contrato estable| FW
FW -->|discovery bootstrap| PLG
PLG -->|api_router hooks| FW
PLG --> Isolation[sin import entre plugins]
PC -->|HTTP /api/v1| FW
PS --> PC
FW --> Leak[fuga conocida import directo]
Hooks --> Note1[Correcto extension via hooks SPI] Flujos clave¶
Arranque de una pantalla del panel¶
- Usuario navega a p. ej.
/operations/booking/home. AppPanelRoutesresolvió rutas desdeGET /api/v1/panels/routes.PanelShellcargaGET /api/v1/panels/operations→ módulos,navGroups,navigation.ModuleScreencarga manifest del módulo →dashboardIdde la pantalla.GET /api/v1/ui/dashboards/{dashboardId}→ layout + widgets.- Widgets llaman API vía
api.fetchPath(config.path)— paths CUS son absolutos/api/v1/....
Leyenda: Secuencia de carga de una pantalla del panel. Actores: usuario, rutas React, shell, ModuleScreen, widgets, FastAPI. Estado: Implementado.
sequenceDiagram
participant U as Usuario
participant R as AppPanelRoutes
participant S as PanelShell
participant M as ModuleScreen
participant W as Widgets
participant API as FastAPI
U->>R: GET /operations/booking/home
R->>API: GET /api/v1/panels/routes
S->>API: GET /api/v1/panels/operations
M->>API: GET /api/v1/panels/operations/modules/booking/manifest
M->>API: GET /api/v1/ui/dashboards/{dashboardId}
W->>API: PanelApiClient.fetchPath Registro de UI en un plugin¶
Leyenda: Cómo un plugin Independiente publica UI declarativa sin React propio. Actores:
ResourceBuilder, hookregister_resources, registry del framework. Estado: Implementado.
flowchart LR
RB[ResourceBuilder register_resources]
JSON["ui/ legacy JSON"]
Reg[ResourceRegistry PanelRegistry]
API["GET /api/v1/panels /ui /forms"]
RB --> Reg --> API
JSON -->|register_dashboards legacy| Reg # plugins/foo/cortex_plugin_foo/resources.py
from cortex_framework.ui import ResourceBuilder, register_resource
from cortex_framework.ui.registry import ResourceRegistry
def register_resources(registry: ResourceRegistry) -> None:
def configure(builder: ResourceBuilder) -> None:
builder.id("foo").title("Foo").api_base("/api/v1/foo")
register_resource(registry, "operations", "foo", configure)
Bootstrap de una demo frontend¶
// framework/web-shadcn/src/panel/bootstrap.tsx (patrón)
import { createPanelShellApp } from '@cortex/web';
import { PanelShell, createDefaultRegistry } from '@cortex/panel-shadcn';
export const { AppPanelProvider, AppPanelRoutes, panelApiClient } =
createPanelShellApp({ PanelShell, createDefaultRegistry, renderLoading, renderError });
Vista C4 — contenedores runtime¶
Complementa el mapa general (diagrama 01: capas lógicas). Aquí se muestran contenedores ejecutables y canales de red.
Fuente del diagrama: docs/diagrams/arquitectura-contexto-proyecto-12.mermaid.
Leyenda: Diagrama C4 nivel contenedores — browser, shell React, API, plugins, datos. Actores: administrador, agentes MCP/WS. Estado: Implementado.
flowchart TB
subgraph browser [Browser]
User[Administrador]
end
subgraph frontend [Contenedor web]
WebShell["@cortex/web + panel-shadcn"]
end
subgraph apiContainer [Contenedor api]
FastAPI[cortex_framework FastAPI]
Plugins[cortex_plugin_* routers]
IO[io mcp ws events]
end
subgraph data [Datos]
PG[(PostgreSQL)]
Redis[(Redis)]
end
subgraph agents [Agentes externos]
MCPclient[MCP HTTP client]
end
User --> WebShell
WebShell -->|HTTP /api/v1| FastAPI
WebShell -->|WS /api/v1/ws| IO
FastAPI --> Plugins
FastAPI --> IO
Plugins --> PG
FastAPI --> PG
FastAPI --> Redis
MCPclient -->|POST /mcp| IO Mapa de archivos importantes¶
| Ruta | Rol |
|---|---|
core/cortex_core/spi.py | Contrato base del plugin |
core/cortex_core/registrar.py | Interfaces register_* (DIP) |
framework/cortex_framework/api/routes.py | Rutas REST plataforma |
framework/cortex_framework/panels/registry.py | Ensamblado multi-panel |
framework/cortex_framework/plugins/loader.py | Discovery, bootstrap control, carga plugins |
framework/cortex_framework/control/ | Panel control embebido + API /control/plugins |
packages/cortex-panel-core/src/panelApiClient.ts | Cliente HTTP + resolveApiUrl |
packages/cortex-panel-core/src/navUtils.ts | Nav agrupada por navGroup |
framework/web/src/createPanelShellApp.tsx | Factory del shell React |
plugins/clients/ | Módulo de negocio clientes (cortex-plugin-clients) |
plugins/helloworld/ | Sandbox SPI (cortex-plugin-helloworld) — no catálogo de dominio |
plugins/accounting/ | PoC contabilidad (cortex-plugin-accounting) |
.gitmodules | URLs de los 20 submódulos en plugins/ |
scripts/migrate-plugins-to-submodules.sh | Extracción histórica monorepo → repos Git |
Configuración habitual¶
| Variable | Default | Notas |
|---|---|---|
DATABASE_URL | — | PG de plataforma |
REDIS_URL | — | Redis 7 |
JWT_SECRET | — | Obligatorio en producción |
Header Authorization | — | Bearer JWT o modo dev |
Ver Configuración. Los nombres CORTEX_* están deprecados (dual-read temporal).
Activación de plugins: /control/plugins (state store PG). No usar CORTEX_ENABLED_PLUGINS ni CORTEX_ENABLED_PANELS.
Widgets CUS¶
Implementados en @cortex/panel-shadcn (tipos preferidos data-table, form; alias api-table, json-form):
| type | Uso |
|---|---|
form | JSON Forms + submit REST |
data-table | Tabla sobre GET config.path |
api-card | Resumen/card |
plugin-list | Lista plugins control (toggle) |
settings | Configuración mergeable por panel |
stat-card | KPI sobre endpoint REST (una métrica) |
stats-overview | Bloque de KPIs con un fetch (varias métricas) |
chart | Gráfico Recharts (bar, line, area, pie) sobre GET |
reservation-flow | Wizard composable de reserva |
client-picker | Selección de cliente (wizard) |
payment-checkout | Cobro y tarifa (wizard) |
booking-slot-picker | FullCalendar + overlay de slot (wizard) |
section | Contenedor con hijos |
Extensión: createDefaultRegistry() + registry.register('tipo', Component).
Pitfalls conocidos¶
- Doble
/api/v1: los dashboards declaran paths completos; el cliente usaresolveApiUrl— no volver a prefijar en widgets. - Vite + monorepo: en
vite.config.tsde cada demo,optimizeDeps.excludepara@cortex/web,@cortex/panel-corey la skin;dedupe: ['@cortex/panel-core']— evita dos copias de React context (usePanel must be used within PanelProvider). - Plugins scaffold: existen en repo pero no cargan hasta activarlos en
/control/plugins. - Sin MongoDB: documentación y código activo solo PostgreSQL.
- Legacy: no editar
legacy/salvo migración puntual.
Verificación antes de merge¶
git submodule update --init --recursive
uv run pytest
uv run ruff check core framework plugins/<tocados>
npm run test:panel-core
npm run build:web-shadcn # si hay cambios UI
Dirección probable (no comprometida)¶
Orden sugerido para iteraciones futuras:
- Implementar ADRs 005–009 — OIDC, MCP, PG por plugin, booking genérico, Redis NFR.
- Pip packaging (ADR 002) — publicar
cortex-plugin-*y validar sideload. - Endurecer plugins de dominio restantes (clients, payments, …).
- Widgets CUS v2 — sparklines en stats, polling; contrato JSON estable para
chartystats-overview.
Referencias cruzadas¶
| Doc | Tema |
|---|---|
| ADR 001 | Stack Python/FastAPI/PG |
| ADR 002 | Distribución pip |
| ADR 003 | CUS + widgets |
| ADR 004 | Multi-panel |
| ADR 005 | oauth2-server híbrido |
| ADR 006 | Plugin MCP interno |
| ADR 007 | Persistencia modular |
| ADR 008 | Dominio como plugin independiente |
| ADR 009 | Redis y NFRs |
| ADR 010 | Módulo IO (apirest, webhooks, MCP, dominio) |
| ADR 021 | IO de dominio (events/listeners/observers) |
| ADR 023 | Contrato runtime plugins (installed/enabled, hot load) |
| ADR 024 | Ownership entre dominios |
| ADR 025 | Patrón products/*; sandbox Reservas (PMV) |
| ADR 026 | Skins y tema del panel |
| ADR 028 | Perfil UBL / facturación |
| Casos de uso | Reservas, Proptech — grafo, bundles, contratos |
| ADR 022 | Despliegue Docker/Coolify |
| ADR 019 | Panel admin y parametrización |
| Eventos de dominio | Guía listeners/observers |
| LangGraph en ai-agents | Chat WS + tools MCP |
| cortex-panel.md | Guía runtime panel |
| Plugins | Construcción de plugins |
| Documentación framework vs plugins | Frontera docs plataforma / plugin |
| README del repositorio | Arranque rápido |
.cursor/rules/cortex-project.mdc | Reglas arquitectura (Cursor) |
.cursor/rules/hive-python.mdc | Convenciones Python |
Changelog de este documento¶
| Fecha | Cambio |
|---|---|
| 2026-06 | Creación post-refactor: panel-core, panel-shadcn, @cortex/web, demo web-shadcn, registrar SPI |
| 2026-06 | Retiro skins MUI/PatternFly; documentación alineada a shadcn único |
| 2026-06 | Diagramas Mermaid en arquitectura y flujos clave |
| 2026-06 | ADRs 005–009: ingeniería OIDC, MCP, persistencia, booking, Redis |
| 2026-06 | Taxonomía Dependiente/Independiente, ADR 010 IO, ADR 005 oauth2-server híbrido, leyendas en diagramas |
| 2026-06 | Sección ciclo de vida del plugin: discovery, hooks DIP, bootstrap vs runtime, diagramas |
| 2026-06 | Panel admin, separación operación/parametrización, widgets wizard y dashboard por host (ADR 019) |
| 2026-07 | IO de dominio (ADR 021), integración REST + events/listeners, plugin ai-agents (WS chat + MCP tools) |
| 2026-07 | Principio rector: panels emergentes; products/ sandbox PMV; casos de uso Reservas/Proptech |
| 2026-07 | Casos de uso: Reservas + Proptech; reemplaza sección «Producto» en docs |