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? }
connect-Anfrage sein. Danach rufen Clients Methoden auf (z. B. health, send, chat.send) und abonnieren Ereignisse (z. B. presence, tick, agent).
Verbindungsablauf (minimal):
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.tsreexportiert Domänenmodule unterpackages/gateway-protocol/src/schema/*.ts(frames.tsfür die übergeordneten Envelopes und den Handshake,agent.ts,sessions.ts,cron.tsusw. je Funktionsbereich).protocol-schemas.tsist die zentraleProtocolSchemas-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:genschreibt das JSON-Schema (Draft-07) nachdist/protocol.schema.json.pnpm protocol:gen:swiftgeneriert die Swift-Gateway-Modelle.pnpm protocol:checkfü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 ParameterConnectParamsentsprechen. - Clientseitig: Der JS-Client validiert Ereignis- und Antwort-Frames, bevor er sie verwendet.
- Feature-Discovery: Der Gateway sendet in
hello-okeine konservative Liste vonfeatures.methodsundfeatures.events, die auslistGatewayMethods()undGATEWAY_EVENTSstammt. - Diese Discovery-Liste ist kein generierter Auszug aller aufrufbaren Hilfsfunktionen in
coreGatewayHandlers; einige Hilfs-RPCs sind insrc/gateway/server-methods/*.tsimplementiert, ohne in der veröffentlichten Feature-Liste aufgeführt zu sein.
Beispiel-Frames
Verbindung (erste Nachricht):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 neuesystem.echo-Anfrage hinzu, die { ok: true, text } zurückgibt.
- Schema (maßgebliche Quelle)
packages/gateway-protocol/src/schema/system.ts (oder dem am besten passenden Feature-Modul) hinzu:
packages/gateway-protocol/src/schema/protocol-schemas.ts, fügen Sie sie zur ProtocolSchemas-Registry hinzu und exportieren Sie die abgeleiteten Typen:
- Validierung
packages/gateway-protocol/src/index.ts einen AJV-Validator:
- Serververhalten
src/gateway/server-methods/system.ts einen Handler hinzu:
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.
- Neu generieren
- Tests und Dokumentation
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ällenreq,res,eventundunknown - stark typisierte Payload-Strukturen/-Enumerationen
ErrorCode-Werte,GATEWAY_PROTOCOL_VERSIONundGATEWAY_MIN_PROTOCOL_VERSION
Versionierung und Kompatibilität
PROTOCOL_VERSIONbefindet sich inpackages/gateway-protocol/src/version.ts(aktueller Wert:4).- Clients senden
minProtocolundmaxProtocol; 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: falsefür strikt definierte Payloads. NonEmptyString(Type.String({ minLength: 1 })) ist die Standardeinstellung für IDs sowie Methoden- und Ereignisnamen.- Das übergeordnete
GatewayFrameverwendet einen Diskriminator fürtype. - Methoden mit Nebenwirkungen erfordern in den Parametern üblicherweise eine
idempotencyKey(Beispiel:send,poll,agent,chat.send). agentakzeptiert optionalinternalEventsfü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
- Aktualisieren Sie die TypeBox-Schemas im zuständigen
packages/gateway-protocol/src/schema/*.ts-Modul und registrieren Sie sie inprotocol-schemas.ts. - Registrieren Sie die Methode/das Ereignis in
src/gateway/server-methods-list.ts. - Aktualisieren Sie
src/gateway/method-scopes.ts, wenn der neue RPC eine Bereichsklassifizierung für Operator oder Node benötigt. - Führen Sie
pnpm protocol:checkaus. - Checken Sie die neu generierten Swift-Modelle ein.