跳至內容

遙控與流動裝置

Control Center 是一款桌面應用程式,但它所追蹤的工作不會在你離開書桌時停下來。 遙控會把你的手機與你的 cc_server 配對,所用的是 Remote——位於 remote.usectrl.dev 的夥伴應用程式 ——讓你可以從手機跟進機群:閱讀訊息與工單、回覆代理、整理你的資訊動態,而伺服器上 的音訊、轉錄、原始碼與憑證,始終不會離開伺服器。

不妨把它看成桌面主介面一個以讀取為主的夥伴。它並非用來取代完整的桌面用戶端。

手機經由 WebSocket 觸達 cc_server:可以是直接連線(回送、LAN、tailnet 或 wss://),也可以是訊號中介上需邀請才能加入的房間,由該中介轉發已密封的訊框。 這裏沒有點對點的資料通道。

已配對的手機只能觸達伺服器介面中一小塊刻意劃定的範圍:

  • 讀取工單、代理、空間及其訊息,以及你的資訊動態
  • 回覆:在空間中傳送訊息、更新或指派工單、把文章標為已讀或已儲存
  • 執行劇本:以參數實例化一個已儲存的計劃範本。它只會_提出_計劃;在操作人員 於完整用戶端的 Plan Studio 批准之前,不會有任何執行或花費
  • 切換工作區,在手機自己的選擇器裏

差不多就是全部。相比完整用戶端,手機是權限較低的主體。它不能啟動程序、動用 LLM 預算、推送到 GitHub,也不能建立工作區。它是如何被真正強制執行而不只是設計 意圖,見存取模型。

連線依托一條中介轉發的中繼:伺服器以房間擁有者的身分,加入 wss:// 中介上 一個需邀請才能進入的房間,而每個已配對的用戶端——桌面、Web、手機——都憑一個有 時限的准入權杖加入同一個房間。有三部分共同發揮作用:

組成部分 角色
Remote(手機應用程式) 夥伴 Web 應用程式,預設由 remote.usectrl.dev 託管,亦可自託管。它在瀏覽器中載入,並把配對記錄保存在 IndexedDB 中。
中繼中介 一條無狀態的 wss:// 中繼(cc_signaling_server),託管 N 方房間。它只承載不透明的訊框:每個負載都在手機與伺服器之間端到端密封,因此中介從不會看到應用程式資料或配對密鑰,也從不解讀它所轉發的內容。
cc_server 房間的擁有者。它經由其他所有用戶端所用的同一個調度器,回應手機的呼叫。

一次配對邀約會帶上一個連線描述符,列出通往伺服器的每一條路徑(LAN、tailnet、 公開 wss://、中繼),以及伺服器的身分指紋。手機的解析器會挑選最佳的可達路徑, 並在首次連線時釘選該指紋(TOFU);即使沒有直接路徑,中繼也能保證連通,同時始終 無法讀取流量。

配對憑證由應用程式簽發,並以深層連結交付;具體步驟見 配對裝置。這裏重要的是它的結構。

https://<pwa-host>/#<payload>

負載位於 URL 的片段,也就是 # 之後、瀏覽器從不傳送給伺服器的那一段,因此 PWA 的 HTTPS 主機從不會看到它。它帶齊手機觸達伺服器並證明自己身分所需的一切: 連線描述符(每條路徑加上身分指紋)、一個新簽發的裝置 id、一個 32 位元組的預共享 密鑰,以及一個到期時間戳。手機會解碼它、在本地儲存配對記錄,並去掉片段,讓密鑰 離開 URL。

負載有兩種形態,二者不可互換。由應用程式內配對面板簽發的手機二維碼,就是上述 指向 Remote PWA 主機的 v2 PairingPayload。cc_server pair --client-url 發出的 是另一種較舊的 v1 連結({s, i, k} —— 伺服器 URL、裝置 id、密鑰),只供 Web 用戶端使用。

兩者的有效期也不同,這一點很容易搞錯:

簽發方式 憑證到期時間
應用程式內配對面板(pairing.mint) 一律 30 天
命令列上的 cc_server pair 無 —— 憑證不會到期

已配對的裝置是已驗證但不受信任的。若干道各自獨立的關卡,令一次獲批(或洩漏) 的配對不會變成對伺服器的完全控制。

有效的配對密鑰只證明你是_哪部裝置_。你可以讀取或更改甚麼,取決於你的工作區 角色——每次呼叫都會重新解析——以及任何會揭露程式庫內容的操作上按程式庫授予的 權限。一部持有完全有效密鑰、但所屬使用者並非所指名工作區成員的裝置,會被拒絕, 並回覆 “Not a member of this workspace”。

角色下限由操作的種類推導,除非操作自行聲明:讀取需要 guest,變更需要 member,破壞性操作需要 admin。

除角色檢查之外,手機工作階段所帶的能力也低於桌面或 Web 工作階段。聲明為僅限完整 用戶端的操作,會在處理程式執行之前就對手機拒絕,無論其背後的使用者權限有多高: 簽發、列出、重新命名與撤銷裝置配對;讀取與設定隧道連線;伺服器備份與工作區 匯出/匯入;程序偵測與終止;配接器探測;伺服器設定;SSO 管理;機群控制;以及 接管或交回正在執行的代理。

具體到 MCP 工具介面(tools/call),哪些工具可由手機呼叫,由一份預設拒絕的允許 清單決定。未列入清單的工具會在執行之前被拒絕。這份清單以讀取與觀察為主,另加少量 僅限本機的寫入——一則訊息、一次工單更新、一個文章標記——它們不消耗 LLM 預算、 不啟動程序,也不接觸任何外部系統。

例如會被拒絕的:諮詢代理、開始 AI 審查、終止代理、把審查發佈到 GitHub、招募或 解僱代理、建立工作區。

伺服器不保存「當前工作區」。它按設計是無狀態的:每個以工作區為範圍的呼叫, 都必須在其引數中指明目標 workspace_id,而當該項缺失、或所指的工作區並非伺服器 已註冊的,調度器會在開啟任何資料庫之前直接拒絕該呼叫。因此手機永遠無法繼承或 漂移到另一個用戶端的範圍,而指名一個外來工作區也無補於事,因為第 1 道關卡中的 成員身分檢查仍然適用。這與產品其餘部分所強制執行的 工作區隔離是同一項不變式。

5. 以預共享密鑰為金鑰的端到端密封訊框

標題為「5. 以預共享密鑰為金鑰的端到端密封訊框」的章節

手機與伺服器之間的每個訊框都以配對密鑰密封;准入權杖只讓用戶端進入房間,它不 解密任何東西。中介轉發的只是密文,從不會看到密鑰。已撤銷的裝置會發現自己的憑證 早已消失,因此重新連線時會失敗即關閉。

由應用程式簽發的憑證有時限,為 30 天;過了期限,連線關卡會判定它失敗,手機必須 重新配對。撤銷是即時的:伺服器監看裝置資料表,會在數秒內中斷已撤銷裝置的現有 工作階段,而不是等它下次連線。

滑動視窗限速器把遙控工具流量限制在每分鐘 120 次呼叫,並對變更類動作再加一個較緊 的每分鐘 30 次子上限。額度屬於主體,而不是工作階段:你的三部裝置共用同一份 額度,因此被騎劫的用戶端無法藉着開更多工作階段來換取餘裕,一個吵鬧的成員也無法 令其他人無額度可用。

中繼中介刻意保持笨拙:它託管房間、轉發密封訊框,不保存任何帳戶、應用程式資料或 密鑰。房間需邀請才能進入,而且是暫時性的。應用程式資料、音訊、轉錄、原始碼與 憑證全都留在伺服器上。

配對之後,手機會以通知訊框的形式收到即時更新——新的代理訊息、指派給你的工單、 狀態變更——與桌面端自己的通知如出一轍。伺服器會把這些訊框廣播給每個已連線的 工作階段,而工作區篩選在用戶端一側套用,因此你看到的內容限定於你正在查看的那個 工作區。

介面 顯示內容
設定 → 你 → 你的裝置(/workspaces/:workspaceId/settings/you/devices) 已配對的用戶端及其即時狀態,另有配對新用戶端(網頁瀏覽器、桌面應用程式或手機)與撤銷

同一個面板也會為第二個瀏覽器或桌面應用程式簽發配對,並不限於手機——流程完全相同, 只有深層連結不同。