@anvia/browser 1.1.3 → 1.1.4

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/README.md CHANGED
@@ -235,7 +235,7 @@ URLs, environment variables, or logs.
235
235
 
236
236
  ## Playwright and Node compatibility
237
237
 
238
- The host package and browser image pin `playwright-core` 1.62.1 together. Playwright requires matching
238
+ The host package and browser image pin `playwright-core` 1.63.0 together. Playwright requires matching
239
239
  browser/package releases for its bundled browser and declares Node `>=20`; its current system matrix is
240
240
  the latest Node 22, 24, or 26. Anvia CI uses Node 24, and the isolation regression test also runs on the
241
241
  active host Node version. The package keeps its existing Node `>=20.12` engine for source compatibility,
package/dist/index.js CHANGED
@@ -506,10 +506,10 @@ var ResourceScheduler = class {
506
506
  controller: new AbortController(),
507
507
  operation,
508
508
  resolve,
509
- reject,
510
- ...abortSignal === void 0 ? {} : { abortSignal }
509
+ reject
511
510
  };
512
511
  if (abortSignal !== void 0) {
512
+ task.abortSignal = abortSignal;
513
513
  task.abort = () => {
514
514
  const current = this.resources.get(key);
515
515
  const index = current?.tasks.indexOf(task) ?? -1;
@@ -619,10 +619,10 @@ var AsyncMutex = class {
619
619
  return new Promise((resolve, reject) => {
620
620
  const waiter = {
621
621
  resolve,
622
- reject,
623
- ...abortSignal === void 0 ? {} : { abortSignal }
622
+ reject
624
623
  };
625
624
  if (abortSignal !== void 0) {
625
+ waiter.abortSignal = abortSignal;
626
626
  waiter.abort = () => {
627
627
  const index = this.waiters.indexOf(waiter);
628
628
  if (index === -1) return;
@@ -666,18 +666,20 @@ async function connectPlaywrightBrowser(options) {
666
666
  const timeoutMs = options.timeoutMs ?? defaultConnectionTimeoutMs;
667
667
  assertPositiveSafeInteger2(timeoutMs, "timeoutMs");
668
668
  options.abortSignal?.throwIfAborted();
669
- const backend = await AutomationWorkerClient.connect({
669
+ const connectOptions = {
670
670
  endpointUrl: options.endpointUrl,
671
- timeoutMs,
672
- ...options.abortSignal === void 0 ? {} : { abortSignal: options.abortSignal },
673
- ...options.workerFactory === void 0 ? {} : { workerFactory: options.workerFactory }
674
- });
675
- return new PlaywrightBrowserConnectionImpl({
671
+ timeoutMs
672
+ };
673
+ if (options.abortSignal !== void 0) connectOptions.abortSignal = options.abortSignal;
674
+ if (options.workerFactory !== void 0) connectOptions.workerFactory = options.workerFactory;
675
+ const backend = await AutomationWorkerClient.connect(connectOptions);
676
+ const connectionOptions = {
676
677
  backend,
677
678
  control: options.control,
678
- scheduling: options.scheduling,
679
- ...options.onClosed === void 0 ? {} : { onClosed: options.onClosed }
680
- });
679
+ scheduling: options.scheduling
680
+ };
681
+ if (options.onClosed !== void 0) connectionOptions.onClosed = options.onClosed;
682
+ return new PlaywrightBrowserConnectionImpl(connectionOptions);
681
683
  }
682
684
  var PlaywrightBrowserConnectionImpl = class {
683
685
  backend;
@@ -1130,17 +1132,18 @@ var BrowserControlState = class {
1130
1132
  snapshot() {
1131
1133
  const lease = this.activeLease;
1132
1134
  const state = lease !== void 0 ? "human" : this.humanPending ? "human-pending" : this.activeAgentActions > 0 ? "agent-active" : "agent";
1133
- return Object.freeze({
1135
+ const snapshot = {
1134
1136
  mode: lease === void 0 ? "agent" : "human",
1135
1137
  state,
1136
1138
  availability: this.availability,
1137
1139
  activeAgentActions: this.activeAgentActions,
1138
- humanPending: this.humanPending,
1139
- ...lease === void 0 ? {} : {
1140
- ownerId: lease.ownerId,
1141
- expiresAt: lease.expiresAt
1142
- }
1143
- });
1140
+ humanPending: this.humanPending
1141
+ };
1142
+ if (lease !== void 0) {
1143
+ snapshot.ownerId = lease.ownerId;
1144
+ snapshot.expiresAt = lease.expiresAt;
1145
+ }
1146
+ return Object.freeze(snapshot);
1144
1147
  }
1145
1148
  async acquireHumanControl(options) {
1146
1149
  validateAcquireOptions(options);
@@ -1789,22 +1792,22 @@ var DockerBrowserHandle = class {
1789
1792
  cleanupError = caught;
1790
1793
  }
1791
1794
  if (disconnectedDuringInitialization && this.handleState === "active" && this.state === "running") {
1795
+ const disconnectOptions = {};
1796
+ if (cleanupError !== void 0) disconnectOptions.cause = cleanupError;
1797
+ disconnectOptions.phase = "connect";
1792
1798
  throw new BrowserError(
1793
1799
  "Browser disconnected while automation was initializing.",
1794
1800
  "connection_closed",
1795
- {
1796
- ...cleanupError === void 0 ? {} : { cause: cleanupError },
1797
- phase: "connect"
1798
- }
1801
+ disconnectOptions
1799
1802
  );
1800
1803
  }
1801
1804
  const lifecycleError = this.lifecycleError(
1802
1805
  "Browser stopped while the connection was initializing."
1803
1806
  );
1804
- throw cleanupError === void 0 ? lifecycleError : new BrowserError(lifecycleError.message, lifecycleError.code, {
1805
- cause: cleanupError,
1806
- ...lifecycleError.phase === void 0 ? {} : { phase: lifecycleError.phase }
1807
- });
1807
+ if (cleanupError === void 0) throw lifecycleError;
1808
+ const cleanupOptions = { cause: cleanupError };
1809
+ if (lifecycleError.phase !== void 0) cleanupOptions.phase = lifecycleError.phase;
1810
+ throw new BrowserError(lifecycleError.message, lifecycleError.code, cleanupOptions);
1808
1811
  }
1809
1812
  return connection;
1810
1813
  } catch (error) {
@@ -1960,15 +1963,13 @@ var DockerBrowserHandle = class {
1960
1963
  return results.filter((result) => result.status === "rejected").map((result) => result.reason);
1961
1964
  }
1962
1965
  setCapability(capability, state, error) {
1963
- this.capabilityStates.set(
1966
+ const snapshot = {
1964
1967
  capability,
1965
- Object.freeze({
1966
- capability,
1967
- state,
1968
- checkedAt: (/* @__PURE__ */ new Date()).toISOString(),
1969
- ...error === void 0 ? {} : { error }
1970
- })
1971
- );
1968
+ state,
1969
+ checkedAt: (/* @__PURE__ */ new Date()).toISOString()
1970
+ };
1971
+ if (error !== void 0) snapshot.error = error;
1972
+ this.capabilityStates.set(capability, Object.freeze(snapshot));
1972
1973
  }
1973
1974
  updateControlAvailability() {
1974
1975
  if (this.handleState !== "active" || this.state !== "running") {
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 {\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"]}
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 };\n if (abortSignal !== undefined) {\n task.abortSignal = abortSignal;\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 };\n if (abortSignal !== undefined) {\n waiter.abortSignal = abortSignal;\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 connectOptions: Parameters<typeof AutomationWorkerClient.connect>[0] = {\n endpointUrl: options.endpointUrl,\n timeoutMs,\n };\n if (options.abortSignal !== undefined) connectOptions.abortSignal = options.abortSignal;\n if (options.workerFactory !== undefined) connectOptions.workerFactory = options.workerFactory;\n const backend = await AutomationWorkerClient.connect(connectOptions);\n const connectionOptions: ConstructorParameters<typeof PlaywrightBrowserConnectionImpl>[0] = {\n backend,\n control: options.control,\n scheduling: options.scheduling,\n };\n if (options.onClosed !== undefined) connectionOptions.onClosed = options.onClosed;\n return new PlaywrightBrowserConnectionImpl(connectionOptions);\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 { Writable } from \"./internal/type-utils\";\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 const snapshot: Writable<BrowserControlSnapshot> = {\n mode: lease === undefined ? \"agent\" : \"human\",\n state,\n availability: this.availability,\n activeAgentActions: this.activeAgentActions,\n humanPending: this.humanPending,\n };\n if (lease !== undefined) {\n snapshot.ownerId = lease.ownerId;\n snapshot.expiresAt = lease.expiresAt;\n }\n return Object.freeze(snapshot);\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, type BrowserErrorOptions } from \"./errors\";\nimport { Writable } from \"./internal/type-utils\";\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 const disconnectOptions: Writable<BrowserErrorOptions> = {};\n if (cleanupError !== undefined) disconnectOptions.cause = cleanupError;\n disconnectOptions.phase = \"connect\";\n throw new BrowserError(\n \"Browser disconnected while automation was initializing.\",\n \"connection_closed\",\n disconnectOptions,\n );\n }\n const lifecycleError = this.lifecycleError(\n \"Browser stopped while the connection was initializing.\",\n );\n if (cleanupError === undefined) throw lifecycleError;\n const cleanupOptions: Writable<BrowserErrorOptions> = { cause: cleanupError };\n if (lifecycleError.phase !== undefined) cleanupOptions.phase = lifecycleError.phase;\n throw new BrowserError(lifecycleError.message, lifecycleError.code, cleanupOptions);\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 const snapshot: Writable<BrowserCapabilitySnapshot> = {\n capability,\n state,\n checkedAt: new Date().toISOString(),\n };\n if (error !== undefined) snapshot.error = error;\n this.capabilityStates.set(capability, Object.freeze(snapshot));\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"]}
package/image/Dockerfile CHANGED
@@ -1,6 +1,6 @@
1
- FROM mcr.microsoft.com/playwright:v1.62.1-noble
1
+ FROM mcr.microsoft.com/playwright:v1.63.0-noble
2
2
 
3
- ARG PLAYWRIGHT_VERSION=1.62.1
3
+ ARG PLAYWRIGHT_VERSION=1.63.0
4
4
 
5
5
  RUN apt-get update \
6
6
  && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/browser",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "description": "Visible Chromium runtime and semantic browser tools for Anvia agents.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -28,19 +28,19 @@
28
28
  }
29
29
  },
30
30
  "dependencies": {
31
- "playwright-core": "1.62.1",
32
- "zod": "^4.5.4",
33
- "@anvia/sandbox": "1.1.3"
31
+ "playwright-core": "1.63.0",
32
+ "zod": "^4.6.5",
33
+ "@anvia/sandbox": "1.1.4"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^24.9.1",
37
37
  "tsup": "^8.5.0",
38
38
  "typescript": "^5.9.3",
39
39
  "vitest": "^4.0.8",
40
- "@anvia/core": "1.2.0"
40
+ "@anvia/core": "1.3.1"
41
41
  },
42
42
  "peerDependencies": {
43
- "@anvia/core": "^1.2.0"
43
+ "@anvia/core": "^1.3.1"
44
44
  },
45
45
  "engines": {
46
46
  "node": ">=20.12.0"