ステータス
共有エージェント、CLI、Plugin 機能、アウトバウンド配信サーフェスに実装済み:ReplyPayload.presentationは意味的なメッセージ UI を保持する。ReplyPayload.delivery.pinは送信済みメッセージのピン留め要求を保持する。- 共有メッセージアクションは、プロバイダー固有の
components、blocks、buttons、cardの代わりにpresentation、delivery、pinを公開する。 - コアは、Plugin が宣言したアウトバウンド機能を通じてプレゼンテーションをレンダリングまたは自動劣化する。
- Discord、Slack、Telegram、Mattermost、MS Teams、Feishu のレンダラーは汎用契約を使用する。
- Discord チャネルの制御プレーンコードは、Carbon ベースの UI コンテナをインポートしなくなった。
問題
チャネル UI は現在、互換性のない複数のサーフェスに分割されている:- コアは
buildCrossContextComponentsを通じて Discord 形状のクロスコンテキストレンダラーフックを所有している。 - Discord
channel.tsはDiscordUiContainerを通じてネイティブ Carbon UI をインポートでき、それによりランタイム UI 依存関係がチャネル Plugin の制御プレーンに取り込まれる。 - エージェントと CLI は、Discord
components、Slackblocks、Telegram または Mattermostbuttons、Teams または Feishucardなどのネイティブペイロードのエスケープハッチを公開している。 ReplyPayload.channelDataはトランスポートヒントとネイティブ UI エンベロープの両方を保持する。- 汎用の
interactiveモデルは存在するが、Discord、Slack、Teams、Feishu、LINE、Telegram、Mattermost で既に使用されている、よりリッチなレイアウトより狭い。
目標
- コアは、宣言された機能からメッセージに最適な意味的プレゼンテーションを決定する。
- 拡張機能は機能を宣言し、意味的プレゼンテーションをネイティブトランスポートペイロードへレンダリングする。
- Web Control UI はチャットのネイティブ UI から分離したままにする。
- ネイティブチャネルペイロードは、共有エージェントまたは CLI メッセージサーフェスを通じて公開しない。
- サポートされないプレゼンテーション機能は、最適なテキスト表現へ自動劣化する。
- 送信済みメッセージのピン留めなどの配信動作は、プレゼンテーションではなく汎用配信メタデータである。
非目標
buildCrossContextComponentsの後方互換性シムは用意しない。components、blocks、buttons、card向けの公開ネイティブエスケープハッチは用意しない。- コアはチャネルネイティブ UI ライブラリをインポートしない。
- バンドル済みチャネル向けのプロバイダー固有 SDK シームは用意しない。
目標モデル
コア所有のpresentation フィールドを ReplyPayload に追加する。
interactive は presentation のサブセットになる:
interactiveテキストブロックはpresentation.blocks[].type = "text"にマッピングされる。interactiveボタンブロックはpresentation.blocks[].type = "buttons"にマッピングされる。interactive選択ブロックはpresentation.blocks[].type = "select"にマッピングされる。
presentation を使用する。interactive は既存の返信生成側のための内部レガシーパーサー/レンダリングヘルパーとして残る。
公開の生成側 API では interactive を非推奨として扱う。既存の承認ヘルパーや古い Plugin が動作し続けるよう、ランタイムサポートは残しつつ、新しいコードは presentation を出力する。
配信メタデータ
UI ではない送信動作向けに、コア所有のdelivery フィールドを追加する。
delivery.pin = trueは、最初に正常配信されたメッセージをピン留めすることを意味する。notifyのデフォルトはfalse。requiredのデフォルトはfalse。サポートされないチャネルやピン留め失敗は、配信を継続することで自動劣化する。- 手動の
pin、unpin、list-pinsメッセージアクションは既存メッセージ向けに残る。
channelData.telegram.pin = true から delivery.pin = true に移行する必要がある。
ランタイム機能契約
制御プレーンのチャネル Plugin ではなく、ランタイムアウトバウンドアダプターにプレゼンテーションおよび配信レンダーフックを追加する。- 対象チャネルとランタイムアダプターを解決する。
- プレゼンテーション機能を問い合わせる。
- レンダリング前に、サポートされないブロックを劣化し、汎用機能制限を適用する。
renderPresentationを呼び出す。- レンダラーが存在しない場合、プレゼンテーションをテキストフォールバックへ変換する。
- 正常送信後、
delivery.pinが要求され、サポートされている場合はpinDeliveredMessageを呼び出す。
チャネルマッピング
Discord:presentationをコンポーネント v2 と Carbon コンテナへ、ランタイム専用モジュールでレンダリングする。- アクセントカラーのヘルパーは軽量モジュールに保持する。
- チャネル Plugin の制御プレーンコードから
DiscordUiContainerのインポートを削除する。
presentationを Block Kit へレンダリングする。- エージェントと CLI の
blocks入力を削除する。
- テキスト、コンテキスト、区切り線をテキストとしてレンダリングする。
- 対象サーフェスで設定済みかつ許可されている場合、アクションと選択をインラインキーボードとしてレンダリングする。
- インラインボタンが無効な場合はテキストフォールバックを使用する。
- ACP トピックのピン留めを
delivery.pinへ移動する。
- 設定されている場合、アクションをインタラクティブボタンとしてレンダリングする。
- その他のブロックはテキストフォールバックとしてレンダリングする。
presentationを Adaptive Cards へレンダリングする。- 手動の pin/unpin/list-pins アクションを保持する。
- 対象会話で Graph サポートが信頼できる場合、任意で
pinDeliveredMessageを実装する。
presentationをインタラクティブカードへレンダリングする。- 手動の pin/unpin/list-pins アクションを保持する。
- API 動作が信頼できる場合、送信済みメッセージのピン留め向けに任意で
pinDeliveredMessageを実装する。
- 可能な場合、
presentationを Flex またはテンプレートメッセージへレンダリングする。 - サポートされないブロックはテキストへフォールバックする。
- LINE UI ペイロードを
channelDataから削除する。
- 控えめな書式でプレゼンテーションをテキストへ変換する。
リファクターステップ
ui-colors.tsを Carbon ベース UI から分割し、extensions/discord/src/channel.tsからDiscordUiContainerを削除する Discord リリース修正を再適用する。ReplyPayload、アウトバウンドペイロード正規化、配信サマリー、フックペイロードにpresentationとdeliveryを追加する。- 狭い SDK/ランタイムサブパスに
MessagePresentationスキーマとパーサーヘルパーを追加する。 - メッセージ機能の
buttons、cards、components、blocksを意味的プレゼンテーション機能に置き換える。 - プレゼンテーションレンダリングと配信ピン留め向けにランタイムアウトバウンドアダプターフックを追加する。
- クロスコンテキストコンポーネント構築を
buildCrossContextPresentationに置き換える。 src/infra/outbound/channel-adapters.tsを削除し、チャネル Plugin 型からbuildCrossContextComponentsを削除する。maybeApplyCrossContextMarkerを変更し、ネイティブパラメーターの代わりにpresentationを付与する。- Plugin ディスパッチ送信パスを更新し、意味的プレゼンテーションと配信メタデータのみを使用する。
- エージェントと CLI のネイティブペイロードパラメーター
components、blocks、buttons、cardを削除する。 - ネイティブメッセージツールスキーマを作成する SDK ヘルパーを削除し、プレゼンテーションスキーマヘルパーに置き換える。
- UI/ネイティブエンベロープを
channelDataから削除する。残りの各フィールドがレビューされるまで、トランスポートメタデータのみを保持する。 - Discord、Slack、Telegram、Mattermost、MS Teams、Feishu、LINE のレンダラーを移行する。
- メッセージ CLI、チャネルページ、Plugin SDK、機能クックブックのドキュメントを更新する。
- Discord と影響を受けるチャネルエントリポイントのインポートファンアウトプロファイリングを実行する。
channelData トランスポートエンベロープに対する、より深い内部クリーンアップパスとして残る。ステップ 15 は、型/テストゲートを超える定量的なインポートファンアウト数値が必要な場合のフォローアップ検証として残る。
テスト
追加または更新:- プレゼンテーション正規化テスト。
- サポートされないブロック向けのプレゼンテーション自動劣化テスト。
- Plugin ディスパッチおよびコア配信パス向けのクロスコンテキストマーカーテスト。
- Discord、Slack、Telegram、Mattermost、MS Teams、Feishu、LINE、テキストフォールバック向けのチャネルレンダリングマトリクステスト。
- ネイティブフィールドがなくなったことを証明するメッセージツールスキーマテスト。
- ネイティブフラグがなくなったことを証明する CLI テスト。
- Carbon を対象にした Discord エントリポイントのインポート遅延性回帰テスト。
- Telegram と汎用フォールバックを対象にした配信ピン留めテスト。
未解決の質問
delivery.pinは初回パスで Discord、Slack、MS Teams、Feishu にも実装するべきか、それともまず Telegram のみにするべきか。deliveryは最終的にreplyToId、replyToCurrent、silent、audioAsVoiceなどの既存フィールドも吸収するべきか、それとも送信後の動作に集中したままにするべきか。- プレゼンテーションは画像やファイル参照を直接サポートするべきか、それとも当面メディアは UI レイアウトから分離したままにするべきか。