Skip to main content
TypeBox は TypeScript ファーストのスキーマライブラリです。OpenClaw はこれを使用して、Gateway WebSocket プロトコル(ハンドシェイク、リクエスト/レスポンス、サーバーイベント)を定義します。これらのスキーマは、ランタイム検証(AJV)、JSON Schema のエクスポート、および macOS アプリ向けの Swift コード生成を駆動します。信頼できる唯一の情報源であり、それ以外はすべて生成されます。 上位レベルのプロトコルのコンテキストについては、Gateway アーキテクチャから参照してください。

メンタルモデル(30 秒)

すべての Gateway WS メッセージは、次の 3 種類のフレームのいずれかです。
  • リクエスト: { type: "req", id, method, params }
  • レスポンス: { type: "res", id, ok, payload | error }
  • イベント: { type: "event", event, payload, seq?, stateVersion? }
最初のフレームは connect リクエストである必要があります。その後、クライアントはメソッド(例: healthsendchat.send)を呼び出し、イベント(例: presencetickagent)をサブスクライブします。 接続フロー(最小構成):
一般的なメソッドとイベント: 正式に公開される検出インベントリは、src/gateway/server-methods-list.tslistGatewayMethodsGATEWAY_EVENTS)にあります。

スキーマの配置場所

  • ソースバレル: packages/gateway-protocol/src/schema.ts は、packages/gateway-protocol/src/schema/*.ts 配下のドメインモジュール(トップレベルのエンベロープとハンドシェイク用の frames.ts、機能領域ごとの agent.tssessions.tscron.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.methodsfeatures.events のリストを hello-ok で送信します。
  • この検出リストは、coreGatewayHandlers 内の呼び出し可能なすべてのヘルパーを生成して列挙したものではありません。一部のヘルパー RPC は、公開される機能リストに列挙されることなく src/gateway/server-methods/*.ts に実装されています。

フレームの例

接続(最初のメッセージ):
hello-ok レスポンス:
リクエストとレスポンス:
イベント:

最小クライアント(Node.js)

実用上最小のフロー: 接続 + ヘルスチェック。

実例: メソッドをエンドツーエンドで追加する

例: { ok: true, text } を返す新しい system.echo リクエストを追加します。
  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 をマージしています)に登録してから、src/gateway/server-methods-list.ts 内の listGatewayMethods 入力に "system.echo" を追加します。 オペレーターまたは Node クライアントから呼び出せるメソッドの場合は、スコープの適用と hello-ok の機能公開が一致するように、src/gateway/method-scopes.ts でも分類します。
  1. 再生成
  1. テストとドキュメント
src/gateway/server.*.test.ts にサーバーテストを追加し、ドキュメントにメソッドを記載します。

Swift コード生成の動作

Swift ジェネレーターは次を出力します。
  • reqreseventunknown のケースを持つ GatewayFrame enum
  • 厳密に型付けされたペイロードの struct/enum
  • ErrorCode 値、GATEWAY_PROTOCOL_VERSION、および GATEWAY_MIN_PROTOCOL_VERSION
前方互換性を確保するため、不明なフレームタイプは生のペイロードとして保持されます。

バージョニングと互換性

  • PROTOCOL_VERSIONpackages/gateway-protocol/src/version.ts にあります(現在の値: 4)。
  • クライアントは minProtocolmaxProtocol を送信します。サーバーは、現在のプロトコルを含まない範囲を拒否します。
  • Swift モデルは、古いクライアントとの互換性を損なわないように、不明なフレームタイプを保持します。

スキーマのパターンと規約

  • ほとんどのオブジェクトは、厳密なペイロードのために additionalProperties: false を使用します。
  • NonEmptyStringType.String({ minLength: 1 }))は、ID およびメソッド/イベント名のデフォルトです。
  • トップレベルの GatewayFrame は、type判別子を使用します。
  • 副作用のあるメソッドでは通常、params に idempotencyKey が必要です(例: sendpollagentchat.send)。
  • agent は、ランタイムで生成されるオーケストレーションコンテキスト(たとえばサブエージェント/Cron タスク完了時の引き継ぎ)のために、オプションの internalEvents を受け付けます。これは内部 API サーフェスとして扱ってください。

ライブスキーマ JSON

生成された JSON Schema はビルド成果物であり、リポジトリにはコミットされません。公開された raw ファイルは通常、次の場所で利用できます。

スキーマを変更する場合

  1. 所有元の packages/gateway-protocol/src/schema/*.ts モジュール内の TypeBox スキーマを更新し、protocol-schemas.ts に登録します。
  2. メソッド/イベントを src/gateway/server-methods-list.ts に登録します。
  3. 新しい RPC にオペレーターまたは Node のスコープ分類が必要な場合は、src/gateway/method-scopes.ts を更新します。
  4. pnpm protocol:check を実行します。
  5. 再生成された Swift モデルをコミットします。

関連項目