Skip to main content
TypeBox ist eine Schema-Bibliothek mit TypeScript als primärem Schwerpunkt. OpenClaw verwendet sie zur Definition des Gateway-WebSocket-Protokolls (Handshake, Anfrage/Antwort, Serverereignisse). Diese Schemas steuern die Laufzeitvalidierung (AJV), den JSON-Schema-Export und die Swift-Codegenerierung für die macOS-App. Eine einzige maßgebliche Quelle; alles andere wird generiert. Den übergeordneten Protokollkontext finden Sie unter Gateway-Architektur.

Mentales Modell (30 Sekunden)

Jede Gateway-WS-Nachricht ist einer 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 rufen Clients Methoden auf (z. B. health, send, chat.send) und abonnieren Ereignisse (z. B. presence, tick, agent). Verbindungsablauf (minimal):
Häufige Methoden und Ereignisse: Das maßgebliche veröffentlichte Discovery-Inventar befindet sich in src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).

Speicherort der Schemas

  • Quell-Barrel: packages/gateway-protocol/src/schema.ts reexportiert Domänenmodule unter packages/gateway-protocol/src/schema/*.ts (frames.ts für die übergeordneten Envelopes und den Handshake, agent.ts, sessions.ts, cron.ts usw. je Funktionsbereich). protocol-schemas.ts ist die zentrale ProtocolSchemas-Registry, die Schemanamen ihren TypeBox-Definitionen zuordnet.
  • Laufzeitvalidatoren (AJV): packages/gateway-protocol/src/index.ts
  • Veröffentlichte Feature-/Discovery-Registry: src/gateway/server-methods-list.ts
  • Server-Handshake und Methodendispatch: src/gateway/server.impl.ts
  • Node-Client: src/gateway/client.ts
  • Generiertes JSON-Schema: dist/protocol.schema.json (Build-Ausgabe, nicht eingecheckt)
  • Generierte Swift-Modelle: apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift

Aktuelle Pipeline

  • pnpm protocol:gen schreibt das JSON-Schema (Draft-07) nach dist/protocol.schema.json.
  • pnpm protocol:gen:swift generiert die Swift-Gateway-Modelle.
  • pnpm protocol:check führt beide Generatoren aus und prüft, ob die Swift-Ausgabe eingecheckt ist (die JSON-Schema-Ausgabe ist ein von Git ignoriertes Build-Artefakt).

Verwendung der Schemas zur Laufzeit

  • Serverseitig: Jeder eingehende Frame wird mit AJV validiert. Der Handshake akzeptiert nur eine connect-Anfrage, deren Parameter ConnectParams entsprechen.
  • Clientseitig: Der JS-Client validiert Ereignis- und Antwort-Frames, bevor er sie verwendet.
  • Feature-Discovery: Der Gateway sendet in hello-ok eine konservative Liste von features.methods und features.events, die aus listGatewayMethods() und GATEWAY_EVENTS stammt.
  • Diese Discovery-Liste ist kein generierter Auszug aller aufrufbaren Hilfsfunktionen in coreGatewayHandlers; einige Hilfs-RPCs sind in src/gateway/server-methods/*.ts implementiert, ohne in der veröffentlichten Feature-Liste aufgeführt zu sein.

Beispiel-Frames

Verbindung (erste Nachricht):
Hello-ok-Antwort:
Anfrage und Antwort:
Ereignis:

Minimaler Client (Node.js)

Kleinster sinnvoller Ablauf: Verbindung + Integritätsprüfung.

Ausführliches Beispiel: Eine Methode durchgängig hinzufügen

Beispiel: Fügen Sie eine neue system.echo-Anfrage hinzu, die { ok: true, text } zurückgibt.
  1. Schema (maßgebliche Quelle)
Fügen Sie Folgendes zu packages/gateway-protocol/src/schema/system.ts (oder dem am besten passenden Feature-Modul) hinzu:
Importieren Sie beide in packages/gateway-protocol/src/schema/protocol-schemas.ts, fügen Sie sie zur ProtocolSchemas-Registry hinzu und exportieren Sie die abgeleiteten Typen:
  1. Validierung
Exportieren Sie in packages/gateway-protocol/src/index.ts einen AJV-Validator:
  1. Serververhalten
Fügen Sie in src/gateway/server-methods/system.ts einen Handler hinzu:
Registrieren Sie ihn in src/gateway/server-methods.ts (führt systemHandlers bereits zusammen) und fügen Sie anschließend "system.echo" zur listGatewayMethods-Eingabe in src/gateway/server-methods-list.ts hinzu. Wenn die Methode von Operator- oder Node-Clients aufgerufen werden kann, klassifizieren Sie sie außerdem in src/gateway/method-scopes.ts, damit die Bereichsdurchsetzung und die hello-ok-Feature-Veröffentlichung übereinstimmen.
  1. Neu generieren
  1. Tests und Dokumentation
Fügen Sie in src/gateway/server.*.test.ts einen Servertest hinzu und erwähnen Sie die Methode in der Dokumentation.

Verhalten der Swift-Codegenerierung

Der Swift-Generator erzeugt:
  • eine GatewayFrame-Enumeration mit den Fällen req, res, event und unknown
  • stark typisierte Payload-Strukturen/-Enumerationen
  • ErrorCode-Werte, GATEWAY_PROTOCOL_VERSION und GATEWAY_MIN_PROTOCOL_VERSION
Unbekannte Frame-Typen werden für die Vorwärtskompatibilität als Roh-Payloads beibehalten.

Versionierung und Kompatibilität

  • PROTOCOL_VERSION befindet sich in packages/gateway-protocol/src/version.ts (aktueller Wert: 4).
  • Clients senden minProtocol und maxProtocol; der Server weist Bereiche zurück, die sein aktuelles Protokoll nicht einschließen.
  • Die Swift-Modelle behalten unbekannte Frame-Typen bei, um ältere Clients nicht zu beeinträchtigen.

Schemamuster und Konventionen

  • Die meisten Objekte verwenden additionalProperties: false für strikt definierte Payloads.
  • NonEmptyString (Type.String({ minLength: 1 })) ist die Standardeinstellung für IDs sowie Methoden- und Ereignisnamen.
  • Das übergeordnete GatewayFrame verwendet einen Diskriminator für type.
  • Methoden mit Nebenwirkungen erfordern in den Parametern üblicherweise eine idempotencyKey (Beispiel: send, poll, agent, chat.send).
  • agent akzeptiert optional internalEvents für einen zur Laufzeit generierten Orchestrierungskontext (beispielsweise die Übergabe beim Abschluss von Subagent-/Cron-Aufgaben); behandeln Sie dies als interne API-Oberfläche.

Live-Schema-JSON

Das generierte JSON-Schema ist ein Build-Artefakt und wird nicht in das Repository eingecheckt. Die veröffentlichte Rohdatei ist normalerweise hier verfügbar:

Bei Änderungen an Schemas

  1. Aktualisieren Sie die TypeBox-Schemas im zuständigen packages/gateway-protocol/src/schema/*.ts-Modul und registrieren Sie sie in protocol-schemas.ts.
  2. Registrieren Sie die Methode/das Ereignis in src/gateway/server-methods-list.ts.
  3. Aktualisieren Sie src/gateway/method-scopes.ts, wenn der neue RPC eine Bereichsklassifizierung für Operator oder Node benötigt.
  4. Führen Sie pnpm protocol:check aus.
  5. Checken Sie die neu generierten Swift-Modelle ein.

Verwandte Themen