監看 session 0.9.10 新增
agent 可以監看其他 session,而不必一再回頭查看它們。它先訂閱,接著繼續自己的工作或等待;當被監看的 session 發生事情時,OAR 就會喚醒它:有提問等待回答、某個回合失敗、某個 session 回覆了、某個背景任務結束了。喚醒是一則由 OAR 寫進監看者對話中的簡短訊息。
常見的請求:
- 照看一批 session。「監看那三個審查 session。有任何一個提問或失敗就叫醒我,全部完成後把回覆整理成摘要。」
- 等待一個耗時的工作。「在一個 session 裡啟動完整的測試,並監看它。它的背景任務完成時告訴我,失敗的話也說一聲。」
- 留意另一台機器。「監看
build-上的每晚部署 session,有錯誤就告訴我。」box
這些 session 可以在這個中繼上(需啟用 agent session),也可以在配對的中繼上。除了 Claude Cloud 和 OpenAI Image 以外,每個供應商都能監看;這兩者的 session 無法訂閱(見依供應商)。工具本身,也就是 relay_ 的 subscribe,列在參考資料的監看 session 中;本頁說明你會看到什麼、可以控制什麼。
什麼會喚醒監看者 #
訂閱會指定要監看的 session,或某個中繼的所有 session(包括之後建立的)。它可以要求在以下情況收到通知:
| 事件 | 白話說明 |
|---|---|
| Question(提問) | 某個被監看的 session 正在等待回答或核准。訊息會附上問題及其選項。0.9.16 新增 對於不會卡住的提問,訂閱之後也會得知你的回答。 |
| Error(錯誤) | 某個回合失敗、達到了用量上限,或 session 的 agent 處理程序終止了。 |
| Reply(回覆) | 某個 session 完成了一個回合。訊息會附上回覆的開頭。 |
| Task started, finished, failed(任務已開始、已結束、已失敗) | 被監看 session 的某個背景 agent 或 shell 任務已開始(僅在訂閱有要求時)、已完成或已失敗。以非零值結束的 shell 指令算作失敗。 |
| Stalled(停滯) | 某個 session 仍在工作,卻已沉寂一段時間。 |
| All idle(全部閒置) | 被監看的 session 中已沒有任何東西在執行。 |
0.9.13 新增 沒有指定事件的訂閱,不會因為某個順利結束的 shell 指令或 monitor 而被喚醒:忙碌的 session 大約每分鐘就會結束一個,而每次喚醒都會讓監看者花掉一個帶著完整上下文的回合。完成的 subagent 和失敗的任務仍會喚醒它。必須追蹤每個指令的 agent,就要要求接收每一次任務結束。先前建立且未指定事件的訂閱會自動改用這個預設;有指定事件的訂閱則保留原本的事件。
確切的事件名稱,以及訂閱可用的選項(回覆與任務結果必須符合的正規表示式、觸發一次後即結束、判定為 stalled 之前的沉寂時間),都在參考資料中。
監看者自己的對話永遠不會被監看,所以它自己的回合不會喚醒它。
訂閱只負責通知
它不會核准任何事,也不會回答任何事。被監看 session 的提問會一直保持未回答,直到你或獲准回答它的 agent 回答為止,和以前完全一樣。被監看 session 中的核准卡片只能由你回答;事件中也會這樣註明。
核准卡片 #
某個對話中的 agent 第一次訂閱某個中繼的 session 時,必須先問你。該對話中會出現一張核准卡片:
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(允許) | 建立訂閱。這個對話之後對同一個中繼的 session 所做的訂閱,不需要再出現新的卡片。 |
| Deny(拒絕) | 拒絕訂閱。agent 會收到通知,並在沒有這個訂閱的情況下繼續。 |
特殊情況:
- 所有 session。 對
all的訂閱一定會完整寫出:「ALL sessions of this relay, including ones created later」(此中繼的所有 session,包括之後建立的)。0.9.16 新增 當它排除部分 session 時,還會加上「except N it leaves out」(不含其排除的 N 個)。如果第一張卡片不是針對all,之後對all的訂閱會再問一次。如果是,Allow 就涵蓋之後的每個訂閱,包括all。 - 配對的中繼。 卡片會寫出中繼的名稱。每個中繼各自詢問,另一個中繼上則不會詢問任何事。
- 接手。 取代另一個監看者的 agent,可以接手舊監看者的所有訂閱。這一定會詢問,不論你之前允許過多少張卡片。卡片會說明有多少訂閱要移轉、來自哪個 session;舊 session 不再收到這些訂閱的事件,訂閱則保留原本的設定。你的 Allow 也同時算作對相關中繼上訂閱的核准;若其中某個訂閱監看所有 session,
all也包括在內。
0.9.16 新增 卡片也會寫出訂閱的選項:once(僅一次)、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 個 session),計算它所監看的每個不同 session。如果有訂閱監看所有 session,則顯示 watching all sessions(正在監看所有 session);若對話也依名稱列出了 session,後面還會接著 (+N listed)(+N 個已列出)。0.9.16 新增 旁邊的小提示會顯示訂閱的選項,digest N min(摘要 N 分鐘)或 quiet HH:MM–HH:MM,最多兩個。點選小標籤即可開啟清單:每個訂閱一列,列出 session(或中繼)、事件,以及它是 once 還是有心跳,0.9.16 新增 有摘要、勿擾時段,或排除了 session,顯示為 N left out(已排除 N 個)。Unsubscribe(取消訂閱)會立即結束該訂閱,不會詢問 agent。
watched 徽章 #
被其他對話依名稱監看的 session,會在 session 清單和它的標題列中帶有 watched(監看)徽章。將游標移到徽章上即可看到是誰在監看;配對中繼上的 agent 會顯示為它的 session 和中繼。對所有 session 的訂閱不會在 session 清單中加上徽章,只會出現在每個 session 的標題列。你在配對中繼上的訂閱,不會在你這一端加上徽章。0.9.16 新增 被「監看所有 session」的訂閱排除在外的 session,不會因為該訂閱而顯示徽章。
事件列 #
在監看者的對話紀錄中,事件是一個標記為 relay event(中繼事件)的精簡列,絕不會是你的訊息。它會摺疊成一行,例如:
relay event 3 events · question, reply
展開它即可閱讀各行,例如:
[relay event] session "Review: server/" (3f9c…): turn_end (done) "Found 4 places without input checks: …"
含有提問或錯誤的列會保持展開。收集了因每小時上限而暫緩之事件的列,以 Digest(摘要)開頭;0.9.16 新增 由訂閱的摘要收集的列也一樣,而在勿擾時段暫緩的列則以 After quiet hours(勿擾時段後)開頭。標記為 replayed(已重播)的列,包含配對中繼在連線中斷期間保留下來的事件。
這一列背後是一則訊息,第一行說明它是自動產生的、不是你發的,而且它不核准任何事。agent 也會讀到這一行。
監看者忙碌時 #
- 閒置時。 訊息會開始一個新回合。
- 回合進行到一半時。 在 Claude、DeepSeek,以及 GitHub Copilot 和 OpenAI 的 SDK 引擎上,訊息會被導正進執行中的回合。在其他供應商上,它會等待並成為下一個回合。訊息仍在等待時抵達的事件會併入其中,所以忙碌的監看者只會收到一則後續訊息,而不是每個事件一則。
頻率控制 #
每次喚醒都會讓監看者花掉一個回合,所以 OAR 會限制喚醒次數。
- 合併。 30 秒內的事件會合併成一則訊息送達。
- 每小時上限。 過去一小時內喚醒達 20 次後,其餘的事件會暫緩,每 10 分鐘以摘要送出一次。一旦過去一小時內的喚醒少於 20 次,30 秒合併一次的喚醒就會恢復。
- 絕不暫緩。 提問、0.9.16 新增 你對 ask 提問的回答,以及錯誤,一律立即送達,即使超過上限也一樣。它們仍會計入上限。
- 停滯。 當回合或背景任務仍在執行,而 session 已沉寂 15 分鐘(或訂閱選定的時間)時,就算作停滯。每段沉寂期只回報一次。正在等待回答的 session 不算停滯:它的提問已經回報過了。
- 心跳。 如果 agent 要求了心跳,那麼在被監看的回合或任務執行期間,它會依該間隔收到訊息;一切閒置時則不會收到。心跳讓監看者知道監看仍正常運作。心跳不會為了摘要而暫緩,也不計入上限。
同樣的數字也列在參考資料的事件如何送達中。
減少喚醒 0.9.16 新增 #
agent 可以針對每個訂閱要求減少喚醒。提問和錯誤仍會立即送達;其他一切都會等待。
| 選項 | 作用 |
|---|---|
摘要(digest_,1 到 1440) |
訂閱的事件每 N 分鐘合併成一則訊息送達,下一則最早在上一則的 N 分鐘之後。 |
勿擾時段(quiet_,例如 {"from":"23:) |
某個時區中的每日時間窗,可以跨過午夜,並會跟著日光節約時間的調整而改變。時間窗內發生的事會在時間窗結束時合併成一則訊息送達,並標示為在勿擾時段中暫緩。時間窗內不會送出心跳。 |
排除 session(exclude,最多 50 個 session id) |
對所有 session 的訂閱會忽略這些 session,「已沒有任何東西在執行」的判定和心跳也一樣。 |
在時鐘撥回、結束時間出現兩次的那一夜,時間窗會在第一次到達結束時間時結束,在重複的那一小時內也不會再次進入;在時鐘撥快、跳過結束時間的那一夜,時間窗會在時鐘跳躍的那一刻結束。有一項限制:開始時間落在重複的那一小時內時,時間窗會在第一次經過時開始,而在第二次經過時,開始時間之前的那幾分鐘會被算作時間窗之外。
不重複喚醒。 當監看者自己對某個 session 下提示並等待完成的回覆(透過 send、create_ 或之後的 wait)時,那個回合的回覆不會再喚醒它第二次。該回合的錯誤和提問仍會喚醒它,而它沒有等待的提示也會像以前一樣喚醒它。
暫緩的事件在中繼重新啟動後仍會保留,每小時上限也仍然疊加適用。agent 可以用 list_ 查看每個訂閱暫緩了多少事件,以及它們何時到期送出。詳細說明在參考資料的減少喚醒中。
訂閱的有效期間 #
訂閱會在以下情況結束:
- agent 或你取消訂閱;
- 監看者的對話被封存或刪除;
- 某個被監看的 session 被封存或刪除。列出多個 session 的訂閱會保留其他 session,直到最後一個也被封存或刪除時才結束;
- 它是 once 訂閱且已觸發(若有正規表示式,則在第一次符合時);
- 對於配對的中繼,配對被移除:該中繼上的訂閱會立即結束。
訂閱與尚未送達的事件在中繼重新啟動後仍會保留。
一個對話同時最多可以有 20 個訂閱。
配對中繼上的 session #
監看配對中繼上的 session,所需條件和在那裡進行任何 relay_ 呼叫相同:
- 該中繼已在對話中解鎖;
- 它對此中繼的 Agents may(agent 可以)等級至少為讀取(配對的中繼允許什麼);
- 另一個中繼接受其他中繼的 agent,也就是 Accept prompts from other relays' agents(接受其他中繼 agent 的提示)。
卡片會在這裡詢問,如上所述。配對只需要存在於其中一個方向。你的中繼每隔幾秒就會從另一個中繼取得事件,而這些事件的行以另一個中繼的名稱開頭:
[relay event] build-box · session "Nightly deploy" (77aa…): turn_end (done) "Deployed. The health check is green."
如果另一個中繼一分鐘沒有回應,連線就算作中斷。另一個中繼會保留這段期間發生的事:每個訂閱最多 500 個事件,最長 7 天。當它再次回應時,一個標記為 replayed 的列會把這些事件帶進來,提問和錯誤優先,位於 link_ 與 link_ 兩行之間。如果發生的事超過它能保留的數量,最後一行會說明捨棄了多少個。7 天內都沒有人取得的訂閱,會在那一端結束。0.9.16 新增 重播的事件和其他事件一樣,遵守訂閱的摘要與勿擾時段設定;此時最後一行會說明其中有多少個會稍後送達。
0.9.16 新增 對配對中繼的訂閱,其摘要與勿擾時段在這一端(監看者所在的地方)套用;另一個中繼會得知哪些 session 被排除。執行較舊版 OAR 的配對中繼不認識 exclude:你的中繼仍會捨棄那些 session 的事件,但那個中繼在判定「已沒有任何東西在執行」、判定停滯,以及心跳的清單中,仍會把它們算進去。
執行較舊版 OAR 的配對中繼會回應說它需要更新。
依供應商 #
哪些 session 可以被監看與供應商無關:中繼的任何 session 都可以。不同的是負責監看的那個 session。
| 監看方 session 的供應商 | 能否訂閱 | 回合執行期間的事件 |
|---|---|---|
| Claude | 是 | 導正進執行中的回合 |
| DeepSeek 0.9.17 新增 | 是 | 導正進執行中的回合 |
| GitHub Copilot、OpenAI,SDK 引擎 | 是 | 導正進執行中的回合 |
| GitHub Copilot、OpenAI,擴充功能引擎 | 是 | 成為下一個回合 |
| Cursor | 是 | 成為下一個回合 |
| Grok | 是 | 成為下一個回合 |
| Claude Cloud | 否:它沒有 relay_ |
|
| OpenAI Image | 否:它呼叫 Images API,不執行任何 agent |
哪些供應商會拿到 relay_,請見 Agent 工具。
在更新之前啟動的 session
session worker 會在啟動時建立它的工具。若對話的 agent 在你更新到 0.9.10 時就已在執行,它在重新啟動之前都沒有 subscribe:對閒置的 session 使用 Kill session(強制結束 session)就夠了。