the browser relay leaves, and /scrape stops pretending to be it

plugins/browser now owns the extension, the relay, the CDP bridge, the pairing routes and the two
panels. All of it was on disk and switched off since 2026-08-13 — nothing was recovered from history,
and nothing regressed, because none of it had been running.

What the platform keeps is /scrape, and the two were never one feature split in half. Scrape launches
a headless chromium through playwright as the OWNER and knows nobody; the plugin attaches to the
browser a person is already signed into, scoped per pairing. The permission is renamed "Scraping" so
the registry stops describing one thing in the other's words, and it drops the /browser frontend route
it could no longer serve.

Two dead screens went with it. BrowserScreen and DesktopScreen were officer-web screens rendering
panels through appType placeholders — a plugin supplies its own route and panels through
Plugins.gen.tsx, so both were redundant the moment their plugins existed. DesktopScreen was a leftover
from this morning's extraction that typechecked cleanly while rendering a panel the AppRegistry no
longer had: dead at runtime, invisible to the compiler.

The long comment in server.tsx explaining BROWSER_RELAY_PORT goes too, replaced by a pointer to where
it lives now. It was written for whoever did this extraction, and this is that.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 01:05:11 +00:00
co-authored by Claude Opus 5
parent 581ec28fc5
commit e44c0c7665
31 changed files with 34 additions and 3005 deletions
+7 -9
View File
@@ -326,19 +326,17 @@ const CORE_REGISTRY: Permission[] = [
// `kind: 'execution'` to a plugin's own, and the property survived the move: a plugin permission has no
// kind, so "runs as the owner and cannot be shared" is expressed as `ownerOnly: ['/']` in the plugin's
// manifest instead. Same answer, stated where the paths are.
// `/browser` — the Chrome-extension relay — is unmounted as of 2026-08-13 and dropped from this claim,
// because check 2 of assertPermissionTotality refuses to boot on a permission claiming a prefix nothing
// serves. Put both back together or neither.
//
// `/scrape` is untouched and is what this permission still covers. It shares nothing with the relay: it
// launches its own headless chromium through playwright and never speaks to the extension.
// The relay left for `plugins/browser` on 2026-08-21, taking `/browser` and its frontend route with it.
// What stays is `/scrape`, and the two were never the same thing wearing one word: scrape launches a
// headless chromium through playwright as the OWNER and knows nobody, which is why this is still
// `execution`. The plugin attaches to whoever is holding the keyboard, scoped per pairing, and is
// grantable for exactly that reason.
{
key: 'browser',
label: 'Browser',
description: 'Drives a real browser on the host',
label: 'Scraping',
description: 'Fetches and renders a page in a headless browser, as the server owner',
kind: 'execution',
api: ['/scrape'],
routes: ['/browser'],
},
// ── admin: the platform administering itself ────────────────────────────────────────────────────