Plataforma técnica · Sevastopol
Registry en Sevastopol
Islands Registry Agents
Propósito
Section titled “Propósito”RegistryViewIsland muestra el estado de agentes externos del ecosistema en la vista /registry. Cada agente reportado tiene nombre, rol, lenguaje, puertos opcionales, URL opcional y root_path. El frontend no chequea puertos directamente — delega esa responsabilidad al Orchestrator para evitar restricciones de CORS desde el navegador.
Es una feature opcional: depende de una fuente de registry configurada en el backend. En entornos sin registry, la island muestra un empty state explicativo en lugar de error.
Decisiones de UX
Section titled “Decisiones de UX”| Decisión | Motivo |
|---|---|
| Sin auto-refresh (botón “Refrescar Estado” manual) | El chequeo de puertos es caro (TCP connect con timeout); polear cada N segundos sobrecarga sin beneficio. El operador refresca cuando necesita estado actualizado. |
| Empty state explicativo, no error | Sin registry configurado no es un fallo — es ausencia de feature. El card central explica que la vista depende de una fuente externa, con label “Feature opcional · source externo requerido” para distinguir de error real. |
| Toast solo en error de red | Error de fetch o respuesta no-OK dispara toast; el empty state no. Separa “fuente ausente” de “fuente caída”. |
| Status visual binario (active vs no-active) | El tipo soporta active / inactive / unknown pero la UI agrupa inactive + unknown con el mismo styling gris. Reduce ruido visual cuando el registry todavía no clasifica algún agente. |
Pulse animation solo en active | bg-emerald-500 animate-pulse señala vida. Los inactivos quedan estáticos. |
| Glow lateral por status | Una franja vertical de 1px en el borde izquierdo del card (bg-emerald-500 activo / bg-zinc-300 resto) — lectura del estado sin leer texto. |
| Lenguaje codificado en avatar tipográfico | Py (azul, python) / Js (verde, node) / As (naranja, astro) / Ts (default). 10×10 avatar coloreado en vez de íconos — sobrevive a cambios del catálogo de lenguajes sin actualizar assets. |
root_path truncado con tooltip | Path completo en title del <code> para evitar wrap en cards pequeños. |
| Puertos como chips con nombre + número | 8000 (http) en chip primario — el operador necesita ambos campos juntos para entender qué expone el agente. |
| URL opcional con icon de external-link | Link con target="_blank" y la flecha de “abrir en nueva pestaña”. Solo aparece si el agente reporta url. |
hideCloseButton={true} | La vista es una página, no un modal — el botón de cerrar del IslandBase se oculta. |
Estados
Section titled “Estados”| Estado | Lectura | Indicador visual |
|---|---|---|
active | El registry confirma que el puerto responde. | Pill verde + pulse. Glow lateral verde. |
inactive | Puerto cerrado o timeout. | Pill gris. Glow lateral gris. |
unknown | Sin puerto definido o sin clasificación. | Igual que inactive (UI agrupa). |
Datos visibles
Section titled “Datos visibles”| Campo | Origen | Display |
|---|---|---|
name, role | Identificación del agente. | Título + badge en cabecera del card. |
language | python / node / astro / otros. | Avatar tipográfico coloreado. |
status | Estado del chequeo del Orchestrator. | Pill + glow lateral. |
root_path | Path filesystem del agente. | <code> truncado con tooltip. |
ports | Record<string, number> (nombre → puerto). | Chips con puerto (nombre). |
url | URL pública si aplica. | Link “Abrir interfaz” en nueva pestaña. |
Layout
Section titled “Layout”- Grid responsivo:
grid-cols-1(mobile) →md:grid-cols-2→lg:grid-cols-3. - Cards con
overflow-hidden, hover muestra borde highlight. - Scroll vertical en el contenedor del grid para volúmenes grandes.
Hooks compartidos
Section titled “Hooks compartidos”Ninguno. La island no usa useActiveTenant ni useActivePeriod — el registry es a nivel de plataforma, no per-tenant.
Lenguaje compartido
Section titled “Lenguaje compartido”| Componente | Uso |
|---|---|
IslandBase | Wrapper con title, description, actions, isLoading. |
ToastProvider + useToast | Toast en error de red. |
Endpoint
Section titled “Endpoint”| Método + ruta | Uso |
|---|---|
GET /api/agent/registry | Lista de agentes con estado. Vacío si no hay registry configurado. |
Proxy en pages/api/agent/registry.ts con createProxy("/api/agent/registry") — forwarder simple al Orchestrator.
Backend de referencia
Section titled “Backend de referencia”El Orchestrator mantiene la lógica de chequeo (TCP probe con timeout). Cuando no hay registry configurado el endpoint devuelve lista vacía — el frontend la trata como empty state.
Relación con otros dominios
Section titled “Relación con otros dominios”- Nostromo y otros agentes del ecosistema reportan al registry cuando está configurado.
- Auth valida la sesión en el fetch (
authenticatedFetch). - Dashboard comparte el patrón de polling/lectura externa pero refresca automáticamente (60s briefing, 30s monitoring); aquí el refresh es manual por costo del chequeo de puertos.
Estas relaciones se documentan en cada destino, no aquí.