Ментальна модель (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, але їх не перелічено в рекламованому списку функцій.
Приклади фреймів
Підключення (перше повідомлення):Мінімальний клієнт (Node.js)
Найменший корисний потік: підключення + перевірка стану.Практичний приклад: наскрізне додавання методу
Приклад: додайте новий запитsystem.echo, який повертає { ok: true, text }.
- Схема (джерело істини)
packages/gateway-protocol/src/schema/system.ts (або найближчого відповідного функціонального модуля):
packages/gateway-protocol/src/schema/protocol-schemas.ts, додайте їх до реєстру ProtocolSchemas і експортуйте похідні типи:
- Перевірка
packages/gateway-protocol/src/index.ts експортуйте валідатор AJV:
- Поведінка сервера
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 залишалися узгодженими.
- Повторне генерування
- Тести та документація
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 є артефактом збирання й не додається до репозиторію. Опублікований необроблений файл зазвичай доступний за адресою:Коли ви змінюєте схеми
- Оновіть схеми TypeBox у відповідному модулі
packages/gateway-protocol/src/schema/*.tsі зареєструйте їх уprotocol-schemas.ts. - Зареєструйте метод/подію в
src/gateway/server-methods-list.ts. - Оновіть
src/gateway/method-scopes.ts, якщо новому RPC потрібна класифікація області доступу оператора або вузла. - Виконайте
pnpm protocol:check. - Додайте повторно згенеровані моделі Swift до коміту.