Skip to main content

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? }
Den första ramen måste vara en 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):
Vanliga metoder + händelser: Den auktoritativa listan finns i 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
  • 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 matchar ConnectParams.
  • Klientsidan: JS‑klienten validerar händelse‑ och svarsrutor innan de används.
  • Metodyta: Gateway annonserar de stödda methods och events i hello-ok.

Exempel på ramar

Anslut (första meddelandet):
Hello‑ok‑svar:
Request + response:
Event:

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 ny system.echo‑request som returnerar { ok: true, text }.
  1. Schema (sanningskälla)
Lägg till i src/gateway/protocol/schema.ts:
Lägg till båda i ProtocolSchemas och exportera typer:
  1. Validering
I src/gateway/protocol/index.ts, exportera en AJV‑validerare:
  1. Serverbeteende
Lägg till en handler i src/gateway/server-methods/system.ts:
Registrera den i src/gateway/server-methods.ts (slår redan samman systemHandlers), lägg sedan till "system.echo" i METHODS i src/gateway/server.ts.
  1. Regenerera
  1. Tester + dokumentation
Lägg till ett servertest i src/gateway/server.*.test.ts och notera metoden i dokumentationen.

Swift‑codegen‑beteende

Swift‑generatorn emitterar:
  • GatewayFrame‑enum med req, res, event och unknown‑fall
  • Starkt typade payload‑structs/enums
  • ErrorCode‑värden och GATEWAY_PROTOCOL_VERSION
Okända ramtyper bevaras som råa payloads för framåtkompatibilitet.

Versionering + kompatibilitet

  • PROTOCOL_VERSION finns i src/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: false för strikta payloads.
  • NonEmptyString är standard för ID:n och metod-/händelsenamn.
  • Den översta GatewayFrame använder en discriminatortype.
  • Metoder med sidoeffekter kräver vanligtvis en idempotencyKey i 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

  1. Uppdatera TypeBox‑schemana.
  2. Kör pnpm protocol:check.
  3. Committa det regenererade schemat + Swift‑modellerna.