Repository navigation
v1.12.1
A controller patch release over 1.12.0. Most of its fixes concern the page a navigation the gate stopped leaves
behind, Chrome's error page (chrome-error://chromewebdata/). One closes a DevTools session leak that any page could
hit. The client, LangChain and MCP bridge packages change only in version; update the controller image to get it.
Upgrade notes
- Status codes that changed. Over REST, a fork without
start_urland a shadow browse from Chrome's error page
answer 400 (1.12.0: 403 and 500). Over MCP, both answer a fixederrorwith nocode(1.12.0:
not_permitted). A shadow browse from a refused,data:orblob:page answers 403 (1.12.0: 500). - A new key, absent unless a navigation was stopped.
blocked_navigationcan now appear on observe,
browser.get_htmland an action result'safterobservation, beside the tab list's.
Fixed
- Fork and shadow browse from Chrome's error page. A session whose last navigation the gate stopped, or that
failed, sits onchrome-error://chromewebdata/.POST /sessions/{id}/forkwithoutstart_url, and
POST /sessions/{id}/shadow-browse, now answer 400 before exporting any state, anddetailsays the page is
Chrome's error page for a navigation that was stopped or failed; for fork, it says to passstart_url, which
works as before. In 1.12.0, fork exported the session's state and then answered 403 "Not permitted", and shadow
browse answered an unhandled 500: a REST client that branches on the status now sees 400 where it saw 403 or
500. Over MCP,browser.fork_sessionandbrowser.enable_shadow_browseanswered
{"error": "URL scheme 'chrome-error' is not allowed; only http and https are", "code": "not_permitted"}; they
now answer the fixed text aserror, with nocode. - Shadow browse over REST from a refused,
data:orblob:page answered an unhandled 500 with a traceback.
It answers 403, as fork does: a pageALLOWED_HOSTSrefuses gets the page routes' detail, any other refusal
"Not permitted". - The built-in agent loop saw no label.
/agent/step,/agent/runand the queued and cron runs prompt the
model with a compact observation that droppedblocked_navigation, so on Chrome's error page the model saw the
page with no word on what was stopped. The compact observation keeps it. - A DevTools session left attached after a slow target lookup. The read of a page's target id is bounded. When
the bound fired while the browser was still opening the session the read uses, the session it then opened stayed
attached for the life of the page. It is now detached once it opens.
Changed
- The error page says what was stopped. While a session's page is Chrome's error page for a navigation the gate
stopped,observe(GETandPOST /sessions/{id}/observe, MCPbrowser.observe),browser.get_htmland an
action result'safterobservation (so theactions.jsonlrecord and the witness receipt built from it) carry
blocked_navigation: the origin of the stopped request, the reason and an explanation, as the tab list did in
1.12.0. The error page's own DOM is returned as before; it carries the refused URL in full, path and query
included, since the page chose that URL. The label goes once a later request of the page continues, whatever
became of it. The tab list decides it on the URL it lists, as 1.12.0 did, so a tab listed as allowed never
carries one; observe takes the active tab's, so the two agree and the block is looked up once per observation.