OpenClawのSlackグラフ、テーブル、承認
ネイティブのデータ可視化ブロックとその制限、1メッセージ2グラフのルール、型付きセルを持つネイティブのデータテーブル、行を決して落とさないテキストフォールバック、プラグインが所有するモーダル送信、Slackネイティブのexec承認とプラグイン承認
これまでSlackのメッセージにグラフを載せるには、どこかで画像をレンダリングしてアップロードする必要がありました。現在のSlackにはグラフとテーブル用のネイティブなBlock Kitブロックがあり、OpenClawはポータブルなプレゼンテーションブロックをそのままそこへマッピングします。ブロックを描画できないすべての場所のために、テキスト版も一緒に送られます。ここでは、2つのネイティブブロックとその制限およびフォールバック、プラグイン向けのモーダルの経路、そしてSlackを承認クライアントとして機能させる承認ボタンを紹介します。
ネイティブのグラフ
- Slackの公開データ可視化ブロックは、メッセージ内に折れ線、棒、面、円グラフを描画します。OpenClawは、グラフの種類、タイトル、カテゴリ、名前付きの系列、任意の軸ラベルを持つポータブルなグラフブロックを、このネイティブの形にマッピングします。追加のOAuthスコープ、ファイルのアップロード、画像レンダラーは不要で、通常のメッセージアクセス以外にSlack側の設定も必要ありません。
- Slackの制限はネイティブ描画の前に適用されます。タイトルと軸ラベルは50文字まで、円グラフは正の値のセグメントが1-12個、折れ線・棒・面グラフは一意の名前を持つ系列が1-12個と共有カテゴリが1-20個、ラベルは20文字まで、そしてすべての系列でカテゴリごとに有限の値が1つずつ必要です。負の値は円グラフ以外で使えます。
- すべてのネイティブグラフは、スクリーンリーダー、通知、セッションのミラーリング、ブロックを描画できないクライアントのために、トップレベルのテキスト表現を持ちます。他のチャネルは、ネイティブのグラフ対応を表明していない限り、同じ決定論的なグラフデータをテキストとして受け取ります。Slackがinvalid-blocksエラーでグラフを拒否すると、OpenClawは拒否されたデータブロックを削除し、隣接するコントロールは残したまま、グラフ全体を目に見えるテキストとして送信します。
- Slackが1メッセージで受け付けるデータ可視化ブロックは最大2つで、この制限は公開リファレンスに記載されていません。そのため、有効なグラフがそれより多いプレゼンテーションは、順序を保ったまま、1メッセージあたり2つまでに分けて後続のメッセージでネイティブ描画を続けます。開発者向けのローンチ告知では、このブロックは有料プランの制限がないアプリ向け機能として記載されており、Business PlusとEnterpriseに関する記述はSlackbot自身のAIによるグラフ生成に関するものです。また、グラフはメッセージ専用のブロックで、App Home、モーダル、Canvasのコンテンツには使えません。
ネイティブのテーブルに昇格するのは、明示的なプレゼンテーションのテーブルブロックだけです。
ネイティブのテーブル
Slackの現行のデータテーブルブロックは、メッセージ内に行と列を描画します。OpenClawは、キャプション、ヘッダー、行、任意の行ヘッダー列インデックスを持つ明示的なポータブルテーブルブロックを、旧来のテーブルブロックではなくこのブロックにマッピングします。ここでも追加のスコープは不要です。ヘッダーと文字列のセルは生のテキストセルに、数値セルは生の数値セルになり、ネイティブの並べ替えとフィルタリングのために有限の値が保持されます。行ヘッダーインデックスは、その0始まりの列をSlackの行ヘッダーとして指定します。公開されている制限が先に適用されます。列は1-20、データ行はヘッダー行とは別に1-100、すべての行でセル数が同じであること、そして1メッセージ内の全セルの合計が最大10,000文字であることです。メッセージがこの上限内に収まる限り、複数の有効なテーブルをネイティブに描画できます。収まらないテーブルは、行やセルを失う代わりに完全な決定論的テキストになります。1メッセージを超えるテキストは、送信とスラッシュコマンドの応答では順序付きのチャンクとして送られます。また、テーブルの編集は、既存メッセージの行を黙って切り捨てるのではなく、明示的なサイズエラーで失敗します。すべてのネイティブテーブルもテキスト表現を持ちます。グラフとテーブルの生の値はフォールバック内でもリテラルのまま扱われるため、セル内のユーザーメンションが本物のメンションになることはありません。Slackがネイティブのグラフやテーブルのブロックを拒否すると、OpenClawは上限のある1回の復旧ステップですべてのネイティブデータブロックを削除し、ボタンやセレクトなどの有効な隣接要素は残して、Slackのフォーマットを無効にした完全なテキストを送信します。スラッシュコマンドの配信では、Slackの応答呼び出しの上限である5回を追跡し、各バッチの前に残りの呼び出し回数に収まる完全な配信計画を選びます。昇格されるのは明示的なプレゼンテーションのテーブルブロックだけです。OpenClawは構造やセルの型を推測しないため、Markdownのパイプテーブルは書かれたとおりのテキストのままです。信頼できるSlackネイティブのプロデューサーは、有効な生のセルから導出したフォールバックテキストとともに、チャネルデータ経由で生のブロックを引き続きそのまま渡せます。旧来のテーブルブロックとして届く、貼り付けられたスプレッドシートの内容は、エージェントへの入力、スレッドのコンテキスト、読み取りアクションのために区切り文字に対して安全なTSVとして描画されます。通常の添付ファイルから受け入れられるのは、ネイティブのテーブルブロックだけです。
モーダルと承認
- インタラクティブハンドラーを持つSlackプラグインは、OpenClawがペイロードをコンパクトなイベントにまとめる前に、モーダルの送信イベントとクローズイベントを受け取れます。そのためには、コールバックIDをopenclawプレフィックス付きの名前空間とペイロードに設定するか、モーダルのprivate metadataにプラグインのインタラクティブデータを入れます。ハンドラーはインタラクションの種類、正規化された入力、生のstate値を受け取ります。コールバックIDによるルーティングだけでハンドラーは呼び出され、private metadataにユーザーとセッションのルーティングフィールドがあると、モーダルはエージェントから見えるイベントも生成します。エージェントが受け取るのは、フォームのペイロード全体を含まない、コンパクトで秘匿化されたインタラクションイベントで、ハンドラーからの要約、参照、データを含めることができます。
- Slackは、Web UIやターミナルにフォールバックする代わりに、インタラクティブなボタンを備えたネイティブの承認クライアントとして機能できます。exec承認とプラグイン承認はBlock Kitのプロンプトとして描画され、exec承認のDMは設定された承認者、またはコマンドのオーナーに届きます。プラグイン承認でSlackネイティブのボタンが使われるのは、Slackが発生元セッションのネイティブクライアントである場合か、プラグイン承認がSlackのセッションやターゲットにルーティングされる場合で、承認者はチャネルの許可リスト、名前付きアカウントの許可リスト、またはアカウントのデフォルトルートから決まります。exec承認だけの承認者は、プラグイン承認者でもない限り、プラグインのリクエストを承認できません。
- 設定パスはexec-approvalsブロックで、enabled、省略時はコマンドのオーナーにフォールバックする任意の承認者、dm、channel、bothのいずれかでデフォルトがdmのターゲット、エージェントとセッションのフィルターを持ちます。ネイティブのexec承認には、enabledがtrueまたはautoで、解決済みの承認者が1人以上いることが必要です。未設定またはfalseのままにすると、ネイティブのプラグイン承認は無効にならず、ネイティブのexec配信だけが無効になります。共有のexec転送とプラグイン転送は別々に保たれ、Slackがリクエストをネイティブに処理する場合にのみ抑制されます。同じチャット内でのapproveコマンドは、コマンドが使える場所では引き続き機能します。Enterprise Gridでは、発生元イベントの検証済みワークスペースが、プロンプト、DM、ボタンのコールバック、最終的な更新まで保持され、組織にインストールされたアカウントにそのスコープがない場合はフェイルクローズします。
SlackでのOpenClawは、これらのサーフェスの土台となるチャネルの記事で、OpenClawのSlackメッセージの挙動は、これらが組み込まれているカードとプレビューのモデルです。
テキストが常に添えられる理由
ブロックとしてしか存在しないグラフは、通知、スクリーンリーダー、そしてセッションがミラーリングされる他のすべてのチャネルから消えてしまいます。だからこそ決定論的なテキスト版は省略できず、拒否されたブロックは何も残さないのではなく、そのテキストへと縮退するのです。OpenClawのexec承認では、これらのボタンが動かす承認モデルを、OpenClawのTelegramリッチメッセージと承認では、Telegramでの同等のリッチなサーフェスを解説しています。
Dialiでは
Slackは、Dialiがダッシュボードから接続するチャネルの1つで、ランタイム設定はリリースごとに生成され、置き換えられます。そのため、ホスト型エージェントのグラフ、テーブル、承認プロンプトは、手で編集する設定なしに、ここで説明したとおりに動作します。DialiでのSlackはDialiでこのチャネルを使う方法、Dialiのセキュリティはボットが取り得るすべてのアクションに適用される境界です。
- グラフは1メッセージにつき2つまで。それ以上のグラフは後続のメッセージに回ります。
- 上限を超えるテーブルは完全なテキストになり、行が減ることはありません。
- 承認ボタンが主要なUXで、approveコマンドはフォールバックです。
読むだけでなく、作ってみましょう
エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。
