Modèle mental (30 secondes)
Chaque message WS du Gateway est l’une de ces trois trames :- Requête :
{ type: "req", id, method, params } - Réponse :
{ type: "res", id, ok, payload | error } - Événement :
{ type: "event", event, payload, seq?, stateVersion? }
connect. Ensuite, les clients peuvent appeler
des méthodes (par ex. health, send, chat.send) et s’abonner à des événements (par ex.
presence, tick, agent).
Flux de connexion (minimal) :
| Catégorie | Exemples | Notes |
|---|---|---|
| Noyau | connect, health, status | connect doit être en premier |
| Messagerie | send, agent, agent.wait, system-event, logs.tail | les effets de bord nécessitent idempotencyKey |
| Chat | chat.history, chat.send, chat.abort | WebChat les utilise |
| Sessions | sessions.list, sessions.patch, sessions.delete | administration des sessions |
| Automation | wake, cron.list, cron.run, cron.runs | contrôle wake + cron |
| Nœuds | node.list, node.invoke, node.pair.* | WS du Gateway + actions de nœud |
| Événements | tick, presence, agent, chat, health, shutdown | push serveur |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Emplacement des schémas
- Source :
packages/gateway-protocol/src/schema.ts - Validateurs à l’exécution (AJV) :
packages/gateway-protocol/src/index.ts - Registre des fonctionnalités/discovery annoncées :
src/gateway/server-methods-list.ts - Handshake serveur + dispatch des méthodes :
src/gateway/server.impl.ts - Client Node :
src/gateway/client.ts - JSON Schema généré :
dist/protocol.schema.json - Modèles Swift générés :
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Pipeline actuel
pnpm protocol:gen- écrit JSON Schema (draft-07) dans
dist/protocol.schema.json
- écrit JSON Schema (draft-07) dans
pnpm protocol:gen:swift- génère les modèles Swift du Gateway
pnpm protocol:check- exécute les deux générateurs et vérifie que la sortie est commitée
Utilisation des schémas à l’exécution
- Côté serveur : chaque trame entrante est validée avec AJV. Le handshake n’accepte qu’une requête
connectdont les paramètres correspondent àConnectParams. - Côté client : le client JS valide les trames d’événement et de réponse avant de les utiliser.
- Feature discovery : le Gateway envoie une liste prudente
features.methodsetfeatures.eventsdanshello-okdepuislistGatewayMethods()etGATEWAY_EVENTS. - Cette liste discovery n’est pas un dump généré de tous les helpers appelables dans
coreGatewayHandlers; certains RPC helpers sont implémentés danssrc/gateway/server-methods/*.tssans être énumérés dans la liste de fonctionnalités annoncée.
Exemples de trames
Connect (premier message) :Client minimal (Node.js)
Plus petit flux utile : connexion + health.Exemple guidé : ajouter une méthode de bout en bout
Exemple : ajouter une nouvelle requêtesystem.echo qui renvoie { ok: true, text }.
- Schéma (source de vérité)
packages/gateway-protocol/src/schema.ts :
ProtocolSchemas et exportez les types :
- Validation
packages/gateway-protocol/src/index.ts, exportez un validateur AJV :
- Comportement serveur
src/gateway/server-methods/system.ts :
src/gateway/server-methods.ts (fusionne déjà systemHandlers),
puis ajoutez "system.echo" à l’entrée de listGatewayMethods dans
src/gateway/server-methods-list.ts.
Si la méthode est appelable par des clients opérateur ou nœud, classez-la aussi dans
src/gateway/method-scopes.ts afin que l’application des scopes et l’annonce des fonctionnalités hello-ok restent alignées.
- Régénération
- Tests + docs
src/gateway/server.*.test.ts et mentionnez la méthode dans la documentation.
Comportement de la génération de code Swift
Le générateur Swift émet :- une enum
GatewayFrameavec les casreq,res,eventetunknown - des structs/enums de payload fortement typés
- des valeurs
ErrorCode,GATEWAY_PROTOCOL_VERSIONetGATEWAY_MIN_PROTOCOL_VERSION
Versionnement + compatibilité
PROTOCOL_VERSIONse trouve danspackages/gateway-protocol/src/version.ts.- Les clients envoient
minProtocol+maxProtocol; le serveur rejette les plages qui n’incluent pas son protocole actuel. - Les modèles Swift conservent les types de trames inconnus pour éviter de casser les clients plus anciens.
Motifs et conventions des schémas
- La plupart des objets utilisent
additionalProperties: falsepour des payloads stricts. NonEmptyStringest la valeur par défaut pour les ID et les noms de méthode/événement.- Le
GatewayFramede premier niveau utilise un discriminator surtype. - Les méthodes avec effets de bord exigent généralement un
idempotencyKeydans les paramètres (exemple :send,poll,agent,chat.send). agentaccepteinternalEventsen option pour le contexte d’orchestration généré à l’exécution (par exemple le transfert de fin de tâche subagent/cron) ; traitez cela comme une surface d’API interne.
JSON de schéma en direct
Le JSON Schema généré se trouve dans le dépôt àdist/protocol.schema.json. Le
fichier brut publié est généralement disponible à l’adresse suivante :
Quand vous modifiez des schémas
- Mettez à jour les schémas TypeBox.
- Enregistrez la méthode/l’événement dans
src/gateway/server-methods-list.ts. - Mettez à jour
src/gateway/method-scopes.tslorsque le nouveau RPC nécessite une classification de scope opérateur ou nœud. - Exécutez
pnpm protocol:check. - Commitez le schéma régénéré + les modèles Swift.