TypeBox як джерело істини для протоколу
Останнє оновлення: 2026-01-10 TypeBox — це бібліотека схем із підходом TypeScript-first. Ми використовуємо її для визначення протоколу Gateway WebSocket (handshake, request/response, server events). Ці схеми керують runtime validation, експортом JSON Schema і Swift codegen для застосунку macOS. Одне джерело істини; усе інше генерується. Якщо вам потрібен контекст протоколу на вищому рівні, почніть із Архітектура Gateway.Ментальна модель (30 секунд)
Кожне WS-повідомлення Gateway — це один із трьох frame:- Request:
{ type: "req", id, method, params } - Response:
{ type: "res", id, ok, payload | error } - Event:
{ type: "event", event, payload, seq?, stateVersion? }
connect. Після цього клієнти можуть викликати
methods (наприклад health, send, chat.send) і підписуватися на events (наприклад
presence, tick, agent).
Потік з’єднання (мінімальний):
| Категорія | Приклади | Примітки |
|---|---|---|
| Core | connect, health, status | connect має бути першим |
| Messaging | send, agent, agent.wait, system-event, logs.tail | для side-effects потрібен idempotencyKey |
| Chat | chat.history, chat.send, chat.abort | це використовує WebChat |
| Sessions | sessions.list, sessions.patch, sessions.delete | адміністрування сесій |
| Automation | wake, cron.list, cron.run, cron.runs | керування wake + cron |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + дії node |
| Events | tick, presence, agent, chat, health, shutdown | push від сервера |
src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).
Де живуть схеми
- Джерело:
src/gateway/protocol/schema.ts - Runtime validators (AJV):
src/gateway/protocol/index.ts - Advertised feature/discovery registry:
src/gateway/server-methods-list.ts - Server handshake + method dispatch:
src/gateway/server.impl.ts - Node client:
src/gateway/client.ts - Згенерована JSON Schema:
dist/protocol.schema.json - Згенеровані моделі Swift:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Поточний pipeline
pnpm protocol:gen- записує JSON Schema (draft‑07) до
dist/protocol.schema.json
- записує JSON Schema (draft‑07) до
pnpm protocol:gen:swift- генерує моделі gateway для Swift
pnpm protocol:check- запускає обидва генератори й перевіряє, що результат закомічено
Як схеми використовуються в runtime
- На боці сервера: кожен вхідний frame перевіряється через AJV. Handshake приймає лише
request
connect, у якого params відповідаютьConnectParams. - На боці клієнта: JS-клієнт перевіряє event і response frame перед використанням.
- Feature discovery: Gateway надсилає консервативний список
features.methodsіfeatures.eventsуhello-okзlistGatewayMethods()іGATEWAY_EVENTS. - Цей список discovery не є згенерованим дампом кожного callable helper у
coreGatewayHandlers; деякі helper RPC реалізовано вsrc/gateway/server-methods/*.ts, але вони не перераховані в advertised feature list.
Приклади frame
Connect (перше повідомлення):Мінімальний клієнт (Node.js)
Найменший корисний потік: connect + health.Повний приклад: додавання method end-to-end
Приклад: додайте новий requestsystem.echo, який повертає { ok: true, text }.
- Schema (джерело істини)
src/gateway/protocol/schema.ts:
ProtocolSchemas і експортуйте типи:
- Validation
src/gateway/protocol/index.ts експортуйте AJV validator:
- Поведінка сервера
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (там уже об’єднуються systemHandlers),
потім додайте "system.echo" до входу listGatewayMethods у
src/gateway/server-methods-list.ts.
Якщо method можна викликати клієнтам operator або node, також класифікуйте його в
src/gateway/method-scopes.ts, щоб перевірка scope і advertised feature у hello-ok
залишалися узгодженими.
- Повторна генерація
- Тести + документація
src/gateway/server.*.test.ts і згадайте method у документації.
Поведінка Swift codegen
Генератор Swift випускає:- enum
GatewayFrameіз casereq,res,eventіunknown - строго типізовані struct/enum для payload
- значення
ErrorCodeіGATEWAY_PROTOCOL_VERSION
Версіонування + сумісність
PROTOCOL_VERSIONрозміщено вsrc/gateway/protocol/schema.ts.- Клієнти надсилають
minProtocol+maxProtocol; сервер відхиляє невідповідності. - Моделі Swift зберігають невідомі типи frame, щоб не ламати старіших клієнтів.
Шаблони й конвенції схем
- Більшість об’єктів використовують
additionalProperties: falseдля строгих payload. NonEmptyString— типове значення для ID і назв method/event.- Верхньорівневий
GatewayFrameвикористовує discriminator за полемtype. - Methods із side effects зазвичай вимагають
idempotencyKeyу params (приклад:send,poll,agent,chat.send). agentприймає необов’язковіinternalEventsдля runtime-generated контексту оркестрації (наприклад передавання завершення завдання subagent/cron); вважайте це внутрішньою API-поверхнею.
Live schema JSON
Згенерована JSON Schema міститься в репозиторії за адресоюdist/protocol.schema.json. Опублікований
raw-файл зазвичай доступний за адресою:
Коли ви змінюєте схеми
- Оновіть схеми TypeBox.
- Зареєструйте method/event у
src/gateway/server-methods-list.ts. - Оновіть
src/gateway/method-scopes.ts, коли новому RPC потрібна класифікація scope для operator або node. - Виконайте
pnpm protocol:check. - Закомітьте повторно згенеровану schema + моделі Swift.