Skip to main content

TypeBox als Quelle der Wahrheit für das Protokoll

Zuletzt aktualisiert: 2026-01-10 TypeBox ist eine TypeScript‑first Schema-Bibliothek. Wir verwenden sie, um das Gateway‑WebSocket‑Protokoll (Handshake, Request/Response, Server‑Events) zu definieren. Diese Schemas treiben die Laufzeitvalidierung, den JSON‑Schema‑Export und die Swift‑Codegenerierung für die macOS‑App an. Eine einzige Quelle der Wahrheit; alles andere wird daraus generiert. Wenn Sie den übergeordneten Protokollkontext möchten, beginnen Sie mit Gateway architecture.

Mentales Modell (30 Sekunden)

Jede Gateway‑WS‑Nachricht ist eines von drei Frames:
  • Anfrage: { type: "req", id, method, params }
  • Antwort: { type: "res", id, ok, payload | error }
  • Ereignis: { type: "event", event, payload, seq?, stateVersion? }
Der erste Frame muss eine connect‑Anfrage sein. Danach können Clients Methoden aufrufen (z. B. health, send, chat.send) und Events abonnieren (z. B. presence, tick, agent). Verbindungsablauf (minimal):
Häufige Methoden + Events: Die maßgebliche Liste befindet sich in src/gateway/server.ts (METHODS, EVENTS).

Wo die Schemas liegen

  • Quelle: src/gateway/protocol/schema.ts
  • Laufzeit‑Validatoren (AJV): src/gateway/protocol/index.ts
  • Server‑Handshake + Methoden‑Dispatch: src/gateway/server.ts
  • Node‑Client: src/gateway/client.ts
  • Generiertes JSON Schema: dist/protocol.schema.json
  • Generierte Swift‑Modelle: apps/macos/Sources/OpenClawProtocol/GatewayModels.swift

Aktuelle Pipeline

  • pnpm protocol:gen
    • schreibt JSON Schema (Draft‑07) nach dist/protocol.schema.json
  • pnpm protocol:gen:swift
    • generiert Swift‑Gateway‑Modelle
  • pnpm protocol:check
    • führt beide Generatoren aus und überprüft, dass die Ausgabe committet ist

Wie die Schemas zur Laufzeit verwendet werden

  • Serverseitig: Jeder eingehende Frame wird mit AJV validiert. Der Handshake akzeptiert nur eine connect‑Anfrage, deren Parameter ConnectParams entsprechen.
  • Clientseitig: Der JS‑Client validiert Event‑ und Response‑Frames, bevor er sie verwendet.
  • Methodenoberfläche: Das Gateway kündigt die unterstützten methods und events in hello-ok an.

Beispiel‑Frames

Connect (erste Nachricht):
Hello‑ok‑Antwort:
Request + Response:
Event:

Minimaler Client (Node.js)

Kleinster sinnvoller Ablauf: verbinden + Health.

Durchgängiges Beispiel: eine Methode Ende‑zu‑Ende hinzufügen

Beispiel: Fügen Sie eine neue system.echo‑Anfrage hinzu, die { ok: true, text } zurückgibt.
  1. Schema (Quelle der Wahrheit)
Zu src/gateway/protocol/schema.ts hinzufügen:
Beide zu ProtocolSchemas hinzufügen und Typen exportieren:
  1. Validierung
In src/gateway/protocol/index.ts einen AJV‑Validator exportieren:
  1. Server‑Verhalten
Einen Handler in src/gateway/server-methods/system.ts hinzufügen:
In src/gateway/server-methods.ts registrieren (führt bereits systemHandlers zusammen), dann "system.echo" zu METHODS in src/gateway/server.ts hinzufügen.
  1. Neu generieren
  1. Tests + Doku
Einen Server‑Test in src/gateway/server.*.test.ts hinzufügen und die Methode in der Doku vermerken.

Swift‑Codegenerierungsverhalten

Der Swift‑Generator erzeugt:
  • Ein GatewayFrame‑Enum mit den Fällen req, res, event und unknown
  • Stark typisierte Payload‑Structs/Enums
  • ErrorCode‑Werte und GATEWAY_PROTOCOL_VERSION
Unbekannte Frame‑Typen werden als rohe Payloads beibehalten, um Vorwärtskompatibilität zu gewährleisten.

Versionierung + Kompatibilität

  • PROTOCOL_VERSION befindet sich in src/gateway/protocol/schema.ts.
  • Clients senden minProtocol + maxProtocol; der Server lehnt Abweichungen ab.
  • Die Swift‑Modelle behalten unbekannte Frame‑Typen bei, um ältere Clients nicht zu brechen.

Schema‑Patterns und Konventionen

  • Die meisten Objekte verwenden additionalProperties: false für strikte Payloads.
  • NonEmptyString ist der Standard für IDs sowie Methoden‑/Event‑Namen.
  • Das Top‑Level‑GatewayFrame verwendet einen Discriminator auf type.
  • Methoden mit Nebenwirkungen erfordern in der Regel ein idempotencyKey in den Parametern (Beispiel: send, poll, agent, chat.send).

Live‑Schema‑JSON

Das generierte JSON Schema befindet sich im Repo unter dist/protocol.schema.json. Die veröffentlichte Raw‑Datei ist typischerweise verfügbar unter:

Wenn Sie Schemas ändern

  1. Aktualisieren Sie die TypeBox‑Schemas.
  2. Führen Sie pnpm protocol:check aus.
  3. Committen Sie das neu generierte Schema + die Swift‑Modelle.