OpenClawのMatrixスレッドとセッション
DMのセッションスコープ、返信スレッドのモード、スレッドの継承、ACPの会話バインディング、スレッドバインディングのポリシー、保留中のメッセージのみのルーム履歴
Matrixはネイティブのスレッドに対応しており、OpenClawはスレッド化とセッションのルーティングを、返信をどこに投稿するかと、会話がどのセッションに属するかという2つの独立した判断として扱います。これに、ルームやスレッドを永続的なコーディングワークスペースに変えるACPバインディングと、エージェントがまだ見ていないものだけを運ぶルーム履歴のウィンドウを加えれば、全体像がそろいます。ここでは、2つの設定項目、継承とコマンド、ACPバインディングとその設定、そして履歴のルールを紹介します。
2つの設定項目
- DMセッションスコープは、DMのルームをセッションにどう対応させるかを決めます。デフォルトのユーザー単位では、ルーティングされた同じピアとのすべてのDMルームで1つのセッションを共有します。一方、ルーム単位では、同じピアであってもMatrixのDMルームごとに独自のセッションキーが割り当てられます。
- 返信スレッドは、ボットがどこに投稿するかを決めます。offでは、返信はトップレベルのままで、受信したスレッド内のメッセージは親セッションで扱われます。inboundでは、受信メッセージがすでにスレッド内にあった場合にのみ、そのスレッド内で返信します。alwaysでは、トリガーとなったメッセージをルートとするスレッド内で返信し、最初のトリガーからその会話をスレッド単位のセッションでルーティングします。DM専用の上書きを使えば、ルームのスレッドは分離したまま、DMはフラットに保てます。
- スレッド内で返信先を選択すると、スレッドと選択したメッセージの両方が保持されます。また、古いクライアントがスレッド内のメッセージで受け取る返信メタデータは、エージェントのコンテキストでは引用メッセージとして扱われません。
- 受信したスレッド内のメッセージには、追加のコンテキストとしてスレッドのルートが含まれます。メッセージツールによる送信は、同じルームまたは同じDMユーザーを対象とする場合、スレッドIDが指定されていない限り現在のスレッドを自動的に継承します。DMユーザーのターゲットの再利用は、同じアカウント上の同じピアであることをセッションのメタデータが証明する場合にのみ適用されます。そして、セッションのunbind、agents、idle、max-ageの各コマンドと、スレッドにバインドされたACPのspawnは、いずれもMatrixのルームとDMで機能します。
明示的な会話バインディングは常にsessionScopeより優先されます。バインドされたルームとスレッドは、選ばれたターゲットセッションを保ちます。
ACPバインディング
MatrixのルームやDM、既存のスレッドは、チャットの画面を変えずに永続的なACPワークスペースにできます。オペレーターの操作はコマンド1つです。使い続けたいDM、ルーム、スレッドの中で、bind-hereフラグを付けてACPのspawnを実行します。トップレベルのDMやルームでは、現在の画面がそのままチャットとなり、以降のメッセージはspawnされたACPセッションにルーティングされます。既存のスレッド内では、フラグがそのスレッドをその場でバインドします。newとresetのコマンドは、バインドされた同じセッションをその場でリセットし、ACPのcloseコマンドはセッションを終了してバインディングを削除します。bind-hereが子スレッドを作成することはありません。spawnコマンドのthreadオプションで子スレッドを作成またはバインドする操作は、spawn-sessions設定によって制御されます。OpenClawは、あるDMルームが同じ共有セッション上の別のDMルームと衝突していることを検出すると、ルーム単位のスコープを提案する1回限りの通知を投稿します。ただし、これはスレッドバインディングが有効な場合に限られます。
設定と履歴
- Matrixは、グローバルのスレッドバインディングのデフォルトを継承し、チャネルごとに上書きできます。項目は、enabled、アイドル時間、最大経過時間、サブエージェントとACPの両方のスレッドのspawnを制御し、デフォルトでオンになっているspawn-sessionsフラグ、そしてデフォルトのspawnコンテキストです。非推奨になった種類別のspawnキーはdoctorの修正機能で移行され、分離されたspawnコンテキストを使うと、ネイティブのサブエージェントのスレッドのspawnが親のトランスクリプトをフォークしなくなります。
- 履歴の上限は、ルームのメッセージがエージェントをトリガーしたときに、直近のルームメッセージを何件まで受信履歴として含めるかを設定します。未設定の場合はグローバルのグループチャットの上限にフォールバックし、両方とも未設定ならデフォルトは0(無効)です。ルーム履歴はルーム専用で、DMは通常のセッション履歴を保ちます。
- ルーム履歴に含まれるのは保留中のメッセージだけです。OpenClawは返信をトリガーしなかったルームメッセージをバッファし、メンションやその他のトリガーが届いた時点でそのウィンドウのスナップショットを取ります。現在のトリガーは受信本文そのものなので履歴ブロックからは除外し、同じイベントの再試行時には、ウィンドウを先へずらすのではなく元のスナップショットを再利用します。
MatrixでのOpenClawはこの記事が掘り下げるチャネルの記事で、OpenClawのセッションはこれらの対応付けの土台となるキーとリセットです。
Discordでも同じ形
スレッドバインディング、アイドルと最大経過時間の制御、ACPバインディングはチャネル間で共通のポリシーなので、あるチャネルで覚えたワークフローはそのまま別のチャネルでも使えます。OpenClawのDiscordスレッドとセッションは同じページのDiscord版で、OpenClawのサブエージェントはスレッドにバインドされたセッションを得るspawnです。
Dialiでは
Matrixは、WhatsApp、Telegram、Discord、Slack、Mattermost、SMS、音声と並んで、Dialiで接続できるチャネルの一覧に入っています。ホームサーバーのアカウントとルームの許可リストはお客様のもので、GatewayはDialiが担います。アシスタントについてはDialiのマネージドOpenClawホスティングを、これらのチャネルのつなぎ方については最初のチャネルを5分で接続するガイドをご覧ください。
- スコープがセッションを決め、スレッド化が返信先を決めます。
- バインディングが優先され、bind-hereがスレッドを作ることはありません。
- 履歴は保留中のメッセージのみで、再試行してもスナップショットは変わりません。
読むだけでなく、作ってみましょう
エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。
