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 Gateway (handshake, requête/réponse, événements serveur). Ces schémas pilotent la validation à l’exécution, l’export JSON Schema et le codegen Swift pour l’application macOS. Une seule source de vérité ; tout le reste est généré. Si vous souhaitez le contexte du protocole à un niveau plus élevé, commencez par Architecture de Gateway.Modèle mental (30 secondes)
Chaque message Gateway WS 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. Après cela, 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 |
|---|---|---|
| Cœur | 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 |
| Automatisation | wake, cron.list, cron.run, cron.runs | contrôle du réveil + cron |
| Nœuds | node.list, node.invoke, node.pair.* | Gateway WS + actions de nœud |
| Événements | tick, presence, agent, chat, health, shutdown | push serveur |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Où se trouvent les schémas
- Source :
src/gateway/protocol/schema.ts - Validateurs runtime (AJV) :
src/gateway/protocol/index.ts - Registre des fonctionnalités/discovery annoncées :
src/gateway/server-methods-list.ts - Handshake serveur + distribution des méthodes :
src/gateway/server.impl.ts - Client de 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 gateway Swift
pnpm protocol:check- exécute les deux générateurs et vérifie que la sortie est validée dans le dépôt
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.
- Discovery des fonctionnalités : Gateway envoie une liste conservatrice
features.methodsetfeatures.eventsdanshello-okdepuislistGatewayMethods()etGATEWAY_EVENTS. - Cette liste de discovery n’est pas un dump généré de chaque helper appelable dans
coreGatewayHandlers; certains RPC helpers sont implémentés danssrc/gateway/server-methods/*.tssans être énumérés dans la liste des fonctionnalités annoncées.
Exemples de trames
Connect (premier message) :Client minimal (Node.js)
Flux utile le plus petit : connect + health.Exemple complet : 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é)
src/gateway/protocol/schema.ts :
ProtocolSchemas et exportez les types :
- Validation
src/gateway/protocol/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 listGatewayMethods dans
src/gateway/server-methods-list.ts.
Si la méthode peut être appelée par des clients operator ou node, classez-la aussi dans
src/gateway/method-scopes.ts afin que l’application des portées et la publicité
des fonctionnalités hello-ok restent alignées.
- Régénérer
- Tests + documentation
src/gateway/server.*.test.ts et mentionnez la méthode dans la documentation.
Comportement du codegen Swift
Le générateur Swift émet :- un enum
GatewayFrameavec les casreq,res,eventetunknown - des structs/enums de charge utile fortement typés
- des valeurs
ErrorCodeetGATEWAY_PROTOCOL_VERSION
Versionnement + 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 trame inconnus afin d’éviter de casser les anciens clients.
Motifs et conventions des schémas
- La plupart des objets utilisent
additionalProperties: falsepour des charges utiles strictes. NonEmptyStringest la valeur par défaut pour les ID et les noms de méthode/événement.- Le
GatewayFramede niveau supérieur utilise un discriminator surtype. - Les méthodes avec effets de bord nécessitent généralement un
idempotencyKeydans les paramètres (exemple :send,poll,agent,chat.send). agentaccepte desinternalEventsfacultatifs pour le contexte d’orchestration généré par le runtime (par exemple le transfert de fin de tâche cron/sous-agent) ; traitez cela comme une surface API interne.
JSON Schema actif
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 :
Quand vous modifiez les 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 portée operator ou node. - Exécutez
pnpm protocol:check. - Validez le schéma régénéré + les modèles Swift.