ADR 029: Ensamblado del módulo de configuración por panel¶
Estado¶
Aceptado — 2026-07
Contexto¶
ADR 020 define el manifest JSON de configuración por plugin (groups, segments, widgets). La UI y las rutas seguían acopladas al panel admin (admin/home.py definía manualmente /admin/configuration). Otros paneles (accounting, control) no tenían un módulo de configuración ensamblado por el framework.
Además, un mismo plugin (p. ej. ai-agents) debe poder inyectar fragmentos en varios paneles a la vez — credenciales en control, agentes en admin — sin duplicar plugins ni manifests.
Decisión¶
ConfigurationRegistry(evolución deSettingsRegistry): métodoscontribute_group(panel_id, …)ycontribute_segment(panel_id, …)con unicidad(panel_id, segment_id)por panel.- Manifest con
contributions[]obligatorio (un elemento porpanel_iddestino). - Hook
register_configurationen boot del plugin, análogo aregister_widgets/register_layouts. assemble_configuration_module(panel_id)enmerge_panel_infrastructure: registra móduloconfigurationcon pantallas y widgetsettingscuando el panel tiene ≥1 segmento.- API
GET /settings/panels/{panelId}incluyeuiPrefsSegmentIdopcional (segmento*-uicon parámetros). - Aislamiento: cada panel expone solo sus segmentos; no hay propagación automática entre paneles.
Consecuencias¶
- El framework ensambla rutas de configuración automáticamente; no hace falta declararlas en
home.pyde un plugin. - Plugins con alcance multi-panel usan
contributions[](piloto:ai-agents→control+admin). SettingsWidgetleeuiPrefsSegmentIddel árbol API en lugar de asumiradmin-ui.- Cada plugin declara
panelIddel namespace de su dominio (operationspara booking/clients,adminpara sales/billing/payments).
Alternativas consideradas¶
- Un solo panel global de configuración — rechazado: mezcla perfiles operativo/admin/contabilidad.
- Manifest duplicado por panel — rechazado:
contributions[]mantiene un archivo por plugin.