Skip to main content

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). Поток подключения (минимальный):
Общие методы и события: Авторитетный список находится в 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
  • pnpm protocol:gen:swift
    • генерирует Swift‑модели Gateway
  • pnpm protocol:check
    • запускает оба генератора и проверяет, что результат закоммичен

Как схемы используются во время выполнения

  • Со стороны сервера: каждый входящий фрейм валидируется AJV. Рукопожатие принимает только запрос connect, параметры которого соответствуют ConnectParams.
  • Со стороны клиента: JS‑клиент валидирует фреймы событий и ответов перед их использованием.
  • Поверхность методов: Gateway объявляет поддерживаемые methods и events в hello-ok.

Примеры фреймов

Подключение (первое сообщение):
Ответ hello‑ok:
Запрос + ответ:
Событие:

Минимальный клиент (Node.js)

Минимально полезный поток: подключение + health.

Проработанный пример: добавление метода end‑to‑end

Пример: добавить новый запрос system.echo, который возвращает { ok: true, text }.
  1. Схема (источник истины)
Добавьте в src/gateway/protocol/schema.ts:
Добавьте оба в ProtocolSchemas и экспортируйте типы:
  1. Валидация
В src/gateway/protocol/index.ts экспортируйте валидатор AJV:
  1. Поведение сервера
Добавьте обработчик в src/gateway/server-methods/system.ts:
Зарегистрируйте его в src/gateway/server-methods.ts (уже объединяет systemHandlers), затем добавьте "system.echo" в METHODS в src/gateway/server.ts.
  1. Перегенерация
  1. Тесты и документация
Добавьте серверный тест в 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. Опубликованный «сырой» файл обычно доступен по адресу:

Когда вы меняете схемы

  1. Обновите схемы TypeBox.
  2. Запустите pnpm protocol:check.
  3. Закоммитьте перегенерированную схему и Swift‑модели.