メンタルモデル(30 秒)
すべての Gateway WS メッセージは、次の 3 種類のフレームのいずれかです。- リクエスト:
{ 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)にあります。
スキーマの配置場所
- ソースバレル:
packages/gateway-protocol/src/schema.tsは、packages/gateway-protocol/src/schema/*.ts配下のドメインモジュール(トップレベルのエンベロープとハンドシェイク用のframes.ts、機能領域ごとのagent.ts、sessions.ts、cron.tsなど)を再エクスポートします。protocol-schemas.tsは、スキーマ名を対応する TypeBox 定義にマッピングする中央のProtocolSchemasレジストリです。 - ランタイムバリデーター(AJV):
packages/gateway-protocol/src/index.ts - 公開される機能/検出レジストリ:
src/gateway/server-methods-list.ts - サーバーのハンドシェイクとメソッドディスパッチ:
src/gateway/server.impl.ts - Node クライアント:
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は、Swift Gateway モデルを生成します。pnpm protocol:checkは両方のジェネレーターを実行し、Swift 出力がコミットされていることを検証します(JSON Schema 出力は gitignore 対象のビルド成果物です)。
ランタイムでのスキーマの使用方法
- サーバー側: すべての受信フレームは AJV で検証されます。ハンドシェイクは、パラメーターが
ConnectParamsに一致するconnectリクエストのみを受け付けます。 - クライアント側: JS クライアントは、イベントおよびレスポンスフレームを使用する前に検証します。
- 機能検出: Gateway は、
listGatewayMethods()およびGATEWAY_EVENTSに基づく保守的なfeatures.methodsとfeatures.eventsのリストをhello-okで送信します。 - この検出リストは、
coreGatewayHandlers内の呼び出し可能なすべてのヘルパーを生成して列挙したものではありません。一部のヘルパー RPC は、公開される機能リストに列挙されることなくsrc/gateway/server-methods/*.tsに実装されています。
フレームの例
接続(最初のメッセージ):最小クライアント(Node.js)
実用上最小のフロー: 接続 + ヘルスチェック。実例: メソッドをエンドツーエンドで追加する
例:{ ok: true, text } を返す新しい system.echo リクエストを追加します。
- スキーマ(信頼できる唯一の情報源)
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 をマージしています)に登録してから、src/gateway/server-methods-list.ts 内の listGatewayMethods 入力に "system.echo" を追加します。
オペレーターまたは Node クライアントから呼び出せるメソッドの場合は、スコープの適用と hello-ok の機能公開が一致するように、src/gateway/method-scopes.ts でも分類します。
- 再生成
- テストとドキュメント
src/gateway/server.*.test.ts にサーバーテストを追加し、ドキュメントにメソッドを記載します。
Swift コード生成の動作
Swift ジェネレーターは次を出力します。req、res、event、unknownのケースを持つGatewayFrameenum- 厳密に型付けされたペイロードの struct/enum
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 }))は、ID およびメソッド/イベント名のデフォルトです。- トップレベルの
GatewayFrameは、typeに判別子を使用します。 - 副作用のあるメソッドでは通常、params に
idempotencyKeyが必要です(例:send、poll、agent、chat.send)。 agentは、ランタイムで生成されるオーケストレーションコンテキスト(たとえばサブエージェント/Cron タスク完了時の引き継ぎ)のために、オプションのinternalEventsを受け付けます。これは内部 API サーフェスとして扱ってください。
ライブスキーマ JSON
生成された JSON Schema はビルド成果物であり、リポジトリにはコミットされません。公開された raw ファイルは通常、次の場所で利用できます。スキーマを変更する場合
- 所有元の
packages/gateway-protocol/src/schema/*.tsモジュール内の TypeBox スキーマを更新し、protocol-schemas.tsに登録します。 - メソッド/イベントを
src/gateway/server-methods-list.tsに登録します。 - 新しい RPC にオペレーターまたは Node のスコープ分類が必要な場合は、
src/gateway/method-scopes.tsを更新します。 pnpm protocol:checkを実行します。- 再生成された Swift モデルをコミットします。