Skip to content

Gateway

Le Gateway est le plan de contrôle central de Triggerfish -- un service local persistant qui coordonne les sessions, les canaux, les outils, les événements et les processus d'agent via un point de terminaison WebSocket unique. Tout ce qui se passe dans Triggerfish transite par le Gateway.

Architecture

Architecture du Gateway : les canaux à gauche se connectent via le Gateway central aux services à droite

Le Gateway écoute sur un port configurable (par défaut 18789) et accepte les connexions des adaptateurs de canaux, des commandes CLI, des applications compagnon et des services internes. Toutes les communications utilisent JSON-RPC sur WebSocket.

Services du Gateway

Le Gateway fournit ces services via ses points de terminaison WebSocket et HTTP :

ServiceDescriptionIntégration sécurité
SessionsCréer, lister, récupérer l'historique, envoyer entre sessions, lancer des tâches d'arrière-planTaint de session suivi par session
CanauxRouter les messages, gérer les connexions, réessayer les livraisons échouées, découper les gros messagesVérification de classification sur toutes les sorties
CronPlanifier des tâches récurrentes et des réveils de trigger depuis TRIGGER.mdLes actions cron passent par les hooks de politique
WebhooksAccepter les événements entrants de services externes via POST /webhooks/:sourceIdDonnées entrantes classifiées à l'ingestion
RippleSuivre le statut en ligne et les indicateurs de frappe sur les canauxAucune donnée sensible exposée
ConfigRecharger les paramètres à chaud sans redémarrageRéservé à l'admin en entreprise
Interface de contrôleTableau de bord web pour la santé et la gestion du GatewayAuthentifié par token
Tide PoolHéberger l'espace de travail visuel A2UI piloté par l'agentContenu soumis aux hooks de sortie
NotificationsLivraison de notifications multicanal avec routage par prioritéLes règles de classification s'appliquent

Protocole JSON-RPC WebSocket

Les clients se connectent au Gateway via WebSocket et échangent des messages JSON-RPC 2.0. Chaque message est un appel de méthode avec des paramètres typés et une réponse typée.

typescript
// Le client envoie :
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sessions.list",
  "params": { "filter": "active" }
}

// Le Gateway répond :
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    { "id": "sess_abc", "taint": "CONFIDENTIAL", "channel": "telegram" },
    { "id": "sess_def", "taint": "PUBLIC", "channel": "cli" }
  ]
}

Le Gateway sert également des points de terminaison HTTP pour l'ingestion de webhooks. Lorsqu'un SchedulerService est attaché, les routes POST /webhooks/:sourceId sont disponibles pour les événements webhook entrants.

Interface du serveur

typescript
interface GatewayServerOptions {
  /** Port d'écoute. Utilisez 0 pour un port disponible aléatoire. */
  readonly port?: number;
  /** Token d'authentification pour les connexions. */
  readonly authToken?: string;
  /** Service de planification optionnel pour les points de terminaison webhook. */
  readonly schedulerService?: SchedulerService;
}

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

interface GatewayServer {
  /** Démarrer le serveur. Retourne l'adresse liée. */
  start(): Promise<GatewayAddr>;
  /** Arrêter le serveur gracieusement. */
  stop(): Promise<void>;
}

Authentification

Les connexions au Gateway sont authentifiées avec un token. Le token est généré lors de l'installation (triggerfish dive) et stocké localement.

SÉCURITÉ Le Gateway se lie à 127.0.0.1 par défaut et n'est pas exposé au réseau. L'accès à distance nécessite une configuration de tunnel explicite. N'exposez jamais le WebSocket du Gateway sur l'internet public sans authentification. :::

Gestion des sessions

Le Gateway gère le cycle de vie complet des sessions. Les sessions sont l'unité fondamentale de l'état de conversation, chacune avec un suivi de taint indépendant.

Types de sessions

