內嵌瀏覽器

每個工作區都內建自己的網頁瀏覽器:一個完整的 Chromium,會以窗格形式在終端機旁開啟。它的存在是為了讓代理程式能看見網頁 — 打開它剛建好的應用程式、閱讀文件頁面、重現錯誤、逐步操作某個流程 — 同時也讓你能觀看(並操作)它所使用的同一個瀏覽器。此瀏覽器在自己獨立的可拋棄式輔助 VM 中執行,與工作區 VM 分離,因此惡意頁面永遠碰不到代理程式的檔案或你的 Mac。

本章是使用它的完整指南:開啟它、親手操作、透過內建的瀏覽器 MCP 伺服器讓代理程式操作、維持登入狀態,以及隱私模型。這與工作階段中介紹的是同一個窗格;當遠端代理程式透過完整用戶端連線操作它時,此處所述的一切同樣適用。

開啟瀏覽器

⌃⌘B 切換瀏覽器窗格,或按一下工作階段視窗工具列中的地球儀按鈕。它會以分割窗格的形式在舞台右緣開啟,與終端機共用同一個視窗。

第一次開啟它時 — 是以每台 Mac 為單位,而非每個工作區 — 會出現一張同意卡片,詢問安裝瀏覽器?,並提供下載並安裝現在不要。瀏覽器映像檔是約 500 MB 的一次性下載,由每個工作區共用。在安裝完成前,窗格會顯示安裝提示而非頁面;你也可以在工作區的瀏覽器設定中以立即下載預先取得它。

安裝完成後,瀏覽器 VM 會在任一工作區第一次開啟此窗格(或代理程式第一次呼叫瀏覽器工具)時延遲啟動,這需要一兩秒。你不需要直接管理此 VM — 它會為你自動建立、暫停與拆除(請參閱生命週期與資源使用)。

附註: 瀏覽器執行於一個與你代理程式 shell 所在不同的 VM。兩者共用一個私有網路(請參閱載入開發伺服器),但它們並非同一台機器 — 代理程式寫入其主目錄的檔案不會出現在瀏覽器的磁碟上,而瀏覽器中的 localhost 也不是代理程式的 localhost

自行操作

此窗格是一個無邊框的瀏覽器檢視,位於一個精簡、Safari 風格的分頁列之下:

控制項功能
上一頁 / 下一頁箭頭按鈕,或 ⌘[⌘]
分頁膠囊每個開啟的分頁對應一個膠囊。作用中的膠囊同時兼作網址欄(「搜尋或輸入 URL」):輸入純主機名稱會自動加上 https://;輸入任何不是 URL 的內容則會變成 Google 搜尋。
+新增分頁(窗格取得焦點時按 ⌘T)。
開發者工具切換 Chromium 的開發者工具(F12)— 完整的元素檢視器、主控台與網路面板。
網站資訊按一下網站圖示可顯示網站資訊彈出視窗,包含 HTTPS 頁面上的憑證鏈。
分享目前頁面的標準 macOS 分享選單。

拖曳窗格的左緣可調整其大小(預設為 640 點,可在 380 到 1400 之間調整;終端機始終保留至少 240 點)。將它拖曳到最小寬度以下即可關閉窗格。

附註: 當瀏覽器檢視擁有鍵盤焦點時,⌘Q⌘Tab 會被客體攔截,好讓頁面內的快速鍵能運作 — 它們不會結束應用程式或切換 macOS 應用程式。按一下終端機或側邊欄,即可將這些快速鍵交還給 macOS。

載入代理程式啟動的開發伺服器

開啟瀏覽器最常見的原因,是查看代理程式正在建置的東西。由於瀏覽器 VM 與工作區 VM 共用同一個 NAT 子網路,它可以直接連上代理程式啟動的開發伺服器 — 但不能透過 localhost,因為瀏覽器是一台獨立的機器。

請透過工作區 VM 的 IP 位址連上開發伺服器:

  1. 照常在代理程式的終端機中啟動伺服器(例如在連接埠 3000 上的開發伺服器)。
  2. 從工具列的 IP 膠囊複製工作區的 IP(或在代理程式的終端機中執行 hostname -I)。
  3. 在瀏覽器中前往 http://<workspace-ip>:3000

當代理程式自行操作瀏覽器時,它會被指示要完全照這麼做 — 透過 LAN IP 而非 localhost 連上開發伺服器 — 這樣它的螢幕截圖與檢查才會命中正確的伺服器。

讓代理程式操作

此瀏覽器是代理式的:每個工作區代理程式都會自動獲得一個內建的 browser MCP 伺服器,無需任何設定。它的工具讓代理程式能開啟頁面、點擊、輸入、讀取 DOM、擷取螢幕截圖,以及檢視主控台與網路 — 操作的正是你所看到的那個窗格。你和代理程式共用一個瀏覽器:代理程式開啟的頁面會出現在你的窗格中,而你開啟的分頁也能被代理程式的 browser_list_tabs 看見。

