Skip to content

v1.12.1

Choose a tag to compare

@github-actions github-actions released this 30 Oct 07:45
· 240 commits to main since this release
fad124c

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_url and a shadow browse from Chrome's error page
    answer 400 (1.12.0: 403 and 500). Over MCP, both answer a fixed error with no code (1.12.0:
    not_permitted). A shadow browse from a refused, data: or blob: page answers 403 (1.12.0: 500).
  • A new key, absent unless a navigation was stopped. blocked_navigation can now appear on observe,
    browser.get_html and an action result's after observation, 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 on chrome-error://chromewebdata/. POST /sessions/{id}/fork without start_url, and
    POST /sessions/{id}/shadow-browse, now answer 400 before exporting any state, and detail says the page is
    Chrome's error page for a navigation that was stopped or failed; for fork, it says to pass start_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_session and browser.enable_shadow_browse answered
    {"error": "URL scheme 'chrome-error' is not allowed; only http and https are", "code": "not_permitted"}; they
    now answer the fixed text as error, with no code.
  • Shadow browse over REST from a refused, data: or blob: page answered an unhandled 500 with a traceback.
    It answers 403, as fork does: a page ALLOWED_HOSTS refuses gets the page routes' detail, any other refusal
    "Not permitted".
  • The built-in agent loop saw no label. /agent/step, /agent/run and the queued and cron runs prompt the
    model with a compact observation that dropped blocked_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 (GET and POST /sessions/{id}/observe, MCP browser.observe), browser.get_html and an
    action result's after observation (so the actions.jsonl record 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.