effect-browserbase 0.1.0-beta.104 → 0.2.0-beta.0
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 +61 -305
- package/dist/Account.d.mts +4 -6
- package/dist/Account.mjs +4 -9
- package/dist/Account.mjs.map +1 -1
- package/dist/{Acquisition-WBafHwXH.mjs → Acquisition-D8o4jtCg.mjs} +22 -68
- package/dist/Acquisition-D8o4jtCg.mjs.map +1 -0
- package/dist/Agents.d.mts +4 -6
- package/dist/Agents.mjs +3 -19
- package/dist/Agents.mjs.map +1 -1
- package/dist/Allocation.d.mts +9 -11
- package/dist/Allocation.mjs +2 -4
- package/dist/Allocation.mjs.map +1 -1
- package/dist/Browser.d.mts +23 -141
- package/dist/Browser.mjs +208 -164
- package/dist/Browser.mjs.map +1 -1
- package/dist/BrowserBinding.d.mts +7 -34
- package/dist/BrowserBinding.mjs +30 -1
- package/dist/BrowserBinding.mjs.map +1 -0
- package/dist/Certificates.d.mts +3 -5
- package/dist/Certificates.mjs +2 -7
- package/dist/Certificates.mjs.map +1 -1
- package/dist/{Cleanup-G2YpTCuU.d.mts → Cleanup-DMTDBir8.d.mts} +5 -6
- package/dist/Cleanup.d.mts +3 -2
- package/dist/Cleanup.mjs +1 -6
- package/dist/Cleanup.mjs.map +1 -1
- package/dist/{Client-D1_xYM9o.mjs → Client-BQteUePT.mjs} +2 -4
- package/dist/{Client-D1_xYM9o.mjs.map → Client-BQteUePT.mjs.map} +1 -1
- package/dist/Client.d.mts +51 -2
- package/dist/Client.mjs +1 -1
- package/dist/Connection-DcvJZEdc.mjs +65 -0
- package/dist/Connection-DcvJZEdc.mjs.map +1 -0
- package/dist/ContextCoordination.d.mts +5 -6
- package/dist/ContextCoordination.mjs +1 -8
- package/dist/ContextCoordination.mjs.map +1 -1
- package/dist/Contexts.d.mts +4 -6
- package/dist/Contexts.mjs +2 -8
- package/dist/Contexts.mjs.map +1 -1
- package/dist/Downloads.d.mts +6 -8
- package/dist/Downloads.mjs +3 -8
- package/dist/Downloads.mjs.map +1 -1
- package/dist/Errors.d.mts +3 -26
- package/dist/Errors.mjs +1 -137
- package/dist/Errors.mjs.map +1 -1
- package/dist/{Extensions-ClZbYb1H.mjs → Extensions-nMNMPGCc.mjs} +3 -9
- package/dist/{Extensions-ClZbYb1H.mjs.map → Extensions-nMNMPGCc.mjs.map} +1 -1
- package/dist/Extensions.d.mts +4 -6
- package/dist/Extensions.mjs +1 -1
- package/dist/Functions.d.mts +4 -6
- package/dist/Functions.mjs +3 -17
- package/dist/Functions.mjs.map +1 -1
- package/dist/{Launch-BHcAEq05.mjs → Launch-m0fxzJ49.mjs} +5 -5
- package/dist/Launch-m0fxzJ49.mjs.map +1 -0
- package/dist/Launch.d.mts +130 -2
- package/dist/Launch.mjs +4 -11
- package/dist/Launch.mjs.map +1 -1
- package/dist/PageFetch.d.mts +3 -5
- package/dist/PageFetch.mjs +2 -8
- package/dist/PageFetch.mjs.map +1 -1
- package/dist/Projects.d.mts +3 -5
- package/dist/Projects.mjs +2 -8
- package/dist/Projects.mjs.map +1 -1
- package/dist/Recordings.d.mts +6 -8
- package/dist/Recordings.mjs +3 -5
- package/dist/Recordings.mjs.map +1 -1
- package/dist/{References-URDAtapt.d.mts → References-DOH3Wu44.d.mts} +5 -6
- package/dist/References.d.mts +3 -2
- package/dist/References.mjs +10 -18
- package/dist/References.mjs.map +1 -1
- package/dist/Replays.d.mts +6 -8
- package/dist/Replays.mjs +3 -5
- package/dist/Replays.mjs.map +1 -1
- package/dist/Search.d.mts +3 -5
- package/dist/Search.mjs +2 -9
- package/dist/Search.mjs.map +1 -1
- package/dist/{SessionData-DRKcKCqw.d.mts → SessionData-5xYZDshJ.d.mts} +5 -6
- package/dist/SessionData.d.mts +3 -2
- package/dist/SessionData.mjs +1 -8
- package/dist/SessionData.mjs.map +1 -1
- package/dist/{Sessions-CtbseWEh.mjs → Sessions-DoQGg9nB.mjs} +34 -18
- package/dist/Sessions-DoQGg9nB.mjs.map +1 -0
- package/dist/{Sessions-B8E4kMxo.d.mts → Sessions-tFJYaXFq.d.mts} +8 -8
- package/dist/Sessions.d.mts +4 -3
- package/dist/Sessions.mjs +1 -1
- package/dist/{Transfers-Czv5IZzJ.d.mts → Transfers-GVqzrDWl.d.mts} +22 -9
- package/dist/Transfers.d.mts +3 -2
- package/dist/Transfers.mjs +12 -28
- package/dist/Transfers.mjs.map +1 -1
- package/dist/Uploads.d.mts +6 -8
- package/dist/Uploads.mjs +3 -5
- package/dist/Uploads.mjs.map +1 -1
- package/dist/Webhooks.d.mts +3 -5
- package/dist/Webhooks.mjs +2 -11
- package/dist/Webhooks.mjs.map +1 -1
- package/dist/{WriterFacts-osvYAsIx.d.mts → WriterFacts-5CPBGG1P.d.mts} +4 -3
- package/dist/index.d.mts +27 -31
- package/dist/index.mjs +26 -31
- package/package.json +3 -28
- package/dist/Acquisition-WBafHwXH.mjs.map +0 -1
- package/dist/Association-CEps4hYP.mjs +0 -10
- package/dist/Association-CEps4hYP.mjs.map +0 -1
- package/dist/Bootstrap-BXuzZojd.mjs +0 -194
- package/dist/Bootstrap-BXuzZojd.mjs.map +0 -1
- package/dist/Bootstrap-m7lHgj0D.d.mts +0 -177
- package/dist/Bootstrap.d.mts +0 -2
- package/dist/Bootstrap.mjs +0 -2
- package/dist/BrowserBinding-DlJTGYZL.mjs +0 -2508
- package/dist/BrowserBinding-DlJTGYZL.mjs.map +0 -1
- package/dist/BrowserData-LpcAuAub.d.mts +0 -369
- package/dist/BrowserData.d.mts +0 -2
- package/dist/BrowserData.mjs +0 -442
- package/dist/BrowserData.mjs.map +0 -1
- package/dist/Capture-Bc0z9IAi.mjs +0 -571
- package/dist/Capture-Bc0z9IAi.mjs.map +0 -1
- package/dist/Capture-BvWI-l1A.d.mts +0 -168
- package/dist/Capture.d.mts +0 -2
- package/dist/Capture.mjs +0 -2
- package/dist/Client-Ca0zSg1n.d.mts +0 -53
- package/dist/Images-DgscEfSf.mjs +0 -127
- package/dist/Images-DgscEfSf.mjs.map +0 -1
- package/dist/Launch-BHcAEq05.mjs.map +0 -1
- package/dist/Launch-C8CfaYxb.d.mts +0 -132
- package/dist/LocalBrowser-BLancJ3R.d.mts +0 -79
- package/dist/LocalBrowser-DsQLWNL1.mjs +0 -439
- package/dist/LocalBrowser-DsQLWNL1.mjs.map +0 -1
- package/dist/LocalBrowser.d.mts +0 -2
- package/dist/LocalBrowser.mjs +0 -2
- package/dist/PageControl.d.mts +0 -16
- package/dist/PageControl.mjs +0 -36
- package/dist/PageControl.mjs.map +0 -1
- package/dist/PageControlAssociation-DabEg5AR.mjs +0 -10
- package/dist/PageControlAssociation-DabEg5AR.mjs.map +0 -1
- package/dist/Session-D4nT9hOO.mjs +0 -1379
- package/dist/Session-D4nT9hOO.mjs.map +0 -1
- package/dist/Sessions-CtbseWEh.mjs.map +0 -1
- package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserBinding-DlJTGYZL.mjs","names":[],"sources":["../src/internal/browser/Binding.ts","../src/internal/browser/Actions.ts","../src/internal/browser/CallbackTasks.ts","../src/internal/browser/CaptureSource.ts","../src/internal/browser/NativeBindings.ts","../src/internal/browser/Initialization.ts","../src/internal/browser/Keyboard.ts","../src/internal/browser/PageExecution.ts","../src/internal/browser/NativePageControl.ts","../src/internal/browser/PageRead.ts","../src/internal/browser/Observation.ts","../src/internal/browser/Pointer.ts","../src/internal/browser/Targets.ts","../src/internal/browser/Playwright.ts","../src/BrowserBinding.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { BrowserError, InitializationError } from \"../../Errors.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\n\n/** What the owner asks of a native engine for one connection attempt. */\nexport interface ConnectRequest {\n /** The provider-issued connection address, unvalidated. */\n readonly connection: unknown;\n readonly options: DriverOptions;\n readonly events: DriverEvents;\n /** A connection that completes after the attempt was interrupted is disposed through this. */\n readonly onAbandoned: () => void;\n /** Called once the native attempt settles, whether or not anyone still waits for it. */\n readonly onSettled: () => void;\n}\n\nexport interface BindingImplementation {\n readonly connect: (\n request: ConnectRequest,\n ) => Effect.Effect<Driver, BrowserError | InitializationError>;\n}\n\n/**\n * A native attempt as a Promise with its own abort signal. Interruption aborts the signal; a\n * connection that still arrives afterwards is fenced and disconnected here, so a late native\n * success can never become a live, unowned browser.\n */\nexport type NativeAttempt = (request: ConnectRequest, signal: AbortSignal) => Promise<Driver>;\n\nexport const fromNativeAttempt = (attempt: NativeAttempt): BindingImplementation => ({\n connect: (request) =>\n Effect.tryPromise({\n try: (signal) => {\n const pending = attempt(request, signal).then(async (driver) => {\n if (signal.aborted) {\n request.onAbandoned();\n driver.fenceInitialization?.();\n await driver.disconnect().catch(() => {});\n throw BrowserError.make({ operation: \"connect\", reason: \"interrupted\" });\n }\n\n return driver;\n });\n\n void pending.then(request.onSettled, request.onSettled);\n\n return pending;\n },\n catch: (error) =>\n Schema.is(InitializationError)(error)\n ? error\n : publicError(error, \"connect\", { reason: \"provider\" }),\n }),\n});\n\n/**\n * Binding identity is issuance, never shape: a value that merely looks like a binding has no\n * entry here and cannot reach the owner, so only this package's constructors supply an engine.\n */\nconst issued = new WeakMap<object, BindingImplementation>();\n\nexport const issueBinding = <B extends object>(\n binding: B,\n implementation: BindingImplementation,\n) => {\n issued.set(binding, implementation);\n\n return Object.freeze(binding);\n};\n\nexport const bindingImplementation = (binding: object): BindingImplementation | undefined =>\n issued.get(binding);\n","import { Schema } from \"effect\";\nimport type { BrowserContext, Download, ElementHandle, FileChooser, Frame } from \"playwright-core\";\n\nimport type { ObservedElement } from \"../../BrowserData.ts\";\nimport { SafeFilename } from \"../../Transfers.ts\";\nimport type { Driver, NativeFileSelection } from \"./Driver.ts\";\nimport {\n closeWithin,\n failure,\n type NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy, Observation } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nexport const waitEvent = <A>(\n add: (listener: (value: A) => void) => void,\n remove: (listener: (value: A) => void) => void,\n ticket: Ticket,\n accepts: (value: A) => boolean = () => true,\n) => {\n let done = false;\n let resolve: (value: A) => void = () => {};\n let reject: (error: NativeFailure) => void = () => {};\n\n const promise = new Promise<A>((yes, no) => {\n resolve = yes;\n reject = no;\n });\n\n // Attach a rejection observer immediately, even while the action is still running.\n void promise.catch(() => {});\n\n const cleanup = () => {\n remove(listener);\n ticket.signal.removeEventListener(\"abort\", abort);\n clearTimeout(timer);\n };\n\n const abort = () => {\n if (!done) {\n done = true;\n cleanup();\n reject(failure(\"interrupted\"));\n }\n };\n\n const listener = (value: A) => {\n if (!done && accepts(value)) {\n done = true;\n cleanup();\n resolve(value);\n }\n };\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n cleanup();\n reject(failure(\"timeout\"));\n }\n }, ticket.remainingMillis());\n\n add(listener);\n ticket.signal.addEventListener(\"abort\", abort, { once: true });\n if (ticket.signal.aborted) abort();\n\n return { promise, cancel: abort };\n};\n\n/**\n * In-memory bytes and provider-stored paths reach the page by different mechanisms and are\n * never mixed: the first is streamed from this client, the second is opened by the browser\n * process itself. A mixed request is a configuration error, not a native surprise later.\n */\nexport const nativeSelection = (\n files: ReadonlyArray<NativeFileSelection>,\n):\n | {\n readonly _tag: \"Inline\";\n readonly payload: Array<{ name: string; mimeType: string; buffer: Buffer }>;\n }\n | { readonly _tag: \"Remote\"; readonly paths: Array<string> } => {\n if (files.length === 0) throw failure(\"configuration\", \"undispatched\");\n const inline = files.filter((file) => file._tag === \"Inline\");\n const remote = files.filter((file) => file._tag === \"Remote\");\n\n // The maintained native API encodes a Node Buffer; this lazily loaded driver already\n // requires the Node-only Playwright peer, so the conversion belongs here and nowhere else.\n if (inline.length === files.length) {\n return {\n _tag: \"Inline\",\n payload: inline.map((file) => ({\n name: file.name,\n mimeType: file.mediaType,\n buffer: Buffer.from(file.bytes),\n })),\n };\n }\n if (remote.length === files.length)\n return { _tag: \"Remote\", paths: remote.map((file) => file.path) };\n throw failure(\"configuration\", \"undispatched\");\n};\n\n/**\n * Input to the selected document. A mutation marks its ticket dispatched immediately before the\n * one native command that may change the page; any outcome after that point is uncertain.\n */\nexport const makeActions = (\n context: BrowserContext,\n targets: Targets,\n observation: Observation,\n) => {\n const { current } = targets;\n let downloadSerial = 0;\n\n /** A result URL is only ever an http(s) address without credentials. */\n const httpUrl = (value: string) => {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw failure(\"malformed\");\n }\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password)\n throw failure(\"malformed\");\n\n return value;\n };\n\n const postUrl = () => httpUrl(targets.selectedUrl());\n\n /**\n * Acts on the exact attached node a target names. The observation seam establishes that it is\n * still the control that was inspected and that the host's policy, if any, admits it. `admit`\n * then sees that node before anything is dispatched, so a refusal it raises is undispatched\n * too, and what it learns reaches the action without the node being resolved a second time.\n */\n const withAdmittedElement = async <Admitted, A>(\n target: string | ObservedElement,\n ticket: Ticket,\n admit: (element: ElementHandle<Element>) => Promise<Admitted>,\n action: (element: ElementHandle<Element>, admitted: Admitted) => Promise<A>,\n policy?: AdmissionPolicy,\n ): Promise<A> => {\n const { element, kept } = await observation.resolve(target, ticket, policy);\n\n try {\n const admitted = await admit(element);\n\n ticket.check();\n // ElementHandle actions do not re-resolve the selector onto a replacement node.\n ticket.dispatch();\n\n return await action(element, admitted);\n } finally {\n if (!kept) await closeWithin(() => element.dispose()).catch(() => {});\n }\n };\n\n const withElement = <A>(\n target: string | ObservedElement,\n ticket: Ticket,\n action: (element: ElementHandle<Element>) => Promise<A>,\n policy?: AdmissionPolicy,\n ): Promise<A> => withAdmittedElement(target, ticket, async () => {}, action, policy);\n\n const click = (target: string | ObservedElement, ticket: Ticket, policy?: AdmissionPolicy) =>\n sanitize(async () => {\n await withElement(\n target,\n ticket,\n (element) => element.click({ timeout: timeout(ticket) }),\n policy,\n );\n ticket.check();\n\n return postUrl();\n });\n\n /**\n * A file the provider already stores is named to the browser process, which opens it; this\n * client never reads that path. Exactly one main-frame node may match, and exactly one\n * command dispatches. A retained node or child frame is refused rather than approximated.\n */\n const attachStoredFiles = async (\n target: string | ObservedElement,\n paths: ReadonlyArray<string>,\n ticket: Ticket,\n ) => {\n if (typeof target !== \"string\") throw failure(\"unsupported\", \"undispatched\");\n const { entry, frame } = current();\n\n if (frame !== entry.page.mainFrame()) throw failure(\"unsupported\", \"undispatched\");\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n ticket.check();\n\n const root = safeDecode(\n Schema.Struct({ root: Schema.Struct({ nodeId: Schema.Int }) }),\n await cdp.send(\"DOM.getDocument\", { depth: 0 }),\n );\n\n const matched = safeDecode(\n Schema.Struct({ nodeIds: Schema.Array(Schema.Int).check(Schema.isMaxLength(64)) }),\n await cdp.send(\"DOM.querySelectorAll\", { nodeId: root.root.nodeId, selector: target }),\n );\n\n ticket.check();\n const nodeId = matched.nodeIds[0];\n\n if (matched.nodeIds.length !== 1 || nodeId === undefined)\n throw failure(matched.nodeIds.length === 0 ? \"not-found\" : \"ambiguous\", \"undispatched\");\n ticket.dispatch();\n await cdp.send(\"DOM.setFileInputFiles\", { files: [...paths], nodeId });\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n };\n\n const beginNavigation: Driver[\"beginNavigation\"] = (url, timeoutMillis, ticket) =>\n sanitize(async () => {\n const { entry, frame } = current();\n\n ticket.dispatch();\n targets.navigating.begin(entry.id);\n\n // Not awaited here: the permit that dispatched it is released while the browser loads.\n const settled = sanitize(async () => {\n try {\n await frame.goto(url, { waitUntil: \"domcontentloaded\", timeout: timeoutMillis });\n } finally {\n targets.navigating.end(entry.id);\n }\n\n // The frame that navigated, not whatever is selected by the time it finishes.\n return httpUrl(targets.urlOf(frame));\n });\n\n // Whoever awaits it sees the failure; a caller that never does raises nothing unhandled.\n void settled.catch(() => {});\n\n return {\n pageId: entry.id,\n settled,\n stop: () =>\n sanitize(async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n await cdp.send(\"Page.stopLoading\");\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n }),\n };\n });\n\n const fill: Driver[\"fill\"] = (target, value, ticket, policy) =>\n sanitize(async () => {\n await withElement(\n target,\n ticket,\n (element) => element.fill(value, { timeout: timeout(ticket) }),\n policy,\n );\n ticket.check();\n\n return postUrl();\n });\n\n const scroll: Driver[\"scroll\"] = (deltaX, deltaY, ticket) =>\n sanitize(async () => {\n const { frame } = current();\n\n ticket.dispatch();\n await frame.evaluate(\n ({ x, y }) => window.scrollBy({ left: x, top: y, behavior: \"instant\" }),\n { x: deltaX, y: deltaY },\n );\n ticket.check();\n\n return postUrl();\n });\n\n const waitFor: Driver[\"waitFor\"] = (selector, state, ticket) =>\n sanitize(async () => {\n const node = await current().frame.waitForSelector(selector, {\n state,\n strict: true,\n timeout: timeout(ticket),\n });\n\n await node?.dispose();\n ticket.check();\n });\n\n const clickAndWait: Driver[\"clickAndWait\"] = (target, ticket) =>\n sanitize(async () => {\n const { entry, frame } = current();\n\n const observer = waitEvent<Frame>(\n (on) => entry.page.on(\"framenavigated\", on),\n (off) => entry.page.off(\"framenavigated\", off),\n ticket,\n (changedFrame) => changedFrame === frame,\n );\n\n try {\n await click(target, ticket);\n await observer.promise;\n await frame.waitForLoadState(\"domcontentloaded\", { timeout: timeout(ticket) });\n ticket.check();\n\n return postUrl();\n } finally {\n observer.cancel();\n }\n });\n\n const clickForDownload: Driver[\"clickForDownload\"] = (target, ticket) =>\n sanitize(async () => {\n const page = current().entry.page;\n\n const observer = waitEvent<Download>(\n (on) => page.on(\"download\", on),\n (off) => page.off(\"download\", off),\n ticket,\n );\n\n try {\n await click(target, ticket);\n const download = await observer.promise;\n\n const filename = safeDecode(SafeFilename, download.suggestedFilename());\n\n const error = await download.failure();\n\n ticket.check();\n\n return {\n downloadId: `native-download-${++downloadSerial}`,\n filename,\n state: error === null ? \"completed\" : \"failed\",\n };\n } finally {\n observer.cancel();\n }\n });\n\n const selectFiles: Driver[\"selectFiles\"] = (target, files, ticket) =>\n sanitize(async () => {\n const selection = nativeSelection(files);\n\n if (selection._tag === \"Remote\") await attachStoredFiles(target, selection.paths, ticket);\n else\n await withElement(target, ticket, (element) =>\n element.setInputFiles(selection.payload, { timeout: timeout(ticket) }),\n );\n ticket.check();\n\n return postUrl();\n });\n\n const clickForFileSelection: Driver[\"clickForFileSelection\"] = (target, files, ticket) =>\n sanitize(async () => {\n const selection = nativeSelection(files);\n\n // A chooser is satisfied with bytes this client holds. A provider-stored file is\n // attached to an exact input node instead, where the browser can open the path.\n if (selection._tag === \"Remote\") throw failure(\"unsupported\", \"undispatched\");\n const page = current().entry.page;\n\n const observer = waitEvent<FileChooser>(\n (on) => page.on(\"filechooser\", on),\n (off) => page.off(\"filechooser\", off),\n ticket,\n );\n\n try {\n await click(target, ticket);\n const chooser = await observer.promise;\n\n ticket.check();\n if (!chooser.isMultiple() && selection.payload.length > 1) throw failure(\"unsupported\");\n // Exactly one attachment for this chooser; a second would open another dispatch.\n await chooser.setFiles(selection.payload, { timeout: timeout(ticket) });\n ticket.check();\n\n return postUrl();\n } finally {\n observer.cancel();\n }\n });\n\n return {\n withAdmittedElement,\n beginNavigation,\n click,\n fill,\n scroll,\n waitFor,\n clickAndWait,\n clickForDownload,\n selectFiles,\n clickForFileSelection,\n };\n};\n","export type CallbackFailureMode = \"reject-call\" | \"fail-session\";\n\n/** Native callbacks cannot await a Semaphore. Reserve a bounded slot synchronously\n * before starting native work; never construct an already-running Promise first.\n * Fail-session pressure/failure fences the connection once. Reject-call pressure or\n * failure remains local to that invocation and reopens admission when accepted work\n * settles. Accepted rejections remain observed after close, and no callback-side Fiber\n * or unbounded producer queue is created. */\nexport class CallbackTasks {\n private readonly pending = new Set<Promise<void>>();\n private stopped = false;\n private faulted = false;\n\n private readonly capacity: number;\n private readonly onFault: () => void;\n\n constructor(capacity: number, onFault: () => void) {\n if (!Number.isSafeInteger(capacity) || capacity < 1)\n throw new RangeError(\"Invalid callback capacity\");\n this.capacity = capacity;\n this.onFault = onFault;\n }\n\n private fault(): void {\n if (this.stopped || this.faulted) return;\n this.faulted = true;\n this.onFault();\n }\n\n submit(\n action: () => Promise<unknown>,\n failureMode: CallbackFailureMode = \"fail-session\",\n ): boolean {\n if (this.stopped || this.faulted) return false;\n if (this.pending.size >= this.capacity) {\n if (failureMode === \"fail-session\") this.fault();\n\n return false;\n }\n\n const task = Promise.resolve()\n .then(action)\n .then(\n () => {},\n () => {\n if (failureMode === \"fail-session\") this.fault();\n },\n )\n .finally(() => this.pending.delete(task));\n\n this.pending.add(task);\n\n return true;\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n async settle(): Promise<void> {\n await Promise.all(this.pending);\n }\n}\n","import type { Frame } from \"playwright-core\";\n\nimport type {\n CaptureBinding,\n CaptureInvalidation,\n CaptureSource,\n CaptureTarget,\n NativeFrame,\n} from \"./Driver.ts\";\nimport { failure, sanitize } from \"./NativeCalls.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\ninterface CaptureWatcher {\n readonly frameId: string;\n readonly invalidate: (reason: CaptureInvalidation) => void;\n readonly document?: (url: string) => void;\n}\n\n/**\n * Screencast sources bound to one page and frame, and the watchers that learn when that binding\n * stops describing what the page shows. A main-frame change invalidates every watcher on the page.\n */\nexport const makeCaptureSources = (targets: Targets) => {\n const { current, entries, frameId } = targets;\n const captureWatchers = new Map<string, Set<CaptureWatcher>>();\n\n const invalidate = (entry: Entry, reason: CaptureInvalidation, frame?: Frame): void => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers === undefined) return;\n const changedFrameId = frame === undefined ? undefined : frameId(frame);\n const mainFrameId = frameId(entry.page.mainFrame());\n\n for (const watcher of [...watchers]) {\n if (\n frame !== undefined &&\n changedFrameId !== mainFrameId &&\n changedFrameId !== watcher.frameId\n )\n continue;\n // The page's screencast keeps running across a main-frame navigation. An interval that\n // follows its page is told a new document began; one bound to a document ends, as before.\n if (\n frame !== undefined &&\n watcher.document !== undefined &&\n reason === \"target-changed\" &&\n changedFrameId === mainFrameId &&\n watcher.frameId === mainFrameId\n )\n // Read inside the navigation event itself: this is the address that just committed.\n watcher.document(frame.url());\n else watcher.invalidate(reason);\n }\n };\n\n const forget = (entry: Entry) => {\n captureWatchers.delete(entry.id);\n };\n\n const clear = () => {\n captureWatchers.clear();\n };\n\n const capture = (target?: CaptureTarget): Promise<CaptureBinding> =>\n sanitize(async () => {\n let entry: Entry;\n let captureFrame: Frame;\n\n if (target === undefined) {\n const selectedTarget = current();\n\n entry = selectedTarget.entry;\n captureFrame = selectedTarget.frame;\n } else {\n const requested = entries.get(target.pageId);\n\n if (requested === undefined || requested.page.isClosed())\n throw failure(\"not-found\", \"undispatched\");\n if ((await targets.targetId(requested)) !== target.targetId)\n throw failure(\"stale\", \"undispatched\");\n entry = requested;\n captureFrame = entry.page.mainFrame();\n }\n const page = entry.page;\n const targetId = await targets.targetId(entry);\n const watchedFrameId = frameId(captureFrame);\n\n // The maintained API is required; older Playwright versions fail explicitly, never silently emulate it.\n if (page.screencast === undefined) throw failure(\"unsupported\");\n let watcherSet: Set<CaptureWatcher> | undefined;\n let watcher: CaptureWatcher | undefined;\n\n const source: CaptureSource = {\n start: ({ receive, quality, size, invalidate, opened, document }) =>\n sanitize(async () => {\n watcherSet = captureWatchers.get(entry.id) ?? new Set<CaptureWatcher>();\n captureWatchers.set(entry.id, watcherSet);\n watcher = {\n frameId: watchedFrameId,\n invalidate,\n ...(document === undefined ? {} : { document }),\n };\n watcherSet.add(watcher);\n // No await separates these two lines, so no navigation event can run between them.\n opened?.(captureFrame.url());\n try {\n await page.screencast.start({\n quality,\n ...(size === undefined ? {} : { size }),\n onFrame: (frame: NativeFrame) => {\n receive(frame);\n },\n });\n } catch (error) {\n watcherSet.delete(watcher);\n watcher = undefined;\n if (watcherSet.size === 0) captureWatchers.delete(entry.id);\n throw error;\n }\n }),\n stop: () =>\n sanitize(async () => {\n if (watcher !== undefined && watcherSet !== undefined) {\n watcherSet.delete(watcher);\n watcher = undefined;\n if (watcherSet.size === 0) captureWatchers.delete(entry.id);\n }\n // A closed target cannot produce more frames; its page channel rejects stop.\n if (page.isClosed()) return;\n try {\n await page.screencast.stop();\n } catch (error) {\n // Closure can race the stop request. A live target still requires quarantine.\n if (!page.isClosed()) throw error;\n }\n }),\n };\n\n return { pageId: entry.id, targetId, frameId: watchedFrameId, source };\n });\n\n return { invalidate, forget, clear, capture };\n};\n","import { Schema } from \"effect\";\nimport type { BrowserContext, CDPSession, Frame, Page } from \"playwright-core\";\n\nimport { InitializationError } from \"../../Errors.ts\";\nimport { Identifier } from \"../../References.ts\";\nimport type { NativeBinding } from \"./Bindings.ts\";\n\nconst ContextCreated = Schema.Struct({\n context: Schema.Struct({\n id: Schema.Int.check(Schema.isGreaterThan(0)),\n uniqueId: Schema.NonEmptyString.check(Schema.isMaxLength(256)),\n origin: Schema.String.check(Schema.isMaxLength(2048)),\n auxData: Schema.optionalKey(Schema.Struct({ isDefault: Schema.Boolean, frameId: Identifier })),\n }),\n});\n\nconst ContextDestroyed = Schema.Struct({ executionContextId: Schema.Int });\nconst TargetIdentity = Schema.Struct({ targetInfo: Schema.Struct({ targetId: Identifier }) });\n\nconst Call = Schema.Struct({\n name: Identifier,\n sequence: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: Number.MAX_SAFE_INTEGER })),\n input: Schema.String.check(Schema.isMaxLength(1024 * 1024)),\n});\n\ntype DocumentIdentity = typeof ContextCreated.Type.context & {\n sequence: number;\n readonly targetId: string;\n};\n\ninterface TargetRegistration {\n readonly cdp: CDPSession;\n readonly documents: Map<number, DocumentIdentity>;\n readonly page: Page;\n readonly off: () => void;\n closed: boolean;\n}\n\nconst error = (step: string, reason: InitializationError[\"reason\"]) =>\n InitializationError.make({ operation: \"callback\", step, reason });\n\n/**\n * A small page-side transport, not a second host scheduler. Each document owns its finite\n * pending replies and one startup timer; host authority always comes from Chromium's native\n * execution-context event, never the fields in this message or a page-reported origin.\n */\nconst pageBundle = (\n nativeName: string,\n controllerName: string,\n bindings: ReadonlyArray<NativeBinding>,\n): string => `(() => {\n const nativeName = ${JSON.stringify(nativeName)};\n const controllerName = ${JSON.stringify(controllerName)};\n if (Object.prototype.hasOwnProperty.call(globalThis, controllerName)) return;\n const definitions = ${JSON.stringify(\n bindings.map(({ name, maxConcurrent, maxInputBytes, timeoutMillis }) => ({\n name,\n maximum: maxConcurrent + 1,\n maxInputBytes,\n timeoutMillis,\n })),\n )};\n const stringify = JSON.stringify.bind(JSON);\n const parse = JSON.parse.bind(JSON);\n const encode = new TextEncoder();\n const descriptors = Object.getOwnPropertyDescriptors;\n const ownKeys = Reflect.ownKeys;\n const prototype = Object.getPrototypeOf;\n const plain = Object.prototype;\n const arrayPrototype = Array.prototype;\n const pending = new Map();\n const functions = new Map();\n const counts = new Map();\n let sequence = 0;\n let closed = false;\n let startup;\n const rejected = () => {\n const value = new Error('Browser binding call rejected');\n value.name = 'BrowserbaseBindingError';\n value.stack = '';\n return value;\n };\n const jsonInput = (value, maximum) => {\n let nodes = 0;\n const ancestors = new Set();\n const visit = (item, depth) => {\n if (++nodes > Math.min(maximum, 65536) || depth > 64) throw rejected();\n if (item === null || typeof item === 'boolean') return;\n if (typeof item === 'string') { if (item.length > maximum) throw rejected(); return; }\n if (typeof item === 'number') { if (!Number.isFinite(item)) throw rejected(); return; }\n if (typeof item !== 'object' || ancestors.has(item)) throw rejected();\n const array = Array.isArray(item);\n const parent = prototype(item);\n if (array ? parent !== arrayPrototype : parent !== plain && parent !== null) throw rejected();\n ancestors.add(item);\n const fields = descriptors(item);\n const keys = ownKeys(fields);\n if (keys.length > Math.min(maximum, 65536)) throw rejected();\n if (array && keys.length !== item.length + 1) throw rejected();\n for (const key of keys) {\n if (array && key === 'length') continue;\n if (typeof key !== 'string' || key.length > maximum || key === 'toJSON') throw rejected();\n const field = fields[key];\n if (!field.enumerable || !Object.prototype.hasOwnProperty.call(field, 'value')) throw rejected();\n if (array && (!/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= item.length)) throw rejected();\n visit(field.value, depth + 1);\n }\n ancestors.delete(item);\n };\n visit(value, 0);\n return stringify(value);\n };\n const settle = (id, packet) => {\n const call = pending.get(id);\n if (!call) return;\n pending.delete(id);\n clearTimeout(call.timer);\n counts.set(call.name, (counts.get(call.name) || 1) - 1);\n if (packet && packet.ok === true) {\n try { call.resolve(parse(packet.text)); } catch { call.reject(rejected()); }\n } else call.reject(rejected());\n };\n const dispatch = () => {\n clearTimeout(startup);\n startup = undefined;\n if (closed) return;\n const native = globalThis[nativeName];\n if (typeof native !== 'function') {\n if (pending.size > 0) startup = setTimeout(dispatch, 10);\n return;\n }\n for (const [id, call] of pending) {\n if (call.sent) continue;\n call.sent = true;\n try { native(call.message); } catch { settle(id); }\n }\n };\n const close = () => {\n if (closed) return;\n closed = true;\n clearTimeout(startup);\n for (const id of [...pending.keys()]) settle(id);\n for (const [name, fn] of functions) {\n if (globalThis[name] === fn) delete globalThis[name];\n }\n };\n const controller = Object.freeze({ deliver: settle, close,\n get status() { return closed ? 'closed' : functions.size === definitions.length ? 'ready' : 'installing'; }\n });\n Object.defineProperty(globalThis, controllerName, { value: controller, configurable: true });\n for (const definition of definitions) {\n if (Object.prototype.hasOwnProperty.call(globalThis, definition.name)) { close(); return; }\n const fn = (...args) => new Promise((resolve, reject) => {\n if (closed || args.length !== 1 || sequence >= Number.MAX_SAFE_INTEGER ||\n (counts.get(definition.name) || 0) >= definition.maximum) {\n reject(rejected()); return;\n }\n let input;\n try {\n input = jsonInput(args[0], definition.maxInputBytes);\n if (typeof input !== 'string' || input.length > definition.maxInputBytes ||\n encode.encode(input).byteLength > definition.maxInputBytes) throw rejected();\n } catch { reject(rejected()); return; }\n const id = ++sequence;\n const timer = setTimeout(() => settle(id), definition.timeoutMillis);\n counts.set(definition.name, (counts.get(definition.name) || 0) + 1);\n pending.set(id, { name: definition.name, resolve, reject, timer, sent: false,\n message: stringify({ name: definition.name, sequence: id, input }) });\n dispatch();\n });\n functions.set(definition.name, fn);\n Object.defineProperty(globalThis, definition.name, { value: fn, configurable: true });\n }\n})();`;\n\n/**\n * The pinned Playwright binding callback reports a Frame but no calling document identity.\n * That Frame survives navigation, so checking frame.url() would authorize an old document\n * using its replacement's origin. Chromium's maintained Runtime binding protocol supplies\n * the original executionContextId; uniqueId prevents context-id reuse when publishing replies.\n * These are child CDP sessions on the existing owned Playwright connection, not another owner,\n * websocket, browser resource or publicly exposed raw-protocol capability.\n */\nexport const makeNativeBindings = (\n context: BrowserContext,\n bindings: ReadonlyArray<NativeBinding>,\n fault: () => void,\n) => {\n const identity = globalThis.crypto.randomUUID().replaceAll(\"-\", \"\");\n const nativeName = `__effect_agent_binding_${identity}`;\n const controllerName = `__effect_agent_bindings_${identity}`;\n const bundle = pageBundle(nativeName, controllerName, bindings);\n const byName = new Map(bindings.map((binding) => [binding.name, binding]));\n const targets = new Map<string, TargetRegistration>();\n const currentDocuments = new Map<string, DocumentIdentity>();\n const attaching = new WeakSet<Page | Frame>();\n // Native replies are bounded too, including rejected calls and late native completions.\n const maximumReplies = 16 + bindings.reduce((sum, binding) => sum + binding.maxConcurrent, 0);\n let replies = 0;\n let closing = false;\n let disposed: Promise<void> | undefined;\n\n const close = () => {\n closing = true;\n };\n\n const attach = async (subject: Page | Frame, page: Page): Promise<void> => {\n if (closing || page.isClosed() || attaching.has(subject)) return;\n attaching.add(subject);\n let cdp: CDPSession | undefined;\n let retained = false;\n\n try {\n try {\n cdp = await context.newCDPSession(subject);\n } catch (cause) {\n // Chromium routes same-process child frames through their parent's target. Only this\n // exact pinned Playwright refusal selects that already-owned session; other failures\n // remain faults rather than silently omitting an out-of-process frame.\n if (\n subject !== page &&\n cause instanceof Error &&\n cause.message.includes(\"This frame does not have a separate CDP session\")\n )\n return;\n if (\n page.isClosed() ||\n (subject !== page && \"isDetached\" in subject && subject.isDetached())\n )\n return;\n throw cause;\n }\n const native = cdp;\n\n const targetId = Schema.decodeSync(TargetIdentity)(await native.send(\"Target.getTargetInfo\"))\n .targetInfo.targetId;\n\n if (closing || page.isClosed() || targets.has(targetId)) return;\n if (targets.size >= 128) throw error(\"bindings\", \"busy\");\n const documents = new Map<number, DocumentIdentity>();\n\n const created = (raw: unknown) => {\n const parsed = Schema.decodeUnknownOption(ContextCreated)(raw);\n\n if (parsed._tag === \"None\") return;\n const value = parsed.value.context;\n\n if (closing || value.auxData?.isDefault !== true) return;\n const prior = documents.get(value.id);\n\n if (prior?.uniqueId === value.uniqueId) return;\n const previous = currentDocuments.get(value.auxData.frameId);\n\n if (previous !== undefined) {\n const previousDocuments = targets.get(previous.targetId)?.documents;\n\n if (previousDocuments?.get(previous.id) === previous)\n previousDocuments.delete(previous.id);\n currentDocuments.delete(value.auxData.frameId);\n }\n if (documents.size >= 128 && !documents.has(value.id)) {\n fault();\n\n return;\n }\n const document = { ...value, sequence: 0, targetId };\n\n // A new default context for the native frame retires the old document even when its\n // destruction event lags a process swap or a back/forward-cache transition.\n currentDocuments.set(value.auxData.frameId, document);\n documents.set(value.id, document);\n };\n\n const destroyed = (raw: unknown) => {\n const parsed = Schema.decodeUnknownOption(ContextDestroyed)(raw);\n\n if (parsed._tag === \"Some\") {\n const document = documents.get(parsed.value.executionContextId);\n const frameId = document?.auxData?.frameId;\n\n if (frameId !== undefined && currentDocuments.get(frameId) === document)\n currentDocuments.delete(frameId);\n documents.delete(parsed.value.executionContextId);\n }\n };\n\n const cleared = () => {\n for (const document of documents.values()) {\n const frameId = document.auxData?.frameId;\n\n if (frameId !== undefined && currentDocuments.get(frameId) === document)\n currentDocuments.delete(frameId);\n }\n documents.clear();\n };\n\n const called = (event: {\n readonly name: string;\n readonly payload: string;\n readonly executionContextId: number;\n }) => {\n if (closing || event.name !== nativeName || replies >= maximumReplies) return;\n const document = documents.get(event.executionContextId);\n\n if (document === undefined || event.payload.length > 2 * 1024 * 1024 + 512) return;\n const parsed = Schema.decodeOption(Schema.fromJsonString(Call))(event.payload);\n\n if (parsed._tag === \"None\") return;\n const call = parsed.value;\n const binding = byName.get(call.name);\n\n if (binding === undefined || call.sequence <= document.sequence) return;\n document.sequence = call.sequence;\n replies++;\n let retired = false;\n\n const check = async (signal: AbortSignal) => {\n const current = () => {\n if (closing || retired || signal.aborted || page.isClosed())\n throw error(binding.name, \"closed\");\n if (\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n throw error(binding.name, \"stale\");\n if (!binding.origins.includes(document.origin)) throw error(binding.name, \"origin\");\n };\n\n current();\n\n const result = await native.send(\"Runtime.evaluate\", {\n expression: \"true\",\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: binding.timeoutMillis,\n });\n\n current();\n if (result.exceptionDetails !== undefined || result.result.value !== true)\n throw error(binding.name, \"stale\");\n };\n\n const reply = async (\n packet: { readonly ok: false } | { readonly ok: true; readonly text: string },\n ) => {\n if (\n closing ||\n page.isClosed() ||\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n return;\n await native.send(\"Runtime.evaluate\", {\n expression: `globalThis[${JSON.stringify(controllerName)}]?.deliver(${call.sequence},${JSON.stringify(packet)})`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: binding.timeoutMillis,\n });\n };\n\n // Runtime admission is synchronous before a consumer fiber or native validation starts.\n // Both branches stay observed even when the source document disappears while settling.\n void binding\n .invoke({\n read: async (signal) => {\n // An environment-free codec can still suspend or invoke host code. Authorize\n // before even decoding, then recheck after decode and before publishing a reply.\n await check(signal);\n\n return call.input;\n },\n check,\n dispose: async () => {\n retired = true;\n },\n })\n .then(\n (text) => reply({ ok: true, text }),\n () => reply({ ok: false }),\n )\n .catch(() => {})\n .finally(() => {\n replies--;\n });\n };\n\n const off = () => {\n native.off(\"Runtime.executionContextCreated\", created);\n native.off(\"Runtime.executionContextDestroyed\", destroyed);\n native.off(\"Runtime.executionContextsCleared\", cleared);\n native.off(\"Runtime.bindingCalled\", called);\n cleared();\n };\n\n const target: TargetRegistration = { cdp: native, documents, page, off, closed: false };\n\n const onClosed = () => {\n target.closed = true;\n off();\n if (targets.get(targetId) === target) targets.delete(targetId);\n native.off(\"close\", onClosed);\n };\n\n native.on(\"close\", onClosed);\n targets.set(targetId, target);\n retained = true;\n native.on(\"Runtime.executionContextCreated\", created);\n native.on(\"Runtime.executionContextDestroyed\", destroyed);\n native.on(\"Runtime.executionContextsCleared\", cleared);\n native.on(\"Runtime.bindingCalled\", called);\n await native.send(\"Runtime.enable\");\n if (closing) return;\n await native.send(\"Runtime.addBinding\", { name: nativeName });\n if (closing) {\n await native.send(\"Runtime.removeBinding\", { name: nativeName }).catch(() => {});\n\n return;\n }\n // Existing documents receive only the callable bridge, never replayed consumer init scripts.\n for (const document of documents.values()) {\n if (closing) return;\n\n const installed = await native.send(\"Runtime.evaluate\", {\n expression: `${bundle}\\nglobalThis[${JSON.stringify(controllerName)}]?.status`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: 2000,\n });\n\n if (\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n continue;\n if (installed.exceptionDetails !== undefined || installed.result.value !== \"ready\")\n throw InitializationError.make({\n operation: \"register\",\n step: \"bindings\",\n reason: \"configuration\",\n });\n }\n } finally {\n attaching.delete(subject);\n if (cdp !== undefined && (!retained || closing)) await cdp.detach().catch(() => {});\n }\n };\n\n const dispose = (): Promise<void> => {\n close();\n disposed ??= (async () => {\n const settled = await Promise.allSettled(\n [...targets.values()].map(async (target) => {\n const documents = [...target.documents.values()];\n\n target.off();\n\n const removal = await Promise.allSettled([\n (async () => {\n if (!target.closed && !target.page.isClosed()) {\n for (const document of documents) {\n await target.cdp\n .send(\"Runtime.evaluate\", {\n expression: `globalThis[${JSON.stringify(controllerName)}]?.close()`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: 1000,\n })\n .catch(() => {});\n }\n if (!target.closed)\n await target.cdp.send(\"Runtime.removeBinding\", { name: nativeName });\n }\n })(),\n ]);\n\n // Always attempt detach without overwriting an earlier removal failure. A native\n // target close is terminal evidence; an arbitrary transport error is not.\n const wasClosed = target.closed || target.page.isClosed();\n\n const detachment = await Promise.allSettled([\n target.closed ? Promise.resolve() : target.cdp.detach(),\n ]);\n\n if (!wasClosed && removal.some((result) => result.status === \"rejected\"))\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n if (\n !target.closed &&\n !target.page.isClosed() &&\n detachment.some((result) => result.status === \"rejected\")\n )\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n }),\n );\n\n targets.clear();\n currentDocuments.clear();\n if (settled.some((result) => result.status === \"rejected\"))\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n })();\n\n return disposed;\n };\n\n return { bundle, attach, close, dispose };\n};\n","import { Schema } from \"effect\";\nimport type { BrowserContext, Disposable, Frame, Page } from \"playwright-core\";\n\nimport { InitializationError } from \"../../Errors.ts\";\nimport type { CompiledBootstrap } from \"./Bootstrap.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type { Driver, DriverEvents, DriverOptions, ReadinessState } from \"./Driver.ts\";\nimport { makeNativeBindings } from \"./NativeBindings.ts\";\nimport { failure, NativeFailure, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\n/**\n * The connection's bootstrap registrations and native bindings, and the readiness of the selected\n * document under that bootstrap. Fencing is synchronous; disposal removes what was registered.\n */\nexport const makeInitialization = (\n context: BrowserContext,\n options: DriverOptions,\n targets: Targets,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n) => {\n const { current, entries, epochOf } = targets;\n const registeredEpochs = new WeakMap<Frame, number>();\n const readyDocuments = new WeakMap<Frame, number>();\n const registrations: Disposable[] = [];\n let initializationClosed = false;\n let disposal: Promise<void> | undefined;\n\n const initializationFault = (error: InitializationError) => {\n if (closing() || initializationClosed) return;\n if (options.onBindingFault === undefined) events.fault();\n else options.onBindingFault(error);\n };\n\n const bindingTask = (action: () => Promise<void>) => {\n const admitted = callbacks.submit(async () => {\n try {\n await action();\n } catch (cause) {\n initializationFault(\n Schema.is(InitializationError)(cause)\n ? cause\n : InitializationError.make({\n operation: \"register\",\n step: \"bindings\",\n reason: \"native\",\n }),\n );\n }\n }, \"reject-call\");\n\n if (!admitted)\n initializationFault(\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason: \"busy\" }),\n );\n };\n\n const bindings =\n options.bindings === undefined || options.bindings.length === 0\n ? undefined\n : makeNativeBindings(context, options.bindings, () =>\n initializationFault(\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason: \"busy\" }),\n ),\n );\n\n const attach = async (page: Page) => {\n if (bindings === undefined) return;\n await bindings.attach(page, page);\n for (const frame of page.frames())\n if (frame !== page.mainFrame()) await bindings.attach(frame, page);\n };\n\n const fence = () => {\n initializationClosed = true;\n bindings?.close();\n };\n\n const dispose = (): Promise<void> => {\n fence();\n disposal ??= (async () => {\n const outcomes = await Promise.allSettled([\n ...registrations.splice(0).map((registration) => registration.dispose()),\n ...(bindings === undefined ? [] : [bindings.dispose()]),\n ]);\n\n if (outcomes.some((result) => result.status === \"rejected\")) throw failure(\"provider\");\n })();\n\n return disposal;\n };\n\n /** Attaches a page this connection registered after initialization, off the event path. */\n const attachPage = (page: Page) => {\n if (bindings !== undefined) bindingTask(() => attach(page));\n };\n\n /** Attaches the new document of a frame that navigated after initialization. */\n const attachFrame = (frame: Frame, page: Page) => {\n if (bindings !== undefined) bindingTask(() => bindings.attach(frame, page));\n };\n\n /**\n * Registrations are installed once per connection and before this connection creates any\n * document. Documents that were already running keep their recorded epoch, so the readiness\n * policy can tell them apart from documents that actually ran the bundle.\n */\n const install = async () => {\n const bootstrap = options.bootstrap;\n\n if (bootstrap === undefined && bindings === undefined) return;\n for (const entry of entries.values())\n for (const frame of entry.page.frames()) registeredEpochs.set(frame, epochOf(frame));\n // Host capabilities precede the bundle: a step may depend on a granted capability.\n for (const grant of bootstrap?.permissions ?? [])\n await context.grantPermissions([...grant.permissions], { origin: grant.origin });\n\n // One bundle guarantees callable wrappers exist before dependent init steps. Ordering\n // between two Playwright addInitScript registrations is intentionally not assumed.\n const content = [bindings?.bundle, bootstrap?.bundle]\n .filter((part) => part !== undefined)\n .join(\"\\n\");\n\n if (content.length > 0) {\n const registration = await context.addInitScript({ content });\n\n if (initializationClosed) await registration.dispose();\n else registrations.push(registration);\n }\n };\n\n const documentOrigin = (frame: Frame): string => {\n try {\n const url = new URL(frame.url());\n\n return [\"http:\", \"https:\"].includes(url.protocol) ? url.origin : \"\";\n } catch {\n return \"\";\n }\n };\n\n /** A finite wait for a page promise. Native work continues; only this wait is bounded. */\n const evaluateWithin = async (\n frame: Frame,\n expression: string,\n milliseconds: number,\n ): Promise<unknown> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n return await Promise.race([\n frame.evaluate(expression),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(failure(\"timeout\")), milliseconds);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n };\n\n const readiness = async (\n bootstrap: CompiledBootstrap,\n ticket: Ticket,\n ): Promise<ReadinessState> => {\n const { frame } = current();\n const epoch = epochOf(frame);\n\n if (readyDocuments.get(frame) === epoch) return { _tag: \"Ready\" };\n ticket.check();\n // A document that predates registration never ran the bundle; saying so is the contract.\n if (epoch <= (registeredEpochs.get(frame) ?? -1)) {\n if (bootstrap.existingDocuments === \"RequireFreshNavigation\")\n return { _tag: \"RequiresNavigation\" };\n }\n const origin = documentOrigin(frame);\n\n const applicable = bootstrap.readiness.filter(\n (requirement) => requirement.origins === undefined || requirement.origins.includes(origin),\n );\n\n if (applicable.length === 0) {\n readyDocuments.set(frame, epoch);\n\n return { _tag: \"NotApplicable\" };\n }\n\n for (const requirement of applicable) {\n const budget = Math.max(1, Math.min(requirement.timeoutMillis, ticket.remainingMillis()));\n let value: unknown;\n\n try {\n value = await evaluateWithin(frame, requirement.expression, budget);\n } catch (error) {\n if (epochOf(frame) !== epoch || frame.isDetached())\n return { _tag: \"NotReady\", step: requirement.step, reason: \"stale\" };\n\n return {\n _tag: \"NotReady\",\n step: requirement.step,\n reason:\n Schema.is(NativeFailure)(error) && error.reason === \"timeout\" ? \"timeout\" : \"failed\",\n };\n }\n ticket.check();\n // A completed wait cannot ready a document that replaced the one it observed.\n if (epochOf(frame) !== epoch)\n return { _tag: \"NotReady\", step: requirement.step, reason: \"stale\" };\n if (value !== true) return { _tag: \"NotReady\", step: requirement.step, reason: \"failed\" };\n }\n readyDocuments.set(frame, epoch);\n\n return { _tag: \"Ready\" };\n };\n\n const documentReadiness: Driver[\"documentReadiness\"] = (ticket) =>\n sanitize(async () => {\n const bootstrap = options.bootstrap;\n\n return bootstrap === undefined || bootstrap.readiness.length === 0\n ? { _tag: \"Ready\" as const }\n : readiness(bootstrap, ticket);\n });\n\n return { attach, attachPage, attachFrame, fence, dispose, install, documentReadiness };\n};\n","import type { ElementHandle, Page } from \"playwright-core\";\n\nimport type { KeyModifier, ObservedElement } from \"../../BrowserData.ts\";\nimport type { makeActions } from \"./Actions.ts\";\nimport { failure, sanitize } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { NativeInput } from \"./Pointer.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\n/**\n * Real key input to the selected page. Every stroke is one the browser would receive from a\n * keyboard, so handlers see trusted `keydown` and `keyup`, and the browser itself decides what\n * has focus. Nothing here focuses, paces or retries: a caller that wants a cadence sends its keys.\n */\nexport const makeKeyboard = (\n targets: Targets,\n actions: ReturnType<typeof makeActions>,\n receipt: (page: Page) => NativeInput,\n) => {\n const { current } = targets;\n\n /**\n * Keys reach the focused element of the focused document, so the guard requires both: the\n * element named is that element or holds it, through any open shadow root, and its document\n * has focus. The pinned Chromium clears a frame's active element when focus leaves that\n * frame, which makes the second check redundant wherever that holds. It is kept because that\n * is the browser's bookkeeping, not a guarantee, and where it failed the keys would land in\n * another frame than the one this guard was asked about.\n */\n const requireFocus = async (element: ElementHandle<Element>): Promise<void> => {\n const focused: unknown = await element.evaluate((node) => {\n if (!node.ownerDocument.hasFocus()) return false;\n let active = node.ownerDocument.activeElement;\n\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n\n for (let at: Node | null = active; at !== null;) {\n if (at === node) return true;\n at = at.parentNode ?? (at instanceof ShadowRoot ? at.host : null);\n }\n\n return false;\n });\n\n if (focused !== true) throw failure(\"not-focused\", \"undispatched\");\n };\n\n /** Sends under one dispatch, either to whatever has focus or to the one element that must. */\n const send = async (\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n keys: (page: Page) => Promise<void>,\n ): Promise<NativeInput> => {\n const { page } = current().entry;\n\n if (into === undefined) {\n ticket.dispatch();\n await keys(page);\n } else await actions.withAdmittedElement(into, ticket, requireFocus, () => keys(page), policy);\n ticket.check();\n\n return receipt(page);\n };\n\n const press = (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n ) =>\n sanitize(() =>\n // Both halves are closed vocabularies by now, so the engine's `+` syntax is only ever ours.\n send(into, ticket, policy, (page) => page.keyboard.press([...modifiers, key].join(\"+\"))),\n );\n\n const type = (\n text: string,\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n ) =>\n sanitize(() =>\n send(into, ticket, policy, async (page) => {\n for (const character of text) {\n // A fence between characters stops the rest; what was already sent stays unknown.\n ticket.check();\n await page.keyboard.type(character);\n }\n }),\n );\n\n return { press, type };\n};\n","import { PageExecutionState, PageSuspension } from \"../../BrowserData.ts\";\nimport { BrowserError } from \"../../Errors.ts\";\nimport type { Ticket } from \"./Owner.ts\";\n\nexport interface PageExecutionNative {\n readonly readRate: () => Promise<number>;\n readonly rate: (value: number) => Promise<void>;\n readonly focus: (enabled: boolean) => Promise<void>;\n readonly lifecycle: (state: \"active\" | \"frozen\") => Promise<void>;\n readonly activate: () => Promise<void>;\n readonly frameBarrier: (ticket: Ticket) => Promise<void>;\n readonly closed: () => boolean;\n readonly detach: () => Promise<void>;\n}\n\nconst fail = (\n reason: BrowserError[\"reason\"],\n outcome: \"undispatched\" | \"unknown\" = \"undispatched\",\n) => BrowserError.make({ operation: \"page-control\", reason, outcome });\n\n/** Owned by one native page/connection. Cleanup never resumes or rolls back a hold. */\nexport class PageExecution {\n private phase: PageExecutionState[\"state\"] = \"running\";\n private revision = 0;\n private receipt: PageSuspension | undefined;\n private priorRate: number | undefined;\n private disposed = false;\n readonly pageId: string;\n readonly targetId: string;\n private readonly port: PageExecutionNative;\n private readonly freshId: () => string;\n constructor(\n pageId: string,\n targetId: string,\n port: PageExecutionNative,\n freshId: () => string = () => globalThis.crypto.randomUUID(),\n ) {\n this.pageId = pageId;\n this.targetId = targetId;\n this.port = port;\n this.freshId = freshId;\n }\n state(): PageExecutionState {\n if (this.disposed || this.port.closed()) throw fail(\"closed\");\n\n return PageExecutionState.make({\n pageId: this.pageId,\n targetId: this.targetId,\n state: this.phase,\n ...(this.receipt === undefined ? {} : { suspensionId: this.receipt.suspensionId }),\n });\n }\n assertRunning(): void {\n if (this.disposed || this.port.closed()) throw fail(\"closed\");\n if (this.phase !== \"running\") throw fail(\"busy\");\n }\n invalidate(): boolean {\n const held = this.phase !== \"running\";\n\n this.revision++;\n this.receipt = undefined;\n if (held) this.phase = \"unknown\";\n\n return held;\n }\n private check(ticket: Ticket, revision: number): void {\n ticket.check();\n const outcome = ticket.dispatched ? \"unknown\" : \"undispatched\";\n\n if (this.disposed || this.port.closed()) throw fail(\"closed\", outcome);\n if (this.revision !== revision) throw fail(\"stale\", outcome);\n }\n private async write(\n ticket: Ticket,\n revision: number,\n command: () => Promise<void>,\n ): Promise<void> {\n this.check(ticket, revision);\n ticket.dispatch();\n await command();\n this.check(ticket, revision);\n }\n async suspend(ticket: Ticket): Promise<PageSuspension> {\n this.assertRunning();\n const revision = this.revision;\n\n this.check(ticket, revision);\n const rate = await this.port.readRate();\n\n this.check(ticket, revision);\n if (!Number.isFinite(rate)) throw fail(\"malformed\");\n this.phase = \"unknown\";\n this.priorRate = rate;\n await this.write(ticket, revision, () => this.port.rate(0));\n await this.write(ticket, revision, () => this.port.focus(false));\n await this.write(ticket, revision, () => this.port.lifecycle(\"frozen\"));\n\n const receipt = Object.freeze(\n PageSuspension.make({\n pageId: this.pageId,\n targetId: this.targetId,\n suspensionId: this.freshId(),\n }),\n );\n\n this.check(ticket, revision);\n this.receipt = receipt;\n this.phase = \"suspended\";\n\n return receipt;\n }\n async resume(receipt: PageSuspension, ticket: Ticket): Promise<void> {\n this.check(ticket, this.revision);\n if (\n this.phase !== \"suspended\" ||\n this.receipt === undefined ||\n receipt.pageId !== this.pageId ||\n receipt.targetId !== this.targetId ||\n receipt.suspensionId !== this.receipt.suspensionId ||\n this.priorRate === undefined\n )\n throw fail(\"stale\");\n const revision = this.revision;\n const rate = this.priorRate;\n\n this.receipt = undefined;\n this.phase = \"unknown\";\n await this.write(ticket, revision, () => this.port.lifecycle(\"active\"));\n await this.write(ticket, revision, () => this.port.activate());\n await this.write(ticket, revision, () => this.port.focus(true));\n // Blink anchors SetPlaybackRate to the last animation-frame clock. Settle one real frame at zero.\n await this.write(ticket, revision, () => this.port.frameBarrier(ticket));\n await this.write(ticket, revision, () => this.port.rate(rate));\n this.priorRate = undefined;\n this.phase = \"running\";\n }\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.phase = \"unknown\";\n this.receipt = undefined;\n this.revision++;\n await this.port.detach();\n }\n}\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Frame } from \"playwright-core\";\n\nimport type { PageInfo, PageSuspension } from \"../../BrowserData.ts\";\nimport { Identifier } from \"../../References.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport { PageExecution } from \"./PageExecution.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\n/**\n * One native page execution per registered page, created once over its own CDP session. Its\n * receipt is invalidated when the page closes or its main frame navigates, and holds and\n * resumes act only on the exact page and target they name.\n */\nexport const makePageControl = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\n targets: Targets,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n /** A hold or a resume is about to be dispatched to this page. */\n held: (pageId: string) => void,\n) => {\n const { current, entries } = targets;\n\n const execution = (entry: Entry): Promise<PageExecution> => {\n if (!options.pageControl) return Promise.reject(failure(\"unsupported\", \"undispatched\"));\n entry.execution ??= sanitize(async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n const targetId = await targets.targetId(entry);\n\n if (closing() || entry.page.isClosed()) throw failure(\"closed\");\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled: true });\n if (closing() || entry.page.isClosed()) throw failure(\"closed\");\n\n const control = new PageExecution(entry.id, targetId, {\n readRate: async () =>\n safeDecode(\n Schema.Struct({ playbackRate: Schema.Finite }),\n await cdp.send(\"Animation.getPlaybackRate\"),\n ).playbackRate,\n rate: async (playbackRate) => {\n await cdp.send(\"Animation.setPlaybackRate\", { playbackRate });\n },\n focus: async (enabled) => {\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled });\n },\n lifecycle: async (state) => {\n await cdp.send(\"Page.setWebLifecycleState\", { state });\n },\n activate: async () => {\n await cdp.send(\"Page.bringToFront\");\n },\n closed: () => closing() || !browser.isConnected() || entry.page.isClosed(),\n detach: async () => {\n if (entry.page.isClosed() || !browser.isConnected()) return;\n try {\n await closeWithin(() => cdp.detach());\n } catch (error) {\n if (!entry.page.isClosed() && browser.isConnected()) throw error;\n }\n },\n frameBarrier: async (ticket) => {\n ticket.check();\n\n const tree = safeDecode(\n Schema.Struct({\n frameTree: Schema.Struct({ frame: Schema.Struct({ id: Identifier }) }),\n }),\n await cdp.send(\"Page.getFrameTree\"),\n );\n\n ticket.check();\n\n const world = await cdp.send(\"Page.createIsolatedWorld\", {\n frameId: tree.frameTree.frame.id,\n worldName: \"effect-agent-browserbase-page-control\",\n });\n\n ticket.check();\n\n const result = await cdp.send(\"Runtime.evaluate\", {\n expression: \"new Promise(resolve => requestAnimationFrame(() => resolve(true)))\",\n contextId: safeDecode(\n Schema.Int.check(Schema.isGreaterThan(0)),\n world.executionContextId,\n ),\n awaitPromise: true,\n returnByValue: true,\n userGesture: false,\n timeout: Math.min(2000, ticket.remainingMillis()),\n });\n\n ticket.check();\n if (result.exceptionDetails !== undefined || result.result.value !== true)\n throw failure(\"malformed\");\n },\n });\n\n entry.executionValue = control;\n\n return control;\n } catch (error) {\n await closeWithin(() => cdp.detach()).catch(() => {});\n throw error;\n }\n });\n\n return entry.execution;\n };\n\n const explicit = async (\n target: { readonly pageId: string; readonly targetId: string },\n ticket: Ticket,\n ) => {\n ticket.check();\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed()) throw failure(\"closed\", \"undispatched\");\n const control = await execution(entry);\n\n ticket.check();\n if (control.targetId !== target.targetId) throw failure(\"stale\", \"undispatched\");\n\n return control;\n };\n\n /** A closed page's execution is invalidated at once and disposed outside the event. */\n const closed = (entry: Entry) => {\n entry.executionValue?.invalidate();\n if (entry.execution !== undefined)\n callbacks.submit(async () => {\n await (await entry.execution)?.dispose();\n });\n };\n\n /** A main-frame navigation invalidates the execution; one that was held faults the session. */\n const navigating = (entry: Entry, frame: Frame) => {\n if (frame === entry.page.mainFrame() && entry.executionValue?.invalidate()) events.fault();\n };\n\n const operations: NonNullable<Driver[\"pageControl\"]> = {\n state: (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => (await explicit(page, ticket)).state()),\n // Announced before the dispatch, so an unknown outcome still leaves nothing unchecked.\n suspend: (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const control = await explicit(page, ticket);\n\n held(control.pageId);\n\n return control.suspend(ticket);\n }),\n resume: (receipt: PageSuspension, ticket: Ticket) =>\n sanitize(async () => {\n const control = await explicit(receipt, ticket);\n\n held(control.pageId);\n\n return control.resume(receipt, ticket);\n }),\n checkSelected: (ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const control = await execution(current().entry);\n\n ticket.check();\n control.assertRunning();\n }),\n };\n\n const dispose = () =>\n Promise.allSettled(\n [...entries.values()].map(async (entry) => {\n if (entry.execution !== undefined) await (await entry.execution).dispose();\n }),\n );\n\n return { execution, closed, navigating, operations, dispose };\n};\n","import { Schema } from \"effect\";\n\nimport { ControlFacts, ObservedControl } from \"../../BrowserData.ts\";\n\n/**\n * What the page reader returns. It is decoded on the host, so a page that tampers with its own\n * prototypes can make a read fail but cannot make it return something unbounded or untyped.\n */\nexport const PageReadResult = Schema.Struct({\n text: Schema.String.check(Schema.isMaxLength(131072)),\n textTruncated: Schema.Boolean,\n controlsTruncated: Schema.Boolean,\n controls: Schema.Array(ControlFacts).check(Schema.isMaxLength(64)),\n viewport: Schema.Struct({\n width: Schema.Finite,\n height: Schema.Finite,\n clippedText: Schema.Natural,\n coveredText: Schema.Natural,\n uncertainText: Schema.Natural,\n unreachableControls: Schema.Natural,\n exhausted: Schema.Boolean,\n }),\n});\n\nexport type PageReadResult = typeof PageReadResult.Type;\n\nexport interface PageReadRequest {\n readonly scope: \"document\" | \"viewport\";\n readonly maximumBytes: number;\n readonly controlLimit: number;\n /** Bounds the traversal itself, not just what is returned from it. */\n readonly nodeBudget: number;\n /** When set, only this exact node's facts are read and nothing is traversed. */\n readonly only?: Element;\n}\n\n/** What makes a control the one that was inspected. Geometry is excluded: scrolling moves it. */\nexport const identityOf = (facts: ControlFacts): string =>\n JSON.stringify([\n facts.kind,\n facts.label,\n facts.disabled,\n facts.editable,\n facts.inputType ?? null,\n facts.autocomplete ?? null,\n facts.destination ?? null,\n facts.formMethod ?? null,\n ]);\n\n/** The model-facing projection: no destination, form or geometry ever leaves through it. */\nexport const observedControl = (facts: ControlFacts, elementId: string): ObservedControl =>\n ObservedControl.make({\n elementId,\n kind: facts.kind,\n label: facts.label,\n disabled: facts.disabled,\n });\n\n/**\n * Runs inside the page, so it is one self-contained function: it may not reference anything in\n * this module. It reads; it never scrolls, focuses, mutates or dispatches.\n *\n * Visibility here is geometry and hit-testing, never a pixel comparison. Text is kept only when\n * its line boxes intersect the viewport and the browser finds its own element at a sampled\n * point. Text under something that takes no pointer events cannot be hit-tested at all, so it is\n * counted as uncertain and left out rather than promoted to visible evidence.\n */\nexport const readPage = (\n request: PageReadRequest,\n): { readonly nodes: Array<Element>; readonly data: unknown } => {\n const { scope, maximumBytes, controlLimit, nodeBudget, only } = request;\n const width = window.innerWidth;\n const height = window.innerHeight;\n\n const evidence = {\n width,\n height,\n clippedText: 0,\n coveredText: 0,\n uncertainText: 0,\n unreachableControls: 0,\n exhausted: false,\n };\n\n const intersects = (rect: DOMRect): boolean =>\n rect.width > 0 &&\n rect.height > 0 &&\n rect.bottom > 0 &&\n rect.right > 0 &&\n rect.top < height &&\n rect.left < width;\n\n const within = (rect: DOMRect): boolean =>\n rect.top >= 0 && rect.left >= 0 && rect.bottom <= height && rect.right <= width;\n\n // Boxes of elements that take no pointer events. Hit-testing sees through them, so whatever\n // lies beneath one cannot be shown to be uncovered.\n const passThrough: Array<{ readonly element: Element; readonly rect: DOMRect }> = [];\n let visited = 0;\n\n if (only === undefined && scope === \"viewport\") {\n const all = document.body?.getElementsByTagName(\"*\") ?? [];\n\n for (let i = 0; i < all.length; i++) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n break;\n }\n const element = all[i];\n\n if (element === undefined) continue;\n const style = getComputedStyle(element);\n\n if (style.pointerEvents !== \"none\" || style.visibility === \"hidden\") continue;\n if (passThrough.some((known) => known.element.contains(element))) continue;\n const rect = element.getBoundingClientRect();\n\n if (intersects(rect) && Number(style.opacity) > 0) passThrough.push({ element, rect });\n }\n }\n\n /** Whether the browser finds `owner` at this point, and how far that can be trusted. */\n const hitTest = (owner: Element, rect: DOMRect): \"self\" | \"covered\" | \"uncertain\" => {\n const x = Math.min(width - 1, Math.max(0, rect.left + rect.width / 2));\n const y = Math.min(height - 1, Math.max(0, rect.top + rect.height / 2));\n let hit = document.elementFromPoint(x, y);\n\n while (hit?.shadowRoot) {\n const inner = hit.shadowRoot.elementFromPoint(x, y);\n\n if (inner === null || inner === hit) break;\n hit = inner;\n }\n if (hit === null) return \"uncertain\";\n if (hit !== owner && !owner.contains(hit) && !hit.contains(owner)) return \"covered\";\n\n const beneath = passThrough.some(\n (layer) =>\n !layer.element.contains(owner) &&\n !owner.contains(layer.element) &&\n x >= layer.rect.left &&\n x < layer.rect.right &&\n y >= layer.rect.top &&\n y < layer.rect.bottom,\n );\n\n return beneath ? \"uncertain\" : \"self\";\n };\n\n const factsOf = (node: Element) => {\n const tag = node.tagName.toLowerCase();\n\n const field =\n node instanceof HTMLInputElement ||\n node instanceof HTMLButtonElement ||\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement\n ? node\n : undefined;\n\n const submits =\n (node instanceof HTMLButtonElement && node.type === \"submit\") ||\n (node instanceof HTMLInputElement && (node.type === \"submit\" || node.type === \"image\"));\n\n // The effective destination: a resolved link target, or where this control submits its\n // form, including a `formaction` override. The browser resolves both against the base URL.\n const form = submits ? field?.form : undefined;\n\n const target =\n node instanceof HTMLAnchorElement || node instanceof HTMLAreaElement\n ? node.href\n : form === undefined || form === null\n ? undefined\n : node.hasAttribute(\"formaction\") && field !== undefined && \"formAction\" in field\n ? field.formAction\n : form.action;\n\n const method =\n form === undefined || form === null\n ? undefined\n : (node.hasAttribute(\"formmethod\") && field !== undefined && \"formMethod\" in field\n ? field.formMethod\n : form.method\n ).toLowerCase();\n\n const disabled = node.matches(\":disabled\") || node.getAttribute(\"aria-disabled\") === \"true\";\n const rect = node.getBoundingClientRect();\n const placement = !intersects(rect) ? \"outside\" : within(rect) ? \"inside\" : \"partial\";\n\n const autocomplete =\n node instanceof HTMLInputElement ||\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement\n ? node.autocomplete\n : \"\";\n\n return {\n kind:\n tag === \"a\"\n ? \"link\"\n : [\"button\", \"input\", \"select\", \"textarea\"].includes(tag)\n ? tag\n : \"other\",\n label: (\n node.getAttribute(\"aria-label\") ??\n node.getAttribute(\"placeholder\") ??\n (node instanceof HTMLInputElement ? node.labels?.[0]?.textContent : node.textContent) ??\n \"\"\n ).slice(0, 256),\n disabled,\n editable:\n !disabled &&\n (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement\n ? !node.readOnly\n : node instanceof HTMLSelectElement),\n ...(node instanceof HTMLInputElement || node instanceof HTMLButtonElement\n ? { inputType: node.type.slice(0, 32) }\n : {}),\n ...(autocomplete === \"\" ? {} : { autocomplete: autocomplete.slice(0, 128) }),\n // An over-long destination is left out, never cut: half a URL is a different URL.\n ...(target === undefined || target.length > 2048 ? {} : { destination: target }),\n ...(method === \"get\" || method === \"post\" || method === \"dialog\"\n ? { formMethod: method }\n : {}),\n box: { x: rect.left, y: rect.top, width: rect.width, height: rect.height },\n placement,\n hitTest: placement === \"outside\" ? \"unsampled\" : hitTest(node, rect),\n mainFrame: window.top === window,\n };\n };\n\n if (only !== undefined) return { nodes: [only], data: { facts: factsOf(only) } };\n\n const nodes: Array<Element> = [];\n const controls: Array<ReturnType<typeof factsOf>> = [];\n\n const candidates = document.querySelectorAll(\n \"a[href],button,input,select,textarea,[role=button]\",\n );\n\n let controlsTruncated = false;\n\n for (let i = 0; i < candidates.length; i++) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n controlsTruncated = true;\n break;\n }\n const node = candidates[i];\n\n if (node === undefined) continue;\n const facts = factsOf(node);\n\n // Filter first, then apply the limit: a limit applied first would spend it off screen.\n if (scope === \"viewport\" && facts.hitTest !== \"self\") {\n if (facts.placement !== \"outside\") evidence.unreachableControls++;\n continue;\n }\n if (nodes.length >= controlLimit) {\n controlsTruncated = true;\n break;\n }\n nodes.push(node);\n controls.push(facts);\n }\n\n const encoder = new TextEncoder();\n let text = \"\";\n let textTruncated = false;\n\n if (scope === \"document\") {\n const encoded = encoder.encode(document.body?.innerText ?? \"\");\n let end = Math.min(encoded.length, maximumBytes);\n\n // Do not manufacture a replacement character by cutting a UTF-8 sequence.\n while (end > 0 && end < encoded.length && ((encoded[end] ?? 0) & 192) === 128) end--;\n text = new TextDecoder().decode(encoded.subarray(0, end));\n textTruncated = end < encoded.length;\n } else if (document.body !== null) {\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const range = document.createRange();\n let bytes = 0;\n let lastBottom = Number.NEGATIVE_INFINITY;\n\n // The first laid-out character at or after `index`; collapsed whitespace has no box.\n const boxAt = (node: Text, index: number): DOMRect | undefined => {\n const length = node.data.length;\n\n for (let k = index; k < Math.min(length, index + 8); k++) {\n range.setStart(node, k);\n range.setEnd(node, k + 1);\n const rect = range.getClientRects()[0];\n\n if (rect !== undefined && rect.width + rect.height > 0) return rect;\n }\n\n return undefined;\n };\n\n for (let node = walker.nextNode(); node !== null; node = walker.nextNode()) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n textTruncated = true;\n break;\n }\n const owner = node.parentElement;\n\n if (!(node instanceof Text) || owner === null || node.data.trim() === \"\") continue;\n if ([\"SCRIPT\", \"STYLE\", \"NOSCRIPT\", \"TEMPLATE\"].includes(owner.tagName)) continue;\n if (owner.checkVisibility?.({ opacityProperty: true, visibilityProperty: true }) === false)\n continue;\n range.selectNodeContents(node);\n const lines = [...range.getClientRects()].filter(intersects);\n const first = lines[0];\n\n // Laid out entirely off screen: not evidence of anything, and not counted as hidden.\n if (first === undefined) continue;\n const verdict = hitTest(owner, first);\n\n if (verdict !== \"self\") {\n if (verdict === \"covered\") evidence.coveredText++;\n else evidence.uncertainText++;\n continue;\n }\n range.selectNodeContents(node);\n let visible = node.data;\n\n if (![...range.getClientRects()].every(within)) {\n // Lines run top to bottom, so the visible run is found by bisecting on character boxes\n // rather than by copying a whole node of which one line is on screen.\n const length = node.data.length;\n let low = 0;\n let high = length;\n\n while (low < high) {\n const middle = (low + high) >> 1;\n const rect = boxAt(node, middle);\n\n if (rect === undefined || rect.bottom <= 0) low = middle + 1;\n else high = middle;\n }\n const start = low;\n\n high = length;\n while (low < high) {\n const middle = (low + high) >> 1;\n const rect = boxAt(node, middle);\n\n if (rect !== undefined && rect.top >= height) high = middle;\n else low = middle + 1;\n }\n visible = node.data.slice(start, low);\n evidence.clippedText++;\n }\n const fragment = visible.replace(/\\s+/g, \" \").trim();\n\n if (fragment === \"\") continue;\n const joined = (text === \"\" ? \"\" : first.top >= lastBottom - 1 ? \"\\n\" : \" \") + fragment;\n const size = encoder.encode(joined).length;\n\n if (bytes + size > maximumBytes) {\n textTruncated = true;\n break;\n }\n text += joined;\n bytes += size;\n lastBottom = Math.max(lastBottom, first.bottom);\n }\n }\n\n return { nodes, data: { text, textTruncated, controlsTruncated, controls, viewport: evidence } };\n};\n","import { Schema } from \"effect\";\nimport type { ElementHandle, JSHandle } from \"playwright-core\";\n\nimport { ControlFacts, type ObservedElement } from \"../../BrowserData.ts\";\nimport { BrowserError } from \"../../Errors.ts\";\nimport { pngGeometry } from \"../capture/Images.ts\";\nimport type { DriverEvents, NativeCheckpoint, NativeObservation } from \"./Driver.ts\";\nimport {\n closeWithin,\n failure,\n NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport { identityOf, observedControl, PageReadResult, readPage } from \"./PageRead.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nconst TextResult = Schema.Struct({\n text: Schema.String,\n missing: Schema.Boolean,\n overLimit: Schema.Boolean,\n});\n\nconst Geometry = Schema.Struct({ width: Schema.Natural, height: Schema.Natural });\n\nconst Count = Schema.Natural.check(Schema.isLessThanOrEqualTo(1000000));\n\nconst Facts = Schema.Struct({ facts: ControlFacts });\n\n/** Bounds the page traversal itself, so a huge document costs a bounded read. */\nconst NodeBudget = 20_000;\n\n/** A host's own decision about one control, made on facts read from the page just now. */\nexport type AdmissionPolicy = (facts: ControlFacts) => boolean;\n\ninterface Retained {\n readonly handle: ElementHandle<Element>;\n /** What made this control the one that was inspected; see `identityOf`. */\n readonly identity: string;\n}\n\n/**\n * `suspended` is a page hold: the nodes are kept but none may be acted on until it is checked\n * again, one node at a time. Anything else that could change the page makes it `invalid`.\n */\ninterface Snapshot {\n readonly id: string;\n readonly pageId: string;\n validity: \"valid\" | \"suspended\" | \"invalid\";\n readonly nodes: Map<string, Retained>;\n readonly revalidated: Set<string>;\n}\n\n/**\n * What is read from the selected document, and the one retained observation whose nodes a later\n * action may name. That observation is valid only until the next invalidating event.\n */\nexport const makeObservation = (targets: Targets, events: DriverEvents) => {\n const { current } = targets;\n let observation: Snapshot | undefined;\n let observationSerial = 0;\n\n const invalidate = () => {\n if (observation !== undefined) observation.validity = \"invalid\";\n };\n\n /**\n * A read is ordered against document replacement by failing: if the document it was reading\n * was replaced underneath it, or a navigation is still in flight on its page, the native error\n * is `target-changed` and `undispatched`, so a caller knows to read again. A read is never a\n * mutation, so reading again is always safe.\n */\n const reading = async <A>(body: () => Promise<A>): Promise<A> => {\n const { entry, frame } = current();\n const epoch = targets.epochOf(frame);\n\n try {\n return await body();\n } catch (error) {\n // A fenced ticket and a failure with its own reason already say what happened. Only an\n // unexplained native error is explained by the document having gone.\n const unexplained =\n !Schema.is(BrowserError)(error) &&\n (!Schema.is(NativeFailure)(error) || error.reason === \"provider\");\n\n if (unexplained && (targets.epochOf(frame) !== epoch || targets.navigating.has(entry.id)))\n throw failure(\"target-changed\", \"undispatched\");\n throw error;\n }\n };\n\n const changed = (reason: Parameters<DriverEvents[\"invalidate\"]>[0]) => {\n invalidate();\n events.invalidate(reason);\n };\n\n /**\n * Holding or resuming a page may run its `freeze` and `resume` handlers, so nothing observed\n * on it may be acted on unchecked. Another page's observation is untouched: a stage hold is\n * independent of the page an agent is driving.\n */\n const held = (pageId: string) => {\n if (observation?.pageId === pageId && observation.validity === \"valid\") {\n observation.validity = \"suspended\";\n observation.revalidated.clear();\n }\n };\n\n const dispose = async () => {\n const old = observation;\n\n observation = undefined;\n if (old !== undefined) {\n old.validity = \"invalid\";\n await closeWithin(() =>\n Promise.allSettled([...old.nodes.values()].map((node) => node.handle.dispose())),\n );\n }\n };\n\n const exactElement = async (\n selector: string,\n ticket: Ticket,\n ): Promise<ElementHandle<Element>> => {\n ticket.check();\n\n const holder = await current().frame.evaluateHandle((requested) => {\n try {\n const matches = document.querySelectorAll(requested);\n\n return { count: matches.length, node: matches.length === 1 ? matches[0] : null };\n } catch {\n return { count: 0, node: null };\n }\n }, selector);\n\n let node: JSHandle | undefined;\n\n try {\n const countHandle = await holder.getProperty(\"count\");\n let count: number;\n\n try {\n count = safeDecode(Count, await countHandle.jsonValue());\n } finally {\n await countHandle.dispose();\n }\n ticket.check();\n if (count !== 1) throw failure(count === 0 ? \"not-found\" : \"ambiguous\", \"undispatched\");\n node = await holder.getProperty(\"node\");\n const element = node.asElement();\n\n if (element === null) throw failure(\"not-found\", \"undispatched\");\n ticket.check();\n\n return element;\n } catch (error) {\n await node?.dispose().catch(() => {});\n throw error;\n } finally {\n await holder.dispose();\n }\n };\n\n /** A retained node is only as current as the observation that produced it. */\n const retained = (target: ObservedElement, allowSuspended = false): Retained => {\n const snapshot = observation;\n\n if (snapshot === undefined || snapshot.id !== target.observationId)\n throw failure(\"stale\", \"undispatched\");\n\n const usable =\n snapshot.validity === \"valid\" ||\n (snapshot.validity === \"suspended\" &&\n (allowSuspended || snapshot.revalidated.has(target.elementId)));\n\n const node = snapshot.nodes.get(target.elementId);\n\n if (!usable || node === undefined) throw failure(\"stale\", \"undispatched\");\n\n return node;\n };\n\n /**\n * Read from the exact node, never re-resolved from a selector or a label. It is the same page\n * function an observation uses, told to read one node and traverse nothing.\n */\n const factsOf = async (element: ElementHandle<Element>): Promise<ControlFacts> => {\n const holder = await current().frame.evaluateHandle(readPage, {\n scope: \"document\" as const,\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: 0,\n only: element,\n });\n\n try {\n const data = await holder.getProperty(\"data\");\n\n try {\n return safeDecode(Facts, await data.jsonValue()).facts;\n } finally {\n await data.dispose();\n }\n } finally {\n await holder.dispose();\n }\n };\n\n /**\n * The exact attached node a target names, checked against the page right now. A selector must\n * still match it and nothing else. A retained node must still be the control that was\n * inspected: the same node with a different destination, type or label is not. A host policy\n * then decides on those fresh facts, and a refusal or a policy that throws sends nothing.\n */\n const resolve = async (\n target: string | ObservedElement,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n allowSuspended = false,\n ): Promise<{ readonly element: ElementHandle<Element>; readonly kept: boolean }> => {\n const kept = typeof target !== \"string\";\n\n const node = typeof target === \"string\" ? undefined : retained(target, allowSuspended);\n\n const element = typeof target === \"string\" ? await exactElement(target, ticket) : node?.handle;\n\n if (element === undefined) throw failure(\"stale\", \"undispatched\");\n try {\n const attached: unknown = await element.evaluate(\n (candidate, selector) => {\n if (!candidate.isConnected) return false;\n if (selector === undefined) return true;\n const matches = candidate.ownerDocument.querySelectorAll(selector);\n\n return matches.length === 1 && matches[0] === candidate;\n },\n typeof target === \"string\" ? target : undefined,\n );\n\n if (attached !== true) throw failure(\"stale\", \"undispatched\");\n if (node !== undefined || policy !== undefined) {\n const facts = await factsOf(element);\n\n if (node !== undefined && identityOf(facts) !== node.identity)\n throw failure(\"stale\", \"undispatched\");\n if (policy !== undefined) {\n let admitted = false;\n\n try {\n admitted = policy(facts) === true;\n } catch {\n admitted = false;\n }\n if (!admitted) throw failure(\"denied\", \"undispatched\");\n }\n }\n ticket.check();\n\n return { element, kept };\n } catch (error) {\n if (!kept) await closeWithin(() => element.dispose()).catch(() => {});\n throw error;\n }\n };\n\n const controlFacts = (target: ObservedElement, ticket: Ticket) =>\n sanitize(async () => {\n const { element } = await resolve(target, ticket);\n\n return factsOf(element);\n });\n\n /** After a hold, one node at a time: still attached, and still the control inspected. */\n const revalidate = (target: ObservedElement, ticket: Ticket) =>\n sanitize(async () => {\n await resolve(target, ticket, undefined, true);\n observation?.revalidated.add(target.elementId);\n });\n\n const readText = (selector: string | undefined, maximumBytes: number, ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n\n const raw: unknown = await reading(() =>\n current().frame.evaluate(\n ({ selector, maximumBytes }) => {\n const element =\n selector === undefined ? document.body : document.querySelector(selector);\n\n if (element === null) return { text: \"\", missing: true, overLimit: false };\n\n const text =\n element instanceof HTMLElement ? element.innerText : (element.textContent ?? \"\");\n\n if (new TextEncoder().encode(text).length > maximumBytes)\n return { text: \"\", missing: false, overLimit: true };\n\n return { text, missing: false, overLimit: false };\n },\n { selector, maximumBytes },\n ),\n );\n\n ticket.check();\n const value = safeDecode(TextResult, raw);\n\n if (value.missing) throw failure(\"not-found\");\n if (value.overLimit || new TextEncoder().encode(value.text).length > maximumBytes)\n throw failure(\"limit\");\n\n return value.text;\n });\n\n /** One bounded read of the selected frame, and the node handles it names, in order. */\n const read = async (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n ticket: Ticket,\n keepNodes: boolean,\n ) => {\n const holder = await current().frame.evaluateHandle(readPage, {\n scope,\n maximumBytes,\n controlLimit,\n nodeBudget: NodeBudget,\n });\n\n const handles: Array<ElementHandle<Element>> = [];\n let nodesHandle: JSHandle | undefined;\n\n try {\n const dataHandle = await holder.getProperty(\"data\");\n let data: PageReadResult;\n\n try {\n data = safeDecode(PageReadResult, await dataHandle.jsonValue());\n } finally {\n await dataHandle.dispose();\n }\n if (\n new TextEncoder().encode(data.text).length > maximumBytes ||\n data.controls.length > controlLimit\n )\n throw failure(\"limit\");\n if (keepNodes) {\n nodesHandle = await holder.getProperty(\"nodes\");\n for (let i = 0; i < data.controls.length; i++) {\n const node = await nodesHandle.getProperty(String(i));\n const element = node.asElement();\n\n if (element === null) {\n await node.dispose();\n throw failure(\"malformed\");\n }\n handles.push(element);\n }\n }\n ticket.check();\n\n return { data, handles };\n } catch (error) {\n await Promise.allSettled(handles.map((handle) => handle.dispose()));\n throw error;\n } finally {\n await nodesHandle?.dispose().catch(() => {});\n await holder.dispose();\n }\n };\n\n const observe = (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n ticket: Ticket,\n ) =>\n sanitize(async () => {\n await dispose();\n ticket.check();\n const pageId = current().entry.id;\n\n const { data, handles } = await reading(() =>\n read(scope, maximumBytes, controlLimit, ticket, true),\n );\n\n const id = `observation-${++observationSerial}`;\n const nodes = new Map<string, Retained>();\n\n // One handle per control, in the order the page returned them.\n handles.forEach((handle, i) => {\n const facts = data.controls[i];\n\n if (facts !== undefined) nodes.set(`element-${i}`, { handle, identity: identityOf(facts) });\n });\n if (nodes.size !== data.controls.length) {\n await Promise.allSettled(handles.map((handle) => handle.dispose()));\n throw failure(\"malformed\");\n }\n observation = { id, pageId, validity: \"valid\", nodes, revalidated: new Set() };\n\n const result: NativeObservation = {\n observationId: id,\n scope,\n url: targets.selectedUrl(),\n text: data.text,\n textTruncated: data.textTruncated,\n controlsTruncated: data.controlsTruncated,\n controls: data.controls.map((facts, i) => observedControl(facts, `element-${i}`)),\n viewport: data.viewport,\n };\n\n return result;\n });\n\n const screenshot = (fullPage: boolean, maximumBytes: number, ticket: Ticket) =>\n sanitize(() =>\n reading(async () => {\n const page = current().entry.page;\n\n ticket.check();\n\n const raw: unknown = await page.evaluate(\n (full) => ({\n width: full\n ? Math.max(document.documentElement.scrollWidth, window.innerWidth)\n : window.innerWidth,\n height: full\n ? Math.max(document.documentElement.scrollHeight, window.innerHeight)\n : window.innerHeight,\n }),\n fullPage,\n );\n\n const geometry = safeDecode(Geometry, raw);\n\n if (\n geometry.width < 1 ||\n geometry.height < 1 ||\n geometry.width > 16384 ||\n geometry.height > 16384 ||\n geometry.width * geometry.height > 33_554_432\n )\n throw failure(\"limit\");\n ticket.check();\n\n const bytes: unknown = await page.screenshot({\n type: \"png\",\n fullPage,\n scale: \"css\",\n timeout: timeout(ticket),\n });\n\n if (!(bytes instanceof Uint8Array)) throw failure(\"malformed\");\n if (bytes.length > maximumBytes) throw failure(\"limit\");\n const actual = pngGeometry(bytes);\n\n if (\n actual.width > 16384 ||\n actual.height > 16384 ||\n actual.width * actual.height > 33_554_432\n )\n throw failure(\"limit\");\n ticket.check();\n\n return new Uint8Array(bytes);\n }),\n );\n\n /**\n * Passive: it reads what is on screen and takes a picture, keeps no node, and leaves the\n * retained observation exactly as it was. Text and picture are sampled one after the other,\n * so a document replaced in between is reported rather than hidden.\n */\n const checkpoint = (\n maximumBytes: number,\n controlLimit: number,\n pictureBytes: number | undefined,\n ticket: Ticket,\n ) =>\n sanitize(async () => {\n ticket.check();\n const { frame } = current();\n const epoch = targets.epochOf(frame);\n\n const { data } = await reading(() =>\n read(\"viewport\", maximumBytes, controlLimit, ticket, false),\n );\n\n const picture =\n pictureBytes === undefined ? undefined : await screenshot(false, pictureBytes, ticket);\n\n const result: NativeCheckpoint = {\n url: targets.selectedUrl(),\n ...data,\n ...(picture === undefined ? {} : { picture }),\n documentChanged: targets.epochOf(frame) !== epoch,\n };\n\n return result;\n });\n\n return {\n invalidate,\n changed,\n held,\n dispose,\n resolve,\n controlFacts,\n revalidate,\n readText,\n observe,\n screenshot,\n checkpoint,\n };\n};\n\nexport type Observation = ReturnType<typeof makeObservation>;\n","import { Schema } from \"effect\";\nimport type { ElementHandle, Page } from \"playwright-core\";\n\nimport type { ObservedElement } from \"../../BrowserData.ts\";\nimport type { makeActions } from \"./Actions.ts\";\nimport { failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nexport interface NativePoint {\n readonly x: number;\n readonly y: number;\n}\n\n/** What one native pointer command did. The session adds target identity and the host clock. */\nexport interface NativeInput {\n /** The last point this driver commanded on the page, or null if it never placed the pointer. */\n readonly position: NativePoint | null;\n}\n\nconst Reach = Schema.Struct({\n x: Schema.Finite,\n y: Schema.Finite,\n reachable: Schema.Boolean,\n});\n\n/** Runs in each document on the path to the exact node, including cross-origin frames. */\nconst hitPoint = (\n node: Node,\n input: NativePoint & { readonly child: boolean },\n): { readonly x: number; readonly y: number; readonly reachable: boolean } => {\n const refused = { x: input.x, y: input.y, reachable: false };\n\n if (\n !(node instanceof Element) ||\n !node.isConnected ||\n input.x < 0 ||\n input.y < 0 ||\n input.x >= innerWidth ||\n input.y >= innerHeight\n )\n return refused;\n\n let hit = node.ownerDocument.elementFromPoint(input.x, input.y);\n\n for (let depth = 0; hit?.shadowRoot; depth++) {\n if (depth >= 32) return refused;\n const inner = hit.shadowRoot.elementFromPoint(input.x, input.y);\n\n if (inner === null || inner === hit) break;\n hit = inner;\n }\n if (hit === null || (hit !== node && !node.contains(hit))) return refused;\n if (!input.child) return { x: input.x, y: input.y, reachable: true };\n if (!(node instanceof HTMLElement)) return refused;\n\n // Mapping a bounding rectangle through rotation/perspective would guess a point. Admit\n // positive axis-aligned scaling/translation; reject unsupported transforms before input.\n let ancestor: Element | null = node;\n\n for (let depth = 0; ancestor !== null; depth++) {\n if (depth >= 128) return refused;\n const style = getComputedStyle(ancestor);\n const rotation = style.getPropertyValue(\"rotate\");\n const scale = style.getPropertyValue(\"scale\");\n\n if (\n (rotation !== \"\" && rotation !== \"none\" && rotation !== \"0deg\") ||\n (scale !== \"\" &&\n scale !== \"none\" &&\n scale.split(/\\s+/).some((axis) => !(Number.parseFloat(axis) > 0))) ||\n style.perspective !== \"none\" ||\n (style.offsetPath !== \"\" && style.offsetPath !== \"none\")\n )\n return refused;\n if (style.transform !== \"none\") {\n const matrix = new DOMMatrixReadOnly(style.transform);\n\n if (!matrix.is2D || matrix.b !== 0 || matrix.c !== 0 || matrix.a <= 0 || matrix.d <= 0)\n return refused;\n }\n const root = ancestor.getRootNode();\n\n ancestor = ancestor.parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n const rect = node.getBoundingClientRect();\n const scaleX = rect.width / node.offsetWidth;\n const scaleY = rect.height / node.offsetHeight;\n\n if (!Number.isFinite(scaleX) || !Number.isFinite(scaleY) || scaleX <= 0 || scaleY <= 0)\n return refused;\n const style = getComputedStyle(node);\n const left = Number.parseFloat(style.paddingLeft);\n const top = Number.parseFloat(style.paddingTop);\n const right = Number.parseFloat(style.paddingRight);\n const bottom = Number.parseFloat(style.paddingBottom);\n const x = (input.x - rect.left) / scaleX - node.clientLeft - left;\n const y = (input.y - rect.top) / scaleY - node.clientTop - top;\n\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n x < 0 ||\n y < 0 ||\n x >= node.clientWidth - left - right ||\n y >= node.clientHeight - top - bottom\n )\n return refused;\n\n return { x, y, reachable: true };\n};\n\n/**\n * Real pointer input to the selected page. Every command is one the browser would receive from\n * a person, so handlers see trusted events and the browser decides what is under the pointer.\n * Nothing here scrolls, eases or retries: a caller that wants a trajectory sends its points.\n */\nexport const makePointer = (targets: Targets, actions: ReturnType<typeof makeActions>) => {\n const { current } = targets;\n // Chromium keeps a pointer position per page; this is only the last one this driver set.\n const positions = new WeakMap<Page, NativePoint>();\n\n const moveTo = async (page: Page, point: NativePoint): Promise<void> => {\n await page.mouse.move(point.x, point.y);\n positions.set(page, point);\n };\n\n const receipt = (page: Page): NativeInput => ({ position: positions.get(page) ?? null });\n\n const pointerMove = (point: NativePoint, ticket: Ticket) =>\n sanitize(async () => {\n const { page } = current().entry;\n\n ticket.dispatch();\n await moveTo(page, point);\n ticket.check();\n\n return receipt(page);\n });\n\n /**\n * The centre of the element's box, in main-frame viewport pixels, and only if the pointer can\n * really be placed there: the box has area, the point is inside the viewport, and the element\n * is what the browser finds at that point. An open shadow root is followed to the node a\n * person would actually be over.\n */\n const reachablePoint = async (\n page: Page,\n element: ElementHandle<Element>,\n ): Promise<NativePoint> => {\n const box = await element.boundingBox();\n\n if (box === null || box.width <= 0 || box.height <= 0)\n throw failure(\"not-visible\", \"undispatched\");\n const point = { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n\n const ancestors: Array<ElementHandle<Node>> = [];\n\n try {\n let frame = await element.ownerFrame();\n\n if (frame === null || frame.page() !== page) throw failure(\"stale\", \"undispatched\");\n while (frame !== page.mainFrame()) {\n if (ancestors.length >= 32) throw failure(\"limit\", \"undispatched\");\n ancestors.push(await frame.frameElement());\n frame = frame.parentFrame();\n if (frame === null) throw failure(\"stale\", \"undispatched\");\n }\n\n let localPoint = point;\n\n // A visible node in a child can still sit behind an overlay in any ancestor. Check the\n // actual commanded point from the main viewport down, then hit-test the exact node.\n for (const ancestor of ancestors.reverse()) {\n const reached = safeDecode(\n Reach,\n await ancestor.evaluate(hitPoint, { ...localPoint, child: true }),\n );\n\n if (!reached.reachable) throw failure(\"not-visible\", \"undispatched\");\n localPoint = { x: reached.x, y: reached.y };\n }\n\n const reached = safeDecode(\n Reach,\n await element.evaluate(hitPoint, { ...localPoint, child: false }),\n );\n\n if (!reached.reachable) throw failure(\"not-visible\", \"undispatched\");\n } finally {\n await Promise.all(ancestors.map((ancestor) => ancestor.dispose()));\n }\n\n return point;\n };\n\n const hover = (target: string | ObservedElement, ticket: Ticket, policy?: AdmissionPolicy) =>\n sanitize(async () => {\n const { page } = current().entry;\n\n await actions.withAdmittedElement(\n target,\n ticket,\n (element) => reachablePoint(page, element),\n (_element, point) => moveTo(page, point),\n policy,\n );\n ticket.check();\n\n return receipt(page);\n });\n\n const wheel = (deltaX: number, deltaY: number, at: NativePoint | undefined, ticket: Ticket) =>\n sanitize(async () => {\n const { page } = current().entry;\n\n ticket.dispatch();\n if (at !== undefined) await moveTo(page, at);\n // Dispatched, not awaited: Chromium scrolls afterwards, on its own schedule.\n await page.mouse.wheel(deltaX, deltaY);\n ticket.check();\n\n return receipt(page);\n });\n\n return { pointerMove, hover, wheel, receipt };\n};\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Dialog, Frame, Page } from \"playwright-core\";\n\nimport { FrameInfo, PageInfo } from \"../../BrowserData.ts\";\nimport { Identifier } from \"../../References.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type { DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { PageExecution } from \"./PageExecution.ts\";\n\nconst TargetInfo = Schema.Struct({\n targetInfo: Schema.Struct({ targetId: Identifier, type: Schema.Literal(\"page\") }),\n});\n\nconst URLText = Schema.String.check(Schema.isMaxLength(8192));\n\nexport interface Entry {\n readonly id: string;\n readonly page: Page;\n targetId?: string;\n readonly off: Array<() => void>;\n execution?: Promise<PageExecution>;\n executionValue?: PageExecution;\n}\n\n/** The selected page and frame. Only the registry and the connection's own setup assign it. */\nexport interface Selection {\n entry?: Entry;\n frame?: Frame;\n}\n\n/**\n * What the other driver seams do when a registered page changes. The registry calls each at one\n * fixed point of its own event handling, so their order relative to its state never moves.\n */\nexport interface TargetHooks {\n /** A tracked page was registered; `created` while this driver is opening the page itself. */\n readonly opened: (entry: Entry, created: boolean) => void;\n /** Before a closed page leaves the registry. */\n readonly closed: (entry: Entry) => void;\n /** Before a navigated frame's document epoch advances. */\n readonly navigating: (entry: Entry, frame: Frame) => void;\n /** After a navigated frame's document epoch advances. */\n readonly navigated: (entry: Entry, frame: Frame) => void;\n /** A frame navigated or detached, before any consequence for the selection. */\n readonly frameChanged: (entry: Entry, frame: Frame) => void;\n readonly dialog: (dialog: Dialog) => void;\n /** Retained observation is released before a selection is replaced. */\n readonly release: () => Promise<void>;\n readonly changed: (reason: \"target-changed\") => void;\n}\n\n/**\n * The connection's pages, frames and document epochs, and the one selected target every other\n * seam acts on. A page beyond the configured bound is closed and faulted, never tracked.\n */\nexport const makeTargets = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n hooks: TargetHooks,\n) => {\n const entries = new Map<string, Entry>();\n const byPage = new WeakMap<Page, Entry>();\n const frameIds = new WeakMap<Frame, string>();\n // A frame object outlives its documents, so readiness is keyed by frame *and* epoch.\n const documentEpochs = new WeakMap<Frame, number>();\n const selection: Selection = {};\n // Pages whose navigation this driver began and has not seen settle.\n const navigating = new Set<string>();\n\n let serial = 0,\n frameSerial = 0;\n\n let creatingPage = false;\n\n const epochOf = (frame: Frame): number => documentEpochs.get(frame) ?? 0;\n\n const frameId = (frame: Frame): string => {\n let id = frameIds.get(frame);\n\n if (id === undefined) {\n id = `frame-${++frameSerial}`;\n frameIds.set(frame, id);\n }\n\n return id;\n };\n\n const register = (page: Page): Entry => {\n const existing = byPage.get(page);\n\n if (existing !== undefined) return existing;\n const entry: Entry = { id: `page-${++serial}`, page, off: [] };\n\n byPage.set(page, entry);\n if (entries.size >= options.maxPages) {\n callbacks.submit(() => closeWithin(() => page.close()));\n events.fault();\n\n return entry;\n }\n entries.set(entry.id, entry);\n for (const frame of page.frames()) frameId(frame);\n\n const onClose = () => {\n hooks.closed(entry);\n entries.delete(entry.id);\n for (const off of entry.off.splice(0)) off();\n if (selection.entry === entry) {\n selection.entry = undefined;\n selection.frame = undefined;\n hooks.changed(\"target-changed\");\n }\n };\n\n const onNavigation = (frame: Frame) => {\n hooks.navigating(entry, frame);\n documentEpochs.set(frame, epochOf(frame) + 1);\n hooks.navigated(entry, frame);\n frameId(frame);\n hooks.frameChanged(entry, frame);\n if (selection.entry === entry && (selection.frame === frame || frame === page.mainFrame()))\n hooks.changed(\"target-changed\");\n };\n\n const onDetached = (frame: Frame) => {\n hooks.frameChanged(entry, frame);\n if (selection.frame === frame) {\n selection.frame = undefined;\n hooks.changed(\"target-changed\");\n }\n };\n\n const onDialog = (dialog: Dialog) => {\n hooks.dialog(dialog);\n };\n\n page.on(\"close\", onClose);\n page.on(\"framenavigated\", onNavigation);\n page.on(\"framedetached\", onDetached);\n page.on(\"dialog\", onDialog);\n entry.off.push(\n () => page.off(\"close\", onClose),\n () => page.off(\"framenavigated\", onNavigation),\n () => page.off(\"framedetached\", onDetached),\n () => page.off(\"dialog\", onDialog),\n );\n hooks.opened(entry, creatingPage);\n\n return entry;\n };\n\n const current = () => {\n if (\n closing() ||\n !browser.isConnected() ||\n selection.entry === undefined ||\n selection.entry.page.isClosed() ||\n selection.frame === undefined ||\n selection.frame.isDetached()\n )\n throw failure(\"closed\", \"undispatched\");\n\n return { entry: selection.entry, frame: selection.frame };\n };\n\n const targetId = async (entry: Entry): Promise<string> => {\n if (entry.targetId !== undefined) return entry.targetId;\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n const info: unknown = await cdp.send(\"Target.getTargetInfo\");\n\n entry.targetId = safeDecode(TargetInfo, info).targetInfo.targetId;\n\n return entry.targetId;\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n };\n\n const urlOf = (frame: Frame) => safeDecode(URLText, frame.url());\n\n const selectedUrl = () => urlOf(current().frame);\n\n /**\n * Chooses the connection's first target: a page it opens itself, the one the caller named, or\n * the only page present. Assignments land on the live selection as they happen.\n */\n const selectInitial = async (): Promise<void> => {\n if (options.newPage || entries.size === 0) {\n creatingPage = true;\n try {\n selection.entry = register(await context.newPage());\n } finally {\n creatingPage = false;\n }\n } else if (options.initialTargetId !== undefined) {\n for (const entry of entries.values())\n if ((await targetId(entry)) === options.initialTargetId) selection.entry = entry;\n if (selection.entry === undefined) throw failure(\"not-found\");\n } else {\n if (entries.size !== 1) throw failure(\"ambiguous\");\n selection.entry = entries.values().next().value;\n }\n };\n\n const clear = () => {\n entries.clear();\n selection.entry = undefined;\n selection.frame = undefined;\n };\n\n const selected = () => {\n const { entry, frame } = current();\n\n return { pageId: entry.id, frameId: frameId(frame) };\n };\n\n const selectedTargetId = () => sanitize(() => targetId(current().entry));\n\n const listPages = (ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const output: PageInfo[] = [];\n\n for (const entry of entries.values()) {\n const id = await targetId(entry);\n const title: unknown = await entry.page.title();\n\n ticket.check();\n if (typeof title !== \"string\") throw failure(\"malformed\");\n output.push(\n safeDecode(PageInfo, {\n pageId: entry.id,\n targetId: id,\n title: title.slice(0, 512),\n url: entry.page.url(),\n selected: selection.entry === entry,\n }),\n );\n }\n\n return output;\n });\n\n const selectPage = (id: string, ticket: Ticket) =>\n sanitize(async () => {\n const entry = entries.get(id);\n\n ticket.check();\n if (entry === undefined || entry.page.isClosed()) throw failure(\"not-found\", \"undispatched\");\n await hooks.release();\n ticket.check();\n selection.entry = entry;\n selection.frame = entry.page.mainFrame();\n hooks.changed(\"target-changed\");\n });\n\n const newPage = (ticket: Ticket) =>\n sanitize(async () => {\n if (entries.size >= options.maxPages) throw failure(\"limit\", \"undispatched\");\n ticket.dispatch();\n creatingPage = true;\n try {\n const page = await context.newPage();\n\n if (ticket.signal.aborted) {\n await closeWithin(() => page.close()).catch(() => {});\n ticket.check();\n }\n\n // Creation never silently selects a different tab.\n return register(page).id;\n } finally {\n creatingPage = false;\n }\n });\n\n const closePage = (id: string, ticket: Ticket) =>\n sanitize(async () => {\n const entry = entries.get(id);\n\n if (entry === undefined) throw failure(\"not-found\", \"undispatched\");\n ticket.dispatch();\n await entry.page.close({ runBeforeUnload: false });\n ticket.check();\n });\n\n const listFrames = (ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const frames = current().entry.page.frames();\n\n if (frames.length > 128) throw failure(\"limit\");\n\n return frames.map((frame) =>\n safeDecode(FrameInfo, {\n frameId: frameId(frame),\n parentFrameId: frame.parentFrame() === null ? null : frameId(frame.parentFrame()!),\n url: frame.url(),\n name: frame.name().slice(0, 256),\n }),\n );\n });\n\n const selectFrame = (id: string, ticket: Ticket) =>\n sanitize(async () => {\n const entry = selection.entry;\n\n if (entry === undefined) throw failure(\"closed\");\n const frame = entry.page.frames().find((f) => frameId(f) === id);\n\n if (frame === undefined || frame.isDetached()) throw failure(\"not-found\", \"undispatched\");\n await hooks.release();\n ticket.check();\n selection.frame = frame;\n hooks.changed(\"target-changed\");\n });\n\n return {\n entries: entries as ReadonlyMap<string, Entry>,\n selection,\n epochOf,\n frameId,\n register,\n current,\n targetId,\n urlOf,\n /** A navigation this driver began on the page is still in flight. */\n navigating: {\n begin: (pageId: string) => void navigating.add(pageId),\n end: (pageId: string) => void navigating.delete(pageId),\n has: (pageId: string) => navigating.has(pageId),\n },\n selectedUrl,\n selectInitial,\n clear,\n selected,\n selectedTargetId,\n listPages,\n selectPage,\n newPage,\n closePage,\n listFrames,\n selectFrame,\n };\n};\n\nexport type Targets = ReturnType<typeof makeTargets>;\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, CDPSession, Dialog, Page } from \"playwright-core\";\n\nimport { BrowserError, InitializationError } from \"../../Errors.ts\";\nimport { makeActions } from \"./Actions.ts\";\nimport { CallbackTasks } from \"./CallbackTasks.ts\";\nimport { makeCaptureSources } from \"./CaptureSource.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { makeInitialization } from \"./Initialization.ts\";\nimport { makeKeyboard } from \"./Keyboard.ts\";\nimport { closeWithin, failure, NativeFailure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport { makePageControl } from \"./NativePageControl.ts\";\nimport { makeObservation } from \"./Observation.ts\";\nimport { makePointer } from \"./Pointer.ts\";\nimport { type Entry, makeTargets } from \"./Targets.ts\";\n\nconst NativeWindow = Schema.Struct({ windowId: Schema.Natural });\n\n/**\n * The provider-issued address is accepted only as a credential-free Browserbase WSS URL. Every\n * binding applies this first, including one a host routes elsewhere, so routing can never be\n * reached with an address the provider did not plausibly issue.\n */\nexport const validateConnection = (connection: unknown): string => {\n if (typeof connection !== \"string\" || connection.length > 16384) throw failure(\"malformed\");\n let url: URL;\n\n try {\n url = new URL(connection);\n } catch {\n throw failure(\"malformed\");\n }\n if (\n url.protocol !== \"wss:\" ||\n url.username ||\n url.password ||\n url.port ||\n !url.hostname.endsWith(\".browserbase.com\")\n )\n throw failure(\"unsafe-url\");\n\n return connection;\n};\n\n/**\n * Connects to an already validated or host-resolved CDP endpoint and builds the one driver. The\n * import is lazy, so constructing any Layer cannot load Playwright or allocate a browser. A\n * trusted observer sees the engine's browser before the driver exists and never replaces it.\n */\nexport const connectPlaywrightEndpoint = async (\n endpoint: string,\n signal: AbortSignal,\n options: DriverOptions,\n events: DriverEvents,\n observe?: (browser: Browser) => void,\n): Promise<Driver> => {\n if (signal.aborted) throw failure(\"interrupted\");\n const { chromium } = await import(\"playwright-core\");\n\n const browser = await sanitize(() =>\n chromium.connectOverCDP(endpoint, {\n timeout: 15000,\n ...(options.pageControl ? { noDefaults: true } : {}),\n }),\n );\n\n if (signal.aborted) {\n await closeWithin(() => browser.close()).catch(() => {});\n throw failure(\"interrupted\");\n }\n try {\n observe?.(browser);\n const driver = await makePlaywrightDriver(browser, options, events);\n\n if (signal.aborted) {\n await driver.disconnect().catch(() => {});\n throw failure(\"interrupted\");\n }\n\n return driver;\n } catch (error) {\n await closeWithin(() => browser.close()).catch(() => {});\n throw Schema.is(BrowserError)(error) ||\n Schema.is(InitializationError)(error) ||\n Schema.is(NativeFailure)(error)\n ? error\n : failure(\"provider\");\n }\n};\n\n/** Tests may supply a real already-connected browser. This is deliberately not an exported subpath. */\nexport const makePlaywrightDriver = async (\n browser: Browser,\n options: DriverOptions,\n events: DriverEvents,\n): Promise<Driver> => {\n const contexts = browser.contexts();\n\n if (contexts.length !== 1) throw failure(\"ambiguous\");\n const context: BrowserContext = contexts[0];\n const dialogs = new Set<Dialog>();\n const callbacks = new CallbackTasks(32, () => events.fault());\n\n let closing = false;\n let initialized = false;\n let browserCdp: CDPSession | undefined;\n\n const targets = makeTargets(browser, context, options, callbacks, events, () => closing, {\n opened: (entry, created) => {\n if (initialized && options.pageControl)\n callbacks.submit(async () => {\n await pageControl.execution(entry);\n });\n if (initialized) initialization.attachPage(entry.page);\n if (initialized && !created) {\n if (options.popupPolicy === \"close\")\n callbacks.submit(() => closeWithin(() => entry.page.close()));\n else if (options.popupPolicy === \"pause\") events.pause();\n }\n },\n closed: (entry) => {\n pageControl.closed(entry);\n captures.invalidate(entry, \"target-changed\");\n captures.forget(entry);\n },\n navigating: (entry, frame) => pageControl.navigating(entry, frame),\n navigated: (entry, frame) => {\n if (initialized) initialization.attachFrame(frame, entry.page);\n },\n frameChanged: (entry, frame) => {\n captures.invalidate(entry, \"target-changed\", frame);\n },\n dialog: (dialog) => {\n if (options.dialogPolicy === \"dismiss\")\n callbacks.submit(() => closeWithin(() => dialog.dismiss()));\n else if (dialogs.size >= 8) {\n events.fault();\n callbacks.submit(() => closeWithin(() => dialog.dismiss()));\n } else {\n dialogs.add(dialog);\n observation.invalidate();\n events.pause();\n }\n },\n release: () => observation.dispose(),\n changed: (reason) => observation.changed(reason),\n });\n\n const { current, entries, register } = targets;\n\n const initialization = makeInitialization(\n context,\n options,\n targets,\n callbacks,\n events,\n () => closing,\n );\n\n const observation = makeObservation(targets, events);\n const actions = makeActions(context, targets, observation);\n const pointer = makePointer(targets, actions);\n const keyboard = makeKeyboard(targets, actions, pointer.receipt);\n const captures = makeCaptureSources(targets);\n\n const pageControl = makePageControl(\n browser,\n context,\n options,\n targets,\n callbacks,\n events,\n () => closing,\n (pageId) => observation.held(pageId),\n );\n\n const onPage = (page: Page) => {\n register(page);\n };\n\n const onDisconnected = () => {\n if (!closing) {\n observation.invalidate();\n events.disconnected();\n }\n };\n\n context.on(\"page\", onPage);\n browser.on(\"disconnected\", onDisconnected);\n\n const sizeNativeContents = async (entry: Entry): Promise<void> => {\n if (browserCdp === undefined) throw failure(\"closed\", \"undispatched\");\n const targetId = await targets.targetId(entry);\n const current: unknown = await browserCdp.send(\"Browser.getWindowForTarget\", { targetId });\n const native = safeDecode(NativeWindow, current);\n\n await browserCdp.send(\"Browser.setContentsSize\", {\n windowId: native.windowId,\n width: options.viewport.width,\n height: options.viewport.height,\n });\n };\n\n const driver: Driver = {\n ...(options.pageControl\n ? {\n pageControl: pageControl.operations,\n }\n : {}),\n selected: targets.selected,\n selectedTargetId: targets.selectedTargetId,\n listPages: targets.listPages,\n selectPage: targets.selectPage,\n newPage: targets.newPage,\n closePage: targets.closePage,\n listFrames: targets.listFrames,\n selectFrame: targets.selectFrame,\n beginNavigation: actions.beginNavigation,\n readText: observation.readText,\n observe: observation.observe,\n checkpoint: observation.checkpoint,\n controlFacts: observation.controlFacts,\n revalidate: observation.revalidate,\n click: actions.click,\n fill: actions.fill,\n scroll: actions.scroll,\n pointerMove: pointer.pointerMove,\n hover: pointer.hover,\n wheel: pointer.wheel,\n press: keyboard.press,\n type: keyboard.type,\n screenshot: observation.screenshot,\n resize: (viewport, ticket) =>\n sanitize(async () => {\n const page = current().entry.page;\n const entry = current().entry;\n\n ticket.dispatch();\n captures.invalidate(entry, \"resized\");\n observation.changed(\"resized\");\n await page.setViewportSize(viewport);\n ticket.check();\n }),\n waitFor: actions.waitFor,\n clickAndWait: actions.clickAndWait,\n clickForDownload: actions.clickForDownload,\n selectFiles: actions.selectFiles,\n clickForFileSelection: actions.clickForFileSelection,\n documentReadiness: initialization.documentReadiness,\n dismissDialogs: (ticket) =>\n sanitize(async () => {\n for (const dialog of [...dialogs]) {\n ticket.dispatch();\n await dialog.dismiss();\n dialogs.delete(dialog);\n }\n }),\n capture: captures.capture,\n invalidateObservation: observation.invalidate,\n fenceInitialization: initialization.fence,\n disposeInitialization: initialization.dispose,\n disconnect: () =>\n sanitize(async () => {\n closing = true;\n initialization.fence();\n callbacks.stop();\n observation.invalidate();\n context.off(\"page\", onPage);\n browser.off(\"disconnected\", onDisconnected);\n for (const entry of entries.values()) for (const off of entry.off.splice(0)) off();\n captures.clear();\n await closeWithin(initialization.dispose).catch(() => {});\n await observation.dispose().catch(() => {});\n await closeWithin(() =>\n Promise.allSettled([...dialogs].map((dialog) => dialog.dismiss())),\n ).catch(() => {});\n dialogs.clear();\n await closeWithin(() => callbacks.settle()).catch(() => {});\n await closeWithin(() => pageControl.dispose()).catch(() => {});\n await closeWithin(() => browserCdp?.detach() ?? Promise.resolve()).catch(() => {});\n await closeWithin(() => browser.close());\n targets.clear();\n }),\n };\n\n try {\n for (const page of context.pages()) register(page);\n browserCdp = await browser.newBrowserCDPSession();\n await browserCdp.send(\"Browser.setDownloadBehavior\", {\n behavior: \"allow\",\n downloadPath: \"downloads\",\n eventsEnabled: true,\n });\n // Registrations precede the first document this connection creates, and precede any\n // navigation the caller makes, without this setup navigating anything itself.\n await initialization.install();\n for (const entry of entries.values()) await initialization.attach(entry.page);\n await targets.selectInitial();\n const { selection } = targets;\n\n if (selection.entry === undefined) throw failure(\"not-found\");\n await initialization.attach(selection.entry.page);\n selection.frame = selection.entry.page.mainFrame();\n if (!options.preserveViewport) {\n await sizeNativeContents(selection.entry);\n await selection.entry.page.setViewportSize(options.viewport);\n }\n await targets.targetId(selection.entry);\n if (options.pageControl)\n for (const entry of entries.values()) await pageControl.execution(entry);\n initialized = true;\n\n return driver;\n } catch (error) {\n await driver.disconnect().catch(() => {});\n throw error;\n }\n};\n","import { Context, Effect, Layer, Redacted } from \"effect\";\n\nimport type { BrowserError } from \"./Errors.ts\";\nimport { fromNativeAttempt, issueBinding } from \"./internal/browser/Binding.ts\";\nimport { publicError } from \"./internal/browser/NativeCalls.ts\";\nimport { connectPlaywrightEndpoint, validateConnection } from \"./internal/browser/Playwright.ts\";\n\n/**\n * The trusted native engine an owned or borrowed browser connects through. It is opaque: only\n * this module issues one, so a value that merely has this shape is refused before allocation\n * rather than trusted with a connection.\n */\nexport interface BrowserBinding {\n readonly _tag: \"BrowserbaseBrowserBinding\";\n}\n\nexport interface PlaywrightOptions {\n /**\n * Trusted host routing. It runs only after the provider-issued address passed the same strict\n * checks as the default, and returns the CDP endpoint to connect to instead. A local engine\n * reached this way says nothing about how a hosted connection behaves.\n */\n readonly resolveEndpoint?: (provider: {\n readonly url: Redacted.Redacted<string>;\n }) => Effect.Effect<string, BrowserError>;\n /**\n * Trusted instrumentation of the engine's own browser object, called once per connection with\n * the endpoint it reached, before the owner drives it. The object is typed `unknown` so that\n * no declaration of this package names the optional native peer; it is host configuration,\n * never model-facing.\n */\n readonly onConnected?: (connection: {\n readonly native: unknown;\n readonly endpoint: string;\n }) => void;\n}\n\nconst invalid = (connection: unknown) =>\n Effect.try({\n try: () => validateConnection(connection),\n catch: (error) => publicError(error, \"connect\", { reason: \"malformed\" }),\n });\n\n/** Playwright over CDP, lazily loaded at connection time and never at Layer construction. */\nexport const playwright = (options: PlaywrightOptions = {}): BrowserBinding => {\n const { resolveEndpoint, onConnected } = options;\n\n return issueBinding(\n { _tag: \"BrowserbaseBrowserBinding\" },\n {\n connect: (request) =>\n Effect.gen(function* () {\n const validated = yield* invalid(request.connection);\n\n const endpoint =\n resolveEndpoint === undefined\n ? validated\n : yield* resolveEndpoint({ url: Redacted.make(validated) });\n\n return yield* fromNativeAttempt((attempt, signal) =>\n connectPlaywrightEndpoint(\n endpoint,\n signal,\n attempt.options,\n attempt.events,\n onConnected === undefined ? undefined : (native) => onConnected({ native, endpoint }),\n ),\n ).connect(request);\n }),\n },\n );\n};\n\nconst defaultBinding = playwright();\n\n/** Defaults to Playwright with the provider's own address, so no consumer has to provide it. */\nexport const BrowserbaseBrowserBinding = Context.Reference<BrowserBinding>(\n \"effect-browserbase/BrowserBinding\",\n { defaultValue: () => defaultBinding },\n);\n\n/** Supply a binding to every browser Layer built beneath it. */\nexport const layer = (binding: BrowserBinding): Layer.Layer<never> =>\n Layer.succeed(BrowserbaseBrowserBinding, binding);\n\nexport const layerPlaywright: Layer.Layer<never> = layer(defaultBinding);\n"],"mappings":"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"}
|