Skip to content

Commit 08962b6

Browse files
authored
fix(browser): keep static helper seams cold (#59471)
* fix(browser): keep static helper seams cold * fix(browser): narrow sandbox helper facade imports * fix(browser): harden host inspection helpers
1 parent b441cd2 commit 08962b6

15 files changed

Lines changed: 200 additions & 22 deletions

scripts/lib/plugin-sdk-facades.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,9 +226,12 @@ export const GENERATED_PLUGIN_SDK_FACADES = [
226226
DEFAULT_UPLOAD_DIR: "./browser-config.js",
227227
closeTrackedBrowserTabsForSessions: "./browser-maintenance.js",
228228
movePathToTrash: "./browser-maintenance.js",
229+
parseBrowserMajorVersion: "./browser-host-inspection.js",
229230
redactCdpUrl: "./browser-config.js",
231+
readBrowserVersion: "./browser-host-inspection.js",
230232
resolveBrowserConfig: "./browser-config.js",
231233
resolveBrowserControlAuth: "./browser-config.js",
234+
resolveGoogleChromeExecutableForPlatform: "./browser-host-inspection.js",
232235
resolveProfile: "./browser-config.js",
233236
},
234237
exports: [

src/agents/sandbox/browser.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import {
55
DEFAULT_OPENCLAW_BROWSER_COLOR,
66
DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME,
77
resolveProfile,
8+
type ResolvedBrowserConfig,
9+
} from "../../plugin-sdk/browser-config.js";
10+
import {
811
startBrowserBridgeServer,
912
stopBrowserBridgeServer,
10-
type ResolvedBrowserConfig,
1113
} from "../../plugin-sdk/browser-runtime.js";
1214
import { defaultRuntime } from "../../runtime.js";
1315
import { BROWSER_BRIDGES } from "./browser-bridges.js";

src/agents/sandbox/context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import type { OpenClawConfig } from "../../config/config.js";
33
import { loadConfig } from "../../config/config.js";
44
import {
55
DEFAULT_BROWSER_EVALUATE_ENABLED,
6-
ensureBrowserControlAuth,
76
resolveBrowserControlAuth,
8-
} from "../../plugin-sdk/browser-runtime.js";
7+
} from "../../plugin-sdk/browser-config.js";
8+
import { ensureBrowserControlAuth } from "../../plugin-sdk/browser-runtime.js";
99
import { defaultRuntime } from "../../runtime.js";
1010
import { resolveUserPath } from "../../utils.js";
1111
import { syncSkillsToWorkspace } from "../skills.js";

src/commands/doctor-browser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
parseBrowserMajorVersion,
44
readBrowserVersion,
55
resolveGoogleChromeExecutableForPlatform,
6-
} from "../plugin-sdk/browser-runtime.js";
6+
} from "../plugin-sdk/browser-host-inspection.js";
77
import { note } from "../terminal/note.js";
88

99
const CHROME_MCP_MIN_MAJOR = 144;

src/gateway/server-methods/agents-mutate.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ vi.mock("../../config/sessions/paths.js", () => ({
7171
resolveSessionTranscriptsDirForAgent: mocks.resolveSessionTranscriptsDirForAgent,
7272
}));
7373

