# Feature Specification: Registry de Módulos Desk (015) **Criado:** 2026-06-16 **Solicitado por:** Roger **Status:** Implementação **Prioridade:** P0 (infraestrutura para evolução modular) --- ## Resumo Cada funcionalidade nova do Ligbox Ops Desk passa a ser um **módulo** registado. O root pode **activar/desactivar** módulos no menu **Módulos**; código desactivado não corre na UI nem enriquece APIs — **sem quebrar** o núcleo. --- ## Módulos (MVP) | ID | Label | Locked | Nav / efeito | |----|-------|--------|----------------| | `core` | Núcleo | sim | Dashboard, Tickets, Conta, Auth | | `overview` | Audit Overview | não | menu Overview | | `overview-home` | Overview Home | não | menu Overview Home | | `infra` | Infra | não | menu Infra | | `infra2-soc` | Infra 2 SOC | não | menu Infra 2 | | `funnel-timing` | Relógio por fase | não | enriquece timeline/audit | | `wazuh-soc` | Wazuh SOC Overview | não | card/modal VM104 no Overview | | `leads` | Leads abandonados | não | menu Leads | | `events` | Eventos webhook | não | menu Eventos | | `tenants` | Tenants | não | menu Tenants | | `messages` | Mensagens cadastro | não | menu Mensagens | | `admin-users` | Administradores | não | menu Administradores | --- ## Persistência - Ficheiro: `/data/desk_modules.json` (volume Docker) - Default: todos activos excepto definido em `registry.py` - Override env: `DESK_MODULES_DISABLED=infra2-soc,funnel-timing` (opcional) --- ## API | Método | Path | Role | |--------|------|------| | GET | `/api/v1/modules` | autenticado | | PATCH | `/api/v1/modules/{module_id}` | `super_admin` | Body PATCH: `{ "enabled": true|false }` --- ## Frontend - Nav items com `data-module="module-id"` - Boot: `GET /api/v1/modules` → `applyModuleVisibility()` - `refresh()` ignora views de módulos desactivados - Menu **Módulos** (só root): toggles + descrição --- ## Princípio de não-regressão - Módulo OFF → rotas API opcionais devolvem payload **sem** campos do módulo - Módulo OFF → `render*` do módulo não é chamado - Núcleo nunca depende de módulos opcionais