TypeBox как источник истины протокола
Последнее обновление: 2026-01-10 TypeBox — это библиотека схем с приоритетом TypeScript. Мы используем её для определения протокола Gateway WebSocket (рукопожатие, запрос/ответ, серверные события). Эти схемы управляют валидацией во время выполнения, экспортом JSON Schema и генерацией Swift-кода для приложения macOS. Один источник истины; всё остальное генерируется. Если нужен более высокоуровневый контекст протокола, начните с архитектуры Gateway.Ментальная модель (30 секунд)
Каждое WS‑сообщение Gateway — это один из трёх фреймов:- Запрос:
{ type: "req", id, method, params } - Ответ:
{ type: "res", id, ok, payload | error } - Событие:
{ type: "event", event, payload, seq?, stateVersion? }
connect. После этого клиенты могут вызывать
методы (например, health, send, chat.send) и подписываться на события (например,
presence, tick, agent).
Поток подключения (минимальный):
| Категория | Примеры | Примечания |
|---|---|---|
| Core | connect, health, status | connect должен быть первым |
| Обмен сообщениями | send, poll, agent, agent.wait | побочные эффекты требуют idempotencyKey |
| Чат | chat.history, chat.send, chat.abort, chat.inject | WebChat использует их |
| Sessions | sessions.list, sessions.patch, sessions.delete | администрирование сеансов |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + действия узлов |
| Events | tick, presence, agent, chat, health, shutdown | push от сервера |
src/gateway/server.ts (METHODS, EVENTS).
Где живут схемы
- Исходники:
src/gateway/protocol/schema.ts - Валидаторы во время выполнения (AJV):
src/gateway/protocol/index.ts - Рукопожатие сервера + диспетчеризация методов:
src/gateway/server.ts - Клиент узла:
src/gateway/client.ts - Сгенерированная JSON Schema:
dist/protocol.schema.json - Сгенерированные Swift‑модели:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Текущий трубопровод
pnpm protocol:gen- записывает JSON Schema (draft‑07) в
dist/protocol.schema.json
- записывает JSON Schema (draft‑07) в
pnpm protocol:gen:swift- генерирует Swift‑модели Gateway
pnpm protocol:check- запускает оба генератора и проверяет, что результат закоммичен
Как схемы используются во время выполнения
- Со стороны сервера: каждый входящий фрейм валидируется AJV. Рукопожатие принимает
только запрос
connect, параметры которого соответствуютConnectParams. - Со стороны клиента: JS‑клиент валидирует фреймы событий и ответов перед их использованием.
- Поверхность методов: Gateway объявляет поддерживаемые
methodsиeventsвhello-ok.
Примеры фреймов
Подключение (первое сообщение):Минимальный клиент (Node.js)
Минимально полезный поток: подключение + health.Проработанный пример: добавление метода end‑to‑end
Пример: добавить новый запросsystem.echo, который возвращает { ok: true, text }.
- Схема (источник истины)
src/gateway/protocol/schema.ts:
ProtocolSchemas и экспортируйте типы:
- Валидация
src/gateway/protocol/index.ts экспортируйте валидатор AJV:
- Поведение сервера
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (уже объединяет systemHandlers),
затем добавьте "system.echo" в METHODS в src/gateway/server.ts.
- Перегенерация
- Тесты и документация
src/gateway/server.*.test.ts и отметьте метод в документации.
Поведение Swift‑codegen
Генератор Swift создаёт:- enum
GatewayFrameс кейсамиreq,res,eventиunknown - Строго типизированные структуры/enum для полезной нагрузки
- Значения
ErrorCodeиGATEWAY_PROTOCOL_VERSION
Версионирование и совместимость
PROTOCOL_VERSIONживёт вsrc/gateway/protocol/schema.ts.- Клиенты отправляют
minProtocol+maxProtocol; сервер отклоняет несовпадения. - Swift‑модели сохраняют неизвестные типы фреймов, чтобы не ломать старые клиенты.
Шаблоны схем и соглашения
- Большинство объектов используют
additionalProperties: falseдля строгих полезных нагрузок. NonEmptyStringиспользуется по умолчанию для ID и имён методов/событий.- Верхнеуровневый
GatewayFrameиспользует дискриминатор поtype. - Методы с побочными эффектами обычно требуют
idempotencyKeyв параметрах (пример:send,poll,agent,chat.send).
Живая JSON Schema
Сгенерированная JSON Schema находится в репозитории по адресуdist/protocol.schema.json. Опубликованный «сырой» файл обычно доступен по адресу:
Когда вы меняете схемы
- Обновите схемы TypeBox.
- Запустите
pnpm protocol:check. - Закоммитьте перегенерированную схему и Swift‑модели.