Skip to content

Gateway

Das Gateway ist die zentrale Steuerungsebene von Triggerfish -- ein dauerhaft laufender lokaler Dienst, der Sessions, Kanaele, Tools, Ereignisse und Agentenprozesse ueber einen einzelnen WebSocket-Endpunkt koordiniert. Alles, was in Triggerfish geschieht, fliesst durch das Gateway.

Architektur

Gateway-Architektur: Kanaele auf der linken Seite verbinden sich ueber das zentrale Gateway mit Diensten auf der rechten Seite

Das Gateway lauscht auf einem konfigurierbaren Port (Standard 18789) und akzeptiert Verbindungen von Kanaladaptern, CLI-Befehlen, Begleit-Apps und internen Diensten. Die gesamte Kommunikation verwendet JSON-RPC ueber WebSocket.

Gateway-Dienste

Das Gateway bietet diese Dienste ueber seine WebSocket- und HTTP-Endpunkte:

DienstBeschreibungSicherheitsintegration
SessionsErstellen, auflisten, Verlauf abrufen, zwischen Sessions senden, Hintergrundaufgaben startenSession-Taint pro Session verfolgt
KanaeleNachrichten routen, Verbindungen verwalten, fehlgeschlagene Zustellungen wiederholen, grosse Nachrichten aufteilenKlassifizierungspruefungen bei jeder Ausgabe
CronWiederkehrende Aufgaben planen und Trigger-Aufwachvorgaenge aus TRIGGER.mdCron-Aktionen durchlaufen Policy Hooks
WebhooksEingehende Ereignisse von externen Diensten ueber POST /webhooks/:sourceId empfangenEingehende Daten werden bei Aufnahme klassifiziert
RippleOnline-Status und Tipp-Indikatoren kanaluebergreifend verfolgenKeine sensiblen Daten exponiert
ConfigEinstellungen ohne Neustart aktualisierenNur Admin bei Enterprise
Control UIWeb-Dashboard fuer Gateway-Gesundheit und -VerwaltungToken-authentifiziert
Tide PoolAgenten-gesteuerter A2UI-visueller ArbeitsbereichInhalte unterliegen Ausgabe-Hooks
BenachrichtigungenKanaluebergreifende Benachrichtigungszustellung mit PrioritaetsroutingKlassifizierungsregeln gelten

WebSocket JSON-RPC-Protokoll

Clients verbinden sich ueber WebSocket mit dem Gateway und tauschen JSON-RPC 2.0-Nachrichten aus. Jede Nachricht ist ein Methodenaufruf mit typisierten Parametern und einer typisierten Antwort.

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

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

Das Gateway stellt auch HTTP-Endpunkte fuer die Webhook-Verarbeitung bereit. Wenn ein SchedulerService angebunden ist, sind POST /webhooks/:sourceId-Routen fuer eingehende Webhook-Ereignisse verfuegbar.

Server-Schnittstelle

typescript
interface GatewayServerOptions {
  /** Port zum Lauschen. 0 fuer einen zufaellig verfuegbaren Port verwenden. */
  readonly port?: number;
  /** Authentifizierungs-Token fuer Verbindungen. */
  readonly authToken?: string;
  /** Optionaler Scheduler-Dienst fuer Webhook-Endpunkte. */
  readonly schedulerService?: SchedulerService;
}

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

interface GatewayServer {
  /** Server starten. Gibt die gebundene Adresse zurueck. */
  start(): Promise<GatewayAddr>;
  /** Server ordnungsgemaess stoppen. */
  stop(): Promise<void>;
}

Authentifizierung

Gateway-Verbindungen werden mit einem Token authentifiziert. Das Token wird waehrend der Einrichtung (triggerfish dive) generiert und lokal gespeichert.

SICHERHEIT Das Gateway bindet sich standardmaessig an 127.0.0.1 und ist nicht dem Netzwerk ausgesetzt. Fernzugriff erfordert explizite Tunnel-Konfiguration. Setzen Sie den Gateway-WebSocket niemals ohne Authentifizierung dem oeffentlichen Internet aus. :::

Session-Verwaltung

Das Gateway verwaltet den vollstaendigen Lebenszyklus von Sessions. Sessions sind die fundamentale Einheit des Gespraechszustands, jede mit unabhaengigem Taint-Tracking.

Session-Typen

TypSchluessel-MusterBeschreibung
HauptmainPrimaeres direktes Gespraech mit dem Eigentuemer. Bleibt ueber Neustarts bestehen.
Kanalchannel:<type>:<id>Einer pro verbundenem Kanal. Isolierter Taint pro Kanal.
Hintergrundbg:<task_id>Erstellt fuer Cron-Jobs und Webhook-ausgeloeste Aufgaben. Startet mit PUBLIC-Taint.
Agentagent:<agent_id>Pro-Agent-Sessions fuer Multi-Agent-Routing.
Gruppegroup:<channel>:<group_id>Gruppenchat-Sessions.

