TypeBox jako źródło prawdy protokołu
Ostatnia aktualizacja: 2026-01-10 TypeBox to biblioteka schematów stworzona z myślą o TypeScript. Używamy jej do definiowania protokołu WebSocket Gateway (handshake, request/response, zdarzenia serwera). Te schematy napędzają walidację w runtime, eksport JSON Schema oraz Swift codegen dla aplikacji macOS. Jedno źródło prawdy; wszystko inne jest generowane. Jeśli chcesz zacząć od kontekstu protokołu na wyższym poziomie, zacznij od Gateway architecture.Model mentalny (30 sekund)
Każda wiadomość Gateway WS 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. Po tym klienci mogą wywoływać
metody (na przykład health, send, chat.send) i subskrybować zdarzenia (na przykład
presence, tick, agent).
Przepływ połączenia (minimalny):
| Kategoria | Przykłady | Uwagi |
|---|---|---|
| Podstawowe | connect, health, status | connect musi być pierwsze |
| Wiadomości | send, agent, agent.wait, system-event, logs.tail | efekty uboczne wymagają idempotencyKey |
| Czat | chat.history, chat.send, chat.abort | WebChat ich używa |
| Sesje | sessions.list, sessions.patch, sessions.delete | administracja sesjami |
| Automatyzacja | wake, cron.list, cron.run, cron.runs | sterowanie wake + cron |
| Węzły | node.list, node.invoke, node.pair.* | Gateway WS + działania węzłów |
| Zdarzenia | tick, presence, agent, chat, health, shutdown | push serwera |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Gdzie znajdują się schematy
- Źródło:
src/gateway/protocol/schema.ts - Walidatory runtime (AJV):
src/gateway/protocol/index.ts - Rejestr reklamowanych funkcji/discovery:
src/gateway/server-methods-list.ts - Handshake serwera + dyspozycja metod:
src/gateway/server.impl.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
Obecny 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 sprawdza, czy wynik został zapisany w commicie
Jak schematy są używane w runtime
- Po stronie serwera: każda przychodząca ramka jest walidowana przez AJV. Handshake
akceptuje tylko request
connect, którego params pasują doConnectParams. - Po stronie klienta: klient JS waliduje ramki zdarzeń i odpowiedzi przed ich użyciem.
- Discovery funkcji: Gateway wysyła zachowawczą listę
features.methodsifeatures.eventswhello-okzlistGatewayMethods()iGATEWAY_EVENTS. - Ta lista discovery nie jest wygenerowanym zrzutem każdego pomocniczego wywołania
dostępnego w
coreGatewayHandlers; niektóre pomocnicze RPC są implementowane wsrc/gateway/server-methods/*.ts, ale nie są wyliczane na reklamowanej liście funkcji.
Przykładowe ramki
Connect (pierwsza wiadomość):Minimalny klient (Node.js)
Najmniejszy użyteczny przepływ: connect + health.Przykład krok po kroku: dodanie metody end-to-end
Przykład: dodaj nowy requestsystem.echo, który 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 wejścia listGatewayMethods w
src/gateway/server-methods-list.ts.
Jeśli metoda ma być wywoływalna przez klientów operatora lub węzła, sklasyfikuj ją też w
src/gateway/method-scopes.ts, aby egzekwowanie zakresów i reklamowanie funkcji w hello-ok
pozostały spójne.
- Wygeneruj ponownie
- Testy + dokumentacja
src/gateway/server.*.test.ts i opisz metodę w dokumentacji.
Zachowanie Swift codegen
Generator Swift emituje:- enum
GatewayFramez przypadkamireq,res,eventiunknown - silnie typowane struktury/enumeracje ładunków
- wartości
ErrorCodeorazGATEWAY_PROTOCOL_VERSION
Wersjonowanie + zgodność
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 psuć starszych klientów.
Wzorce i konwencje schematów
- Większość obiektów używa
additionalProperties: falsedla ścisłych ładunków. NonEmptyStringto domyślny wybór dla ID oraz nazw metod/zdarzeń.- Top-level
GatewayFrameużywa dyskryminatora natype. - Metody z efektami ubocznymi zwykle wymagają
idempotencyKeyw params (na przykładsend,poll,agent,chat.send). agentakceptuje opcjonalneinternalEventsdla kontekstu orkiestracji generowanego w runtime (na przykład przekazanie ukończenia zadania subagent/cron); traktuj to jako wewnętrzną powierzchnię API.
Aktywny JSON schematu
Wygenerowany JSON Schema znajduje się w repozytorium poddist/protocol.schema.json. Opublikowany
surowy plik jest zwykle dostępny pod adresem:
Gdy zmieniasz schematy
- Zaktualizuj schematy TypeBox.
- Zarejestruj metodę/zdarzenie w
src/gateway/server-methods-list.ts. - Zaktualizuj
src/gateway/method-scopes.ts, gdy nowe RPC wymaga klasyfikacji zakresu operatora lub węzła. - Uruchom
pnpm protocol:check. - Zacommituj ponownie wygenerowany schemat + modele Swift.