Skip to content

Gateway

De Gateway is het centrale controlevlak van Triggerfish — een langlopende lokale service die sessies, kanalen, tools, evenementen en agentprocessen coördineert via één enkel WebSocket-eindpunt. Alles wat er in Triggerfish gebeurt, stroomt via de Gateway.

Architectuur

Gateway-architectuur: kanalen aan de linkerkant verbinden via de centrale Gateway met services aan de rechterkant

De Gateway luistert op een configureerbare poort (standaard 18789) en accepteert verbindingen van kanaaladapters, CLI-opdrachten, companion-apps en interne services. Alle communicatie gebruikt JSON-RPC via WebSocket.

Gateway-services

De Gateway biedt deze services via zijn WebSocket- en HTTP-eindpunten:

ServiceBeschrijvingBeveiligingsintegratie
SessiesAanmaken, weergeven, geschiedenis ophalen, tussen sessies sturen, achtergrondtaken startenSessie-taint per sessie bijgehouden
KanalenBerichten routeren, verbindingen beheren, mislukte bezorgingen opnieuw proberen, grote berichten opsplitsenClassificatiecontroles op alle uitvoer
CronTerugkerende taken plannen en trigger-activeringen vanuit TRIGGER.mdCron-acties gaan via beleidshooks
WebhooksInkomende evenementen van externe services accepteren via POST /webhooks/:sourceIdInkomende gegevens geclassificeerd bij opname
RippleOnline status en typindicatoren bijhouden over kanalenGeen gevoelige gegevens blootgesteld
ConfiguratieInstellingen herladen zonder herstartAlleen beheerder in enterprise
Beheer-UIWebdashboard voor gateway-gezondheid en beheerToken-geverifieerd
Tide PoolDoor agent aangestuurde A2UI-visuele werkruimte hostenInhoud onderworpen aan uitvoerhooks
MeldingenCross-kanaal meldingsbezorging met prioriteitsrouteringClassificatieregels van toepassing

WebSocket JSON-RPC-protocol

Clients verbinden met de Gateway via WebSocket en wisselen JSON-RPC 2.0-berichten uit. Elk bericht is een methodeaanroep met getypte parameters en een getypt antwoord.

typescript
// Client stuurt:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sessions.list",
  "params": { "filter": "active" }
}

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

De Gateway bedient ook HTTP-eindpunten voor webhook-opname. Wanneer een SchedulerService is gekoppeld, zijn POST /webhooks/:sourceId-routes beschikbaar voor inkomende webhook-evenementen.

Server-interface

typescript
interface GatewayServerOptions {
  /** Poort om op te luisteren. Gebruik 0 voor een willekeurige beschikbare poort. */
  readonly port?: number;
  /** Authenticatietoken voor verbindingen. */
  readonly authToken?: string;
  /** Optionele plannerservice voor webhook-eindpunten. */
  readonly schedulerService?: SchedulerService;
}

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

interface GatewayServer {
  /** Start de server. Retourneert het gebonden adres. */
  start(): Promise<GatewayAddr>;
  /** Stop de server netjes. */
  stop(): Promise<void>;
}

Authenticatie

Gateway-verbindingen worden geverifieerd met een token. Het token wordt gegenereerd tijdens de installatie (triggerfish dive) en lokaal opgeslagen.

BEVEILIGING De Gateway bindt standaard aan 127.0.0.1 en is niet blootgesteld aan het netwerk. Externe toegang vereist expliciete tunnelconfiguratie. Stel de Gateway WebSocket nooit bloot aan het openbare internet zonder authenticatie. :::

Sessiebeheer

De Gateway beheert de volledige levenscyclus van sessies. Sessies zijn de fundamentele eenheid van gespreksstatus, elk met onafhankelijke taint-tracking.

Sessietypen

TypeSleutelpatroonBeschrijving
HoofdmainPrimair direct gesprek met de eigenaar. Blijft bestaan bij herstarts.
Kanaalchannel:<type>:<id>Eén per verbonden kanaal. Geïsoleerde taint per kanaal.
Achtergrondbg:<task_id>Gestart voor cron-jobs en webhook-getriggerde taken. Start op PUBLIC-taint.
Agentagent:<agent_id>Per-agent-sessies voor multi-agent-routering.
Groepgroup:<channel>:<group_id>Groepsgespreksssessies.

