Skip to content

Gateway

El Gateway es el plano de control central de Triggerfish — un servicio local de larga ejecución que coordina sesiones, canales, herramientas, eventos y procesos de agentes a través de un único endpoint WebSocket. Todo lo que sucede en Triggerfish fluye a través del Gateway.

Arquitectura

Arquitectura del Gateway: los canales a la izquierda se conectan a través del Gateway central a los servicios a la derecha

El Gateway escucha en un puerto configurable (predeterminado 18789) y acepta conexiones de adaptadores de canal, comandos CLI, apps complementarias y servicios internos. Toda la comunicación usa JSON-RPC sobre WebSocket.

Servicios del Gateway

El Gateway proporciona estos servicios a través de sus endpoints WebSocket y HTTP:

ServicioDescripciónIntegración de seguridad
SesionesCrear, listar, obtener historial, enviar entre sesiones, generar tareas en segundo planoTaint de sesión rastreado por sesión
CanalesEnrutar mensajes, gestionar conexiones, reintentar entregas fallidas, dividir mensajes grandesVerificación de clasificación en toda salida
CronProgramar tareas recurrentes y disparar activaciones desde TRIGGER.mdLas acciones cron pasan por hooks de políticas
WebhooksAceptar eventos entrantes de servicios externos vía POST /webhooks/:sourceIdDatos entrantes clasificados en la ingesta
RippleRastrear estado en línea e indicadores de escritura entre canalesSin datos sensibles expuestos
ConfiguraciónRecarga en caliente de ajustes sin reinicioSolo administrador en empresarial
UI de controlPanel web para salud y gestión del GatewayAutenticado por token
Tide PoolAlojar espacio de trabajo visual A2UI dirigido por el agenteContenido sujeto a hooks de salida
NotificacionesEntrega de notificaciones multicanal con enrutamiento por prioridadSe aplican reglas de clasificación

Protocolo WebSocket JSON-RPC

Los clientes se conectan al Gateway vía WebSocket e intercambian mensajes JSON-RPC 2.0. Cada mensaje es una llamada a método con parámetros tipados y una respuesta tipada.

typescript
// El cliente envía:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sessions.list",
  "params": { "filter": "active" }
}

// El Gateway responde:
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    { "id": "sess_abc", "taint": "CONFIDENTIAL", "channel": "telegram" },
    { "id": "sess_def", "taint": "PUBLIC", "channel": "cli" }
  ]
}

El Gateway también sirve endpoints HTTP para la ingesta de webhooks. Cuando se adjunta un SchedulerService, las rutas POST /webhooks/:sourceId están disponibles para eventos de webhook entrantes.

Interfaz del servidor

typescript
interface GatewayServerOptions {
  /** Puerto en el que escuchar. Usar 0 para un puerto disponible aleatorio. */
  readonly port?: number;
  /** Token de autenticación para conexiones. */
  readonly authToken?: string;
  /** Servicio de programación opcional para endpoints de webhook. */
  readonly schedulerService?: SchedulerService;
}

interface GatewayAddr {
  readonly port: number;
  readonly hostname: string;
}

interface GatewayServer {
  /** Iniciar el servidor. Devuelve la dirección enlazada. */
  start(): Promise<GatewayAddr>;
  /** Detener el servidor de forma controlada. */
  stop(): Promise<void>;
}

Autenticación

Las conexiones al Gateway se autentican con un token. El token se genera durante la configuración (triggerfish dive) y se almacena localmente.

SEGURIDAD El Gateway se enlaza a 127.0.0.1 por defecto y no está

expuesto a la red. El acceso remoto requiere configuración explícita de túnel. Nunca exponga el WebSocket del Gateway al internet público sin autenticación. :::

Gestión de sesiones

El Gateway gestiona el ciclo de vida completo de las sesiones. Las sesiones son la unidad fundamental del estado de conversación, cada una con seguimiento de taint independiente.

Tipos de sesiones

TipoPatrón de claveDescripción
PrincipalmainConversación directa principal con el propietario. Persiste entre reinicios.
Canalchannel:<type>:<id>Una por canal conectado. Taint aislado por canal.
Segundo planobg:<task_id>Generada para trabajos cron y tareas disparadas por webhook. Inicia con taint PUBLIC.
Agenteagent:<agent_id>Sesiones por agente para enrutamiento multiagente.
Grupogroup:<channel>:<group_id>Sesiones de chat grupal.

Herramientas de sesión

