プロトコルの信頼できる情報源としての TypeBox
最終更新日: 2026-01-10 TypeBox は TypeScript ファーストのスキーマライブラリです。私たちはこれを使用して Gateway WebSocket プロトコル(ハンドシェイク、リクエスト/レスポンス、サーバーイベント)を定義しています。これらのスキーマは ランタイム検証、JSON Schema のエクスポート、および macOS アプリ向けの Swift コード生成 を駆動します。単一の信頼できる情報源があり、その他はすべて生成されます。 Gateway WebSocket プロトコル (ハンドシェイク、リクエスト、レスポンス、サーバーイベント) を定義します。 これらのスキーマ はmacOSアプリのランタイム検証、JSONスキーマエクスポート、Swiftコードを ドライブします。 真実の一つの源;他のすべてが生成されます。 Gateway WebSocket プロトコル (ハンドシェイク、リクエスト、レスポンス、サーバーイベント) を定義します。 これらのスキーマ はmacOSアプリのランタイム検証、JSONスキーマエクスポート、Swiftコードを ドライブします。 真実の一つの源;他のすべてが生成されます。 より高レベルのプロトコルの文脈を知りたい場合は、Gateway アーキテクチャ から始めてください。メンタルモデル(30 秒)
すべての Gateway WS メッセージは、次の 3 種類のフレームのいずれかです。- リクエスト:
{ type: "req", id, method, params } - レスポンス:
{ type: "res", id, ok, payload | error } - イベント:
{ type: "event", event, payload, seq?, stateVersion? }
connect リクエストでなければなりません。 最初のフレームは connect リクエストでなければなりません。 その後、クライアントは
メソッド(例: health, send, chat.send)を呼び出し、イベント(例:
presence, tick, agent)を購読することができます。
接続フロー(最小):
| カテゴリ | 例 | Notes |
|---|---|---|
| コア | connect, health, status | connect が最初である必要があります |
| メッセージング | send, poll, agent, agent.wait | 副作用には idempotencyKey が必要です |
| Chat | 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 | サーバープッシュ |
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 で検証されます。ハンドシェイクは、params が
ConnectParamsに一致するconnectリクエストのみを受け付けます。 ハンドシェイクのみ は、パラメータがConnectParamsにマッチするconnectリクエストを受け付けます。 - クライアント側: JS クライアントは、イベントおよびレスポンスフレームを使用前に検証します。
- メソッドサーフェス: Gateway は、サポートされている
methodsとeventsをhello-okで通知します。
フレームの例
接続(最初のメッセージ):最小クライアント(Node.js)
最小で有用なフロー: 接続 + ヘルス。実践例: メソッドをエンドツーエンドで追加する
例: 新しい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 をマージしています)。
その後、src/gateway/server.ts の METHODS に "system.echo" を追加します。
- 再生成
- テスト + ドキュメント
src/gateway/server.*.test.ts にサーバーテストを追加し、ドキュメントにメソッドを記載します。
Swift コード生成の挙動
Swift ジェネレーターは次を出力します:req,res,event,unknownのケースを持つGatewayFrameenum- 強く型付けされたペイロードの struct / enum
ErrorCodeの値とGATEWAY_PROTOCOL_VERSION
バージョニング + 互換性
PROTOCOL_VERSIONはsrc/gateway/protocol/schema.tsにあります。- クライアントは
minProtocol+maxProtocolを送信し、サーバーは不一致を拒否します。 - Swift モデルは、古いクライアントを破壊しないように未知のフレームタイプを保持します。
スキーマのパターンと規約
- ほとんどのオブジェクトは、厳密なペイロードのために
additionalProperties: falseを使用します。 - ID やメソッド/イベント名のデフォルトは
NonEmptyStringです。 - トップレベルの
GatewayFrameは、typeに discriminator を使用します。 - 副作用を伴うメソッドは、通常 params に
idempotencyKeyを必要とします (例:send,poll,agent,chat.send)。
ライブスキーマ JSON
生成された JSON Schema は、リポジトリ内のdist/protocol.schema.json にあります。
公開されている raw ファイルは、通常次の場所で利用できます:
公開された生ファイルは通常、以下で利用できます:
公開された生ファイルは通常、以下で利用できます:
スキーマを変更する場合
- TypeBox スキーマを更新します。
pnpm protocol:checkを実行します。- 再生成されたスキーマと Swift モデルをコミットします。