Skip to main content
TypeBox — це бібліотека схем, орієнтована насамперед на TypeScript. OpenClaw використовує її для визначення протоколу WebSocket Gateway (рукостискання, запити/відповіді, події сервера). Ці схеми забезпечують перевірку під час виконання (AJV), експорт 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-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).

Де розташовані схеми

  • Вихідний barrel-файл: packages/gateway-protocol/src/schema.ts повторно експортує доменні модулі з packages/gateway-protocol/src/schema/*.ts (frames.ts для конвертів верхнього рівня та рукостискання, agent.ts, sessions.ts, cron.ts тощо — відповідно до функціональної області). protocol-schemas.ts — центральний реєстр ProtocolSchemas, який зіставляє назви схем з їхніми визначеннями TypeBox.
  • Валідатори часу виконання (AJV): packages/gateway-protocol/src/index.ts
  • Рекламований реєстр функцій/виявлення можливостей: src/gateway/server-methods-list.ts
  • Серверне рукостискання та диспетчеризація методів: src/gateway/server.impl.ts
  • Клієнт вузла: src/gateway/client.ts
  • Згенерована JSON Schema: dist/protocol.schema.json (результат збирання, не додається до репозиторію)
  • Згенеровані моделі Swift: apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift

Поточний конвеєр

  • pnpm protocol:gen записує JSON Schema (draft-07) у dist/protocol.schema.json.
  • pnpm protocol:gen:swift генерує моделі Gateway для Swift.
  • pnpm protocol:check запускає обидва генератори й перевіряє, що результат для Swift додано до репозиторію (результат JSON Schema є ігнорованим Git артефактом збирання).

Як схеми використовуються під час виконання

  • На стороні сервера: кожен вхідний фрейм перевіряється за допомогою AJV. Рукостискання приймає лише запит connect, параметри якого відповідають ConnectParams.
  • На стороні клієнта: клієнт JS перевіряє фрейми подій і відповідей перед їх використанням.
  • Виявлення можливостей: Gateway надсилає консервативні списки features.methods і features.events у hello-ok, отримані з listGatewayMethods() і GATEWAY_EVENTS.
  • Цей список виявлення можливостей не є згенерованим переліком усіх доступних для виклику допоміжних функцій у coreGatewayHandlers; деякі допоміжні RPC реалізовано в src/gateway/server-methods/*.ts, але їх не перелічено в рекламованому списку функцій.

Приклади фреймів

Підключення (перше повідомлення):
Відповідь hello-ok:
Запит і відповідь:
Подія:

Мінімальний клієнт (Node.js)

Найменший корисний потік: підключення + перевірка стану.

Практичний приклад: наскрізне додавання методу

Приклад: додайте новий запит system.echo, який повертає { ok: true, text }.
  1. Схема (джерело істини)
Додайте до packages/gateway-protocol/src/schema/system.ts (або найближчого відповідного функціонального модуля):
Імпортуйте обидві схеми до packages/gateway-protocol/src/schema/protocol-schemas.ts, додайте їх до реєстру ProtocolSchemas і експортуйте похідні типи:
  1. Перевірка
У packages/gateway-protocol/src/index.ts експортуйте валідатор AJV:
  1. Поведінка сервера
Додайте обробник у src/gateway/server-methods/system.ts:
Зареєструйте його в src/gateway/server-methods.ts (цей файл уже об’єднує systemHandlers), а потім додайте "system.echo" до вхідного списку listGatewayMethods у src/gateway/server-methods-list.ts. Якщо метод можуть викликати клієнти оператора або вузла, також класифікуйте його в src/gateway/method-scopes.ts, щоб застосування областей доступу й рекламування функцій у hello-ok залишалися узгодженими.
  1. Повторне генерування
  1. Тести та документація
Додайте серверний тест у src/gateway/server.*.test.ts і зазначте метод у документації.

Поведінка генерування коду Swift

Генератор Swift створює:
  • перелік GatewayFrame з варіантами req, res, event і unknown
  • строго типізовані структури/переліки корисного навантаження
  • значення ErrorCode, GATEWAY_PROTOCOL_VERSION і GATEWAY_MIN_PROTOCOL_VERSION
Невідомі типи фреймів зберігаються як необроблені корисні навантаження для прямої сумісності.

Версіонування та сумісність

  • PROTOCOL_VERSION міститься в packages/gateway-protocol/src/version.ts (поточне значення: 4).
  • Клієнти надсилають minProtocol і maxProtocol; сервер відхиляє діапазони, які не містять його поточної версії протоколу.
  • Моделі Swift зберігають невідомі типи фреймів, щоб не порушувати роботу старіших клієнтів.

Шаблони та угоди схем

  • Більшість об’єктів використовують additionalProperties: false для строгих корисних навантажень.
  • NonEmptyString (Type.String({ minLength: 1 })) використовується типово для ідентифікаторів і назв методів/подій.
  • GatewayFrame верхнього рівня використовує дискримінатор за полем type.
  • Методи з побічними ефектами зазвичай вимагають idempotencyKey у параметрах (наприклад: send, poll, agent, chat.send).
  • agent приймає необов’язковий параметр internalEvents для згенерованого під час виконання контексту оркестрації (наприклад, передавання результату завершення завдання субагента/Cron); вважайте це внутрішньою поверхнею API.

Актуальна JSON-схема

Згенерована JSON Schema є артефактом збирання й не додається до репозиторію. Опублікований необроблений файл зазвичай доступний за адресою:

Коли ви змінюєте схеми

  1. Оновіть схеми TypeBox у відповідному модулі packages/gateway-protocol/src/schema/*.ts і зареєструйте їх у protocol-schemas.ts.
  2. Зареєструйте метод/подію в src/gateway/server-methods-list.ts.
  3. Оновіть src/gateway/method-scopes.ts, якщо новому RPC потрібна класифікація області доступу оператора або вузла.
  4. Виконайте pnpm protocol:check.
  5. Додайте повторно згенеровані моделі Swift до коміту.

Пов’язане