TypeBox comme source de vérité du protocole
Dernière mise à jour : 2026-01-10 TypeBox est une bibliothèque de schémas orientée TypeScript. Nous l’utilisons pour définir le protocole WebSocket de la Gateway (passerelle) (handshake, requêtes/réponses, événements serveur). Ces schémas pilotent la validation à l’exécution, l’export JSON Schema et la génération de code Swift pour l’application macOS. Une seule source de vérité ; tout le reste est généré. Si vous souhaitez le contexte de plus haut niveau du protocole, commencez par Gateway architecture.Modèle mental (30 secondes)
Chaque message WS de la Gateway est l’une de trois trames :- Request :
{ type: "req", id, method, params } - Response :
{ type: "res", id, ok, payload | error } - Event :
{ type: "event", event, payload, seq?, stateVersion? }
connect. Ensuite, les clients peuvent appeler
des méthodes (par exemple health, send, chat.send) et s’abonner à des événements (par exemple
presence, tick, agent).
Flux de connexion (minimal) :
| Catégorie | Exemples | Remarques |
|---|---|---|
| Core | connect, health, status | connect doit être le premier |
| Messagerie | send, poll, agent, agent.wait | les effets de bord nécessitent idempotencyKey |
| Chat | chat.history, chat.send, chat.abort, chat.inject | WebChat utilise ces méthodes |
| Sessions | sessions.list, sessions.patch, sessions.delete | administration des sessions |
| Nodes | node.list, node.invoke, node.pair.* | WS de la Gateway + actions de nœud |
| Events | tick, presence, agent, chat, health, shutdown | push serveur |
src/gateway/server.ts (METHODS, EVENTS).
Où vivent les schémas
- Source :
src/gateway/protocol/schema.ts - Validateurs à l’exécution (AJV) :
src/gateway/protocol/index.ts - Handshake serveur + dispatch des méthodes :
src/gateway/server.ts - Client nœud :
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 le JSON Schema (draft‑07) dans
dist/protocol.schema.json
- écrit le JSON Schema (draft‑07) dans
pnpm protocol:gen:swift- génère les modèles Swift de la Gateway
pnpm protocol:check- exécute les deux générateurs et vérifie que la sortie est bien commitée
Comment les schémas sont utilisés à 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.
- Surface des méthodes : la Gateway annonce les
methodseteventspris en charge danshello-ok.
Exemples de trames
Connexion (premier message) :Client minimal (Node.js)
Flux utile le plus simple : connexion + health.Exemple complet : ajouter une méthode de bout en bout
Exemple : ajouter une nouvelle requêtesystem.echo qui retourne { ok: true, text }.
- Schéma (source de vérité)
src/gateway/protocol/schema.ts :
ProtocolSchemas et exporter les types :
- Validation
src/gateway/protocol/index.ts, exporter un validateur AJV :
- Comportement serveur
src/gateway/server-methods/system.ts :
src/gateway/server-methods.ts (qui fusionne déjà systemHandlers),
puis ajouter "system.echo" à METHODS dans src/gateway/server.ts.
- Régénérer
- Tests + documentation
src/gateway/server.*.test.ts et noter 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
ErrorCodeetGATEWAY_PROTOCOL_VERSION
Versioning + compatibilité
PROTOCOL_VERSIONse trouve danssrc/gateway/protocol/schema.ts.- Les clients envoient
minProtocol+maxProtocol; le serveur rejette les incompatibilités. - Les modèles Swift conservent les types de trames inconnus afin d’éviter de casser les anciens clients.
Modèles et conventions de schéma
- La plupart des objets utilisent
additionalProperties: falsepour des payloads stricts. NonEmptyStringest la valeur par défaut pour les identifiants et les noms de méthodes/événements.- Le
GatewayFramede niveau supérieur utilise un discriminateur surtype. - Les méthodes avec effets de bord nécessitent généralement un
idempotencyKeydans les paramètres (exemple :send,poll,agent,chat.send).
JSON de schéma en direct
Le JSON Schema généré se trouve dans le dépôt à l’emplacementdist/protocol.schema.json. Le
fichier brut publié est généralement disponible à l’adresse :
Lorsque vous modifiez les schémas
- Mettez à jour les schémas TypeBox.
- Exécutez
pnpm protocol:check. - Committez le schéma régénéré et les modèles Swift.