TypeBox als Single Source of Truth für das Protokoll
Zuletzt aktualisiert: 2026-01-10 TypeBox ist eine TypeScript-first-Schema-Bibliothek. Wir verwenden sie, um das Gateway- WebSocket-Protokoll zu definieren (Handshake, Anfrage/Antwort, Server-Ereignisse). Diese Schemas steuern die Laufzeitvalidierung, den JSON-Schema-Export und den Swift-Codegen für die macOS-App. Eine einzige Quelle der Wahrheit; alles andere wird generiert. Wenn Sie den übergeordneten Protokollkontext möchten, beginnen Sie mit Gateway architecture.Mentales Modell (30 Sekunden)
Jede Gateway-WS-Nachricht ist einer von drei Frames:- Request:
{ type: "req", id, method, params } - Response:
{ type: "res", id, ok, payload | error } - Event:
{ type: "event", event, payload, seq?, stateVersion? }
connect-Anfrage sein. Danach können Clients
Methoden aufrufen (z. B. health, send, chat.send) und Ereignisse abonnieren (z. B.
presence, tick, agent).
Verbindungsablauf (minimal):
| Kategorie | Beispiele | Hinweise |
|---|---|---|
| Core | connect, health, status | connect muss zuerst kommen |
| Messaging | send, agent, agent.wait, system-event, logs.tail | Nebeneffekte benötigen idempotencyKey |
| Chat | chat.history, chat.send, chat.abort | WebChat verwendet diese |
| Sitzungen | sessions.list, sessions.patch, sessions.delete | Sitzungsverwaltung |
| Automatisierung | wake, cron.list, cron.run, cron.runs | Wake + Cron-Steuerung |
| Knoten | node.list, node.invoke, node.pair.* | Gateway-WS + Knotenaktionen |
| Ereignisse | tick, presence, agent, chat, health, shutdown | Server-Push |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Wo die Schemas liegen
- Quelle:
src/gateway/protocol/schema.ts - Laufzeitvalidatoren (AJV):
src/gateway/protocol/index.ts - Beworbene Feature-/Discovery-Registry:
src/gateway/server-methods-list.ts - Server-Handshake + Methodendispatch:
src/gateway/server.impl.ts - Knoten-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
- schreibt JSON Schema (draft‑07) nach
pnpm protocol:gen:swift- generiert Swift-Gateway-Modelle
pnpm protocol:check- führt beide Generatoren aus und prüft, ob die Ausgabe eingecheckt 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 zuConnectParamspassen. - Clientseitig: Der JS-Client validiert Ereignis- und Antwort-Frames, bevor er sie verwendet.
- Feature-Discovery: Das Gateway sendet ein konservatives
features.methodsund einefeatures.events-Liste inhello-okauslistGatewayMethods()undGATEWAY_EVENTS. - Diese Discovery-Liste ist kein generierter Dump jedes aufrufbaren Hilfsprogramms in
coreGatewayHandlers; einige Hilfs-RPCs werden insrc/gateway/server-methods/*.tsimplementiert, ohne in der beworbenen Feature-Liste aufgezählt zu sein.
Beispiel-Frames
Connect (erste Nachricht):Minimaler Client (Node.js)
Kleinster nützlicher Ablauf: connect + health.Durchgearbeitetes Beispiel: eine Methode Ende-zu-Ende hinzufügen
Beispiel: eine neue Anfragesystem.echo hinzufügen, die { ok: true, text } zurückgibt.
- Schema (Single Source of Truth)
src/gateway/protocol/schema.ts hinzufügen:
ProtocolSchemas hinzufügen und Typen exportieren:
- Validierung
src/gateway/protocol/index.ts einen AJV-Validator exportieren:
- Serververhalten
src/gateway/server-methods/system.ts hinzufügen:
src/gateway/server-methods.ts registrieren (führt systemHandlers bereits zusammen),
dann "system.echo" zur Eingabe von listGatewayMethods in
src/gateway/server-methods-list.ts hinzufügen.
Wenn die Methode von Operator- oder Knoten-Clients aufrufbar sein soll, klassifizieren Sie sie außerdem in
src/gateway/method-scopes.ts, damit Scope-Durchsetzung und Feature-
Bewerbung in hello-ok synchron bleiben.
- Neu generieren
- Tests + Dokumentation
src/gateway/server.*.test.ts hinzufügen und die Methode in der Dokumentation vermerken.
Verhalten des Swift-Codegens
Der Swift-Generator erzeugt:GatewayFrame-Enum mit Fällenreq,res,eventundunknown- Stark typisierte Payload-Structs/-Enums
ErrorCode-Werte undGATEWAY_PROTOCOL_VERSION
Versionierung + Kompatibilität
PROTOCOL_VERSIONbefindet sich insrc/gateway/protocol/schema.ts.- Clients senden
minProtocol+maxProtocol; der Server lehnt Nichtübereinstimmungen ab. - Die Swift-Modelle behalten unbekannte Frame-Typen bei, damit ältere Clients nicht brechen.
Schema-Muster und Konventionen
- Die meisten Objekte verwenden
additionalProperties: falsefür strikte Payloads. NonEmptyStringist der Standard für IDs und Methoden-/Ereignisnamen.- Das Top-Level-
GatewayFrameverwendet einen Discriminator auftype. - Methoden mit Nebeneffekten erfordern in den Parametern normalerweise einen
idempotencyKey(Beispiel:send,poll,agent,chat.send). agentakzeptiert optionaleinternalEventsfür runtime-generierten Orchestrierungskontext (zum Beispiel Übergabe bei Abschluss von Subagent-/Cron-Aufgaben); behandeln Sie dies als interne API-Oberfläche.
Live-Schema-JSON
Das generierte JSON Schema befindet sich im Repository unterdist/protocol.schema.json. Die
veröffentlichte Rohdatei ist typischerweise verfügbar unter:
Wenn Sie Schemas ändern
- Die TypeBox-Schemas aktualisieren.
- Die Methode/das Ereignis in
src/gateway/server-methods-list.tsregistrieren. src/gateway/method-scopes.tsaktualisieren, wenn das neue RPC eine Scope-Klassifizierung für Operator oder Knoten benötigt.pnpm protocol:checkausführen.- Das neu generierte Schema + die Swift-Modelle committen.