TypePattern de cléDescription
MainmainConversation directe principale avec le propriétaire. Persiste entre les redémarrages.
Channelchannel:<type>:<id>Une par canal connecté. Taint isolé par canal.
Backgroundbg:<task_id>Créée pour les tâches cron et déclenchées par webhook. Démarre au taint PUBLIC.
Agentagent:<agent_id>Sessions par agent pour le routage multi-agent.
Groupgroup:<channel>:<group_id>Sessions de discussion de groupe.

Outils de session

L'agent interagit avec les sessions via ces outils, tous routés par le Gateway :

OutilDescriptionImplications pour le taint
sessions_listLister les sessions actives avec filtres optionnelsPas de changement de taint
sessions_historyRécupérer la transcription d'une sessionLe taint hérite de la session référencée
sessions_sendEnvoyer un message à une autre sessionSoumis à la vérification du write-down
sessions_spawnCréer une session de tâche d'arrière-planNouvelle session au taint PUBLIC
session_statusVérifier l'état, le modèle et le coût de la sessionPas de changement de taint

La communication inter-sessions via sessions_send est soumise aux mêmes règles de write-down que toute autre sortie. Une session CONFIDENTIAL ne peut pas envoyer de données à une session connectée à un canal PUBLIC. :::

Routage des canaux

Le Gateway route les messages entre les canaux et les sessions via le routeur de canaux. Le routeur gère :

  • Porte de classification : chaque message sortant passe par PRE_OUTPUT avant la livraison
  • Réessai avec backoff : les livraisons échouées sont réessayées avec un backoff exponentiel via sendWithRetry()
  • Découpage des messages : les gros messages sont découpés en morceaux appropriés à la plateforme (ex. limite de 4 096 caractères de Telegram)
  • Streaming : les réponses sont diffusées vers les canaux qui le supportent
  • Gestion des connexions : connectAll() et disconnectAll() pour la gestion du cycle de vie

Service de notifications

Le Gateway intègre un service de notifications de première classe qui remplace les patterns ad hoc « notifier le propriétaire » à travers la plateforme. Toutes les notifications transitent par un seul 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[]>;
}

Routage par priorité

PrioritéComportement
CRITICALContourne les heures calmes, livre à TOUS les canaux connectés immédiatement
HIGHLivre au canal préféré immédiatement, met en file si hors ligne
NORMALLivre à la session active, ou met en file pour le prochain démarrage de session
LOWMet en file, livre par lots pendant les sessions actives

Sources de notifications

SourceCatégoriePriorité par défaut
Violations de politiquesecurityCRITICAL
Alertes de renseignement sur les menacessecurityCRITICAL
Demandes d'approbation de skillapprovalHIGH
Échecs de tâches cronsystemHIGH
Avertissements de santé systèmesystemHIGH
Déclencheurs d'événements webhookinfoNORMAL
Mises à jour disponibles sur The ReefinfoLOW

Les notifications sont persistées via StorageProvider (espace de noms : notifications:) et survivent aux redémarrages. Les notifications non livrées sont retentées au prochain démarrage du Gateway ou à la connexion d'une session.

Préférences de livraison

Vous configurez les préférences de notification par 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

Intégration du planificateur

Le Gateway héberge le service de planification, qui gère :

  • Boucle de tick cron : évaluation périodique des tâches planifiées
  • Réveils de trigger : réveils de l'agent définis dans TRIGGER.md
  • Points de terminaison HTTP webhook : POST /webhooks/:sourceId pour les événements entrants
  • Isolation de l'orchestrateur : chaque tâche planifiée s'exécute dans son propre OrchestratorFactory avec un état de session isolé

Les tâches déclenchées par cron et par webhook créent des sessions d'arrière-plan avec un taint PUBLIC frais. Elles n'héritent pas du taint d'une session existante, garantissant que les tâches autonomes démarrent avec un état de classification propre. :::

Santé et diagnostics

La commande triggerfish patrol se connecte au Gateway et exécute des vérifications diagnostiques de santé, vérifiant :

  • Le Gateway est en fonctionnement et réactif
  • Tous les canaux configurés sont connectés
  • Le stockage est accessible
  • Les tâches planifiées s'exécutent à l'heure
  • Aucune notification critique non livrée n'est bloquée dans la file