TypeBox jako źródło prawdy protokołu
Ostatnia aktualizacja: 2026-01-10 TypeBox to biblioteka schematów zorientowana na TypeScript. Używamy jej do definiowania protokołu WebSocket Gateway (handshake, żądania/odpowiedzi, zdarzenia serwera). Te schematy napędzają walidację w czasie działania, eksport JSON Schema oraz generowanie kodu Swift dla aplikacji macOS. Jedno źródło prawdy; cała reszta jest generowana. Jeśli potrzebujesz szerszego kontekstu protokołu, zacznij od Gateway architecture.Model mentalny (30 sekund)
Każda wiadomość WS Gateway jest jedną z trzech ramek:- Request:
{ type: "req", id, method, params } - Response:
{ type: "res", id, ok, payload | error } - Event:
{ type: "event", event, payload, seq?, stateVersion? }
connect. Następnie klienci mogą wywoływać
metody (np. health, send, chat.send) oraz subskrybować zdarzenia (np.
presence, tick, agent).
Przepływ połączenia (minimalny):
| Kategoria | Przykłady | Uwagi |
|---|---|---|
| Core | connect, health, status | connect musi być pierwsze |
| Komunikacja | send, poll, agent, agent.wait | efekty uboczne wymagają idempotencyKey |
| Czat | chat.history, chat.send, chat.abort, chat.inject | WebChat korzysta z nich |
| Sessions | sessions.list, sessions.patch, sessions.delete | administracja sesjami |
| Nodes | node.list, node.invoke, node.pair.* | WS Gateway + akcje węzłów |
| Events | tick, presence, agent, chat, health, shutdown | push serwera |
src/gateway/server.ts (METHODS, EVENTS).
Gdzie znajdują się schematy
- Źródło:
src/gateway/protocol/schema.ts - Walidatory runtime (AJV):
src/gateway/protocol/index.ts - Handshake serwera + dyspozycja metod:
src/gateway/server.ts - Klient węzła:
src/gateway/client.ts - Wygenerowany JSON Schema:
dist/protocol.schema.json - Wygenerowane modele Swift:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Aktualny pipeline
pnpm protocol:gen- zapisuje JSON Schema (draft‑07) do
dist/protocol.schema.json
- zapisuje JSON Schema (draft‑07) do
pnpm protocol:gen:swift- generuje modele Gateway w Swift
pnpm protocol:check- uruchamia oba generatory i weryfikuje, że wynik jest zatwierdzony w repozytorium
Jak schematy są używane w czasie działania
- Po stronie serwera: każda przychodząca ramka jest walidowana przez AJV. Handshake
akceptuje wyłącznie żądanie
connect, którego parametry pasują doConnectParams. - Po stronie klienta: klient JS waliduje ramki zdarzeń i odpowiedzi przed ich użyciem.
- Powierzchnia metod: Gateway ogłasza obsługiwane
methodsorazeventswhello-ok.
Przykładowe ramki
Połączenie (pierwsza wiadomość):Minimalny klient (Node.js)
Najmniejszy użyteczny przepływ: połączenie + health.Przykład krok po kroku: dodanie metody end‑to‑end
Przykład: dodanie nowego żądaniasystem.echo, które zwraca { ok: true, text }.
- Schemat (źródło prawdy)
src/gateway/protocol/schema.ts:
ProtocolSchemas i wyeksportuj typy:
- Walidacja
src/gateway/protocol/index.ts wyeksportuj walidator AJV:
- Zachowanie serwera
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (już scala systemHandlers),
a następnie dodaj "system.echo" do METHODS w src/gateway/server.ts.
- Regeneracja
- Testy + dokumentacja
src/gateway/server.*.test.ts i odnotuj metodę w dokumentacji.
Zachowanie generowania kodu Swift
Generator Swift emituje:- Enum
GatewayFramez przypadkamireq,res,eventorazunknown - Silnie typowane struktury/enumy payloadów
- Wartości
ErrorCodeorazGATEWAY_PROTOCOL_VERSION
Versioning + compatibility
PROTOCOL_VERSIONznajduje się wsrc/gateway/protocol/schema.ts.- Klienci wysyłają
minProtocol+maxProtocol; serwer odrzuca niezgodności. - Modele Swift zachowują nieznane typy ramek, aby nie łamać starszych klientów.
Wzorce i konwencje schematów
- Większość obiektów używa
additionalProperties: falsedla ścisłych payloadów. NonEmptyStringjest domyślne dla identyfikatorów oraz nazw metod/zdarzeń.- Najwyższego poziomu
GatewayFrameużywa dyskryminatora natype. - Metody z efektami ubocznymi zwykle wymagają
idempotencyKeyw parametrach (przykład:send,poll,agent,chat.send).
Aktywny JSON schematu
Wygenerowany JSON Schema znajduje się w repozytorium poddist/protocol.schema.json. Opublikowany
surowy plik jest zazwyczaj dostępny pod:
Gdy zmieniasz schematy
- Zaktualizuj schematy TypeBox.
- Uruchom
pnpm protocol:check. - Zatwierdź zregenerowany schemat oraz modele Swift.