プロトコルの単一の信頼できる情報源としてのTypeBox
最終更新: 2026-01-10 TypeBoxはTypeScriptファーストのスキーマライブラリです。私たちはこれを使って、Gateway WebSocketプロトコル(ハンドシェイク、リクエスト/レスポンス、サーバーイベント)を定義しています。これらのスキーマは、 ランタイム検証、JSON Schemaエクスポート、およびmacOS app向けのSwiftコード生成を駆動します。 単一の信頼できる情報源があり、その他はすべて生成されます。 より高レベルなプロトコルの文脈を知りたい場合は、まず Gateway architecture から始めてください。メンタルモデル(30秒)
すべてのGateway WSメッセージは、次の3種類のフレームのいずれかです。- Request:
{ type: "req", id, method, params } - Response:
{ type: "res", id, ok, payload | error } - Event:
{ type: "event", event, payload, seq?, stateVersion? }
connect リクエストでなければなりません。その後、クライアントは
メソッド(例: health, send, chat.send)を呼び出し、イベント(例:
presence, tick, agent)を購読できます。
接続フロー(最小):
| Category | Examples | Notes |
|---|---|---|
| Core | connect, health, status | connect must be first |
| Messaging | send, agent, agent.wait, system-event, logs.tail | side-effects need idempotencyKey |
| Chat | chat.history, chat.send, chat.abort | WebChat uses these |
| Sessions | sessions.list, sessions.patch, sessions.delete | session admin |
| Automation | wake, cron.list, cron.run, cron.runs | wake + cron control |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + node actions |
| Events | tick, presence, agent, chat, health, shutdown | server push |
src/gateway/server-methods-list.ts(listGatewayMethods, GATEWAY_EVENTS)にあります。
スキーマの配置場所
- ソース:
src/gateway/protocol/schema.ts - ランタイムバリデーター(AJV):
src/gateway/protocol/index.ts - 公開される機能/discoveryレジストリ:
src/gateway/server-methods-list.ts - サーバーハンドシェイク + メソッドディスパッチ:
src/gateway/server.impl.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リクエストだけを受け付けます。 - クライアント側: JSクライアントは、イベントフレームとレスポンスフレームを 使用前に検証します。
- 機能discovery: Gatewayは、保守的な
features.methodsとfeatures.eventsの一覧をhello-ok内でlistGatewayMethods()とGATEWAY_EVENTSから送信します。 - このdiscovery一覧は、
coreGatewayHandlers内の呼び出し可能なすべてのヘルパーを生成したダンプではありません。一部のヘルパーRPCはsrc/gateway/server-methods/*.tsに実装されていますが、公開される feature一覧には列挙されていません。
フレーム例
Connect(最初のメッセージ):最小クライアント(Node.js)
最小限で有用なフローは、connect + healthです。実例: メソッドをエンドツーエンドで追加する
例:{ ok: true, text } を返す新しい system.echo リクエストを追加します。
- スキーマ(単一の信頼できる情報源)
src/gateway/protocol/schema.ts に追加します:
ProtocolSchemas に追加し、型をエクスポートします:
- 検証
src/gateway/protocol/index.ts で、AJVバリデーターをエクスポートします:
- サーバー動作
src/gateway/server-methods/system.ts にハンドラーを追加します:
src/gateway/server-methods.ts に登録し(ここではすでに systemHandlers がマージされています)、
その後 "system.echo" を
src/gateway/server-methods-list.ts の listGatewayMethods 入力に追加します。
このメソッドがoperatorまたはnodeクライアントから呼び出し可能である場合は、
スコープ強制と hello-ok のfeature公開が一致したままになるように、
src/gateway/method-scopes.ts でも分類してください。
- 再生成
- テスト + ドキュメント
src/gateway/server.*.test.ts にサーバーテストを追加し、ドキュメントにそのメソッドを記載します。
Swiftコード生成の動作
Swiftジェネレーターは次を出力します。req,res,event,unknownケースを持つGatewayFrameenum- 強く型付けされたpayload struct/enum
ErrorCode値とGATEWAY_PROTOCOL_VERSION
バージョニング + 互換性
PROTOCOL_VERSIONはsrc/gateway/protocol/schema.tsにあります。- クライアントは
minProtocol+maxProtocolを送信し、サーバーは不一致を拒否します。 - Swiftモデルは、古いクライアントを壊さないように未知のフレーム型を保持します。
スキーマパターンと規約
- ほとんどのオブジェクトでは、厳密なpayloadにするため
additionalProperties: falseを使います。 NonEmptyStringは、IDおよびメソッド/イベント名のデフォルトです。- トップレベルの
GatewayFrameは、type上のdiscriminatorを使用します。 - 副作用を持つメソッドでは、通常params内に
idempotencyKeyが必要です (例:send,poll,agent,chat.send)。 agentは、ランタイム生成のオーケストレーションコンテキスト向けに 任意のinternalEventsを受け付けます (例: subagent/cronタスク完了の引き継ぎ)。これは内部APIサーフェスとして扱ってください。
ライブスキーマJSON
生成されたJSON Schemaは、repo内のdist/protocol.schema.json にあります。
公開される生ファイルは通常、次の場所で利用できます:
スキーマを変更するとき
- TypeBoxスキーマを更新します。
- メソッド/イベントを
src/gateway/server-methods-list.tsに登録します。 - 新しいRPCにoperatorまたは
nodeスコープ分類が必要な場合は
src/gateway/method-scopes.tsを更新します。 pnpm protocol:checkを実行します。- 再生成されたschema + Swiftモデルをコミットします。