你不需要開啟這項功能。只要請代理程式做需要用到瀏覽器的事情即可 — 例如:

Open http://<workspace-ip>:3000, click "Sign up", fill the form with a test
account, and tell me if the confirmation page renders. Screenshot it.

代理程式的工具呼叫可以為選定的工作區自動啟動並顯示瀏覽器;若窗格已關閉,工具呼叫會將它開啟並等待冷啟動。(在一個工作階段中,一旦你手動關閉窗格後,它便絕不會自行重新開啟,因此你始終掌控它是否顯示。)

會觸發瀏覽器的提示

並沒有「使用瀏覽器」這樣的指令 — 只要你的請求唯有透過載入、看見或操作一個真實頁面才能回答,代理程式就會取用 browser_* 工具。實務上,任何指名 URL、要求代理程式查看點擊某個已算繪內容,或要求螢幕截圖、主控台記錄或網路活動的請求,都會把瀏覽器帶進來。以下是幾種可靠觸發它的樣態:

  • 查看你建置的東西 —「打開我在 http://<workspace-ip>:3000 的開發伺服器,並告訴我儀表板是否正確算繪。」/「擷取到達頁面的全寬螢幕截圖。」/「我把頁首改成藍色了 — 重新載入頁面並確認它看起來正確。」
  • 重現或測試某個流程 —「前往註冊頁面,用一個測試帳號填寫它,送出,並告訴我確認畫面是否出現。」/「逐步操作結帳,並在第一個發生錯誤的步驟停下。」
  • 從頁面讀取或擷取內容 —「打開 <docs URL> 並摘要驗證章節。」/「列出此頁面上每一個對外連結。」/「將定價表擷取為 Markdown。」
  • 偵錯用戶端問題 —「這個購買按鈕沒有反應 — 打開頁面、點擊它,並檢查主控台與網路記錄,找出失敗的請求。」(代理程式使用 browser_consolebrowser_network 來讀取你在開發者工具中所看到的完全相同的內容,你無需複製貼上任何東西。)

你越具體地指向某個頁面或某個螢幕上的操作,代理程式就越直接前往瀏覽器。若你只描述結果(「註冊功能可以運作嗎?」),代理程式通常仍會開啟瀏覽器來檢查 — 但指名 URL 或按鈕可省去一次來回。請記得為開發伺服器提供工作區的 LAN IP,而非 localhost(請參閱載入開發伺服器)。

瀏覽器工具

此伺服器公開 23 個工具,依其功能分組:

群組工具
導覽browser_navigatebrowser_backbrowser_forwardbrowser_reloadbrowser_wait_for
分頁browser_new_tabbrowser_list_tabsbrowser_activate_tabbrowser_close_tab
讀取頁面browser_get_textbrowser_get_htmlbrowser_get_linksbrowser_screenshot(含整頁選項)、browser_evaluate(執行 JavaScript)
互動browser_clickbrowser_fillbrowser_typebrowser_press_keybrowser_pick_element
診斷browser_consolebrowser_networkbrowser_network_summarybrowser_clear_network

browser_evaluate 會在頁面中執行任意 JavaScript 並回傳結果,而 browser_network / browser_console 則為代理程式提供你在開發者工具中會讀到的相同請求記錄與主控台輸出 — 這正是代理程式如何在不需要你手動複製任何內容的情況下,偵錯失敗的 fetch 或用戶端錯誤。browser_pick_element 是唯一會直接牽涉到你的工具,它在下方有專屬的章節。

指向某個元素

在繁忙的頁面上,用文字來指認單一元素是很笨拙的方式 —「第二張卡片」、「那個壞掉的按鈕」、「那個對不齊的標籤」。當代理程式無法判斷你指的是哪個元素時,請它讓你指出來,它便會把控制權交給你,而不是用猜的:

One card in this grid is misaligned — let me point at it. Then read that
element's classes and tell me why it's off.

在這背後,代理程式會呼叫 browser_pick_element,它會直接在瀏覽器窗格中啟用一個互動式選取器:當你將滑鼠移過各元素時,它們會反白,而頂端會出現「點擊某個元素」的橫幅。點擊你所指的元素,代理程式便會立即收到它精確的 CSS 選擇器 — 無需描述、複製或貼上任何東西。你大約有 60 秒的時間可以點擊,之後選取器便會逾時,代理程式將什麼也收不到。

你永遠不需要按「啟用選取器」按鈕或打開任何選單 — 啟用選取器就是代理程式的工具呼叫,因此它會在你一開口的瞬間發生。可靠觸發它的措辭包括:「讓我指給你看」「我來點我指的那個」「哪個元素?我指給你看」,或直接說**「point-and-pick」**。一旦代理程式取得選擇器,它便能對該元素做任何事 — 點擊它、讀取它的文字或類別、監看它,或以它作為錨點來解釋某個版面錯誤 — 因此一個好的後續做法,是在提議指出元素的同時,一併說出你想對該元素做什麼。

