セッションの監視 0.9.10 で追加
エージェントは、ほかのセッションを何度も確認しに行く代わりに、それらを見守ることができます。購読したあとは自分の作業を続けるか待機し、見守っているセッションで何かが起きると OAR がエージェントを起こします。質問が回答を待っている、ターンが失敗した、セッションが返信した、バックグラウンドタスクが終わった、といったときです。起こすのは、OAR が見守る側の会話に書き込む短いメッセージです。
よくある依頼の例:
- まとめて面倒を見る。「3 つのレビューセッションを見守って。どれかが質問するか失敗したら起こして。全部終わったら返信をまとめて。」
- 長いジョブを待つ。「セッションでテスト一式を実行して、それを見守って。バックグラウンドタスクが終わったら教えて。失敗したらそう伝えて。」
- 別のマシンを見張る。「
build-の夜間デプロイのセッションを見守って、エラーがあれば教えて。」box
対象のセッションは、このリレー上(エージェントセッションを有効にした場合)にも、ペアリングしたリレー上にも置けます。見守る側になれるのは、Claude Cloud と OpenAI Image 以外のすべてのプロバイダーです。この 2 つのセッションは購読できません(プロバイダー別を参照)。ツールそのもの、つまり relay_ の subscribe は、リファレンスのセッションの監視に載っています。このページでは、表示される内容と、ユーザーが制御できることを説明します。
見守る側を起こすもの #
購読では、見守るセッションを指定するか、リレーのすべてのセッション(後から作成されるものを含む)を指定します。通知を受けたい内容として、次のものを指定できます。
| イベント | わかりやすく言うと |
|---|---|
| Question(質問) | 見守っているセッションが回答または承認を待っています。メッセージには質問とその選択肢が含まれます。0.9.16 で追加 作業を止めない質問の場合は、後からユーザーの回答も購読に通知されます。 |
| Error(エラー) | ターンが失敗した、使用量の上限に達した、またはセッションのエージェントプロセスが終了しました。 |
| Reply(返信) | セッションがターンを終えました。メッセージには返信の冒頭が含まれます。 |
| Task started, finished, failed(タスク開始・終了・失敗) | 見守っているセッションのバックグラウンドエージェントまたはシェルタスクが開始した(購読がそれを求めた場合のみ)、終了した、または失敗しました。0 以外の終了コードで終わったシェルコマンドは失敗として扱います。 |
| Stalled(停滞) | セッションがまだ作業中なのに、出力がない状態が続いています。 |
| All idle(すべてアイドル) | 見守っているセッションで、もう何も実行されていません。 |
0.9.13 で追加 イベントを指定しない購読は、正常に終わったシェルコマンドやモニターでは起こされません。忙しいセッションはおよそ 1 分ごとにそれを 1 つ終えるので、そのたびに見守る側がコンテキスト全体を使って 1 ターンを費やすことになるからです。終了したサブエージェントと失敗したタスクでは、引き続き起こされます。すべてのコマンドを追う必要があるエージェントは、すべてのタスク終了を求めます。以前にイベントを指定せずに作成された購読は、自動的にこの既定に切り替わります。イベントを指定した購読はそのまま維持されます。
正確なイベント名と購読のオプション(返信とタスク結果が一致すべき正規表現、1 回発火したら終了する設定、stalled と見なすまでの無出力の時間)は、リファレンスにあります。
見守る側自身の会話は見守り対象にならないので、自分のターンで起こされることはありません。
購読は通知するだけです
購読は何も承認せず、何にも回答しません。見守っているセッションの質問は、これまでどおり、ユーザーか、回答を許可されたエージェントが回答するまで開いたままです。見守っているセッションの承認カードに回答できるのはユーザーだけで、イベントにもそう書かれています。
承認カード #
会話内のエージェントがあるリレーのセッションを初めて購読するときは、ユーザーに確認する必要があります。その会話に承認カードが表示されます。
This agent wants to watch “Review: server/” (3f9c…), “Review: web/” (a12b…) and be woken by their events.
Events: question_asked, error, turn_end, subagent_finished, task_failed, stalled, all_idle
| 選択 | 結果 |
|---|---|
| Allow(許可) | 購読が作成されます。この会話で、同じリレーのセッションをその後購読するときは、新しいカードは表示されません。 |
| Deny(拒否) | 購読は拒否されます。エージェントにはその旨が伝えられ、購読なしで作業を続けます。 |
特別なケース:
- すべてのセッション。
allへの購読は、常に明記されます:"ALL sessions of this relay, including ones created later"(このリレーのすべてのセッション、後から作成されるものを含む)。0.9.16 で追加 セッションを除外する場合は "except N it leaves out"(除外する N 件を除く)が付きます。最初のカードがall向けでなかった場合、後でallを購読するときは再度確認します。そうだった場合は、Allow でその後のすべての購読(allを含む)がカバーされます。 - ペアリングしたリレー。 カードにはリレー名が表示されます。リレーごとに個別に確認し、相手のリレー側では何も確認しません。
- 引き継ぎ。 別の見守る側を置き換えるエージェントは、古い側の購読をすべて引き継げます。この場合は、以前にいくつカードを許可していても必ず確認します。カードには、いくつの購読がどのセッションから移るかが表示されます。古いセッションはそれらのイベントを受け取らなくなり、購読は設定をそのまま保ちます。この Allow は、関係するリレーでの購読の承認も兼ねます。そのうちの 1 つがすべてのセッションを見守っていた場合は
allも含みます。
0.9.16 で追加 カードには購読のオプションも表示されます:once(1 回のみ)、heartbeat every N min(N 分ごとにハートビート)、digest every N min(N 分ごとにまとめて通知)、タイムゾーン付きの quiet HH:MM–HH:MM(サイレント HH:MM–HH:MM)。
カードはどのリレーモードでも表示されます。ask、plan、agent のいずれにも左右されません。承認は会話に属し、リレーを再起動しても保持されます。
表示される内容 #
チップとその一覧 #
会話に購読がある間、そのヘッダーには watching N sessions(N 件のセッションを監視中)と表示され、見守っている異なるセッションの数を数えます。すべてのセッションへの購読がある場合は watching all sessions(すべてのセッションを監視中)となり、会話がセッションを名前でも指定しているときは (+N listed)(+N 件を指定)が続きます。0.9.16 で追加 その横の小さなヒントには、購読のオプションとして digest N min(ダイジェスト N 分)または quiet HH:MM–HH:MM が最大 2 つ表示されます。チップをクリックすると一覧が開きます。購読ごとに 1 行で、セッション(またはリレー)、イベント、そして once かハートビート付きか、0.9.16 で追加 ダイジェスト、サイレント時間、除外したセッションがあるかが表示されます。除外したセッションは N left out(N 件を除外)と示されます。Unsubscribe(購読を解除)を押すと、エージェントに確認せずにその購読をすぐに終了します。
watched バッジ #
別の会話から名前で見守られているセッションには、セッションリストとそのヘッダーに watched(監視中)バッジが付きます。バッジにカーソルを合わせると、誰が見守っているかが表示されます。ペアリングしたリレー上のエージェントは、そのセッションとリレーとして表示されます。すべてのセッションへの購読では、セッションリストにはバッジが付かず、各セッションのヘッダーにだけ付きます。ペアリングしたリレーに対するあなたの購読では、こちら側にバッジは付きません。0.9.16 で追加 すべてのセッションへの購読から除外されたセッションには、その購読のバッジは表示されません。
イベント行 #
見守る側のトランスクリプトでは、イベントは relay event(リレーイベント)というタグの付いたコンパクトな行として表示され、ユーザーのメッセージとして扱われることはありません。次のように 1 行に折りたたまれています。
relay event 3 events · question, reply
開くと、たとえば次のような行を読めます。
[relay event] session "Review: server/" (3f9c…): turn_end (done) "Found 4 places without input checks: …"
質問やエラーを含む行は開いたままです。1 時間あたりの上限で保留されたイベントをまとめた行は Digest(ダイジェスト)で始まります。0.9.16 で追加 購読のダイジェストがまとめた行も同様で、サイレント時間中に保留された行は After quiet hours(サイレント時間の後)で始まります。replayed(リプレイ)というタグの付いた行には、接続が切れていた間にペアリングしたリレーが保持していたイベントが入っています。
行の裏にあるメッセージは、これが自動のメッセージでユーザーからのものではなく、何も承認しない、と述べる行で始まります。エージェントもこの行を読みます。
見守る側が作業中のとき #
- アイドル時。 メッセージが新しいターンを開始します。
- ターンの途中。 Claude、DeepSeek、GitHub Copilot と OpenAI の SDK エンジンでは、メッセージは実行中のターンに軌道修正として送り込まれます。ほかのプロバイダーでは、メッセージは待機して次のターンになります。メッセージが待機している間に届いたイベントはそのメッセージに追加されるので、忙しい見守る側が受け取るフォローアップはイベントごとではなく 1 件です。
ペース配分 #
起こすたびに見守る側は 1 ターンを費やすので、OAR は起こす回数を制限します。
- まとめる。 30 秒以内のイベントは 1 つのメッセージとして届きます。
- 1 時間あたりの上限。 直近 1 時間で 20 回起こした後は、残りは保留され、10 分ごとにダイジェストとして送られます。直近 1 時間の起こした回数が 20 回未満になると、すぐに 30 秒ごとのまとめでの起こし方に戻ります。
- 保留しないもの。 質問、0.9.16 で追加 ask へのユーザーの回答、エラーは、上限を超えていても常にすぐ届きます。ただし上限の回数には数えられます。
- 停滞。 ターンまたはバックグラウンドタスクがまだ実行中なのに 15 分(または購読が選んだ時間)出力がないと、セッションは停滞と見なされます。無出力の期間ごとに 1 回だけ報告されます。回答を待っているセッションは停滞と見なされません。その質問はすでに報告済みだからです。
- ハートビート。 エージェントが求めた場合、見守っているターンやタスクが実行中の間はその間隔でメッセージを受け取り、すべてがアイドルの間は受け取りません。ハートビートは、監視が機能していることを見守る側に伝えます。ハートビートはダイジェスト用に保留されず、上限の回数にも数えられません。
同じ数値は、リファレンスのイベントの届き方にもあります。
起こす回数を減らす 0.9.16 で追加 #
エージェントは、購読ごとに起こす回数を減らすよう求めることができます。質問とエラーはそれでもすぐに届き、それ以外はすべて待機します。
| オプション | 動作 |
|---|---|
ダイジェスト(digest_、1〜1440) |
購読のイベントが N 分ごとに 1 つのメッセージとして届きます。次のメッセージは、早くても前回の N 分後です。 |
サイレント時間(quiet_、例:{"from":"23:) |
タイムゾーンで指定する毎日の時間枠です。日付をまたいでもよく、時計の切り替えにも従います。時間枠の中で起きたことは、時間枠の終わりに 1 つのメッセージとして届き、サイレント時間中に保留されたものとして示されます。時間枠の中ではハートビートは送られません。 |
セッションの除外(exclude、最大 50 個のセッション ID) |
すべてのセッションへの購読が、これらのセッションを無視します。「もう何も実行されていない」の判定とハートビートでも無視します。 |
時計が戻されて終了時刻が 2 回来る夜は、時間枠は 1 回目で終わり、繰り返される 1 時間の中で再び始まることはありません。時計が進められて終了時刻が飛ばされる夜は、時計が進んだ瞬間に終わります。制限が 1 つあります。開始時刻が繰り返される 1 時間の中にある場合、時間枠は 1 回目で始まり、2 回目では開始時刻より前の分は時間枠の外として扱われます。
エコーなし。 見守る側が自分でセッションにプロンプトを送り、完了した返信を待つ場合(send、create_、または後の wait から)、そのターンの返信で 2 回目に起こされることはありません。そのターンのエラーと質問ではこれまでどおり起こされ、待たなかったプロンプトでも以前と同じく起こされます。
保留されたイベントはリレーを再起動しても残り、1 時間あたりの上限も引き続き適用されます。エージェントは list_ で、各購読が保留しているイベントの数と、それがいつ届くかを確認できます。詳細はリファレンスの起こす回数を減らすにあります。
購読の有効期間 #
購読は次の場合に終了します。
- エージェントまたはユーザーが購読を解除した。
- 見守る側の会話がアーカイブまたは削除された。
- 見守っているセッションがアーカイブまたは削除された。複数のセッションを指定した購読は残りのセッションを保ち、最後のセッションとともに終了します。
- once の購読で、発火した(正規表現がある場合は最初に一致したとき)。
- ペアリングしたリレーの場合、ペアリングが削除された。そのリレーでの購読はすぐに終了します。
購読と、まだ届けていないイベントは、リレーを再起動しても残ります。
1 つの会話が同時に持てる購読は 20 件です。
ペアリングしたリレーのセッション #
ペアリングしたリレー上のセッションを見守るには、そのリレーでの relay_ 呼び出しと同じ条件が必要です。
- そのリレーが会話内でロック解除されている。
- このリレーに対する Agents may(エージェントの権限)のレベルが、少なくとも読み取りである(ペアリングしたリレーで許可されること)。
- 相手のリレーが他のリレーのエージェントを受け付けている:Accept prompts from other relays' agents(他のリレーのエージェントからのプロンプトを受け付ける)。
カードは、上で説明したとおりこちら側で確認されます。ペアリングは片方向にだけあれば十分です。こちらのリレーは数秒ごとに相手のリレーからイベントを取得し、その行は相手のリレー名で始まります。
[relay event] build-box · session "Nightly deploy" (77aa…): turn_end (done) "Deployed. The health check is green."
相手のリレーが 1 分間応答しないと、接続は切れたと見なされます。相手のリレーは起きたことを保持します。購読ごとに最大 500 件のイベントを、最長 7 日間です。再び応答すると、replayed というタグの付いた 1 行がそれらを取り込みます。質問とエラーが先で、link_ 行と link_ 行の間に入ります。保持できる量より多くのことが起きていた場合は、最後の行に破棄された件数が表示されます。7 日間誰も取得しなかった購読は、相手側で終了します。0.9.16 で追加 リプレイされたイベントも、ほかのイベントと同じく購読のダイジェストとサイレント時間に従います。その場合、最後の行には、そのうち何件が後で届くかが表示されます。
0.9.16 で追加 ペアリングしたリレーへの購読のダイジェストとサイレント時間は、見守る側のいるこちら側で適用されます。相手のリレーには、どのセッションが除外されているかが伝えられます。古い OAR を実行しているペアリングしたリレーは exclude を知りません。こちらのリレーはそれらのセッションのイベントを引き続き破棄しますが、相手のリレーは「もう何も実行されていない」の判定、停滞、ハートビートの一覧でそれらのセッションを数えます。
古い OAR を実行しているペアリングしたリレーは、更新が必要だと応答します。
プロバイダー別 #
どのセッションを見守れるかはプロバイダーによりません。リレーのどのセッションでも見守れます。違いがあるのは、見守る側のセッションです。
| 見守る側のセッションのプロバイダー | 購読できるか | ターン実行中のイベント |
|---|---|---|
| Claude | はい | 実行中のターンに軌道修正として送り込まれる |
| DeepSeek 0.9.17 で追加 | はい | 実行中のターンに軌道修正として送り込まれる |
| GitHub Copilot、OpenAI、SDK エンジン | はい | 実行中のターンに軌道修正として送り込まれる |
| GitHub Copilot、OpenAI、拡張機能エンジン | はい | 次のターンになる |
| Cursor | はい | 次のターンになる |
| Grok | はい | 次のターンになる |
| Claude Cloud | いいえ:relay_ がありません |
|
| OpenAI Image | いいえ:Images API を呼び出すだけで、エージェントを実行しません |
そもそもどのプロバイダーが relay_ を持つかは、エージェントツールにあります。
更新前に開始したセッション
セッションワーカーは、開始時にツールを組み立てます。0.9.10 に更新したときにエージェントがすでに実行中だった会話は、再起動するまで subscribe を持ちません。アイドル状態のセッションで Kill session(セッションを強制終了)を実行すれば十分です。