Skip to content

Commit a3af426

Browse files
committed
docs: document browser route support
1 parent 7fe6c16 commit a3af426

14 files changed

Lines changed: 115 additions & 0 deletions

extensions/browser/src/browser/routes/agent.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
/**
2+
* Browser agent route group registration.
3+
*
4+
* Bundles snapshot, action, debug, and storage endpoints under the agent-facing
5+
* browser control API.
6+
*/
17
import type { BrowserRouteContext } from "../server-context.js";
28
import { registerBrowserAgentActRoutes } from "./agent.act.js";
39
import { registerBrowserAgentDebugRoutes } from "./agent.debug.js";
410
import { registerBrowserAgentSnapshotRoutes } from "./agent.snapshot.js";
511
import { registerBrowserAgentStorageRoutes } from "./agent.storage.js";
612
import type { BrowserRouteRegistrar } from "./types.js";
713

14+
/** Register all agent-facing browser route groups. */
815
export function registerBrowserAgentRoutes(app: BrowserRouteRegistrar, ctx: BrowserRouteContext) {
916
registerBrowserAgentSnapshotRoutes(app, ctx);
1017
registerBrowserAgentActRoutes(app, ctx);

extensions/browser/src/browser/routes/basic.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* Basic browser control routes.
3+
*
4+
* Serves status, doctor, start/stop, profile management, and simple health
5+
* endpoints for the browser control server.
6+
*/
17
import { redactCdpUrl } from "../cdp.helpers.js";
28
import { snapshotAria } from "../cdp.js";
39
import { getChromeMcpPid, takeChromeMcpSnapshot } from "../chrome-mcp.js";
@@ -304,6 +310,7 @@ function parseHeadlessStartOverride(params: {
304310
return { ok: true, headless };
305311
}
306312

313+
/** Register basic browser lifecycle, status, doctor, and profile endpoints. */
307314
export function registerBrowserBasicRoutes(app: BrowserRouteRegistrar, ctx: BrowserRouteContext) {
308315
// List all profiles with their status
309316
app.get(

extensions/browser/src/browser/routes/dispatcher.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* Browser route dispatcher.
3+
*
4+
* Provides an in-process request/response adapter so Gateway nodes can invoke
5+
* the same route handlers without opening an HTTP socket.
6+
*/
17
import { escapeRegExp } from "../../utils.js";
28
import type { BrowserRouteContext } from "../server-context.js";
39
import { registerBrowserRoutes } from "./index.js";
@@ -59,6 +65,7 @@ function normalizePath(path: string) {
5965
return path.startsWith("/") ? path : `/${path}`;
6066
}
6167

68+
/** Create an in-process dispatcher for registered browser routes. */
6269
export function createBrowserRouteDispatcher(ctx: BrowserRouteContext) {
6370
const registry = createRegistry();
6471
registerBrowserRoutes(registry.router, ctx);

extensions/browser/src/browser/routes/existing-session-limits.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
/**
2+
* Existing-session browser capability-limit messages.
3+
*
4+
* Centralizes unsupported-operation text so route responses and tests stay
5+
* stable while Chrome MCP support grows incrementally.
6+
*/
7+
/** User-facing messages for existing-session route limitations. */
18
export const EXISTING_SESSION_LIMITS = {
29
act: {
310
clickSelector: "existing-session click does not support selector targeting yet; use ref.",

extensions/browser/src/browser/routes/existing-session.test-support.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* Test support for existing-session browser route modules.
3+
*
4+
* Supplies mocked agent.shared helpers and mutable tab/profile state for route
5+
* tests that exercise Chrome MCP branches without launching Chrome.
6+
*/
17
import { vi } from "vitest";
28
import {
39
assertBrowserNavigationResultAllowed,
@@ -6,6 +12,7 @@ import {
612
import type { BrowserRouteContext } from "../server-context.js";
713
import type { BrowserRequest, BrowserResponse } from "./types.js";
814

15+
/** Mutable profile/tab state consumed by existing-session route mocks. */
916
export const existingSessionRouteState = {
1017
profileCtx: {
1118
profile: {
@@ -29,6 +36,7 @@ export const existingSessionRouteState = {
2936
},
3037
};
3138

39+
/** Create a vi mock module for routes that import agent.shared helpers. */
3240
export function createExistingSessionAgentSharedModule() {
3341
return {
3442
browserNavigationPolicyForProfile: vi.fn((ctx: BrowserRouteContext) =>

extensions/browser/src/browser/routes/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
/**
2+
* Browser control route root registration.
3+
*
4+
* Wires basic, tab, permission, and agent route groups onto the supplied HTTP
5+
* or in-process route registrar.
6+
*/
17
import type { BrowserRouteContext } from "../server-context.js";
28
import { registerBrowserAgentRoutes } from "./agent.js";
39
import { registerBrowserBasicRoutes } from "./basic.js";
410
import { registerBrowserPermissionRoutes } from "./permissions.js";
511
import { registerBrowserTabRoutes } from "./tabs.js";
612
import type { BrowserRouteRegistrar } from "./types.js";
713

14+
/** Register every browser control route group. */
815
export function registerBrowserRoutes(app: BrowserRouteRegistrar, ctx: BrowserRouteContext) {
916
registerBrowserBasicRoutes(app, ctx);
1017
registerBrowserTabRoutes(app, ctx);

extensions/browser/src/browser/routes/output-paths.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
1+
/**
2+
* Browser route output-path helpers.
3+
*
4+
* Validates writable output paths against a route-specific root before any
5+
* screenshot, trace, or download route writes to disk.
6+
*/
17
import { ensureOutputDirectory } from "../output-directories.js";
28
import { pathScope } from "./path-output.js";
39
import type { BrowserResponse } from "./types.js";
410

11+
/** Ensure a browser output root exists before resolving child write paths. */
512
export async function ensureOutputRootDir(rootDir: string): Promise<void> {
613
await ensureOutputDirectory(rootDir);
714
}
815

16+
/** Resolve a writable output path or send a 400 JSON response on scope errors. */
917
export async function resolveWritableOutputPathOrRespond(params: {
1018
res: BrowserResponse;
1119
rootDir: string;

extensions/browser/src/browser/routes/path-output.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* Browser route output-path barrel.
3+
*
4+
* Re-exports the path scope and default media directories used by route modules
5+
* without exposing the broader browser paths implementation at each call site.
6+
*/
17
export {
28
DEFAULT_DOWNLOAD_DIR,
39
DEFAULT_TRACE_DIR,

extensions/browser/src/browser/routes/permissions.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* Browser permission routes.
3+
*
4+
* Grants required and optional browser permissions for an origin, preferring
5+
* Playwright context APIs when available and falling back to raw CDP.
6+
*/
17
import { uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
28
import { formatErrorMessage } from "../../infra/errors.js";
39
import type { SsrFPolicy } from "../../infra/net/ssrf.js";
@@ -14,6 +20,7 @@ const permissionRouteDeps = {
1420
getPwAiModule,
1521
};
1622

23+
/** Test hook for replacing optional Playwright permission dependencies. */
1724
export const testing = {
1825
setDepsForTest(deps: { getPwAiModule?: typeof getPwAiModule } | null) {
1926
permissionRouteDeps.getPwAiModule = deps?.getPwAiModule ?? getPwAiModule;
@@ -138,6 +145,7 @@ function toPlaywrightPermission(permission: string): string | undefined {
138145
}
139146
}
140147

148+
/** Register permission grant endpoints on the browser control server. */
141149
export function registerBrowserPermissionRoutes(
142150
app: BrowserRouteRegistrar,
143151
ctx: BrowserRouteContext,

extensions/browser/src/browser/routes/route-numeric.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* Strict numeric parsers for browser route input.
3+
*
4+
* Converts query/body values into finite integer/timeout numbers while
5+
* preserving route-specific error messages for JSON responses.
6+
*/
17
import {
28
parseStrictFiniteNumber,
39
parseStrictInteger,
@@ -10,6 +16,7 @@ function hasRouteInputValue(value: unknown): boolean {
1016
return value != null;
1117
}
1218

19+
/** Read an optional finite number route field. */
1320
export function readRouteFiniteNumber(value: unknown, fieldName: string): number | undefined {
1421
const parsed = parseStrictFiniteNumber(value);
1522
if (parsed === undefined && hasRouteInputValue(value)) {
@@ -18,6 +25,7 @@ export function readRouteFiniteNumber(value: unknown, fieldName: string): number
1825
return parsed;
1926
}
2027

28+
/** Read an optional finite number, treating blank strings as absent. */
2129
export function readOptionalRouteFiniteNumber(
2230
value: unknown,
2331
fieldName: string,
@@ -28,6 +36,7 @@ export function readOptionalRouteFiniteNumber(
2836
return readRouteFiniteNumber(value, fieldName);
2937
}
3038

39+
/** Read an optional integer route field. */
3140
export function readRouteInteger(
3241
value: unknown,
3342
fieldName: string,
@@ -40,6 +49,7 @@ export function readRouteInteger(
4049
return parsed;
4150
}
4251

52+
/** Read an optional positive integer route field. */
4353
export function readRoutePositiveInteger(
4454
value: unknown,
4555
fieldName: string,
@@ -52,6 +62,7 @@ export function readRoutePositiveInteger(
5262
return parsed;
5363
}
5464

65+
/** Read and normalize an optional positive timeout value. */
5566
export function readRouteTimerTimeoutMs(
5667
value: unknown,
5768
fieldName = "timeoutMs",
@@ -61,6 +72,7 @@ export function readRouteTimerTimeoutMs(
6172
return parsed === undefined ? undefined : normalizeBrowserTimerDelayMs(parsed, opts);
6273
}
6374

75+
/** Read an optional non-negative integer route field. */
6476
export function readRouteNonNegativeInteger(
6577
value: unknown,
6678
fieldName: string,

0 commit comments

Comments
 (0)