提示: 選取器是彌合「我看得到問題,你看不到」這道鴻溝最快的方式。與其描述某個視覺瑕疵,不如指出那個有問題的元素,讓代理程式檢視真正的 DOM 節點。

在底層,這些工具透過一個產生的 Python stdio 墊片 bromure-browser-mcp.py 連上瀏覽器,該墊片以唯讀方式部署到代理程式 VM 的 /mnt/bromure-meta/。它透過 vsock 連接埠 5830 撥接主機並永久重新連線,因此即使跨越瀏覽器拆除,這些工具也絕不會從代理程式的工具清單中消失。完整的工具參考文件位於 CLI、自動化與 MCP

附註:完整用戶端上,遠端代理程式的瀏覽器 MCP 串流可以透過 SSH 連線接合,好讓遠端代理程式操作你在本機觀看的瀏覽器窗格。同一時間只有一個這類轉送處於作用中。

維持登入 vs. 維持可拋棄

在預設情況下,瀏覽器是可拋棄的:它的磁碟是一份短暫的複本,會在瀏覽器拆除時被刪除,因此 cookie、登入資訊與歷史記錄也會隨之消失。每次全新開啟都從乾淨的狀態開始。這是安全的預設值 — 代理程式在瀏覽器中所做的任何事,都不會保留下來或洩漏進後續的工作。

當你需要讓登入狀態延續下去時 — 例如登入代理程式將重新造訪的預備站台、跨重新啟動維持某個工作階段 — 請在工作區的瀏覽器設定中啟用維持網站登入狀態。Chromium 的設定檔屆時會存放在 ~/Library/Application Support/BromureAC/browser-profiles/ 底下一個加密的、各工作區專屬的磁碟上,並在拆除後保留下來。切換此設定會重新啟動工作區的瀏覽器,因此在變更儲存之前你會收到警告。

警告: 開啟維持登入狀態是以可拋棄性換取便利。已儲存的 cookie 與登入資訊,正是遭提示注入的代理程式會試圖外洩的那類東西。對任何指向不受信任程式碼的工作區,請優先採用可拋棄的預設值,並將持續保留保留給僅造訪你信任站台的瀏覽器。

生命週期與資源使用

瀏覽器 VM 會為你管理,並在閒置時保持低耗用:

  • 它會在首次開啟(或代理程式首次呼叫工具)時延遲建立,並以寫入時複製複本的形式從共用的 500 MB 映像檔啟動。
  • 隱藏的瀏覽器會在約 10 秒後暫停,並在收合達 5 分鐘後完全拆除,釋放其記憶體與磁碟。
  • 窗格的開啟/關閉狀態會在應用程式執行期間依工作區記住,但刻意不會跨應用程式重新啟動保留 — 反正可拋棄的瀏覽器本來也無法在重新啟動後存活。

與工作區 VM 不同,輔助的瀏覽器 VM 從預熱池提供的,這也是為什麼在第一次之後,開啟窗格通常感覺是瞬間完成的。

鍵盤快速鍵

以下快速鍵在瀏覽器窗格擁有鍵盤焦點時適用:

快速鍵動作
⌃⌘B切換瀏覽器窗格
⌘T / ⌘W新增/關閉瀏覽器分頁
⌘[ / ⌘]上一頁/下一頁
⌘R重新載入
⌘L聚焦到網址欄(作用中的分頁膠囊)
F12切換開發者工具

疑難排解

窗格顯示安裝提示而非頁面。 瀏覽器映像檔尚未下載。按一下下載並安裝,或從瀏覽器設定立即下載預先取得它(約 500 MB)。

代理程式的頁面無法載入/顯示連線被拒。 代理程式幾乎可以肯定是在使用 localhost。瀏覽器是一台獨立的 VM — 它必須透過工作區 VM 的 LAN IP(在代理程式的終端機中執行 hostname -I,或使用工具列的 IP 膠囊)連上開發伺服器,如載入開發伺服器所述。

⌘Q 或 ⌘Tab 沒有反應。 瀏覽器檢視擁有焦點,並正將它們攔截供頁面內使用。按一下終端機或側邊欄,即可將這些快速鍵交還給 macOS。

登入資訊在工作階段之間消失。 那是可拋棄的預設值。在瀏覽器設定中啟用維持網站登入狀態,即可保留持久的設定檔。

在代理程式使用瀏覽器窗格後,它不會自行重新開啟。 這是設計使然:一旦你手動關閉窗格,它便會保持關閉,直到你重新開啟它為止,即使代理程式持續發出瀏覽器工具呼叫也一樣(這些呼叫仍會執行 — 只是你看不到窗格)。按 ⌃⌘B 即可讓它回來。

相關設定與工具

  • 瀏覽器設定維持網站登入狀態切換開關與瀏覽器映像檔管理。
  • 工作階段 — 在整個工作階段視窗脈絡下的瀏覽器窗格。
  • CLI、自動化與 MCP — 完整的 browser_* 工具參考文件與 vsock 傳輸。