@anvia/browser 1.0.10 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +65 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5,6 +5,18 @@ import { fileURLToPath } from "url";
|
|
|
5
5
|
import { fork } from "child_process";
|
|
6
6
|
|
|
7
7
|
// src/automation-protocol.ts
|
|
8
|
+
var safeSummaryPropertyNames = /* @__PURE__ */ new Set([
|
|
9
|
+
"cmd",
|
|
10
|
+
"error",
|
|
11
|
+
"event",
|
|
12
|
+
"id",
|
|
13
|
+
"kind",
|
|
14
|
+
"ok",
|
|
15
|
+
"value",
|
|
16
|
+
"watch:import",
|
|
17
|
+
"watch:require"
|
|
18
|
+
]);
|
|
19
|
+
var maxSummaryPropertyNames = 12;
|
|
8
20
|
function isAutomationResponse(value) {
|
|
9
21
|
if (!isRecord(value)) return false;
|
|
10
22
|
switch (value.kind) {
|
|
@@ -19,6 +31,24 @@ function isAutomationResponse(value) {
|
|
|
19
31
|
return false;
|
|
20
32
|
}
|
|
21
33
|
}
|
|
34
|
+
function summarizeAutomationMessage(value) {
|
|
35
|
+
const isObject = isRecord(value);
|
|
36
|
+
const prototype = isObject ? Object.getPrototypeOf(value) : void 0;
|
|
37
|
+
const propertyNames = isObject ? Object.getOwnPropertyNames(value) : [];
|
|
38
|
+
return Object.freeze({
|
|
39
|
+
type: value === null ? "null" : Array.isArray(value) ? "array" : typeof value,
|
|
40
|
+
ownPropertyNames: Object.freeze(
|
|
41
|
+
propertyNames.slice(0, maxSummaryPropertyNames).map((name) => safeSummaryPropertyNames.has(name) ? name : "<other>")
|
|
42
|
+
),
|
|
43
|
+
ownPropertyCount: propertyNames.length,
|
|
44
|
+
kind: !isObject || value.kind === void 0 ? void 0 : value.kind === "response" || value.kind === "cancelled" || value.kind === "event" ? value.kind : "other",
|
|
45
|
+
id: !isObject || value.id === void 0 ? void 0 : typeof value.id === "number" ? value.id : "non-number",
|
|
46
|
+
ok: !isObject || value.ok === void 0 ? void 0 : typeof value.ok === "boolean" ? value.ok : "non-boolean",
|
|
47
|
+
constructorName: !isObject ? void 0 : prototype === null ? "null-prototype" : prototype === Object.prototype ? "Object" : "other",
|
|
48
|
+
hasExpectedPrototype: isObject && prototype === Object.prototype,
|
|
49
|
+
hasRequiredFields: isAutomationResponse(value)
|
|
50
|
+
});
|
|
51
|
+
}
|
|
22
52
|
function isSerializedError(value) {
|
|
23
53
|
return isRecord(value) && typeof value.name === "string" && typeof value.message === "string" && (value.stack === void 0 || typeof value.stack === "string") && (value.code === void 0 || typeof value.code === "string");
|
|
24
54
|
}
|
|
@@ -324,7 +354,7 @@ ${diagnostics}`}`
|
|
|
324
354
|
}
|
|
325
355
|
handleMessage(message) {
|
|
326
356
|
if (!isAutomationResponse(message)) {
|
|
327
|
-
throw new
|
|
357
|
+
throw new InvalidAutomationResponseError(summarizeAutomationMessage(message));
|
|
328
358
|
}
|
|
329
359
|
if (message.kind === "event") {
|
|
330
360
|
if (!this.disconnecting) {
|
|
@@ -380,8 +410,10 @@ ${diagnostics}`}`
|
|
|
380
410
|
}
|
|
381
411
|
cleanupChildListeners() {
|
|
382
412
|
this.child.off("message", this.onMessage);
|
|
413
|
+
this.child.off("error", this.onError);
|
|
383
414
|
this.child.off("exit", this.onExit);
|
|
384
415
|
this.child.stderr?.off("data", this.onStderrData);
|
|
416
|
+
this.child.stderr?.off("error", this.onStderrError);
|
|
385
417
|
}
|
|
386
418
|
rejectSend(phase, cause) {
|
|
387
419
|
this.handleExit(
|
|
@@ -402,8 +434,11 @@ ${diagnostics}`}`
|
|
|
402
434
|
callback();
|
|
403
435
|
}
|
|
404
436
|
};
|
|
405
|
-
function spawnAutomationWorker() {
|
|
406
|
-
|
|
437
|
+
function spawnAutomationWorker(workerUrl = automationWorkerUrl()) {
|
|
438
|
+
const env = { ...process.env };
|
|
439
|
+
delete env.WATCH_REPORT_DEPENDENCIES;
|
|
440
|
+
return fork(workerUrl, [], {
|
|
441
|
+
env,
|
|
407
442
|
execArgv: [],
|
|
408
443
|
serialization: "advanced",
|
|
409
444
|
stdio: ["ignore", "ignore", "pipe", "ipc"]
|
|
@@ -424,6 +459,13 @@ function assertPositiveSafeInteger(value, name) {
|
|
|
424
459
|
throw new RangeError(`${name} must be a positive integer no greater than 2147483647.`);
|
|
425
460
|
}
|
|
426
461
|
}
|
|
462
|
+
var InvalidAutomationResponseError = class extends TypeError {
|
|
463
|
+
constructor(responseSummary) {
|
|
464
|
+
super("Invalid browser automation worker response.");
|
|
465
|
+
this.responseSummary = responseSummary;
|
|
466
|
+
}
|
|
467
|
+
responseSummary;
|
|
468
|
+
};
|
|
427
469
|
|
|
428
470
|
// src/scheduler.ts
|
|
429
471
|
var ResourceScheduler = class {
|
|
@@ -1427,13 +1469,14 @@ async function probeBrowserCapability(options) {
|
|
|
1427
1469
|
});
|
|
1428
1470
|
await assertHttpReady(`${endpointFor(sandbox, noVncPort)}/vnc.html`, abortSignal);
|
|
1429
1471
|
return;
|
|
1430
|
-
case "automation":
|
|
1472
|
+
case "automation": {
|
|
1431
1473
|
await sandbox.runtime.waitForPort({
|
|
1432
1474
|
containerPort: cdpPort,
|
|
1433
1475
|
timeoutMs: remainingTime(deadline),
|
|
1434
1476
|
abortSignal
|
|
1435
1477
|
});
|
|
1436
1478
|
await assertCdpHttpReady(`${endpointFor(sandbox, cdpPort)}/json/version`, abortSignal);
|
|
1479
|
+
let lastProbeFailure;
|
|
1437
1480
|
for (let attempt = 0; ; attempt += 1) {
|
|
1438
1481
|
abortSignal.throwIfAborted();
|
|
1439
1482
|
try {
|
|
@@ -1456,10 +1499,17 @@ async function probeBrowserCapability(options) {
|
|
|
1456
1499
|
abortSignal.throwIfAborted();
|
|
1457
1500
|
return;
|
|
1458
1501
|
} catch (error) {
|
|
1459
|
-
if (abortSignal.aborted) throw
|
|
1460
|
-
|
|
1502
|
+
if (abortSignal.aborted) throw lastProbeFailure ?? error;
|
|
1503
|
+
lastProbeFailure = error;
|
|
1504
|
+
try {
|
|
1505
|
+
await waitForRetry(abortSignal, Math.min(500, 50 * 2 ** Math.min(attempt, 3)));
|
|
1506
|
+
} catch (retryError) {
|
|
1507
|
+
if (abortSignal.aborted) throw lastProbeFailure;
|
|
1508
|
+
throw retryError;
|
|
1509
|
+
}
|
|
1461
1510
|
}
|
|
1462
1511
|
}
|
|
1512
|
+
}
|
|
1463
1513
|
}
|
|
1464
1514
|
}
|
|
1465
1515
|
function endpointFor(sandbox, containerPort) {
|
|
@@ -1475,6 +1525,15 @@ function normalizeReadinessError(error, capability, state) {
|
|
|
1475
1525
|
});
|
|
1476
1526
|
}
|
|
1477
1527
|
if (state.timedOut) {
|
|
1528
|
+
if (error instanceof BrowserError && error.code === "transport_failure") {
|
|
1529
|
+
return new BrowserError(error.message, error.code, {
|
|
1530
|
+
cause: error,
|
|
1531
|
+
capability,
|
|
1532
|
+
phase: "readiness",
|
|
1533
|
+
recovery: error.recovery,
|
|
1534
|
+
retryable: error.retryable
|
|
1535
|
+
});
|
|
1536
|
+
}
|
|
1478
1537
|
return new BrowserError(
|
|
1479
1538
|
`Browser ${capability} capability did not become ready before the timeout.`,
|
|
1480
1539
|
"readiness_timeout",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/docker-browser-client.ts","../src/automation-client.ts","../src/automation-protocol.ts","../src/errors.ts","../src/scheduler.ts","../src/connection.ts","../src/control.ts","../src/lifecycle.ts","../src/readiness.ts","../src/docker-browser.ts","../src/tools.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport type { DockerSandbox, DockerSandboxClient } from \"@anvia/sandbox\";\nimport { DockerBrowserHandle } from \"./docker-browser\";\nimport {\n assertOptionsObject,\n assertPositiveSafeInteger,\n boundedSignal,\n defaultLifecycleTimeoutMs,\n isRecord,\n} from \"./lifecycle\";\nimport { cdpPort, noVncPort } from \"./readiness\";\nimport type {\n CreateDockerBrowserOptions,\n DockerBrowser,\n DockerBrowserClientOptions,\n PullDockerBrowserImageOptions,\n ResumeDockerBrowserOptions,\n} from \"./types\";\n\nconst browserSchema = \"1\";\nconst defaultSharedMemoryMb = 1024;\nconst seccompProfilePath = fileURLToPath(\n new URL(\"../security/seccomp_profile.json\", import.meta.url),\n);\n\nexport class DockerBrowserClient {\n private readonly sandboxClient: DockerSandboxClient;\n private readonly image: string;\n\n constructor(options: DockerBrowserClientOptions) {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (!isSandboxClient(options.sandboxClient)) {\n throw new TypeError(\"sandboxClient must be a DockerSandboxClient.\");\n }\n assertNonEmptyString(options.image, \"image\");\n this.sandboxClient = options.sandboxClient;\n this.image = options.image;\n }\n\n async pullImage(options: PullDockerBrowserImageOptions = {}): Promise<void> {\n assertOptionsObject(options);\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"pull-image\");\n try {\n await this.sandboxClient.pullImage({ image: this.image, abortSignal: bounded.signal });\n bounded.throwIfAborted();\n } catch (error) {\n throw bounded.normalize(error, \"Unable to pull the browser image.\", \"startup_failed\");\n } finally {\n bounded.dispose();\n }\n }\n\n async createBrowser(options: CreateDockerBrowserOptions): Promise<DockerBrowser> {\n validateCreateOptions(options);\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"create-browser\");\n const resources = {\n ...options.resources,\n sharedMemoryMb: options.resources?.sharedMemoryMb ?? defaultSharedMemoryMb,\n };\n let sandboxOptions: Parameters<typeof this.sandboxClient.createSandbox>[0] = {\n image: this.image,\n workdir: \"/workspace\",\n workspace: options.workspace,\n network: { mode: \"bridge\", ports: [cdpPort, noVncPort] },\n user: \"pwuser\",\n labels: { \"anvia.browser.schema\": browserSchema },\n resources,\n security: {\n noNewPrivileges: true,\n dropCapabilities: [\"ALL\"],\n addCapabilities: [\"SYS_CHROOT\"],\n seccompProfile: { type: \"path\", path: seccompProfilePath },\n },\n abortSignal: bounded.signal,\n };\n if (options.id !== undefined) sandboxOptions = { ...sandboxOptions, id: options.id };\n if (options.runtime !== undefined) {\n sandboxOptions = { ...sandboxOptions, runtime: options.runtime };\n }\n let sandbox: DockerSandbox | undefined;\n try {\n sandbox = await this.sandboxClient.createSandbox(sandboxOptions);\n await configureBrowser(sandbox, options, bounded.signal);\n await startBrowserServices(sandbox, bounded.signal);\n bounded.throwIfAborted();\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n let cleanupError: unknown;\n try {\n await sandbox?.destroy();\n } catch (caught) {\n cleanupError = caught;\n }\n throw bounded.normalize(\n combineCleanupError(error, cleanupError, \"Browser sandbox cleanup also failed.\"),\n \"Unable to configure the browser sandbox.\",\n \"startup_failed\",\n );\n } finally {\n bounded.dispose();\n }\n }\n\n async resumeBrowser(options: ResumeDockerBrowserOptions): Promise<DockerBrowser> {\n assertOptionsObject(options);\n assertNonEmptyString(options.id, \"id\");\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"resume-browser\");\n let sandbox: DockerSandbox | undefined;\n try {\n sandbox = await this.sandboxClient.resumeSandbox({\n id: options.id,\n abortSignal: bounded.signal,\n });\n await assertBrowserImage(sandbox, bounded.signal);\n await startBrowserServices(sandbox, bounded.signal);\n bounded.throwIfAborted();\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n let cleanupError: unknown;\n try {\n await sandbox?.stop();\n } catch (caught) {\n cleanupError = caught;\n }\n throw bounded.normalize(\n combineCleanupError(error, cleanupError, \"Resumed browser cleanup also failed.\"),\n \"Unable to resume browser services.\",\n \"startup_failed\",\n );\n } finally {\n bounded.dispose();\n }\n }\n}\n\nasync function configureBrowser(\n sandbox: DockerSandbox,\n options: CreateDockerBrowserOptions,\n abortSignal: AbortSignal,\n): Promise<void> {\n const result = await sandbox.runtime.exec({\n command: \"/usr/local/bin/anvia-browser-configure\",\n input: JSON.stringify({\n password: options.desktop.password,\n width: options.desktop.viewport.width,\n height: options.desktop.viewport.height,\n }),\n abortSignal,\n });\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new Error(\"Browser image rejected its runtime configuration.\");\n }\n}\n\nasync function assertBrowserImage(sandbox: DockerSandbox, abortSignal: AbortSignal): Promise<void> {\n const result = await sandbox.runtime.exec({\n command: \"/usr/local/bin/anvia-browser-version\",\n abortSignal,\n });\n if (\n result.status !== \"exited\" ||\n result.exitCode !== 0 ||\n new TextDecoder(\"utf-8\", { fatal: true }).decode(result.stdout).trim() !== browserSchema\n ) {\n throw new Error(\"Sandbox does not contain a compatible Anvia browser image.\");\n }\n}\n\nasync function startBrowserServices(\n sandbox: DockerSandbox,\n abortSignal: AbortSignal,\n): Promise<void> {\n await sandbox.runtime.startProcess({\n command: \"/usr/local/bin/anvia-browser-start\",\n abortSignal,\n });\n}\n\nfunction validateCreateOptions(options: CreateDockerBrowserOptions): void {\n assertOptionsObject(options);\n if (options.id !== undefined) assertNonEmptyString(options.id, \"id\");\n if (!isRecord(options.workspace)) throw new TypeError(\"workspace must be an object.\");\n if (!isRecord(options.network) || options.network.mode !== \"bridge\") {\n throw new TypeError('network must be { mode: \"bridge\" }.');\n }\n if (!isRecord(options.desktop) || options.desktop.protocol !== \"novnc\") {\n throw new TypeError('desktop must use protocol: \"novnc\".');\n }\n if (!/^[\\x20-\\x7e]{8}$/.test(options.desktop.password)) {\n throw new TypeError(\"desktop.password must contain exactly 8 printable ASCII characters.\");\n }\n if (!isRecord(options.desktop.viewport)) {\n throw new TypeError(\"desktop.viewport must be an object.\");\n }\n assertIntegerInRange(options.desktop.viewport.width, \"desktop.viewport.width\", 640, 3840);\n assertIntegerInRange(options.desktop.viewport.height, \"desktop.viewport.height\", 480, 2160);\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.runtime?.maxProcesses !== undefined && options.runtime.maxProcesses < 1) {\n throw new RangeError(\"runtime.maxProcesses must allow the browser service process.\");\n }\n}\n\nfunction assertIntegerInRange(value: number, name: string, min: number, max: number): void {\n if (!Number.isSafeInteger(value) || value < min || value > max) {\n throw new RangeError(`${name} must be a safe integer between ${min} and ${max}.`);\n }\n}\n\nfunction assertNonEmptyString(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${name} must be a non-empty string.`);\n }\n}\n\nfunction isSandboxClient(value: unknown): value is DockerSandboxClient {\n return (\n isRecord(value) &&\n typeof value.pullImage === \"function\" &&\n typeof value.createSandbox === \"function\" &&\n typeof value.resumeSandbox === \"function\"\n );\n}\n\nfunction combineCleanupError(error: unknown, cleanupError: unknown, message: string): unknown {\n return cleanupError === undefined ? error : new AggregateError([error, cleanupError], message);\n}\n","import { fork, type ChildProcess } from \"node:child_process\";\nimport type { AutomationCommand, AutomationRequest, SerializedError } from \"./automation-protocol\";\nimport { isAutomationResponse } from \"./automation-protocol\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport type { BrowserLifecycleOptions } from \"./types\";\n\ntype PendingRequest = {\n state: \"active\" | \"cancelling\";\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n abortSignal?: AbortSignal;\n abort?: () => void;\n abortError?: unknown;\n cleanupTimer?: ReturnType<typeof setTimeout>;\n};\n\nexport type AutomationCommandOptions = Readonly<{\n abortSignal?: AbortSignal;\n cancelOperation?: boolean;\n phase: string;\n}>;\n\nexport interface AutomationBackend {\n readonly closed: boolean;\n command<T>(command: AutomationCommand, options: AutomationCommandOptions): Promise<T>;\n disconnect(options?: BrowserLifecycleOptions): Promise<void>;\n onDisconnected(listener: () => void): () => void;\n}\n\nexport type AutomationWorkerFactory = () => ChildProcess;\n\nconst cancellationCleanupTimeoutMs = 5_000;\nconst workerTerminationTimeoutMs = 3_000;\nconst maxWorkerStderrChars = 32_768;\n\nexport class AutomationWorkerClient implements AutomationBackend {\n private readonly child: ChildProcess;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly disconnectedListeners = new Set<() => void>();\n private nextId = 1;\n private isClosed = false;\n private disconnecting = false;\n private termination: Promise<void> | undefined;\n private workerStderr = \"\";\n private readonly onStderrData = (chunk: string) => {\n this.workerStderr = `${this.workerStderr}${chunk}`.slice(-maxWorkerStderrChars);\n };\n private readonly onStderrError = () => {\n // The diagnostics pipe is optional; its failure must not crash the host process.\n };\n private readonly onMessage = (message: unknown) => {\n try {\n this.handleMessage(message);\n } catch (error) {\n this.handleExit(\n new BrowserError(\n \"Browser automation worker sent an invalid response.\",\n \"transport_failure\",\n {\n cause: error,\n phase: \"automation-worker\",\n },\n ),\n );\n void this.terminate().catch(() => undefined);\n }\n };\n private readonly onError = (error: Error) => {\n this.handleExit(error);\n void this.terminate().catch(() => undefined);\n };\n private readonly onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const diagnostics = this.workerStderr.trim();\n this.handleExit(\n new Error(\n `Browser automation worker exited: code=${code ?? \"null\"} signal=${signal ?? \"null\"}${diagnostics.length === 0 ? \"\" : `\\n${diagnostics}`}`,\n ),\n );\n };\n\n private constructor(factory: AutomationWorkerFactory) {\n this.child = factory();\n this.child.stderr?.setEncoding(\"utf8\");\n this.child.stderr?.on(\"data\", this.onStderrData);\n this.child.stderr?.on(\"error\", this.onStderrError);\n this.child.on(\"message\", this.onMessage);\n this.child.on(\"error\", this.onError);\n this.child.once(\"exit\", this.onExit);\n }\n\n static async connect(options: {\n endpointUrl: string;\n timeoutMs: number;\n abortSignal?: AbortSignal;\n workerFactory?: AutomationWorkerFactory;\n }): Promise<AutomationWorkerClient> {\n assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n let client: AutomationWorkerClient;\n try {\n client = new AutomationWorkerClient(options.workerFactory ?? spawnAutomationWorker);\n } catch (error) {\n throw new BrowserError(\n \"Unable to start the browser automation worker.\",\n \"transport_failure\",\n {\n cause: error,\n phase: \"connect\",\n recovery: \"reconnect\",\n },\n );\n }\n const timeoutController = new AbortController();\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\n \"Browser connection did not initialize before the timeout.\",\n \"connection_timeout\",\n { phase: \"connect\" },\n ),\n ),\n options.timeoutMs,\n );\n timer.unref?.();\n const abortSignal =\n options.abortSignal === undefined\n ? timeoutController.signal\n : AbortSignal.any([options.abortSignal, timeoutController.signal]);\n try {\n await client.command(\n {\n method: \"connect\",\n params: { endpointUrl: options.endpointUrl, timeoutMs: options.timeoutMs },\n },\n { abortSignal, phase: \"connect\" },\n );\n return client;\n } catch (error) {\n await client.terminate();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n if (\n error instanceof Error &&\n (error.name === \"TimeoutError\" || /timeout/i.test(error.message))\n ) {\n throw new BrowserError(\n \"Browser connection did not initialize before the timeout.\",\n \"connection_timeout\",\n { cause: error, phase: \"connect\" },\n );\n }\n throw new BrowserError(\"Unable to initialize browser automation.\", \"transport_failure\", {\n cause: error,\n phase: \"connect\",\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n get closed(): boolean {\n return this.isClosed || this.child.exitCode !== null || this.child.signalCode !== null;\n }\n\n command<T>(command: AutomationCommand, options: AutomationCommandOptions): Promise<T> {\n if (this.closed) {\n return Promise.reject(\n new BrowserError(\"Browser automation connection is closed.\", \"connection_closed\", {\n phase: options.phase,\n }),\n );\n }\n if (options.abortSignal?.aborted) {\n return Promise.reject(this.abortError(options.abortSignal, options.phase));\n }\n const id = this.nextId++;\n return new Promise<T>((resolve, reject) => {\n const pending: PendingRequest = {\n state: \"active\",\n resolve: (value) => resolve(value as T),\n reject,\n };\n if (options.abortSignal !== undefined) {\n pending.abortSignal = options.abortSignal;\n pending.abort = () => this.cancelRequest(id, pending, options);\n options.abortSignal.addEventListener(\"abort\", pending.abort, { once: true });\n }\n this.pending.set(id, pending);\n const request: AutomationRequest = { kind: \"request\", id, ...command };\n try {\n this.child.send(request, (error) => {\n if (error == null) return;\n this.rejectSend(options.phase, error);\n });\n } catch (error) {\n this.rejectSend(options.phase, error);\n }\n });\n }\n\n async disconnect(options: BrowserLifecycleOptions = {}): Promise<void> {\n if (this.termination !== undefined) return this.termination;\n this.disconnecting = true;\n const timeoutMs = options.timeoutMs ?? 10_000;\n const timeoutController = new AbortController();\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\"Browser disconnect timed out.\", \"connection_timeout\", {\n phase: \"disconnect\",\n }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const abortSignal =\n options.abortSignal === undefined\n ? timeoutController.signal\n : AbortSignal.any([options.abortSignal, timeoutController.signal]);\n try {\n if (!this.closed) {\n await this.command(\n { method: \"disconnect\", params: {} },\n { abortSignal, phase: \"disconnect\" },\n );\n }\n } catch (error) {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n if (!this.closed) throw error;\n } finally {\n clearTimeout(timer);\n await this.terminate();\n }\n }\n\n onDisconnected(listener: () => void): () => void {\n if (this.closed) {\n queueMicrotask(() => {\n try {\n listener();\n } catch {\n // A closed backend must not surface callback failures through the host event loop.\n }\n });\n return () => undefined;\n }\n this.disconnectedListeners.add(listener);\n return () => this.disconnectedListeners.delete(listener);\n }\n\n async terminate(): Promise<void> {\n if (this.termination !== undefined) return this.termination;\n this.termination = this.performTerminate();\n return this.termination;\n }\n\n private async performTerminate(): Promise<void> {\n this.isClosed = true;\n if (this.child.exitCode !== null || this.child.signalCode !== null) return;\n const exited = new Promise<void>((resolve) => this.child.once(\"exit\", () => resolve()));\n this.child.kill(\"SIGTERM\");\n let forceTimer: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n exited,\n new Promise<void>((resolve) => {\n forceTimer = setTimeout(() => {\n this.child.kill(\"SIGKILL\");\n resolve();\n }, workerTerminationTimeoutMs);\n forceTimer.unref?.();\n }),\n ]);\n if (forceTimer !== undefined) clearTimeout(forceTimer);\n if (this.child.exitCode === null && this.child.signalCode === null) await exited;\n }\n\n private cancelRequest(\n id: number,\n pending: PendingRequest,\n options: AutomationCommandOptions,\n ): void {\n if (pending.state !== \"active\") return;\n pending.state = \"cancelling\";\n pending.abortError = this.abortError(pending.abortSignal!, options.phase);\n if (options.cancelOperation === true && this.child.connected) {\n try {\n this.child.send({ kind: \"cancel\", id }, (error) => {\n if (error !== null) void this.terminate().catch(() => undefined);\n });\n } catch {\n void this.terminate().catch(() => undefined);\n return;\n }\n pending.cleanupTimer = setTimeout(() => {\n void this.terminate().catch(() => undefined);\n }, cancellationCleanupTimeoutMs);\n pending.cleanupTimer.unref?.();\n return;\n }\n void this.terminate().catch(() => undefined);\n }\n\n private abortError(abortSignal: AbortSignal, phase: string): unknown {\n return abortSignal.reason instanceof BrowserError\n ? abortSignal.reason\n : cancellationError(abortSignal.reason, phase);\n }\n\n private handleMessage(message: unknown): void {\n if (!isAutomationResponse(message)) {\n throw new TypeError(\"Invalid browser automation worker response.\");\n }\n if (message.kind === \"event\") {\n if (!this.disconnecting) {\n this.handleExit(\n new BrowserError(\"Browser disconnected from CDP.\", \"connection_closed\", {\n phase: \"automation-event\",\n }),\n );\n void this.terminate().catch(() => undefined);\n }\n return;\n }\n const pending = this.pending.get(message.id);\n if (pending === undefined) return;\n if (message.kind === \"cancelled\") {\n if (pending.state === \"cancelling\") {\n this.settle(message.id, pending, () => pending.reject(pending.abortError));\n }\n return;\n }\n if (pending.state === \"cancelling\") return;\n this.settle(message.id, pending, () => {\n if (message.ok) pending.resolve(message.value);\n else pending.reject(deserializeError(message.error));\n });\n }\n\n private handleExit(cause: unknown): void {\n if (this.isClosed && this.pending.size === 0) {\n this.cleanupChildListeners();\n return;\n }\n this.isClosed = true;\n const error =\n cause instanceof BrowserError\n ? cause\n : new BrowserError(\"Browser automation worker terminated.\", \"transport_failure\", {\n cause,\n phase: \"automation-worker\",\n });\n for (const [id, pending] of this.pending) {\n this.settle(id, pending, () =>\n pending.reject(pending.state === \"cancelling\" ? pending.abortError : error),\n );\n }\n const listeners = [...this.disconnectedListeners];\n this.disconnectedListeners.clear();\n for (const listener of listeners) {\n try {\n listener();\n } catch {\n // Connection teardown must not throw from a child-process event callback.\n }\n }\n this.cleanupChildListeners();\n }\n\n private cleanupChildListeners(): void {\n this.child.off(\"message\", this.onMessage);\n this.child.off(\"exit\", this.onExit);\n this.child.stderr?.off(\"data\", this.onStderrData);\n }\n\n private rejectSend(phase: string, cause: unknown): void {\n this.handleExit(\n new BrowserError(\"Unable to send browser automation command.\", \"transport_failure\", {\n cause,\n phase,\n }),\n );\n void this.terminate().catch(() => undefined);\n }\n\n private settle(id: number, pending: PendingRequest, callback: () => void): void {\n if (this.pending.get(id) !== pending) return;\n this.pending.delete(id);\n if (pending.cleanupTimer !== undefined) clearTimeout(pending.cleanupTimer);\n if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n callback();\n }\n}\n\nfunction spawnAutomationWorker(): ChildProcess {\n return fork(automationWorkerUrl(), [], {\n execArgv: [],\n serialization: \"advanced\",\n stdio: [\"ignore\", \"ignore\", \"pipe\", \"ipc\"],\n });\n}\n\nfunction automationWorkerUrl(): URL {\n return import.meta.url.endsWith(\"/src/automation-client.ts\")\n ? new URL(\"../dist/automation-worker.js\", import.meta.url)\n : new URL(\"./automation-worker.js\", import.meta.url);\n}\n\nfunction deserializeError(value: SerializedError): Error {\n const error = new Error(value.message);\n error.name = value.name;\n if (value.stack !== undefined) error.stack = value.stack;\n if (value.code !== undefined) Object.assign(error, { code: value.code });\n return error;\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > 2_147_483_647) {\n throw new RangeError(`${name} must be a positive integer no greater than 2147483647.`);\n }\n}\n","import type { BrowserNavigationPolicy } from \"./types\";\n\nexport type BrowserTarget =\n | Readonly<{\n by: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }>\n | Readonly<{ by: \"text\"; text: string; exact?: boolean | undefined }>\n | Readonly<{ by: \"label\"; label: string; exact?: boolean | undefined }>\n | Readonly<{ by: \"placeholder\"; placeholder: string; exact?: boolean | undefined }>\n | Readonly<{ by: \"test-id\"; testId: string }>\n | Readonly<{ by: \"css\"; selector: string }>;\n\nexport type AutomationCommand =\n | Readonly<{ method: \"connect\"; params: { endpointUrl: string; timeoutMs: number } }>\n | Readonly<{ method: \"disconnect\"; params: Record<string, never> }>\n | Readonly<{ method: \"listTabs\"; params: Record<string, never> }>\n | Readonly<{ method: \"setNavigationPolicy\"; params: { policy: BrowserNavigationPolicy } }>\n | Readonly<{ method: \"openTab\"; params: Record<string, never> }>\n | Readonly<{ method: \"selectTab\"; params: { tabId: string } }>\n | Readonly<{ method: \"closeTab\"; params: { tabId: string } }>\n | Readonly<{\n method: \"navigate\";\n params: {\n tabId: string;\n url: string;\n waitUntil: \"commit\" | \"domcontentloaded\" | \"load\" | \"networkidle\";\n timeoutMs: number;\n };\n }>\n | Readonly<{\n method: \"snapshot\";\n params: { tabId: string; timeoutMs: number; maxChars: number };\n }>\n | Readonly<{\n method: \"click\";\n params: { tabId: string; target: BrowserTarget; timeoutMs: number };\n }>\n | Readonly<{\n method: \"type\";\n params: { tabId: string; target: BrowserTarget; text: string; timeoutMs: number };\n }>\n | Readonly<{ method: \"pressKey\"; params: { tabId: string; key: string } }>\n | Readonly<{ method: \"screenshot\"; params: { tabId: string; timeoutMs: number } }>;\n\nexport type AutomationRequest = AutomationCommand & Readonly<{ kind: \"request\"; id: number }>;\n\nexport type AutomationCancel = Readonly<{ kind: \"cancel\"; id: number }>;\n\nexport type SerializedError = Readonly<{\n name: string;\n message: string;\n stack?: string;\n code?: string;\n}>;\n\nexport type AutomationResponse =\n | Readonly<{ kind: \"response\"; id: number; ok: true; value: unknown }>\n | Readonly<{ kind: \"response\"; id: number; ok: false; error: SerializedError }>\n | Readonly<{ kind: \"cancelled\"; id: number }>\n | Readonly<{ kind: \"event\"; event: \"disconnected\" }>;\n\nexport type AutomationTabResult = Readonly<{\n tabId: string;\n title: string;\n url: string;\n}>;\n\nexport type AutomationSnapshotResult = AutomationTabResult &\n Readonly<{ snapshot: string; truncated: boolean }>;\n\nexport type AutomationScreenshotResult = Readonly<{\n metadata: AutomationTabResult;\n pngBase64: string;\n}>;\n\nexport function isAutomationResponse(value: unknown): value is AutomationResponse {\n if (!isRecord(value)) return false;\n switch (value.kind) {\n case \"event\":\n return value.event === \"disconnected\";\n case \"cancelled\":\n return isRequestId(value.id);\n case \"response\":\n if (!isRequestId(value.id) || typeof value.ok !== \"boolean\") return false;\n return value.ok ? Object.hasOwn(value, \"value\") : isSerializedError(value.error);\n default:\n return false;\n }\n}\n\nfunction isSerializedError(value: unknown): value is SerializedError {\n return (\n isRecord(value) &&\n typeof value.name === \"string\" &&\n typeof value.message === \"string\" &&\n (value.stack === undefined || typeof value.stack === \"string\") &&\n (value.code === undefined || typeof value.code === \"string\")\n );\n}\n\nfunction isRequestId(value: unknown): value is number {\n return Number.isSafeInteger(value) && (value as number) > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { BrowserCapability } from \"./types\";\n\nexport type BrowserErrorCode =\n | \"action_timeout\"\n | \"agent_action_busy\"\n | \"cancelled\"\n | \"connection_closed\"\n | \"connection_timeout\"\n | \"human_control_conflict\"\n | \"human_controlled\"\n | \"invalid_state\"\n | \"lifecycle_timeout\"\n | \"navigation_blocked\"\n | \"not_ready\"\n | \"readiness_timeout\"\n | \"runtime_destroyed\"\n | \"startup_failed\"\n | \"tool_failed\"\n | \"transport_failure\";\n\nexport type BrowserErrorRecovery = \"none\" | \"retry\" | \"reconnect\" | \"restart\" | \"recreate\";\n\nexport type BrowserErrorOptions = ErrorOptions &\n Readonly<{\n retryable?: boolean;\n recovery?: BrowserErrorRecovery;\n capability?: BrowserCapability;\n phase?: string;\n }>;\n\nconst defaults: Record<\n BrowserErrorCode,\n Readonly<{ retryable: boolean; recovery: BrowserErrorRecovery }>\n> = {\n action_timeout: { retryable: true, recovery: \"retry\" },\n agent_action_busy: { retryable: true, recovery: \"retry\" },\n cancelled: { retryable: true, recovery: \"retry\" },\n connection_closed: { retryable: true, recovery: \"reconnect\" },\n connection_timeout: { retryable: true, recovery: \"reconnect\" },\n human_control_conflict: { retryable: true, recovery: \"retry\" },\n human_controlled: { retryable: true, recovery: \"retry\" },\n invalid_state: { retryable: false, recovery: \"none\" },\n lifecycle_timeout: { retryable: true, recovery: \"retry\" },\n navigation_blocked: { retryable: false, recovery: \"none\" },\n not_ready: { retryable: true, recovery: \"retry\" },\n readiness_timeout: { retryable: true, recovery: \"retry\" },\n runtime_destroyed: { retryable: false, recovery: \"recreate\" },\n startup_failed: { retryable: true, recovery: \"recreate\" },\n tool_failed: { retryable: true, recovery: \"retry\" },\n transport_failure: { retryable: true, recovery: \"reconnect\" },\n};\n\nexport class BrowserError extends Error {\n readonly retryable: boolean;\n readonly recovery: BrowserErrorRecovery;\n readonly capability: BrowserCapability | undefined;\n readonly phase: string | undefined;\n\n constructor(\n message: string,\n readonly code: BrowserErrorCode,\n options: BrowserErrorOptions = {},\n ) {\n super(message, options);\n this.name = \"BrowserError\";\n this.retryable = options.retryable ?? defaults[code].retryable;\n this.recovery = options.recovery ?? defaults[code].recovery;\n this.capability = options.capability;\n this.phase = options.phase;\n }\n}\n\nexport function cancellationError(reason: unknown, phase: string): BrowserError {\n return new BrowserError(\"Browser operation was cancelled by the caller.\", \"cancelled\", {\n cause: reason,\n phase,\n });\n}\n","import { BrowserError, cancellationError } from \"./errors\";\n\ntype Task<T> = {\n abortSignal?: AbortSignal;\n abort?: () => void;\n controller: AbortController;\n operation: (abortSignal: AbortSignal) => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\ntype Resource = {\n running: boolean;\n ready: boolean;\n tasks: Task<unknown>[];\n};\n\nexport class ResourceScheduler {\n private readonly resources = new Map<string, Resource>();\n private readonly readyResources: string[] = [];\n private readonly activeTasks = new Set<Task<unknown>>();\n private readonly serial: boolean;\n private readonly maxConcurrentResources: number;\n private readonly maxQueuedActions: number;\n private activeResources = 0;\n private queuedActions = 0;\n private closedError: BrowserError | undefined;\n\n constructor(options: {\n mode: \"serial\" | \"per-tab\";\n maxConcurrentResources: number;\n maxQueuedActions: number;\n }) {\n this.serial = options.mode === \"serial\";\n this.maxConcurrentResources = options.maxConcurrentResources;\n this.maxQueuedActions = options.maxQueuedActions;\n }\n\n run<T>(\n resourceKey: string,\n abortSignal: AbortSignal | undefined,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n if (this.closedError !== undefined) return Promise.reject(this.closedError);\n if (abortSignal?.aborted) {\n return Promise.reject(abortReason(abortSignal, \"agent-action-queue\"));\n }\n if (this.queuedActions >= this.maxQueuedActions) {\n return Promise.reject(\n new BrowserError(\"Browser action queue capacity was reached.\", \"agent_action_busy\", {\n phase: \"agent-action-queue\",\n }),\n );\n }\n\n const key = this.serial ? \"browser\" : resourceKey;\n let resource = this.resources.get(key);\n if (resource === undefined) {\n resource = { running: false, ready: false, tasks: [] };\n this.resources.set(key, resource);\n }\n\n return new Promise<T>((resolve, reject) => {\n const task: Task<T> = {\n controller: new AbortController(),\n operation,\n resolve,\n reject,\n ...(abortSignal === undefined ? {} : { abortSignal }),\n };\n if (abortSignal !== undefined) {\n task.abort = () => {\n const current = this.resources.get(key);\n const index = current?.tasks.indexOf(task as Task<unknown>) ?? -1;\n if (index === -1) return;\n current?.tasks.splice(index, 1);\n this.queuedActions -= 1;\n abortSignal.removeEventListener(\"abort\", task.abort!);\n reject(abortReason(abortSignal, \"agent-action-queue\"));\n this.deleteIdleResource(key, current);\n };\n abortSignal.addEventListener(\"abort\", task.abort, { once: true });\n }\n resource.tasks.push(task as Task<unknown>);\n this.queuedActions += 1;\n this.markReady(key, resource);\n this.pump();\n });\n }\n\n close(error = new BrowserError(\"Browser connection is closed.\", \"connection_closed\")): void {\n if (this.closedError !== undefined) return;\n this.closedError = error;\n for (const task of this.activeTasks) task.controller.abort(error);\n for (const [key, resource] of this.resources) {\n for (const task of resource.tasks.splice(0)) {\n this.queuedActions -= 1;\n if (task.abort !== undefined) task.abortSignal?.removeEventListener(\"abort\", task.abort);\n task.reject(error);\n }\n resource.ready = false;\n if (!resource.running) this.resources.delete(key);\n }\n this.readyResources.length = 0;\n }\n\n private markReady(key: string, resource: Resource): void {\n if (resource.running || resource.ready || resource.tasks.length === 0) return;\n resource.ready = true;\n this.readyResources.push(key);\n }\n\n private pump(): void {\n while (\n this.closedError === undefined &&\n this.activeResources < this.maxConcurrentResources &&\n this.readyResources.length > 0\n ) {\n const key = this.readyResources.shift();\n if (key === undefined) return;\n const resource = this.resources.get(key);\n if (resource === undefined || resource.running || resource.tasks.length === 0) continue;\n resource.ready = false;\n const task = resource.tasks.shift();\n if (task === undefined) continue;\n this.queuedActions -= 1;\n if (task.abort !== undefined) task.abortSignal?.removeEventListener(\"abort\", task.abort);\n resource.running = true;\n this.activeResources += 1;\n this.activeTasks.add(task);\n const effectiveSignal =\n task.abortSignal === undefined\n ? task.controller.signal\n : AbortSignal.any([task.abortSignal, task.controller.signal]);\n let operation: Promise<unknown>;\n try {\n operation = task.operation(effectiveSignal);\n } catch (error) {\n operation = Promise.reject(error);\n }\n void operation.then(task.resolve, task.reject).finally(() => {\n this.activeTasks.delete(task);\n resource.running = false;\n this.activeResources -= 1;\n this.markReady(key, resource);\n this.deleteIdleResource(key, resource);\n this.pump();\n });\n }\n }\n\n private deleteIdleResource(key: string, resource: Resource | undefined): void {\n if (resource !== undefined && !resource.running && resource.tasks.length === 0) {\n this.resources.delete(key);\n }\n }\n}\n\ntype MutexWaiter = {\n resolve: (release: () => void) => void;\n reject: (error: unknown) => void;\n abortSignal?: AbortSignal;\n abort?: () => void;\n};\n\nexport class AsyncMutex {\n private readonly waiters: MutexWaiter[] = [];\n private locked = false;\n private closedError: BrowserError | undefined;\n\n async run<T>(abortSignal: AbortSignal | undefined, operation: () => Promise<T>): Promise<T> {\n const release = await this.acquire(abortSignal);\n try {\n return await operation();\n } finally {\n release();\n }\n }\n\n close(error = new BrowserError(\"Browser connection is closed.\", \"connection_closed\")): void {\n if (this.closedError !== undefined) return;\n this.closedError = error;\n for (const waiter of this.waiters.splice(0)) {\n if (waiter.abort !== undefined) {\n waiter.abortSignal?.removeEventListener(\"abort\", waiter.abort);\n }\n waiter.reject(error);\n }\n }\n\n private acquire(abortSignal: AbortSignal | undefined): Promise<() => void> {\n if (this.closedError !== undefined) return Promise.reject(this.closedError);\n if (abortSignal?.aborted) {\n return Promise.reject(abortReason(abortSignal, \"browser-resource-lock\"));\n }\n if (!this.locked) {\n this.locked = true;\n return Promise.resolve(this.releaseCallback());\n }\n return new Promise((resolve, reject) => {\n const waiter: MutexWaiter = {\n resolve,\n reject,\n ...(abortSignal === undefined ? {} : { abortSignal }),\n };\n if (abortSignal !== undefined) {\n waiter.abort = () => {\n const index = this.waiters.indexOf(waiter);\n if (index === -1) return;\n this.waiters.splice(index, 1);\n reject(abortReason(abortSignal, \"browser-resource-lock\"));\n };\n abortSignal.addEventListener(\"abort\", waiter.abort, { once: true });\n }\n this.waiters.push(waiter);\n });\n }\n\n private releaseCallback(): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const waiter = this.waiters.shift();\n if (waiter === undefined) {\n this.locked = false;\n return;\n }\n if (waiter.abort !== undefined) {\n waiter.abortSignal?.removeEventListener(\"abort\", waiter.abort);\n }\n waiter.resolve(this.releaseCallback());\n };\n }\n}\n\nfunction abortReason(abortSignal: AbortSignal, phase: string): BrowserError {\n return abortSignal.reason instanceof BrowserError\n ? abortSignal.reason\n : cancellationError(abortSignal.reason, phase);\n}\n","import type { AutomationCommand, AutomationTabResult } from \"./automation-protocol\";\nimport {\n AutomationWorkerClient,\n type AutomationBackend,\n type AutomationWorkerFactory,\n} from \"./automation-client\";\nimport type { BrowserControlState } from \"./control\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport { AsyncMutex, ResourceScheduler } from \"./scheduler\";\nimport type {\n BrowserActionOptions,\n BrowserConnectOptions,\n BrowserLifecycleOptions,\n BrowserNavigationPolicy,\n BrowserTab,\n PlaywrightBrowserConnection,\n} from \"./types\";\n\nconst defaultConnectionTimeoutMs = 30_000;\nconst defaultActionTimeoutMs = 10_000;\nconst defaultMaxConcurrentTabs = 8;\nconst defaultMaxQueuedActions = 1_000;\nconst maxClosedTabTombstones = 10_000;\nconst maxTimerMs = 2_147_483_647;\n\nexport async function connectPlaywrightBrowser(options: {\n endpointUrl: string;\n control: BrowserControlState;\n timeoutMs?: number;\n abortSignal?: AbortSignal;\n scheduling?: BrowserConnectOptions[\"scheduling\"];\n workerFactory?: AutomationWorkerFactory;\n onClosed?: (connection: PlaywrightBrowserConnectionImpl) => void;\n}): Promise<PlaywrightBrowserConnectionImpl> {\n const timeoutMs = options.timeoutMs ?? defaultConnectionTimeoutMs;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n options.abortSignal?.throwIfAborted();\n const backend = await AutomationWorkerClient.connect({\n endpointUrl: options.endpointUrl,\n timeoutMs,\n ...(options.abortSignal === undefined ? {} : { abortSignal: options.abortSignal }),\n ...(options.workerFactory === undefined ? {} : { workerFactory: options.workerFactory }),\n });\n return new PlaywrightBrowserConnectionImpl({\n backend,\n control: options.control,\n scheduling: options.scheduling,\n ...(options.onClosed === undefined ? {} : { onClosed: options.onClosed }),\n });\n}\n\nexport class PlaywrightBrowserConnectionImpl implements PlaywrightBrowserConnection {\n private readonly backend: AutomationBackend;\n private readonly control: BrowserControlState;\n private readonly scheduler: ResourceScheduler;\n private readonly compatibilityMutex = new AsyncMutex();\n private readonly contextMutex = new AsyncMutex();\n private readonly closingTabs = new Set<string>();\n private readonly closedTabs = new Set<string>();\n private navigationPolicyKey: string | undefined;\n private navigationGuard: Promise<void> = Promise.resolve();\n private isClosed = false;\n private disconnectCompleted = false;\n private disconnectPromise: Promise<void> | undefined;\n private removeDisconnectedListener: (() => void) | undefined;\n private readonly onClosed: ((connection: PlaywrightBrowserConnectionImpl) => void) | undefined;\n\n constructor(options: {\n backend: AutomationBackend;\n control: BrowserControlState;\n scheduling?: BrowserConnectOptions[\"scheduling\"];\n onClosed?: (connection: PlaywrightBrowserConnectionImpl) => void;\n }) {\n this.backend = options.backend;\n this.control = options.control;\n this.onClosed = options.onClosed;\n const scheduling = normalizeScheduling(options.scheduling);\n this.scheduler = new ResourceScheduler(scheduling);\n this.removeDisconnectedListener = this.backend.onDisconnected(() => this.markClosed());\n }\n\n get closed(): boolean {\n return this.isClosed || this.backend.closed;\n }\n\n async listTabs(options: BrowserActionOptions = {}): Promise<readonly BrowserTab[]> {\n assertOptionsObject(options);\n return this.runContextAction(\n options.abortSignal,\n options.timeoutMs ?? defaultActionTimeoutMs,\n \"list-tabs\",\n (signal) =>\n this.backend.command<readonly BrowserTab[]>(\n { method: \"listTabs\", params: {} },\n { abortSignal: signal, cancelOperation: true, phase: \"list-tabs\" },\n ),\n );\n }\n\n setNavigationPolicy(policy: BrowserNavigationPolicy): void {\n this.assertOpen();\n const key = JSON.stringify(policy);\n if (this.navigationPolicyKey !== undefined) {\n if (this.navigationPolicyKey !== key) {\n throw new TypeError(\"Browser connection already has a different navigation policy.\");\n }\n return;\n }\n this.navigationPolicyKey = key;\n const installation = this.withActionTimeout(\n undefined,\n defaultActionTimeoutMs,\n \"navigation-policy\",\n (signal) =>\n this.scheduler.run(\"browser-context\", signal, (scheduledSignal) =>\n this.contextMutex.run(scheduledSignal, () =>\n this.control.runAgentAction(async () => {\n try {\n await this.backend.command<void>(\n { method: \"setNavigationPolicy\", params: { policy } },\n {\n abortSignal: scheduledSignal,\n cancelOperation: true,\n phase: \"navigation-policy\",\n },\n );\n } catch (error) {\n throw normalizeAutomationError(error, \"navigation-policy\");\n }\n }),\n ),\n ),\n );\n this.navigationGuard = installation.catch(async (error) => {\n let cleanupError: unknown;\n try {\n await this.disconnect();\n } catch (caught) {\n cleanupError = caught;\n }\n throw new BrowserError(\n \"Unable to install the browser navigation policy.\",\n \"transport_failure\",\n {\n cause: combineCleanupError(error, cleanupError),\n phase: \"navigation-policy\",\n },\n );\n });\n void this.navigationGuard.catch(() => undefined);\n }\n\n async openTab(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n ): Promise<AutomationTabResult> {\n return this.withActionTimeout(abortSignal, timeoutMs, \"open-tab\", (signal) =>\n this.compatibilityMutex.run(signal, () =>\n this.runContextActionScheduled(signal, \"open-tab\", (scheduledSignal) =>\n this.backend.command<AutomationTabResult>(\n { method: \"openTab\", params: {} },\n { abortSignal: scheduledSignal, cancelOperation: true, phase: \"open-tab\" },\n ),\n ),\n ),\n );\n }\n\n async selectTab(\n tabId: string,\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n ): Promise<AutomationTabResult> {\n this.assertTabUsable(tabId);\n return this.withActionTimeout(abortSignal, timeoutMs, \"select-tab\", (signal) =>\n this.compatibilityMutex.run(signal, () =>\n this.runContextActionScheduled(signal, \"select-tab\", (scheduledSignal) =>\n this.backend.command<AutomationTabResult>(\n { method: \"selectTab\", params: { tabId } },\n { abortSignal: scheduledSignal, cancelOperation: true, phase: \"select-tab\" },\n ),\n ),\n ),\n );\n }\n\n async closeTab(\n tabId: string,\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n ): Promise<Readonly<{ closedTabId: string; tabs: readonly BrowserTab[] }>> {\n this.assertTabUsable(tabId);\n this.closingTabs.add(tabId);\n let closed = false;\n try {\n const result = await this.withActionTimeout(abortSignal, timeoutMs, \"close-tab\", (signal) =>\n this.scheduler.run(`tab:${tabId}`, signal, (scheduledSignal) => {\n return this.contextMutex.run(scheduledSignal, () =>\n this.control.runAgentAction(async () => {\n try {\n return await this.backend.command<\n Readonly<{ closedTabId: string; tabs: readonly BrowserTab[] }>\n >(\n { method: \"closeTab\", params: { tabId } },\n { abortSignal: scheduledSignal, cancelOperation: true, phase: \"close-tab\" },\n );\n } catch (error) {\n throw normalizeAutomationError(error, \"close-tab\");\n }\n }),\n );\n }),\n );\n closed = true;\n return result;\n } finally {\n this.closingTabs.delete(tabId);\n if (closed && !this.isClosed) this.rememberClosedTab(tabId);\n }\n }\n\n async runTabCommand<T>(options: {\n tabId?: string | undefined;\n abortSignal?: AbortSignal | undefined;\n timeoutMs: number;\n phase: string;\n command: (tabId: string) => AutomationCommand;\n }): Promise<T> {\n return this.withActionTimeout(\n options.abortSignal,\n options.timeoutMs,\n options.phase,\n async (signal) => {\n if (options.tabId !== undefined) {\n this.assertTabUsable(options.tabId);\n return this.runScheduledTabCommand(options.tabId, options, signal);\n }\n return this.compatibilityMutex.run(signal, async () => {\n const tabId = await this.selectedTabId(signal);\n this.assertTabUsable(tabId);\n return this.runScheduledTabCommand(tabId, options, signal);\n });\n },\n );\n }\n\n async disconnect(options: BrowserLifecycleOptions = {}): Promise<void> {\n assertOptionsObject(options);\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (this.disconnectCompleted) return;\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n if (this.disconnectPromise !== undefined) {\n return waitForSharedDisconnect(this.disconnectPromise, options);\n }\n this.markClosed();\n const promise = this.backend.disconnect(options);\n this.disconnectPromise = promise;\n try {\n await promise;\n this.disconnectCompleted = true;\n } finally {\n if (this.disconnectPromise === promise) this.disconnectPromise = undefined;\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.disconnect();\n }\n\n private async runScheduledTabCommand<T>(\n tabId: string,\n options: {\n abortSignal?: AbortSignal | undefined;\n timeoutMs: number;\n phase: string;\n command: (tabId: string) => AutomationCommand;\n },\n abortSignal: AbortSignal,\n ): Promise<T> {\n return this.scheduler.run(`tab:${tabId}`, abortSignal, (scheduledSignal) =>\n this.control.runAgentAction(async () => {\n await waitForOwnedPromise(this.navigationGuard, scheduledSignal);\n try {\n return await this.backend.command<T>(options.command(tabId), {\n abortSignal: scheduledSignal,\n cancelOperation: true,\n phase: options.phase,\n });\n } catch (error) {\n throw normalizeAutomationError(error, options.phase);\n }\n }),\n );\n }\n\n private async selectedTabId(abortSignal: AbortSignal): Promise<string> {\n const tabs = await this.runContextActionScheduled(\n abortSignal,\n \"selected-tab-lookup\",\n (signal) =>\n this.backend.command<readonly BrowserTab[]>(\n { method: \"listTabs\", params: {} },\n { abortSignal: signal, cancelOperation: true, phase: \"selected-tab-lookup\" },\n ),\n );\n const selected = tabs.find((tab) => tab.selected) ?? tabs[0];\n if (selected === undefined) {\n throw new BrowserError(\"Browser has no open tabs.\", \"invalid_state\", {\n phase: \"selected-tab-lookup\",\n });\n }\n return selected.id;\n }\n\n private runContextAction<T>(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n phase: string,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n return this.withActionTimeout(abortSignal, timeoutMs, phase, (signal) =>\n this.runContextActionScheduled(signal, phase, operation),\n );\n }\n\n private runContextActionScheduled<T>(\n abortSignal: AbortSignal,\n phase: string,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n return this.scheduler.run(\"browser-context\", abortSignal, (scheduledSignal) =>\n this.contextMutex.run(scheduledSignal, () =>\n this.control.runAgentAction(async () => {\n this.assertOpen();\n await waitForOwnedPromise(this.navigationGuard, scheduledSignal);\n try {\n return await operation(scheduledSignal);\n } catch (error) {\n throw normalizeAutomationError(error, phase);\n }\n }),\n ),\n );\n }\n\n private async withActionTimeout<T>(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n phase: string,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n if (abortSignal?.aborted) throw cancellationError(abortSignal.reason, phase);\n const timeoutController = new AbortController();\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\"Browser action timed out.\", \"action_timeout\", { phase }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const effectiveSignal =\n abortSignal === undefined\n ? timeoutController.signal\n : AbortSignal.any([abortSignal, timeoutController.signal]);\n try {\n const value = await operation(effectiveSignal);\n if (abortSignal?.aborted) throw cancellationError(abortSignal.reason, phase);\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n return value;\n } catch (error) {\n if (abortSignal?.aborted) throw cancellationError(abortSignal.reason, phase);\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n throw error;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private assertTabUsable(tabId: string): void {\n this.assertOpen();\n if (this.closingTabs.has(tabId) || this.closedTabs.has(tabId)) {\n throw new BrowserError(`Browser tab is closing or closed: ${tabId}`, \"invalid_state\", {\n phase: \"tab-lookup\",\n });\n }\n }\n\n private rememberClosedTab(tabId: string): void {\n this.closedTabs.add(tabId);\n if (this.closedTabs.size <= maxClosedTabTombstones) return;\n const oldest = this.closedTabs.values().next().value;\n if (oldest !== undefined) this.closedTabs.delete(oldest);\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new BrowserError(\"Browser connection is closed.\", \"connection_closed\");\n }\n }\n\n private markClosed(): void {\n if (this.isClosed) return;\n this.isClosed = true;\n const error = new BrowserError(\"Browser connection is closed.\", \"connection_closed\");\n this.scheduler.close(error);\n this.compatibilityMutex.close(error);\n this.contextMutex.close(error);\n this.closingTabs.clear();\n this.closedTabs.clear();\n this.removeDisconnectedListener?.();\n this.removeDisconnectedListener = undefined;\n this.onClosed?.(this);\n }\n}\n\nfunction normalizeScheduling(\n value: BrowserConnectOptions[\"scheduling\"],\n): ConstructorParameters<typeof ResourceScheduler>[0] {\n if (value === undefined) {\n return {\n mode: \"serial\",\n maxConcurrentResources: 1,\n maxQueuedActions: defaultMaxQueuedActions,\n };\n }\n assertOptionsObject(value);\n const maxQueuedActions = value.maxQueuedActions ?? defaultMaxQueuedActions;\n assertPositiveSafeInteger(maxQueuedActions, \"scheduling.maxQueuedActions\");\n if (value.mode === \"serial\") {\n return { mode: \"serial\", maxConcurrentResources: 1, maxQueuedActions };\n }\n if (value.mode !== \"per-tab\") throw new TypeError(\"Unsupported browser scheduling mode.\");\n const maxConcurrentResources = value.maxConcurrentTabs ?? defaultMaxConcurrentTabs;\n assertPositiveSafeInteger(maxConcurrentResources, \"scheduling.maxConcurrentTabs\");\n return { mode: \"per-tab\", maxConcurrentResources, maxQueuedActions };\n}\n\nfunction normalizeAutomationError(error: unknown, phase: string): BrowserError {\n if (error instanceof BrowserError) return error;\n if (error instanceof Error && /ERR_BLOCKED_BY_CLIENT|blockedbyclient/i.test(error.message)) {\n return new BrowserError(\"Browser navigation was rejected by policy.\", \"navigation_blocked\", {\n cause: error,\n phase,\n });\n }\n if (error instanceof Error && error.name === \"TimeoutError\") {\n return new BrowserError(\"Browser action timed out.\", \"action_timeout\", {\n cause: error,\n phase,\n });\n }\n if (\n error instanceof Error &&\n /tab does not exist|has no open tabs|target page.*closed|page has been closed/i.test(\n error.message,\n )\n ) {\n return new BrowserError(error.message, \"invalid_state\", { cause: error, phase });\n }\n if (\n error instanceof Error &&\n /browser.*closed|disconnected|connection.*closed|websocket.*closed/i.test(error.message)\n ) {\n return new BrowserError(\"Browser automation connection closed.\", \"connection_closed\", {\n cause: error,\n phase,\n });\n }\n return new BrowserError(\"Browser tool operation failed.\", \"tool_failed\", {\n cause: error,\n phase,\n });\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maxTimerMs) {\n throw new RangeError(`${name} must be a positive integer no greater than ${maxTimerMs}.`);\n }\n}\n\nfunction assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"options must be an object.\");\n }\n}\n\nfunction combineCleanupError(error: unknown, cleanupError: unknown): unknown {\n return cleanupError === undefined\n ? error\n : new AggregateError([error, cleanupError], \"Browser automation cleanup also failed.\");\n}\n\nasync function waitForOwnedPromise<T>(promise: Promise<T>, abortSignal: AbortSignal): Promise<T> {\n abortSignal.throwIfAborted();\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n abortSignal.removeEventListener(\"abort\", abort);\n callback();\n };\n const abort = () => finish(() => reject(abortSignal.reason));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n void promise.then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n}\n\nasync function waitForSharedDisconnect(\n promise: Promise<void>,\n options: BrowserLifecycleOptions,\n): Promise<void> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n const controller = new AbortController();\n const timer = setTimeout(\n () =>\n controller.abort(\n new BrowserError(\"Browser disconnect timed out.\", \"connection_timeout\", {\n phase: \"disconnect\",\n }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const signal =\n options.abortSignal === undefined\n ? controller.signal\n : AbortSignal.any([options.abortSignal, controller.signal]);\n try {\n await waitForOwnedPromise(promise, signal);\n } catch (error) {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n if (controller.signal.aborted) throw controller.signal.reason;\n throw error;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport type { AutomationBackend };\n\nexport function asConnection(\n connection: PlaywrightBrowserConnection,\n): PlaywrightBrowserConnectionImpl {\n if (!(connection instanceof PlaywrightBrowserConnectionImpl)) {\n throw new TypeError(\"connection must be created by DockerBrowser.connect().\");\n }\n return connection;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport type {\n AcquireBrowserHumanControlOptions,\n BrowserControl,\n BrowserControlAvailability,\n BrowserControlSnapshot,\n BrowserHumanControlLease,\n RenewBrowserHumanControlOptions,\n} from \"./types\";\n\ntype PendingAcquire = {\n resolve: () => void;\n reject: (error: unknown) => void;\n abortSignal?: AbortSignal;\n abort?: () => void;\n timer?: ReturnType<typeof setTimeout>;\n};\n\nconst defaultAcquireTimeoutMs = 30_000;\nconst maxTimerMs = 2_147_483_647;\n\nexport class BrowserControlState implements BrowserControl {\n private activeAgentActions = 0;\n private pendingAcquire: PendingAcquire | undefined;\n private activeLease: BrowserHumanControlLeaseImpl | undefined;\n private humanPending = false;\n private destroyed = false;\n private availability: BrowserControlAvailability = \"available\";\n\n snapshot(): BrowserControlSnapshot {\n const lease = this.activeLease;\n const state =\n lease !== undefined\n ? \"human\"\n : this.humanPending\n ? \"human-pending\"\n : this.activeAgentActions > 0\n ? \"agent-active\"\n : \"agent\";\n return Object.freeze({\n mode: lease === undefined ? \"agent\" : \"human\",\n state,\n availability: this.availability,\n activeAgentActions: this.activeAgentActions,\n humanPending: this.humanPending,\n ...(lease === undefined\n ? {}\n : {\n ownerId: lease.ownerId,\n expiresAt: lease.expiresAt,\n }),\n });\n }\n\n async acquireHumanControl(\n options: AcquireBrowserHumanControlOptions,\n ): Promise<BrowserHumanControlLease> {\n validateAcquireOptions(options);\n this.assertActive();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"human-control-acquire\");\n }\n if (this.activeLease !== undefined) {\n throw new BrowserError(\"Browser human control is already acquired.\", \"human_controlled\", {\n phase: \"human-control-acquire\",\n });\n }\n if (this.humanPending) {\n throw new BrowserError(\n \"Browser human control acquisition is already pending.\",\n \"human_control_conflict\",\n { phase: \"human-control-acquire\" },\n );\n }\n this.humanPending = true;\n try {\n if (this.activeAgentActions > 0) {\n await new Promise<void>((resolve, reject) => {\n const pending: PendingAcquire = { resolve, reject };\n if (options.abortSignal !== undefined) {\n pending.abortSignal = options.abortSignal;\n pending.abort = () => {\n if (this.pendingAcquire !== pending) return;\n this.clearPendingAcquire(pending);\n reject(cancellationError(options.abortSignal?.reason, \"human-control-acquire\"));\n };\n options.abortSignal.addEventListener(\"abort\", pending.abort, { once: true });\n }\n pending.timer = setTimeout(() => {\n if (this.pendingAcquire !== pending) return;\n this.clearPendingAcquire(pending);\n reject(\n new BrowserError(\n \"Timed out waiting to acquire browser human control.\",\n \"human_control_conflict\",\n { phase: \"human-control-acquire\" },\n ),\n );\n }, options.timeoutMs ?? defaultAcquireTimeoutMs);\n pending.timer.unref?.();\n this.pendingAcquire = pending;\n });\n }\n\n this.assertActive();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"human-control-acquire\");\n }\n const lease = new BrowserHumanControlLeaseImpl({\n owner: this,\n ownerId: options.ownerId,\n leaseTimeoutMs: options.leaseTimeoutMs,\n });\n this.activeLease = lease;\n return lease;\n } finally {\n this.humanPending = false;\n }\n }\n\n async runAgentAction<T>(operation: () => Promise<T>): Promise<T> {\n this.assertActive();\n if (this.activeLease !== undefined) {\n throw new BrowserError(\"Browser is controlled by a human viewer.\", \"human_controlled\", {\n phase: \"agent-action\",\n });\n }\n if (this.humanPending) {\n throw new BrowserError(\n \"Browser human control acquisition is pending.\",\n \"human_control_conflict\",\n { phase: \"agent-action\" },\n );\n }\n this.activeAgentActions += 1;\n try {\n return await operation();\n } finally {\n this.activeAgentActions -= 1;\n if (this.activeAgentActions === 0) this.resolvePendingAcquire();\n }\n }\n\n renewLease(\n lease: BrowserHumanControlLeaseImpl,\n options: RenewBrowserHumanControlOptions,\n ): BrowserControlSnapshot {\n if (this.activeLease !== lease) {\n throw new BrowserError(\"Browser human control lease is no longer active.\", \"invalid_state\");\n }\n assertPositiveSafeInteger(options.leaseTimeoutMs, \"leaseTimeoutMs\");\n lease.resetExpiration(options.leaseTimeoutMs);\n return this.snapshot();\n }\n\n releaseLease(lease: BrowserHumanControlLeaseImpl): void {\n if (this.activeLease !== lease) return;\n this.activeLease = undefined;\n lease.markReleased();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.activeLease?.release();\n if (this.pendingAcquire !== undefined) {\n const pending = this.pendingAcquire;\n this.pendingAcquire = undefined;\n this.clearPendingAcquire(pending);\n pending.reject(new BrowserError(\"Browser was destroyed.\", \"runtime_destroyed\"));\n }\n this.humanPending = false;\n this.availability = \"destroyed\";\n }\n\n setAvailability(availability: BrowserControlAvailability): void {\n if (this.destroyed) return;\n if (availability === \"destroyed\") {\n this.destroy();\n return;\n }\n this.availability = availability;\n if (availability !== \"disconnected\") return;\n this.activeLease?.release();\n if (this.pendingAcquire !== undefined) {\n const pending = this.pendingAcquire;\n this.clearPendingAcquire(pending);\n pending.reject(\n new BrowserError(\"Browser runtime is disconnected.\", \"connection_closed\", {\n phase: \"human-control-acquire\",\n }),\n );\n }\n this.humanPending = false;\n }\n\n private assertActive(): void {\n if (this.destroyed) throw new BrowserError(\"Browser was destroyed.\", \"runtime_destroyed\");\n if (this.availability === \"disconnected\") {\n throw new BrowserError(\"Browser runtime is disconnected.\", \"connection_closed\");\n }\n }\n\n private resolvePendingAcquire(): void {\n const pending: PendingAcquire | undefined = this.pendingAcquire;\n if (pending === undefined) return;\n this.clearPendingAcquire(pending);\n pending.resolve();\n }\n\n private clearPendingAcquire(pending: PendingAcquire): void {\n if (this.pendingAcquire === pending) this.pendingAcquire = undefined;\n if (pending.timer !== undefined) clearTimeout(pending.timer);\n if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n }\n}\n\nclass BrowserHumanControlLeaseImpl implements BrowserHumanControlLease {\n readonly id = randomUUID();\n readonly ownerId: string;\n private readonly owner: BrowserControlState;\n private expiration = 0;\n private timer: ReturnType<typeof setTimeout> | undefined;\n private released = false;\n\n constructor(options: { owner: BrowserControlState; ownerId: string; leaseTimeoutMs: number }) {\n this.owner = options.owner;\n this.ownerId = options.ownerId;\n this.resetExpiration(options.leaseTimeoutMs);\n }\n\n get expiresAt(): string {\n return new Date(this.expiration).toISOString();\n }\n\n renew(options: RenewBrowserHumanControlOptions): BrowserControlSnapshot {\n if (this.released) {\n throw new BrowserError(\"Browser human control lease is no longer active.\", \"invalid_state\");\n }\n return this.owner.renewLease(this, options);\n }\n\n release(): void {\n this.owner.releaseLease(this);\n }\n\n markReleased(): void {\n if (this.released) return;\n this.released = true;\n if (this.timer !== undefined) clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n resetExpiration(leaseTimeoutMs: number): void {\n if (this.timer !== undefined) clearTimeout(this.timer);\n this.expiration = Date.now() + leaseTimeoutMs;\n this.timer = setTimeout(() => this.release(), leaseTimeoutMs);\n this.timer.unref?.();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.release();\n }\n}\n\nfunction validateAcquireOptions(options: AcquireBrowserHumanControlOptions): void {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (typeof options.ownerId !== \"string\" || options.ownerId.length === 0) {\n throw new TypeError(\"ownerId must be a non-empty string.\");\n }\n assertPositiveSafeInteger(options.leaseTimeoutMs, \"leaseTimeoutMs\");\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maxTimerMs) {\n throw new RangeError(`${name} must be a positive integer no greater than ${maxTimerMs}.`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { BrowserError, cancellationError } from \"./errors\";\nimport type { BrowserLifecycleOptions } from \"./types\";\n\nexport const defaultLifecycleTimeoutMs = 120_000;\nconst maxTimerMs = 2_147_483_647;\n\nexport type BoundedSignal = {\n signal: AbortSignal;\n timedOut: () => boolean;\n throwIfAborted: () => void;\n normalize: (\n error: unknown,\n message: string,\n code: \"startup_failed\" | \"transport_failure\",\n ) => BrowserError;\n dispose: () => void;\n};\n\nexport function boundedSignal(\n options: BrowserLifecycleOptions,\n defaultTimeoutMs: number,\n phase: string,\n): BoundedSignal {\n const timeoutMs = options.timeoutMs ?? defaultTimeoutMs;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) throw cancellationError(options.abortSignal.reason, phase);\n const controller = new AbortController();\n const timer = setTimeout(\n () =>\n controller.abort(\n new BrowserError(`Browser lifecycle operation timed out: ${phase}.`, \"lifecycle_timeout\", {\n phase,\n }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const signal =\n options.abortSignal === undefined\n ? controller.signal\n : AbortSignal.any([options.abortSignal, controller.signal]);\n return {\n signal,\n timedOut: () => controller.signal.aborted,\n throwIfAborted: () => {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, phase);\n }\n if (controller.signal.aborted) throw controller.signal.reason;\n },\n normalize: (error, message, code) => {\n if (options.abortSignal?.aborted) {\n return error instanceof AggregateError\n ? new BrowserError(\"Browser operation was cancelled by the caller.\", \"cancelled\", {\n cause: error,\n phase,\n })\n : cancellationError(options.abortSignal.reason, phase);\n }\n if (controller.signal.aborted) {\n const reason = controller.signal.reason as BrowserError;\n return error === reason\n ? reason\n : new BrowserError(reason.message, \"lifecycle_timeout\", { cause: error, phase });\n }\n if (error instanceof BrowserError) return error;\n return new BrowserError(message, code, { cause: error, phase });\n },\n dispose: () => clearTimeout(timer),\n };\n}\n\nexport function validateLifecycleOptions(options: BrowserLifecycleOptions, phase: string): void {\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, phase);\n }\n}\n\nexport async function waitForSharedLifecycle(\n promise: Promise<void>,\n options: BrowserLifecycleOptions,\n phase: string,\n): Promise<void> {\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, phase);\n try {\n await waitForPromise(promise, bounded.signal);\n bounded.throwIfAborted();\n } catch (error) {\n throw bounded.normalize(error, `Unable to wait for ${phase}.`, \"transport_failure\");\n } finally {\n bounded.dispose();\n }\n}\n\nexport function assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maxTimerMs) {\n throw new RangeError(`${name} must be a positive integer no greater than ${maxTimerMs}.`);\n }\n}\n\nexport function assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (!isRecord(value)) throw new TypeError(\"options must be an object.\");\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function waitForPromise<T>(promise: Promise<T>, abortSignal: AbortSignal): Promise<T> {\n abortSignal.throwIfAborted();\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n abortSignal.removeEventListener(\"abort\", abort);\n callback();\n };\n const abort = () => finish(() => reject(abortSignal.reason));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n void promise.then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n}\n","import type { DockerSandbox, DockerSandboxPublishedPort } from \"@anvia/sandbox\";\nimport { type connectPlaywrightBrowser } from \"./connection\";\nimport type { BrowserControlState } from \"./control\";\nimport { BrowserError } from \"./errors\";\nimport type { BrowserCapability } from \"./types\";\n\nexport const cdpPort = 9222;\nexport const noVncPort = 6080;\nexport const browserCapabilities = [\"runtime\", \"browser\", \"automation\", \"desktop\"] as const;\n\nconst automationProbeAttemptTimeoutMs = 5_000;\n\nexport async function probeBrowserCapability(options: {\n capability: BrowserCapability;\n sandbox: DockerSandbox;\n control: BrowserControlState;\n connectBrowser: typeof connectPlaywrightBrowser;\n abortSignal: AbortSignal;\n deadline: number;\n}): Promise<void> {\n const { capability, sandbox, abortSignal, deadline } = options;\n switch (capability) {\n case \"runtime\":\n if (sandbox.state !== \"running\") {\n throw new BrowserError(`Browser is not running: ${sandbox.state}`, \"invalid_state\");\n }\n return;\n case \"browser\":\n await sandbox.runtime.waitForPort({\n containerPort: cdpPort,\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n await assertCdpHttpReady(`${endpointFor(sandbox, cdpPort)}/json/version`, abortSignal);\n return;\n case \"desktop\":\n await sandbox.runtime.waitForPort({\n containerPort: noVncPort,\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n await assertHttpReady(`${endpointFor(sandbox, noVncPort)}/vnc.html`, abortSignal);\n return;\n case \"automation\":\n await sandbox.runtime.waitForPort({\n containerPort: cdpPort,\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n await assertCdpHttpReady(`${endpointFor(sandbox, cdpPort)}/json/version`, abortSignal);\n for (let attempt = 0; ; attempt += 1) {\n abortSignal.throwIfAborted();\n try {\n const connection = await options.connectBrowser({\n endpointUrl: endpointFor(sandbox, cdpPort),\n control: options.control,\n timeoutMs: Math.min(automationProbeAttemptTimeoutMs, remainingTime(deadline)),\n abortSignal,\n });\n try {\n if (connection.closed) {\n throw new Error(\"CDP connection closed during initialization.\");\n }\n } finally {\n await connection.disconnect({\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n }\n abortSignal.throwIfAborted();\n return;\n } catch (error) {\n if (abortSignal.aborted) throw abortSignal.reason ?? error;\n await waitForRetry(abortSignal, Math.min(500, 50 * 2 ** Math.min(attempt, 3)));\n }\n }\n }\n}\n\nexport function endpointFor(sandbox: DockerSandbox, containerPort: number): string {\n const published = publishedPort(sandbox, containerPort);\n return `http://${hostForUrl(published.host)}:${published.hostPort}`;\n}\n\nexport function normalizeReadinessError(\n error: unknown,\n capability: BrowserCapability,\n state: { callerAborted: boolean; timedOut: boolean },\n): BrowserError {\n if (state.callerAborted) {\n return new BrowserError(\"Browser readiness was cancelled by the caller.\", \"cancelled\", {\n cause: error,\n capability,\n phase: \"readiness\",\n });\n }\n if (state.timedOut) {\n return new BrowserError(\n `Browser ${capability} capability did not become ready before the timeout.`,\n \"readiness_timeout\",\n { cause: error, capability, phase: \"readiness\" },\n );\n }\n if (\n error instanceof BrowserError &&\n (error.code === \"connection_closed\" || error.code === \"runtime_destroyed\")\n ) {\n return error;\n }\n return new BrowserError(`Browser ${capability} capability is not ready.`, \"not_ready\", {\n cause: error,\n capability,\n phase: \"readiness\",\n });\n}\n\nasync function assertCdpHttpReady(url: string, abortSignal: AbortSignal): Promise<void> {\n await assertHttpReady(url, abortSignal, async (response) => {\n const value: unknown = await response.json();\n if (\n !isRecord(value) ||\n typeof value.webSocketDebuggerUrl !== \"string\" ||\n !value.webSocketDebuggerUrl.startsWith(\"ws\")\n ) {\n throw new Error(\"CDP version endpoint did not expose a WebSocket debugger URL.\");\n }\n });\n}\n\nasync function assertHttpReady(\n url: string,\n abortSignal: AbortSignal,\n verify?: (response: Response) => Promise<void>,\n): Promise<void> {\n while (true) {\n abortSignal.throwIfAborted();\n try {\n const response = await fetch(url, { signal: abortSignal, redirect: \"error\" });\n try {\n if (response.ok) {\n await verify?.(response);\n return;\n }\n } finally {\n await response.body?.cancel().catch(() => undefined);\n }\n } catch (error) {\n if (abortSignal.aborted) throw abortSignal.reason ?? error;\n }\n await waitForRetry(abortSignal);\n }\n}\n\nasync function waitForRetry(abortSignal: AbortSignal, delayMs = 50): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => finish(), delayMs);\n timer.unref?.();\n const abort = () => finish(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n function finish(error?: unknown): void {\n clearTimeout(timer);\n abortSignal.removeEventListener(\"abort\", abort);\n if (error === undefined) resolve();\n else reject(error);\n }\n });\n}\n\nfunction remainingTime(deadline: number): number {\n return Math.max(1, deadline - Date.now());\n}\n\nfunction publishedPort(sandbox: DockerSandbox, containerPort: number): DockerSandboxPublishedPort {\n const port = sandbox.runtime.publishedPorts.find(\n (candidate) => candidate.containerPort === containerPort && candidate.protocol === \"tcp\",\n );\n if (port === undefined) {\n throw new BrowserError(`Browser port is not published: ${containerPort}`, \"invalid_state\");\n }\n return port;\n}\n\nfunction hostForUrl(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type {\n DockerSandbox,\n DockerSandboxInspectionOptions,\n DockerSandboxInspector,\n DockerSandboxState,\n} from \"@anvia/sandbox\";\nimport { connectPlaywrightBrowser, type PlaywrightBrowserConnectionImpl } from \"./connection\";\nimport { BrowserControlState } from \"./control\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport {\n assertOptionsObject,\n assertPositiveSafeInteger,\n boundedSignal,\n defaultLifecycleTimeoutMs,\n validateLifecycleOptions,\n waitForSharedLifecycle,\n} from \"./lifecycle\";\nimport {\n browserCapabilities,\n cdpPort,\n endpointFor,\n normalizeReadinessError,\n noVncPort,\n probeBrowserCapability,\n} from \"./readiness\";\nimport type {\n BrowserCapability,\n BrowserCapabilitySnapshot,\n BrowserConnectOptions,\n BrowserDesktopEndpoint,\n BrowserLifecycleOptions,\n BrowserReadinessSnapshot,\n BrowserWaitUntilReadyOptions,\n DockerBrowser,\n PlaywrightBrowserConnection,\n} from \"./types\";\n\nconst defaultConnectTimeoutMs = 30_000;\nconst capabilities = browserCapabilities;\n\ntype OwnedOperation = {\n controller: AbortController;\n promise: Promise<unknown>;\n};\n\ntype HandleState = \"active\" | \"stopping\" | \"stopped\" | \"destroying\" | \"destroyed\" | \"error\";\n\nexport class DockerBrowserHandle implements DockerBrowser {\n readonly id: string;\n readonly sandbox: DockerSandbox;\n readonly desktop: BrowserDesktopEndpoint;\n private readonly control = new BrowserControlState();\n private readonly connections = new Set<PlaywrightBrowserConnectionImpl>();\n private readonly ownedOperations = new Set<OwnedOperation>();\n private readonly capabilityStates = new Map<BrowserCapability, BrowserCapabilitySnapshot>(\n capabilities.map((capability) => [capability, Object.freeze({ capability, state: \"unknown\" })]),\n );\n private readonly capabilityGenerations = new Map<BrowserCapability, number>(\n capabilities.map((capability) => [capability, 0]),\n );\n private handleState: HandleState = \"active\";\n private connectionPending = false;\n private stopPromise: Promise<void> | undefined;\n private destroyPromise: Promise<void> | undefined;\n private readonly connectBrowser: typeof connectPlaywrightBrowser;\n\n constructor(\n sandbox: DockerSandbox,\n connectBrowser: typeof connectPlaywrightBrowser = connectPlaywrightBrowser,\n ) {\n this.sandbox = sandbox;\n this.id = sandbox.id;\n this.connectBrowser = connectBrowser;\n this.desktop = Object.freeze({\n protocol: \"novnc\",\n containerPort: noVncPort,\n control: this.control,\n });\n }\n\n get state(): DockerSandboxState {\n return this.handleState === \"active\" ? this.sandbox.state : this.handleState;\n }\n\n inspector(options: DockerSandboxInspectionOptions): DockerSandboxInspector {\n return this.sandbox.inspector(options);\n }\n\n readiness(): BrowserReadinessSnapshot {\n const terminal =\n this.handleState === \"destroyed\" || this.handleState === \"destroying\"\n ? \"destroyed\"\n : this.handleState === \"stopped\" || this.handleState === \"stopping\"\n ? \"stopped\"\n : undefined;\n const entries = Object.fromEntries(\n capabilities.map((capability) => {\n const current = this.capabilityStates.get(capability)!;\n return [\n capability,\n terminal === undefined\n ? current\n : Object.freeze({ capability, state: terminal } satisfies BrowserCapabilitySnapshot),\n ];\n }),\n ) as Record<BrowserCapability, BrowserCapabilitySnapshot>;\n const values = Object.values(entries);\n const state =\n this.handleState === \"error\"\n ? \"failed\"\n : (terminal ??\n (values.some((value) => value.state === \"checking\")\n ? \"checking\"\n : values.every((value) => value.state === \"unknown\")\n ? \"unknown\"\n : values.every((value) => value.state === \"ready\")\n ? \"ready\"\n : values.some((value) => value.state === \"failed\")\n ? values.some((value) => value.state === \"ready\")\n ? \"degraded\"\n : \"failed\"\n : \"partial\"));\n return Object.freeze({ state, capabilities: Object.freeze(entries) });\n }\n\n async waitForCapabilities(\n options: BrowserWaitUntilReadyOptions,\n ): Promise<BrowserReadinessSnapshot> {\n validateReadinessOptions(options);\n this.assertRunning();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"readiness\");\n }\n const requested = options.capabilities ?? capabilities;\n const ownedController = new AbortController();\n const timeoutController = new AbortController();\n const deadline = Date.now() + options.timeoutMs;\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\"Browser readiness timed out.\", \"readiness_timeout\", {\n phase: \"readiness\",\n }),\n ),\n options.timeoutMs,\n );\n timer.unref?.();\n const signals = [ownedController.signal, timeoutController.signal];\n if (options.abortSignal !== undefined) signals.push(options.abortSignal);\n const abortSignal = AbortSignal.any(signals);\n const previous = new Map(\n requested.map((capability) => [capability, this.capabilityStates.get(capability)!]),\n );\n const generations = new Map(\n requested.map((capability) => {\n const generation = (this.capabilityGenerations.get(capability) ?? 0) + 1;\n this.capabilityGenerations.set(capability, generation);\n return [capability, generation] as const;\n }),\n );\n for (const capability of requested) this.setCapability(capability, \"checking\");\n\n const promise = Promise.allSettled(\n requested.map(async (capability) => {\n try {\n await probeBrowserCapability({\n capability,\n sandbox: this.sandbox,\n control: this.control,\n connectBrowser: this.connectBrowser,\n abortSignal,\n deadline,\n });\n abortSignal.throwIfAborted();\n if (this.capabilityGenerations.get(capability) === generations.get(capability)) {\n this.setCapability(capability, \"ready\");\n }\n } catch (error) {\n const normalized = normalizeReadinessError(error, capability, {\n callerAborted: options.abortSignal?.aborted === true,\n timedOut: timeoutController.signal.aborted,\n });\n if (this.capabilityGenerations.get(capability) === generations.get(capability)) {\n if (options.abortSignal?.aborted) {\n this.capabilityStates.set(capability, previous.get(capability)!);\n } else {\n this.setCapability(capability, \"failed\", normalized);\n }\n }\n throw normalized;\n }\n }),\n );\n const owned = { controller: ownedController, promise };\n this.ownedOperations.add(owned);\n try {\n const results = await promise;\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"readiness\");\n }\n const failures = results.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n );\n this.updateControlAvailability();\n if (failures.length > 0) throw failures[0]!.reason;\n return this.readiness();\n } finally {\n clearTimeout(timer);\n this.ownedOperations.delete(owned);\n }\n }\n\n async waitUntilReady(options: BrowserWaitUntilReadyOptions): Promise<void> {\n await this.waitForCapabilities(options);\n }\n\n async connect(options: BrowserConnectOptions = {}): Promise<PlaywrightBrowserConnection> {\n assertOptionsObject(options);\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n this.assertRunning();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n if (this.connectionPending || this.connections.size > 0) {\n throw new BrowserError(\n \"Browser already has an active or pending automation connection.\",\n \"agent_action_busy\",\n { phase: \"connect\" },\n );\n }\n this.connectionPending = true;\n const controller = new AbortController();\n const signals = [controller.signal];\n if (options.abortSignal !== undefined) signals.push(options.abortSignal);\n const abortSignal = AbortSignal.any(signals);\n let owned!: OwnedOperation;\n const promise = (async () => {\n // Register the operation before endpoint resolution or the connection factory can fail.\n await Promise.resolve();\n try {\n abortSignal.throwIfAborted();\n const connection = await this.connectBrowser({\n endpointUrl: endpointFor(this.sandbox, cdpPort),\n control: this.control,\n timeoutMs: options.timeoutMs ?? defaultConnectTimeoutMs,\n abortSignal,\n scheduling: options.scheduling,\n onClosed: (closedConnection) => this.connections.delete(closedConnection),\n });\n this.connections.add(connection);\n const disconnectedDuringInitialization = connection.closed;\n if (\n disconnectedDuringInitialization ||\n this.handleState !== \"active\" ||\n this.state !== \"running\"\n ) {\n this.connections.delete(connection);\n let cleanupError: unknown;\n try {\n await connection.disconnect();\n } catch (caught) {\n cleanupError = caught;\n }\n if (\n disconnectedDuringInitialization &&\n this.handleState === \"active\" &&\n this.state === \"running\"\n ) {\n throw new BrowserError(\n \"Browser disconnected while automation was initializing.\",\n \"connection_closed\",\n {\n ...(cleanupError === undefined ? {} : { cause: cleanupError }),\n phase: \"connect\",\n },\n );\n }\n const lifecycleError = this.lifecycleError(\n \"Browser stopped while the connection was initializing.\",\n );\n throw cleanupError === undefined\n ? lifecycleError\n : new BrowserError(lifecycleError.message, lifecycleError.code, {\n cause: cleanupError,\n ...(lifecycleError.phase === undefined ? {} : { phase: lifecycleError.phase }),\n });\n }\n return connection;\n } catch (error) {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n if (controller.signal.aborted) throw controller.signal.reason;\n if (error instanceof BrowserError) throw error;\n throw new BrowserError(\"Unable to connect to Chromium over CDP.\", \"transport_failure\", {\n cause: error,\n phase: \"connect\",\n });\n } finally {\n this.connectionPending = false;\n this.ownedOperations.delete(owned);\n }\n })();\n owned = { controller, promise };\n this.ownedOperations.add(owned);\n return promise;\n }\n\n async stop(options: BrowserLifecycleOptions = {}): Promise<void> {\n assertOptionsObject(options);\n if (this.handleState === \"stopped\") return;\n if (this.handleState === \"destroyed\" || this.handleState === \"destroying\") {\n throw new BrowserError(\"Browser runtime is destroyed.\", \"runtime_destroyed\");\n }\n validateLifecycleOptions(options, \"stop-browser\");\n if (this.stopPromise !== undefined) {\n return waitForSharedLifecycle(this.stopPromise, options, \"stop-browser\");\n }\n this.handleState = \"stopping\";\n this.control.setAvailability(\"disconnected\");\n const promise = this.performStop(options);\n this.stopPromise = promise;\n try {\n await promise;\n } finally {\n if (this.stopPromise === promise) this.stopPromise = undefined;\n }\n }\n\n async destroy(options: BrowserLifecycleOptions = {}): Promise<void> {\n assertOptionsObject(options);\n if (this.handleState === \"destroyed\") return;\n validateLifecycleOptions(options, \"destroy-browser\");\n if (this.destroyPromise === undefined) {\n this.handleState = \"destroying\";\n this.control.destroy();\n const activeStop = this.stopPromise;\n const promise = (async () => {\n if (activeStop !== undefined) await activeStop.catch(() => undefined);\n await this.performDestroy();\n })();\n this.destroyPromise = promise;\n void promise.then(\n () => {\n if (this.destroyPromise === promise) this.destroyPromise = undefined;\n },\n () => {\n if (this.destroyPromise === promise) this.destroyPromise = undefined;\n },\n );\n }\n return waitForSharedLifecycle(this.destroyPromise, options, \"destroy-browser\");\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.destroy();\n }\n\n private async performStop(options: BrowserLifecycleOptions): Promise<void> {\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"stop-browser\");\n try {\n await this.abortOwnedOperations(\n new BrowserError(\"Browser runtime is stopping.\", \"connection_closed\", {\n phase: \"stop-browser\",\n }),\n );\n const disconnectFailures = await this.disconnectAll({ abortSignal: bounded.signal });\n await this.sandbox.stop({ abortSignal: bounded.signal });\n if (this.handleState === \"stopping\") this.handleState = \"stopped\";\n bounded.throwIfAborted();\n if (disconnectFailures.length > 0) {\n throw new BrowserError(\n \"Browser stopped, but one or more automation workers failed to disconnect.\",\n \"transport_failure\",\n {\n cause: new AggregateError(disconnectFailures, \"Automation worker cleanup failed.\"),\n phase: \"stop-browser\",\n recovery: \"restart\",\n },\n );\n }\n } catch (error) {\n if (this.handleState === \"stopping\") this.handleState = \"error\";\n throw bounded.normalize(error, \"Unable to stop browser runtime.\", \"transport_failure\");\n } finally {\n bounded.dispose();\n }\n }\n\n private async performDestroy(): Promise<void> {\n try {\n await this.abortOwnedOperations(\n new BrowserError(\"Browser runtime was destroyed.\", \"runtime_destroyed\", {\n phase: \"destroy-browser\",\n }),\n );\n const disconnectFailures = await this.disconnectAll({});\n await this.sandbox.destroy();\n this.handleState = \"destroyed\";\n if (disconnectFailures.length > 0) {\n throw new BrowserError(\n \"Browser was destroyed, but one or more automation workers failed to disconnect.\",\n \"transport_failure\",\n {\n cause: new AggregateError(disconnectFailures, \"Automation worker cleanup failed.\"),\n phase: \"destroy-browser\",\n retryable: false,\n recovery: \"none\",\n },\n );\n }\n } catch (error) {\n if (this.handleState !== \"destroyed\") this.handleState = \"error\";\n if (error instanceof BrowserError) throw error;\n throw new BrowserError(\"Unable to destroy browser runtime.\", \"transport_failure\", {\n cause: error,\n phase: \"destroy-browser\",\n recovery: \"retry\",\n });\n }\n }\n\n private assertRunning(): void {\n if (this.handleState === \"destroyed\" || this.handleState === \"destroying\") {\n throw new BrowserError(\"Browser runtime is destroyed.\", \"runtime_destroyed\");\n }\n if (this.handleState !== \"active\" || this.state !== \"running\") {\n throw new BrowserError(`Browser is not running: ${this.state}`, \"invalid_state\");\n }\n }\n\n private lifecycleError(message: string): BrowserError {\n return this.handleState === \"destroying\" || this.handleState === \"destroyed\"\n ? new BrowserError(message, \"runtime_destroyed\")\n : new BrowserError(message, \"connection_closed\", { phase: \"connect\" });\n }\n\n private async abortOwnedOperations(error: BrowserError): Promise<void> {\n const operations = [...this.ownedOperations];\n for (const operation of operations) operation.controller.abort(error);\n await Promise.allSettled(operations.map((operation) => operation.promise));\n }\n\n private async disconnectAll(options: BrowserLifecycleOptions): Promise<readonly unknown[]> {\n const connections = [...this.connections];\n this.connections.clear();\n const results = await Promise.allSettled(\n connections.map((connection) => connection.disconnect(options)),\n );\n return results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n }\n\n private setCapability(\n capability: BrowserCapability,\n state: BrowserCapabilitySnapshot[\"state\"],\n error?: BrowserError,\n ): void {\n this.capabilityStates.set(\n capability,\n Object.freeze({\n capability,\n state,\n checkedAt: new Date().toISOString(),\n ...(error === undefined ? {} : { error }),\n }),\n );\n }\n\n private updateControlAvailability(): void {\n if (this.handleState !== \"active\" || this.state !== \"running\") {\n this.control.setAvailability(\"disconnected\");\n return;\n }\n const failed = capabilities.some(\n (capability) => this.capabilityStates.get(capability)?.state === \"failed\",\n );\n this.control.setAvailability(failed ? \"degraded\" : \"available\");\n }\n}\n\nfunction validateReadinessOptions(options: BrowserWaitUntilReadyOptions): void {\n assertOptionsObject(options);\n assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.capabilities === undefined) return;\n if (!Array.isArray(options.capabilities) || options.capabilities.length === 0) {\n throw new TypeError(\"capabilities must be a non-empty array.\");\n }\n const unique = new Set<BrowserCapability>();\n for (const capability of options.capabilities) {\n if (!capabilities.includes(capability)) {\n throw new TypeError(`Unsupported browser capability: ${capability}`);\n }\n if (unique.has(capability)) throw new TypeError(`Duplicate browser capability: ${capability}`);\n unique.add(capability);\n }\n}\n","import { type AnyTool, createTool, ToolOutput } from \"@anvia/core/tool\";\nimport { z } from \"zod\";\nimport type {\n AutomationScreenshotResult,\n AutomationSnapshotResult,\n AutomationTabResult,\n} from \"./automation-protocol\";\nimport { asConnection } from \"./connection\";\nimport { BrowserError } from \"./errors\";\nimport type { BrowserNavigationPolicy, BrowserToolName, CreateBrowserToolsOptions } from \"./types\";\n\nconst targetSchema = z.discriminatedUnion(\"by\", [\n z.object({\n by: z.literal(\"role\"),\n role: z.string().min(1),\n name: z.string().optional(),\n exact: z.boolean().optional(),\n }),\n z.object({ by: z.literal(\"text\"), text: z.string().min(1), exact: z.boolean().optional() }),\n z.object({ by: z.literal(\"label\"), label: z.string().min(1), exact: z.boolean().optional() }),\n z.object({\n by: z.literal(\"placeholder\"),\n placeholder: z.string().min(1),\n exact: z.boolean().optional(),\n }),\n z.object({ by: z.literal(\"test-id\"), testId: z.string().min(1) }),\n z.object({ by: z.literal(\"css\"), selector: z.string().min(1) }),\n]);\n\nconst noInput = z.object({});\nconst tabInput = z.object({ tabId: z.string().uuid() });\nconst explicitTab = { tabId: z.string().uuid().optional() };\nconst navigateInput = z.object({\n ...explicitTab,\n url: z.url(),\n waitUntil: z.enum([\"commit\", \"domcontentloaded\", \"load\", \"networkidle\"]).optional(),\n});\nconst clickInput = z.object({ ...explicitTab, target: targetSchema });\nconst typeInput = z.object({ ...explicitTab, target: targetSchema, text: z.string() });\nconst pressKeyInput = z.object({ ...explicitTab, key: z.string().min(1).max(100) });\nconst screenshotInput = z.object(explicitTab);\nconst snapshotInput = z.object(explicitTab);\n\nconst defaultActionTimeoutMs = 10_000;\nconst defaultNavigationTimeoutMs = 30_000;\nconst defaultSnapshotMaxChars = 50_000;\nconst maxTimeoutMs = 300_000;\nconst maxSnapshotChars = 200_000;\n\nexport function createBrowserTools(options: CreateBrowserToolsOptions): readonly AnyTool[] {\n validateFactoryOptions(options);\n const connection = asConnection(options.connection);\n const policy = snapshotNavigationPolicy(options.navigation);\n connection.setNavigationPolicy(policy);\n const limits = {\n actionTimeoutMs: options.limits?.actionTimeoutMs ?? defaultActionTimeoutMs,\n navigationTimeoutMs: options.limits?.navigationTimeoutMs ?? defaultNavigationTimeoutMs,\n snapshotMaxChars: options.limits?.snapshotMaxChars ?? defaultSnapshotMaxChars,\n };\n const tools = options.tools.map((name) => {\n switch (name) {\n case \"browser_list_tabs\":\n return createListTabsTool(connection, limits.actionTimeoutMs);\n case \"browser_open_tab\":\n return createOpenTabTool(connection, limits.actionTimeoutMs);\n case \"browser_select_tab\":\n return createSelectTabTool(connection, limits.actionTimeoutMs);\n case \"browser_close_tab\":\n return createCloseTabTool(connection, limits.actionTimeoutMs);\n case \"browser_navigate\":\n return createNavigateTool(connection, policy, limits.navigationTimeoutMs);\n case \"browser_snapshot\":\n return createSnapshotTool(connection, limits.actionTimeoutMs, limits.snapshotMaxChars);\n case \"browser_click\":\n return createClickTool(connection, limits.actionTimeoutMs);\n case \"browser_type\":\n return createTypeTool(connection, limits.actionTimeoutMs);\n case \"browser_press_key\":\n return createPressKeyTool(connection, limits.actionTimeoutMs);\n case \"browser_screenshot\":\n return createScreenshotTool(connection, limits.actionTimeoutMs);\n default:\n return assertNever(name);\n }\n });\n return Object.freeze(tools);\n}\n\ntype Connection = ReturnType<typeof asConnection>;\n\nfunction createListTabsTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_list_tabs\",\n description: \"List Chromium tabs and identify the tab selected for subsequent browser tools.\",\n inputSchema: noInput,\n execute: async (_args, context) => ({\n tabs: await connection.listTabs({ abortSignal: context.abortSignal, timeoutMs }),\n }),\n });\n}\n\nfunction createOpenTabTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_open_tab\",\n description: \"Open and select a new blank Chromium tab.\",\n inputSchema: noInput,\n execute: async (_args, context) => connection.openTab(context.abortSignal, timeoutMs),\n });\n}\n\nfunction createSelectTabTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_select_tab\",\n description: \"Select an existing Chromium tab by its browser tab ID.\",\n inputSchema: tabInput,\n execute: async ({ tabId }, context) =>\n connection.selectTab(tabId, context.abortSignal, timeoutMs),\n });\n}\n\nfunction createCloseTabTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_close_tab\",\n description: \"Close an existing Chromium tab by its browser tab ID.\",\n inputSchema: tabInput,\n execute: async ({ tabId }, context) =>\n connection.closeTab(tabId, context.abortSignal, timeoutMs),\n });\n}\n\nfunction createNavigateTool(\n connection: Connection,\n policy: BrowserNavigationPolicy,\n timeoutMs: number,\n): AnyTool {\n return createTool({\n name: \"browser_navigate\",\n description:\n \"Navigate an explicit tab, or the selected tab in serial compatibility mode, to an allowed HTTP or HTTPS URL.\",\n inputSchema: navigateInput,\n execute: async ({ tabId, url, waitUntil }, context) => {\n assertNavigationAllowed(url, policy);\n const result = await connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"navigate\",\n command: (targetTabId) => ({\n method: \"navigate\",\n params: {\n tabId: targetTabId,\n url,\n waitUntil: waitUntil ?? \"load\",\n timeoutMs,\n },\n }),\n });\n assertNavigationAllowed(result.url, policy);\n return result;\n },\n });\n}\n\nfunction createSnapshotTool(connection: Connection, timeoutMs: number, maxChars: number): AnyTool {\n return createTool({\n name: \"browser_snapshot\",\n description:\n \"Inspect an explicit tab, or the selected tab in serial compatibility mode, using a bounded ARIA accessibility snapshot.\",\n inputSchema: snapshotInput,\n execute: async ({ tabId }, context) =>\n connection.runTabCommand<AutomationSnapshotResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"snapshot\",\n command: (targetTabId) => ({\n method: \"snapshot\",\n params: { tabId: targetTabId, timeoutMs, maxChars },\n }),\n }),\n });\n}\n\nfunction createClickTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_click\",\n description: \"Click one strictly matched element in an explicit tab or the selected tab.\",\n inputSchema: clickInput,\n execute: async ({ tabId, target }, context) =>\n connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"click\",\n command: (targetTabId) => ({\n method: \"click\",\n params: { tabId: targetTabId, target, timeoutMs },\n }),\n }),\n });\n}\n\nfunction createTypeTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_type\",\n description:\n \"Replace the value of one strictly matched editable element in an explicit or selected tab.\",\n inputSchema: typeInput,\n execute: async ({ tabId, target, text }, context) =>\n connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"type\",\n command: (targetTabId) => ({\n method: \"type\",\n params: { tabId: targetTabId, target, text, timeoutMs },\n }),\n }),\n });\n}\n\nfunction createPressKeyTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_press_key\",\n description:\n \"Press an explicit keyboard key or key combination in an explicit or selected tab.\",\n inputSchema: pressKeyInput,\n execute: async ({ tabId, key }, context) =>\n connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"press-key\",\n command: (targetTabId) => ({\n method: \"pressKey\",\n params: { tabId: targetTabId, key },\n }),\n }),\n });\n}\n\nfunction createScreenshotTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_screenshot\",\n description: \"Capture the visible viewport of an explicit or selected Chromium tab as PNG.\",\n inputSchema: screenshotInput,\n execute: async ({ tabId }, context) => {\n const result = await connection.runTabCommand<AutomationScreenshotResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"screenshot\",\n command: (targetTabId) => ({\n method: \"screenshot\",\n params: { tabId: targetTabId, timeoutMs },\n }),\n });\n return ToolOutput.content([\n { type: \"text\", text: JSON.stringify(result.metadata) },\n {\n type: \"file\",\n data: { type: \"data\", data: result.pngBase64 },\n mediaType: \"image/png\",\n filename: \"browser-screenshot.png\",\n },\n ]);\n },\n });\n}\n\nfunction snapshotNavigationPolicy(policy: BrowserNavigationPolicy): BrowserNavigationPolicy {\n if (!isRecord(policy)) throw new TypeError(\"navigation must be an object.\");\n if (policy.mode === \"allow-all-http\") return Object.freeze({ mode: \"allow-all-http\" });\n if (policy.mode !== \"origins\" || !Array.isArray(policy.origins) || policy.origins.length === 0) {\n throw new TypeError(\n \"navigation must explicitly allow all HTTP URLs or a non-empty origin list.\",\n );\n }\n const origins = policy.origins.map((origin) => normalizeOrigin(origin));\n if (new Set(origins).size !== origins.length) {\n throw new TypeError(\"navigation.origins contains a duplicate origin.\");\n }\n return Object.freeze({ mode: \"origins\", origins: Object.freeze(origins) });\n}\n\nfunction normalizeOrigin(value: unknown): string {\n if (typeof value !== \"string\") throw new TypeError(\"navigation origin must be a string.\");\n const url = parseHttpUrl(value);\n if (value !== url.origin) {\n throw new TypeError(`navigation origin must not contain a path, query, or fragment: ${value}`);\n }\n return url.origin;\n}\n\nfunction assertNavigationAllowed(value: string, policy: BrowserNavigationPolicy): void {\n if (!isNavigationAllowed(value, policy)) {\n throw new BrowserError(`Browser navigation is blocked: ${value}`, \"navigation_blocked\");\n }\n}\n\nfunction isNavigationAllowed(value: string, policy: BrowserNavigationPolicy): boolean {\n let url: URL;\n try {\n url = parseHttpUrl(value);\n } catch {\n return false;\n }\n return policy.mode === \"allow-all-http\" || policy.origins.includes(url.origin);\n}\n\nfunction parseHttpUrl(value: string): URL {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(\"Browser navigation only supports HTTP and HTTPS URLs.\");\n }\n if (url.username.length > 0 || url.password.length > 0) {\n throw new TypeError(\"Browser navigation URLs must not include credentials.\");\n }\n return url;\n}\n\nfunction validateFactoryOptions(options: CreateBrowserToolsOptions): void {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (!Array.isArray(options.tools) || options.tools.length === 0) {\n throw new TypeError(\"tools must be a non-empty array.\");\n }\n const seen = new Set<BrowserToolName>();\n for (const name of options.tools) {\n if (!isToolName(name)) throw new TypeError(`Unsupported browser tool name: ${name}`);\n if (seen.has(name)) throw new TypeError(`tools contains a duplicate: ${name}`);\n seen.add(name);\n }\n snapshotNavigationPolicy(options.navigation);\n if (options.limits !== undefined && !isRecord(options.limits)) {\n throw new TypeError(\"limits must be an object.\");\n }\n assertOptionalBoundedInteger(options.limits?.actionTimeoutMs, \"actionTimeoutMs\", 1, maxTimeoutMs);\n assertOptionalBoundedInteger(\n options.limits?.navigationTimeoutMs,\n \"navigationTimeoutMs\",\n 1,\n maxTimeoutMs,\n );\n assertOptionalBoundedInteger(\n options.limits?.snapshotMaxChars,\n \"snapshotMaxChars\",\n 1,\n maxSnapshotChars,\n );\n}\n\nfunction assertOptionalBoundedInteger(\n value: number | undefined,\n name: string,\n min: number,\n max: number,\n): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < min || value > max)) {\n throw new RangeError(`${name} must be a safe integer between ${min} and ${max}.`);\n }\n}\n\nfunction isToolName(value: unknown): value is BrowserToolName {\n return (\n typeof value === \"string\" &&\n [\n \"browser_list_tabs\",\n \"browser_open_tab\",\n \"browser_select_tab\",\n \"browser_close_tab\",\n \"browser_navigate\",\n \"browser_snapshot\",\n \"browser_click\",\n \"browser_type\",\n \"browser_press_key\",\n \"browser_screenshot\",\n ].includes(value)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNever(value: never): never {\n throw new TypeError(`Unsupported browser tool: ${value}`);\n}\n"],"mappings":"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","names":["assertPositiveSafeInteger","maxTimerMs","assertPositiveSafeInteger","isRecord","maxTimerMs","assertPositiveSafeInteger","assertOptionsObject","isRecord","isRecord","assertOptionsObject","assertPositiveSafeInteger","isRecord","assertOptionsObject","combineCleanupError","assertPositiveSafeInteger","defaultActionTimeoutMs","isRecord"]}
|
|
1
|
+
{"version":3,"sources":["../src/docker-browser-client.ts","../src/automation-client.ts","../src/automation-protocol.ts","../src/errors.ts","../src/scheduler.ts","../src/connection.ts","../src/control.ts","../src/lifecycle.ts","../src/readiness.ts","../src/docker-browser.ts","../src/tools.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport type { DockerSandbox, DockerSandboxClient } from \"@anvia/sandbox\";\nimport { DockerBrowserHandle } from \"./docker-browser\";\nimport {\n assertOptionsObject,\n assertPositiveSafeInteger,\n boundedSignal,\n defaultLifecycleTimeoutMs,\n isRecord,\n} from \"./lifecycle\";\nimport { cdpPort, noVncPort } from \"./readiness\";\nimport type {\n CreateDockerBrowserOptions,\n DockerBrowser,\n DockerBrowserClientOptions,\n PullDockerBrowserImageOptions,\n ResumeDockerBrowserOptions,\n} from \"./types\";\n\nconst browserSchema = \"1\";\nconst defaultSharedMemoryMb = 1024;\nconst seccompProfilePath = fileURLToPath(\n new URL(\"../security/seccomp_profile.json\", import.meta.url),\n);\n\nexport class DockerBrowserClient {\n private readonly sandboxClient: DockerSandboxClient;\n private readonly image: string;\n\n constructor(options: DockerBrowserClientOptions) {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (!isSandboxClient(options.sandboxClient)) {\n throw new TypeError(\"sandboxClient must be a DockerSandboxClient.\");\n }\n assertNonEmptyString(options.image, \"image\");\n this.sandboxClient = options.sandboxClient;\n this.image = options.image;\n }\n\n async pullImage(options: PullDockerBrowserImageOptions = {}): Promise<void> {\n assertOptionsObject(options);\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"pull-image\");\n try {\n await this.sandboxClient.pullImage({ image: this.image, abortSignal: bounded.signal });\n bounded.throwIfAborted();\n } catch (error) {\n throw bounded.normalize(error, \"Unable to pull the browser image.\", \"startup_failed\");\n } finally {\n bounded.dispose();\n }\n }\n\n async createBrowser(options: CreateDockerBrowserOptions): Promise<DockerBrowser> {\n validateCreateOptions(options);\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"create-browser\");\n const resources = {\n ...options.resources,\n sharedMemoryMb: options.resources?.sharedMemoryMb ?? defaultSharedMemoryMb,\n };\n let sandboxOptions: Parameters<typeof this.sandboxClient.createSandbox>[0] = {\n image: this.image,\n workdir: \"/workspace\",\n workspace: options.workspace,\n network: { mode: \"bridge\", ports: [cdpPort, noVncPort] },\n user: \"pwuser\",\n labels: { \"anvia.browser.schema\": browserSchema },\n resources,\n security: {\n noNewPrivileges: true,\n dropCapabilities: [\"ALL\"],\n addCapabilities: [\"SYS_CHROOT\"],\n seccompProfile: { type: \"path\", path: seccompProfilePath },\n },\n abortSignal: bounded.signal,\n };\n if (options.id !== undefined) sandboxOptions = { ...sandboxOptions, id: options.id };\n if (options.runtime !== undefined) {\n sandboxOptions = { ...sandboxOptions, runtime: options.runtime };\n }\n let sandbox: DockerSandbox | undefined;\n try {\n sandbox = await this.sandboxClient.createSandbox(sandboxOptions);\n await configureBrowser(sandbox, options, bounded.signal);\n await startBrowserServices(sandbox, bounded.signal);\n bounded.throwIfAborted();\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n let cleanupError: unknown;\n try {\n await sandbox?.destroy();\n } catch (caught) {\n cleanupError = caught;\n }\n throw bounded.normalize(\n combineCleanupError(error, cleanupError, \"Browser sandbox cleanup also failed.\"),\n \"Unable to configure the browser sandbox.\",\n \"startup_failed\",\n );\n } finally {\n bounded.dispose();\n }\n }\n\n async resumeBrowser(options: ResumeDockerBrowserOptions): Promise<DockerBrowser> {\n assertOptionsObject(options);\n assertNonEmptyString(options.id, \"id\");\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"resume-browser\");\n let sandbox: DockerSandbox | undefined;\n try {\n sandbox = await this.sandboxClient.resumeSandbox({\n id: options.id,\n abortSignal: bounded.signal,\n });\n await assertBrowserImage(sandbox, bounded.signal);\n await startBrowserServices(sandbox, bounded.signal);\n bounded.throwIfAborted();\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n let cleanupError: unknown;\n try {\n await sandbox?.stop();\n } catch (caught) {\n cleanupError = caught;\n }\n throw bounded.normalize(\n combineCleanupError(error, cleanupError, \"Resumed browser cleanup also failed.\"),\n \"Unable to resume browser services.\",\n \"startup_failed\",\n );\n } finally {\n bounded.dispose();\n }\n }\n}\n\nasync function configureBrowser(\n sandbox: DockerSandbox,\n options: CreateDockerBrowserOptions,\n abortSignal: AbortSignal,\n): Promise<void> {\n const result = await sandbox.runtime.exec({\n command: \"/usr/local/bin/anvia-browser-configure\",\n input: JSON.stringify({\n password: options.desktop.password,\n width: options.desktop.viewport.width,\n height: options.desktop.viewport.height,\n }),\n abortSignal,\n });\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new Error(\"Browser image rejected its runtime configuration.\");\n }\n}\n\nasync function assertBrowserImage(sandbox: DockerSandbox, abortSignal: AbortSignal): Promise<void> {\n const result = await sandbox.runtime.exec({\n command: \"/usr/local/bin/anvia-browser-version\",\n abortSignal,\n });\n if (\n result.status !== \"exited\" ||\n result.exitCode !== 0 ||\n new TextDecoder(\"utf-8\", { fatal: true }).decode(result.stdout).trim() !== browserSchema\n ) {\n throw new Error(\"Sandbox does not contain a compatible Anvia browser image.\");\n }\n}\n\nasync function startBrowserServices(\n sandbox: DockerSandbox,\n abortSignal: AbortSignal,\n): Promise<void> {\n await sandbox.runtime.startProcess({\n command: \"/usr/local/bin/anvia-browser-start\",\n abortSignal,\n });\n}\n\nfunction validateCreateOptions(options: CreateDockerBrowserOptions): void {\n assertOptionsObject(options);\n if (options.id !== undefined) assertNonEmptyString(options.id, \"id\");\n if (!isRecord(options.workspace)) throw new TypeError(\"workspace must be an object.\");\n if (!isRecord(options.network) || options.network.mode !== \"bridge\") {\n throw new TypeError('network must be { mode: \"bridge\" }.');\n }\n if (!isRecord(options.desktop) || options.desktop.protocol !== \"novnc\") {\n throw new TypeError('desktop must use protocol: \"novnc\".');\n }\n if (!/^[\\x20-\\x7e]{8}$/.test(options.desktop.password)) {\n throw new TypeError(\"desktop.password must contain exactly 8 printable ASCII characters.\");\n }\n if (!isRecord(options.desktop.viewport)) {\n throw new TypeError(\"desktop.viewport must be an object.\");\n }\n assertIntegerInRange(options.desktop.viewport.width, \"desktop.viewport.width\", 640, 3840);\n assertIntegerInRange(options.desktop.viewport.height, \"desktop.viewport.height\", 480, 2160);\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.runtime?.maxProcesses !== undefined && options.runtime.maxProcesses < 1) {\n throw new RangeError(\"runtime.maxProcesses must allow the browser service process.\");\n }\n}\n\nfunction assertIntegerInRange(value: number, name: string, min: number, max: number): void {\n if (!Number.isSafeInteger(value) || value < min || value > max) {\n throw new RangeError(`${name} must be a safe integer between ${min} and ${max}.`);\n }\n}\n\nfunction assertNonEmptyString(value: unknown, name: string): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${name} must be a non-empty string.`);\n }\n}\n\nfunction isSandboxClient(value: unknown): value is DockerSandboxClient {\n return (\n isRecord(value) &&\n typeof value.pullImage === \"function\" &&\n typeof value.createSandbox === \"function\" &&\n typeof value.resumeSandbox === \"function\"\n );\n}\n\nfunction combineCleanupError(error: unknown, cleanupError: unknown, message: string): unknown {\n return cleanupError === undefined ? error : new AggregateError([error, cleanupError], message);\n}\n","import { fork, type ChildProcess } from \"node:child_process\";\nimport type {\n AutomationCommand,\n AutomationMessageSummary,\n AutomationRequest,\n SerializedError,\n} from \"./automation-protocol\";\nimport { isAutomationResponse, summarizeAutomationMessage } from \"./automation-protocol\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport type { BrowserLifecycleOptions } from \"./types\";\n\ntype PendingRequest = {\n state: \"active\" | \"cancelling\";\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n abortSignal?: AbortSignal;\n abort?: () => void;\n abortError?: unknown;\n cleanupTimer?: ReturnType<typeof setTimeout>;\n};\n\nexport type AutomationCommandOptions = Readonly<{\n abortSignal?: AbortSignal;\n cancelOperation?: boolean;\n phase: string;\n}>;\n\nexport interface AutomationBackend {\n readonly closed: boolean;\n command<T>(command: AutomationCommand, options: AutomationCommandOptions): Promise<T>;\n disconnect(options?: BrowserLifecycleOptions): Promise<void>;\n onDisconnected(listener: () => void): () => void;\n}\n\nexport type AutomationWorkerFactory = () => ChildProcess;\n\nconst cancellationCleanupTimeoutMs = 5_000;\nconst workerTerminationTimeoutMs = 3_000;\nconst maxWorkerStderrChars = 32_768;\n\nexport class AutomationWorkerClient implements AutomationBackend {\n private readonly child: ChildProcess;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly disconnectedListeners = new Set<() => void>();\n private nextId = 1;\n private isClosed = false;\n private disconnecting = false;\n private termination: Promise<void> | undefined;\n private workerStderr = \"\";\n private readonly onStderrData = (chunk: string) => {\n this.workerStderr = `${this.workerStderr}${chunk}`.slice(-maxWorkerStderrChars);\n };\n private readonly onStderrError = () => {\n // The diagnostics pipe is optional; its failure must not crash the host process.\n };\n private readonly onMessage = (message: unknown) => {\n try {\n this.handleMessage(message);\n } catch (error) {\n this.handleExit(\n new BrowserError(\n \"Browser automation worker sent an invalid response.\",\n \"transport_failure\",\n {\n cause: error,\n phase: \"automation-worker\",\n },\n ),\n );\n void this.terminate().catch(() => undefined);\n }\n };\n private readonly onError = (error: Error) => {\n this.handleExit(error);\n void this.terminate().catch(() => undefined);\n };\n private readonly onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const diagnostics = this.workerStderr.trim();\n this.handleExit(\n new Error(\n `Browser automation worker exited: code=${code ?? \"null\"} signal=${signal ?? \"null\"}${diagnostics.length === 0 ? \"\" : `\\n${diagnostics}`}`,\n ),\n );\n };\n\n private constructor(factory: AutomationWorkerFactory) {\n this.child = factory();\n this.child.stderr?.setEncoding(\"utf8\");\n this.child.stderr?.on(\"data\", this.onStderrData);\n this.child.stderr?.on(\"error\", this.onStderrError);\n this.child.on(\"message\", this.onMessage);\n this.child.on(\"error\", this.onError);\n this.child.once(\"exit\", this.onExit);\n }\n\n static async connect(options: {\n endpointUrl: string;\n timeoutMs: number;\n abortSignal?: AbortSignal;\n workerFactory?: AutomationWorkerFactory;\n }): Promise<AutomationWorkerClient> {\n assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n let client: AutomationWorkerClient;\n try {\n client = new AutomationWorkerClient(options.workerFactory ?? spawnAutomationWorker);\n } catch (error) {\n throw new BrowserError(\n \"Unable to start the browser automation worker.\",\n \"transport_failure\",\n {\n cause: error,\n phase: \"connect\",\n recovery: \"reconnect\",\n },\n );\n }\n const timeoutController = new AbortController();\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\n \"Browser connection did not initialize before the timeout.\",\n \"connection_timeout\",\n { phase: \"connect\" },\n ),\n ),\n options.timeoutMs,\n );\n timer.unref?.();\n const abortSignal =\n options.abortSignal === undefined\n ? timeoutController.signal\n : AbortSignal.any([options.abortSignal, timeoutController.signal]);\n try {\n await client.command(\n {\n method: \"connect\",\n params: { endpointUrl: options.endpointUrl, timeoutMs: options.timeoutMs },\n },\n { abortSignal, phase: \"connect\" },\n );\n return client;\n } catch (error) {\n await client.terminate();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n if (\n error instanceof Error &&\n (error.name === \"TimeoutError\" || /timeout/i.test(error.message))\n ) {\n throw new BrowserError(\n \"Browser connection did not initialize before the timeout.\",\n \"connection_timeout\",\n { cause: error, phase: \"connect\" },\n );\n }\n throw new BrowserError(\"Unable to initialize browser automation.\", \"transport_failure\", {\n cause: error,\n phase: \"connect\",\n });\n } finally {\n clearTimeout(timer);\n }\n }\n\n get closed(): boolean {\n return this.isClosed || this.child.exitCode !== null || this.child.signalCode !== null;\n }\n\n command<T>(command: AutomationCommand, options: AutomationCommandOptions): Promise<T> {\n if (this.closed) {\n return Promise.reject(\n new BrowserError(\"Browser automation connection is closed.\", \"connection_closed\", {\n phase: options.phase,\n }),\n );\n }\n if (options.abortSignal?.aborted) {\n return Promise.reject(this.abortError(options.abortSignal, options.phase));\n }\n const id = this.nextId++;\n return new Promise<T>((resolve, reject) => {\n const pending: PendingRequest = {\n state: \"active\",\n resolve: (value) => resolve(value as T),\n reject,\n };\n if (options.abortSignal !== undefined) {\n pending.abortSignal = options.abortSignal;\n pending.abort = () => this.cancelRequest(id, pending, options);\n options.abortSignal.addEventListener(\"abort\", pending.abort, { once: true });\n }\n this.pending.set(id, pending);\n const request: AutomationRequest = { kind: \"request\", id, ...command };\n try {\n this.child.send(request, (error) => {\n if (error == null) return;\n this.rejectSend(options.phase, error);\n });\n } catch (error) {\n this.rejectSend(options.phase, error);\n }\n });\n }\n\n async disconnect(options: BrowserLifecycleOptions = {}): Promise<void> {\n if (this.termination !== undefined) return this.termination;\n this.disconnecting = true;\n const timeoutMs = options.timeoutMs ?? 10_000;\n const timeoutController = new AbortController();\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\"Browser disconnect timed out.\", \"connection_timeout\", {\n phase: \"disconnect\",\n }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const abortSignal =\n options.abortSignal === undefined\n ? timeoutController.signal\n : AbortSignal.any([options.abortSignal, timeoutController.signal]);\n try {\n if (!this.closed) {\n await this.command(\n { method: \"disconnect\", params: {} },\n { abortSignal, phase: \"disconnect\" },\n );\n }\n } catch (error) {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n if (!this.closed) throw error;\n } finally {\n clearTimeout(timer);\n await this.terminate();\n }\n }\n\n onDisconnected(listener: () => void): () => void {\n if (this.closed) {\n queueMicrotask(() => {\n try {\n listener();\n } catch {\n // A closed backend must not surface callback failures through the host event loop.\n }\n });\n return () => undefined;\n }\n this.disconnectedListeners.add(listener);\n return () => this.disconnectedListeners.delete(listener);\n }\n\n async terminate(): Promise<void> {\n if (this.termination !== undefined) return this.termination;\n this.termination = this.performTerminate();\n return this.termination;\n }\n\n private async performTerminate(): Promise<void> {\n this.isClosed = true;\n if (this.child.exitCode !== null || this.child.signalCode !== null) return;\n const exited = new Promise<void>((resolve) => this.child.once(\"exit\", () => resolve()));\n this.child.kill(\"SIGTERM\");\n let forceTimer: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n exited,\n new Promise<void>((resolve) => {\n forceTimer = setTimeout(() => {\n this.child.kill(\"SIGKILL\");\n resolve();\n }, workerTerminationTimeoutMs);\n forceTimer.unref?.();\n }),\n ]);\n if (forceTimer !== undefined) clearTimeout(forceTimer);\n if (this.child.exitCode === null && this.child.signalCode === null) await exited;\n }\n\n private cancelRequest(\n id: number,\n pending: PendingRequest,\n options: AutomationCommandOptions,\n ): void {\n if (pending.state !== \"active\") return;\n pending.state = \"cancelling\";\n pending.abortError = this.abortError(pending.abortSignal!, options.phase);\n if (options.cancelOperation === true && this.child.connected) {\n try {\n this.child.send({ kind: \"cancel\", id }, (error) => {\n if (error !== null) void this.terminate().catch(() => undefined);\n });\n } catch {\n void this.terminate().catch(() => undefined);\n return;\n }\n pending.cleanupTimer = setTimeout(() => {\n void this.terminate().catch(() => undefined);\n }, cancellationCleanupTimeoutMs);\n pending.cleanupTimer.unref?.();\n return;\n }\n void this.terminate().catch(() => undefined);\n }\n\n private abortError(abortSignal: AbortSignal, phase: string): unknown {\n return abortSignal.reason instanceof BrowserError\n ? abortSignal.reason\n : cancellationError(abortSignal.reason, phase);\n }\n\n private handleMessage(message: unknown): void {\n if (!isAutomationResponse(message)) {\n throw new InvalidAutomationResponseError(summarizeAutomationMessage(message));\n }\n if (message.kind === \"event\") {\n if (!this.disconnecting) {\n this.handleExit(\n new BrowserError(\"Browser disconnected from CDP.\", \"connection_closed\", {\n phase: \"automation-event\",\n }),\n );\n void this.terminate().catch(() => undefined);\n }\n return;\n }\n const pending = this.pending.get(message.id);\n if (pending === undefined) return;\n if (message.kind === \"cancelled\") {\n if (pending.state === \"cancelling\") {\n this.settle(message.id, pending, () => pending.reject(pending.abortError));\n }\n return;\n }\n if (pending.state === \"cancelling\") return;\n this.settle(message.id, pending, () => {\n if (message.ok) pending.resolve(message.value);\n else pending.reject(deserializeError(message.error));\n });\n }\n\n private handleExit(cause: unknown): void {\n if (this.isClosed && this.pending.size === 0) {\n this.cleanupChildListeners();\n return;\n }\n this.isClosed = true;\n const error =\n cause instanceof BrowserError\n ? cause\n : new BrowserError(\"Browser automation worker terminated.\", \"transport_failure\", {\n cause,\n phase: \"automation-worker\",\n });\n for (const [id, pending] of this.pending) {\n this.settle(id, pending, () =>\n pending.reject(pending.state === \"cancelling\" ? pending.abortError : error),\n );\n }\n const listeners = [...this.disconnectedListeners];\n this.disconnectedListeners.clear();\n for (const listener of listeners) {\n try {\n listener();\n } catch {\n // Connection teardown must not throw from a child-process event callback.\n }\n }\n this.cleanupChildListeners();\n }\n\n private cleanupChildListeners(): void {\n this.child.off(\"message\", this.onMessage);\n this.child.off(\"error\", this.onError);\n this.child.off(\"exit\", this.onExit);\n this.child.stderr?.off(\"data\", this.onStderrData);\n this.child.stderr?.off(\"error\", this.onStderrError);\n }\n\n private rejectSend(phase: string, cause: unknown): void {\n this.handleExit(\n new BrowserError(\"Unable to send browser automation command.\", \"transport_failure\", {\n cause,\n phase,\n }),\n );\n void this.terminate().catch(() => undefined);\n }\n\n private settle(id: number, pending: PendingRequest, callback: () => void): void {\n if (this.pending.get(id) !== pending) return;\n this.pending.delete(id);\n if (pending.cleanupTimer !== undefined) clearTimeout(pending.cleanupTimer);\n if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n callback();\n }\n}\n\nexport function spawnAutomationWorker(workerUrl = automationWorkerUrl()): ChildProcess {\n const env = { ...process.env };\n delete env.WATCH_REPORT_DEPENDENCIES;\n return fork(workerUrl, [], {\n env,\n execArgv: [],\n serialization: \"advanced\",\n stdio: [\"ignore\", \"ignore\", \"pipe\", \"ipc\"],\n });\n}\n\nfunction automationWorkerUrl(): URL {\n return import.meta.url.endsWith(\"/src/automation-client.ts\")\n ? new URL(\"../dist/automation-worker.js\", import.meta.url)\n : new URL(\"./automation-worker.js\", import.meta.url);\n}\n\nfunction deserializeError(value: SerializedError): Error {\n const error = new Error(value.message);\n error.name = value.name;\n if (value.stack !== undefined) error.stack = value.stack;\n if (value.code !== undefined) Object.assign(error, { code: value.code });\n return error;\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > 2_147_483_647) {\n throw new RangeError(`${name} must be a positive integer no greater than 2147483647.`);\n }\n}\n\nclass InvalidAutomationResponseError extends TypeError {\n constructor(readonly responseSummary: AutomationMessageSummary) {\n super(\"Invalid browser automation worker response.\");\n }\n}\n","import type { BrowserNavigationPolicy } from \"./types\";\n\nexport type BrowserTarget =\n | Readonly<{\n by: \"role\";\n role: string;\n name?: string | undefined;\n exact?: boolean | undefined;\n }>\n | Readonly<{ by: \"text\"; text: string; exact?: boolean | undefined }>\n | Readonly<{ by: \"label\"; label: string; exact?: boolean | undefined }>\n | Readonly<{ by: \"placeholder\"; placeholder: string; exact?: boolean | undefined }>\n | Readonly<{ by: \"test-id\"; testId: string }>\n | Readonly<{ by: \"css\"; selector: string }>;\n\nexport type AutomationCommand =\n | Readonly<{ method: \"connect\"; params: { endpointUrl: string; timeoutMs: number } }>\n | Readonly<{ method: \"disconnect\"; params: Record<string, never> }>\n | Readonly<{ method: \"listTabs\"; params: Record<string, never> }>\n | Readonly<{ method: \"setNavigationPolicy\"; params: { policy: BrowserNavigationPolicy } }>\n | Readonly<{ method: \"openTab\"; params: Record<string, never> }>\n | Readonly<{ method: \"selectTab\"; params: { tabId: string } }>\n | Readonly<{ method: \"closeTab\"; params: { tabId: string } }>\n | Readonly<{\n method: \"navigate\";\n params: {\n tabId: string;\n url: string;\n waitUntil: \"commit\" | \"domcontentloaded\" | \"load\" | \"networkidle\";\n timeoutMs: number;\n };\n }>\n | Readonly<{\n method: \"snapshot\";\n params: { tabId: string; timeoutMs: number; maxChars: number };\n }>\n | Readonly<{\n method: \"click\";\n params: { tabId: string; target: BrowserTarget; timeoutMs: number };\n }>\n | Readonly<{\n method: \"type\";\n params: { tabId: string; target: BrowserTarget; text: string; timeoutMs: number };\n }>\n | Readonly<{ method: \"pressKey\"; params: { tabId: string; key: string } }>\n | Readonly<{ method: \"screenshot\"; params: { tabId: string; timeoutMs: number } }>;\n\nexport type AutomationRequest = AutomationCommand & Readonly<{ kind: \"request\"; id: number }>;\n\nexport type AutomationCancel = Readonly<{ kind: \"cancel\"; id: number }>;\n\nexport type SerializedError = Readonly<{\n name: string;\n message: string;\n stack?: string;\n code?: string;\n}>;\n\nexport type AutomationResponse =\n | Readonly<{ kind: \"response\"; id: number; ok: true; value: unknown }>\n | Readonly<{ kind: \"response\"; id: number; ok: false; error: SerializedError }>\n | Readonly<{ kind: \"cancelled\"; id: number }>\n | Readonly<{ kind: \"event\"; event: \"disconnected\" }>;\n\nexport type AutomationTabResult = Readonly<{\n tabId: string;\n title: string;\n url: string;\n}>;\n\nexport type AutomationSnapshotResult = AutomationTabResult &\n Readonly<{ snapshot: string; truncated: boolean }>;\n\nexport type AutomationScreenshotResult = Readonly<{\n metadata: AutomationTabResult;\n pngBase64: string;\n}>;\n\nexport type AutomationMessageSummary = Readonly<{\n type: string;\n ownPropertyNames: readonly string[];\n ownPropertyCount: number;\n kind: \"response\" | \"cancelled\" | \"event\" | \"other\" | undefined;\n id: number | \"non-number\" | undefined;\n ok: boolean | \"non-boolean\" | undefined;\n constructorName: \"Object\" | \"null-prototype\" | \"other\" | undefined;\n hasExpectedPrototype: boolean;\n hasRequiredFields: boolean;\n}>;\n\nconst safeSummaryPropertyNames = new Set([\n \"cmd\",\n \"error\",\n \"event\",\n \"id\",\n \"kind\",\n \"ok\",\n \"value\",\n \"watch:import\",\n \"watch:require\",\n]);\nconst maxSummaryPropertyNames = 12;\n\nexport function isAutomationResponse(value: unknown): value is AutomationResponse {\n if (!isRecord(value)) return false;\n switch (value.kind) {\n case \"event\":\n return value.event === \"disconnected\";\n case \"cancelled\":\n return isRequestId(value.id);\n case \"response\":\n if (!isRequestId(value.id) || typeof value.ok !== \"boolean\") return false;\n return value.ok ? Object.hasOwn(value, \"value\") : isSerializedError(value.error);\n default:\n return false;\n }\n}\n\nexport function summarizeAutomationMessage(value: unknown): AutomationMessageSummary {\n const isObject = isRecord(value);\n const prototype = isObject ? Object.getPrototypeOf(value) : undefined;\n const propertyNames = isObject ? Object.getOwnPropertyNames(value) : [];\n return Object.freeze({\n type: value === null ? \"null\" : Array.isArray(value) ? \"array\" : typeof value,\n ownPropertyNames: Object.freeze(\n propertyNames\n .slice(0, maxSummaryPropertyNames)\n .map((name) => (safeSummaryPropertyNames.has(name) ? name : \"<other>\")),\n ),\n ownPropertyCount: propertyNames.length,\n kind:\n !isObject || value.kind === undefined\n ? undefined\n : value.kind === \"response\" || value.kind === \"cancelled\" || value.kind === \"event\"\n ? value.kind\n : \"other\",\n id:\n !isObject || value.id === undefined\n ? undefined\n : typeof value.id === \"number\"\n ? value.id\n : \"non-number\",\n ok:\n !isObject || value.ok === undefined\n ? undefined\n : typeof value.ok === \"boolean\"\n ? value.ok\n : \"non-boolean\",\n constructorName: !isObject\n ? undefined\n : prototype === null\n ? \"null-prototype\"\n : prototype === Object.prototype\n ? \"Object\"\n : \"other\",\n hasExpectedPrototype: isObject && prototype === Object.prototype,\n hasRequiredFields: isAutomationResponse(value),\n });\n}\n\nfunction isSerializedError(value: unknown): value is SerializedError {\n return (\n isRecord(value) &&\n typeof value.name === \"string\" &&\n typeof value.message === \"string\" &&\n (value.stack === undefined || typeof value.stack === \"string\") &&\n (value.code === undefined || typeof value.code === \"string\")\n );\n}\n\nfunction isRequestId(value: unknown): value is number {\n return Number.isSafeInteger(value) && (value as number) > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { BrowserCapability } from \"./types\";\n\nexport type BrowserErrorCode =\n | \"action_timeout\"\n | \"agent_action_busy\"\n | \"cancelled\"\n | \"connection_closed\"\n | \"connection_timeout\"\n | \"human_control_conflict\"\n | \"human_controlled\"\n | \"invalid_state\"\n | \"lifecycle_timeout\"\n | \"navigation_blocked\"\n | \"not_ready\"\n | \"readiness_timeout\"\n | \"runtime_destroyed\"\n | \"startup_failed\"\n | \"tool_failed\"\n | \"transport_failure\";\n\nexport type BrowserErrorRecovery = \"none\" | \"retry\" | \"reconnect\" | \"restart\" | \"recreate\";\n\nexport type BrowserErrorOptions = ErrorOptions &\n Readonly<{\n retryable?: boolean;\n recovery?: BrowserErrorRecovery;\n capability?: BrowserCapability;\n phase?: string;\n }>;\n\nconst defaults: Record<\n BrowserErrorCode,\n Readonly<{ retryable: boolean; recovery: BrowserErrorRecovery }>\n> = {\n action_timeout: { retryable: true, recovery: \"retry\" },\n agent_action_busy: { retryable: true, recovery: \"retry\" },\n cancelled: { retryable: true, recovery: \"retry\" },\n connection_closed: { retryable: true, recovery: \"reconnect\" },\n connection_timeout: { retryable: true, recovery: \"reconnect\" },\n human_control_conflict: { retryable: true, recovery: \"retry\" },\n human_controlled: { retryable: true, recovery: \"retry\" },\n invalid_state: { retryable: false, recovery: \"none\" },\n lifecycle_timeout: { retryable: true, recovery: \"retry\" },\n navigation_blocked: { retryable: false, recovery: \"none\" },\n not_ready: { retryable: true, recovery: \"retry\" },\n readiness_timeout: { retryable: true, recovery: \"retry\" },\n runtime_destroyed: { retryable: false, recovery: \"recreate\" },\n startup_failed: { retryable: true, recovery: \"recreate\" },\n tool_failed: { retryable: true, recovery: \"retry\" },\n transport_failure: { retryable: true, recovery: \"reconnect\" },\n};\n\nexport class BrowserError extends Error {\n readonly retryable: boolean;\n readonly recovery: BrowserErrorRecovery;\n readonly capability: BrowserCapability | undefined;\n readonly phase: string | undefined;\n\n constructor(\n message: string,\n readonly code: BrowserErrorCode,\n options: BrowserErrorOptions = {},\n ) {\n super(message, options);\n this.name = \"BrowserError\";\n this.retryable = options.retryable ?? defaults[code].retryable;\n this.recovery = options.recovery ?? defaults[code].recovery;\n this.capability = options.capability;\n this.phase = options.phase;\n }\n}\n\nexport function cancellationError(reason: unknown, phase: string): BrowserError {\n return new BrowserError(\"Browser operation was cancelled by the caller.\", \"cancelled\", {\n cause: reason,\n phase,\n });\n}\n","import { BrowserError, cancellationError } from \"./errors\";\n\ntype Task<T> = {\n abortSignal?: AbortSignal;\n abort?: () => void;\n controller: AbortController;\n operation: (abortSignal: AbortSignal) => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\ntype Resource = {\n running: boolean;\n ready: boolean;\n tasks: Task<unknown>[];\n};\n\nexport class ResourceScheduler {\n private readonly resources = new Map<string, Resource>();\n private readonly readyResources: string[] = [];\n private readonly activeTasks = new Set<Task<unknown>>();\n private readonly serial: boolean;\n private readonly maxConcurrentResources: number;\n private readonly maxQueuedActions: number;\n private activeResources = 0;\n private queuedActions = 0;\n private closedError: BrowserError | undefined;\n\n constructor(options: {\n mode: \"serial\" | \"per-tab\";\n maxConcurrentResources: number;\n maxQueuedActions: number;\n }) {\n this.serial = options.mode === \"serial\";\n this.maxConcurrentResources = options.maxConcurrentResources;\n this.maxQueuedActions = options.maxQueuedActions;\n }\n\n run<T>(\n resourceKey: string,\n abortSignal: AbortSignal | undefined,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n if (this.closedError !== undefined) return Promise.reject(this.closedError);\n if (abortSignal?.aborted) {\n return Promise.reject(abortReason(abortSignal, \"agent-action-queue\"));\n }\n if (this.queuedActions >= this.maxQueuedActions) {\n return Promise.reject(\n new BrowserError(\"Browser action queue capacity was reached.\", \"agent_action_busy\", {\n phase: \"agent-action-queue\",\n }),\n );\n }\n\n const key = this.serial ? \"browser\" : resourceKey;\n let resource = this.resources.get(key);\n if (resource === undefined) {\n resource = { running: false, ready: false, tasks: [] };\n this.resources.set(key, resource);\n }\n\n return new Promise<T>((resolve, reject) => {\n const task: Task<T> = {\n controller: new AbortController(),\n operation,\n resolve,\n reject,\n ...(abortSignal === undefined ? {} : { abortSignal }),\n };\n if (abortSignal !== undefined) {\n task.abort = () => {\n const current = this.resources.get(key);\n const index = current?.tasks.indexOf(task as Task<unknown>) ?? -1;\n if (index === -1) return;\n current?.tasks.splice(index, 1);\n this.queuedActions -= 1;\n abortSignal.removeEventListener(\"abort\", task.abort!);\n reject(abortReason(abortSignal, \"agent-action-queue\"));\n this.deleteIdleResource(key, current);\n };\n abortSignal.addEventListener(\"abort\", task.abort, { once: true });\n }\n resource.tasks.push(task as Task<unknown>);\n this.queuedActions += 1;\n this.markReady(key, resource);\n this.pump();\n });\n }\n\n close(error = new BrowserError(\"Browser connection is closed.\", \"connection_closed\")): void {\n if (this.closedError !== undefined) return;\n this.closedError = error;\n for (const task of this.activeTasks) task.controller.abort(error);\n for (const [key, resource] of this.resources) {\n for (const task of resource.tasks.splice(0)) {\n this.queuedActions -= 1;\n if (task.abort !== undefined) task.abortSignal?.removeEventListener(\"abort\", task.abort);\n task.reject(error);\n }\n resource.ready = false;\n if (!resource.running) this.resources.delete(key);\n }\n this.readyResources.length = 0;\n }\n\n private markReady(key: string, resource: Resource): void {\n if (resource.running || resource.ready || resource.tasks.length === 0) return;\n resource.ready = true;\n this.readyResources.push(key);\n }\n\n private pump(): void {\n while (\n this.closedError === undefined &&\n this.activeResources < this.maxConcurrentResources &&\n this.readyResources.length > 0\n ) {\n const key = this.readyResources.shift();\n if (key === undefined) return;\n const resource = this.resources.get(key);\n if (resource === undefined || resource.running || resource.tasks.length === 0) continue;\n resource.ready = false;\n const task = resource.tasks.shift();\n if (task === undefined) continue;\n this.queuedActions -= 1;\n if (task.abort !== undefined) task.abortSignal?.removeEventListener(\"abort\", task.abort);\n resource.running = true;\n this.activeResources += 1;\n this.activeTasks.add(task);\n const effectiveSignal =\n task.abortSignal === undefined\n ? task.controller.signal\n : AbortSignal.any([task.abortSignal, task.controller.signal]);\n let operation: Promise<unknown>;\n try {\n operation = task.operation(effectiveSignal);\n } catch (error) {\n operation = Promise.reject(error);\n }\n void operation.then(task.resolve, task.reject).finally(() => {\n this.activeTasks.delete(task);\n resource.running = false;\n this.activeResources -= 1;\n this.markReady(key, resource);\n this.deleteIdleResource(key, resource);\n this.pump();\n });\n }\n }\n\n private deleteIdleResource(key: string, resource: Resource | undefined): void {\n if (resource !== undefined && !resource.running && resource.tasks.length === 0) {\n this.resources.delete(key);\n }\n }\n}\n\ntype MutexWaiter = {\n resolve: (release: () => void) => void;\n reject: (error: unknown) => void;\n abortSignal?: AbortSignal;\n abort?: () => void;\n};\n\nexport class AsyncMutex {\n private readonly waiters: MutexWaiter[] = [];\n private locked = false;\n private closedError: BrowserError | undefined;\n\n async run<T>(abortSignal: AbortSignal | undefined, operation: () => Promise<T>): Promise<T> {\n const release = await this.acquire(abortSignal);\n try {\n return await operation();\n } finally {\n release();\n }\n }\n\n close(error = new BrowserError(\"Browser connection is closed.\", \"connection_closed\")): void {\n if (this.closedError !== undefined) return;\n this.closedError = error;\n for (const waiter of this.waiters.splice(0)) {\n if (waiter.abort !== undefined) {\n waiter.abortSignal?.removeEventListener(\"abort\", waiter.abort);\n }\n waiter.reject(error);\n }\n }\n\n private acquire(abortSignal: AbortSignal | undefined): Promise<() => void> {\n if (this.closedError !== undefined) return Promise.reject(this.closedError);\n if (abortSignal?.aborted) {\n return Promise.reject(abortReason(abortSignal, \"browser-resource-lock\"));\n }\n if (!this.locked) {\n this.locked = true;\n return Promise.resolve(this.releaseCallback());\n }\n return new Promise((resolve, reject) => {\n const waiter: MutexWaiter = {\n resolve,\n reject,\n ...(abortSignal === undefined ? {} : { abortSignal }),\n };\n if (abortSignal !== undefined) {\n waiter.abort = () => {\n const index = this.waiters.indexOf(waiter);\n if (index === -1) return;\n this.waiters.splice(index, 1);\n reject(abortReason(abortSignal, \"browser-resource-lock\"));\n };\n abortSignal.addEventListener(\"abort\", waiter.abort, { once: true });\n }\n this.waiters.push(waiter);\n });\n }\n\n private releaseCallback(): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n const waiter = this.waiters.shift();\n if (waiter === undefined) {\n this.locked = false;\n return;\n }\n if (waiter.abort !== undefined) {\n waiter.abortSignal?.removeEventListener(\"abort\", waiter.abort);\n }\n waiter.resolve(this.releaseCallback());\n };\n }\n}\n\nfunction abortReason(abortSignal: AbortSignal, phase: string): BrowserError {\n return abortSignal.reason instanceof BrowserError\n ? abortSignal.reason\n : cancellationError(abortSignal.reason, phase);\n}\n","import type { AutomationCommand, AutomationTabResult } from \"./automation-protocol\";\nimport {\n AutomationWorkerClient,\n type AutomationBackend,\n type AutomationWorkerFactory,\n} from \"./automation-client\";\nimport type { BrowserControlState } from \"./control\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport { AsyncMutex, ResourceScheduler } from \"./scheduler\";\nimport type {\n BrowserActionOptions,\n BrowserConnectOptions,\n BrowserLifecycleOptions,\n BrowserNavigationPolicy,\n BrowserTab,\n PlaywrightBrowserConnection,\n} from \"./types\";\n\nconst defaultConnectionTimeoutMs = 30_000;\nconst defaultActionTimeoutMs = 10_000;\nconst defaultMaxConcurrentTabs = 8;\nconst defaultMaxQueuedActions = 1_000;\nconst maxClosedTabTombstones = 10_000;\nconst maxTimerMs = 2_147_483_647;\n\nexport async function connectPlaywrightBrowser(options: {\n endpointUrl: string;\n control: BrowserControlState;\n timeoutMs?: number;\n abortSignal?: AbortSignal;\n scheduling?: BrowserConnectOptions[\"scheduling\"];\n workerFactory?: AutomationWorkerFactory;\n onClosed?: (connection: PlaywrightBrowserConnectionImpl) => void;\n}): Promise<PlaywrightBrowserConnectionImpl> {\n const timeoutMs = options.timeoutMs ?? defaultConnectionTimeoutMs;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n options.abortSignal?.throwIfAborted();\n const backend = await AutomationWorkerClient.connect({\n endpointUrl: options.endpointUrl,\n timeoutMs,\n ...(options.abortSignal === undefined ? {} : { abortSignal: options.abortSignal }),\n ...(options.workerFactory === undefined ? {} : { workerFactory: options.workerFactory }),\n });\n return new PlaywrightBrowserConnectionImpl({\n backend,\n control: options.control,\n scheduling: options.scheduling,\n ...(options.onClosed === undefined ? {} : { onClosed: options.onClosed }),\n });\n}\n\nexport class PlaywrightBrowserConnectionImpl implements PlaywrightBrowserConnection {\n private readonly backend: AutomationBackend;\n private readonly control: BrowserControlState;\n private readonly scheduler: ResourceScheduler;\n private readonly compatibilityMutex = new AsyncMutex();\n private readonly contextMutex = new AsyncMutex();\n private readonly closingTabs = new Set<string>();\n private readonly closedTabs = new Set<string>();\n private navigationPolicyKey: string | undefined;\n private navigationGuard: Promise<void> = Promise.resolve();\n private isClosed = false;\n private disconnectCompleted = false;\n private disconnectPromise: Promise<void> | undefined;\n private removeDisconnectedListener: (() => void) | undefined;\n private readonly onClosed: ((connection: PlaywrightBrowserConnectionImpl) => void) | undefined;\n\n constructor(options: {\n backend: AutomationBackend;\n control: BrowserControlState;\n scheduling?: BrowserConnectOptions[\"scheduling\"];\n onClosed?: (connection: PlaywrightBrowserConnectionImpl) => void;\n }) {\n this.backend = options.backend;\n this.control = options.control;\n this.onClosed = options.onClosed;\n const scheduling = normalizeScheduling(options.scheduling);\n this.scheduler = new ResourceScheduler(scheduling);\n this.removeDisconnectedListener = this.backend.onDisconnected(() => this.markClosed());\n }\n\n get closed(): boolean {\n return this.isClosed || this.backend.closed;\n }\n\n async listTabs(options: BrowserActionOptions = {}): Promise<readonly BrowserTab[]> {\n assertOptionsObject(options);\n return this.runContextAction(\n options.abortSignal,\n options.timeoutMs ?? defaultActionTimeoutMs,\n \"list-tabs\",\n (signal) =>\n this.backend.command<readonly BrowserTab[]>(\n { method: \"listTabs\", params: {} },\n { abortSignal: signal, cancelOperation: true, phase: \"list-tabs\" },\n ),\n );\n }\n\n setNavigationPolicy(policy: BrowserNavigationPolicy): void {\n this.assertOpen();\n const key = JSON.stringify(policy);\n if (this.navigationPolicyKey !== undefined) {\n if (this.navigationPolicyKey !== key) {\n throw new TypeError(\"Browser connection already has a different navigation policy.\");\n }\n return;\n }\n this.navigationPolicyKey = key;\n const installation = this.withActionTimeout(\n undefined,\n defaultActionTimeoutMs,\n \"navigation-policy\",\n (signal) =>\n this.scheduler.run(\"browser-context\", signal, (scheduledSignal) =>\n this.contextMutex.run(scheduledSignal, () =>\n this.control.runAgentAction(async () => {\n try {\n await this.backend.command<void>(\n { method: \"setNavigationPolicy\", params: { policy } },\n {\n abortSignal: scheduledSignal,\n cancelOperation: true,\n phase: \"navigation-policy\",\n },\n );\n } catch (error) {\n throw normalizeAutomationError(error, \"navigation-policy\");\n }\n }),\n ),\n ),\n );\n this.navigationGuard = installation.catch(async (error) => {\n let cleanupError: unknown;\n try {\n await this.disconnect();\n } catch (caught) {\n cleanupError = caught;\n }\n throw new BrowserError(\n \"Unable to install the browser navigation policy.\",\n \"transport_failure\",\n {\n cause: combineCleanupError(error, cleanupError),\n phase: \"navigation-policy\",\n },\n );\n });\n void this.navigationGuard.catch(() => undefined);\n }\n\n async openTab(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n ): Promise<AutomationTabResult> {\n return this.withActionTimeout(abortSignal, timeoutMs, \"open-tab\", (signal) =>\n this.compatibilityMutex.run(signal, () =>\n this.runContextActionScheduled(signal, \"open-tab\", (scheduledSignal) =>\n this.backend.command<AutomationTabResult>(\n { method: \"openTab\", params: {} },\n { abortSignal: scheduledSignal, cancelOperation: true, phase: \"open-tab\" },\n ),\n ),\n ),\n );\n }\n\n async selectTab(\n tabId: string,\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n ): Promise<AutomationTabResult> {\n this.assertTabUsable(tabId);\n return this.withActionTimeout(abortSignal, timeoutMs, \"select-tab\", (signal) =>\n this.compatibilityMutex.run(signal, () =>\n this.runContextActionScheduled(signal, \"select-tab\", (scheduledSignal) =>\n this.backend.command<AutomationTabResult>(\n { method: \"selectTab\", params: { tabId } },\n { abortSignal: scheduledSignal, cancelOperation: true, phase: \"select-tab\" },\n ),\n ),\n ),\n );\n }\n\n async closeTab(\n tabId: string,\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n ): Promise<Readonly<{ closedTabId: string; tabs: readonly BrowserTab[] }>> {\n this.assertTabUsable(tabId);\n this.closingTabs.add(tabId);\n let closed = false;\n try {\n const result = await this.withActionTimeout(abortSignal, timeoutMs, \"close-tab\", (signal) =>\n this.scheduler.run(`tab:${tabId}`, signal, (scheduledSignal) => {\n return this.contextMutex.run(scheduledSignal, () =>\n this.control.runAgentAction(async () => {\n try {\n return await this.backend.command<\n Readonly<{ closedTabId: string; tabs: readonly BrowserTab[] }>\n >(\n { method: \"closeTab\", params: { tabId } },\n { abortSignal: scheduledSignal, cancelOperation: true, phase: \"close-tab\" },\n );\n } catch (error) {\n throw normalizeAutomationError(error, \"close-tab\");\n }\n }),\n );\n }),\n );\n closed = true;\n return result;\n } finally {\n this.closingTabs.delete(tabId);\n if (closed && !this.isClosed) this.rememberClosedTab(tabId);\n }\n }\n\n async runTabCommand<T>(options: {\n tabId?: string | undefined;\n abortSignal?: AbortSignal | undefined;\n timeoutMs: number;\n phase: string;\n command: (tabId: string) => AutomationCommand;\n }): Promise<T> {\n return this.withActionTimeout(\n options.abortSignal,\n options.timeoutMs,\n options.phase,\n async (signal) => {\n if (options.tabId !== undefined) {\n this.assertTabUsable(options.tabId);\n return this.runScheduledTabCommand(options.tabId, options, signal);\n }\n return this.compatibilityMutex.run(signal, async () => {\n const tabId = await this.selectedTabId(signal);\n this.assertTabUsable(tabId);\n return this.runScheduledTabCommand(tabId, options, signal);\n });\n },\n );\n }\n\n async disconnect(options: BrowserLifecycleOptions = {}): Promise<void> {\n assertOptionsObject(options);\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (this.disconnectCompleted) return;\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n if (this.disconnectPromise !== undefined) {\n return waitForSharedDisconnect(this.disconnectPromise, options);\n }\n this.markClosed();\n const promise = this.backend.disconnect(options);\n this.disconnectPromise = promise;\n try {\n await promise;\n this.disconnectCompleted = true;\n } finally {\n if (this.disconnectPromise === promise) this.disconnectPromise = undefined;\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.disconnect();\n }\n\n private async runScheduledTabCommand<T>(\n tabId: string,\n options: {\n abortSignal?: AbortSignal | undefined;\n timeoutMs: number;\n phase: string;\n command: (tabId: string) => AutomationCommand;\n },\n abortSignal: AbortSignal,\n ): Promise<T> {\n return this.scheduler.run(`tab:${tabId}`, abortSignal, (scheduledSignal) =>\n this.control.runAgentAction(async () => {\n await waitForOwnedPromise(this.navigationGuard, scheduledSignal);\n try {\n return await this.backend.command<T>(options.command(tabId), {\n abortSignal: scheduledSignal,\n cancelOperation: true,\n phase: options.phase,\n });\n } catch (error) {\n throw normalizeAutomationError(error, options.phase);\n }\n }),\n );\n }\n\n private async selectedTabId(abortSignal: AbortSignal): Promise<string> {\n const tabs = await this.runContextActionScheduled(\n abortSignal,\n \"selected-tab-lookup\",\n (signal) =>\n this.backend.command<readonly BrowserTab[]>(\n { method: \"listTabs\", params: {} },\n { abortSignal: signal, cancelOperation: true, phase: \"selected-tab-lookup\" },\n ),\n );\n const selected = tabs.find((tab) => tab.selected) ?? tabs[0];\n if (selected === undefined) {\n throw new BrowserError(\"Browser has no open tabs.\", \"invalid_state\", {\n phase: \"selected-tab-lookup\",\n });\n }\n return selected.id;\n }\n\n private runContextAction<T>(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n phase: string,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n return this.withActionTimeout(abortSignal, timeoutMs, phase, (signal) =>\n this.runContextActionScheduled(signal, phase, operation),\n );\n }\n\n private runContextActionScheduled<T>(\n abortSignal: AbortSignal,\n phase: string,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n return this.scheduler.run(\"browser-context\", abortSignal, (scheduledSignal) =>\n this.contextMutex.run(scheduledSignal, () =>\n this.control.runAgentAction(async () => {\n this.assertOpen();\n await waitForOwnedPromise(this.navigationGuard, scheduledSignal);\n try {\n return await operation(scheduledSignal);\n } catch (error) {\n throw normalizeAutomationError(error, phase);\n }\n }),\n ),\n );\n }\n\n private async withActionTimeout<T>(\n abortSignal: AbortSignal | undefined,\n timeoutMs: number,\n phase: string,\n operation: (abortSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n if (abortSignal?.aborted) throw cancellationError(abortSignal.reason, phase);\n const timeoutController = new AbortController();\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\"Browser action timed out.\", \"action_timeout\", { phase }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const effectiveSignal =\n abortSignal === undefined\n ? timeoutController.signal\n : AbortSignal.any([abortSignal, timeoutController.signal]);\n try {\n const value = await operation(effectiveSignal);\n if (abortSignal?.aborted) throw cancellationError(abortSignal.reason, phase);\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n return value;\n } catch (error) {\n if (abortSignal?.aborted) throw cancellationError(abortSignal.reason, phase);\n if (timeoutController.signal.aborted) throw timeoutController.signal.reason;\n throw error;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private assertTabUsable(tabId: string): void {\n this.assertOpen();\n if (this.closingTabs.has(tabId) || this.closedTabs.has(tabId)) {\n throw new BrowserError(`Browser tab is closing or closed: ${tabId}`, \"invalid_state\", {\n phase: \"tab-lookup\",\n });\n }\n }\n\n private rememberClosedTab(tabId: string): void {\n this.closedTabs.add(tabId);\n if (this.closedTabs.size <= maxClosedTabTombstones) return;\n const oldest = this.closedTabs.values().next().value;\n if (oldest !== undefined) this.closedTabs.delete(oldest);\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new BrowserError(\"Browser connection is closed.\", \"connection_closed\");\n }\n }\n\n private markClosed(): void {\n if (this.isClosed) return;\n this.isClosed = true;\n const error = new BrowserError(\"Browser connection is closed.\", \"connection_closed\");\n this.scheduler.close(error);\n this.compatibilityMutex.close(error);\n this.contextMutex.close(error);\n this.closingTabs.clear();\n this.closedTabs.clear();\n this.removeDisconnectedListener?.();\n this.removeDisconnectedListener = undefined;\n this.onClosed?.(this);\n }\n}\n\nfunction normalizeScheduling(\n value: BrowserConnectOptions[\"scheduling\"],\n): ConstructorParameters<typeof ResourceScheduler>[0] {\n if (value === undefined) {\n return {\n mode: \"serial\",\n maxConcurrentResources: 1,\n maxQueuedActions: defaultMaxQueuedActions,\n };\n }\n assertOptionsObject(value);\n const maxQueuedActions = value.maxQueuedActions ?? defaultMaxQueuedActions;\n assertPositiveSafeInteger(maxQueuedActions, \"scheduling.maxQueuedActions\");\n if (value.mode === \"serial\") {\n return { mode: \"serial\", maxConcurrentResources: 1, maxQueuedActions };\n }\n if (value.mode !== \"per-tab\") throw new TypeError(\"Unsupported browser scheduling mode.\");\n const maxConcurrentResources = value.maxConcurrentTabs ?? defaultMaxConcurrentTabs;\n assertPositiveSafeInteger(maxConcurrentResources, \"scheduling.maxConcurrentTabs\");\n return { mode: \"per-tab\", maxConcurrentResources, maxQueuedActions };\n}\n\nfunction normalizeAutomationError(error: unknown, phase: string): BrowserError {\n if (error instanceof BrowserError) return error;\n if (error instanceof Error && /ERR_BLOCKED_BY_CLIENT|blockedbyclient/i.test(error.message)) {\n return new BrowserError(\"Browser navigation was rejected by policy.\", \"navigation_blocked\", {\n cause: error,\n phase,\n });\n }\n if (error instanceof Error && error.name === \"TimeoutError\") {\n return new BrowserError(\"Browser action timed out.\", \"action_timeout\", {\n cause: error,\n phase,\n });\n }\n if (\n error instanceof Error &&\n /tab does not exist|has no open tabs|target page.*closed|page has been closed/i.test(\n error.message,\n )\n ) {\n return new BrowserError(error.message, \"invalid_state\", { cause: error, phase });\n }\n if (\n error instanceof Error &&\n /browser.*closed|disconnected|connection.*closed|websocket.*closed/i.test(error.message)\n ) {\n return new BrowserError(\"Browser automation connection closed.\", \"connection_closed\", {\n cause: error,\n phase,\n });\n }\n return new BrowserError(\"Browser tool operation failed.\", \"tool_failed\", {\n cause: error,\n phase,\n });\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maxTimerMs) {\n throw new RangeError(`${name} must be a positive integer no greater than ${maxTimerMs}.`);\n }\n}\n\nfunction assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(\"options must be an object.\");\n }\n}\n\nfunction combineCleanupError(error: unknown, cleanupError: unknown): unknown {\n return cleanupError === undefined\n ? error\n : new AggregateError([error, cleanupError], \"Browser automation cleanup also failed.\");\n}\n\nasync function waitForOwnedPromise<T>(promise: Promise<T>, abortSignal: AbortSignal): Promise<T> {\n abortSignal.throwIfAborted();\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n abortSignal.removeEventListener(\"abort\", abort);\n callback();\n };\n const abort = () => finish(() => reject(abortSignal.reason));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n void promise.then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n}\n\nasync function waitForSharedDisconnect(\n promise: Promise<void>,\n options: BrowserLifecycleOptions,\n): Promise<void> {\n const timeoutMs = options.timeoutMs ?? 10_000;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n const controller = new AbortController();\n const timer = setTimeout(\n () =>\n controller.abort(\n new BrowserError(\"Browser disconnect timed out.\", \"connection_timeout\", {\n phase: \"disconnect\",\n }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const signal =\n options.abortSignal === undefined\n ? controller.signal\n : AbortSignal.any([options.abortSignal, controller.signal]);\n try {\n await waitForOwnedPromise(promise, signal);\n } catch (error) {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"disconnect\");\n }\n if (controller.signal.aborted) throw controller.signal.reason;\n throw error;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport type { AutomationBackend };\n\nexport function asConnection(\n connection: PlaywrightBrowserConnection,\n): PlaywrightBrowserConnectionImpl {\n if (!(connection instanceof PlaywrightBrowserConnectionImpl)) {\n throw new TypeError(\"connection must be created by DockerBrowser.connect().\");\n }\n return connection;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport type {\n AcquireBrowserHumanControlOptions,\n BrowserControl,\n BrowserControlAvailability,\n BrowserControlSnapshot,\n BrowserHumanControlLease,\n RenewBrowserHumanControlOptions,\n} from \"./types\";\n\ntype PendingAcquire = {\n resolve: () => void;\n reject: (error: unknown) => void;\n abortSignal?: AbortSignal;\n abort?: () => void;\n timer?: ReturnType<typeof setTimeout>;\n};\n\nconst defaultAcquireTimeoutMs = 30_000;\nconst maxTimerMs = 2_147_483_647;\n\nexport class BrowserControlState implements BrowserControl {\n private activeAgentActions = 0;\n private pendingAcquire: PendingAcquire | undefined;\n private activeLease: BrowserHumanControlLeaseImpl | undefined;\n private humanPending = false;\n private destroyed = false;\n private availability: BrowserControlAvailability = \"available\";\n\n snapshot(): BrowserControlSnapshot {\n const lease = this.activeLease;\n const state =\n lease !== undefined\n ? \"human\"\n : this.humanPending\n ? \"human-pending\"\n : this.activeAgentActions > 0\n ? \"agent-active\"\n : \"agent\";\n return Object.freeze({\n mode: lease === undefined ? \"agent\" : \"human\",\n state,\n availability: this.availability,\n activeAgentActions: this.activeAgentActions,\n humanPending: this.humanPending,\n ...(lease === undefined\n ? {}\n : {\n ownerId: lease.ownerId,\n expiresAt: lease.expiresAt,\n }),\n });\n }\n\n async acquireHumanControl(\n options: AcquireBrowserHumanControlOptions,\n ): Promise<BrowserHumanControlLease> {\n validateAcquireOptions(options);\n this.assertActive();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"human-control-acquire\");\n }\n if (this.activeLease !== undefined) {\n throw new BrowserError(\"Browser human control is already acquired.\", \"human_controlled\", {\n phase: \"human-control-acquire\",\n });\n }\n if (this.humanPending) {\n throw new BrowserError(\n \"Browser human control acquisition is already pending.\",\n \"human_control_conflict\",\n { phase: \"human-control-acquire\" },\n );\n }\n this.humanPending = true;\n try {\n if (this.activeAgentActions > 0) {\n await new Promise<void>((resolve, reject) => {\n const pending: PendingAcquire = { resolve, reject };\n if (options.abortSignal !== undefined) {\n pending.abortSignal = options.abortSignal;\n pending.abort = () => {\n if (this.pendingAcquire !== pending) return;\n this.clearPendingAcquire(pending);\n reject(cancellationError(options.abortSignal?.reason, \"human-control-acquire\"));\n };\n options.abortSignal.addEventListener(\"abort\", pending.abort, { once: true });\n }\n pending.timer = setTimeout(() => {\n if (this.pendingAcquire !== pending) return;\n this.clearPendingAcquire(pending);\n reject(\n new BrowserError(\n \"Timed out waiting to acquire browser human control.\",\n \"human_control_conflict\",\n { phase: \"human-control-acquire\" },\n ),\n );\n }, options.timeoutMs ?? defaultAcquireTimeoutMs);\n pending.timer.unref?.();\n this.pendingAcquire = pending;\n });\n }\n\n this.assertActive();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"human-control-acquire\");\n }\n const lease = new BrowserHumanControlLeaseImpl({\n owner: this,\n ownerId: options.ownerId,\n leaseTimeoutMs: options.leaseTimeoutMs,\n });\n this.activeLease = lease;\n return lease;\n } finally {\n this.humanPending = false;\n }\n }\n\n async runAgentAction<T>(operation: () => Promise<T>): Promise<T> {\n this.assertActive();\n if (this.activeLease !== undefined) {\n throw new BrowserError(\"Browser is controlled by a human viewer.\", \"human_controlled\", {\n phase: \"agent-action\",\n });\n }\n if (this.humanPending) {\n throw new BrowserError(\n \"Browser human control acquisition is pending.\",\n \"human_control_conflict\",\n { phase: \"agent-action\" },\n );\n }\n this.activeAgentActions += 1;\n try {\n return await operation();\n } finally {\n this.activeAgentActions -= 1;\n if (this.activeAgentActions === 0) this.resolvePendingAcquire();\n }\n }\n\n renewLease(\n lease: BrowserHumanControlLeaseImpl,\n options: RenewBrowserHumanControlOptions,\n ): BrowserControlSnapshot {\n if (this.activeLease !== lease) {\n throw new BrowserError(\"Browser human control lease is no longer active.\", \"invalid_state\");\n }\n assertPositiveSafeInteger(options.leaseTimeoutMs, \"leaseTimeoutMs\");\n lease.resetExpiration(options.leaseTimeoutMs);\n return this.snapshot();\n }\n\n releaseLease(lease: BrowserHumanControlLeaseImpl): void {\n if (this.activeLease !== lease) return;\n this.activeLease = undefined;\n lease.markReleased();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.activeLease?.release();\n if (this.pendingAcquire !== undefined) {\n const pending = this.pendingAcquire;\n this.pendingAcquire = undefined;\n this.clearPendingAcquire(pending);\n pending.reject(new BrowserError(\"Browser was destroyed.\", \"runtime_destroyed\"));\n }\n this.humanPending = false;\n this.availability = \"destroyed\";\n }\n\n setAvailability(availability: BrowserControlAvailability): void {\n if (this.destroyed) return;\n if (availability === \"destroyed\") {\n this.destroy();\n return;\n }\n this.availability = availability;\n if (availability !== \"disconnected\") return;\n this.activeLease?.release();\n if (this.pendingAcquire !== undefined) {\n const pending = this.pendingAcquire;\n this.clearPendingAcquire(pending);\n pending.reject(\n new BrowserError(\"Browser runtime is disconnected.\", \"connection_closed\", {\n phase: \"human-control-acquire\",\n }),\n );\n }\n this.humanPending = false;\n }\n\n private assertActive(): void {\n if (this.destroyed) throw new BrowserError(\"Browser was destroyed.\", \"runtime_destroyed\");\n if (this.availability === \"disconnected\") {\n throw new BrowserError(\"Browser runtime is disconnected.\", \"connection_closed\");\n }\n }\n\n private resolvePendingAcquire(): void {\n const pending: PendingAcquire | undefined = this.pendingAcquire;\n if (pending === undefined) return;\n this.clearPendingAcquire(pending);\n pending.resolve();\n }\n\n private clearPendingAcquire(pending: PendingAcquire): void {\n if (this.pendingAcquire === pending) this.pendingAcquire = undefined;\n if (pending.timer !== undefined) clearTimeout(pending.timer);\n if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n }\n}\n\nclass BrowserHumanControlLeaseImpl implements BrowserHumanControlLease {\n readonly id = randomUUID();\n readonly ownerId: string;\n private readonly owner: BrowserControlState;\n private expiration = 0;\n private timer: ReturnType<typeof setTimeout> | undefined;\n private released = false;\n\n constructor(options: { owner: BrowserControlState; ownerId: string; leaseTimeoutMs: number }) {\n this.owner = options.owner;\n this.ownerId = options.ownerId;\n this.resetExpiration(options.leaseTimeoutMs);\n }\n\n get expiresAt(): string {\n return new Date(this.expiration).toISOString();\n }\n\n renew(options: RenewBrowserHumanControlOptions): BrowserControlSnapshot {\n if (this.released) {\n throw new BrowserError(\"Browser human control lease is no longer active.\", \"invalid_state\");\n }\n return this.owner.renewLease(this, options);\n }\n\n release(): void {\n this.owner.releaseLease(this);\n }\n\n markReleased(): void {\n if (this.released) return;\n this.released = true;\n if (this.timer !== undefined) clearTimeout(this.timer);\n this.timer = undefined;\n }\n\n resetExpiration(leaseTimeoutMs: number): void {\n if (this.timer !== undefined) clearTimeout(this.timer);\n this.expiration = Date.now() + leaseTimeoutMs;\n this.timer = setTimeout(() => this.release(), leaseTimeoutMs);\n this.timer.unref?.();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n this.release();\n }\n}\n\nfunction validateAcquireOptions(options: AcquireBrowserHumanControlOptions): void {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (typeof options.ownerId !== \"string\" || options.ownerId.length === 0) {\n throw new TypeError(\"ownerId must be a non-empty string.\");\n }\n assertPositiveSafeInteger(options.leaseTimeoutMs, \"leaseTimeoutMs\");\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maxTimerMs) {\n throw new RangeError(`${name} must be a positive integer no greater than ${maxTimerMs}.`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { BrowserError, cancellationError } from \"./errors\";\nimport type { BrowserLifecycleOptions } from \"./types\";\n\nexport const defaultLifecycleTimeoutMs = 120_000;\nconst maxTimerMs = 2_147_483_647;\n\nexport type BoundedSignal = {\n signal: AbortSignal;\n timedOut: () => boolean;\n throwIfAborted: () => void;\n normalize: (\n error: unknown,\n message: string,\n code: \"startup_failed\" | \"transport_failure\",\n ) => BrowserError;\n dispose: () => void;\n};\n\nexport function boundedSignal(\n options: BrowserLifecycleOptions,\n defaultTimeoutMs: number,\n phase: string,\n): BoundedSignal {\n const timeoutMs = options.timeoutMs ?? defaultTimeoutMs;\n assertPositiveSafeInteger(timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) throw cancellationError(options.abortSignal.reason, phase);\n const controller = new AbortController();\n const timer = setTimeout(\n () =>\n controller.abort(\n new BrowserError(`Browser lifecycle operation timed out: ${phase}.`, \"lifecycle_timeout\", {\n phase,\n }),\n ),\n timeoutMs,\n );\n timer.unref?.();\n const signal =\n options.abortSignal === undefined\n ? controller.signal\n : AbortSignal.any([options.abortSignal, controller.signal]);\n return {\n signal,\n timedOut: () => controller.signal.aborted,\n throwIfAborted: () => {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, phase);\n }\n if (controller.signal.aborted) throw controller.signal.reason;\n },\n normalize: (error, message, code) => {\n if (options.abortSignal?.aborted) {\n return error instanceof AggregateError\n ? new BrowserError(\"Browser operation was cancelled by the caller.\", \"cancelled\", {\n cause: error,\n phase,\n })\n : cancellationError(options.abortSignal.reason, phase);\n }\n if (controller.signal.aborted) {\n const reason = controller.signal.reason as BrowserError;\n return error === reason\n ? reason\n : new BrowserError(reason.message, \"lifecycle_timeout\", { cause: error, phase });\n }\n if (error instanceof BrowserError) return error;\n return new BrowserError(message, code, { cause: error, phase });\n },\n dispose: () => clearTimeout(timer),\n };\n}\n\nexport function validateLifecycleOptions(options: BrowserLifecycleOptions, phase: string): void {\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, phase);\n }\n}\n\nexport async function waitForSharedLifecycle(\n promise: Promise<void>,\n options: BrowserLifecycleOptions,\n phase: string,\n): Promise<void> {\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, phase);\n try {\n await waitForPromise(promise, bounded.signal);\n bounded.throwIfAborted();\n } catch (error) {\n throw bounded.normalize(error, `Unable to wait for ${phase}.`, \"transport_failure\");\n } finally {\n bounded.dispose();\n }\n}\n\nexport function assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maxTimerMs) {\n throw new RangeError(`${name} must be a positive integer no greater than ${maxTimerMs}.`);\n }\n}\n\nexport function assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (!isRecord(value)) throw new TypeError(\"options must be an object.\");\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function waitForPromise<T>(promise: Promise<T>, abortSignal: AbortSignal): Promise<T> {\n abortSignal.throwIfAborted();\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n abortSignal.removeEventListener(\"abort\", abort);\n callback();\n };\n const abort = () => finish(() => reject(abortSignal.reason));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n void promise.then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n}\n","import type { DockerSandbox, DockerSandboxPublishedPort } from \"@anvia/sandbox\";\nimport { type connectPlaywrightBrowser } from \"./connection\";\nimport type { BrowserControlState } from \"./control\";\nimport { BrowserError } from \"./errors\";\nimport type { BrowserCapability } from \"./types\";\n\nexport const cdpPort = 9222;\nexport const noVncPort = 6080;\nexport const browserCapabilities = [\"runtime\", \"browser\", \"automation\", \"desktop\"] as const;\n\nconst automationProbeAttemptTimeoutMs = 5_000;\n\nexport async function probeBrowserCapability(options: {\n capability: BrowserCapability;\n sandbox: DockerSandbox;\n control: BrowserControlState;\n connectBrowser: typeof connectPlaywrightBrowser;\n abortSignal: AbortSignal;\n deadline: number;\n}): Promise<void> {\n const { capability, sandbox, abortSignal, deadline } = options;\n switch (capability) {\n case \"runtime\":\n if (sandbox.state !== \"running\") {\n throw new BrowserError(`Browser is not running: ${sandbox.state}`, \"invalid_state\");\n }\n return;\n case \"browser\":\n await sandbox.runtime.waitForPort({\n containerPort: cdpPort,\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n await assertCdpHttpReady(`${endpointFor(sandbox, cdpPort)}/json/version`, abortSignal);\n return;\n case \"desktop\":\n await sandbox.runtime.waitForPort({\n containerPort: noVncPort,\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n await assertHttpReady(`${endpointFor(sandbox, noVncPort)}/vnc.html`, abortSignal);\n return;\n case \"automation\": {\n await sandbox.runtime.waitForPort({\n containerPort: cdpPort,\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n await assertCdpHttpReady(`${endpointFor(sandbox, cdpPort)}/json/version`, abortSignal);\n let lastProbeFailure: unknown;\n for (let attempt = 0; ; attempt += 1) {\n abortSignal.throwIfAborted();\n try {\n const connection = await options.connectBrowser({\n endpointUrl: endpointFor(sandbox, cdpPort),\n control: options.control,\n timeoutMs: Math.min(automationProbeAttemptTimeoutMs, remainingTime(deadline)),\n abortSignal,\n });\n try {\n if (connection.closed) {\n throw new Error(\"CDP connection closed during initialization.\");\n }\n } finally {\n await connection.disconnect({\n timeoutMs: remainingTime(deadline),\n abortSignal,\n });\n }\n abortSignal.throwIfAborted();\n return;\n } catch (error) {\n if (abortSignal.aborted) throw lastProbeFailure ?? error;\n lastProbeFailure = error;\n try {\n await waitForRetry(abortSignal, Math.min(500, 50 * 2 ** Math.min(attempt, 3)));\n } catch (retryError) {\n if (abortSignal.aborted) throw lastProbeFailure;\n throw retryError;\n }\n }\n }\n }\n }\n}\n\nexport function endpointFor(sandbox: DockerSandbox, containerPort: number): string {\n const published = publishedPort(sandbox, containerPort);\n return `http://${hostForUrl(published.host)}:${published.hostPort}`;\n}\n\nexport function normalizeReadinessError(\n error: unknown,\n capability: BrowserCapability,\n state: { callerAborted: boolean; timedOut: boolean },\n): BrowserError {\n if (state.callerAborted) {\n return new BrowserError(\"Browser readiness was cancelled by the caller.\", \"cancelled\", {\n cause: error,\n capability,\n phase: \"readiness\",\n });\n }\n if (state.timedOut) {\n if (error instanceof BrowserError && error.code === \"transport_failure\") {\n return new BrowserError(error.message, error.code, {\n cause: error,\n capability,\n phase: \"readiness\",\n recovery: error.recovery,\n retryable: error.retryable,\n });\n }\n return new BrowserError(\n `Browser ${capability} capability did not become ready before the timeout.`,\n \"readiness_timeout\",\n { cause: error, capability, phase: \"readiness\" },\n );\n }\n if (\n error instanceof BrowserError &&\n (error.code === \"connection_closed\" || error.code === \"runtime_destroyed\")\n ) {\n return error;\n }\n return new BrowserError(`Browser ${capability} capability is not ready.`, \"not_ready\", {\n cause: error,\n capability,\n phase: \"readiness\",\n });\n}\n\nasync function assertCdpHttpReady(url: string, abortSignal: AbortSignal): Promise<void> {\n await assertHttpReady(url, abortSignal, async (response) => {\n const value: unknown = await response.json();\n if (\n !isRecord(value) ||\n typeof value.webSocketDebuggerUrl !== \"string\" ||\n !value.webSocketDebuggerUrl.startsWith(\"ws\")\n ) {\n throw new Error(\"CDP version endpoint did not expose a WebSocket debugger URL.\");\n }\n });\n}\n\nasync function assertHttpReady(\n url: string,\n abortSignal: AbortSignal,\n verify?: (response: Response) => Promise<void>,\n): Promise<void> {\n while (true) {\n abortSignal.throwIfAborted();\n try {\n const response = await fetch(url, { signal: abortSignal, redirect: \"error\" });\n try {\n if (response.ok) {\n await verify?.(response);\n return;\n }\n } finally {\n await response.body?.cancel().catch(() => undefined);\n }\n } catch (error) {\n if (abortSignal.aborted) throw abortSignal.reason ?? error;\n }\n await waitForRetry(abortSignal);\n }\n}\n\nasync function waitForRetry(abortSignal: AbortSignal, delayMs = 50): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => finish(), delayMs);\n timer.unref?.();\n const abort = () => finish(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n function finish(error?: unknown): void {\n clearTimeout(timer);\n abortSignal.removeEventListener(\"abort\", abort);\n if (error === undefined) resolve();\n else reject(error);\n }\n });\n}\n\nfunction remainingTime(deadline: number): number {\n return Math.max(1, deadline - Date.now());\n}\n\nfunction publishedPort(sandbox: DockerSandbox, containerPort: number): DockerSandboxPublishedPort {\n const port = sandbox.runtime.publishedPorts.find(\n (candidate) => candidate.containerPort === containerPort && candidate.protocol === \"tcp\",\n );\n if (port === undefined) {\n throw new BrowserError(`Browser port is not published: ${containerPort}`, \"invalid_state\");\n }\n return port;\n}\n\nfunction hostForUrl(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type {\n DockerSandbox,\n DockerSandboxInspectionOptions,\n DockerSandboxInspector,\n DockerSandboxState,\n} from \"@anvia/sandbox\";\nimport { connectPlaywrightBrowser, type PlaywrightBrowserConnectionImpl } from \"./connection\";\nimport { BrowserControlState } from \"./control\";\nimport { BrowserError, cancellationError } from \"./errors\";\nimport {\n assertOptionsObject,\n assertPositiveSafeInteger,\n boundedSignal,\n defaultLifecycleTimeoutMs,\n validateLifecycleOptions,\n waitForSharedLifecycle,\n} from \"./lifecycle\";\nimport {\n browserCapabilities,\n cdpPort,\n endpointFor,\n normalizeReadinessError,\n noVncPort,\n probeBrowserCapability,\n} from \"./readiness\";\nimport type {\n BrowserCapability,\n BrowserCapabilitySnapshot,\n BrowserConnectOptions,\n BrowserDesktopEndpoint,\n BrowserLifecycleOptions,\n BrowserReadinessSnapshot,\n BrowserWaitUntilReadyOptions,\n DockerBrowser,\n PlaywrightBrowserConnection,\n} from \"./types\";\n\nconst defaultConnectTimeoutMs = 30_000;\nconst capabilities = browserCapabilities;\n\ntype OwnedOperation = {\n controller: AbortController;\n promise: Promise<unknown>;\n};\n\ntype HandleState = \"active\" | \"stopping\" | \"stopped\" | \"destroying\" | \"destroyed\" | \"error\";\n\nexport class DockerBrowserHandle implements DockerBrowser {\n readonly id: string;\n readonly sandbox: DockerSandbox;\n readonly desktop: BrowserDesktopEndpoint;\n private readonly control = new BrowserControlState();\n private readonly connections = new Set<PlaywrightBrowserConnectionImpl>();\n private readonly ownedOperations = new Set<OwnedOperation>();\n private readonly capabilityStates = new Map<BrowserCapability, BrowserCapabilitySnapshot>(\n capabilities.map((capability) => [capability, Object.freeze({ capability, state: \"unknown\" })]),\n );\n private readonly capabilityGenerations = new Map<BrowserCapability, number>(\n capabilities.map((capability) => [capability, 0]),\n );\n private handleState: HandleState = \"active\";\n private connectionPending = false;\n private stopPromise: Promise<void> | undefined;\n private destroyPromise: Promise<void> | undefined;\n private readonly connectBrowser: typeof connectPlaywrightBrowser;\n\n constructor(\n sandbox: DockerSandbox,\n connectBrowser: typeof connectPlaywrightBrowser = connectPlaywrightBrowser,\n ) {\n this.sandbox = sandbox;\n this.id = sandbox.id;\n this.connectBrowser = connectBrowser;\n this.desktop = Object.freeze({\n protocol: \"novnc\",\n containerPort: noVncPort,\n control: this.control,\n });\n }\n\n get state(): DockerSandboxState {\n return this.handleState === \"active\" ? this.sandbox.state : this.handleState;\n }\n\n inspector(options: DockerSandboxInspectionOptions): DockerSandboxInspector {\n return this.sandbox.inspector(options);\n }\n\n readiness(): BrowserReadinessSnapshot {\n const terminal =\n this.handleState === \"destroyed\" || this.handleState === \"destroying\"\n ? \"destroyed\"\n : this.handleState === \"stopped\" || this.handleState === \"stopping\"\n ? \"stopped\"\n : undefined;\n const entries = Object.fromEntries(\n capabilities.map((capability) => {\n const current = this.capabilityStates.get(capability)!;\n return [\n capability,\n terminal === undefined\n ? current\n : Object.freeze({ capability, state: terminal } satisfies BrowserCapabilitySnapshot),\n ];\n }),\n ) as Record<BrowserCapability, BrowserCapabilitySnapshot>;\n const values = Object.values(entries);\n const state =\n this.handleState === \"error\"\n ? \"failed\"\n : (terminal ??\n (values.some((value) => value.state === \"checking\")\n ? \"checking\"\n : values.every((value) => value.state === \"unknown\")\n ? \"unknown\"\n : values.every((value) => value.state === \"ready\")\n ? \"ready\"\n : values.some((value) => value.state === \"failed\")\n ? values.some((value) => value.state === \"ready\")\n ? \"degraded\"\n : \"failed\"\n : \"partial\"));\n return Object.freeze({ state, capabilities: Object.freeze(entries) });\n }\n\n async waitForCapabilities(\n options: BrowserWaitUntilReadyOptions,\n ): Promise<BrowserReadinessSnapshot> {\n validateReadinessOptions(options);\n this.assertRunning();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"readiness\");\n }\n const requested = options.capabilities ?? capabilities;\n const ownedController = new AbortController();\n const timeoutController = new AbortController();\n const deadline = Date.now() + options.timeoutMs;\n const timer = setTimeout(\n () =>\n timeoutController.abort(\n new BrowserError(\"Browser readiness timed out.\", \"readiness_timeout\", {\n phase: \"readiness\",\n }),\n ),\n options.timeoutMs,\n );\n timer.unref?.();\n const signals = [ownedController.signal, timeoutController.signal];\n if (options.abortSignal !== undefined) signals.push(options.abortSignal);\n const abortSignal = AbortSignal.any(signals);\n const previous = new Map(\n requested.map((capability) => [capability, this.capabilityStates.get(capability)!]),\n );\n const generations = new Map(\n requested.map((capability) => {\n const generation = (this.capabilityGenerations.get(capability) ?? 0) + 1;\n this.capabilityGenerations.set(capability, generation);\n return [capability, generation] as const;\n }),\n );\n for (const capability of requested) this.setCapability(capability, \"checking\");\n\n const promise = Promise.allSettled(\n requested.map(async (capability) => {\n try {\n await probeBrowserCapability({\n capability,\n sandbox: this.sandbox,\n control: this.control,\n connectBrowser: this.connectBrowser,\n abortSignal,\n deadline,\n });\n abortSignal.throwIfAborted();\n if (this.capabilityGenerations.get(capability) === generations.get(capability)) {\n this.setCapability(capability, \"ready\");\n }\n } catch (error) {\n const normalized = normalizeReadinessError(error, capability, {\n callerAborted: options.abortSignal?.aborted === true,\n timedOut: timeoutController.signal.aborted,\n });\n if (this.capabilityGenerations.get(capability) === generations.get(capability)) {\n if (options.abortSignal?.aborted) {\n this.capabilityStates.set(capability, previous.get(capability)!);\n } else {\n this.setCapability(capability, \"failed\", normalized);\n }\n }\n throw normalized;\n }\n }),\n );\n const owned = { controller: ownedController, promise };\n this.ownedOperations.add(owned);\n try {\n const results = await promise;\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"readiness\");\n }\n const failures = results.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n );\n this.updateControlAvailability();\n if (failures.length > 0) throw failures[0]!.reason;\n return this.readiness();\n } finally {\n clearTimeout(timer);\n this.ownedOperations.delete(owned);\n }\n }\n\n async waitUntilReady(options: BrowserWaitUntilReadyOptions): Promise<void> {\n await this.waitForCapabilities(options);\n }\n\n async connect(options: BrowserConnectOptions = {}): Promise<PlaywrightBrowserConnection> {\n assertOptionsObject(options);\n if (options.timeoutMs !== undefined) assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n this.assertRunning();\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n if (this.connectionPending || this.connections.size > 0) {\n throw new BrowserError(\n \"Browser already has an active or pending automation connection.\",\n \"agent_action_busy\",\n { phase: \"connect\" },\n );\n }\n this.connectionPending = true;\n const controller = new AbortController();\n const signals = [controller.signal];\n if (options.abortSignal !== undefined) signals.push(options.abortSignal);\n const abortSignal = AbortSignal.any(signals);\n let owned!: OwnedOperation;\n const promise = (async () => {\n // Register the operation before endpoint resolution or the connection factory can fail.\n await Promise.resolve();\n try {\n abortSignal.throwIfAborted();\n const connection = await this.connectBrowser({\n endpointUrl: endpointFor(this.sandbox, cdpPort),\n control: this.control,\n timeoutMs: options.timeoutMs ?? defaultConnectTimeoutMs,\n abortSignal,\n scheduling: options.scheduling,\n onClosed: (closedConnection) => this.connections.delete(closedConnection),\n });\n this.connections.add(connection);\n const disconnectedDuringInitialization = connection.closed;\n if (\n disconnectedDuringInitialization ||\n this.handleState !== \"active\" ||\n this.state !== \"running\"\n ) {\n this.connections.delete(connection);\n let cleanupError: unknown;\n try {\n await connection.disconnect();\n } catch (caught) {\n cleanupError = caught;\n }\n if (\n disconnectedDuringInitialization &&\n this.handleState === \"active\" &&\n this.state === \"running\"\n ) {\n throw new BrowserError(\n \"Browser disconnected while automation was initializing.\",\n \"connection_closed\",\n {\n ...(cleanupError === undefined ? {} : { cause: cleanupError }),\n phase: \"connect\",\n },\n );\n }\n const lifecycleError = this.lifecycleError(\n \"Browser stopped while the connection was initializing.\",\n );\n throw cleanupError === undefined\n ? lifecycleError\n : new BrowserError(lifecycleError.message, lifecycleError.code, {\n cause: cleanupError,\n ...(lifecycleError.phase === undefined ? {} : { phase: lifecycleError.phase }),\n });\n }\n return connection;\n } catch (error) {\n if (options.abortSignal?.aborted) {\n throw cancellationError(options.abortSignal.reason, \"connect\");\n }\n if (controller.signal.aborted) throw controller.signal.reason;\n if (error instanceof BrowserError) throw error;\n throw new BrowserError(\"Unable to connect to Chromium over CDP.\", \"transport_failure\", {\n cause: error,\n phase: \"connect\",\n });\n } finally {\n this.connectionPending = false;\n this.ownedOperations.delete(owned);\n }\n })();\n owned = { controller, promise };\n this.ownedOperations.add(owned);\n return promise;\n }\n\n async stop(options: BrowserLifecycleOptions = {}): Promise<void> {\n assertOptionsObject(options);\n if (this.handleState === \"stopped\") return;\n if (this.handleState === \"destroyed\" || this.handleState === \"destroying\") {\n throw new BrowserError(\"Browser runtime is destroyed.\", \"runtime_destroyed\");\n }\n validateLifecycleOptions(options, \"stop-browser\");\n if (this.stopPromise !== undefined) {\n return waitForSharedLifecycle(this.stopPromise, options, \"stop-browser\");\n }\n this.handleState = \"stopping\";\n this.control.setAvailability(\"disconnected\");\n const promise = this.performStop(options);\n this.stopPromise = promise;\n try {\n await promise;\n } finally {\n if (this.stopPromise === promise) this.stopPromise = undefined;\n }\n }\n\n async destroy(options: BrowserLifecycleOptions = {}): Promise<void> {\n assertOptionsObject(options);\n if (this.handleState === \"destroyed\") return;\n validateLifecycleOptions(options, \"destroy-browser\");\n if (this.destroyPromise === undefined) {\n this.handleState = \"destroying\";\n this.control.destroy();\n const activeStop = this.stopPromise;\n const promise = (async () => {\n if (activeStop !== undefined) await activeStop.catch(() => undefined);\n await this.performDestroy();\n })();\n this.destroyPromise = promise;\n void promise.then(\n () => {\n if (this.destroyPromise === promise) this.destroyPromise = undefined;\n },\n () => {\n if (this.destroyPromise === promise) this.destroyPromise = undefined;\n },\n );\n }\n return waitForSharedLifecycle(this.destroyPromise, options, \"destroy-browser\");\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.destroy();\n }\n\n private async performStop(options: BrowserLifecycleOptions): Promise<void> {\n const bounded = boundedSignal(options, defaultLifecycleTimeoutMs, \"stop-browser\");\n try {\n await this.abortOwnedOperations(\n new BrowserError(\"Browser runtime is stopping.\", \"connection_closed\", {\n phase: \"stop-browser\",\n }),\n );\n const disconnectFailures = await this.disconnectAll({ abortSignal: bounded.signal });\n await this.sandbox.stop({ abortSignal: bounded.signal });\n if (this.handleState === \"stopping\") this.handleState = \"stopped\";\n bounded.throwIfAborted();\n if (disconnectFailures.length > 0) {\n throw new BrowserError(\n \"Browser stopped, but one or more automation workers failed to disconnect.\",\n \"transport_failure\",\n {\n cause: new AggregateError(disconnectFailures, \"Automation worker cleanup failed.\"),\n phase: \"stop-browser\",\n recovery: \"restart\",\n },\n );\n }\n } catch (error) {\n if (this.handleState === \"stopping\") this.handleState = \"error\";\n throw bounded.normalize(error, \"Unable to stop browser runtime.\", \"transport_failure\");\n } finally {\n bounded.dispose();\n }\n }\n\n private async performDestroy(): Promise<void> {\n try {\n await this.abortOwnedOperations(\n new BrowserError(\"Browser runtime was destroyed.\", \"runtime_destroyed\", {\n phase: \"destroy-browser\",\n }),\n );\n const disconnectFailures = await this.disconnectAll({});\n await this.sandbox.destroy();\n this.handleState = \"destroyed\";\n if (disconnectFailures.length > 0) {\n throw new BrowserError(\n \"Browser was destroyed, but one or more automation workers failed to disconnect.\",\n \"transport_failure\",\n {\n cause: new AggregateError(disconnectFailures, \"Automation worker cleanup failed.\"),\n phase: \"destroy-browser\",\n retryable: false,\n recovery: \"none\",\n },\n );\n }\n } catch (error) {\n if (this.handleState !== \"destroyed\") this.handleState = \"error\";\n if (error instanceof BrowserError) throw error;\n throw new BrowserError(\"Unable to destroy browser runtime.\", \"transport_failure\", {\n cause: error,\n phase: \"destroy-browser\",\n recovery: \"retry\",\n });\n }\n }\n\n private assertRunning(): void {\n if (this.handleState === \"destroyed\" || this.handleState === \"destroying\") {\n throw new BrowserError(\"Browser runtime is destroyed.\", \"runtime_destroyed\");\n }\n if (this.handleState !== \"active\" || this.state !== \"running\") {\n throw new BrowserError(`Browser is not running: ${this.state}`, \"invalid_state\");\n }\n }\n\n private lifecycleError(message: string): BrowserError {\n return this.handleState === \"destroying\" || this.handleState === \"destroyed\"\n ? new BrowserError(message, \"runtime_destroyed\")\n : new BrowserError(message, \"connection_closed\", { phase: \"connect\" });\n }\n\n private async abortOwnedOperations(error: BrowserError): Promise<void> {\n const operations = [...this.ownedOperations];\n for (const operation of operations) operation.controller.abort(error);\n await Promise.allSettled(operations.map((operation) => operation.promise));\n }\n\n private async disconnectAll(options: BrowserLifecycleOptions): Promise<readonly unknown[]> {\n const connections = [...this.connections];\n this.connections.clear();\n const results = await Promise.allSettled(\n connections.map((connection) => connection.disconnect(options)),\n );\n return results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n }\n\n private setCapability(\n capability: BrowserCapability,\n state: BrowserCapabilitySnapshot[\"state\"],\n error?: BrowserError,\n ): void {\n this.capabilityStates.set(\n capability,\n Object.freeze({\n capability,\n state,\n checkedAt: new Date().toISOString(),\n ...(error === undefined ? {} : { error }),\n }),\n );\n }\n\n private updateControlAvailability(): void {\n if (this.handleState !== \"active\" || this.state !== \"running\") {\n this.control.setAvailability(\"disconnected\");\n return;\n }\n const failed = capabilities.some(\n (capability) => this.capabilityStates.get(capability)?.state === \"failed\",\n );\n this.control.setAvailability(failed ? \"degraded\" : \"available\");\n }\n}\n\nfunction validateReadinessOptions(options: BrowserWaitUntilReadyOptions): void {\n assertOptionsObject(options);\n assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n if (options.capabilities === undefined) return;\n if (!Array.isArray(options.capabilities) || options.capabilities.length === 0) {\n throw new TypeError(\"capabilities must be a non-empty array.\");\n }\n const unique = new Set<BrowserCapability>();\n for (const capability of options.capabilities) {\n if (!capabilities.includes(capability)) {\n throw new TypeError(`Unsupported browser capability: ${capability}`);\n }\n if (unique.has(capability)) throw new TypeError(`Duplicate browser capability: ${capability}`);\n unique.add(capability);\n }\n}\n","import { type AnyTool, createTool, ToolOutput } from \"@anvia/core/tool\";\nimport { z } from \"zod\";\nimport type {\n AutomationScreenshotResult,\n AutomationSnapshotResult,\n AutomationTabResult,\n} from \"./automation-protocol\";\nimport { asConnection } from \"./connection\";\nimport { BrowserError } from \"./errors\";\nimport type { BrowserNavigationPolicy, BrowserToolName, CreateBrowserToolsOptions } from \"./types\";\n\nconst targetSchema = z.discriminatedUnion(\"by\", [\n z.object({\n by: z.literal(\"role\"),\n role: z.string().min(1),\n name: z.string().optional(),\n exact: z.boolean().optional(),\n }),\n z.object({ by: z.literal(\"text\"), text: z.string().min(1), exact: z.boolean().optional() }),\n z.object({ by: z.literal(\"label\"), label: z.string().min(1), exact: z.boolean().optional() }),\n z.object({\n by: z.literal(\"placeholder\"),\n placeholder: z.string().min(1),\n exact: z.boolean().optional(),\n }),\n z.object({ by: z.literal(\"test-id\"), testId: z.string().min(1) }),\n z.object({ by: z.literal(\"css\"), selector: z.string().min(1) }),\n]);\n\nconst noInput = z.object({});\nconst tabInput = z.object({ tabId: z.string().uuid() });\nconst explicitTab = { tabId: z.string().uuid().optional() };\nconst navigateInput = z.object({\n ...explicitTab,\n url: z.url(),\n waitUntil: z.enum([\"commit\", \"domcontentloaded\", \"load\", \"networkidle\"]).optional(),\n});\nconst clickInput = z.object({ ...explicitTab, target: targetSchema });\nconst typeInput = z.object({ ...explicitTab, target: targetSchema, text: z.string() });\nconst pressKeyInput = z.object({ ...explicitTab, key: z.string().min(1).max(100) });\nconst screenshotInput = z.object(explicitTab);\nconst snapshotInput = z.object(explicitTab);\n\nconst defaultActionTimeoutMs = 10_000;\nconst defaultNavigationTimeoutMs = 30_000;\nconst defaultSnapshotMaxChars = 50_000;\nconst maxTimeoutMs = 300_000;\nconst maxSnapshotChars = 200_000;\n\nexport function createBrowserTools(options: CreateBrowserToolsOptions): readonly AnyTool[] {\n validateFactoryOptions(options);\n const connection = asConnection(options.connection);\n const policy = snapshotNavigationPolicy(options.navigation);\n connection.setNavigationPolicy(policy);\n const limits = {\n actionTimeoutMs: options.limits?.actionTimeoutMs ?? defaultActionTimeoutMs,\n navigationTimeoutMs: options.limits?.navigationTimeoutMs ?? defaultNavigationTimeoutMs,\n snapshotMaxChars: options.limits?.snapshotMaxChars ?? defaultSnapshotMaxChars,\n };\n const tools = options.tools.map((name) => {\n switch (name) {\n case \"browser_list_tabs\":\n return createListTabsTool(connection, limits.actionTimeoutMs);\n case \"browser_open_tab\":\n return createOpenTabTool(connection, limits.actionTimeoutMs);\n case \"browser_select_tab\":\n return createSelectTabTool(connection, limits.actionTimeoutMs);\n case \"browser_close_tab\":\n return createCloseTabTool(connection, limits.actionTimeoutMs);\n case \"browser_navigate\":\n return createNavigateTool(connection, policy, limits.navigationTimeoutMs);\n case \"browser_snapshot\":\n return createSnapshotTool(connection, limits.actionTimeoutMs, limits.snapshotMaxChars);\n case \"browser_click\":\n return createClickTool(connection, limits.actionTimeoutMs);\n case \"browser_type\":\n return createTypeTool(connection, limits.actionTimeoutMs);\n case \"browser_press_key\":\n return createPressKeyTool(connection, limits.actionTimeoutMs);\n case \"browser_screenshot\":\n return createScreenshotTool(connection, limits.actionTimeoutMs);\n default:\n return assertNever(name);\n }\n });\n return Object.freeze(tools);\n}\n\ntype Connection = ReturnType<typeof asConnection>;\n\nfunction createListTabsTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_list_tabs\",\n description: \"List Chromium tabs and identify the tab selected for subsequent browser tools.\",\n inputSchema: noInput,\n execute: async (_args, context) => ({\n tabs: await connection.listTabs({ abortSignal: context.abortSignal, timeoutMs }),\n }),\n });\n}\n\nfunction createOpenTabTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_open_tab\",\n description: \"Open and select a new blank Chromium tab.\",\n inputSchema: noInput,\n execute: async (_args, context) => connection.openTab(context.abortSignal, timeoutMs),\n });\n}\n\nfunction createSelectTabTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_select_tab\",\n description: \"Select an existing Chromium tab by its browser tab ID.\",\n inputSchema: tabInput,\n execute: async ({ tabId }, context) =>\n connection.selectTab(tabId, context.abortSignal, timeoutMs),\n });\n}\n\nfunction createCloseTabTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_close_tab\",\n description: \"Close an existing Chromium tab by its browser tab ID.\",\n inputSchema: tabInput,\n execute: async ({ tabId }, context) =>\n connection.closeTab(tabId, context.abortSignal, timeoutMs),\n });\n}\n\nfunction createNavigateTool(\n connection: Connection,\n policy: BrowserNavigationPolicy,\n timeoutMs: number,\n): AnyTool {\n return createTool({\n name: \"browser_navigate\",\n description:\n \"Navigate an explicit tab, or the selected tab in serial compatibility mode, to an allowed HTTP or HTTPS URL.\",\n inputSchema: navigateInput,\n execute: async ({ tabId, url, waitUntil }, context) => {\n assertNavigationAllowed(url, policy);\n const result = await connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"navigate\",\n command: (targetTabId) => ({\n method: \"navigate\",\n params: {\n tabId: targetTabId,\n url,\n waitUntil: waitUntil ?? \"load\",\n timeoutMs,\n },\n }),\n });\n assertNavigationAllowed(result.url, policy);\n return result;\n },\n });\n}\n\nfunction createSnapshotTool(connection: Connection, timeoutMs: number, maxChars: number): AnyTool {\n return createTool({\n name: \"browser_snapshot\",\n description:\n \"Inspect an explicit tab, or the selected tab in serial compatibility mode, using a bounded ARIA accessibility snapshot.\",\n inputSchema: snapshotInput,\n execute: async ({ tabId }, context) =>\n connection.runTabCommand<AutomationSnapshotResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"snapshot\",\n command: (targetTabId) => ({\n method: \"snapshot\",\n params: { tabId: targetTabId, timeoutMs, maxChars },\n }),\n }),\n });\n}\n\nfunction createClickTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_click\",\n description: \"Click one strictly matched element in an explicit tab or the selected tab.\",\n inputSchema: clickInput,\n execute: async ({ tabId, target }, context) =>\n connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"click\",\n command: (targetTabId) => ({\n method: \"click\",\n params: { tabId: targetTabId, target, timeoutMs },\n }),\n }),\n });\n}\n\nfunction createTypeTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_type\",\n description:\n \"Replace the value of one strictly matched editable element in an explicit or selected tab.\",\n inputSchema: typeInput,\n execute: async ({ tabId, target, text }, context) =>\n connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"type\",\n command: (targetTabId) => ({\n method: \"type\",\n params: { tabId: targetTabId, target, text, timeoutMs },\n }),\n }),\n });\n}\n\nfunction createPressKeyTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_press_key\",\n description:\n \"Press an explicit keyboard key or key combination in an explicit or selected tab.\",\n inputSchema: pressKeyInput,\n execute: async ({ tabId, key }, context) =>\n connection.runTabCommand<AutomationTabResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"press-key\",\n command: (targetTabId) => ({\n method: \"pressKey\",\n params: { tabId: targetTabId, key },\n }),\n }),\n });\n}\n\nfunction createScreenshotTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_screenshot\",\n description: \"Capture the visible viewport of an explicit or selected Chromium tab as PNG.\",\n inputSchema: screenshotInput,\n execute: async ({ tabId }, context) => {\n const result = await connection.runTabCommand<AutomationScreenshotResult>({\n tabId,\n abortSignal: context.abortSignal,\n timeoutMs,\n phase: \"screenshot\",\n command: (targetTabId) => ({\n method: \"screenshot\",\n params: { tabId: targetTabId, timeoutMs },\n }),\n });\n return ToolOutput.content([\n { type: \"text\", text: JSON.stringify(result.metadata) },\n {\n type: \"file\",\n data: { type: \"data\", data: result.pngBase64 },\n mediaType: \"image/png\",\n filename: \"browser-screenshot.png\",\n },\n ]);\n },\n });\n}\n\nfunction snapshotNavigationPolicy(policy: BrowserNavigationPolicy): BrowserNavigationPolicy {\n if (!isRecord(policy)) throw new TypeError(\"navigation must be an object.\");\n if (policy.mode === \"allow-all-http\") return Object.freeze({ mode: \"allow-all-http\" });\n if (policy.mode !== \"origins\" || !Array.isArray(policy.origins) || policy.origins.length === 0) {\n throw new TypeError(\n \"navigation must explicitly allow all HTTP URLs or a non-empty origin list.\",\n );\n }\n const origins = policy.origins.map((origin) => normalizeOrigin(origin));\n if (new Set(origins).size !== origins.length) {\n throw new TypeError(\"navigation.origins contains a duplicate origin.\");\n }\n return Object.freeze({ mode: \"origins\", origins: Object.freeze(origins) });\n}\n\nfunction normalizeOrigin(value: unknown): string {\n if (typeof value !== \"string\") throw new TypeError(\"navigation origin must be a string.\");\n const url = parseHttpUrl(value);\n if (value !== url.origin) {\n throw new TypeError(`navigation origin must not contain a path, query, or fragment: ${value}`);\n }\n return url.origin;\n}\n\nfunction assertNavigationAllowed(value: string, policy: BrowserNavigationPolicy): void {\n if (!isNavigationAllowed(value, policy)) {\n throw new BrowserError(`Browser navigation is blocked: ${value}`, \"navigation_blocked\");\n }\n}\n\nfunction isNavigationAllowed(value: string, policy: BrowserNavigationPolicy): boolean {\n let url: URL;\n try {\n url = parseHttpUrl(value);\n } catch {\n return false;\n }\n return policy.mode === \"allow-all-http\" || policy.origins.includes(url.origin);\n}\n\nfunction parseHttpUrl(value: string): URL {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new TypeError(\"Browser navigation only supports HTTP and HTTPS URLs.\");\n }\n if (url.username.length > 0 || url.password.length > 0) {\n throw new TypeError(\"Browser navigation URLs must not include credentials.\");\n }\n return url;\n}\n\nfunction validateFactoryOptions(options: CreateBrowserToolsOptions): void {\n if (!isRecord(options)) throw new TypeError(\"options must be an object.\");\n if (!Array.isArray(options.tools) || options.tools.length === 0) {\n throw new TypeError(\"tools must be a non-empty array.\");\n }\n const seen = new Set<BrowserToolName>();\n for (const name of options.tools) {\n if (!isToolName(name)) throw new TypeError(`Unsupported browser tool name: ${name}`);\n if (seen.has(name)) throw new TypeError(`tools contains a duplicate: ${name}`);\n seen.add(name);\n }\n snapshotNavigationPolicy(options.navigation);\n if (options.limits !== undefined && !isRecord(options.limits)) {\n throw new TypeError(\"limits must be an object.\");\n }\n assertOptionalBoundedInteger(options.limits?.actionTimeoutMs, \"actionTimeoutMs\", 1, maxTimeoutMs);\n assertOptionalBoundedInteger(\n options.limits?.navigationTimeoutMs,\n \"navigationTimeoutMs\",\n 1,\n maxTimeoutMs,\n );\n assertOptionalBoundedInteger(\n options.limits?.snapshotMaxChars,\n \"snapshotMaxChars\",\n 1,\n maxSnapshotChars,\n );\n}\n\nfunction assertOptionalBoundedInteger(\n value: number | undefined,\n name: string,\n min: number,\n max: number,\n): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < min || value > max)) {\n throw new RangeError(`${name} must be a safe integer between ${min} and ${max}.`);\n }\n}\n\nfunction isToolName(value: unknown): value is BrowserToolName {\n return (\n typeof value === \"string\" &&\n [\n \"browser_list_tabs\",\n \"browser_open_tab\",\n \"browser_select_tab\",\n \"browser_close_tab\",\n \"browser_navigate\",\n \"browser_snapshot\",\n \"browser_click\",\n \"browser_type\",\n \"browser_press_key\",\n \"browser_screenshot\",\n ].includes(value)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNever(value: never): never {\n throw new TypeError(`Unsupported browser tool: ${value}`);\n}\n"],"mappings":"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","names":["assertPositiveSafeInteger","maxTimerMs","assertPositiveSafeInteger","isRecord","maxTimerMs","assertPositiveSafeInteger","assertOptionsObject","isRecord","isRecord","assertOptionsObject","assertPositiveSafeInteger","isRecord","assertOptionsObject","combineCleanupError","assertPositiveSafeInteger","defaultActionTimeoutMs","isRecord"]}
|