74-
vi.mock("../../plugin-sdk/browser-runtime.js", () => ({
74+
vi.mock("../../plugin-sdk/browser-maintenance.js", () => ({
7575
movePathToTrash: mocks.movePathToTrash,
7676
}));
7777

src/gateway/server-methods/agents.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import {
3535
} from "../../infra/fs-safe.js";
3636
import { assertNoPathAliasEscape } from "../../infra/path-alias-guards.js";
3737
import { isNotFoundPathError } from "../../infra/path-guards.js";
38-
import { movePathToTrash } from "../../plugin-sdk/browser-runtime.js";
38+
import { movePathToTrash } from "../../plugin-sdk/browser-maintenance.js";
3939
import { DEFAULT_AGENT_ID, normalizeAgentId } from "../../routing/session-key.js";
4040
import { resolveUserPath } from "../../utils.js";
4141
import {

src/gateway/server.sessions.gateway-server-sessions-a.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ vi.mock("../acp/control-plane/manager.js", () => ({
168168
}),
169169
}));
170170

171-
vi.mock("../plugin-sdk/browser-runtime.js", () => ({
171+
vi.mock("../plugin-sdk/browser-maintenance.js", () => ({
172172
closeTrackedBrowserTabsForSessions: browserSessionTabMocks.closeTrackedBrowserTabsForSessions,
173173
movePathToTrash: vi.fn(async () => {}),
174174
}));

src/gateway/session-reset-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
import { resolveSessionFilePath, resolveSessionFilePathOptions } from "../config/sessions/paths.js";
1818
import { logVerbose } from "../globals.js";
1919
import { createInternalHookEvent, triggerInternalHook } from "../hooks/internal-hooks.js";
20-
import { closeTrackedBrowserTabsForSessions } from "../plugin-sdk/browser-runtime.js";
20+
import { closeTrackedBrowserTabsForSessions } from "../plugin-sdk/browser-maintenance.js";
2121
import { getGlobalHookRunner } from "../plugins/hook-runner-global.js";
2222
import { createPluginRuntime } from "../plugins/runtime/index.js";
2323
import {

src/node-host/runner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
NODE_SYSTEM_RUN_COMMANDS,
1212
} from "../infra/node-commands.js";
1313
import { ensureOpenClawCliOnPath } from "../infra/path-env.js";
14-
import { resolveBrowserConfig } from "../plugin-sdk/browser-runtime.js";
14+
import { resolveBrowserConfig } from "../plugin-sdk/browser-config.js";
1515
import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js";
1616
import { VERSION } from "../version.js";
1717
import { ensureNodeHostConfig, saveNodeHostConfig, type NodeHostGatewayConfig } from "./config.js";

src/plugin-activation-boundary.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ describe("plugin activation boundary", () => {
3535
DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME: typeof import("./plugin-sdk/browser-runtime.js").DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME;
3636
DEFAULT_UPLOAD_DIR: typeof import("./plugin-sdk/browser-runtime.js").DEFAULT_UPLOAD_DIR;
3737
closeTrackedBrowserTabsForSessions: typeof import("./plugin-sdk/browser-runtime.js").closeTrackedBrowserTabsForSessions;
38+
parseBrowserMajorVersion: typeof import("./plugin-sdk/browser-runtime.js").parseBrowserMajorVersion;
3839
redactCdpUrl: typeof import("./plugin-sdk/browser-runtime.js").redactCdpUrl;
40+
readBrowserVersion: typeof import("./plugin-sdk/browser-runtime.js").readBrowserVersion;
3941
resolveBrowserConfig: typeof import("./plugin-sdk/browser-runtime.js").resolveBrowserConfig;
4042
resolveBrowserControlAuth: typeof import("./plugin-sdk/browser-runtime.js").resolveBrowserControlAuth;
43+
resolveGoogleChromeExecutableForPlatform: typeof import("./plugin-sdk/browser-runtime.js").resolveGoogleChromeExecutableForPlatform;
4144
resolveProfile: typeof import("./plugin-sdk/browser-runtime.js").resolveProfile;
4245
}>
4346
| undefined;
@@ -84,9 +87,12 @@ describe("plugin activation boundary", () => {
8487
DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME: module.DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME,
8588
DEFAULT_UPLOAD_DIR: module.DEFAULT_UPLOAD_DIR,
8689
closeTrackedBrowserTabsForSessions: module.closeTrackedBrowserTabsForSessions,
90+
parseBrowserMajorVersion: module.parseBrowserMajorVersion,
8791
redactCdpUrl: module.redactCdpUrl,
92+
readBrowserVersion: module.readBrowserVersion,
8893
resolveBrowserConfig: module.resolveBrowserConfig,
8994
resolveBrowserControlAuth: module.resolveBrowserControlAuth,
95+
resolveGoogleChromeExecutableForPlatform: module.resolveGoogleChromeExecutableForPlatform,
9096
resolveProfile: module.resolveProfile,
9197
}));
9298
return browserHelpersPromise;
@@ -96,6 +102,7 @@ describe("plugin activation boundary", () => {
96102
browserAmbientImportsPromise ??= Promise.all([
97103
import("./agents/sandbox/browser.js"),
98104
import("./agents/sandbox/context.js"),
105+
import("./commands/doctor-browser.js"),
99106
import("./node-host/runner.js"),
100107
import("./security/audit.js"),
101108
import("./security/audit-extra.sync.js"),
@@ -148,6 +155,7 @@ describe("plugin activation boundary", () => {
148155
expect(browser.DEFAULT_OPENCLAW_BROWSER_COLOR).toBe("#FF4500");
149156
expect(browser.DEFAULT_OPENCLAW_BROWSER_PROFILE_NAME).toBe("openclaw");
150157
expect(browser.DEFAULT_UPLOAD_DIR).toContain("uploads");
158+
expect(browser.parseBrowserMajorVersion("Google Chrome 144.0.7534.0")).toBe(144);
151159
expect(browser.resolveBrowserControlAuth({}, {} as NodeJS.ProcessEnv)).toEqual({
152160
token: undefined,
153161
password: undefined,
@@ -162,6 +170,8 @@ describe("plugin activation boundary", () => {
162170
expect(
163171
browser.redactCdpUrl("wss://user:[email protected]/devtools/browser/123"),
164172
).not.toContain("secret");
173+
expect(browser.readBrowserVersion("/path/that/does/not/exist")).toBeNull();
174+
expect(browser.resolveGoogleChromeExecutableForPlatform("aix")).toBeNull();
165175
expect(loadBundledPluginPublicSurfaceModuleSync).not.toHaveBeenCalled();
166176
});
167177

0 commit comments

Comments
 (0)