m.room.message イベントの com.openclaw.presentation コンテンツキーに、正規化された MessagePresentation メタデータを付加します。
標準の Matrix クライアントはプレーンテキストの body をレンダリングし続けます。OpenClaw 対応クライアントは構造化メタデータを読み取り、ボタン、セレクト、コンテキスト行、区切り線などのネイティブ UI をレンダリングできます。
イベント内容
versionはメタデータスキーマのバージョンです。現在のバージョンは1です。typeは安定した判別子で、常に"message.presentation"です。Matrix アダプターは、このバージョンと型に完全一致するペイロードのみを出力します。クライアントも同様に、安全に解釈できない未知のバージョン、未知のtype値、未知のブロック型を無視するべきです。titleとtone(info、success、warning、danger、neutral)は任意のヒントです。- ボタンとセレクトオプションは、従来の文字列
valueと並行して、型付きのaction({ "type": "command", "command": "/..." }または{ "type": "callback", "value": "..." })を持てます。両方が存在する場合はactionを優先してください。
フォールバック動作
OpenClaw は常に、読み取り可能なプレーンテキストのフォールバックをbody にレンダリングします。構造化メタデータは追加的なものであり、基本的な Matrix 相互運用性のために必須にしてはいけません。
フォールバックのレンダリングルール:
title、text、contextの内容はプレーンな行としてレンダリングされます。commandアクションを持つボタンはlabel: `/command`としてレンダリングされ、コマンドをコピー可能なままにします。callbackアクションを持つボタン、または従来のvalueのみを持つボタンは、不透明なコールバック値を非公開のままにするためラベルのみでレンダリングされます。無効なボタンは常にラベルのみです。URL ボタンと Web アプリボタンはlabel: URLとしてレンダリングされます。- セレクトブロックは、プレースホルダー(または
Options:)を見出しとしてレンダリングし、その後にラベルのみのオプション行をレンダリングします。 - 何もレンダリングされない場合、たとえば区切り線のみのプレゼンテーションでは、本文は
---にフォールバックします。
サポートされるブロック
Matrix 送信アダプターは、次のネイティブサポートを宣言します。buttonsselectcontextdivider
text ブロックは、フォールバック本文を通じて常にサポートされます。すべてのブロックをベストエフォートのプレゼンテーションヒントとして扱ってください。メッセージ全体を失敗させるのではなく、未知のフィールドやブロック型は無視してください。
インタラクション
このメタデータは Matrix のコールバックセマンティクスを追加しません。ボタンとセレクトの値はフォールバック用のインタラクションペイロードであり、通常はスラッシュコマンドまたはテキストコマンドです。インタラクションをサポートしたい Matrix クライアントは、コントロール値(action.command、次に action.value、次に value)を解決し、それを通常のメッセージとしてルームに送り返します。
たとえば、値 /model deepseek/deepseek-chat を持つボタンは、同じルーム内でその値を暗号化された Matrix テキストメッセージとして送信することで処理できます。
承認メタデータとの関係
com.openclaw.presentation は、一般的なリッチメッセージプレゼンテーションのためのものです。
承認プロンプトでは専用の com.openclaw.approval メタデータを使用します。承認には、安全性に関わる状態、判断、exec/Plugin の詳細が含まれるためです。同じイベントに両方のメタデータキーが存在する場合、クライアントは専用の承認レンダラーを優先するべきです。
メディアメッセージ
返信に複数のメディア URL が含まれる場合、OpenClaw はメディア URL ごとに 1 つの Matrix イベントを送信します。キャプションテキストとプレゼンテーションメタデータは最初のイベントにのみ付加されるため、クライアントは重複したレンダラーなしで安定した 1 つの構造化ペイロードを取得できます。長いテキストが複数のイベントに分割される場合も同じルールが適用されます。メタデータは最初のイベントにのみ載ります。 プレゼンテーションメタデータはコンパクトに保ってください。ユーザーに表示される大きなテキストはbody に残し、通常の Matrix テキスト分割経路を使用するべきです。