Sessietools

De agent interageert met sessies via deze tools, allemaal gerouteerd via de Gateway:

ToolBeschrijvingTaint-implicaties
sessions_listActieve sessies weergeven met optionele filtersGeen taint-wijziging
sessions_historyTranscript voor een sessie ophalenTaint erft van de gerefereerde sessie
sessions_sendBericht naar een andere sessie sturenOnderworpen aan write-down-controle
sessions_spawnAchtergrondtaaksessie aanmakenNieuwe sessie start op PUBLIC-taint
session_statusHuidige sessiestatus, model, kosten controlerenGeen taint-wijziging

Inter-sessiecommunicatie via sessions_send is onderworpen aan dezelfde no-write-down-regels als elke andere uitvoer. Een CONFIDENTIAL-sessie kan geen gegevens sturen naar een sessie verbonden met een PUBLIC-kanaal. :::

Kanaalroutering

De Gateway routeert berichten tussen kanalen en sessies via de kanaalrouter. De router verwerkt:

  • Classificatiepoort: Elk uitgaand bericht gaat via PRE_OUTPUT voor bezorging
  • Herproberen met backoff: Mislukte bezorgingen worden opnieuw geprobeerd met exponentiële backoff via sendWithRetry()
  • Bericht opsplitsen: Grote berichten worden opgesplitst in platformgeschikte stukken (bijv. Telegram's limiet van 4096 tekens)
  • Streaming: Antwoorden streamen naar kanalen die dit ondersteunen
  • Verbindingsbeheer: connectAll() en disconnectAll() voor levenscyclusbeheer

Meldingsservice

De Gateway integreert een eersteklas meldingsservice die ad-hoc "notificeer eigenaar"-patronen in het platform vervangt. Alle meldingen stromen via één 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[]>;
}

Prioriteitsroutering

PrioriteitGedrag
CRITICALStille uren omzeilen, onmiddellijk bezorgen aan ALLE verbonden kanalen
HIGHOnmiddellijk bezorgen aan voorkeurkanaal, wachtrij als offline
NORMALBezorgen aan actieve sessie, of wachtrij voor volgende sessiestart
LOWWachtrij, bezorgen in batches tijdens actieve sessies

Meldingsbronnen

BronCategorieStandaardprioriteit
BeleidsovertredingensecurityCRITICAL
Threat intelligence-waarschuwingensecurityCRITICAL
Skill-goedkeuringsverzoekenapprovalHIGH
Cron-jobfoutensystemHIGH
SysteemgezondheidswarschuwingensystemHIGH
Webhook-evenementtriggersinfoNORMAL
Reef-updates beschikbaarinfoLOW

Meldingen worden bewaard via StorageProvider (naamruimte: notifications:) en overleven herstarts. Niet-bezorgde meldingen worden opnieuw geprobeerd bij de volgende Gateway-start of sessieverbinding.

Bezorgingsvoorkeuren

Gebruikers configureren meldingsvoorkeuren per kanaal:

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

Plannerintegratie

De Gateway host de plannerservice, die beheert:

  • Cron-ticklus: Periodieke evaluatie van geplande taken
  • Trigger-activeringen: Agentactiviteringen gedefinieerd in TRIGGER.md
  • Webhook HTTP-eindpunten: POST /webhooks/:sourceId voor inkomende evenementen
  • Orchestratorisolatie: Elke geplande taak draait in zijn eigen OrchestratorFactory met geïsoleerde sessiestatus

Cron-getriggerde en webhook-getriggerde taken starten achtergrondssessies met frisse PUBLIC-taint. Ze erven de taint niet van enige bestaande sessie, zodat autonome taken beginnen met een schone classificatiestatus. :::

Gezondheid en diagnostiek

De opdracht triggerfish patrol verbindt met de Gateway en voert diagnostische gezondheidscontroles uit, waarbij het verifieert:

  • Gateway is actief en reageert
  • Alle geconfigureerde kanalen zijn verbonden
  • Opslag is toegankelijk
  • Geplande taken worden op tijd uitgevoerd
  • Geen niet-bezorgde kritieke meldingen vast zitten in de wachtrij