diff options
| author | Igor Soarez <igor@soarez.org> | 2026-07-28 21:46:00 +0100 |
|---|---|---|
| committer | Igor Soarez <igor@soarez.org> | 2026-10-14 12:17:36 +0100 |
| commit | 233f29aedf004699a97dbd9aee087e239f4a9e47 (patch) | |
| tree | 9b7dca7e4943f86905764052d671c0ef5b348fca /src/setup.ts | |
| parent | 384688bf85ba5c806a40a059983f43ca537385cb (diff) | |
feat(cdp): BU_CDP_HTTP to attach to a browser on another host
Upstream can only drive a browser on localhost. The pi extension always goes
through the daemon (src/index.ts uses createDaemonTransport), the daemon
resolves Chrome with discoverWsUrl() (src/daemon/bridge.ts), and that probe is
hardcoded to 127.0.0.1 (src/cdp/discovery.ts). BU_CDP_WS is read only by the
in-process client (src/client.ts), which that path never touches, so it has no
effect on the extension - the only workaround is relaying the remote browser
onto localhost first.
BU_CDP_HTTP="host:port" points at the remote CDP HTTP endpoint. It is resolved
inside discoverEndpoint(), so the daemon and the client both honour it.
Deliberately an HTTP endpoint rather than a WebSocket URL: it is re-resolved on
every discovery call, so the browser UUID is re-read after the remote browser
restarts. Chrome re-mints that UUID on every launch, so a pinned WebSocket URL
goes stale as soon as the remote browser is recycled.
Also skips performSetup's local-process precondition when BU_CDP_HTTP is set:
isBrowserRunning() enumerates local processes and can never see a remote
browser. Step 4 still fails loudly if it is unreachable.
No userDataDir is returned for remote endpoints, since the profile registry
lives on the remote host - profile enumeration degrades to the pre-profile
behaviour rather than reading the wrong machine's Local State.
Diffstat (limited to 'src/setup.ts')
| -rw-r--r-- | src/setup.ts | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/setup.ts b/src/setup.ts index 395fff4..44dfc2c 100644 --- a/src/setup.ts +++ b/src/setup.ts @@ -22,9 +22,15 @@ export function registerSetupCommand(pi: ExtensionAPI, client: BrowserClient): v export type SetupResult = { success: true; data: string } | { success: false; error: string }; export async function performSetup(client: BrowserClient, ctx?: ExtensionContext): Promise<SetupResult> { - const chromeRunning = await isBrowserRunning(); - if (!chromeRunning) { - return { success: false, error: "No browser instance running. Please open your browser and then run /browser-setup." }; + // Step 1: Check Chrome is running + // LOCAL PATCH: isBrowserRunning() enumerates *local* processes, so it can + // never see a browser reached via BU_CDP_HTTP. Skip the precondition in that + // case — step 4 still fails loudly if the remote browser is unreachable. + if (!process.env["BU_CDP_HTTP"]?.trim()) { + const chromeRunning = await isBrowserRunning(); + if (!chromeRunning) { + return { success: false, error: "No browser instance running. Please open your browser and then run /browser-setup." }; + } } const daemonReady = await ensureDaemon(); |
