TypeBox som protokollets enda sanningskälla
Senast uppdaterad: 2026-01-10 TypeBox är ett TypeScript-första schemabibliotek. Vi använder det för att definiera Gateway WebSocket-protokollet (handskakning, förfrågan/svar, serverhändelser). Dessa scheman kör körtidsvalidering, JSON Schema export, och Swift codegen för macOS appen. En källa till sanning; allt annat genereras. Om du vill ha sammanhang på protokollnivå, börja med Gateway-arkitektur.Mental modell (30 sekunder)
Varje Gateway WS‑meddelande är en av tre ramar:- Begäran:
{ type: "req", id, method, params } - Svar:
{ type: "res", id, ok, payload | error } - Händelse:
{ typ: "händelse", händelse, nyttolast, q?, stateVersion? }
connect-begäran. Därefter kan klienter anropa
metoder (t.ex. health, send, chat.send) och prenumerera på händelser (t.ex.
presence, tick, agent).
Anslutningsflöde (minimalt):
| Kategori | Exempel | Noteringar |
|---|---|---|
| Kärna | connect, health, status | connect måste vara först |
| Meddelanden | send, poll, agent, agent.wait | sidoeffekter kräver idempotencyKey |
| Chatt | chat.history, chat.send, chat.abort, chat.inject | WebChat använder dessa |
| Sessioner | sessions.list, sessions.patch, sessions.delete | sessionadministration |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + nodåtgärder |
| Events | tick, presence, agent, chat, health, shutdown | serverpush |
src/gateway/server.ts (METHODS, EVENTS).
Var schemana finns
- Källa:
src/gateway/protocol/schema.ts - Validerare vid körning (AJV):
src/gateway/protocol/index.ts - Server‑handshake + metoddispatch:
src/gateway/server.ts - Node‑klient:
src/gateway/client.ts - Genererat JSON Schema:
dist/protocol.schema.json - Genererade Swift‑modeller:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Aktuell pipeline
pnpm protocol:gen- skriver JSON Schema (draft‑07) till
dist/protocol.schema.json
- skriver JSON Schema (draft‑07) till
pnpm protocol:gen:swift- genererar Swift‑gateway‑modeller
pnpm protocol:check- kör båda generatorerna och verifierar att utdata är committat
Hur schemana används vid körning
- Serversidan: varje inkommande ram är validerad med AJV. Handskakningen endast
accepterar en
connect-begäran vars parametrar matcharConnectParams. - Klientsidan: JS‑klienten validerar händelse‑ och svarsrutor innan de används.
- Metodyta: Gateway annonserar de stödda
methodsocheventsihello-ok.
Exempel på ramar
Anslut (första meddelandet):Minimal klient (Node.js)
Minsta användbara flöde: anslut + hälsa.Genomgånget exempel: lägg till en metod från början till slut
Exempel: lägg till en nysystem.echo‑request som returnerar { ok: true, text }.
- Schema (sanningskälla)
src/gateway/protocol/schema.ts:
ProtocolSchemas och exportera typer:
- Validering
src/gateway/protocol/index.ts, exportera en AJV‑validerare:
- Serverbeteende
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (slår redan samman systemHandlers),
lägg sedan till "system.echo" i METHODS i src/gateway/server.ts.
- Regenerera
- Tester + dokumentation
src/gateway/server.*.test.ts och notera metoden i dokumentationen.
Swift‑codegen‑beteende
Swift‑generatorn emitterar:GatewayFrame‑enum medreq,res,eventochunknown‑fall- Starkt typade payload‑structs/enums
ErrorCode‑värden ochGATEWAY_PROTOCOL_VERSION
Versionering + kompatibilitet
PROTOCOL_VERSIONfinns isrc/gateway/protocol/schema.ts.- Klienter skickar
minProtocol+maxProtocol; servern avvisar mismatchar. - Swift‑modellerna behåller okända ramtyper för att undvika att äldre klienter bryts.
Schemamönster och konventioner
- De flesta objekt använder
additionalProperties: falseför strikta payloads. NonEmptyStringär standard för ID:n och metod-/händelsenamn.- Den översta
GatewayFrameanvänder en discriminator påtype. - Metoder med sidoeffekter kräver vanligtvis en
idempotencyKeyi parametrarna (exempel:send,poll,agent,chat.send).
Live‑schema‑JSON
Genererad JSON Schema finns i repo pådist/protocol.schema.json. Den
publicerade rå filen är vanligtvis tillgänglig på:
När du ändrar scheman
- Uppdatera TypeBox‑schemana.
- Kör
pnpm protocol:check. - Committa det regenererade schemat + Swift‑modellerna.