El agente interactúa con las sesiones a través de estas herramientas, todas enrutadas a través del Gateway:

HerramientaDescripciónImplicaciones de taint
sessions_listListar sesiones activas con filtros opcionalesSin cambio de taint
sessions_historyObtener transcripción de una sesiónEl taint hereda de la sesión referenciada
sessions_sendEnviar mensaje a otra sesiónSujeto a verificación de write-down
sessions_spawnCrear sesión de tarea en segundo planoLa nueva sesión inicia con taint PUBLIC
session_statusVerificar estado actual, modelo, costo de sesiónSin cambio de taint

La comunicación entre sesiones vía sessions_send está sujeta a las

mismas reglas de write-down que cualquier otra salida. Una sesión CONFIDENTIAL no puede enviar datos a una sesión conectada a un canal PUBLIC. :::

Enrutamiento de canales

El Gateway enruta mensajes entre canales y sesiones a través del enrutador de canales. El enrutador maneja:

  • Compuerta de clasificación: Cada mensaje de salida pasa por PRE_OUTPUT antes de la entrega
  • Reintento con retroceso: Las entregas fallidas se reintentan con retroceso exponencial vía sendWithRetry()
  • División de mensajes: Los mensajes grandes se dividen en fragmentos apropiados para la plataforma (p. ej., el límite de 4096 caracteres de Telegram)
  • Streaming: Las respuestas se transmiten en streaming a los canales que lo soportan
  • Gestión de conexiones: connectAll() y disconnectAll() para la gestión del ciclo de vida

Servicio de notificaciones

El Gateway integra un servicio de notificaciones de primera clase que reemplaza los patrones ad-hoc de "notificar al propietario" en toda la plataforma. Todas las notificaciones fluyen a través de un único NotificationService.

typescript
interface NotificationService {
  notify(recipient: UserId, notification: Notification): Promise<void>;
  getPreferences(userId: UserId): Promise<NotificationPreference>;
  setPreferences(userId: UserId, prefs: NotificationPreference): Promise<void>;
  getPending(userId: UserId): Promise<Notification[]>;
}

Enrutamiento por prioridad

PrioridadComportamiento
CRITICALIgnora horas de silencio, entrega a TODOS los canales conectados de inmediato
HIGHEntrega al canal preferido de inmediato, encolar si está desconectado
NORMALEntrega a la sesión activa, o encolar para el próximo inicio de sesión
LOWEncolar, entregar en lotes durante sesiones activas

Fuentes de notificaciones

FuenteCategoríaPrioridad predeterminada
Violaciones de políticassecurityCRITICAL
Alertas de inteligencia de amenazassecurityCRITICAL
Solicitudes de aprobación de skillsapprovalHIGH
Fallos de trabajos cronsystemHIGH
Advertencias de salud del sistemasystemHIGH
Disparadores de eventos webhookinfoNORMAL
Actualizaciones disponibles en The ReefinfoLOW

Las notificaciones se persisten vía StorageProvider (espacio de nombres: notifications:) y sobreviven a reinicios. Las notificaciones no entregadas se reintentan en el próximo inicio del Gateway o conexión de sesión.

Preferencias de entrega

Los usuarios configuran preferencias de notificación por canal:

yaml
notifications:
  preferred_channel: telegram
  quiet_hours:
    start: "22:00"
    end: "07:00"
    timezone: "America/Chicago"
  overrides:
    security: all_channels
    approval: preferred_channel
    info: active_session

Integración con el programador

El Gateway aloja el servicio de programación, que gestiona:

  • Bucle de tick cron: Evaluación periódica de tareas programadas
  • Activaciones de trigger: Activaciones del agente definidas en TRIGGER.md
  • Endpoints HTTP de webhook: POST /webhooks/:sourceId para eventos entrantes
  • Aislamiento de orquestador: Cada tarea programada se ejecuta en su propio OrchestratorFactory con estado de sesión aislado

Las tareas disparadas por cron y por webhook generan sesiones en segundo

plano con taint PUBLIC limpio. No heredan el taint de ninguna sesión existente, lo que asegura que las tareas autónomas inicien con un estado de clasificación limpio. :::

Salud y diagnósticos

El comando triggerfish patrol se conecta al Gateway y ejecuta verificaciones de salud diagnósticas, comprobando:

  • El Gateway está en ejecución y responde
  • Todos los canales configurados están conectados
  • El almacenamiento es accesible
  • Las tareas programadas se ejecutan a tiempo
  • No hay notificaciones críticas no entregadas atascadas en la cola