Session-Tools

Der Agent interagiert mit Sessions ueber diese Tools, alle geroutet durch das Gateway:

ToolBeschreibungTaint-Auswirkungen
sessions_listAktive Sessions mit optionalen Filtern auflistenKeine Taint-Aenderung
sessions_historyTranskript fuer eine Session abrufenTaint erbt von referenzierter Session
sessions_sendNachricht an eine andere Session sendenUnterliegt Write-Down-Pruefung
sessions_spawnHintergrund-Aufgaben-Session erstellenNeue Session startet mit PUBLIC-Taint
session_statusAktuellen Session-Zustand, Modell, Kosten pruefenKeine Taint-Aenderung

Inter-Session-Kommunikation ueber sessions_send unterliegt denselben Write-Down-Regeln wie jede andere Ausgabe. Eine CONFIDENTIAL-Session kann keine Daten an eine Session senden, die mit einem PUBLIC-Kanal verbunden ist. :::

Kanal-Routing

Das Gateway routet Nachrichten zwischen Kanaelen und Sessions durch den Kanal-Router. Der Router handhabt:

  • Klassifizierungs-Gate: Jede ausgehende Nachricht durchlaeuft PRE_OUTPUT vor der Zustellung
  • Wiederholung mit Backoff: Fehlgeschlagene Zustellungen werden mit exponentiellem Backoff ueber sendWithRetry() wiederholt
  • Nachrichtenaufteilung: Grosse Nachrichten werden in plattformgerechte Teile aufgeteilt (z.B. Telegrams 4096-Zeichen-Limit)
  • Streaming: Antworten werden an Kanaele gestreamt, die dies unterstuetzen
  • Verbindungsverwaltung: connectAll() und disconnectAll() fuer Lebenszyklus-Management

Benachrichtigungsdienst

Das Gateway integriert einen erstklassigen Benachrichtigungsdienst, der Ad-hoc-"Eigentuemer benachrichtigen"-Muster in der gesamten Plattform ersetzt. Alle Benachrichtigungen fliessen durch einen einzigen 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[]>;
}

Prioritaetsrouting

PrioritaetVerhalten
CRITICALUmgeht Ruhezeiten, sofortige Zustellung an ALLE verbundenen Kanaele
HIGHSofortige Zustellung an bevorzugten Kanal, Warteschlange wenn offline
NORMALZustellung an aktive Session oder Warteschlange bis zum naechsten Session-Start
LOWWarteschlange, Zustellung in Stapeln waehrend aktiver Sessions

Benachrichtigungsquellen

QuelleKategorieStandardprioritaet
Policy-VerletzungensecurityCRITICAL
Bedrohungsintelligenz-WarnungensecurityCRITICAL
Skill-GenehmigungsanfragenapprovalHIGH
Cron-Job-FehlersystemHIGH
System-GesundheitswarnungensystemHIGH
Webhook-Ereignis-TriggerinfoNORMAL
Verfuegbare The-Reef-UpdatesinfoLOW

Benachrichtigungen werden ueber StorageProvider (Namensraum: notifications:) persistiert und ueberleben Neustarts. Nicht zugestellte Benachrichtigungen werden beim naechsten Gateway-Start oder Session-Verbindung erneut versucht.

Zustellungspraeferenzen

Benutzer konfigurieren Benachrichtigungspraeferenzen pro Kanal:

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

Scheduler-Integration

Das Gateway beherbergt den Scheduler-Dienst, der Folgendes verwaltet:

  • Cron-Tick-Schleife: Periodische Auswertung geplanter Aufgaben
  • Trigger-Aufwachvorgaenge: Agenten-Aufwachvorgaenge definiert in TRIGGER.md
  • Webhook-HTTP-Endpunkte: POST /webhooks/:sourceId fuer eingehende Ereignisse
  • Orchestrator-Isolation: Jede geplante Aufgabe laeuft in ihrem eigenen OrchestratorFactory mit isoliertem Session-Zustand

Von Cron und Webhooks ausgeloeste Aufgaben starten Hintergrund-Sessions mit frischem PUBLIC-Taint. Sie erben nicht den Taint einer bestehenden Session, wodurch sichergestellt wird, dass autonome Aufgaben mit einem sauberen Klassifizierungszustand starten. :::

Gesundheit und Diagnose

Der Befehl triggerfish patrol verbindet sich mit dem Gateway und fuehrt diagnostische Gesundheitspruefungen durch, die Folgendes verifizieren:

  • Gateway laeuft und reagiert
  • Alle konfigurierten Kanaele sind verbunden
  • Speicherung ist erreichbar
  • Geplante Aufgaben werden rechtzeitig ausgefuehrt
  • Keine unzugestellten kritischen Benachrichtigungen stecken in der Warteschlange