Skip to content

Plataforma técnica · Sevastopol

Dashboard en Sevastopol

Islands Dashboard Widgets

El Dashboard de Sevastopol (/dashboard) es la página de aterrizaje operativa. Tres widgets montados como islands independientes en pages/dashboard.astro cubren la información de primer vistazo:

  • DailyBriefingWidget — tareas del agent (Nostromo Cortex).
  • SystemStatusWidget — salud del backend.
  • DocumentationWidget — enlace estático al manual operativo.

Cada widget se monta con client:visible (lazy hydration) y opera de forma independiente — no comparten contexto ni hooks de tenant/período.

WidgetGrid (lg)Min-height
DailyBriefingWidgetcol-span-7340px
SystemStatusWidgetcol-span-5240px
DocumentationWidgetcol-span-5240px

Tareas del agent ordenadas por prioridad y estado. Consume /api/agent/tasks (Orchestrator → nostromo_cortex.tasks en Mongo).

DecisiónMotivo
Refresh automático cada 60ssetInterval en onMount con cleanup. El operador deja la pestaña abierta y ve actualizaciones sin recargar.
Resumen 3 columnas (Pendientes / En curso / Cerradas)Computado en cliente desde tasks(). Lectura instantánea del estado del día.
Estados con código de colorpending → gris; in_progress → ámbar + pulse animation; completed → emerald. Visualiza progreso sin texto.
Prioridad como badge tipadohigh rojo, medium azul, low zinc. Permite ordenar visualmente sin abrir cada tarea.
Empty state vs error stateSin tareas → “No hay tareas abiertas” (positivo). Error → banner rojo + botón “Reintentar” inline.
Skeleton durante carga inicialanimate-pulse placeholder hasta que llegan los datos. Evita layout shift.
Locale es con date-fnsDía formateado como “miércoles 14 de mayo”; hora HH:mm.
CampoOrigen
id, titleIdentificación.
statuspending / in_progress / completed.
priorityhigh / medium / low.
createdAtHora del día en el card.
Método + rutaUso
GET /api/agent/tasksTareas del agent. Refresh cada 60s.

Lectura rápida de salud del backend. Consume /api/monitoring.

DecisiónMotivo
Solo muestra CPU + memoriaEl endpoint /api/monitoring devuelve más (tenants, sessions, disk, errors), pero el widget filtra a las 2 métricas que el operador necesita ver de un vistazo. El detalle vive en Monitoring (UI).
Refresh automático cada 30sMás frecuente que el briefing porque salud es señal temprana — el operador quiere ver caídas rápido.
Status pill tricolorVerde “Operativo” / Ámbar “Actualizando” / Rojo “Incidencia”. Lectura instantánea del estado del fetch.
Una decimal en porcentajescpu_load_pct.toFixed(1) — precisión suficiente sin ruido visual.
Footer explicativo del rol”Usa este bloque como señal temprana antes de entrar a monitoreo detallado” — redirige al operador al dashboard completo cuando necesita más.
CampoOrigenDisplay
CPUsystem_health.cpu_load_pctXX.X% font-mono.
Memoriasystem_health.memory_usage_pctXX.X% font-mono.
Método + rutaUso
GET /api/monitoringMétricas de salud. Refresh cada 30s.

Acceso al manual operativo. No es realmente un widget reactivo — es un panel estático con un CTA.

DecisiónMotivo
Sin fetch, solo link estáticoEl widget no consulta nada — solo redirige a /docs. Mantenerlo “siempre disponible” con pill verde fija.
CTA full-width al pie”Abrir documentación” como botón primario que toma todo el ancho — claridad de la acción única.
Lista de qué se resuelve3 bullets (“Guías de uso”, “Procedimientos”, “Referencias”) explican el alcance antes de hacer click.
RutaUso
/docs (link relativo)Manual operativo embebido en la app. Sirve el sitio público en producción.

Ninguno de los tres widgets usa useActiveTenant ni useActivePeriod — operan al nivel del usuario y la plataforma, no del tenant contable.

  • DailyBriefingWidget/api/agent/tasks en el Orchestrator, que lee nostromo_cortex.tasks de Mongo.
  • SystemStatusWidgetMonitoringService — mismo endpoint que la island completa de Monitoring, pero el widget consume solo dos campos.
  • Command (Monitoring) comparte el endpoint /api/monitoring. El widget es el resumen; la island es el detalle.
  • Nostromo alimenta agent/tasks desde su Cortex (Mongo local).
  • Auth valida la sesión en cada fetch (authenticatedFetch + handleAuthResponse).

Estas relaciones se documentan en cada destino, no aquí.