TypeBox als bron van waarheid voor het protocol
Laatst bijgewerkt: 2026-01-10 TypeBox is een TypeScript-first schemabibliotheek. We gebruiken het om het Gateway WebSocket-protocol te definiëren (handshake, request/response, serverevents). Deze schema’s sturen runtime-validatie, JSON Schema-export en Swift-codegeneratie voor de macOS-app aan. Eén bron van waarheid; al het andere wordt gegenereerd. Als je de protocolcontext op hoger niveau wilt, begin dan met Gateway architecture.Mentaal model (30 seconden)
Elk Gateway WS-bericht is een van drie frames:- Verzoek:
{ type: "req", id, method, params } - Antwoord:
{ type: "res", id, ok, payload | error } - Gebeurtenis:
{ type: "event", event, payload, seq?, stateVersion? }
connect-request zijn. Daarna kunnen clients
methoden aanroepen (bijv. health, send, chat.send) en zich
abonneren op events (bijv. presence, tick, agent).
Verbindingsflow (minimaal):
| Categorie | Voorbeelden | Notities |
|---|---|---|
| Kern | connect, health, status | connect moet eerst zijn |
| Berichten | send, poll, agent, agent.wait | side-effects vereisen idempotencyKey |
| Chat | chat.history, chat.send, chat.abort, chat.inject | WebChat gebruikt deze |
| Sessions | sessions.list, sessions.patch, sessions.delete | sessiebeheer |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + node-acties |
| Events | tick, presence, agent, chat, health, shutdown | server push |
src/gateway/server.ts (METHODS, EVENTS).
Waar de schema’s staan
- Bron:
src/gateway/protocol/schema.ts - Runtime-validators (AJV):
src/gateway/protocol/index.ts - Server-handshake + methodedispatch:
src/gateway/server.ts - Node-client:
src/gateway/client.ts - Gegenereerd JSON Schema:
dist/protocol.schema.json - Gegenereerde Swift-modellen:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Huidige pipeline
pnpm protocol:gen- schrijft JSON Schema (draft‑07) naar
dist/protocol.schema.json
- schrijft JSON Schema (draft‑07) naar
pnpm protocol:gen:swift- genereert Swift Gateway-modellen
pnpm protocol:check- draait beide generators en verifieert dat de uitvoer is gecommit
Hoe de schema’s runtime worden gebruikt
- Serverzijde: elk inkomend frame wordt gevalideerd met AJV. De handshake
accepteert alleen een
connect-request waarvan de params overeenkomen metConnectParams. - Clientzijde: de JS-client valideert event- en responseframes voordat ze worden gebruikt.
- Methodesurface: de Gateway adverteert de ondersteunde
methodseneventsinhello-ok.
Voorbeeldframes
Verbinden (eerste bericht):Minimale client (Node.js)
Kleinste nuttige flow: verbinden + health.Uitgewerkt voorbeeld: voeg een methode end‑to‑end toe
Voorbeeld: voeg een nieuwesystem.echo-request toe die { ok: true, text } retourneert.
- Schema (bron van waarheid)
src/gateway/protocol/schema.ts:
ProtocolSchemas en exporteer types:
- Validatie
src/gateway/protocol/index.ts een AJV-validator:
- Servergedrag
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (voegt systemHandlers al samen),
en voeg daarna "system.echo" toe aan METHODS in src/gateway/server.ts.
- Regenereren
- Tests + documentatie
src/gateway/server.*.test.ts en vermeld de methode in de documentatie.
Swift-codegeneratiegedrag
De Swift-generator levert:GatewayFrame-enum metreq,res,eventenunknown-cases- Sterk getypeerde payload-structs/enums
ErrorCode-waarden enGATEWAY_PROTOCOL_VERSION
Versiebeheer + compatibiliteit
PROTOCOL_VERSIONstaat insrc/gateway/protocol/schema.ts.- Clients sturen
minProtocol+maxProtocol; de server weigert mismatches. - De Swift-modellen behouden onbekende frametypen om oudere clients niet te breken.
Schemepatronen en conventies
- De meeste objecten gebruiken
additionalProperties: falsevoor strikte payloads. NonEmptyStringis de standaard voor ID’s en methode-/eventnamen.- Het top-level
GatewayFramegebruikt een discriminator optype. - Methoden met side-effects vereisen meestal een
idempotencyKeyin params (voorbeeld:send,poll,agent,chat.send).
Live schema-JSON
Gegenereerd JSON Schema staat in de repo opdist/protocol.schema.json. Het
gepubliceerde ruwe bestand is doorgaans beschikbaar op:
Wanneer je schema’s wijzigt
- Werk de TypeBox-schema’s bij.
- Voer
pnpm protocol:checkuit. - Commit het geregenereerde schema + de Swift-modellen.