メンタルモデル(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)を購読します。
接続フロー(最小):
| カテゴリ | 例 | 注記 |
|---|---|---|
| コア | connect, health, status | connectは最初でなければなりません |
| メッセージング | send, agent, agent.wait, system-event, logs.tail | 副作用のあるメソッドにはidempotencyKeyが必要です |
| チャット | chat.history, chat.send, chat.abort | WebChatはこれらを使用します |
| セッション | sessions.list, sessions.patch, sessions.delete | セッション管理 |
| 自動化 | wake, cron.list, cron.run, cron.runs | wakeとcronの制御 |
| ノード | node.list, node.invoke, node.pair.* | Gateway WSとノードアクション |
| イベント | tick, presence, agent, chat, health, shutdown | サーバープッシュ |
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は、スキーマ名を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で検証されます。ハンドシェイクは、paramsが
ConnectParamsに一致するconnectリクエストのみを受け入れます。 - クライアント側: JSクライアントは、イベントフレームとレスポンスフレームを使用する前に検証します。
- 機能ディスカバリー: Gatewayは、
listGatewayMethods()とGATEWAY_EVENTSから得た保守的なfeatures.methodsとfeatures.eventsリストをhello-okで送信します。 - このディスカバリーリストは、
coreGatewayHandlers内の呼び出し可能なすべてのヘルパーを生成してダンプしたものではありません。一部のヘルパーRPCは、広告される機能リストに列挙されずにsrc/gateway/server-methods/*.tsで実装されています。
フレーム例
接続(最初のメッセージ):最小クライアント(Node.js)
最小限の有用なフロー: 接続 + health。実例: メソッドをエンドツーエンドで追加する
例:{ 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"を追加します。
そのメソッドがoperatorまたはノードクライアントから呼び出し可能な場合は、スコープ適用とhello-ok機能広告が揃うように、src/gateway/method-scopes.tsでも分類します。
- 再生成
- テストとドキュメント
src/gateway/server.*.test.tsにサーバーテストを追加し、ドキュメントにそのメソッドを記載します。
Swiftコード生成の動作
Swiftジェネレーターは次を出力します。req,res,event,unknownケースを持つGatewayFrameenum- 強く型付けされたpayloadのstruct/enum
ErrorCode値、GATEWAY_PROTOCOL_VERSION、GATEWAY_MIN_PROTOCOL_VERSION
バージョニングと互換性
PROTOCOL_VERSIONはpackages/gateway-protocol/src/version.tsにあります(現在値:4)。- クライアントは
minProtocolとmaxProtocolを送信します。サーバーは、現在のプロトコルを含まない範囲を拒否します。 - Swiftモデルは、古いクライアントを壊さないように未知のフレームタイプを保持します。
スキーマのパターンと規約
- ほとんどのオブジェクトは、厳密なpayloadのために
additionalProperties: falseを使用します。 NonEmptyString(Type.String({ minLength: 1 }))は、IDとメソッド/イベント名のデフォルトです。- トップレベルの
GatewayFrameは、type上のdiscriminatorを使用します。 - 副作用のあるメソッドは通常、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がoperatorまたはノードスコープ分類を必要とする場合は、
src/gateway/method-scopes.tsを更新します。 pnpm protocol:checkを実行します。- 再生成されたSwiftモデルをコミットします。