@anvia/browser 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/image/Dockerfile +2 -2
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/docker-browser.ts","../src/connection.ts","../src/errors.ts","../src/control.ts","../src/tools.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport type {\n DockerSandbox,\n DockerSandboxClient,\n DockerSandboxInspectionOptions,\n DockerSandboxInspector,\n DockerSandboxPublishedPort,\n DockerSandboxState,\n} from \"@anvia/sandbox\";\nimport { connectPlaywrightBrowser, type PlaywrightBrowserConnectionImpl } from \"./connection\";\nimport { BrowserControlState } from \"./control\";\nimport { BrowserError } from \"./errors\";\nimport type {\n BrowserConnectOptions,\n BrowserDesktopEndpoint,\n BrowserWaitUntilReadyOptions,\n CreateDockerBrowserOptions,\n DockerBrowser,\n DockerBrowserClientOptions,\n PlaywrightBrowserConnection,\n PullDockerBrowserImageOptions,\n ResumeDockerBrowserOptions,\n} from \"./types\";\n\nconst cdpPort = 9222;\nconst noVncPort = 6080;\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 let pullOptions: Parameters<typeof this.sandboxClient.pullImage>[0] = { image: this.image };\n if (options.abortSignal !== undefined) {\n pullOptions = { ...pullOptions, abortSignal: options.abortSignal };\n }\n await this.sandboxClient.pullImage(pullOptions);\n }\n\n async createBrowser(options: CreateDockerBrowserOptions): Promise<DockerBrowser> {\n validateCreateOptions(options);\n options.abortSignal?.throwIfAborted();\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: {\n \"anvia.browser.schema\": browserSchema,\n },\n resources,\n security: {\n noNewPrivileges: true,\n dropCapabilities: [\"ALL\"],\n addCapabilities: [\"SYS_CHROOT\"],\n seccompProfile: { type: \"path\", path: seccompProfilePath },\n },\n };\n if (options.id !== undefined) sandboxOptions = { ...sandboxOptions, id: options.id };\n if (options.runtime !== undefined) {\n sandboxOptions = { ...sandboxOptions, runtime: options.runtime };\n }\n if (options.abortSignal !== undefined) {\n sandboxOptions = { ...sandboxOptions, abortSignal: options.abortSignal };\n }\n const sandbox = await this.sandboxClient.createSandbox(sandboxOptions);\n\n try {\n await configureBrowser(sandbox, options);\n await startBrowserServices(sandbox, options.abortSignal);\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n await sandbox.destroy().catch(() => undefined);\n throw new BrowserError(\"Unable to configure the browser sandbox.\", \"startup_failed\", {\n cause: error,\n });\n }\n }\n\n async resumeBrowser(options: ResumeDockerBrowserOptions): Promise<DockerBrowser> {\n assertOptionsObject(options);\n assertNonEmptyString(options.id, \"id\");\n options.abortSignal?.throwIfAborted();\n const sandbox = await this.sandboxClient.resumeSandbox(options);\n try {\n await assertBrowserImage(sandbox, options.abortSignal);\n await startBrowserServices(sandbox, options.abortSignal);\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n await sandbox.stop().catch(() => undefined);\n throw new BrowserError(\"Unable to resume browser services.\", \"startup_failed\", {\n cause: error,\n });\n }\n }\n}\n\nclass 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\n constructor(sandbox: DockerSandbox) {\n this.sandbox = sandbox;\n this.id = sandbox.id;\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.sandbox.state;\n }\n\n inspector(options: DockerSandboxInspectionOptions): DockerSandboxInspector {\n return this.sandbox.inspector(options);\n }\n\n async waitUntilReady(options: BrowserWaitUntilReadyOptions): Promise<void> {\n assertOptionsObject(options);\n assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n this.assertRunning();\n const timeout = AbortSignal.timeout(options.timeoutMs);\n const abortSignal =\n options.abortSignal === undefined ? timeout : AbortSignal.any([options.abortSignal, timeout]);\n try {\n await Promise.all([\n this.sandbox.runtime.waitForPort({\n containerPort: cdpPort,\n timeoutMs: options.timeoutMs,\n abortSignal,\n }),\n this.sandbox.runtime.waitForPort({\n containerPort: noVncPort,\n timeoutMs: options.timeoutMs,\n abortSignal,\n }),\n ]);\n await Promise.all([\n assertHttpReady(`${endpointFor(this.sandbox, cdpPort)}/json/version`, abortSignal),\n assertHttpReady(`${endpointFor(this.sandbox, noVncPort)}/vnc.html`, abortSignal),\n ]);\n } catch (error) {\n if (options.abortSignal?.aborted) options.abortSignal.throwIfAborted();\n throw new BrowserError(\"Browser did not become ready before the timeout.\", \"not_ready\", {\n cause: error,\n });\n }\n }\n\n async connect(options: BrowserConnectOptions = {}): Promise<PlaywrightBrowserConnection> {\n assertOptionsObject(options);\n this.assertRunning();\n try {\n let connectOptions: Parameters<typeof connectPlaywrightBrowser>[0] = {\n endpointUrl: endpointFor(this.sandbox, cdpPort),\n control: this.control,\n };\n if (options.abortSignal !== undefined) {\n connectOptions = { ...connectOptions, abortSignal: options.abortSignal };\n }\n const connection = await connectPlaywrightBrowser(connectOptions);\n this.connections.add(connection);\n return connection;\n } catch (error) {\n if (options.abortSignal?.aborted) options.abortSignal.throwIfAborted();\n throw new BrowserError(\"Unable to connect to Chromium over CDP.\", \"not_ready\", {\n cause: error,\n });\n }\n }\n\n async stop(options: Readonly<{ abortSignal?: AbortSignal }> = {}): Promise<void> {\n assertOptionsObject(options);\n await this.disconnectAll();\n await this.sandbox.stop(options);\n }\n\n async destroy(): Promise<void> {\n this.control.destroy();\n await this.disconnectAll();\n await this.sandbox.destroy();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.destroy();\n }\n\n private assertRunning(): void {\n if (this.state !== \"running\") {\n throw new BrowserError(`Browser is not running: ${this.state}`, \"invalid_state\");\n }\n }\n\n private async disconnectAll(): Promise<void> {\n const connections = [...this.connections];\n this.connections.clear();\n const results = await Promise.allSettled(\n connections.map((connection) => connection.disconnect()),\n );\n const failures = results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n if (failures.length > 0) {\n throw new AggregateError(failures, \"Unable to disconnect browser automation clients.\");\n }\n }\n}\n\nasync function configureBrowser(\n sandbox: DockerSandbox,\n options: CreateDockerBrowserOptions,\n): Promise<void> {\n let execOptions: Parameters<typeof sandbox.runtime.exec>[0] = {\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 };\n if (options.abortSignal !== undefined) {\n execOptions = { ...execOptions, abortSignal: options.abortSignal };\n }\n const result = await sandbox.runtime.exec(execOptions);\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new Error(\"Browser image rejected its runtime configuration.\");\n }\n}\n\nasync function assertBrowserImage(\n sandbox: DockerSandbox,\n abortSignal?: AbortSignal,\n): Promise<void> {\n let execOptions: Parameters<typeof sandbox.runtime.exec>[0] = {\n command: \"/usr/local/bin/anvia-browser-version\",\n };\n if (abortSignal !== undefined) execOptions = { ...execOptions, abortSignal };\n const result = await sandbox.runtime.exec(execOptions);\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 let startOptions: Parameters<typeof sandbox.runtime.startProcess>[0] = {\n command: \"/usr/local/bin/anvia-browser-start\",\n };\n if (abortSignal !== undefined) startOptions = { ...startOptions, abortSignal };\n await sandbox.runtime.startProcess(startOptions);\n}\n\nasync function assertHttpReady(url: string, abortSignal: AbortSignal): Promise<void> {\n while (true) {\n abortSignal.throwIfAborted();\n try {\n const response = await fetch(url, { signal: abortSignal, redirect: \"error\" });\n if (response.ok) {\n await response.body?.cancel();\n return;\n }\n await response.body?.cancel();\n } catch (error) {\n if (abortSignal.aborted) throw abortSignal.reason ?? error;\n }\n await waitForRetry(abortSignal);\n }\n}\n\nasync function waitForRetry(abortSignal: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(finish, 50);\n const abort = () => finish(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n\n function finish(error?: unknown): void {\n clearTimeout(timeout);\n abortSignal.removeEventListener(\"abort\", abort);\n if (error === undefined) resolve();\n else reject(error);\n }\n });\n}\n\nfunction endpointFor(sandbox: DockerSandbox, containerPort: number): string {\n const published = publishedPort(sandbox, containerPort);\n return `http://${hostForUrl(published.host)}:${published.hostPort}`;\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 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.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 assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`${name} must be a positive safe integer.`);\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 assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (!isRecord(value)) throw new TypeError(\"options must be an object.\");\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 isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Browser, Page, Route } from \"playwright-core\";\nimport { chromium } from \"playwright-core\";\nimport type { BrowserControlState } from \"./control\";\nimport { BrowserError } from \"./errors\";\nimport type { BrowserNavigationPolicy, BrowserTab, PlaywrightBrowserConnection } from \"./types\";\n\nexport async function connectPlaywrightBrowser(options: {\n endpointUrl: string;\n control: BrowserControlState;\n abortSignal?: AbortSignal;\n}): Promise<PlaywrightBrowserConnectionImpl> {\n options.abortSignal?.throwIfAborted();\n const browser = await chromium.connectOverCDP(options.endpointUrl);\n if (options.abortSignal?.aborted) {\n await browser.close().catch(() => undefined);\n options.abortSignal.throwIfAborted();\n }\n return new PlaywrightBrowserConnectionImpl(browser, options.control);\n}\n\nexport class PlaywrightBrowserConnectionImpl implements PlaywrightBrowserConnection {\n private readonly browser: Browser;\n private readonly control: BrowserControlState;\n private readonly tabIds = new WeakMap<Page, string>();\n private selected: Page | undefined;\n private isClosed = false;\n private actionTail = Promise.resolve();\n private navigationPolicyKey: string | undefined;\n private navigationGuard = Promise.resolve();\n\n constructor(browser: Browser, control: BrowserControlState) {\n this.browser = browser;\n this.control = control;\n this.selected = this.pages()[0];\n this.browser.once(\"disconnected\", () => {\n this.isClosed = true;\n });\n }\n\n get closed(): boolean {\n return this.isClosed || !this.browser.isConnected();\n }\n\n async listTabs(): Promise<readonly BrowserTab[]> {\n return this.runAction(undefined, () => this.tabSummaries());\n }\n\n async tabSummaries(): Promise<readonly BrowserTab[]> {\n return Object.freeze(\n await Promise.all(\n this.pages().map(async (page) =>\n Object.freeze({\n id: this.idFor(page),\n title: await page.title(),\n url: page.url(),\n selected: page === this.selected,\n }),\n ),\n ),\n );\n }\n\n async runAction<T>(\n abortSignal: AbortSignal | undefined,\n operation: () => Promise<T>,\n ): Promise<T> {\n const previous = this.actionTail;\n let release: (() => void) | undefined;\n this.actionTail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n this.assertOpen();\n await this.navigationGuard;\n return await this.control.runAgentAction(() => this.withAbort(abortSignal, operation));\n } finally {\n release?.();\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 routeHandler = (route: Route) => enforceNavigationPolicy(route, policy);\n this.navigationGuard = Promise.all(\n this.browser.contexts().map((context) => context.route(\"**/*\", routeHandler)),\n ).then(() => undefined);\n void this.navigationGuard.catch(() => undefined);\n }\n\n selectedPage(): Page {\n this.assertOpen();\n if (this.selected !== undefined && !this.selected.isClosed()) return this.selected;\n const page = this.pages()[0];\n if (page === undefined) {\n throw new BrowserError(\"Browser has no open tabs.\", \"invalid_state\");\n }\n this.selected = page;\n return page;\n }\n\n async openTab(): Promise<Page> {\n const context = this.browser.contexts()[0];\n if (context === undefined) {\n throw new BrowserError(\"Browser has no CDP context.\", \"invalid_state\");\n }\n const page = await context.newPage();\n this.selected = page;\n this.idFor(page);\n return page;\n }\n\n selectTab(id: string): Page {\n const page = this.pageFor(id);\n this.selected = page;\n return page;\n }\n\n async closeTab(id: string): Promise<void> {\n const page = this.pageFor(id);\n await page.close();\n if (page === this.selected) this.selected = this.pages()[0];\n }\n\n idFor(page: Page): string {\n const existing = this.tabIds.get(page);\n if (existing !== undefined) return existing;\n const id = randomUUID();\n this.tabIds.set(page, id);\n return id;\n }\n\n async disconnect(): Promise<void> {\n if (this.isClosed) return;\n this.isClosed = true;\n await this.browser.close().catch(() => undefined);\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.disconnect();\n }\n\n private pages(): Page[] {\n return this.browser.contexts().flatMap((context) => context.pages());\n }\n\n private pageFor(id: string): Page {\n const page = this.pages().find((candidate) => this.idFor(candidate) === id);\n if (page === undefined) {\n throw new BrowserError(`Browser tab does not exist: ${id}`, \"invalid_state\");\n }\n return page;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new BrowserError(\"Browser connection is closed.\", \"connection_closed\");\n }\n\n private async withAbort<T>(\n abortSignal: AbortSignal | undefined,\n operation: () => Promise<T>,\n ): Promise<T> {\n abortSignal?.throwIfAborted();\n if (abortSignal === undefined) return operation();\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\", onAbort);\n callback();\n };\n const onAbort = () => {\n void this.disconnect().finally(() => finish(() => reject(abortSignal.reason)));\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n void operation().then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n }\n}\n\nasync function enforceNavigationPolicy(\n route: Route,\n policy: BrowserNavigationPolicy,\n): Promise<void> {\n const request = route.request();\n const frame = request.frame();\n if (\n request.isNavigationRequest() &&\n frame === frame.page().mainFrame() &&\n !isNavigationAllowed(request.url(), policy)\n ) {\n await route.abort(\"blockedbyclient\");\n return;\n }\n await route.continue();\n}\n\nfunction isNavigationAllowed(value: string, policy: BrowserNavigationPolicy): boolean {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n return false;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n if (url.username.length > 0 || url.password.length > 0) return false;\n return policy.mode === \"allow-all-http\" || policy.origins.includes(url.origin);\n}\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","export type BrowserErrorCode =\n | \"connection_closed\"\n | \"human_controlled\"\n | \"invalid_state\"\n | \"navigation_blocked\"\n | \"not_ready\"\n | \"startup_failed\";\n\nexport class BrowserError extends Error {\n constructor(\n message: string,\n readonly code: BrowserErrorCode,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"BrowserError\";\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { BrowserError } from \"./errors\";\nimport type {\n AcquireBrowserHumanControlOptions,\n BrowserControl,\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};\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\n snapshot(): BrowserControlSnapshot {\n const lease = this.activeLease;\n return lease === undefined\n ? Object.freeze({ mode: \"agent\" })\n : Object.freeze({\n mode: \"human\",\n ownerId: lease.ownerId,\n expiresAt: lease.expiresAt,\n });\n }\n\n async acquireHumanControl(\n options: AcquireBrowserHumanControlOptions,\n ): Promise<BrowserHumanControlLease> {\n validateAcquireOptions(options);\n this.assertActive();\n options.abortSignal?.throwIfAborted();\n if (this.activeLease !== undefined || this.humanPending) {\n throw new BrowserError(\"Browser human control is already acquired.\", \"human_controlled\");\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.pendingAcquire = undefined;\n reject(options.abortSignal?.reason);\n };\n options.abortSignal.addEventListener(\"abort\", pending.abort, { once: true });\n }\n this.pendingAcquire = pending;\n });\n }\n\n this.assertActive();\n options.abortSignal?.throwIfAborted();\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 || this.humanPending) {\n throw new BrowserError(\"Browser is controlled by a human viewer.\", \"human_controlled\");\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 if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n pending.reject(new BrowserError(\"Browser was destroyed.\", \"invalid_state\"));\n }\n }\n\n private assertActive(): void {\n if (this.destroyed) throw new BrowserError(\"Browser was destroyed.\", \"invalid_state\");\n }\n\n private resolvePendingAcquire(): void {\n const pending: PendingAcquire | undefined = this.pendingAcquire;\n if (pending === undefined) return;\n this.pendingAcquire = undefined;\n if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n pending.resolve();\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: {\n owner: BrowserControlState;\n ownerId: string;\n leaseTimeoutMs: number;\n }) {\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}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`${name} must be a positive safe integer.`);\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 { type AnyTool, createTool, ToolOutput } from \"@anvia/core/tool\";\nimport type { Locator, Page } from \"playwright-core\";\nimport { z } from \"zod\";\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 navigateInput = z.object({\n url: z.url(),\n waitUntil: z.enum([\"commit\", \"domcontentloaded\", \"load\", \"networkidle\"]).optional(),\n});\nconst clickInput = z.object({ target: targetSchema });\nconst typeInput = z.object({ target: targetSchema, text: z.string() });\nconst pressKeyInput = z.object({ key: z.string().min(1).max(100) });\nconst screenshotInput = z.object({});\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);\n case \"browser_open_tab\":\n return createOpenTabTool(connection);\n case \"browser_select_tab\":\n return createSelectTabTool(connection);\n case \"browser_close_tab\":\n return createCloseTabTool(connection);\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);\n case \"browser_screenshot\":\n return createScreenshotTool(connection);\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): 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 () => ({ tabs: await connection.listTabs() }),\n });\n}\n\nfunction createOpenTabTool(connection: Connection): 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) =>\n connection.runAction(context.abortSignal, async () => {\n const page = await connection.openTab();\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createSelectTabTool(connection: Connection): 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.runAction(context.abortSignal, async () =>\n tabResult(connection, connection.selectTab(tabId)),\n ),\n });\n}\n\nfunction createCloseTabTool(connection: Connection): 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.runAction(context.abortSignal, async () => {\n await connection.closeTab(tabId);\n return { closedTabId: tabId, tabs: await connection.tabSummaries() };\n }),\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: \"Navigate the selected Chromium tab to an allowed HTTP or HTTPS URL.\",\n inputSchema: navigateInput,\n execute: async ({ url, waitUntil }, context) =>\n connection.runAction(context.abortSignal, async () => {\n assertNavigationAllowed(url, policy);\n const page = connection.selectedPage();\n await page.goto(url, {\n timeout: timeoutMs,\n waitUntil: waitUntil ?? \"load\",\n });\n assertNavigationAllowed(page.url(), policy);\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createSnapshotTool(connection: Connection, timeoutMs: number, maxChars: number): AnyTool {\n return createTool({\n name: \"browser_snapshot\",\n description: \"Inspect the selected tab using a bounded ARIA accessibility snapshot.\",\n inputSchema: noInput,\n execute: async (_args, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n const snapshot = await page.locator(\"body\").ariaSnapshot({ timeout: timeoutMs });\n const truncated = snapshot.length > maxChars;\n return {\n ...(await tabResult(connection, page)),\n snapshot: truncated ? snapshot.slice(0, maxChars) : snapshot,\n truncated,\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 the selected tab.\",\n inputSchema: clickInput,\n execute: async ({ target }, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n await locatorFor(page, target).click({ timeout: timeoutMs });\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createTypeTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_type\",\n description: \"Replace the value of one strictly matched editable element.\",\n inputSchema: typeInput,\n execute: async ({ target, text }, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n await locatorFor(page, target).fill(text, { timeout: timeoutMs });\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createPressKeyTool(connection: Connection): AnyTool {\n return createTool({\n name: \"browser_press_key\",\n description: \"Press an explicit keyboard key or key combination in the selected tab.\",\n inputSchema: pressKeyInput,\n execute: async ({ key }, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n await page.keyboard.press(key);\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createScreenshotTool(connection: Connection): AnyTool {\n return createTool({\n name: \"browser_screenshot\",\n description: \"Capture the visible viewport of the selected Chromium tab as PNG.\",\n inputSchema: screenshotInput,\n execute: async (_args, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n const png = await page.screenshot({ type: \"png\", fullPage: false });\n const metadata = await tabResult(connection, page);\n return ToolOutput.content([\n { type: \"text\", text: JSON.stringify(metadata) },\n {\n type: \"file\",\n data: { type: \"data\", data: png.toString(\"base64\") },\n mediaType: \"image/png\",\n filename: \"browser-screenshot.png\",\n },\n ]);\n }),\n });\n}\n\nasync function tabResult(connection: Connection, page: Page) {\n return {\n tabId: connection.idFor(page),\n title: await page.title(),\n url: page.url(),\n };\n}\n\ntype BrowserTarget = z.infer<typeof targetSchema>;\n\nfunction locatorFor(page: Page, target: BrowserTarget): Locator {\n switch (target.by) {\n case \"role\": {\n const options: { name?: string; exact?: boolean } = {};\n if (target.name !== undefined) options.name = target.name;\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByRole(target.role as never, options);\n }\n case \"text\": {\n const options: { exact?: boolean } = {};\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByText(target.text, options);\n }\n case \"label\": {\n const options: { exact?: boolean } = {};\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByLabel(target.label, options);\n }\n case \"placeholder\": {\n const options: { exact?: boolean } = {};\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByPlaceholder(target.placeholder, options);\n }\n case \"test-id\":\n return page.getByTestId(target.testId);\n case \"css\":\n return page.locator(target.selector);\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":["randomUUID","randomUUID","isRecord","assertPositiveSafeInteger","isRecord","isNavigationAllowed"]}
|
|
1
|
+
{"version":3,"sources":["../src/docker-browser.ts","../src/connection.ts","../src/errors.ts","../src/control.ts","../src/tools.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport type {\n DockerSandbox,\n DockerSandboxClient,\n DockerSandboxInspectionOptions,\n DockerSandboxInspector,\n DockerSandboxPublishedPort,\n DockerSandboxState,\n} from \"@anvia/sandbox\";\nimport { connectPlaywrightBrowser, type PlaywrightBrowserConnectionImpl } from \"./connection\";\nimport { BrowserControlState } from \"./control\";\nimport { BrowserError } from \"./errors\";\nimport type {\n BrowserConnectOptions,\n BrowserDesktopEndpoint,\n BrowserWaitUntilReadyOptions,\n CreateDockerBrowserOptions,\n DockerBrowser,\n DockerBrowserClientOptions,\n PlaywrightBrowserConnection,\n PullDockerBrowserImageOptions,\n ResumeDockerBrowserOptions,\n} from \"./types\";\n\nconst cdpPort = 9222;\nconst noVncPort = 6080;\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 let pullOptions: Parameters<typeof this.sandboxClient.pullImage>[0] = { image: this.image };\n if (options.abortSignal !== undefined) {\n pullOptions = { ...pullOptions, abortSignal: options.abortSignal };\n }\n await this.sandboxClient.pullImage(pullOptions);\n }\n\n async createBrowser(options: CreateDockerBrowserOptions): Promise<DockerBrowser> {\n validateCreateOptions(options);\n options.abortSignal?.throwIfAborted();\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: {\n \"anvia.browser.schema\": browserSchema,\n },\n resources,\n security: {\n noNewPrivileges: true,\n dropCapabilities: [\"ALL\"],\n addCapabilities: [\"SYS_CHROOT\"],\n seccompProfile: { type: \"path\", path: seccompProfilePath },\n },\n };\n if (options.id !== undefined) sandboxOptions = { ...sandboxOptions, id: options.id };\n if (options.runtime !== undefined) {\n sandboxOptions = { ...sandboxOptions, runtime: options.runtime };\n }\n if (options.abortSignal !== undefined) {\n sandboxOptions = { ...sandboxOptions, abortSignal: options.abortSignal };\n }\n const sandbox = await this.sandboxClient.createSandbox(sandboxOptions);\n\n try {\n await configureBrowser(sandbox, options);\n await startBrowserServices(sandbox, options.abortSignal);\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n await sandbox.destroy().catch(() => undefined);\n throw new BrowserError(\"Unable to configure the browser sandbox.\", \"startup_failed\", {\n cause: error,\n });\n }\n }\n\n async resumeBrowser(options: ResumeDockerBrowserOptions): Promise<DockerBrowser> {\n assertOptionsObject(options);\n assertNonEmptyString(options.id, \"id\");\n options.abortSignal?.throwIfAborted();\n const sandbox = await this.sandboxClient.resumeSandbox(options);\n try {\n await assertBrowserImage(sandbox, options.abortSignal);\n await startBrowserServices(sandbox, options.abortSignal);\n return new DockerBrowserHandle(sandbox);\n } catch (error) {\n await sandbox.stop().catch(() => undefined);\n throw new BrowserError(\"Unable to resume browser services.\", \"startup_failed\", {\n cause: error,\n });\n }\n }\n}\n\nclass 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\n constructor(sandbox: DockerSandbox) {\n this.sandbox = sandbox;\n this.id = sandbox.id;\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.sandbox.state;\n }\n\n inspector(options: DockerSandboxInspectionOptions): DockerSandboxInspector {\n return this.sandbox.inspector(options);\n }\n\n async waitUntilReady(options: BrowserWaitUntilReadyOptions): Promise<void> {\n assertOptionsObject(options);\n assertPositiveSafeInteger(options.timeoutMs, \"timeoutMs\");\n this.assertRunning();\n const timeout = AbortSignal.timeout(options.timeoutMs);\n const abortSignal =\n options.abortSignal === undefined ? timeout : AbortSignal.any([options.abortSignal, timeout]);\n try {\n await Promise.all([\n this.sandbox.runtime.waitForPort({\n containerPort: cdpPort,\n timeoutMs: options.timeoutMs,\n abortSignal,\n }),\n this.sandbox.runtime.waitForPort({\n containerPort: noVncPort,\n timeoutMs: options.timeoutMs,\n abortSignal,\n }),\n ]);\n await Promise.all([\n assertHttpReady(`${endpointFor(this.sandbox, cdpPort)}/json/version`, abortSignal),\n assertHttpReady(`${endpointFor(this.sandbox, noVncPort)}/vnc.html`, abortSignal),\n ]);\n } catch (error) {\n if (options.abortSignal?.aborted) options.abortSignal.throwIfAborted();\n throw new BrowserError(\"Browser did not become ready before the timeout.\", \"not_ready\", {\n cause: error,\n });\n }\n }\n\n async connect(options: BrowserConnectOptions = {}): Promise<PlaywrightBrowserConnection> {\n assertOptionsObject(options);\n this.assertRunning();\n try {\n let connectOptions: Parameters<typeof connectPlaywrightBrowser>[0] = {\n endpointUrl: endpointFor(this.sandbox, cdpPort),\n control: this.control,\n };\n if (options.abortSignal !== undefined) {\n connectOptions = { ...connectOptions, abortSignal: options.abortSignal };\n }\n const connection = await connectPlaywrightBrowser(connectOptions);\n this.connections.add(connection);\n return connection;\n } catch (error) {\n if (options.abortSignal?.aborted) options.abortSignal.throwIfAborted();\n throw new BrowserError(\"Unable to connect to Chromium over CDP.\", \"not_ready\", {\n cause: error,\n });\n }\n }\n\n async stop(options: Readonly<{ abortSignal?: AbortSignal }> = {}): Promise<void> {\n assertOptionsObject(options);\n await this.disconnectAll();\n await this.sandbox.stop(options);\n }\n\n async destroy(): Promise<void> {\n this.control.destroy();\n await this.disconnectAll();\n await this.sandbox.destroy();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.destroy();\n }\n\n private assertRunning(): void {\n if (this.state !== \"running\") {\n throw new BrowserError(`Browser is not running: ${this.state}`, \"invalid_state\");\n }\n }\n\n private async disconnectAll(): Promise<void> {\n const connections = [...this.connections];\n this.connections.clear();\n const results = await Promise.allSettled(\n connections.map((connection) => connection.disconnect()),\n );\n const failures = results\n .filter((result): result is PromiseRejectedResult => result.status === \"rejected\")\n .map((result) => result.reason);\n if (failures.length > 0) {\n throw new AggregateError(failures, \"Unable to disconnect browser automation clients.\");\n }\n }\n}\n\nasync function configureBrowser(\n sandbox: DockerSandbox,\n options: CreateDockerBrowserOptions,\n): Promise<void> {\n let execOptions: Parameters<typeof sandbox.runtime.exec>[0] = {\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 };\n if (options.abortSignal !== undefined) {\n execOptions = { ...execOptions, abortSignal: options.abortSignal };\n }\n const result = await sandbox.runtime.exec(execOptions);\n if (result.status !== \"exited\" || result.exitCode !== 0) {\n throw new Error(\"Browser image rejected its runtime configuration.\");\n }\n}\n\nasync function assertBrowserImage(\n sandbox: DockerSandbox,\n abortSignal?: AbortSignal,\n): Promise<void> {\n let execOptions: Parameters<typeof sandbox.runtime.exec>[0] = {\n command: \"/usr/local/bin/anvia-browser-version\",\n };\n if (abortSignal !== undefined) execOptions = { ...execOptions, abortSignal };\n const result = await sandbox.runtime.exec(execOptions);\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 let startOptions: Parameters<typeof sandbox.runtime.startProcess>[0] = {\n command: \"/usr/local/bin/anvia-browser-start\",\n };\n if (abortSignal !== undefined) startOptions = { ...startOptions, abortSignal };\n await sandbox.runtime.startProcess(startOptions);\n}\n\nasync function assertHttpReady(url: string, abortSignal: AbortSignal): Promise<void> {\n while (true) {\n abortSignal.throwIfAborted();\n try {\n const response = await fetch(url, { signal: abortSignal, redirect: \"error\" });\n if (response.ok) {\n await response.body?.cancel();\n return;\n }\n await response.body?.cancel();\n } catch (error) {\n if (abortSignal.aborted) throw abortSignal.reason ?? error;\n }\n await waitForRetry(abortSignal);\n }\n}\n\nasync function waitForRetry(abortSignal: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(finish, 50);\n const abort = () => finish(abortSignal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n abortSignal.addEventListener(\"abort\", abort, { once: true });\n\n function finish(error?: unknown): void {\n clearTimeout(timeout);\n abortSignal.removeEventListener(\"abort\", abort);\n if (error === undefined) resolve();\n else reject(error);\n }\n });\n}\n\nfunction endpointFor(sandbox: DockerSandbox, containerPort: number): string {\n const published = publishedPort(sandbox, containerPort);\n return `http://${hostForUrl(published.host)}:${published.hostPort}`;\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 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.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 assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`${name} must be a positive safe integer.`);\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 assertOptionsObject(value: unknown): asserts value is Record<string, unknown> {\n if (!isRecord(value)) throw new TypeError(\"options must be an object.\");\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 isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Browser, Page, Route } from \"playwright-core\";\nimport { chromium } from \"playwright-core\";\nimport type { BrowserControlState } from \"./control\";\nimport { BrowserError } from \"./errors\";\nimport type { BrowserNavigationPolicy, BrowserTab, PlaywrightBrowserConnection } from \"./types\";\n\nexport async function connectPlaywrightBrowser(options: {\n endpointUrl: string;\n control: BrowserControlState;\n abortSignal?: AbortSignal;\n}): Promise<PlaywrightBrowserConnectionImpl> {\n options.abortSignal?.throwIfAborted();\n const browser = await chromium.connectOverCDP(options.endpointUrl);\n if (options.abortSignal?.aborted) {\n await browser.close().catch(() => undefined);\n options.abortSignal.throwIfAborted();\n }\n return new PlaywrightBrowserConnectionImpl(browser, options.control);\n}\n\nexport class PlaywrightBrowserConnectionImpl implements PlaywrightBrowserConnection {\n private readonly browser: Browser;\n private readonly control: BrowserControlState;\n private readonly tabIds = new WeakMap<Page, string>();\n private selected: Page | undefined;\n private isClosed = false;\n private actionTail = Promise.resolve();\n private navigationPolicyKey: string | undefined;\n private navigationGuard = Promise.resolve();\n\n constructor(browser: Browser, control: BrowserControlState) {\n this.browser = browser;\n this.control = control;\n this.selected = this.pages()[0];\n this.browser.once(\"disconnected\", () => {\n this.isClosed = true;\n });\n }\n\n get closed(): boolean {\n return this.isClosed || !this.browser.isConnected();\n }\n\n async listTabs(): Promise<readonly BrowserTab[]> {\n return this.runAction(undefined, () => this.tabSummaries());\n }\n\n async tabSummaries(): Promise<readonly BrowserTab[]> {\n return Object.freeze(\n await Promise.all(\n this.pages().map(async (page) =>\n Object.freeze({\n id: this.idFor(page),\n title: await page.title(),\n url: page.url(),\n selected: page === this.selected,\n }),\n ),\n ),\n );\n }\n\n async runAction<T>(\n abortSignal: AbortSignal | undefined,\n operation: () => Promise<T>,\n ): Promise<T> {\n const previous = this.actionTail;\n let release: (() => void) | undefined;\n this.actionTail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n this.assertOpen();\n await this.navigationGuard;\n return await this.control.runAgentAction(() => this.withAbort(abortSignal, operation));\n } finally {\n release?.();\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 routeHandler = (route: Route) => enforceNavigationPolicy(route, policy);\n this.navigationGuard = Promise.all(\n this.browser.contexts().map((context) => context.route(\"**/*\", routeHandler)),\n ).then(() => undefined);\n void this.navigationGuard.catch(() => undefined);\n }\n\n selectedPage(): Page {\n this.assertOpen();\n if (this.selected !== undefined && !this.selected.isClosed()) return this.selected;\n const page = this.pages()[0];\n if (page === undefined) {\n throw new BrowserError(\"Browser has no open tabs.\", \"invalid_state\");\n }\n this.selected = page;\n return page;\n }\n\n async openTab(): Promise<Page> {\n const context = this.browser.contexts()[0];\n if (context === undefined) {\n throw new BrowserError(\"Browser has no CDP context.\", \"invalid_state\");\n }\n const page = await context.newPage();\n this.selected = page;\n this.idFor(page);\n return page;\n }\n\n selectTab(id: string): Page {\n const page = this.pageFor(id);\n this.selected = page;\n return page;\n }\n\n async closeTab(id: string): Promise<void> {\n const page = this.pageFor(id);\n await page.close();\n if (page === this.selected) this.selected = this.pages()[0];\n }\n\n idFor(page: Page): string {\n const existing = this.tabIds.get(page);\n if (existing !== undefined) return existing;\n const id = randomUUID();\n this.tabIds.set(page, id);\n return id;\n }\n\n async disconnect(): Promise<void> {\n if (this.isClosed) return;\n this.isClosed = true;\n await this.browser.close().catch(() => undefined);\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.disconnect();\n }\n\n private pages(): Page[] {\n return this.browser.contexts().flatMap((context) => context.pages());\n }\n\n private pageFor(id: string): Page {\n const page = this.pages().find((candidate) => this.idFor(candidate) === id);\n if (page === undefined) {\n throw new BrowserError(`Browser tab does not exist: ${id}`, \"invalid_state\");\n }\n return page;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new BrowserError(\"Browser connection is closed.\", \"connection_closed\");\n }\n\n private async withAbort<T>(\n abortSignal: AbortSignal | undefined,\n operation: () => Promise<T>,\n ): Promise<T> {\n abortSignal?.throwIfAborted();\n if (abortSignal === undefined) return operation();\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\", onAbort);\n callback();\n };\n const onAbort = () => {\n void this.disconnect().finally(() => finish(() => reject(abortSignal.reason)));\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n void operation().then(\n (value) => finish(() => resolve(value)),\n (error) => finish(() => reject(error)),\n );\n });\n }\n}\n\nasync function enforceNavigationPolicy(\n route: Route,\n policy: BrowserNavigationPolicy,\n): Promise<void> {\n const request = route.request();\n const frame = request.frame();\n if (\n request.isNavigationRequest() &&\n frame === frame.page().mainFrame() &&\n !isNavigationAllowed(request.url(), policy)\n ) {\n await route.abort(\"blockedbyclient\");\n return;\n }\n await route.continue();\n}\n\nfunction isNavigationAllowed(value: string, policy: BrowserNavigationPolicy): boolean {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n return false;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return false;\n if (url.username.length > 0 || url.password.length > 0) return false;\n return policy.mode === \"allow-all-http\" || policy.origins.includes(url.origin);\n}\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","export type BrowserErrorCode =\n | \"connection_closed\"\n | \"human_controlled\"\n | \"invalid_state\"\n | \"navigation_blocked\"\n | \"not_ready\"\n | \"startup_failed\";\n\nexport class BrowserError extends Error {\n constructor(\n message: string,\n readonly code: BrowserErrorCode,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"BrowserError\";\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { BrowserError } from \"./errors\";\nimport type {\n AcquireBrowserHumanControlOptions,\n BrowserControl,\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};\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\n snapshot(): BrowserControlSnapshot {\n const lease = this.activeLease;\n return lease === undefined\n ? Object.freeze({ mode: \"agent\" })\n : Object.freeze({\n mode: \"human\",\n ownerId: lease.ownerId,\n expiresAt: lease.expiresAt,\n });\n }\n\n async acquireHumanControl(\n options: AcquireBrowserHumanControlOptions,\n ): Promise<BrowserHumanControlLease> {\n validateAcquireOptions(options);\n this.assertActive();\n options.abortSignal?.throwIfAborted();\n if (this.activeLease !== undefined || this.humanPending) {\n throw new BrowserError(\"Browser human control is already acquired.\", \"human_controlled\");\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.pendingAcquire = undefined;\n reject(options.abortSignal?.reason);\n };\n options.abortSignal.addEventListener(\"abort\", pending.abort, { once: true });\n }\n this.pendingAcquire = pending;\n });\n }\n\n this.assertActive();\n options.abortSignal?.throwIfAborted();\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 || this.humanPending) {\n throw new BrowserError(\"Browser is controlled by a human viewer.\", \"human_controlled\");\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 if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n pending.reject(new BrowserError(\"Browser was destroyed.\", \"invalid_state\"));\n }\n }\n\n private assertActive(): void {\n if (this.destroyed) throw new BrowserError(\"Browser was destroyed.\", \"invalid_state\");\n }\n\n private resolvePendingAcquire(): void {\n const pending: PendingAcquire | undefined = this.pendingAcquire;\n if (pending === undefined) return;\n this.pendingAcquire = undefined;\n if (pending.abort !== undefined) {\n pending.abortSignal?.removeEventListener(\"abort\", pending.abort);\n }\n pending.resolve();\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}\n\nfunction assertPositiveSafeInteger(value: number, name: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`${name} must be a positive safe integer.`);\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 { type AnyTool, createTool, ToolOutput } from \"@anvia/core/tool\";\nimport type { Locator, Page } from \"playwright-core\";\nimport { z } from \"zod\";\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 navigateInput = z.object({\n url: z.url(),\n waitUntil: z.enum([\"commit\", \"domcontentloaded\", \"load\", \"networkidle\"]).optional(),\n});\nconst clickInput = z.object({ target: targetSchema });\nconst typeInput = z.object({ target: targetSchema, text: z.string() });\nconst pressKeyInput = z.object({ key: z.string().min(1).max(100) });\nconst screenshotInput = z.object({});\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);\n case \"browser_open_tab\":\n return createOpenTabTool(connection);\n case \"browser_select_tab\":\n return createSelectTabTool(connection);\n case \"browser_close_tab\":\n return createCloseTabTool(connection);\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);\n case \"browser_screenshot\":\n return createScreenshotTool(connection);\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): 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 () => ({ tabs: await connection.listTabs() }),\n });\n}\n\nfunction createOpenTabTool(connection: Connection): 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) =>\n connection.runAction(context.abortSignal, async () => {\n const page = await connection.openTab();\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createSelectTabTool(connection: Connection): 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.runAction(context.abortSignal, async () =>\n tabResult(connection, connection.selectTab(tabId)),\n ),\n });\n}\n\nfunction createCloseTabTool(connection: Connection): 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.runAction(context.abortSignal, async () => {\n await connection.closeTab(tabId);\n return { closedTabId: tabId, tabs: await connection.tabSummaries() };\n }),\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: \"Navigate the selected Chromium tab to an allowed HTTP or HTTPS URL.\",\n inputSchema: navigateInput,\n execute: async ({ url, waitUntil }, context) =>\n connection.runAction(context.abortSignal, async () => {\n assertNavigationAllowed(url, policy);\n const page = connection.selectedPage();\n await page.goto(url, {\n timeout: timeoutMs,\n waitUntil: waitUntil ?? \"load\",\n });\n assertNavigationAllowed(page.url(), policy);\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createSnapshotTool(connection: Connection, timeoutMs: number, maxChars: number): AnyTool {\n return createTool({\n name: \"browser_snapshot\",\n description: \"Inspect the selected tab using a bounded ARIA accessibility snapshot.\",\n inputSchema: noInput,\n execute: async (_args, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n const snapshot = await page.locator(\"body\").ariaSnapshot({ timeout: timeoutMs });\n const truncated = snapshot.length > maxChars;\n return {\n ...(await tabResult(connection, page)),\n snapshot: truncated ? snapshot.slice(0, maxChars) : snapshot,\n truncated,\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 the selected tab.\",\n inputSchema: clickInput,\n execute: async ({ target }, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n await locatorFor(page, target).click({ timeout: timeoutMs });\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createTypeTool(connection: Connection, timeoutMs: number): AnyTool {\n return createTool({\n name: \"browser_type\",\n description: \"Replace the value of one strictly matched editable element.\",\n inputSchema: typeInput,\n execute: async ({ target, text }, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n await locatorFor(page, target).fill(text, { timeout: timeoutMs });\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createPressKeyTool(connection: Connection): AnyTool {\n return createTool({\n name: \"browser_press_key\",\n description: \"Press an explicit keyboard key or key combination in the selected tab.\",\n inputSchema: pressKeyInput,\n execute: async ({ key }, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n await page.keyboard.press(key);\n return tabResult(connection, page);\n }),\n });\n}\n\nfunction createScreenshotTool(connection: Connection): AnyTool {\n return createTool({\n name: \"browser_screenshot\",\n description: \"Capture the visible viewport of the selected Chromium tab as PNG.\",\n inputSchema: screenshotInput,\n execute: async (_args, context) =>\n connection.runAction(context.abortSignal, async () => {\n const page = connection.selectedPage();\n const png = await page.screenshot({ type: \"png\", fullPage: false });\n const metadata = await tabResult(connection, page);\n return ToolOutput.content([\n { type: \"text\", text: JSON.stringify(metadata) },\n {\n type: \"file\",\n data: { type: \"data\", data: png.toString(\"base64\") },\n mediaType: \"image/png\",\n filename: \"browser-screenshot.png\",\n },\n ]);\n }),\n });\n}\n\nasync function tabResult(connection: Connection, page: Page) {\n return {\n tabId: connection.idFor(page),\n title: await page.title(),\n url: page.url(),\n };\n}\n\ntype BrowserTarget = z.infer<typeof targetSchema>;\n\nfunction locatorFor(page: Page, target: BrowserTarget): Locator {\n switch (target.by) {\n case \"role\": {\n const options: { name?: string; exact?: boolean } = {};\n if (target.name !== undefined) options.name = target.name;\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByRole(target.role as never, options);\n }\n case \"text\": {\n const options: { exact?: boolean } = {};\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByText(target.text, options);\n }\n case \"label\": {\n const options: { exact?: boolean } = {};\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByLabel(target.label, options);\n }\n case \"placeholder\": {\n const options: { exact?: boolean } = {};\n if (target.exact !== undefined) options.exact = target.exact;\n return page.getByPlaceholder(target.placeholder, options);\n }\n case \"test-id\":\n return page.getByTestId(target.testId);\n case \"css\":\n return page.locator(target.selector);\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":["randomUUID","randomUUID","isRecord","assertPositiveSafeInteger","isRecord","isNavigationAllowed"]}
|
package/image/Dockerfile
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
FROM mcr.microsoft.com/playwright:v1.
|
|
1
|
+
FROM mcr.microsoft.com/playwright:v1.62.1-noble
|
|
2
2
|
|
|
3
|
-
ARG PLAYWRIGHT_VERSION=1.
|
|
3
|
+
ARG PLAYWRIGHT_VERSION=1.62.1
|
|
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.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Visible Chromium runtime and semantic browser tools for Anvia agents.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -28,19 +28,19 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"playwright-core": "1.
|
|
31
|
+
"playwright-core": "1.62.1",
|
|
32
32
|
"zod": "^4.4.3",
|
|
33
|
-
"@anvia/sandbox": "1.0.
|
|
33
|
+
"@anvia/sandbox": "1.0.2"
|
|
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.0.
|
|
40
|
+
"@anvia/core": "1.0.2"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@anvia/core": "1.0.
|
|
43
|
+
"@anvia/core": "1.0.2"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|
|
46
46
|
"node": ">=20.12.0"
|