diff --git a/src/browser/config.test.ts b/src/browser/config.test.ts index 8ca609f13b6..4c98e134039 100644 --- a/src/browser/config.test.ts +++ b/src/browser/config.test.ts @@ -58,6 +58,19 @@ describe("browser config", () => { }); }); + it("keeps local browser relay defaults when gateway.mode=remote", () => { + withEnv({ OPENCLAW_GATEWAY_PORT: undefined }, () => { + const resolved = resolveBrowserConfig(undefined, { + gateway: { mode: "remote", port: 443 }, + }); + expect(resolved.controlPort).toBe(18791); + const chrome = resolveProfile(resolved, "chrome"); + expect(chrome?.driver).toBe("extension"); + expect(chrome?.cdpPort).toBe(18792); + expect(chrome?.cdpUrl).toBe("http://127.0.0.1:18792"); + }); + }); + it("supports overriding the local CDP auto-allocation range start", () => { const resolved = resolveBrowserConfig({ cdpPortRangeStart: 19000, diff --git a/src/browser/config.ts b/src/browser/config.ts index a5bc131766a..44aff404f2e 100644 --- a/src/browser/config.ts +++ b/src/browser/config.ts @@ -1,5 +1,5 @@ import type { BrowserConfig, BrowserProfileConfig, OpenClawConfig } from "../config/config.js"; -import { resolveGatewayPort } from "../config/paths.js"; +import { DEFAULT_GATEWAY_PORT, resolveGatewayPort } from "../config/paths.js"; import { deriveDefaultBrowserCdpPortRange, deriveDefaultBrowserControlPort, @@ -205,7 +205,17 @@ export function resolveBrowserConfig( const enabled = cfg?.enabled ?? DEFAULT_OPENCLAW_BROWSER_ENABLED; const evaluateEnabled = cfg?.evaluateEnabled ?? DEFAULT_BROWSER_EVALUATE_ENABLED; const gatewayPort = resolveGatewayPort(rootConfig); - const controlPort = deriveDefaultBrowserControlPort(gatewayPort ?? DEFAULT_BROWSER_CONTROL_PORT); + // In gateway.mode=remote, gateway.port often points to a remote ingress port (e.g. 443). + // Browser relay/control ports remain local on the current host, so derive defaults from + // the local gateway default unless browser ports are explicitly configured. + const gatewayMode = + typeof rootConfig?.gateway?.mode === "string" + ? rootConfig.gateway.mode.trim().toLowerCase() + : undefined; + const browserPortBase = gatewayMode === "remote" ? DEFAULT_GATEWAY_PORT : gatewayPort; + const controlPort = deriveDefaultBrowserControlPort( + browserPortBase ?? DEFAULT_BROWSER_CONTROL_PORT, + ); const defaultColor = normalizeHexColor(cfg?.color); const remoteCdpTimeoutMs = normalizeTimeoutMs(cfg?.remoteCdpTimeoutMs, 1500); const remoteCdpHandshakeTimeoutMs = normalizeTimeoutMs(