effect-browser 0.2.0-beta.0 → 0.2.0-beta.1

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.
Files changed (40) hide show
  1. package/README.md +150 -10
  2. package/dist/{Association-zlgInoaj.mjs → Association-BsSfBYVx.mjs} +14 -10
  3. package/dist/Association-BsSfBYVx.mjs.map +1 -0
  4. package/dist/{Bootstrap-Be-2Ddmh.mjs → Bootstrap-CeQOWBy6.mjs} +6 -4
  5. package/dist/Bootstrap-CeQOWBy6.mjs.map +1 -0
  6. package/dist/Bootstrap.mjs +1 -1
  7. package/dist/Browser.d.mts +13 -1
  8. package/dist/Browser.mjs.map +1 -1
  9. package/dist/{BrowserData-DJAnUHoZ.d.mts → BrowserData-CRuxEZcn.d.mts} +90 -10
  10. package/dist/BrowserData.d.mts +2 -2
  11. package/dist/BrowserData.mjs +85 -7
  12. package/dist/BrowserData.mjs.map +1 -1
  13. package/dist/BrowserRuntime-Coz-5DYb.d.mts +143 -0
  14. package/dist/{BrowserRuntime-fZz1b0VI.mjs → BrowserRuntime-DViKNUdD.mjs} +2819 -2206
  15. package/dist/BrowserRuntime-DViKNUdD.mjs.map +1 -0
  16. package/dist/BrowserRuntime.d.mts +3 -139
  17. package/dist/BrowserRuntime.mjs +1 -1
  18. package/dist/Capture.d.mts +15 -1
  19. package/dist/Capture.mjs +58 -22
  20. package/dist/Capture.mjs.map +1 -1
  21. package/dist/{CaptureData-AmqVP_Ba.mjs → CaptureData-B5-mXlyq.mjs} +24 -6
  22. package/dist/CaptureData-B5-mXlyq.mjs.map +1 -0
  23. package/dist/CaptureData.d.mts +11 -2
  24. package/dist/CaptureData.mjs +1 -1
  25. package/dist/Chromium.d.mts +4 -3
  26. package/dist/Chromium.mjs +22 -16
  27. package/dist/Chromium.mjs.map +1 -1
  28. package/dist/Errors.d.mts +2 -2
  29. package/dist/Errors.mjs +1 -0
  30. package/dist/Errors.mjs.map +1 -1
  31. package/dist/PageControl.d.mts +1 -1
  32. package/dist/PageControl.mjs +1 -1
  33. package/dist/Testing.d.mts +437 -0
  34. package/dist/Testing.mjs +1561 -0
  35. package/dist/Testing.mjs.map +1 -0
  36. package/package.json +5 -1
  37. package/dist/Association-zlgInoaj.mjs.map +0 -1
  38. package/dist/Bootstrap-Be-2Ddmh.mjs.map +0 -1
  39. package/dist/BrowserRuntime-fZz1b0VI.mjs.map +0 -1
  40. package/dist/CaptureData-AmqVP_Ba.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserRuntime-fZz1b0VI.mjs","names":["Registration.snapshot","Registration.invoke","invoke","TextResult","Bootstrap.empty"],"sources":["../src/internal/browser/Binding.ts","../src/internal/browser/BindingRunner.ts","../src/internal/browser/Bootstrap.ts","../src/internal/browser/Bindings.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/PolicyCleanup.ts","../src/internal/browser/Targets.ts","../src/internal/browser/Playwright.ts","../src/internal/browser/SchemaPath.ts","../src/internal/browser/PublicSession.ts","../src/internal/browser/ConnectionCleanup.ts","../src/internal/browser/Owner.ts","../src/internal/browser/Session.ts","../src/BrowserRuntime.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { BrowserError, InitializationError, Reasons } 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({\n operation: \"connect\",\n reason: Reasons.Interrupted.make({}),\n outcome: \"unknown\",\n });\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\", {\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\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 { Effect, Exit, FiberSet, Scope } from \"effect\";\n\nimport type { CallbackFailureMode } from \"./CallbackTasks.ts\";\nimport type { DriverFault } from \"./Driver.ts\";\n\nexport type BindingRejection = \"closed\" | \"capacity\";\n\nexport type BindingAdmission<A, E> =\n | { readonly _tag: \"Rejected\"; readonly reason: BindingRejection }\n | { readonly _tag: \"Accepted\"; readonly result: Promise<Exit.Exit<A, E>> };\n\n/**\n * Scoped host runner for future page-callable bindings. Admission is synchronous and finite:\n * no Fiber exists until a slot has been reserved. The owning Scope interrupts accepted work;\n * consumer failures remain in an Exit on the host and are never page reply material here.\n */\nexport interface BindingRunner<I, A, E> {\n /** Fence new callbacks synchronously; the owning Scope still owns accepted work. */\n readonly close: () => void;\n /** Native owner faults request cancellation immediately; the Scope still joins every fiber. */\n readonly interrupt: () => void;\n readonly submit: (input: I, failureMode?: CallbackFailureMode) => BindingAdmission<A, E>;\n}\n\nexport const makeBindingRunner = <I, A, E, R>(\n capacity: number,\n handle: (input: I) => Effect.Effect<A, E, R>,\n onFault: (event: Extract<DriverFault, { readonly source: \"binding\" }>) => void,\n): Effect.Effect<BindingRunner<I, A, E>, never, R | Scope.Scope> => {\n if (!Number.isSafeInteger(capacity) || capacity < 1)\n throw new RangeError(\"Invalid binding callback capacity\");\n\n return Effect.gen(function* () {\n const parent = yield* Scope.Scope;\n // Do not depend on an application's ambient finalizer strategy for callback ordering.\n // One private sequential child owns both FiberSet and the admission fence.\n const runtimeScope = yield* Scope.fork(parent, \"sequential\");\n\n const fibers = yield* FiberSet.make<Exit.Exit<A, E>, never>().pipe(Scope.provide(runtimeScope));\n const run = yield* FiberSet.runtimePromise(fibers)<R>();\n\n let accepting = true;\n let faulted = false;\n let inFlight = 0;\n\n const close = () => {\n accepting = false;\n };\n\n const interrupt = () => {\n close();\n // Called synchronously by native owner fencing; scoped FiberSet cleanup performs the join.\n for (const fiber of fibers) fiber.interruptUnsafe();\n };\n\n const fault = () => {\n if (!accepting || faulted) return;\n faulted = true;\n onFault({ source: \"binding\", reason: \"callback-failure\", disposition: \"known\" });\n };\n\n // FiberSet registered its child-scope finalizer first. Sequential reverse registration\n // order therefore closes admission before the set interrupts accepted callbacks.\n yield* Scope.addFinalizer(runtimeScope, Effect.sync(close));\n\n const submit = (\n input: I,\n failureMode: CallbackFailureMode = \"fail-session\",\n ): BindingAdmission<A, E> => {\n if (!accepting || faulted) return { _tag: \"Rejected\", reason: \"closed\" };\n if (inFlight >= capacity) {\n if (failureMode === \"fail-session\") fault();\n\n return { _tag: \"Rejected\", reason: \"capacity\" };\n }\n\n inFlight++;\n // Construct the consumer Effect inside the admitted fiber as well: a consumer callback\n // that throws while producing its Effect is a host defect, not work allowed before admission.\n const execution = run(Effect.exit(Effect.suspend(() => handle(input))));\n\n const result = execution\n .then(\n (exit) => {\n if (failureMode === \"fail-session\" && Exit.isFailure(exit)) fault();\n\n return exit;\n },\n (error) => {\n if (failureMode === \"fail-session\") fault();\n throw error;\n },\n )\n .finally(() => {\n inFlight--;\n });\n\n // A native caller may disappear while the host callback is still settling. Keep the\n // Promise observed without consuming the Exit returned to a caller that is still present.\n void result.catch(() => {});\n\n return { _tag: \"Accepted\", result };\n };\n\n return { close, interrupt, submit };\n });\n};\n","import type { Plan } from \"../../Bootstrap.ts\";\n\nexport interface ReadinessRequirement {\n readonly step: string;\n readonly expression: string;\n readonly timeoutMillis: number;\n readonly origins?: ReadonlyArray<string>;\n}\n\n/** What the native driver installs: one ordered bundle, its capabilities and its gates. */\nexport interface CompiledBootstrap {\n readonly bundle?: string;\n readonly permissions: ReadonlyArray<{\n readonly origin: string;\n readonly permissions: ReadonlyArray<string>;\n }>;\n readonly readiness: ReadonlyArray<ReadinessRequirement>;\n readonly existingDocuments: \"RequireFreshNavigation\" | \"AcceptAlreadyRunning\";\n}\n\nconst guarded = (content: string, origins: ReadonlyArray<string> | undefined): string =>\n origins === undefined\n ? `(() => {\\n${content}\\n})();`\n : `(() => {\\nconst origins = ${JSON.stringify([...origins])};\\nif (!origins.includes(globalThis.location && globalThis.location.origin)) return;\\n${content}\\n})();`;\n\n/**\n * Dependent steps become one script in declared order: a failing step stops the ones after it\n * rather than letting a later step observe half-initialized state. Origin-excluded steps are\n * skipped inside the document that reports the origin, never by guessing from a navigation URL.\n */\nexport const compileBootstrap = (\n plan: Pick<Plan, \"scripts\" | \"permissions\">,\n): CompiledBootstrap | undefined => {\n if (plan.scripts.length === 0 && plan.permissions.length === 0) return undefined;\n\n const bundle =\n plan.scripts.length === 0\n ? undefined\n : plan.scripts.map((script) => guarded(script.content, script.origins)).join(\"\\n\");\n\n const readiness = plan.scripts.flatMap((script) =>\n script.readiness === undefined\n ? []\n : [\n {\n step: script.id,\n expression: script.readiness.expression,\n timeoutMillis: script.readiness.timeoutMillis,\n ...(script.origins === undefined ? {} : { origins: script.origins }),\n },\n ],\n );\n\n // The most conservative declared policy governs the whole plan: one document is either\n // admitted for dependent work or it is not, and steps cannot disagree about that.\n const existingDocuments = plan.scripts.some(\n (script) => script.readiness?.existingDocuments === \"RequireFreshNavigation\",\n )\n ? \"RequireFreshNavigation\"\n : \"AcceptAlreadyRunning\";\n\n return {\n ...(bundle === undefined ? {} : { bundle }),\n permissions: plan.permissions.map((grant) => ({\n origin: grant.origin,\n permissions: [...grant.permissions],\n })),\n readiness,\n existingDocuments,\n };\n};\n\n/** Duplicate step identity would make registration order and readiness reports ambiguous. */\nexport const duplicateStep = (plan: Pick<Plan, \"scripts\" | \"permissions\" | \"bindings\">): boolean =>\n new Set(plan.scripts.map((script) => script.id)).size !== plan.scripts.length ||\n new Set(plan.permissions.map((grant) => grant.origin)).size !== plan.permissions.length ||\n new Set((plan.bindings ?? []).map((registration) => registration.name)).size !==\n (plan.bindings?.length ?? 0);\n","import { Cause, Deferred, Effect, Exit, Schema, Scope } from \"effect\";\n\nimport * as Bootstrap from \"../../Bootstrap.ts\";\nimport { BrowserError, InitializationError, Reasons } from \"../../Errors.ts\";\nimport * as Registration from \"./BindingRegistration.ts\";\nimport { makeBindingRunner } from \"./BindingRunner.ts\";\nimport { duplicateStep } from \"./Bootstrap.ts\";\nimport type { DriverFault } from \"./Driver.ts\";\n\nexport interface NativeBindingCall {\n /** Validate native membership, allowed origin and the captured document before returning JSON. */\n readonly read: (signal: AbortSignal) => Promise<string>;\n /** Revalidate the same native caller/document; never substitute a newly selected document. */\n readonly check: (signal: AbortSignal) => Promise<void>;\n /** Idempotently fence retained handles and dispose late arrivals as they become available. */\n readonly dispose: () => Promise<void>;\n}\n\nexport interface NativeBinding {\n readonly name: string;\n readonly origins: ReadonlyArray<string>;\n readonly maxConcurrent: number;\n readonly maxInputBytes: number;\n readonly timeoutMillis: number;\n /** Rejected admission never calls read/check/dispose; the native callback still owns its handles. */\n readonly invoke: (call: NativeBindingCall) => Promise<string>;\n}\n\nexport interface ConnectionBindings {\n readonly bindings: ReadonlyArray<NativeBinding>;\n readonly close: () => void;\n /** Native registration/transport failure supervises the owner, not a single page invocation. */\n readonly reportFailure: (error: InitializationError) => void;\n /** Drain scoped Effect fibers. Late native promises remain observed and occupy capacity. */\n readonly dispose: Effect.Effect<void>;\n}\n\nexport interface Bindings<E> {\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly diagnostics: Effect.Effect<Bootstrap.BindingDiagnostics<E>>;\n readonly connect: (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent?: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\nconst invalidPlan = () =>\n BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n\nconst AdmissionPlan = Schema.Struct({\n ...Bootstrap.Plan.fields,\n bindings: Schema.optionalKey(Schema.Array(Schema.Unknown).check(Schema.isMaxLength(16))),\n});\n\n/** Validate before allocation and retain an immutable snapshot, including authenticated callbacks. */\nexport const preparePlan = Effect.fnUntraced(function* <E, R>(\n plan: Bootstrap.Plan<E, R>,\n): Effect.fn.Return<Bootstrap.Plan<E, R>, BrowserError> {\n const source = yield* Effect.try({\n try: () => ({ ...plan }),\n catch: invalidPlan,\n });\n\n const data = yield* Schema.decodeEffect(AdmissionPlan, { onExcessProperty: \"error\" })(\n source,\n ).pipe(Effect.mapError(invalidPlan));\n\n if (duplicateStep({ scripts: data.scripts, permissions: data.permissions }))\n return yield* invalidPlan();\n const candidates = source.bindings === undefined ? [] : source.bindings;\n\n const bindings = yield* Effect.forEach([...candidates], (registration) =>\n Registration.snapshot(registration),\n );\n\n if (new Set(bindings.map((registration) => registration.name)).size !== bindings.length) {\n return yield* invalidPlan();\n }\n\n return Object.freeze({\n scripts: Object.freeze(\n data.scripts.map((script) =>\n Object.freeze({\n ...script,\n ...(script.origins === undefined ? {} : { origins: Object.freeze([...script.origins]) }),\n ...(script.readiness === undefined\n ? {}\n : { readiness: Object.freeze({ ...script.readiness }) }),\n }),\n ),\n ),\n permissions: Object.freeze(\n data.permissions.map((grant) =>\n Object.freeze({\n ...grant,\n permissions: Object.freeze([...grant.permissions]),\n }),\n ),\n ),\n ...(bindings.length === 0 ? {} : { bindings: Object.freeze(bindings) }),\n });\n});\n\nconst rejected = (): Promise<never> => {\n const error = new Error(\"Browser binding call rejected\");\n\n error.name = \"BrowserBindingError\";\n error.stack = \"\";\n const result = Promise.reject(error);\n\n void result.catch(() => {});\n\n return result;\n};\n\nconst increment = (value: number) => Math.min(Number.MAX_SAFE_INTEGER, value + 1);\n\n/** The caller must pass preparePlan's snapshot; dependencies are captured at acquisition. */\nexport const makeBindings = Effect.fnUntraced(function* <E, R>(\n plan: Bootstrap.Plan<E, R>,\n): Effect.fn.Return<Bindings<E>, never, Exclude<R, Scope.Scope> | Scope.Scope> {\n // Effect.scoped installs a fresh invocation Scope inside this captured context. A consumer\n // handler never receives the acquisition Scope even when the actual context contains it.\n const consumer = yield* Effect.context<Exclude<R, Scope.Scope>>();\n const ownerScope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n const failure = yield* Deferred.make<never, E | InitializationError>();\n const connections = new Set<ConnectionBindings>();\n const failures: Array<Bootstrap.BindingFailure<E>> = [];\n let droppedFailures = 0;\n let faulted = false;\n let ownerClosed = false;\n\n const entries = (plan.bindings ?? []).map((registration) => ({\n registration,\n state: {\n name: registration.name,\n inFlight: 0,\n pendingNative: 0,\n retired: 0,\n accepted: 0,\n succeeded: 0,\n rejected: 0,\n },\n }));\n\n yield* Scope.addFinalizer(\n ownerScope,\n Effect.suspend(() => {\n ownerClosed = true;\n const owned = [...connections];\n\n for (const connection of owned) connection.close();\n\n return Effect.forEach(owned, (connection) => connection.dispose, { discard: true });\n }),\n );\n\n const connect = Effect.fnUntraced(function* (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent: () => boolean = isActive,\n ): Effect.fn.Return<ConnectionBindings, never, Scope.Scope> {\n const connectionScope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n let closed = ownerClosed || faulted;\n const fences: Array<() => void> = [];\n const current = () => !closed && !ownerClosed && !faulted && isCurrent();\n const active = () => current() && isActive();\n\n const close = () => {\n closed = true;\n for (const fence of fences) fence();\n };\n\n const record = (\n registration: Pick<Registration.Registration<E, R>, \"name\" | \"failureMode\">,\n cause: Cause.Cause<E | InitializationError>,\n event: DriverFault = { source: \"binding\", reason: \"callback-failure\", disposition: \"known\" },\n ) => {\n if (failures.length === 32) {\n failures.shift();\n droppedFailures = increment(droppedFailures);\n }\n failures.push(\n Object.freeze({ name: registration.name, mode: registration.failureMode, cause }),\n );\n if (registration.failureMode === \"fail-session\" && current()) {\n faulted = true;\n // The host can observe the original typed cause as soon as its owner is fenced.\n Deferred.doneUnsafe(failure, Effect.failCause(cause));\n // The owner must fence browser admission before interrupted callback finalizers run.\n onFault(event);\n for (const connection of connections) connection.close();\n }\n };\n\n const bindings = yield* Effect.forEach(entries, ({ registration, state }) =>\n Effect.gen(function* () {\n const error = (\n reason: InitializationError[\"reason\"],\n operation: InitializationError[\"operation\"] = \"callback\",\n ) => InitializationError.make({ operation, step: registration.name, reason });\n\n interface Work {\n readonly call: NativeBindingCall;\n pending: number;\n finished: boolean;\n released: boolean;\n nativeFault?: Extract<DriverFault, { readonly source: \"native\" }>;\n }\n\n const release = (work: Work) => {\n if (!work.finished || work.pending !== 0 || work.released) return;\n work.released = true;\n state.inFlight--;\n state.retired--;\n };\n\n const track = <A>(work: Work, promise: Promise<A>): Promise<A> => {\n work.pending++;\n state.pendingNative++;\n\n const settled = () => {\n work.pending--;\n state.pendingNative--;\n release(work);\n };\n\n void promise.then(settled, settled);\n\n return promise;\n };\n\n const finish = (work: Work) => {\n if (work.finished) return;\n work.finished = true;\n state.retired++;\n\n // Disposal may complete before an abort-ignoring read. Both remain accounted for.\n const disposing = Promise.resolve()\n .then(() => work.call.dispose())\n .catch(() => {\n record(registration, Cause.fail(error(\"native\", \"dispose\")), {\n source: \"native\",\n reason: \"callback\",\n disposition: \"unknown\",\n });\n });\n\n track(work, disposing);\n };\n\n const native = <A>(work: Work, action: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: (signal) => track(work, action(signal)),\n catch: (cause) => {\n work.nativeFault = { source: \"native\", reason: \"callback\", disposition: \"unknown\" };\n\n return Schema.is(InitializationError)(cause) ? error(cause.reason) : error(\"native\");\n },\n });\n\n const execute = Effect.fnUntraced(function* (work: Work) {\n const check = Effect.suspend(() =>\n active() ? native(work, work.call.check) : Effect.fail(error(\"closed\")),\n );\n\n if (!active()) return yield* error(\"closed\");\n const text = yield* native(work, work.call.read);\n const result = yield* Registration.invoke(registration, text, check);\n\n yield* check;\n\n return result;\n });\n\n const runner = yield* makeBindingRunner(\n registration.maxConcurrent,\n (work: Work) =>\n Effect.scoped(execute(work)).pipe(\n Effect.timeoutOrElse({\n duration: registration.timeoutMillis,\n orElse: () => Effect.fail(error(\"timeout\")),\n }),\n Effect.provideContext(consumer),\n ),\n () => {},\n ).pipe(Scope.provide(connectionScope));\n\n fences.push(runner.interrupt);\n\n const invoke = (call: NativeBindingCall): Promise<string> => {\n if (!active()) {\n state.rejected = increment(state.rejected);\n\n return rejected();\n }\n if (state.inFlight >= registration.maxConcurrent) {\n state.rejected = increment(state.rejected);\n record(registration, Cause.fail(error(\"busy\")));\n\n return rejected();\n }\n // This reservation also covers codec work, native validation and late native disposal.\n // It is shared across connections, so reconnect cannot reset quarantined capacity.\n state.inFlight++;\n state.accepted = increment(state.accepted);\n const work: Work = { call, pending: 0, finished: false, released: false };\n const admission = runner.submit(work, \"reject-call\");\n\n if (admission._tag === \"Rejected\") {\n state.rejected = increment(state.rejected);\n finish(work);\n\n return rejected();\n }\n\n const result = admission.result\n .then(\n (exit) => {\n if (Exit.isFailure(exit)) {\n state.rejected = increment(state.rejected);\n record(registration, exit.cause, work.nativeFault);\n\n return rejected();\n }\n if (!active()) {\n state.rejected = increment(state.rejected);\n\n return rejected();\n }\n state.succeeded = increment(state.succeeded);\n\n return exit.value;\n },\n () => {\n state.rejected = increment(state.rejected);\n if (active())\n record(registration, Cause.fail(error(\"native\")), {\n source: \"native\",\n reason: \"callback\",\n disposition: \"unknown\",\n });\n\n return rejected();\n },\n )\n .finally(() => finish(work));\n\n void result.catch(() => {});\n\n return result;\n };\n\n return Object.freeze({\n name: registration.name,\n origins: registration.origins,\n maxConcurrent: registration.maxConcurrent,\n maxInputBytes: registration.maxInputBytes,\n timeoutMillis: registration.timeoutMillis,\n invoke,\n });\n }),\n );\n\n const connection: ConnectionBindings = {\n bindings: Object.freeze(bindings),\n close,\n reportFailure: (error) => {\n if (!current()) return;\n record({ name: error.step, failureMode: \"fail-session\" }, Cause.fail(error), {\n source: \"native\",\n reason: \"registration\",\n disposition: \"unknown\",\n });\n },\n dispose: Effect.sync(close).pipe(Effect.andThen(Scope.close(connectionScope, Exit.void))),\n };\n\n connections.add(connection);\n yield* Scope.addFinalizer(\n connectionScope,\n Effect.sync(() => {\n close();\n connections.delete(connection);\n }),\n );\n\n return connection;\n }, Effect.uninterruptible);\n\n return {\n failure: Deferred.await(failure),\n diagnostics: Effect.sync(() =>\n Object.freeze({\n faulted,\n bindings: Object.freeze(entries.map(({ state }) => Object.freeze({ ...state }))),\n failures: Object.freeze([...failures]),\n droppedFailures,\n }),\n ),\n connect,\n };\n});\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 \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { Driver, DriverTarget, NativeFileSelection, NavigationControl } 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, WaitTicket } from \"./Owner.ts\";\nimport type { Entry, 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(Reasons.Interrupted.make({})));\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(Reasons.Timeout.make({})));\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\ninterface NavigationStopPort {\n readonly stop: () => Promise<void>;\n readonly close: () => Promise<void>;\n}\n\n/**\n * Native stop setup may yield while the navigation completes. Recheck its owner immediately\n * before dispatch, while the caller still holds the browser-owner permit.\n */\nexport const dispatchNavigationStop = async (\n ticket: Ticket,\n pending: () => boolean,\n onDispatch: () => void,\n open: () => Promise<NavigationStopPort>,\n retainSetup: () => () => void,\n): Promise<\"dispatched\" | \"settled\"> => {\n ticket.check();\n const retired = retainSetup();\n let port: NavigationStopPort | undefined;\n\n try {\n port = await open();\n ticket.check();\n if (!pending()) return \"settled\";\n // No await may separate this admission check from dispatch.\n ticket.check();\n ticket.dispatch();\n onDispatch();\n await port.stop();\n ticket.check();\n\n return \"dispatched\";\n } finally {\n // The owner's Effect bounds the caller's wait. A timeout or rejection of native detach\n // does not prove retirement and must not allow another setup to consume this slot.\n if (port !== undefined) await port.close();\n retired();\n }\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(Reasons.Configuration.make({}), \"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(Reasons.Configuration.make({}), \"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 isTimeoutError: (error: unknown) => boolean,\n) => {\n const { current } = targets;\n\n const navigationControls = new Map<\n string,\n {\n readonly control: NavigationControl | undefined;\n readonly mainFrame: boolean;\n }\n >();\n\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(Reasons.Malformed.make({}));\n }\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password)\n throw failure(Reasons.Malformed.make({}));\n\n return value;\n };\n\n const postUrl = (target?: DriverTarget) => httpUrl(targets.url(target));\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 browserTarget?: DriverTarget,\n ): Promise<A> => {\n const { element, kept, check } = await observation.resolve(\n target,\n ticket,\n policy,\n false,\n browserTarget,\n );\n\n try {\n check();\n const admitted = await admit(element);\n\n check();\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 browserTarget?: DriverTarget,\n ): Promise<A> =>\n withAdmittedElement(target, ticket, async () => {}, action, policy, browserTarget);\n\n const click: Driver[\"click\"] = (target, ticket, policy, browserTarget) =>\n sanitize(async () => {\n await withElement(\n target,\n ticket,\n (element) => element.click({ timeout: timeout(ticket) }),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return postUrl(browserTarget);\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(Reasons.Unsupported.make({}), \"undispatched\");\n const { entry, frame } = current();\n\n if (frame !== entry.page.mainFrame())\n throw failure(Reasons.Unsupported.make({}), \"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(\n matched.nodeIds.length === 0 ? Reasons.NotFound.make({}) : Reasons.Ambiguous.make({}),\n \"undispatched\",\n );\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\"] = (\n url,\n timeoutMillis,\n ticket,\n target,\n control,\n ) =>\n sanitize(async () => {\n const { entry, frame } = current(target);\n const active = { control, mainFrame: frame === entry.page.mainFrame() };\n\n ticket.dispatch();\n navigationControls.set(entry.id, active);\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 } catch (error) {\n // Preserve the installed engine's exact timeout identity before generic sanitization.\n if (isTimeoutError(error)) throw failure(Reasons.Timeout.make({}), \"unknown\");\n throw error;\n } finally {\n // A stop may have admitted a successor before this old goto finally rejects.\n if (navigationControls.get(entry.id) === active) {\n navigationControls.delete(entry.id);\n targets.navigating.end(entry.id);\n }\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 mainFrame: active.mainFrame,\n settled,\n stop: (stopTicket, pending, onDispatch, retainSetup) =>\n sanitize(async () => {\n return dispatchNavigationStop(\n stopTicket,\n pending,\n onDispatch,\n async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n return {\n stop: async () => {\n await cdp.send(\"Page.stopLoading\");\n },\n close: () => cdp.detach(),\n };\n },\n retainSetup,\n );\n }),\n };\n });\n\n const fill: Driver[\"fill\"] = (target, value, ticket, policy, browserTarget) =>\n sanitize(async () => {\n await withElement(\n target,\n ticket,\n (element) => element.fill(value, { timeout: timeout(ticket) }),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return postUrl(browserTarget);\n });\n\n const selectOption: Driver[\"selectOption\"] = (target, options, ticket, policy) =>\n sanitize(async () => {\n await withAdmittedElement(\n target,\n ticket,\n (element) => observation.selectOptions(target, options, element, ticket),\n async (element, admitted) => {\n // Only issued native nodes reach this command. Its returned values stay private.\n const values = await element.selectOption(admitted.handles, { timeout: timeout(ticket) });\n const expected = [...admitted.values].sort();\n\n if (\n values.length !== expected.length ||\n values.sort().some((value, i) => value !== expected[i])\n )\n throw failure(Reasons.Stale.make({}), \"unknown\");\n },\n policy,\n );\n ticket.check();\n\n return postUrl();\n });\n\n const scroll: Driver[\"scroll\"] = (deltaX, deltaY, ticket, target) =>\n sanitize(async () => {\n const { frame } = current(target);\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(target);\n });\n\n let waitConnectionRetired = false;\n\n let pendingWait:\n | { readonly entry: Entry; readonly frame: Frame; readonly ticket: WaitTicket }\n | undefined;\n\n /** Capture native identity before releasing admission; no later read follows live selection. */\n const waitOn = (\n ticket: WaitTicket,\n target: DriverTarget,\n acquire: () => {\n readonly wait: () => Promise<void>;\n readonly check?: () => void;\n readonly dispose: () => Promise<void>;\n },\n ): Promise<void> => {\n ticket.check();\n const { entry, frame } = current(target);\n const epoch = targets.epochOf(frame);\n const resource = acquire();\n const pending = { entry, frame, ticket };\n\n pendingWait = pending;\n\n const check = () => {\n ticket.check();\n const resolved = current(target);\n\n if (\n waitConnectionRetired ||\n resolved.entry !== entry ||\n resolved.frame !== frame ||\n targets.epochOf(frame) !== epoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n resource.check?.();\n };\n\n return sanitize(async () => {\n try {\n try {\n check();\n await resource.wait();\n check();\n } catch (error) {\n // Lifecycle/deadline evidence wins over a native cancellation or detached-node error.\n check();\n if (isTimeoutError(error)) throw failure(Reasons.Timeout.make({}), \"undispatched\");\n throw error;\n }\n } finally {\n try {\n // This raw release is observed after caller cancellation, without renewing its deadline.\n await resource.dispose();\n ticket.retire();\n } finally {\n if (pendingWait === pending) pendingWait = undefined;\n }\n }\n check();\n });\n };\n\n const waitFor: Driver[\"waitFor\"] = (selector, state, ticket, target) =>\n waitOn(ticket, target, () => {\n const { frame } = current(target);\n let node: ElementHandle<Element> | null | undefined;\n\n return {\n wait: async () => {\n node = await frame.waitForSelector(selector, {\n state,\n strict: true,\n timeout: timeout(ticket),\n signal: ticket.signal,\n });\n },\n dispose: async () => {\n if (!waitConnectionRetired) await node?.dispose();\n },\n };\n });\n\n const waitForElement: Driver[\"waitForElement\"] = (reference, state, ticket, target) =>\n waitOn(ticket, target, () => {\n const leased = observation.lease(reference, ticket);\n\n const attached = async () => {\n leased.check();\n\n const present = await leased.element.evaluate(\n (node) => node.isConnected && node.ownerDocument === document,\n );\n\n leased.check();\n if (present !== true) throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n return {\n check: leased.check,\n wait: async () => {\n try {\n await leased.element.waitForElementState(state, {\n timeout: timeout(ticket),\n signal: ticket.signal,\n });\n } catch (error) {\n if (state !== \"hidden\") await attached();\n throw error;\n }\n if (state !== \"hidden\") await attached();\n },\n dispose: leased.release,\n };\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(Reasons.Unsupported.make({}), \"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)\n throw failure(Reasons.Unsupported.make({}));\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 /** Capture the exact navigation at dialog arrival; acknowledgement never looks it up again. */\n beforeUnload: (pageId: string) => {\n const active = navigationControls.get(pageId);\n\n return active?.mainFrame === true ? active.control?.beforeUnload() : undefined;\n },\n click,\n fill,\n selectOption,\n scroll,\n waitFor,\n waitForElement,\n waitChanged: (entry: Entry, frame?: Frame) => {\n const pending = pendingWait;\n\n if (\n pending?.entry === entry &&\n (frame === undefined || frame === pending.frame || frame === entry.page.mainFrame())\n )\n pending.ticket.invalidate();\n },\n retireWait: () => {\n waitConnectionRetired = true;\n pendingWait?.ticket.invalidate();\n pendingWait?.ticket.retire();\n pendingWait = undefined;\n },\n clickAndWait,\n clickForDownload,\n selectFiles,\n clickForFileSelection,\n };\n};\n","export type CallbackFailureMode = \"reject-call\" | \"fail-session\";\n\nexport type CallbackDisposition = \"not-dispatched\" | \"unknown\";\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: (disposition: CallbackDisposition) => void;\n\n constructor(capacity: number, onFault: (disposition: CallbackDisposition) => 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(disposition: CallbackDisposition): void {\n if (this.stopped || this.faulted) return;\n this.faulted = true;\n this.onFault(disposition);\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(\"not-dispatched\");\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(\"unknown\");\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 { Reasons } from \"../../Errors.ts\";\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(Reasons.NotFound.make({}), \"undispatched\");\n if ((await targets.targetId(requested)) !== target.targetId)\n throw failure(Reasons.Stale.make({}), \"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(Reasons.Unsupported.make({}));\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 { Identifier } from \"../../BrowserData.ts\";\nimport { InitializationError } from \"../../Errors.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 = 'BrowserBindingError';\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 { Reasons, InitializationError } from \"../../Errors.ts\";\nimport type { CompiledBootstrap } from \"./Bootstrap.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type {\n Driver,\n DriverEvents,\n DriverOptions,\n DriverTarget,\n ReadinessState,\n} 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)\n events.fault({\n source: \"native\",\n reason: \"registration\",\n disposition: error.reason === \"busy\" ? \"not-dispatched\" : \"unknown\",\n });\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\"))\n throw failure(Reasons.Provider.make({}));\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(Reasons.Timeout.make({}))), milliseconds);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n };\n\n const readiness = async (\n bootstrap: CompiledBootstrap,\n ticket: Ticket,\n target?: DriverTarget,\n ): Promise<ReadinessState> => {\n const { frame } = current(target);\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._tag === \"Timeout\"\n ? \"timeout\"\n : \"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, target) =>\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, target);\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 { Reasons } from \"../../Errors.ts\";\nimport type { makeActions } from \"./Actions.ts\";\nimport type { DriverTarget } from \"./Driver.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(Reasons.NotFocused.make({}), \"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 browserTarget?: DriverTarget,\n ): Promise<NativeInput> => {\n const { page } = current(browserTarget).entry;\n\n if (into === undefined) {\n ticket.dispatch();\n await keys(page);\n } else\n await actions.withAdmittedElement(\n into,\n ticket,\n requireFocus,\n () => keys(page),\n policy,\n browserTarget,\n );\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 browserTarget?: DriverTarget,\n ) =>\n sanitize(() =>\n // Both halves are closed vocabularies by now, so the engine's `+` syntax is only ever ours.\n send(\n into,\n ticket,\n policy,\n (page) => page.keyboard.press([...modifiers, key].join(\"+\")),\n browserTarget,\n ),\n );\n\n const type = (\n text: string,\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n ) =>\n sanitize(() =>\n send(\n into,\n ticket,\n policy,\n 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 browserTarget,\n ),\n );\n\n return { press, type };\n};\n","import { PageExecutionState, PageSuspension } from \"../../BrowserData.ts\";\nimport { Reasons, 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(Reasons.Closed.make({}));\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(Reasons.Closed.make({}));\n if (this.phase !== \"running\") throw fail(Reasons.Busy.make({}));\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(Reasons.Closed.make({}), outcome);\n if (this.revision !== revision) throw fail(Reasons.Stale.make({}), 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(Reasons.Malformed.make({}));\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(Reasons.Stale.make({}));\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 \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.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)\n return Promise.reject(failure(Reasons.Unsupported.make({}), \"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(Reasons.Closed.make({}));\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled: true });\n if (closing() || entry.page.isClosed()) throw failure(Reasons.Closed.make({}));\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-browser-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(Reasons.Malformed.make({}));\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())\n throw failure(Reasons.Closed.make({}), \"undispatched\");\n const control = await execution(entry);\n\n ticket.check();\n if (control.targetId !== target.targetId) throw failure(Reasons.Stale.make({}), \"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())\n events.fault({ source: \"native\", reason: \"page-control\", disposition: \"unknown\" });\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 checkTarget: (target, ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const control = await execution(current(target).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\nconst ControlIndex = Schema.Natural.check(Schema.isLessThanOrEqualTo(63));\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 /** Private selection identity, separate from every public control-facts projection. */\n selects: Schema.optionalKey(\n Schema.Array(\n Schema.Struct({\n index: ControlIndex,\n optionsTruncated: Schema.Boolean,\n options: Schema.Array(\n Schema.Struct({\n index: ControlIndex,\n value: Schema.String.check(Schema.isMaxLength(65536)),\n }),\n ).check(Schema.isMaxLength(64)),\n }),\n ).check(\n Schema.isMaxLength(64),\n Schema.makeFilter(\n (selects) => selects.reduce((size, select) => size + select.options.length, 0) <= 64,\n ),\n ),\n ),\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 /** Action observations issue a visible select's choices even while its dropdown is closed. */\n readonly choices?: boolean;\n /** Fresh membership and identity checks for already retained options; values stay private. */\n readonly options?: ReadonlyArray<{ readonly node: Element; readonly value: string }>;\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.checked ?? null,\n facts.selected ?? null,\n facts.required ?? null,\n facts.multiple ?? null,\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 = (\n facts: ControlFacts,\n elementId: string,\n selection: { readonly selectElementId?: string; readonly optionsTruncated?: boolean } = {},\n): ObservedControl =>\n ObservedControl.make({\n elementId,\n kind: facts.kind,\n label: facts.label,\n disabled: facts.disabled,\n ...(facts.checked === undefined ? {} : { checked: facts.checked }),\n ...(facts.selected === undefined ? {} : { selected: facts.selected }),\n ...(facts.inputType === undefined ? {} : { inputType: facts.inputType }),\n ...(facts.required === undefined ? {} : { required: facts.required }),\n ...(facts.multiple === undefined ? {} : { multiple: facts.multiple }),\n ...selection,\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 const role = node.getAttribute(\"role\");\n\n const booleanAttribute = (name: string): boolean | undefined => {\n const value = node.getAttribute(name);\n\n return value === \"true\" ? true : value === \"false\" ? false : undefined;\n };\n\n const isNativeToggle =\n node instanceof HTMLInputElement && (node.type === \"checkbox\" || node.type === \"radio\");\n\n const checked = isNativeToggle\n ? node.type === \"checkbox\" && node.indeterminate\n ? undefined\n : node.checked\n : role !== null &&\n [\"checkbox\", \"radio\", \"switch\", \"menuitemcheckbox\", \"menuitemradio\"].includes(role)\n ? booleanAttribute(\"aria-checked\")\n : undefined;\n\n const selected =\n node instanceof HTMLOptionElement\n ? node.selected\n : !(node instanceof HTMLSelectElement) &&\n role !== null &&\n [\"option\", \"tab\", \"treeitem\", \"row\", \"gridcell\"].includes(role)\n ? booleanAttribute(\"aria-selected\")\n : undefined;\n\n const required =\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement ||\n (node instanceof HTMLInputElement &&\n ![\"hidden\", \"button\", \"submit\", \"reset\", \"image\", \"range\", \"color\"].includes(node.type))\n ? node.required\n : role !== null &&\n [\n \"checkbox\",\n \"combobox\",\n \"gridcell\",\n \"listbox\",\n \"radiogroup\",\n \"spinbutton\",\n \"textbox\",\n \"tree\",\n ].includes(role)\n ? booleanAttribute(\"aria-required\")\n : undefined;\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\n ? node.labels?.[0]?.textContent\n : node instanceof HTMLOptionElement\n ? node.label\n : node.textContent) ??\n \"\"\n ).slice(0, 256),\n disabled,\n ...(checked === undefined ? {} : { checked }),\n ...(selected === undefined ? {} : { selected }),\n ...(required === undefined ? {} : { required }),\n ...(node instanceof HTMLSelectElement ? { multiple: node.multiple } : {}),\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)\n return {\n nodes: [only],\n data: {\n facts: factsOf(only),\n ...(request.options === undefined\n ? {}\n : {\n attached: only.isConnected && only.ownerDocument === document,\n options: request.options.map(({ node, value }) => ({\n facts: factsOf(node),\n member:\n only instanceof HTMLSelectElement &&\n node instanceof HTMLOptionElement &&\n node.isConnected &&\n node.ownerDocument === document &&\n node.closest(\"select\") === only &&\n only.options.item(node.index) === node,\n valueMatches: node instanceof HTMLOptionElement && node.value === value,\n })),\n }),\n },\n };\n\n const nodes: Array<Element> = [];\n const controls: Array<ReturnType<typeof factsOf>> = [];\n const selectIndices = new Map<HTMLSelectElement, number>();\n\n const candidates = document.querySelectorAll(\n \"a[href],button,input,select,textarea,option,[role=button],[role=checkbox],[role=radio],[role=switch],[role=menuitemcheckbox],[role=menuitemradio],[role=option],[role=tab],[role=treeitem],[role=row],[role=gridcell],[role=textbox],[role=combobox],[role=listbox],[role=radiogroup],[role=spinbutton],[role=tree]\",\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 const parentSelect = node instanceof HTMLOptionElement ? node.closest(\"select\") : null;\n\n const choice =\n request.choices === true && parentSelect !== null && selectIndices.has(parentSelect);\n\n // Choices of a visible native select are metadata, not evidence of visible dropdown rows.\n // Filter before applying the shared limit so offscreen controls cannot spend it first.\n if (scope === \"viewport\" && !choice && 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 if (node instanceof HTMLSelectElement) selectIndices.set(node, nodes.length - 1);\n }\n\n const selects =\n request.choices === true\n ? [...selectIndices].map(([select, index]) => {\n const options: Array<{ readonly index: number; readonly value: string }> = [];\n\n nodes.forEach((node, optionIndex) => {\n if (\n node instanceof HTMLOptionElement &&\n node.closest(\"select\") === select &&\n select.options.item(node.index) === node\n ) {\n const value = node.value;\n\n if (value.length <= 65536) options.push({ index: optionIndex, value });\n }\n });\n\n return { index, options, optionsTruncated: options.length !== select.options.length };\n })\n : undefined;\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 {\n nodes,\n data: {\n text,\n textTruncated,\n controlsTruncated,\n controls,\n viewport: evidence,\n ...(selects === undefined ? {} : { selects }),\n },\n };\n};\n","import { Schema } from \"effect\";\nimport type { ElementHandle, JSHandle } from \"playwright-core\";\n\nimport { ControlFacts, type ObservedElement, type SelectOptions } from \"../../BrowserData.ts\";\nimport { BrowserError, Reasons } from \"../../Errors.ts\";\nimport type { DriverEvents, DriverTarget, NativeCheckpoint, NativeObservation } from \"./Driver.ts\";\nimport { pngGeometry } from \"./Images.ts\";\nimport {\n closeWithin,\n failure,\n NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport type { ObservationScope, ReadTicket, 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 byteLength: Schema.Natural,\n});\n\nconst Geometry = Schema.Struct({ width: Schema.Natural, height: Schema.Natural });\n\nconst checkScreenshotGeometry = (geometry: typeof Geometry.Type) => {\n if (geometry.width < 1) throw failure(Reasons.Malformed.make({ path: \"screenshot.width\" }));\n if (geometry.height < 1) throw failure(Reasons.Malformed.make({ path: \"screenshot.height\" }));\n if (geometry.width > 16384)\n throw failure(\n Reasons.Limit.make({ dimension: \"width\", maximum: 16384, observed: geometry.width }),\n );\n if (geometry.height > 16384)\n throw failure(\n Reasons.Limit.make({ dimension: \"height\", maximum: 16384, observed: geometry.height }),\n );\n const pixels = geometry.width * geometry.height;\n\n if (pixels > 33_554_432)\n throw failure(\n Reasons.Limit.make({ dimension: \"pixels\", maximum: 33_554_432, observed: pixels }),\n );\n};\n\nconst Count = Schema.Natural.check(Schema.isLessThanOrEqualTo(1000000));\n\nconst Facts = Schema.Struct({ facts: ControlFacts });\n\nconst SelectionFacts = Schema.Struct({\n facts: ControlFacts,\n attached: Schema.Boolean,\n options: Schema.Array(\n Schema.Struct({\n facts: ControlFacts,\n member: Schema.Boolean,\n valueMatches: Schema.Boolean,\n }),\n ).check(Schema.isMaxLength(64)),\n});\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 readonly multiple?: boolean;\n /** The submitted value is retained privately and never appears in a control or receipt. */\n readonly option?: { readonly selectElementId: string; readonly value: string };\n leases: number;\n retired: boolean;\n disposal?: Promise<void>;\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 target: DriverTarget;\n readonly documentEpoch: number;\n readonly generation: number;\n validity: \"reading\" | \"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 const connectionNamespace = globalThis.crypto.randomUUID();\n let observation: Snapshot | undefined;\n let observationSerial = 0;\n let connectionRetired = false;\n\n const invalidate = (scope: ObservationScope = \"all\") => {\n if (\n observation !== undefined &&\n scope !== \"none\" &&\n (scope === \"all\" || scope.pageId === observation.target.pageId)\n )\n 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>, target?: DriverTarget): Promise<A> => {\n const { entry, frame } = current(target);\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._tag === \"Provider\");\n\n if (unexplained && (targets.epochOf(frame) !== epoch || targets.navigating.has(entry.id)))\n throw failure(Reasons.TargetChanged.make({}), \"undispatched\");\n throw error;\n }\n };\n\n const changed = (\n reason: Parameters<DriverEvents[\"invalidate\"]>[0],\n scope: ObservationScope = \"all\",\n ) => {\n invalidate(scope);\n events.invalidate(reason, scope);\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?.target.pageId === pageId) {\n if (observation.validity === \"reading\") observation.validity = \"invalid\";\n else if (observation.validity === \"valid\") {\n observation.validity = \"suspended\";\n observation.revalidated.clear();\n }\n }\n };\n\n const disposeNode = (node: Retained): Promise<void> =>\n connectionRetired\n ? Promise.resolve()\n : (node.disposal ??= Promise.resolve().then(() =>\n connectionRetired ? undefined : node.handle.dispose(),\n ));\n\n const retireNode = (node: Retained): Promise<void> => {\n node.retired = true;\n\n return node.leases === 0 ? disposeNode(node) : Promise.resolve();\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(() => Promise.allSettled([...old.nodes.values()].map(retireNode)));\n }\n };\n\n const exactElement = async (\n selector: string,\n ticket: Ticket,\n target?: DriverTarget,\n ): Promise<ElementHandle<Element>> => {\n ticket.check();\n\n const holder = await current(target).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)\n throw failure(\n count === 0 ? Reasons.NotFound.make({}) : Reasons.Ambiguous.make({}),\n \"undispatched\",\n );\n node = await holder.getProperty(\"node\");\n const element = node.asElement();\n\n if (element === null) throw failure(Reasons.NotFound.make({}), \"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 /** Selection can move away and back; the original document and snapshot cannot be replaced. */\n const checkSnapshot = (snapshot: Snapshot, ticket: ReadTicket): void => {\n ticket.check();\n if (\n observation !== snapshot ||\n snapshot.generation !== ticket.generation ||\n snapshot.validity === \"invalid\"\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const selected = targets.selected();\n\n if (\n selected.pageId !== snapshot.target.pageId ||\n selected.frameId !== snapshot.target.frameId ||\n targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n /** A retained node is only as current as the observation that produced it. */\n const retained = (target: ObservedElement, ticket: ReadTicket, allowSuspended = false) => {\n const snapshot = observation;\n\n if (snapshot === undefined || snapshot.id !== target.observationId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const node = snapshot.nodes.get(target.elementId);\n\n if (node === undefined) throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const check = (): void => {\n checkSnapshot(snapshot, ticket);\n\n const usable =\n snapshot.validity === \"valid\" ||\n (snapshot.validity === \"suspended\" &&\n (allowSuspended || snapshot.revalidated.has(target.elementId)));\n\n if (!usable || snapshot.nodes.get(target.elementId) !== node)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n check();\n\n return { node, snapshot, check };\n };\n\n /**\n * A wait borrows one exact node without authorizing input. Its state may change. Retiring the\n * observation defers this node's disposal until the native wait actually releases the lease.\n */\n const lease = (reference: ObservedElement, ticket: ReadTicket) => {\n const { node, snapshot } = retained(reference, ticket);\n\n node.leases++;\n let released: Promise<void> | undefined;\n\n return {\n element: node.handle,\n check: () => {\n ticket.check();\n if (\n connectionRetired ||\n observation !== snapshot ||\n snapshot.validity === \"invalid\" ||\n targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n },\n release: (): Promise<void> => {\n released ??= (async () => {\n node.leases--;\n if (node.retired && node.leases === 0) await disposeNode(node);\n })();\n\n return released;\n },\n };\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 sampleFacts = async (\n element: ElementHandle<Element>,\n check: () => void,\n target?: DriverTarget,\n options?: ReadonlyArray<{ readonly node: ElementHandle<Element>; readonly value: string }>,\n ): Promise<unknown> => {\n check();\n\n const holder = await current(target).frame.evaluateHandle(readPage, {\n scope: \"document\" as const,\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: 0,\n only: element,\n ...(options === undefined ? {} : { options }),\n });\n\n try {\n check();\n const data = await holder.getProperty(\"data\");\n\n try {\n check();\n const raw = await data.jsonValue();\n\n check();\n\n return raw;\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 browserTarget?: DriverTarget,\n ): Promise<{\n readonly element: ElementHandle<Element>;\n readonly kept: boolean;\n readonly check: () => void;\n readonly facts: ControlFacts | undefined;\n }> => {\n const kept = typeof target !== \"string\";\n\n const retainedNode =\n typeof target === \"string\" ? undefined : retained(target, ticket, allowSuspended);\n\n const node = retainedNode?.node;\n const resolvedTarget = retainedNode?.snapshot.target ?? browserTarget;\n const check = retainedNode?.check ?? (() => ticket.check());\n\n const element =\n typeof target === \"string\" ? await exactElement(target, ticket, browserTarget) : node?.handle;\n\n if (element === undefined) throw failure(Reasons.Stale.make({}), \"undispatched\");\n let facts: ControlFacts | undefined;\n\n try {\n check();\n\n const select =\n node?.option === undefined\n ? undefined\n : retainedNode?.snapshot.nodes.get(node.option.selectElementId)?.handle;\n\n const attached: unknown = await element.evaluate(\n (candidate, { selector, selection }) => {\n if (!candidate.isConnected || candidate.ownerDocument !== document) return false;\n if (\n selection !== undefined &&\n (!(candidate instanceof HTMLOptionElement) ||\n !(selection.select instanceof HTMLSelectElement) ||\n !selection.select.isConnected ||\n candidate.closest(\"select\") !== selection.select ||\n selection.select.options.item(candidate.index) !== candidate ||\n candidate.value !== selection.value)\n )\n 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 {\n selector: typeof target === \"string\" ? target : undefined,\n selection:\n select === undefined || node?.option === undefined\n ? undefined\n : { select, value: node.option.value },\n },\n );\n\n check();\n if (attached !== true) throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (node !== undefined || policy !== undefined) {\n facts = safeDecode(Facts, await sampleFacts(element, check, resolvedTarget)).facts;\n\n check();\n if (node !== undefined && identityOf(facts) !== node.identity)\n throw failure(Reasons.Stale.make({}), \"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(Reasons.Denied.make({}), \"undispatched\");\n }\n }\n check();\n\n return { element, kept, check, facts };\n } catch (error) {\n if (!kept) await closeWithin(() => element.dispose()).catch(() => {});\n check();\n throw error;\n }\n };\n\n /** Validate all options in one fresh page read, while keeping the original exact handles. */\n const selectOptions = async (\n target: ObservedElement,\n ids: SelectOptions,\n element: ElementHandle<Element>,\n ticket: Ticket,\n ) => {\n const select = retained(target, ticket);\n\n if (select.node.handle !== element) throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (select.node.multiple === undefined)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n\n const options = ids.map((elementId) => {\n const option = retained({ observationId: target.observationId, elementId }, ticket);\n const identity = option.node.option;\n\n if (identity === undefined || identity.selectElementId !== target.elementId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return { ...option, value: identity.value };\n });\n\n const check = () => {\n select.check();\n for (const option of options) option.check();\n };\n\n const fresh = safeDecode(\n SelectionFacts,\n await sampleFacts(\n element,\n check,\n select.snapshot.target,\n options.map((option) => ({ node: option.node.handle, value: option.value })),\n ),\n );\n\n check();\n if (!fresh.attached || identityOf(fresh.facts) !== select.node.identity)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (fresh.options.length !== options.length)\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n for (const [index, sampled] of fresh.options.entries()) {\n const option = options[index];\n\n if (\n option === undefined ||\n !sampled.member ||\n !sampled.valueMatches ||\n identityOf(sampled.facts) !== option.node.identity\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n }\n if (fresh.facts.disabled || fresh.options.some((option) => option.facts.disabled))\n throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (fresh.facts.multiple !== true && ids.length > 1)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n check();\n\n return {\n handles: options.map((option) => option.node.handle),\n values: options.map((option) => option.value),\n };\n };\n\n const controlFacts = (target: ObservedElement, ticket: Ticket) =>\n sanitize(async () => {\n const { facts, check } = await resolve(target, ticket);\n\n check();\n if (facts === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n\n return facts;\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 const snapshot = observation;\n const { check } = await resolve(target, ticket, undefined, true);\n\n check();\n if (snapshot === undefined || snapshot !== observation)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n snapshot.revalidated.add(target.elementId);\n });\n\n const readText = (\n selector: string | undefined,\n maximumBytes: number,\n ticket: Ticket,\n target?: DriverTarget,\n ) =>\n sanitize(async () => {\n ticket.check();\n\n const raw: unknown = await reading(\n () =>\n current(target).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, byteLength: 0 };\n\n const text =\n element instanceof HTMLElement ? element.innerText : (element.textContent ?? \"\");\n\n const byteLength = new TextEncoder().encode(text).length;\n\n return { text: byteLength > maximumBytes ? \"\" : text, missing: false, byteLength };\n },\n { selector, maximumBytes },\n ),\n target,\n );\n\n ticket.check();\n const value = safeDecode(TextResult, raw);\n\n if (value.missing) throw failure(Reasons.NotFound.make({}));\n const observedBytes = Math.max(value.byteLength, new TextEncoder().encode(value.text).length);\n\n if (observedBytes > maximumBytes)\n throw failure(\n Reasons.Limit.make({ dimension: \"text\", maximum: maximumBytes, observed: observedBytes }),\n );\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 check: () => void,\n keepNodes: boolean,\n target?: DriverTarget,\n ) => {\n check();\n\n const holder = await current(target).frame.evaluateHandle(readPage, {\n scope,\n maximumBytes,\n controlLimit,\n nodeBudget: NodeBudget,\n choices: keepNodes,\n });\n\n const handles: Array<ElementHandle<Element>> = [];\n let nodesHandle: JSHandle | undefined;\n\n try {\n let data: PageReadResult;\n\n try {\n check();\n const dataHandle = await holder.getProperty(\"data\");\n\n try {\n check();\n const raw = await dataHandle.jsonValue();\n\n check();\n data = safeDecode(PageReadResult, raw);\n } finally {\n await dataHandle.dispose();\n }\n check();\n const textBytes = new TextEncoder().encode(data.text).length;\n\n if (textBytes > maximumBytes)\n throw failure(\n Reasons.Limit.make({ dimension: \"text\", maximum: maximumBytes, observed: textBytes }),\n );\n if (data.controls.length > controlLimit)\n throw failure(\n Reasons.Limit.make({\n dimension: \"controls\",\n maximum: controlLimit,\n observed: data.controls.length,\n }),\n );\n if (keepNodes) {\n nodesHandle = await holder.getProperty(\"nodes\");\n check();\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(Reasons.Malformed.make({}));\n }\n handles.push(element);\n check();\n }\n }\n } finally {\n await nodesHandle?.dispose().catch(() => {});\n await holder.dispose();\n }\n check();\n\n return { data, handles };\n } catch (error) {\n // Ownership transfers only after wrapper release succeeds and the snapshot is rechecked.\n await closeWithin(() => Promise.allSettled(handles.map((handle) => handle.dispose()))).catch(\n () => {},\n );\n check();\n throw error;\n }\n };\n\n const observe = (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n ticket: Ticket,\n ) =>\n sanitize(async () => {\n ticket.check();\n await dispose();\n ticket.check();\n const target = targets.selected();\n\n const snapshot: Snapshot = {\n id: `observation-${connectionNamespace}-${++observationSerial}`,\n target,\n documentEpoch: targets.epochOf(current(target).frame),\n generation: ticket.generation,\n validity: \"reading\",\n nodes: new Map(),\n revalidated: new Set(),\n };\n\n // Own-page events must also retire a read whose native handles have not arrived yet.\n observation = snapshot;\n let handles: Array<ElementHandle<Element>> = [];\n\n try {\n const sampled = await reading(\n () =>\n read(\n scope,\n maximumBytes,\n controlLimit,\n () => checkSnapshot(snapshot, ticket),\n true,\n target,\n ),\n target,\n );\n\n handles = sampled.handles;\n checkSnapshot(snapshot, ticket);\n const { data } = sampled;\n const selects = new Map<number, boolean>();\n const options = new Map<number, NonNullable<Retained[\"option\"]>>();\n\n for (const select of data.selects ?? []) {\n if (selects.has(select.index) || data.controls[select.index]?.multiple === undefined)\n throw failure(Reasons.Malformed.make({}));\n selects.set(select.index, select.optionsTruncated);\n for (const option of select.options) {\n if (options.has(option.index) || data.controls[option.index]?.selected === undefined)\n throw failure(Reasons.Malformed.make({}));\n options.set(option.index, {\n selectElementId: `element-${select.index}`,\n value: option.value,\n });\n }\n }\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) {\n const option = options.get(i);\n\n snapshot.nodes.set(`element-${i}`, {\n handle,\n identity: identityOf(facts),\n leases: 0,\n retired: false,\n ...(facts.multiple === undefined ? {} : { multiple: facts.multiple }),\n ...(option === undefined ? {} : { option }),\n });\n }\n });\n if (snapshot.nodes.size !== data.controls.length) throw failure(Reasons.Malformed.make({}));\n\n const result: NativeObservation = {\n observationId: snapshot.id,\n scope,\n url: targets.url(target),\n text: data.text,\n textTruncated: data.textTruncated,\n controlsTruncated: data.controlsTruncated,\n controls: data.controls.map((facts, i) => {\n const option = options.get(i);\n const optionsTruncated = selects.get(i);\n\n return observedControl(facts, `element-${i}`, {\n ...(option === undefined ? {} : { selectElementId: option.selectElementId }),\n ...(optionsTruncated === undefined ? {} : { optionsTruncated }),\n });\n }),\n viewport: data.viewport,\n };\n\n checkSnapshot(snapshot, ticket);\n snapshot.validity = \"valid\";\n\n return result;\n } catch (error) {\n snapshot.validity = \"invalid\";\n if (observation === snapshot) observation = undefined;\n await closeWithin(() =>\n Promise.allSettled(handles.map((handle) => handle.dispose())),\n ).catch(() => {});\n throw error;\n }\n });\n\n const screenshot = (\n fullPage: boolean,\n maximumBytes: number,\n ticket: Ticket,\n target?: DriverTarget,\n ) =>\n sanitize(() =>\n reading(async () => {\n const page = current(target).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 checkScreenshotGeometry(geometry);\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(Reasons.Malformed.make({}));\n if (bytes.length > maximumBytes)\n throw failure(\n Reasons.Limit.make({\n dimension: \"returned-bytes\",\n maximum: maximumBytes,\n observed: bytes.length,\n }),\n );\n const actual = pngGeometry(bytes);\n\n checkScreenshotGeometry(actual);\n ticket.check();\n\n return new Uint8Array(bytes);\n }, target),\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.check(), 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 text: data.text,\n textTruncated: data.textTruncated,\n controls: data.controls,\n controlsTruncated: data.controlsTruncated,\n viewport: data.viewport,\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 lease,\n retireConnection: () => {\n connectionRetired = true;\n const old = observation;\n\n observation = undefined;\n if (old !== undefined) {\n old.validity = \"invalid\";\n for (const node of old.nodes.values()) node.retired = true;\n }\n },\n resolve,\n selectOptions,\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 { Reasons } from \"../../Errors.ts\";\nimport type { makeActions } from \"./Actions.ts\";\nimport type { DriverTarget } from \"./Driver.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, target?: DriverTarget) =>\n sanitize(async () => {\n const { page } = current(target).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(Reasons.NotVisible.make({}), \"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)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n while (frame !== page.mainFrame()) {\n if (ancestors.length >= 32)\n throw failure(\n Reasons.Limit.make({\n dimension: \"frame-depth\",\n maximum: 32,\n observed: ancestors.length,\n }),\n \"undispatched\",\n );\n ancestors.push(await frame.frameElement());\n frame = frame.parentFrame();\n if (frame === null) throw failure(Reasons.Stale.make({}), \"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(Reasons.NotVisible.make({}), \"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(Reasons.NotVisible.make({}), \"undispatched\");\n } finally {\n await Promise.all(ancestors.map((ancestor) => ancestor.dispose()));\n }\n\n return point;\n };\n\n const hover = (\n target: string | ObservedElement,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n ) =>\n sanitize(async () => {\n const { page } = current(browserTarget).entry;\n\n await actions.withAdmittedElement(\n target,\n ticket,\n (element) => reachablePoint(page, element),\n (_element, point) => moveTo(page, point),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return receipt(page);\n });\n\n const wheel = (\n deltaX: number,\n deltaY: number,\n at: NativePoint | undefined,\n ticket: Ticket,\n target?: DriverTarget,\n ) =>\n sanitize(async () => {\n const { page } = current(target).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 type { DriverEvents, DriverFault } from \"./Driver.ts\";\n\ntype PolicyReason = Extract<DriverFault, { readonly source: \"policy\" }>[\"reason\"];\n\nexport type CleanupDisposition = \"confirmed\" | \"not-dispatched\" | \"unknown\";\n\ninterface CleanupOptions {\n /** Absent for an ordinary policy close or dismissal within the configured bounds. */\n readonly overflow?: PolicyReason;\n /** A modeled dismissal checks its ticket immediately before the native dispatch. */\n readonly dispatch?: () => void;\n /** Delivers one bounded result, including to the captured before-unload navigation. */\n readonly settled?: (disposition: CleanupDisposition) => void;\n}\n\n/**\n * One connection's policy closes and dismissals. The timer bounds observation, never native\n * capacity: a late native promise still owns its slot. Exact objects share their first result,\n * including an uncertain result, so neither another event nor shutdown resends that command.\n */\nexport class PolicyCleanup {\n private readonly pending = new Set<Promise<void>>();\n private readonly results = new WeakMap<object, Promise<CleanupDisposition>>();\n private readonly timers = new Set<ReturnType<typeof setTimeout>>();\n private readonly retirements = new Set<() => void>();\n private readonly refused = {};\n private stopped = false;\n private connectionRetired = false;\n\n private readonly events: Pick<DriverEvents, \"fault\">;\n\n constructor(events: Pick<DriverEvents, \"fault\">) {\n this.events = events;\n }\n\n run(\n subject: object,\n action: () => Promise<unknown>,\n options: CleanupOptions = {},\n ): Promise<CleanupDisposition> {\n const existing = this.results.get(subject);\n\n if (existing !== undefined) return existing;\n let resolve: (disposition: CleanupDisposition) => void = () => {};\n let completed = false;\n\n const result = new Promise<CleanupDisposition>((done) => {\n resolve = done;\n });\n\n this.results.set(subject, result);\n const token = {};\n\n const record = (\n disposition: CleanupDisposition | \"pending\" | \"dispatched\",\n identity: object = token,\n ) => {\n if (this.connectionRetired) return;\n if (options.overflow !== undefined)\n this.events.fault({\n source: \"policy\",\n reason: options.overflow,\n token: identity,\n disposition,\n });\n else if (disposition === \"unknown\" || disposition === \"not-dispatched\")\n this.events.fault({ source: \"native\", reason: \"callback\", disposition });\n };\n\n const finish = (disposition: CleanupDisposition) => {\n if (completed) return;\n completed = true;\n options.settled?.(disposition);\n resolve(disposition);\n };\n\n if (this.stopped || this.pending.size >= 32) {\n if (!this.stopped) record(\"not-dispatched\", this.refused);\n finish(\"not-dispatched\");\n\n return result;\n }\n let dispatched = false;\n const retire = () => finish(dispatched ? \"unknown\" : \"not-dispatched\");\n\n this.retirements.add(retire);\n\n const execution = async (): Promise<CleanupDisposition> => {\n if (this.stopped) {\n return \"not-dispatched\";\n }\n try {\n options.dispatch?.();\n } catch {\n return \"not-dispatched\";\n }\n dispatched = true;\n record(\"dispatched\");\n\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n record(\"unknown\");\n finish(\"unknown\");\n }, 2000);\n\n this.timers.add(timer);\n try {\n await action();\n\n return \"confirmed\";\n } catch {\n return \"unknown\";\n } finally {\n clearTimeout(timer);\n this.timers.delete(timer);\n }\n };\n\n const task = Promise.resolve()\n .then(execution)\n .then((disposition) => {\n // Release capacity before waking a confirmed waiter that may submit the next cleanup.\n this.pending.delete(task);\n this.retirements.delete(retire);\n // A late acknowledgement is evidence, but cannot change the waiter's unknown result.\n if (!completed || disposition === \"confirmed\") record(disposition);\n finish(disposition);\n });\n\n this.pending.add(task);\n record(\"pending\");\n\n return result;\n }\n\n /** Stop admission before native disconnection; accepted promises remain observed. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Only confirmed connection retirement may forget deadline observers of unresolved work. */\n retired(): void {\n this.stop();\n this.connectionRetired = true;\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n for (const retire of this.retirements) retire();\n this.retirements.clear();\n this.pending.clear();\n }\n\n async settle(): Promise<void> {\n await Promise.all(this.pending);\n }\n}\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Dialog, Frame, Page } from \"playwright-core\";\n\nimport { FrameInfo, PageInfo, Identifier } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { DriverOptions, DriverTarget } from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { ObservationScope, 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 /** An excess page is never admitted to this registry; its configured policy owns cleanup. */\n readonly overflow: (entry: Entry) => 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: (entry: Entry, dialog: Dialog) => void;\n /** Selection changes notify the owner without retiring another page's retained nodes. */\n readonly changed: (reason: \"target-changed\", scope: ObservationScope) => 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 handed to policy recovery, never tracked.\n */\nexport const makeTargets = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\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 // FrameInfo is connection-local public metadata. A new driver after reconnect must never\n // regenerate an old frame id for a different frame, even when serial order happens to match.\n const connectionNamespace = globalThis.crypto.randomUUID();\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-${connectionNamespace}-${++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-${connectionNamespace}-${++serial}`, page, off: [] };\n\n byPage.set(page, entry);\n if (entries.size >= options.maxPages) {\n hooks.overflow(entry);\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\", { pageId: entry.id });\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\", { pageId: entry.id });\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\", { pageId: entry.id });\n }\n };\n\n const onDialog = (dialog: Dialog) => {\n hooks.dialog(entry, 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 selectedCurrent = () => {\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(Reasons.Closed.make({}), \"undispatched\");\n\n return { entry: selection.entry, frame: selection.frame };\n };\n\n const explicitCurrent = (target: DriverTarget) => {\n if (closing() || !browser.isConnected()) throw failure(Reasons.Closed.make({}), \"undispatched\");\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const frame = entry.page.frames().find((candidate) => frameId(candidate) === target.frameId);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return { entry, frame };\n };\n\n const current = (target?: DriverTarget) =>\n target === undefined ? selectedCurrent() : explicitCurrent(target);\n\n const targetId = async (entry: Entry, ticket?: Ticket): Promise<string> => {\n ticket?.check();\n if (entry.targetId !== undefined) return entry.targetId;\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n ticket?.check();\n const info: unknown = await cdp.send(\"Target.getTargetInfo\");\n\n ticket?.check();\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(selectedCurrent().frame);\n const url = (target?: DriverTarget) => urlOf(current(target).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(Reasons.NotFound.make({}));\n } else {\n if (entries.size !== 1) throw failure(Reasons.Ambiguous.make({}));\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 /** Describe this exact entry, including when creation has already dispatched. */\n const pageInfo = async (entry: Entry, ticket: Ticket): Promise<PageInfo> => {\n const id = await targetId(entry, ticket);\n\n ticket.check();\n const title: unknown = await entry.page.title();\n\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), ticket.dispatched ? \"unknown\" : \"undispatched\");\n if (typeof title !== \"string\") throw failure(Reasons.Malformed.make({ path: \"page.title\" }));\n\n return 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 const listPages = (ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const output: PageInfo[] = [];\n\n for (const entry of entries.values()) output.push(await pageInfo(entry, ticket));\n\n return output;\n });\n\n const explicitPage = async (page: PageInfo, ticket: Ticket): Promise<Entry> => {\n ticket.check();\n const entry = entries.get(page.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n if ((await targetId(entry, ticket)) !== page.targetId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return entry;\n };\n\n const resolvePage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n return { pageId: entry.id, frameId: frameId(entry.page.mainFrame()) };\n });\n\n const selectPage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n selection.entry = entry;\n selection.frame = entry.page.mainFrame();\n hooks.changed(\"target-changed\", \"none\");\n });\n\n const newPage = (ticket: Ticket) =>\n sanitize(async () => {\n if (entries.size >= options.maxPages)\n throw failure(\n Reasons.Limit.make({\n dimension: \"pages\",\n maximum: options.maxPages,\n observed: entries.size,\n }),\n \"undispatched\",\n );\n ticket.dispatch();\n creatingPage = true;\n let entry: Entry;\n\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 entry = register(page);\n } finally {\n creatingPage = false;\n }\n\n // Creation never selects or relists. A failed metadata read cannot repeat the creation.\n return pageInfo(entry, ticket);\n });\n\n const closePage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n ticket.dispatch();\n await entry.page.close({ runBeforeUnload: false });\n ticket.check();\n });\n\n const listFrames = (ticket: Ticket, page?: PageInfo) =>\n sanitize(async () => {\n ticket.check();\n const entry = page === undefined ? selectedCurrent().entry : await explicitPage(page, ticket);\n const frames = entry.page.frames();\n\n if (frames.length > 128)\n throw failure(\n Reasons.Limit.make({ dimension: \"frames\", maximum: 128, observed: frames.length }),\n );\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 resolveFrame = (page: PageInfo, requested: FrameInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n const frame = entry.page\n .frames()\n .find((candidate) => frameId(candidate) === requested.frameId);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n\n return { pageId: entry.id, frameId: frameId(frame) };\n });\n\n const selectFrame = (id: string, ticket: Ticket) =>\n sanitize(async () => {\n const entry = selection.entry;\n\n if (entry === undefined) throw failure(Reasons.Closed.make({}));\n const frame = entry.page.frames().find((f) => frameId(f) === id);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n selection.frame = frame;\n hooks.changed(\"target-changed\", \"none\");\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 url,\n selectInitial,\n clear,\n selected,\n selectedTargetId,\n listPages,\n resolvePage,\n selectPage,\n newPage,\n closePage,\n listFrames,\n resolveFrame,\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 { Reasons, 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 { PolicyCleanup } from \"./PolicyCleanup.ts\";\nimport { type Entry, makeTargets } from \"./Targets.ts\";\n\nconst NativeWindow = Schema.Struct({ windowId: Schema.Natural });\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(Reasons.Interrupted.make({}));\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(Reasons.Interrupted.make({}));\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(Reasons.Interrupted.make({}));\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(Reasons.Provider.make({}));\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 // This constructor is reached only after native acquisition, including in driver tests.\n const { errors } = await import(\"playwright-core\");\n const contexts = browser.contexts();\n\n if (contexts.length !== 1) throw failure(Reasons.Ambiguous.make({}));\n const context: BrowserContext = contexts[0];\n\n const dialogs = new Map<\n Dialog,\n { readonly dismissed: (confirmed: boolean) => void } | undefined\n >();\n\n const callbacks = new CallbackTasks(32, (disposition) =>\n events.fault({ source: \"native\", reason: \"callback\", disposition }),\n );\n\n const policyCleanup = new PolicyCleanup(events);\n const blockedPopup = {};\n\n let closing = false;\n let initialized = false;\n let browserCdp: CDPSession | undefined;\n\n const targets = makeTargets(browser, context, options, () => closing, {\n opened: (entry, created) => {\n if (initialized && !created && options.popupPolicy === \"close\") {\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }));\n\n return;\n }\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 && options.popupPolicy === \"pause\") events.pause(\"popup\");\n },\n overflow: (entry) => {\n if (options.popupPolicy === \"close\")\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }), {\n overflow: \"popup-overflow\",\n });\n else\n events.fault({\n source: \"policy\",\n reason: \"popup-overflow\",\n token: blockedPopup,\n disposition: \"not-dispatched\",\n });\n },\n closed: (entry) => {\n actions.waitChanged(entry);\n for (const [dialog, beforeUnload] of dialogs)\n if (dialog.page() === entry.page) {\n beforeUnload?.dismissed(false);\n dialogs.delete(dialog);\n }\n observation.invalidate({ pageId: entry.id });\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 actions.waitChanged(entry, frame);\n observation.invalidate({ pageId: entry.id });\n captures.invalidate(entry, \"target-changed\", frame);\n },\n dialog: (entry, dialog) => {\n // Capture the exact navigation now. A page lookup after acknowledgement could name its successor.\n const beforeUnload =\n dialog.type() === \"beforeunload\" ? actions.beforeUnload(entry.id) : undefined;\n\n const overflow = dialogs.size >= 8;\n\n if (options.dialogPolicy === \"dismiss\" || overflow)\n void policyCleanup.run(dialog, () => dialog.dismiss(), {\n ...(overflow ? { overflow: \"dialog-overflow\" } : {}),\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n else {\n dialogs.set(dialog, beforeUnload);\n observation.invalidate();\n events.pause(\"dialog\");\n }\n },\n changed: (reason, scope) => observation.changed(reason, scope),\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\n const actions = makeActions(\n context,\n targets,\n observation,\n (error) => error instanceof errors.TimeoutError,\n );\n\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 retired = () => {\n policyCleanup.retired();\n actions.retireWait();\n observation.retireConnection();\n events.retired?.();\n };\n\n const onDisconnected = () => {\n retired();\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(Reasons.Closed.make({}), \"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 resolvePage: targets.resolvePage,\n selectPage: targets.selectPage,\n newPage: targets.newPage,\n closePage: targets.closePage,\n listFrames: targets.listFrames,\n resolveFrame: targets.resolveFrame,\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 selectOption: actions.selectOption,\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\", { pageId: entry.id });\n await page.setViewportSize(viewport);\n ticket.check();\n }),\n waitFor: actions.waitFor,\n waitForElement: actions.waitForElement,\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, beforeUnload] of dialogs) {\n const disposition = await policyCleanup.run(dialog, () => dialog.dismiss(), {\n dispatch: () => ticket.dispatch(),\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n\n ticket.check();\n if (disposition !== \"confirmed\")\n throw failure(\n disposition === \"not-dispatched\" ? Reasons.Busy.make({}) : Reasons.Provider.make({}),\n disposition === \"not-dispatched\" ? \"undispatched\" : \"unknown\",\n );\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 // Explicit cleanup owns its close result. Preserve the established ordering by removing\n // the ordinary disconnect listener first; positive retirement is recorded only after the\n // close below actually settles. Natural disconnects still retire through onDisconnected.\n browser.off(\"disconnected\", onDisconnected);\n for (const entry of entries.values()) for (const off of entry.off.splice(0)) off();\n // Retained dialogs share their one dismissal with explicit resume. A timed-out dismissal\n // stays in the pool and is never sent a second time by connection cleanup.\n for (const [dialog, beforeUnload] of dialogs)\n void policyCleanup.run(dialog, () => dialog.dismiss(), {\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n captures.clear();\n await closeWithin(initialization.dispose).catch(() => {});\n await observation.dispose().catch(() => {});\n await closeWithin(() => policyCleanup.settle()).catch(() => {});\n policyCleanup.stop();\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 retired();\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(Reasons.NotFound.make({}));\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 type { Schema, SchemaIssue } from \"effect\";\n\n/** Report only a top-level key declared by the failed schema, never an input key or value. */\nexport const schemaPath = (error: Schema.SchemaError): { readonly path?: string } => {\n let issue: SchemaIssue.Issue = error.issue;\n let remaining = 32;\n\n while (remaining-- > 0 && (issue._tag === \"Encoding\" || issue._tag === \"Filter\")) {\n issue = issue.issue;\n }\n if (issue._tag !== \"Composite\" || issue.ast._tag !== \"Objects\") return {};\n const first = issue.issues[0];\n\n if (first._tag !== \"Pointer\" || first.path.length === 0) return {};\n const key = first.path[0];\n\n if (typeof key !== \"string\" || key.length > 512) return {};\n const declared = issue.ast.propertySignatures.find((property) => property.name === key);\n\n return declared === undefined ? {} : { path: key };\n};\n","import { Effect, Schema } from \"effect\";\n\nimport type * as Bootstrap from \"../../Bootstrap.ts\";\nimport type { BrowserSession, TargetOperations, PinnedTarget } from \"../../Browser.ts\";\nimport {\n ActionResult,\n Checkpoint,\n CheckpointOptions,\n ClickRequest,\n FillRequest,\n FrameInfo,\n HoverRequest,\n InputReceipt,\n KeyStroke,\n NavigateRequest,\n NavigationResult,\n ObservationOptions,\n ObservedElement,\n PageInfo,\n PointerMoveRequest,\n PressRequest,\n ReadTextRequest,\n ScreenshotRequest,\n ScreenshotResult,\n ScrollRequest,\n SelectOptions,\n StartNavigationRequest,\n Target,\n TextResult,\n TypeRequest,\n Viewport,\n WaitForElementRequest,\n WheelRequest,\n Identifier,\n} from \"../../BrowserData.ts\";\nimport {\n BrowserError,\n Reasons,\n type BrowserOperation,\n type BrowserOutcome,\n InitializationError,\n} from \"../../Errors.ts\";\nimport { associate } from \"./Association.ts\";\nimport type { Bindings } from \"./Bindings.ts\";\nimport { associatePageControl } from \"./PageControlAssociation.ts\";\nimport { schemaPath } from \"./SchemaPath.ts\";\nimport type { TargetControls, SessionControls, SessionLease } from \"./Session.ts\";\n\nexport const checked = <A>(\n schema: Schema.Codec<A, unknown, never, never>,\n value: unknown,\n operation: BrowserOperation,\n) =>\n Schema.decodeUnknownEffect(schema)(value, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError((error) =>\n BrowserError.make({\n operation,\n reason: Reasons.Configuration.make(schemaPath(error)),\n outcome: \"undispatched\",\n }),\n ),\n );\n\nexport const decoded =\n <A>(\n schema: Schema.Codec<A, unknown, never, never>,\n operation: BrowserOperation,\n outcome: BrowserOutcome,\n ) =>\n (value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError((error) =>\n BrowserError.make({\n operation,\n reason: Reasons.Malformed.make(schemaPath(error)),\n outcome,\n }),\n ),\n );\n\nconst action = decoded(ActionResult, \"action-result\", \"unknown\");\nconst pointerMoved = decoded(InputReceipt, \"pointer-move\", \"unknown\");\nconst hovered = decoded(InputReceipt, \"hover\", \"unknown\");\nconst wheeled = decoded(InputReceipt, \"wheel\", \"unknown\");\nconst pressed = decoded(InputReceipt, \"press\", \"unknown\");\nconst typed = decoded(InputReceipt, \"type\", \"unknown\");\n\nconst makeTarget = (bound: TargetControls): TargetOperations => ({\n navigate: (request) =>\n checked(NavigateRequest, request, \"navigate\").pipe(\n Effect.flatMap((value) => bound.navigate(value.url, value.timeoutMillis)),\n Effect.flatMap((url) => decoded(NavigationResult, \"navigate\", \"unknown\")({ url })),\n ),\n startNavigation: (request) =>\n checked(StartNavigationRequest, request, \"navigate\").pipe(\n Effect.flatMap((value) => bound.startNavigation(value.url, value.timeoutMillis)),\n Effect.map((operation) => ({\n target: operation.target,\n completed: operation.completed.pipe(\n Effect.flatMap((url) => decoded(NavigationResult, \"navigate\", \"unknown\")({ url })),\n ),\n stop: operation.stop,\n })),\n ),\n readText: (request) =>\n checked(ReadTextRequest, request, \"read-text\").pipe(\n Effect.flatMap((value) => bound.readText(value.selector)),\n Effect.flatMap((text) => decoded(TextResult, \"read-text\", \"undispatched\")({ text })),\n ),\n click: (request) =>\n checked(ClickRequest, request, \"click\").pipe(\n Effect.flatMap((value) => bound.click(value.selector)),\n Effect.flatMap((url) => action({ url })),\n ),\n fill: (request) =>\n checked(FillRequest, request, \"fill\").pipe(\n Effect.flatMap((value) => bound.fill(value.selector, value.value)),\n Effect.flatMap((url) => action({ url })),\n ),\n scroll: (request) =>\n checked(ScrollRequest, request, \"scroll\").pipe(\n Effect.flatMap((value) => bound.scroll(value.deltaX, value.deltaY)),\n Effect.flatMap((url) => action({ url })),\n ),\n pointerMove: (request) =>\n checked(PointerMoveRequest, request, \"pointer-move\").pipe(\n Effect.flatMap((value) => bound.pointerMove(value.to)),\n Effect.flatMap((input) => pointerMoved({ ...input, kind: \"pointer-move\" })),\n ),\n hover: (request) =>\n checked(HoverRequest, request, \"hover\").pipe(\n Effect.flatMap((value) => bound.hover(value.selector)),\n Effect.flatMap((input) => hovered({ ...input, kind: \"hover\" })),\n ),\n wheel: (request) =>\n checked(WheelRequest, request, \"wheel\").pipe(\n Effect.flatMap((value) =>\n bound\n .wheel(value.deltaX, value.deltaY, value.at)\n .pipe(\n Effect.flatMap((input) =>\n wheeled({ ...input, kind: \"wheel\", delta: { x: value.deltaX, y: value.deltaY } }),\n ),\n ),\n ),\n ),\n press: (request) =>\n checked(PressRequest, request, \"press\").pipe(\n Effect.flatMap((value) => bound.press(value.key, value.modifiers ?? [], value.into)),\n Effect.flatMap((input) => pressed({ ...input, kind: \"press\" })),\n ),\n type: (request) =>\n checked(TypeRequest, request, \"type\").pipe(\n Effect.flatMap((value) => bound.type(value.text, value.into)),\n Effect.flatMap((input) => typed({ ...input, kind: \"type\" })),\n ),\n screenshot: (request) =>\n checked(ScreenshotRequest, request, \"screenshot\").pipe(\n Effect.flatMap((value) => bound.screenshot(value.fullPage)),\n Effect.flatMap((bytes) =>\n decoded(\n ScreenshotResult,\n \"screenshot\",\n \"undispatched\",\n )({ mediaType: \"image/png\", bytes: new Uint8Array(bytes) }),\n ),\n ),\n});\n\nconst makePinnedTarget = (value: {\n readonly target: Target;\n readonly operations: TargetControls;\n}): PinnedTarget =>\n Object.freeze({\n ...makeTarget(value.operations),\n target: Object.freeze(Target.make({ ...value.target })),\n });\n\n/** A browser-operation failure keeps its meaning when it is reported as an initialization one. */\nconst initialization = (reason: BrowserError[\"reason\"]): InitializationError[\"reason\"] =>\n reason._tag === \"Busy\"\n ? \"busy\"\n : reason._tag === \"Closed\" || reason._tag === \"Disconnected\"\n ? \"closed\"\n : reason._tag === \"Timeout\"\n ? \"timeout\"\n : reason._tag === \"Stale\"\n ? \"stale\"\n : reason._tag === \"Unsupported\"\n ? \"unsupported\"\n : reason._tag === \"Configuration\"\n ? \"configuration\"\n : \"native\";\n\nexport const makeSession = <E>(\n controls: SessionControls<SessionLease>,\n bindings: Bindings<E>,\n): BrowserSession<E> => {\n const Wait = Schema.Struct({\n selector: ClickRequest.fields.selector,\n state: Schema.Literals([\"visible\", \"hidden\", \"attached\", \"detached\"]),\n });\n\n const navigate = (url: string) => action({ url });\n\n const session: BrowserSession<E> = {\n ...makeTarget(controls.operations),\n implementation: controls.implementation,\n status: controls.status,\n diagnostics: controls.diagnostics,\n closeChecked: controls.closeChecked,\n failure: bindings.failure,\n bindingDiagnostics: bindings.diagnostics,\n retain: controls.retain.pipe(Effect.map(makeTarget)),\n target: controls.target,\n observe: (options = {}) =>\n checked(ObservationOptions, options, \"observe\").pipe(\n Effect.flatMap((value) => controls.observe({ ...value, scope: value.scope ?? \"document\" })),\n ),\n checkpoint: (options = {}) =>\n checked(CheckpointOptions, options, \"checkpoint\").pipe(\n Effect.flatMap((value) =>\n controls.checkpoint({ ...value, picture: value.picture ?? false }),\n ),\n Effect.flatMap(({ picture, ...sampled }) =>\n decoded(\n Checkpoint,\n \"checkpoint\",\n \"undispatched\",\n )({\n ...sampled,\n ...(picture === undefined\n ? {}\n : { picture: { mediaType: \"image/png\", bytes: new Uint8Array(picture) } }),\n }),\n ),\n ),\n controlFacts: (reference) =>\n checked(ObservedElement, reference, \"control-facts\").pipe(\n Effect.flatMap(controls.controlFacts),\n ),\n revalidateElement: (reference) =>\n checked(ObservedElement, reference, \"revalidate\").pipe(\n Effect.flatMap((value) => controls.revalidate(value).pipe(Effect.as(value))),\n ),\n clickElement: (reference, admission) =>\n checked(ObservedElement, reference, \"click\").pipe(\n Effect.flatMap((value) => controls.operations.click(value, admission?.admit)),\n Effect.flatMap(navigate),\n ),\n fillElement: (reference, value, admission) =>\n checked(ObservedElement, reference, \"fill\").pipe(\n Effect.flatMap((element) =>\n checked(FillRequest.fields.value, value, \"fill\").pipe(\n Effect.flatMap((text) => controls.operations.fill(element, text, admission?.admit)),\n ),\n ),\n Effect.flatMap(navigate),\n ),\n selectOption: (reference, options, admission) =>\n checked(ObservedElement, reference, \"select-option\").pipe(\n Effect.flatMap((element) =>\n checked(SelectOptions, options, \"select-option\").pipe(\n Effect.flatMap((ids) => controls.selectOption(element, ids, admission?.admit)),\n ),\n ),\n Effect.flatMap(navigate),\n ),\n hoverElement: (reference, admission) =>\n checked(ObservedElement, reference, \"hover\").pipe(\n Effect.flatMap((value) => controls.operations.hover(value, admission?.admit)),\n Effect.flatMap((input) => hovered({ ...input, kind: \"hover\" })),\n ),\n pressElement: (reference, stroke, admission) =>\n checked(ObservedElement, reference, \"press\").pipe(\n Effect.flatMap((element) =>\n checked(KeyStroke, stroke, \"press\").pipe(\n Effect.flatMap((value) =>\n controls.operations.press(\n value.key,\n value.modifiers ?? [],\n element,\n admission?.admit,\n ),\n ),\n ),\n ),\n Effect.flatMap((input) => pressed({ ...input, kind: \"press\" })),\n ),\n typeElement: (reference, text, admission) =>\n checked(ObservedElement, reference, \"type\").pipe(\n Effect.flatMap((element) =>\n checked(TypeRequest.fields.text, text, \"type\").pipe(\n Effect.flatMap((value) => controls.operations.type(value, element, admission?.admit)),\n ),\n ),\n Effect.flatMap((input) => typed({ ...input, kind: \"type\" })),\n ),\n pages: controls.pages,\n frames: controls.frames,\n framesOf: (page) =>\n checked(PageInfo, page, \"list-frames\").pipe(Effect.flatMap(controls.framesOf)),\n pinPage: (page) =>\n checked(PageInfo, page, \"target\").pipe(\n Effect.flatMap(controls.pinPage),\n Effect.map(makePinnedTarget),\n ),\n pinFrame: (page, frame) =>\n checked(PageInfo, page, \"target\").pipe(\n Effect.flatMap((checkedPage) =>\n checked(FrameInfo, frame, \"target\").pipe(\n Effect.flatMap((checkedFrame) => controls.pinFrame(checkedPage, checkedFrame)),\n ),\n ),\n Effect.map(makePinnedTarget),\n ),\n selectPage: (page) =>\n checked(PageInfo, page, \"select-page\").pipe(Effect.flatMap(controls.selectPage)),\n selectFrame: (id) =>\n checked(Identifier, id, \"select-frame\").pipe(Effect.flatMap(controls.selectFrame)),\n createPage: controls.createPage(),\n closePage: (page) =>\n checked(PageInfo, page, \"close-page\").pipe(Effect.flatMap(controls.closePage)),\n resizeViewport: (viewport) =>\n checked(Viewport, viewport, \"resize\").pipe(Effect.flatMap(controls.resize)),\n waitFor: (request) =>\n checked(Wait, request, \"wait\").pipe(\n Effect.flatMap((value) => controls.waitFor(value.selector, value.state)),\n ),\n waitForElement: (request) =>\n checked(WaitForElementRequest, request, \"wait\").pipe(Effect.flatMap(controls.waitForElement)),\n clickAndWait: (request) =>\n checked(ClickRequest, request, \"click-and-wait\").pipe(\n Effect.flatMap((value) => controls.clickAndWait(value.selector)),\n Effect.flatMap((url) => action({ url })),\n ),\n ready: controls.readiness.pipe(\n Effect.mapError((error) =>\n InitializationError.make({\n operation: \"ready\",\n step: \"session\",\n reason: initialization(error.reason),\n }),\n ),\n Effect.flatMap((state) =>\n state._tag === \"NotReady\"\n ? Effect.fail(\n InitializationError.make({\n operation: \"ready\",\n step: state.step,\n reason: state.reason === \"failed\" ? \"output\" : state.reason,\n }),\n )\n : Effect.succeed<Bootstrap.ReadinessOutcome>({ _tag: state._tag }),\n ),\n ),\n };\n\n associate(session, controls.capture);\n associatePageControl(session, controls.pageControl);\n\n return session;\n};\n","import { Cause, Effect, Exit, Option } from \"effect\";\n\nimport type { BrowserError, InitializationError } from \"../../Errors.ts\";\n\n/** Evidence about this connection, independent of the lifetime of its browser process. */\nexport type ConnectionState = \"closed\" | \"failed\" | \"not-connected\" | \"pending\";\n\n/** Captured teardown operations supplied to the lifetime which owns this connection. */\nexport interface ConnectionCleanup {\n readonly fence: Effect.Effect<void>;\n readonly capture: Effect.Effect<void, BrowserError>;\n readonly initialization: Effect.Effect<void, BrowserError | InitializationError>;\n readonly disconnect: Effect.Effect<ConnectionState, BrowserError>;\n}\n\nexport const noConnection: ConnectionCleanup = {\n fence: Effect.void,\n capture: Effect.void,\n initialization: Effect.void,\n disconnect: Effect.succeed(\"not-connected\"),\n};\n\nexport type CleanupStep<A> =\n | { readonly _tag: \"Success\"; readonly value: A }\n | { readonly _tag: \"Failure\"; readonly reason: \"timeout\" | \"interrupted\" | \"failed\" };\n\nconst timedOut = Symbol(\"BrowserCleanupTimeout\");\n\n/** Every step settles independently, so one failure never suppresses subsequent teardown. */\nexport const cleanupStep = <A, E, R>(\n action: Effect.Effect<A, E, R>,\n timeoutMillis: number,\n): Effect.Effect<CleanupStep<A>, never, R> =>\n action.pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({ duration: timeoutMillis, orElse: () => Effect.fail(timedOut) }),\n Effect.exit,\n Effect.map((exit): CleanupStep<A> => {\n if (Exit.isSuccess(exit)) return { _tag: \"Success\", value: exit.value };\n const error = Cause.findErrorOption(exit.cause);\n\n return {\n _tag: \"Failure\",\n reason:\n Option.isSome(error) && error.value === timedOut\n ? \"timeout\"\n : Cause.hasInterrupts(exit.cause)\n ? \"interrupted\"\n : \"failed\",\n };\n }),\n );\n\n/** Bounded host notification; reporting cannot change the cleanup evidence it describes. */\nexport const reported = <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<void> =>\n cleanupStep(effect, 2000).pipe(Effect.asVoid);\n","import { Clock, Deferred, Duration, Effect, Schema, Semaphore } from \"effect\";\n\nimport {\n BrowserDiagnostic,\n BrowserDiagnostics,\n SessionStatus,\n type SessionReason,\n type SessionPhase,\n} from \"../../BrowserData.ts\";\nimport { BrowserError, Reasons, type BrowserOperation } from \"../../Errors.ts\";\nimport type { DriverFault, DriverTarget } from \"./Driver.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\n\n/** The browser domain's bounded step: one deadline, one declared BrowserError timeout. */\nexport const within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n onTimeout: () => BrowserError,\n): Effect.Effect<A, E | BrowserError, R> =>\n Effect.gen(function* () {\n const now = Number(yield* Clock.monotonicTimeNanos) / 1_000_000;\n\n return yield* deadline <= now\n ? Effect.fail(onTimeout())\n : effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(deadline - now),\n orElse: () => Effect.fail(onTimeout()),\n }),\n );\n });\n\nexport type Phase = SessionPhase;\n\nexport type Invalidation =\n | \"observation\"\n | \"target-changed\"\n | \"resized\"\n | \"paused\"\n | \"disconnected\"\n | \"uncertain\"\n | \"closed\";\n\n/** Observation retirement is independent of the owner's revision and connection fences. */\nexport type ObservationScope = \"all\" | \"none\" | { readonly pageId: string };\n\n/** A bounded native reading has no mutation dispatch authority. */\nexport interface ReadTicket {\n readonly signal: AbortSignal;\n readonly deadline: number;\n readonly generation: number;\n readonly remainingMillis: () => number;\n check(): void;\n}\n\n/** One admitted native operation; checks at dispatch also fence late Promise continuations. */\nexport interface Ticket extends ReadTicket {\n readonly dispatched: boolean;\n dispatch(): void;\n}\n\n/** The driver retires native capacity only after its wait and required handle disposal settle. */\nexport interface WaitTicket extends ReadTicket {\n invalidate(): void;\n retire(): void;\n}\n\nexport interface OwnedWait {\n readonly ticket: WaitTicket;\n readonly completed: Effect.Effect<void, BrowserError>;\n readonly start: (body: () => Promise<void>) => void;\n readonly cancel: (reason?: BrowserError[\"reason\"]) => void;\n}\n\n/**\n * A dispatched mutation the browser is still performing after its permit was released: an\n * in-flight navigation. It keeps other mutations off that page while reads, holds and other\n * pages proceed. Like a permit it cannot be dropped silently: only a known outcome releases it.\n */\nexport interface Reservation {\n /** Aborted by any fence, so work that outlives its connection is never treated as current. */\n readonly signal: AbortSignal;\n /** `unknown` fences the owner, exactly as a mutation interrupted after dispatch does. */\n readonly settle: (outcome: \"known\" | \"unknown\") => void;\n}\n\nexport interface Limits {\n readonly maxActions: number;\n readonly maxHostReads: number;\n readonly maxElapsedMillis: number;\n readonly actionTimeoutMillis: number;\n}\n\nexport const makeOwner = Effect.fnUntraced(function* (limits: Limits) {\n const semaphore = yield* Semaphore.make(1);\n const clock = yield* Clock.Clock;\n\n const lifetimeDeadline =\n Number(yield* Clock.monotonicTimeNanos) / 1_000_000 + limits.maxElapsedMillis;\n\n const hooks = new Set<(reason: Invalidation, scope: ObservationScope) => void>();\n\n const state = {\n phase: \"acquiring\" as Phase,\n generation: 0,\n revision: 0,\n selection: 0,\n actions: 0,\n hostReads: 0,\n };\n\n let active: AbortController | undefined;\n let holdingPermit = false;\n\n let waiting:\n | {\n readonly connection: object;\n readonly target: DriverTarget;\n readonly cancel: OwnedWait[\"cancel\"];\n readonly retire: () => void;\n pending: boolean;\n }\n | undefined;\n\n const reservations = new Map<string, AbortController>();\n // These facts outlive the tickets which produced them. Aborting admission is not retirement.\n const unresolved = new Set<object>();\n let nativeUncertainty = false;\n let terminalReason: SessionReason | null = null;\n let pauseReason: SessionReason | null = null;\n const policies = new Map<object, Extract<DriverFault, { readonly source: \"policy\" }>>();\n const records: Array<BrowserDiagnostics[\"records\"][number]> = [];\n let total = 0;\n let dropped = 0;\n\n const record = (\n reason: SessionReason,\n disposition: BrowserDiagnostics[\"records\"][number][\"disposition\"],\n generation = state.generation,\n ) => {\n total = Math.min(Number.MAX_SAFE_INTEGER, total + 1);\n if (records.length === 32) {\n records.shift();\n dropped = Math.min(Number.MAX_SAFE_INTEGER, dropped + 1);\n }\n records.push(\n Object.freeze(\n BrowserDiagnostic.make({\n reason,\n disposition,\n generation,\n monotonicNanos: clock.monotonicTimeNanosUnsafe(),\n }),\n ),\n );\n };\n\n const transition = (phase: Phase) => {\n if (\n (terminalReason !== null || state.phase === \"closed\" || state.phase === \"closing\") &&\n phase !== \"closing\" &&\n phase !== \"closed\"\n )\n return;\n state.phase = phase;\n if (phase === \"open\") pauseReason = null;\n };\n\n const invalidate = (reason: Invalidation, scope: ObservationScope = \"all\") => {\n if (scope === \"all\" || (scope !== \"none\" && scope.pageId === waiting?.target.pageId))\n waiting?.cancel(Reasons.Stale.make({}));\n state.revision++;\n for (const hook of hooks) hook(reason, scope);\n };\n\n const fence = (phase: Phase, reason: Invalidation, trigger?: SessionReason) => {\n if (\n state.phase === \"closed\" ||\n (state.phase === \"closing\" && phase !== \"closed\" && phase !== \"closing\")\n )\n return;\n if (phase === \"uncertain\" || phase === \"faulted\" || phase === \"closing\" || phase === \"closed\")\n terminalReason ??= trigger ?? (phase === \"uncertain\" ? \"native-failure\" : \"closed\");\n else if (trigger !== undefined) pauseReason = trigger;\n // A known trigger is retained even when the abort below interrupts dispatched work.\n if (!(state.phase === \"faulted\" && phase === \"uncertain\")) state.phase = phase;\n state.generation++;\n const pending = [...reservations.values()];\n\n reservations.clear();\n active?.abort();\n waiting?.cancel(\n terminalReason === \"expired\" ? Reasons.Expired.make({}) : Reasons.Stale.make({}),\n );\n for (const reservation of pending) reservation.abort();\n invalidate(reason);\n };\n\n const terminate = (\n reason: SessionReason,\n disposition: \"known\" | \"not-dispatched\" | \"unknown\",\n generation = state.generation,\n ) => {\n if (disposition === \"unknown\") nativeUncertainty = true;\n record(reason, disposition === \"known\" ? \"confirmed\" : disposition, generation);\n fence(\n disposition === \"unknown\" ? \"uncertain\" : \"faulted\",\n disposition === \"unknown\" ? \"uncertain\" : \"closed\",\n reason,\n );\n };\n\n const expire = () => {\n if (terminalReason !== null || state.phase === \"closing\" || state.phase === \"closed\") return;\n terminate(\"expired\", \"known\");\n };\n\n /** Quarantine changes admission only; an originating click keeps its own valid ticket. */\n const policy = (\n event: Extract<DriverFault, { readonly source: \"policy\" }>,\n generation: number,\n ) => {\n if (event.disposition !== \"dispatched\") record(event.reason, event.disposition, generation);\n const previous = policies.get(event.token);\n\n switch (event.disposition) {\n case \"pending\":\n if (previous === undefined && terminalReason === null) policies.set(event.token, event);\n break;\n case \"dispatched\":\n unresolved.add(event.token);\n if (previous !== undefined) policies.set(event.token, event);\n break;\n case \"confirmed\":\n unresolved.delete(event.token);\n policies.delete(event.token);\n break;\n case \"unknown\":\n // Keep the token so a late acknowledgement may retire it, but never reopen admission.\n unresolved.add(event.token);\n fence(\"uncertain\", \"uncertain\", event.reason);\n break;\n case \"not-dispatched\":\n policies.delete(event.token);\n fence(\"faulted\", \"closed\", event.reason);\n break;\n }\n };\n\n /** Taken under the permit that dispatched the work, so nothing can interleave before it. */\n const reserve = (key: string): Reservation => {\n // Outlives the fiber that dispatched it, and must be abortable by a fence from outside it.\n const controller = new AbortController();\n\n reservations.set(key, controller);\n unresolved.add(controller);\n\n return {\n signal: controller.signal,\n settle: (outcome) => {\n // A fence already cleared it, and decided the outcome for everything it aborted.\n if (reservations.get(key) !== controller) return;\n reservations.delete(key);\n if (outcome === \"known\") unresolved.delete(controller);\n else fence(\"uncertain\", \"uncertain\");\n },\n };\n };\n\n /**\n * Admission transfers a pure wait to an independent deadline and cancellation record. Its\n * logical barrier may end before uncancellable native work; neither is a mutation reservation.\n */\n const beginWait = (admission: Ticket, target: DriverTarget, connection: object): OwnedWait => {\n admission.check();\n if (waiting !== undefined)\n throw BrowserError.make({\n operation: \"wait\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n });\n const controller = new AbortController();\n const result = Deferred.makeUnsafe<void, BrowserError>();\n const generation = admission.generation;\n const deadline = admission.deadline;\n let retired = false;\n let started = false;\n let canceled: BrowserError | undefined;\n\n const error = (reason: BrowserError[\"reason\"]) =>\n BrowserError.make({ operation: \"wait\", reason, outcome: \"undispatched\" });\n\n const release = () => {\n if (retired && !record.pending && waiting === record) waiting = undefined;\n };\n\n const complete = (exit: Effect.Effect<void, BrowserError>) => {\n if (!record.pending) return;\n record.pending = false;\n release();\n Deferred.doneUnsafe(result, exit);\n };\n\n const cancel: OwnedWait[\"cancel\"] = (reason = Reasons.Interrupted.make({})) => {\n if (record.pending) {\n canceled = error(reason);\n complete(Effect.fail(canceled));\n }\n controller.abort();\n };\n\n const record = {\n connection,\n target: { ...target },\n pending: true,\n cancel,\n retire: () => {\n retired = true;\n release();\n },\n };\n\n waiting = record;\n\n const check = () => {\n const now = Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000;\n\n if (now >= lifetimeDeadline) expire();\n if (canceled !== undefined) throw canceled;\n if (controller.signal.aborted || state.generation !== generation || state.phase !== \"open\")\n throw error(Reasons.Stale.make({}));\n if (now >= deadline) throw error(Reasons.Timeout.make({}));\n };\n\n const ticket: WaitTicket = {\n signal: controller.signal,\n deadline,\n generation,\n remainingMillis: () =>\n Math.max(1, deadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n check,\n invalidate: () => cancel(Reasons.Stale.make({})),\n retire: record.retire,\n };\n\n const fail = (cause: unknown) => {\n let failure = publicError(cause, \"wait\", {\n reason: Reasons.Provider.make({}),\n outcome: \"undispatched\",\n });\n\n try {\n check();\n } catch (current) {\n failure = publicError(current, \"wait\", failure);\n }\n complete(Effect.fail(failure));\n };\n\n return {\n ticket,\n cancel,\n completed: within(Deferred.await(result), deadline, () => {\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline) expire();\n cancel(Reasons.Timeout.make({}));\n\n return canceled ?? error(Reasons.Timeout.make({}));\n }).pipe(\n Effect.tap(() =>\n Effect.try({\n try: check,\n catch: (cause) =>\n publicError(cause, \"wait\", {\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n }),\n }),\n ),\n ),\n start: (body) => {\n if (started) return;\n started = true;\n try {\n check();\n // Observe settlement after cancellation too; the native retire callback owns capacity.\n void body().then(() => {\n try {\n check();\n complete(Effect.void);\n } catch (cause) {\n fail(cause);\n }\n }, fail);\n } catch (cause) {\n record.retire();\n fail(cause);\n }\n },\n };\n };\n\n const guard = <A, E, R>(\n operation: BrowserOperation,\n body: (ticket: Ticket) => Effect.Effect<A, E, R>,\n options: {\n readonly charge?: boolean | \"host-read\";\n readonly mutation?: boolean;\n readonly mutationScope?: () => ObservationScope;\n readonly phases?: ReadonlyArray<Phase>;\n readonly verifyAfter?: boolean;\n readonly preflight?: Effect.Effect<void, BrowserError>;\n /** A request can shorten this operation's policy deadline, never extend it. */\n readonly timeoutMillis?: number;\n /** Private recovery admission: one absolute deadline also bounds waiting for this permit. */\n readonly waitUntil?: number;\n } = {},\n ): Effect.Effect<A, E | BrowserError, R> =>\n Effect.suspend(() => {\n let admitted: Ticket | undefined;\n\n const work = Effect.gen(function* () {\n holdingPermit = true;\n if (!(options.phases ?? [\"open\"]).includes(state.phase) || policies.size > 0) {\n return yield* BrowserError.make({\n operation,\n reason:\n terminalReason === \"expired\"\n ? Reasons.Expired.make({})\n : state.phase === \"paused\" || (terminalReason === null && policies.size > 0)\n ? Reasons.Busy.make({})\n : Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n }\n yield* options.preflight ?? Effect.void;\n const now = Number(yield* Clock.monotonicTimeNanos) / 1_000_000;\n\n if (now >= lifetimeDeadline) {\n expire();\n\n return yield* BrowserError.make({\n operation,\n reason: Reasons.Expired.make({}),\n outcome: \"undispatched\",\n });\n }\n\n const deadline = Math.min(\n options.waitUntil ?? now + limits.actionTimeoutMillis,\n options.timeoutMillis === undefined\n ? Number.POSITIVE_INFINITY\n : now + options.timeoutMillis,\n lifetimeDeadline,\n );\n\n if (now >= deadline)\n return yield* BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: \"undispatched\",\n });\n if (options.charge !== false) {\n const hostRead = options.charge === \"host-read\";\n const maximum = hostRead ? limits.maxHostReads : limits.maxActions;\n const observed = hostRead ? state.hostReads : state.actions;\n\n if (observed >= maximum)\n return yield* BrowserError.make({\n operation,\n reason: Reasons.Limit.make({\n dimension: hostRead ? \"host-reads\" : \"actions\",\n maximum,\n observed,\n }),\n outcome: \"undispatched\",\n });\n if (hostRead) state.hostReads++;\n else state.actions++;\n }\n // The lifecycle fence must actively abort admitted native work outside the current fiber.\n // @effect-diagnostics-next-line abortControllerInEffect:off\n const controller = new AbortController();\n\n active = controller;\n let dispatched = false;\n const generation = state.generation;\n const allowed = options.phases ?? [\"open\"];\n\n const check = () => {\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline) expire();\n if (\n controller.signal.aborted ||\n state.generation !== generation ||\n !allowed.includes(state.phase)\n ) {\n throw BrowserError.make({\n operation,\n reason: Reasons.Stale.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n }\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= deadline)\n throw BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n };\n\n const ticket: Ticket = {\n signal: controller.signal,\n deadline,\n generation,\n remainingMillis: () =>\n Math.max(1, deadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n get dispatched() {\n return dispatched;\n },\n check,\n dispatch() {\n check();\n if (!dispatched && options.mutation)\n invalidate(\"observation\", options.mutationScope?.() ?? \"all\");\n dispatched = true;\n unresolved.add(controller);\n },\n };\n\n admitted = ticket;\n\n const uncertain = () => {\n // The action timer can win the same instant as the independent lifetime timer.\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline) expire();\n const fenced = controller.signal.aborted;\n\n controller.abort();\n if (dispatched && !fenced && state.phase !== \"closing\" && state.phase !== \"closed\")\n fence(\"uncertain\", \"uncertain\");\n };\n\n return yield* within(body(ticket), ticket.deadline, () => {\n uncertain();\n\n return BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n }).pipe(\n Effect.tap(() =>\n options.verifyAfter === false\n ? Effect.void\n : Effect.try({\n try: check,\n catch: () =>\n BrowserError.make({\n operation,\n reason: Reasons.Stale.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n }),\n }),\n ),\n Effect.catch((error): Effect.Effect<never, E | BrowserError> => {\n if (dispatched) uncertain();\n // The permit adds dispatch evidence only to browser-operation errors. Typed\n // initialization/consumer failures retain their identity and original family.\n if (!Schema.is(BrowserError)(error)) return Effect.fail(error);\n\n return Effect.fail(\n BrowserError.make({\n operation,\n reason: error.reason,\n outcome: error.outcome,\n }),\n );\n }),\n Effect.onInterrupt(() => Effect.sync(uncertain)),\n Effect.tap(() => Effect.sync(() => unresolved.delete(controller))),\n Effect.ensuring(\n Effect.sync(() => {\n controller.abort();\n if (active === controller) active = undefined;\n }),\n ),\n );\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n holdingPermit = false;\n }),\n ),\n );\n\n if (options.waitUntil !== undefined)\n return within(\n semaphore.withPermits(1)(work),\n Math.min(options.waitUntil, lifetimeDeadline),\n () =>\n BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: admitted?.dispatched === true ? \"unknown\" : \"undispatched\",\n }),\n );\n\n return semaphore\n .withPermitsIfAvailable(1)(work)\n .pipe(\n Effect.flatMap(\n Effect.fromOption(() =>\n BrowserError.make({\n operation,\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n ),\n ),\n );\n });\n\n /** Lifecycle transitions are performed while holding guard's permit; close alone preempts it. */\n return {\n state,\n lifetimeDeadline,\n guard,\n reserve,\n reserved: (key: string): boolean => reservations.has(key),\n beginWait,\n waitAvailable: () => waiting === undefined,\n waitPending: (pageId?: string) =>\n waiting?.pending === true && (pageId === undefined || waiting.target.pageId === pageId),\n /** Positive retirement is specific to a connection, including a late retired predecessor. */\n retireWait: (connection: object) => {\n const previous = waiting;\n\n if (previous?.connection !== connection) return;\n previous.cancel(Reasons.Stale.make({}));\n previous.retire();\n },\n invalidate,\n fence,\n transition,\n expire,\n terminate,\n policy,\n record,\n /** Only positive lifetime-source evidence may retire control lost to a connection fence. */\n retireControl: () => {\n const previous = waiting;\n\n previous?.cancel(Reasons.Stale.make({}));\n previous?.retire();\n unresolved.clear();\n nativeUncertainty = false;\n policies.clear();\n },\n status: Effect.sync(() =>\n Object.freeze(\n SessionStatus.make({\n phase: state.phase,\n reason: terminalReason ?? pauseReason ?? policies.values().next().value?.reason ?? null,\n generation: state.generation,\n busy: holdingPermit || policies.size > 0 || waiting !== undefined,\n unresolvedDispatch: nativeUncertainty || unresolved.size > 0,\n }),\n ),\n ),\n diagnostics: Effect.sync(() => {\n const snapshot = BrowserDiagnostics.make({\n records: [...records],\n total,\n dropped,\n truncated: dropped > 0,\n });\n\n // Schema construction owns its array; freeze the produced snapshot, not merely its input.\n for (const record of snapshot.records) Object.freeze(record);\n Object.freeze(snapshot.records);\n\n return Object.freeze(snapshot);\n }),\n onInvalidate(hook: (reason: Invalidation, scope: ObservationScope) => void): () => void {\n hooks.add(hook);\n\n return () => {\n hooks.delete(hook);\n };\n },\n };\n});\n\nexport type Owner = Effect.Success<ReturnType<typeof makeOwner>>;\n\n/** Without a native answer, whether the step was sent is all the owner knows about it. */\nconst unsettled = (ticket: Ticket): Pick<BrowserError, \"reason\" | \"outcome\"> => ({\n reason: Reasons.Provider.make({}),\n outcome: ticket.dispatched ? \"unknown\" : \"undispatched\",\n});\n\n/**\n * The one place a native step becomes a public error: whatever the driver raised, the caller\n * sees the operation it asked for.\n */\nexport const native = <A>(operation: BrowserOperation, ticket: Ticket, body: () => Promise<A>) =>\n Effect.callback<A, BrowserError>((resume) => {\n let done = false;\n\n const cleanup = () => {\n done = true;\n ticket.signal.removeEventListener(\"abort\", abort);\n };\n\n const abort = () => {\n if (done) return;\n cleanup();\n resume(\n Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Stale.make({}),\n outcome: ticket.dispatched ? \"unknown\" : \"undispatched\",\n }),\n ),\n );\n };\n\n ticket.signal.addEventListener(\"abort\", abort, { once: true });\n try {\n ticket.check();\n // Observe both branches even after the waiter exits. Cancellation does not undo native work.\n void body().then(\n (value) => {\n if (!done) {\n cleanup();\n resume(Effect.succeed(value));\n }\n },\n (error: unknown) => {\n if (!done) {\n cleanup();\n resume(Effect.fail(publicError(error, operation, unsettled(ticket))));\n }\n },\n );\n } catch (error) {\n cleanup();\n resume(Effect.fail(publicError(error, operation, unsettled(ticket))));\n }\n\n return Effect.sync(cleanup);\n });\n","import { Clock, Deferred, Effect, Exit, Redacted, Schema, Scope } from \"effect\";\n\nimport {\n type FrameInfo,\n type KeyModifier,\n Observation,\n type ObservedElement,\n type PageInfo,\n type PageSuspension,\n type SelectOptions,\n Target,\n type Viewport,\n type WaitForElementRequest,\n} from \"../../BrowserData.ts\";\nimport type { Lifetime, Source } from \"../../BrowserRuntime.ts\";\nimport { BrowserError, Reasons, type BrowserOperation } from \"../../Errors.ts\";\nimport { type CaptureParent } from \"./Association.ts\";\nimport type { BindingImplementation } from \"./Binding.ts\";\nimport type { ConnectionBindings } from \"./Bindings.ts\";\nimport { cleanupStep, type ConnectionCleanup, type ConnectionState } from \"./ConnectionCleanup.ts\";\nimport type {\n Driver,\n DriverEvents,\n DriverFault,\n DriverOptions,\n DriverTarget,\n NativeFileSelection,\n NavigationControl,\n} from \"./Driver.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport {\n makeOwner,\n native,\n within,\n type Limits,\n type ObservationScope,\n type OwnedWait,\n type Ticket,\n type WaitTicket,\n} from \"./Owner.ts\";\nimport type { NativeInput, NativePoint } from \"./Pointer.ts\";\n\nexport type SessionLease = Lifetime;\nexport type RemoteSource<L extends SessionLease, E, R = never> = Source<L, E, R>;\n\n/** Bounds a reading of the selected document. Already validated at the public boundary. */\nexport interface Reading {\n readonly scope: \"document\" | \"viewport\";\n readonly maxTextBytes?: number;\n readonly maxControls?: number;\n}\n\ninterface NavigationStopAttempt<E> {\n readonly result: Deferred.Deferred<void, E>;\n readonly retired: Deferred.Deferred<void>;\n running: boolean;\n committed: boolean;\n setupPending: boolean;\n}\n\n/**\n * Callers share the active attempt. Its owner may cancel it, but a committed Exit is permanent.\n * Before commitment, retry waits for actual native setup and port retirement, not the waiter.\n */\nconst makeNavigationStopCoordinator = <E, R>(\n done: () => boolean,\n attempt: (\n onDispatch: () => void,\n retainSetup: () => () => void,\n deadline?: number,\n ) => Effect.Effect<\"dispatched\" | \"settled\", E, R>,\n confirmed: () => void,\n) =>\n Effect.sync(() => {\n let current: NavigationStopAttempt<E | BrowserError> | undefined;\n\n const request = (deadline?: number): Effect.Effect<void, E | BrowserError, R> =>\n Effect.uninterruptibleMask((restore) =>\n Effect.suspend(() => {\n // Fencing may complete the navigation while a committed stop is still failing.\n if (current !== undefined && (current.running || current.committed)) {\n const joined = current;\n\n if (deadline === undefined || joined.committed)\n return restore(Deferred.await(joined.result));\n\n return restore(Effect.exit(Deferred.await(joined.result))).pipe(\n Effect.flatMap((exit) =>\n Exit.isSuccess(exit) || joined.committed\n ? exit\n : restore(Deferred.await(joined.retired)).pipe(Effect.andThen(request(deadline))),\n ),\n );\n }\n if (done()) return Effect.void;\n if (current !== undefined) {\n if (deadline !== undefined)\n return restore(Deferred.await(current.retired)).pipe(\n Effect.andThen(request(deadline)),\n );\n\n return Effect.fail(\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n );\n }\n\n const active: NavigationStopAttempt<E | BrowserError> = {\n result: Deferred.makeUnsafe(),\n retired: Deferred.makeUnsafe(),\n running: true,\n committed: false,\n setupPending: false,\n };\n\n current = active;\n\n const retire = () => {\n active.setupPending = false;\n if (!active.running) {\n if (!active.committed && current === active) current = undefined;\n Deferred.doneUnsafe(active.retired, Effect.void);\n }\n };\n\n return restore(\n Effect.suspend(() =>\n attempt(\n () => {\n active.committed = true;\n },\n () => {\n active.setupPending = true;\n\n return retire;\n },\n deadline,\n ),\n ),\n ).pipe(\n Effect.tap((result) =>\n result === \"dispatched\" ? Effect.sync(confirmed) : Effect.void,\n ),\n Effect.asVoid,\n Effect.onExit((exit) =>\n Effect.sync(() => {\n active.running = false;\n if (!active.committed && !active.setupPending) current = undefined;\n if (!active.setupPending) Deferred.doneUnsafe(active.retired, Effect.void);\n Deferred.doneUnsafe(active.result, exit);\n }),\n ),\n );\n }),\n );\n\n return {\n stop: request(),\n recover: (deadline: number) =>\n within(request(deadline), deadline, () =>\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Timeout.make({}),\n outcome: current?.committed === true ? \"unknown\" : \"undispatched\",\n }),\n ),\n };\n });\n\n/** Explicit callers retain the original cancellation and fail-fast admission contract. */\nexport const makeNavigationStop = <E, R>(\n done: () => boolean,\n attempt: (\n onDispatch: () => void,\n retainSetup: () => () => void,\n ) => Effect.Effect<\"dispatched\" | \"settled\", E, R>,\n confirmed: () => void,\n) =>\n makeNavigationStopCoordinator(done, attempt, confirmed).pipe(\n Effect.map((coordinator) => coordinator.stop),\n );\n\nexport interface SessionOptions<L extends SessionLease, E, R = never> {\n readonly implementation: string;\n readonly remote: RemoteSource<L, E, R>;\n /** The constructor resolves an issued binding before acquiring the lifetime. */\n readonly engine: BindingImplementation;\n /** Only a keep-alive session may detach and reattach inside this owner. */\n readonly keepAlive: boolean;\n readonly driver: DriverOptions;\n readonly maxReturnedBytes: number;\n /** Consumer E/R stays with the typed public supervisor; this installs its captured runtime. */\n readonly connectBindings?: (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\n/**\n * One owner for page operations, bootstrap, capture and connection cleanup. The lifetime source\n * decides whether release also terminates a browser and how that termination is observed.\n */\nexport const acquireSession = Effect.fnUntraced(function* <L extends SessionLease, E, R>(\n limits: Limits,\n options: SessionOptions<L, E, R>,\n) {\n // The engine is resolved before anything is allocated, so an unissued binding costs nothing.\n const engine = options.engine;\n\n if (engine === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n const parentScope = yield* Scope.Scope;\n // Register the binding lifetime BEFORE the remote cleanup finalizer. On natural Scope\n // shutdown that finalizer must fence the owner before any callback finalizer can reenter it.\n const bindingLifetime = yield* Scope.fork(parentScope, \"sequential\");\n const ended = yield* Deferred.make<void>();\n const owner = yield* makeOwner(limits);\n const clock = yield* Clock.Clock;\n\n let driver: Driver | undefined;\n let connectPending = false;\n // Native listeners can outlive disconnect. Authority belongs to this connection\n // lease, not merely to the current session phase or selected browser target.\n let activeConnection: object | undefined;\n let handoffToken: string | undefined;\n let reconnectTarget: string | undefined;\n let activeBindings: ConnectionBindings | undefined;\n // A canceled setup may outlive its operation and connection. Keep one slot across the owner\n // until that native setup and its port actually retire; a new operation cannot evade the bound.\n let stopSetupPending: Deferred.Deferred<void> | undefined;\n\n const fenceBindings = () => {\n activeBindings?.close();\n driver?.fenceInitialization?.();\n };\n\n const disposeBindings = Effect.gen(function* () {\n const connection = activeBindings;\n\n activeBindings = undefined;\n const callbacks = yield* Effect.exit(connection?.dispose ?? Effect.void);\n\n const registrations = yield* Effect.tryPromise({\n try: () => driver?.disposeInitialization?.() ?? Promise.resolve(),\n catch: () =>\n BrowserError.make({\n operation: \"close\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.exit);\n\n if (Exit.isFailure(callbacks)) return yield* Effect.failCause(callbacks.cause);\n if (Exit.isFailure(registrations)) return yield* Effect.failCause(registrations.cause);\n });\n\n const capture: CaptureParent = {\n owner,\n target: () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"target\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n\n return Target.make({ generation: owner.state.generation, ...driver.selected() });\n },\n resolve: (ticket, requested) =>\n native(\"capture-start\", ticket, async () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"capture\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n const binding = await driver.capture(requested);\n\n return {\n key: binding.targetId,\n target: Target.make({\n generation: owner.state.generation,\n pageId: binding.pageId,\n frameId: binding.frameId,\n }),\n source: binding.source,\n };\n }),\n captureLeases: new Map(),\n captureReservedBytes: 0,\n };\n\n owner.onInvalidate((reason, scope) => {\n driver?.invalidateObservation(scope);\n if ([\"disconnected\", \"uncertain\", \"closed\"].includes(reason)) fenceBindings();\n if ([\"paused\", \"disconnected\", \"uncertain\", \"closed\"].includes(reason))\n for (const lease of capture.captureLeases.values()) lease.invalidate(reason);\n });\n\n /**\n * The local half of cleanup. Each step is an independent fact for the canonical\n * coordinator, which owns the release request and the terminal status observation.\n */\n const local: ConnectionCleanup = {\n fence: Effect.sync(() => {\n owner.fence(\"closing\", \"closed\");\n handoffToken = undefined;\n activeConnection = undefined;\n Deferred.doneUnsafe(ended, Effect.void);\n }),\n capture: Effect.suspend(() =>\n Effect.forEach([...capture.captureLeases.values()], (lease) => lease.stop, {\n discard: true,\n }),\n ),\n initialization: disposeBindings,\n disconnect: Effect.suspend(() => {\n const acquired = driver;\n\n driver = undefined;\n if (acquired === undefined)\n return Effect.succeed<ConnectionState>(connectPending ? \"pending\" : \"not-connected\");\n\n return Effect.tryPromise({\n try: () => acquired.disconnect(),\n catch: () =>\n BrowserError.make({\n operation: \"disconnect\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.as<ConnectionState>(\"closed\"));\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n owner.transition(\"closed\");\n }),\n ),\n ),\n };\n\n // Registered before the source so natural scope closure observes its completed release first.\n let retireControl: Effect.Effect<void> = Effect.void;\n\n yield* Effect.addFinalizer(() => Effect.suspend(() => retireControl));\n\n const acquired = yield* options.remote(local, owner.lifetimeDeadline);\n\n retireControl = cleanupStep(\n Effect.suspend(() => acquired.controlRetired ?? Effect.succeed(false)),\n 2000,\n ).pipe(\n Effect.tap((result) =>\n result._tag === \"Success\" && result.value ? Effect.sync(owner.retireControl) : Effect.void,\n ),\n Effect.asVoid,\n Effect.ignoreCause,\n );\n\n const ref: L[\"reference\"] = acquired.reference;\n // Effect.tap preserves the exact supplying lifetime's success; the generic constraint alone\n // would infer unknown here. No receipt value is decoded, constructed or coerced by this owner.\n const release = acquired.release as Effect.Effect<Effect.Success<L[\"release\"]>>;\n const cleanupResult: L[\"cleanupResult\"] = acquired.cleanupResult;\n\n const closeScope = acquired.release.pipe(\n Effect.tap(() => retireControl),\n Effect.ensuring(Deferred.succeed(ended, undefined)),\n Effect.asVoid,\n );\n\n const connectionEvents = (connectionLease: object, generation: number): DriverEvents => ({\n retired: () => owner.retireWait(connectionLease),\n invalidate: (reason, scope) => {\n if (activeConnection === connectionLease) owner.invalidate(reason, scope);\n },\n disconnected: () => {\n owner.retireWait(connectionLease);\n if (activeConnection !== connectionLease) return;\n if (\n owner.state.phase !== \"closing\" &&\n owner.state.phase !== \"closed\" &&\n owner.state.phase !== \"detached\"\n ) {\n owner.terminate(\"disconnected\", \"unknown\", generation);\n }\n },\n pause: (reason = \"dialog\") => {\n if (activeConnection !== connectionLease) return;\n const trigger = reason === \"popup\" ? \"popup-policy\" : \"dialog-policy\";\n\n owner.record(trigger, \"confirmed\", generation);\n if (owner.state.phase === \"open\") owner.fence(\"paused\", \"paused\", trigger);\n // An unsolicited popup/dialog during setup cannot be silently admitted by\n // the later connect commit. No usable handle has been exposed: fail closed.\n else if (owner.state.phase === \"acquiring\") owner.terminate(trigger, \"known\", generation);\n },\n fault: (event) => {\n if (activeConnection !== connectionLease) return;\n if (event.source === \"policy\") {\n owner.policy(event, generation);\n\n return;\n }\n if (owner.state.phase === \"closing\" || owner.state.phase === \"closed\") return;\n owner.terminate(\n event.source === \"binding\"\n ? \"callback-failure\"\n : event.disposition === \"not-dispatched\"\n ? \"cleanup-capacity\"\n : event.reason === \"registration\"\n ? \"registration-failure\"\n : event.reason === \"connection\"\n ? \"disconnected\"\n : \"native-failure\",\n event.disposition,\n generation,\n );\n },\n });\n\n const connectNative = (url: Redacted.Redacted<unknown>, nativeOptions: DriverOptions) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const connectionLease = {};\n\n activeConnection = connectionLease;\n connectPending = true;\n const events = connectionEvents(connectionLease, owner.state.generation);\n\n const bindings =\n options.connectBindings === undefined\n ? undefined\n : yield* options\n .connectBindings(\n events.fault,\n () =>\n activeConnection === connectionLease &&\n (owner.state.phase === \"acquiring\" || owner.state.phase === \"open\"),\n () =>\n activeConnection === connectionLease &&\n [\"acquiring\", \"open\", \"paused\"].includes(owner.state.phase),\n )\n .pipe(Scope.provide(bindingLifetime));\n\n activeBindings = bindings;\n\n const retired = () =>\n activeConnection !== connectionLease ||\n [\"closing\", \"closed\", \"uncertain\", \"faulted\"].includes(owner.state.phase);\n\n if (retired()) {\n bindings?.close();\n yield* bindings?.dispose ?? Effect.void;\n\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n }\n\n const acquired = yield* restore(\n engine.connect({\n connection: Redacted.value(url),\n options: {\n ...nativeOptions,\n ...(bindings === undefined\n ? {}\n : {\n bindings: bindings.bindings,\n onBindingFault: bindings.reportFailure,\n }),\n },\n events,\n onAbandoned: () => bindings?.close(),\n onSettled: () => {\n if (activeConnection === connectionLease) connectPending = false;\n },\n }),\n );\n\n driver = acquired;\n if (\n activeConnection !== connectionLease ||\n owner.state.phase === \"closed\" ||\n owner.state.phase === \"closing\" ||\n owner.state.phase === \"uncertain\" ||\n owner.state.phase === \"faulted\"\n ) {\n yield* Effect.tryPromise({\n try: () => acquired.disconnect(),\n catch: () =>\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.ignore);\n driver = undefined;\n\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"unknown\",\n });\n }\n\n return acquired;\n }),\n );\n\n const getDriver = () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"target\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n\n return driver;\n };\n\n /**\n * Work that depends on an initialized document waits for the current document's readiness.\n * Navigation, selection and page management deliberately do not: initialization must never\n * deadlock the navigation that produces the document it is waiting for.\n */\n const dependent = [\n \"read-text\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n \"click\",\n \"fill\",\n \"scroll\",\n \"pointer-move\",\n \"hover\",\n \"wheel\",\n \"press\",\n \"type\",\n \"screenshot\",\n \"observe\",\n \"wait\",\n \"click-and-wait\",\n \"download-action\",\n \"select-files\",\n \"file-chooser\",\n ];\n\n const requireReady = async (\n operation: BrowserOperation,\n ticket: Ticket,\n target?: DriverTarget,\n ) => {\n if (!dependent.includes(operation)) return;\n const state = await getDriver().documentReadiness(ticket, target);\n\n if (state._tag === \"Ready\" || state._tag === \"NotApplicable\") return;\n throw BrowserError.make({\n operation,\n reason:\n state._tag === \"RequiresNavigation\" || state.reason === \"stale\"\n ? Reasons.Stale.make({})\n : state.reason === \"timeout\"\n ? Reasons.Timeout.make({})\n : Reasons.Failed.make({}),\n outcome: \"undispatched\",\n });\n };\n\n /**\n * `dependent` is false for lifecycle observations, which report what is actually on the\n * reattached page. Readiness governs work that depends on initialization, not the reading\n * that tells a caller whether this document was initialized at all.\n */\n const observeInside = (\n ticket: Ticket,\n maximumBytes = Math.min(options.maxReturnedBytes, 16384),\n controls = 32,\n dependent = true,\n scope: \"document\" | \"viewport\" = \"document\",\n ) =>\n Effect.suspend(() => {\n const revision = owner.state.revision;\n\n return native(\"observe\", ticket, async () => {\n await getDriver().pageControl?.checkTarget(undefined, ticket);\n if (dependent) await requireReady(\"observe\", ticket);\n\n return getDriver().observe(scope, maximumBytes, controls, ticket);\n }).pipe(\n Effect.flatMap((raw) =>\n Effect.gen(function* () {\n if (owner.state.revision !== revision)\n return yield* BrowserError.make({\n operation: \"observe\",\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n });\n\n const result = yield* Effect.try({\n try: () => Observation.make({ ...raw, target: capture.target(), revision }),\n catch: (error) =>\n publicError(error, \"observe\", {\n reason: Reasons.Malformed.make({}),\n outcome: \"undispatched\",\n }),\n });\n\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(Observation))(\n result,\n ).pipe(\n Effect.mapError(() =>\n BrowserError.make({\n operation: \"observe\",\n reason: Reasons.Malformed.make({}),\n outcome: \"undispatched\",\n }),\n ),\n );\n\n const bytes = new TextEncoder().encode(encoded).length;\n\n if (bytes > options.maxReturnedBytes) {\n return yield* BrowserError.make({\n operation: \"observe\",\n reason: Reasons.Limit.make({\n dimension: \"returned-bytes\",\n maximum: options.maxReturnedBytes,\n observed: bytes,\n }),\n outcome: \"undispatched\",\n });\n }\n\n return result;\n }),\n ),\n );\n });\n\n /** A requested text bound may narrow the policy's bound, never widen it. */\n const textBudget = (\n operation: BrowserOperation,\n requested: number | undefined,\n ): Effect.Effect<number, BrowserError> => {\n const bytes = requested ?? Math.min(options.maxReturnedBytes, 16384);\n\n return bytes > options.maxReturnedBytes\n ? Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Configuration.make({ path: \"maxTextBytes\" }),\n outcome: \"undispatched\",\n }),\n )\n : Effect.succeed(bytes);\n };\n\n // Reading a target is an ownership operation too. A native mutation that times out\n // after dispatch fences the owner as uncertain; retaining the last native target\n // must not manufacture a fresh usable handle in that state.\n const readSelected = owner.guard(\n \"target\",\n () =>\n Effect.try({\n try: capture.target,\n catch: () =>\n BrowserError.make({\n operation: \"target\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n }),\n { charge: false },\n );\n\n /**\n * While a navigation is in flight on the selected page, nothing else may change that page.\n * Reads, checkpoints, holds and every other page proceed.\n */\n const unreserved = (operation: BrowserOperation, target?: DriverTarget) =>\n Effect.suspend(() => {\n let pageId = target?.pageId;\n\n if (pageId === undefined)\n try {\n pageId = driver?.selected().pageId;\n } catch {\n // No selected target: the operation itself reports that, with its own reason.\n }\n\n return pageId !== undefined && (owner.reserved(pageId) || owner.waitPending(pageId))\n ? Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n )\n : Effect.void;\n });\n\n const waitFree = (operation: BrowserOperation, pageId?: string) =>\n Effect.suspend(() =>\n owner.waitPending(pageId)\n ? Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n )\n : Effect.void,\n );\n\n const nativeOperation = <A>(\n operation: BrowserOperation,\n action: (driver: Driver, ticket: Ticket) => Promise<A>,\n options: {\n readonly mutation?: boolean;\n readonly charge?: boolean | \"host-read\";\n /** Opening or closing a tab is independent of the selected page's document. */\n readonly anyPage?: boolean;\n readonly mutationScope?: () => ObservationScope;\n readonly preflight?: Effect.Effect<void, BrowserError>;\n } = {},\n ) =>\n owner.guard(\n operation,\n (ticket) =>\n native(operation, ticket, async () => {\n // A held page is refused, never woken: none of these may run against one.\n if (\n [\n \"resize\",\n \"wait\",\n \"click-and-wait\",\n \"download-action\",\n \"select-files\",\n \"select-option\",\n \"file-chooser\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n ].includes(operation)\n )\n await getDriver().pageControl?.checkTarget(undefined, ticket);\n await requireReady(operation, ticket);\n\n return action(getDriver(), ticket);\n }),\n {\n ...options,\n mutationScope: options.mutationScope ?? (() => ({ pageId: getDriver().selected().pageId })),\n preflight: (options.mutation === true && options.anyPage !== true\n ? unreserved(operation)\n : Effect.void\n ).pipe(Effect.andThen(options.preflight ?? Effect.void)),\n },\n );\n\n const wait = (\n start: (driver: Driver, ticket: WaitTicket, target: DriverTarget) => Promise<void>,\n timeoutMillis?: number,\n ): Effect.Effect<void, BrowserError> =>\n Effect.suspend(() => {\n let owned: OwnedWait | undefined;\n\n return owner\n .guard(\n \"wait\",\n (ticket) =>\n native(\"wait\", ticket, async () => {\n const driver = getDriver();\n const connection = activeConnection;\n\n if (connection === undefined)\n throw BrowserError.make({\n operation: \"wait\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n const target = driver.selected();\n const admitted = owner.beginWait(ticket, target, connection);\n\n owned = admitted;\n let started = false;\n\n try {\n await driver.pageControl?.checkTarget(target, ticket);\n ticket.check();\n await requireReady(\"wait\", ticket, target);\n ticket.check();\n admitted.start(() => start(driver, admitted.ticket, target));\n started = true;\n\n return admitted;\n } finally {\n // Canceled readiness may still be native work: retire only when its raw task exits.\n if (!started) admitted.ticket.retire();\n }\n }),\n {\n ...(timeoutMillis === undefined ? {} : { timeoutMillis }),\n preflight: Effect.suspend(() =>\n owner.waitAvailable()\n ? unreserved(\"wait\")\n : Effect.fail(\n BrowserError.make({\n operation: \"wait\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n ),\n ),\n },\n )\n .pipe(\n Effect.flatMap((operation) => operation.completed),\n Effect.ensuring(Effect.sync(() => owned?.cancel())),\n );\n });\n\n /**\n * Direct operations resolve selection under admission. Retained operations capture selection\n * and generation; pinned operations capture generation and their explicit page/frame only.\n */\n const makeOperations = (retained?: {\n readonly generation: number;\n readonly selection?: number;\n readonly target?: DriverTarget;\n }) => {\n const browserTarget = retained?.target;\n\n const check = () => {\n if (\n retained !== undefined &&\n (owner.state.generation !== retained.generation ||\n (retained.selection !== undefined && owner.state.selection !== retained.selection))\n ) {\n return Effect.fail(\n BrowserError.make({\n operation: \"handle\",\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n }),\n );\n }\n\n return Effect.void;\n };\n\n const run = <A>(\n operation: BrowserOperation,\n action: (driver: Driver, ticket: Ticket) => Promise<A>,\n mutation = false,\n ) =>\n owner.guard(\n operation,\n (ticket) =>\n native(operation, ticket, async () => {\n await getDriver().pageControl?.checkTarget(browserTarget, ticket);\n await requireReady(operation, ticket, browserTarget);\n\n return action(getDriver(), ticket);\n }),\n {\n mutation,\n mutationScope: () => ({ pageId: browserTarget?.pageId ?? getDriver().selected().pageId }),\n preflight: mutation\n ? Effect.suspend(check).pipe(Effect.andThen(unreserved(operation, browserTarget)))\n : Effect.suspend(check),\n },\n );\n\n const operationTarget = () =>\n retained?.target === undefined\n ? capture.target()\n : Target.make({\n generation: retained.generation,\n pageId: retained.target.pageId,\n frameId: retained.target.frameId,\n });\n\n /**\n * Native input, stamped on the host monotonic clock that stamps captured frames, around\n * the native command alone: admission and readiness are over before the clock is read.\n */\n const input = (\n operation: BrowserOperation,\n action: (driver: Driver, ticket: Ticket) => Promise<NativeInput>,\n ) =>\n run(\n operation,\n async (driver, ticket) => {\n // What the input is sent to, read first: input may replace the document it reaches.\n const target = operationTarget();\n const startedMonotonicNanos = clock.monotonicTimeNanosUnsafe();\n const dispatched = await action(driver, ticket);\n\n return {\n ...dispatched,\n target,\n startedMonotonicNanos,\n completedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n };\n },\n true,\n );\n\n /**\n * Dispatches under a short permit and leaves the browser loading outside it. The reservation\n * is taken under that same permit, so no other mutation can reach the page in between, and\n * it is released only on a known outcome: an unsettled operation whose scope closes, or a\n * navigation that fails after dispatch, fences the owner exactly as an interrupted mutation\n * always has. Interrupting a waiter on `completed` stops nothing; `stop` is the one way to.\n */\n const startNavigation = Effect.fnUntraced(function* (\n url: string,\n timeoutMillis = limits.actionTimeoutMillis,\n ) {\n let active = true;\n let dismissals = 0;\n let beforeUnload = false;\n let dismissalUnknown = false;\n let rejected: BrowserError | undefined;\n let reconsider = () => {};\n\n const control: NavigationControl = {\n identity: {},\n beforeUnload: () => {\n if (!active) return { dismissed: () => {} };\n beforeUnload = true;\n dismissals++;\n let settled = false;\n\n return {\n dismissed: (confirmed) => {\n if (settled || !active) return;\n settled = true;\n dismissals--;\n if (!confirmed) dismissalUnknown = true;\n reconsider();\n },\n };\n },\n };\n\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n active = false;\n }),\n );\n\n const begun = yield* run(\n \"navigate\",\n async (driver, ticket) => {\n const target = operationTarget();\n\n const loadingStarted = Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000;\n const remainingLifetime = owner.lifetimeDeadline - loadingStarted;\n\n if (remainingLifetime <= 0)\n throw BrowserError.make({\n operation: \"navigate\",\n reason: Reasons.Expired.make({}),\n outcome: \"undispatched\",\n });\n\n const loadingTimeout = Math.min(timeoutMillis, remainingLifetime);\n\n const navigation = await driver.beginNavigation(\n url,\n loadingTimeout,\n ticket,\n browserTarget,\n control,\n );\n\n return {\n target,\n navigation,\n reservation: owner.reserve(navigation.pageId),\n recoveryDeadline: Math.min(\n loadingStarted + loadingTimeout + 3000,\n owner.lifetimeDeadline,\n ),\n };\n },\n true,\n );\n\n const { navigation, reservation } = begun;\n const outcome = yield* Deferred.make<string, BrowserError>();\n const timeoutRecovery = yield* Deferred.make<boolean>();\n let stopDispatched = false;\n let timedOut = false;\n let deciding = false;\n\n const failed = (reason: BrowserError[\"reason\"]) =>\n Effect.fail(BrowserError.make({ operation: \"navigate\", reason, outcome: \"unknown\" }));\n\n /**\n * A navigation has exactly one outcome, and whoever decides it first settles the\n * reservation. It is released before anyone waiting is told, so the operation a waiter\n * runs next is admitted rather than finding its own page still reserved.\n */\n const decide = (result: Effect.Effect<string, BrowserError>, known: boolean) => {\n if (deciding || Deferred.isDoneUnsafe(outcome)) return;\n deciding = true;\n active = false;\n reservation.settle(known ? \"known\" : \"unknown\");\n Deferred.doneUnsafe(outcome, result);\n Deferred.doneUnsafe(timeoutRecovery, Effect.succeed(false));\n deciding = false;\n };\n\n reconsider = () => {\n if (!active || rejected === undefined || dismissals !== 0 || stopDispatched) return;\n if (beforeUnload) {\n // Both facts are required: this goto rejected and its exact dialog was dismissed.\n decide(\n dismissalUnknown ? Effect.fail(rejected) : failed(Reasons.Interrupted.make({})),\n !dismissalUnknown,\n );\n } else if (navigation.mainFrame === true && rejected.reason._tag === \"Timeout\") {\n timedOut = true;\n Deferred.doneUnsafe(timeoutRecovery, Effect.succeed(true));\n } else {\n decide(Effect.fail(rejected), false);\n }\n };\n\n navigation.settled.then(\n (url) => {\n if (!stopDispatched) decide(Effect.succeed(url), true);\n },\n (error: unknown) => {\n if (stopDispatched || Deferred.isDoneUnsafe(outcome)) return;\n\n rejected = publicError(error, \"navigate\", {\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n });\n reconsider();\n },\n );\n\n // A fence already cleared the reservation; this only releases anyone still waiting.\n const aborted = () =>\n decide(failed(timedOut ? Reasons.Timeout.make({}) : Reasons.Stale.make({})), true);\n\n reservation.signal.addEventListener(\"abort\", aborted, {\n once: true,\n });\n // Left unsettled, nothing knows what the browser did with it.\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n decide(failed(timedOut ? Reasons.Timeout.make({}) : Reasons.Stale.make({})), false);\n reservation.signal.removeEventListener(\"abort\", aborted);\n }),\n );\n\n const stop = yield* makeNavigationStopCoordinator(\n () => Deferred.isDoneUnsafe(outcome),\n (onDispatch, retainSetup, deadline) =>\n owner.guard(\n \"navigate-stop\",\n (ticket) =>\n Effect.suspend(() =>\n deadline !== undefined && stopSetupPending !== undefined\n ? Deferred.await(stopSetupPending)\n : Effect.void,\n ).pipe(\n Effect.andThen(\n native(\"navigate-stop\", ticket, () =>\n navigation.stop(\n ticket,\n () => !Deferred.isDoneUnsafe(outcome),\n () => {\n onDispatch();\n stopDispatched = true;\n },\n () => {\n if (stopSetupPending !== undefined)\n throw BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n });\n const setup = Deferred.makeUnsafe<void>();\n\n stopSetupPending = setup;\n const retired = retainSetup();\n\n return () => {\n if (stopSetupPending === setup) stopSetupPending = undefined;\n Deferred.doneUnsafe(setup, Effect.void);\n retired();\n };\n },\n ),\n ),\n ),\n Effect.timeoutOrElse({\n duration: Math.min(3000, ticket.remainingMillis()),\n orElse: () =>\n Effect.fail(\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Timeout.make({}),\n outcome: ticket.dispatched ? \"unknown\" : \"undispatched\",\n }),\n ),\n }),\n ),\n {\n mutation: true,\n mutationScope: () => ({ pageId: navigation.pageId }),\n charge: false,\n ...(deadline === undefined ? {} : { waitUntil: deadline }),\n },\n ),\n () =>\n decide(failed(timedOut ? Reasons.Timeout.make({}) : Reasons.Interrupted.make({})), true),\n );\n\n // One operation-scoped supervisor, signalled only by the exact native timeout classifier.\n // Its absolute deadline bounds joined public stops, permit wait and late setup retirement too.\n yield* Deferred.await(timeoutRecovery).pipe(\n Effect.flatMap((recover) =>\n recover\n ? stop.recover(begun.recoveryDeadline).pipe(\n Effect.onExit((exit) =>\n Effect.sync(() => {\n if (Exit.isFailure(exit)) decide(failed(Reasons.Timeout.make({})), false);\n }),\n ),\n )\n : Effect.void,\n ),\n Effect.ignoreCause,\n Effect.forkScoped,\n );\n\n return {\n target: begun.target,\n completed: Deferred.await(outcome),\n /**\n * The browser's acknowledgement is the known outcome. Playwright's own promise is not\n * waited for: an aborted parse fires no DOMContentLoaded, so it only ever times out.\n */\n stop: stop.stop,\n };\n });\n\n return {\n startNavigation,\n // The same machinery, scoped to the call: leaving it unsettled fences, as it always has.\n navigate: (url: string, timeoutMillis?: number) =>\n Effect.scoped(\n startNavigation(url, timeoutMillis).pipe(\n Effect.flatMap((operation) => operation.completed),\n ),\n ),\n readText: (selector?: string) =>\n run(\"read-text\", (driver, ticket) =>\n driver.readText(selector, options.maxReturnedBytes, ticket, browserTarget),\n ),\n click: (target: string | ObservedElement, policy?: AdmissionPolicy) =>\n run(\"click\", (driver, ticket) => driver.click(target, ticket, policy, browserTarget), true),\n fill: (target: string | ObservedElement, value: string, policy?: AdmissionPolicy) =>\n run(\n \"fill\",\n (driver, ticket) => driver.fill(target, value, ticket, policy, browserTarget),\n true,\n ),\n scroll: (x: number, y: number) =>\n run(\"scroll\", (driver, ticket) => driver.scroll(x, y, ticket, browserTarget), true),\n pointerMove: (to: NativePoint) =>\n input(\"pointer-move\", (driver, ticket) => driver.pointerMove(to, ticket, browserTarget)),\n hover: (target: string | ObservedElement, policy?: AdmissionPolicy) =>\n input(\"hover\", (driver, ticket) => driver.hover(target, ticket, policy, browserTarget)),\n wheel: (deltaX: number, deltaY: number, at?: NativePoint) =>\n input(\"wheel\", (driver, ticket) => driver.wheel(deltaX, deltaY, at, ticket, browserTarget)),\n press: (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n into?: string | ObservedElement,\n policy?: AdmissionPolicy,\n ) =>\n input(\"press\", (driver, ticket) =>\n driver.press(key, modifiers, into, ticket, policy, browserTarget),\n ),\n type: (text: string, into?: string | ObservedElement, policy?: AdmissionPolicy) =>\n input(\"type\", (driver, ticket) => driver.type(text, into, ticket, policy, browserTarget)),\n screenshot: (full: boolean) =>\n run(\"screenshot\", (driver, ticket) =>\n driver.screenshot(full, options.maxReturnedBytes, ticket, browserTarget),\n ),\n };\n };\n\n /** The runtime supplies its remaining budget; endpoint sources apply their own wait limits. */\n const remainingMillis = () =>\n Math.max(\n 1,\n Math.ceil(owner.lifetimeDeadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n );\n\n const connectionUrl = (operation: BrowserOperation) =>\n Effect.suspend(() => acquired.connection(remainingMillis())).pipe(\n Effect.mapError((error) =>\n BrowserError.make({ operation, reason: error.reason, outcome: error.outcome }),\n ),\n );\n\n const connected = yield* Effect.cached(\n owner\n .guard(\n \"connect\",\n (ticket) =>\n connectionUrl(\"connect\").pipe(\n Effect.flatMap((url) => connectNative(url, options.driver)),\n Effect.andThen(\n native(\"connect\", ticket, async () => {\n getDriver().selected();\n }),\n ),\n Effect.tap(() =>\n Effect.sync(() => {\n owner.transition(\"open\");\n }),\n ),\n ),\n { phases: [\"acquiring\"], charge: false, verifyAfter: false },\n )\n .pipe(\n Effect.onError(() => closeScope),\n Effect.onInterrupt(() => closeScope),\n ),\n );\n\n const execution = () => {\n const port = getDriver().pageControl;\n\n if (port === undefined)\n throw BrowserError.make({\n operation: \"page-control\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n\n return port;\n };\n\n const pinned = (resolve: (driver: Driver, ticket: Ticket) => Promise<DriverTarget>) =>\n owner.guard(\n \"target\",\n (ticket) =>\n native(\"target\", ticket, async () => {\n const value = await resolve(getDriver(), ticket);\n\n ticket.check();\n\n return {\n target: Target.make({ generation: ticket.generation, ...value }),\n operations: makeOperations({ generation: ticket.generation, target: value }),\n };\n }),\n { charge: false },\n );\n\n const retain = owner.guard(\n \"target\",\n () =>\n Effect.try({\n try: () => {\n const target = capture.target();\n\n return makeOperations({\n generation: target.generation,\n selection: owner.state.selection,\n });\n },\n catch: (error) =>\n publicError(error, \"target\", {\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n }),\n { charge: false },\n );\n\n const controls = {\n implementation: options.implementation,\n status: owner.status,\n diagnostics: owner.diagnostics,\n pageControl: {\n state: (page: PageInfo) =>\n nativeOperation(\"page-state\", (_driver, ticket) => execution().state(page, ticket), {\n charge: false,\n }),\n suspend: (page: PageInfo) =>\n nativeOperation(\"page-suspend\", (_driver, ticket) => execution().suspend(page, ticket), {\n charge: false,\n preflight: waitFree(\"page-suspend\", page.pageId),\n }),\n resume: (receipt: PageSuspension) =>\n nativeOperation(\"page-resume\", (_driver, ticket) => execution().resume(receipt, ticket), {\n charge: false,\n preflight: waitFree(\"page-resume\", receipt.pageId),\n }),\n },\n reference: ref,\n capture,\n operations: makeOperations(),\n retain,\n target: readSelected,\n cleanupResult,\n close: release.pipe(Effect.tap(() => retireControl)),\n closeChecked: acquired.closeChecked.pipe(Effect.onExit(() => retireControl)),\n observe: (reading: Reading = { scope: \"document\" }) =>\n textBudget(\"observe\", reading.maxTextBytes).pipe(\n Effect.flatMap((bytes) =>\n owner.guard(\n \"observe\",\n (ticket) =>\n observeInside(ticket, bytes, reading.maxControls ?? 32, true, reading.scope),\n { preflight: waitFree(\"observe\") },\n ),\n ),\n ),\n /**\n * Passive: not a mutation, so the action observation and the selection are left exactly as\n * they were. A held page is refused rather than woken to be read.\n */\n checkpoint: (reading: Omit<Reading, \"scope\"> & { readonly picture: boolean }) =>\n textBudget(\"checkpoint\", reading.maxTextBytes).pipe(\n Effect.flatMap((bytes) =>\n nativeOperation(\n \"checkpoint\",\n async (driver, ticket) => {\n const target = capture.target();\n const revision = owner.state.revision;\n const startedMonotonicNanos = clock.monotonicTimeNanosUnsafe();\n\n const sampled = await driver.checkpoint(\n bytes,\n reading.maxControls ?? 32,\n reading.picture ? options.maxReturnedBytes : undefined,\n ticket,\n );\n\n return {\n ...sampled,\n target,\n revision,\n startedMonotonicNanos,\n completedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n };\n },\n { charge: \"host-read\" },\n ),\n ),\n ),\n controlFacts: (reference: ObservedElement) =>\n nativeOperation(\"control-facts\", (driver, ticket) => driver.controlFacts(reference, ticket), {\n charge: \"host-read\",\n }),\n selectOption: (reference: ObservedElement, options: SelectOptions, policy?: AdmissionPolicy) =>\n nativeOperation(\n \"select-option\",\n (driver, ticket) => driver.selectOption(reference, options, ticket, policy),\n { mutation: true },\n ),\n /** Not charged: it sends no input and reads one node the caller was already given. */\n revalidate: (reference: ObservedElement) =>\n nativeOperation(\"revalidate\", (driver, ticket) => driver.revalidate(reference, ticket), {\n charge: false,\n }),\n // Inspecting readiness is not an action: it charges nothing and mutates nothing.\n readiness: owner.guard(\n \"ready\",\n (ticket) => native(\"ready\", ticket, () => getDriver().documentReadiness(ticket)),\n { charge: false },\n ),\n pages: nativeOperation(\"list-pages\", (driver, ticket) => driver.listPages(ticket), {\n charge: false,\n }),\n frames: nativeOperation(\"list-frames\", (driver, ticket) => driver.listFrames(ticket), {\n charge: false,\n }),\n framesOf: (page: PageInfo) =>\n nativeOperation(\"list-frames\", (driver, ticket) => driver.listFrames(ticket, page), {\n charge: false,\n }),\n pinPage: (page: PageInfo) => pinned((driver, ticket) => driver.resolvePage(page, ticket)),\n pinFrame: (page: PageInfo, frame: FrameInfo) =>\n pinned((driver, ticket) => driver.resolveFrame(page, frame, ticket)),\n selectPage: (page: PageInfo) =>\n nativeOperation(\n \"select-page\",\n async (driver, ticket) => {\n await driver.selectPage(page, ticket);\n owner.state.selection++;\n },\n { charge: false },\n ),\n selectFrame: (id: string) =>\n nativeOperation(\n \"select-frame\",\n async (driver, ticket) => {\n await driver.selectFrame(id, ticket);\n owner.state.selection++;\n },\n { charge: false },\n ),\n createPage: () =>\n nativeOperation(\"new-page\", (driver, ticket) => driver.newPage(ticket), {\n mutation: true,\n mutationScope: () => \"none\",\n charge: false,\n anyPage: true,\n }),\n closePage: (page: PageInfo) =>\n nativeOperation(\"close-page\", (driver, ticket) => driver.closePage(page, ticket), {\n mutation: true,\n mutationScope: () => ({ pageId: page.pageId }),\n charge: false,\n anyPage: true,\n }),\n resize: (viewport: Viewport) =>\n nativeOperation(\"resize\", (driver, ticket) => driver.resize(viewport, ticket), {\n mutation: true,\n charge: false,\n }),\n waitFor: (selector: string, state: \"visible\" | \"hidden\" | \"attached\" | \"detached\") =>\n wait((driver, ticket, target) => driver.waitFor(selector, state, ticket, target)),\n waitForElement: (request: WaitForElementRequest) =>\n wait(\n (driver, ticket, target) =>\n driver.waitForElement(request.reference, request.state, ticket, target),\n request.timeoutMillis,\n ),\n clickAndWait: (target: string | ObservedElement) =>\n nativeOperation(\"click-and-wait\", (driver, ticket) => driver.clickAndWait(target, ticket), {\n mutation: true,\n }),\n clickForDownload: (target: string | ObservedElement) =>\n nativeOperation(\n \"download-action\",\n (driver, ticket) => driver.clickForDownload(target, ticket),\n { mutation: true },\n ),\n selectFiles: (target: string | ObservedElement, files: ReadonlyArray<NativeFileSelection>) =>\n nativeOperation(\n \"select-files\",\n (driver, ticket) => driver.selectFiles(target, files, ticket),\n { mutation: true },\n ),\n clickForFileSelection: (\n target: string | ObservedElement,\n files: ReadonlyArray<NativeFileSelection>,\n ) =>\n nativeOperation(\n \"file-chooser\",\n (driver, ticket) => driver.clickForFileSelection(target, files, ticket),\n { mutation: true },\n ),\n liveView: <A>(issue: Effect.Effect<A, BrowserError>) =>\n owner.guard(\"live-view\", () => issue, { charge: false, phases: [\"open\", \"paused\"] }),\n beginHandoff: <A>(issue: Effect.Effect<A, BrowserError>) =>\n owner.guard(\n \"handoff\",\n () =>\n Effect.gen(function* () {\n if (options.driver.pageControl)\n return yield* BrowserError.make({\n operation: \"handoff\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n if (owner.state.phase === \"open\") owner.fence(\"paused\", \"paused\", \"handoff\");\n handoffToken ??= globalThis.crypto.randomUUID();\n // A refused authorization leaves automation paused until explicit operator release.\n const view = yield* issue;\n\n return { token: Redacted.make(handoffToken), view };\n }),\n { charge: false, phases: [\"open\", \"paused\"], verifyAfter: false },\n ),\n resume: (token: Redacted.Redacted<string>, operatorReleasedControl: boolean) =>\n owner.guard(\n \"resume\",\n (ticket) =>\n Effect.gen(function* () {\n if (\n !operatorReleasedControl ||\n handoffToken === undefined ||\n Redacted.value(token) !== handoffToken\n ) {\n return yield* BrowserError.make({\n operation: \"resume\",\n reason: Reasons.Authorization.make({}),\n outcome: \"undispatched\",\n });\n }\n yield* native(\"resume\", ticket, () => getDriver().dismissDialogs(ticket));\n const observation = yield* observeInside(ticket, undefined, undefined, false);\n\n // This synchronous commit remains under the same permit as the fresh observation.\n owner.transition(\"open\");\n handoffToken = undefined;\n\n return observation;\n }),\n { charge: false, phases: [\"paused\"], verifyAfter: false },\n ),\n detach: owner\n .guard(\n \"detach\",\n (ticket) =>\n Effect.gen(function* () {\n if (!options.keepAlive)\n return yield* BrowserError.make({\n operation: \"detach\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n reconnectTarget = yield* native(\"detach\", ticket, () => getDriver().selectedTargetId());\n const attached = getDriver();\n\n activeConnection = undefined;\n owner.fence(\"detached\", \"disconnected\", \"detached\");\n const initialization = yield* Effect.exit(disposeBindings);\n\n const disconnected = yield* Effect.tryPromise({\n try: () => attached.disconnect(),\n catch: () =>\n BrowserError.make({\n operation: \"detach\",\n reason: Reasons.Disconnected.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.exit);\n\n driver = undefined;\n if (Exit.isFailure(initialization))\n return yield* Effect.failCause(initialization.cause);\n if (Exit.isFailure(disconnected)) return yield* Effect.failCause(disconnected.cause);\n\n return { reference: ref, targetId: reconnectTarget };\n }),\n { charge: false, verifyAfter: false },\n )\n .pipe(Effect.onError(() => Effect.sync(() => owner.fence(\"uncertain\", \"uncertain\")))),\n reconnect: (operatorReleasedControl: boolean) =>\n owner\n .guard(\n \"reconnect\",\n (ticket) =>\n Effect.gen(function* () {\n if (\n !options.keepAlive ||\n reconnectTarget === undefined ||\n !operatorReleasedControl ||\n acquired.verifyReconnect === undefined\n ) {\n return yield* BrowserError.make({\n operation: \"reconnect\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n }\n\n yield* acquired.verifyReconnect;\n owner.transition(\"acquiring\");\n const endpoint = yield* connectionUrl(\"reconnect\");\n\n yield* connectNative(endpoint, {\n ...options.driver,\n initialTargetId: reconnectTarget,\n newPage: false,\n preserveViewport: true,\n });\n const observation = yield* observeInside(ticket, undefined, undefined, false);\n\n owner.transition(\"open\");\n\n return observation;\n }),\n { charge: false, phases: [\"detached\", \"acquiring\"], verifyAfter: false },\n )\n .pipe(\n Effect.onError(() => closeScope),\n Effect.onInterrupt(() => closeScope),\n ),\n };\n\n // One timer belongs to the enclosing execution, never to an individual Tool call.\n const remaining = Math.max(\n 0,\n owner.lifetimeDeadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000,\n );\n\n // The execution lifetime distinguishes expiry from natural completion before\n // running the shared close path; this race has the required proven semantics.\n // @effect-diagnostics-next-line raceFirstWithSleepToTimeout:off\n yield* Effect.raceFirst(\n Effect.sleep(remaining).pipe(Effect.as(true)),\n Deferred.await(ended).pipe(Effect.as(false)),\n ).pipe(\n Effect.flatMap((expired) =>\n expired ? Effect.sync(owner.expire).pipe(Effect.andThen(closeScope)) : Effect.void,\n ),\n Effect.forkIn(parentScope),\n );\n\n return {\n reference: ref,\n /** The caller keeps its own lease type, including whether an allocation attempt exists. */\n lease: acquired,\n close: controls.close,\n connect: Effect.suspend(() =>\n owner.state.phase === \"closed\" || owner.state.phase === \"closing\"\n ? Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n )\n : connected.pipe(Effect.as(controls)),\n ),\n };\n});\n\nexport type SessionControls<L extends SessionLease = SessionLease> =\n Effect.Success<ReturnType<typeof acquireSession<L, never, never>>> extends {\n connect: Effect.Effect<infer A, infer _E, infer _R>;\n }\n ? A\n : never;\n\nexport type TargetControls = SessionControls[\"operations\"];\n","import { Effect, type Option, Redacted, Schema, Scope } from \"effect\";\n\nimport * as Bootstrap from \"./Bootstrap.ts\";\nimport type { BrowserSession, OpenOptions } from \"./Browser.ts\";\nimport {\n ActionResult,\n AutomationOptions,\n BrowserPolicy,\n ClickRequest,\n Identifier,\n InlineFiles,\n type InlineFile,\n type Observation,\n SafeFilename,\n Selector,\n Viewport,\n} from \"./BrowserData.ts\";\nimport {\n BrowserError,\n Reasons,\n type BrowserOperation,\n type InitializationError,\n} from \"./Errors.ts\";\nimport {\n bindingImplementation,\n fromNativeAttempt,\n issueBinding,\n} from \"./internal/browser/Binding.ts\";\nimport { makeBindings, preparePlan } from \"./internal/browser/Bindings.ts\";\nimport { compileBootstrap } from \"./internal/browser/Bootstrap.ts\";\nimport type { ConnectionCleanup } from \"./internal/browser/ConnectionCleanup.ts\";\nimport type { DriverOptions, NativeFileSelection } from \"./internal/browser/Driver.ts\";\nimport { connectPlaywrightEndpoint } from \"./internal/browser/Playwright.ts\";\nimport { checked, decoded, makeSession } from \"./internal/browser/PublicSession.ts\";\nimport { acquireSession } from \"./internal/browser/Session.ts\";\n\nexport {\n cleanupStep,\n noConnection,\n reported,\n type CleanupStep,\n type ConnectionCleanup,\n type ConnectionState,\n} from \"./internal/browser/ConnectionCleanup.ts\";\n\n/** Opaque engine configuration. Only this constructor's issued values can acquire a runtime. */\nexport interface BrowserBinding {\n readonly _tag: \"BrowserBinding\";\n}\n\nexport interface PlaywrightOptions {\n /** A trusted integration validates its own endpoint authority before routing the connection. */\n readonly resolveEndpoint?: (connection: {\n readonly url: Redacted.Redacted<string>;\n }) => Effect.Effect<string, BrowserError>;\n /** Trusted instrumentation of the existing native connection, before the owner starts using it. */\n readonly onConnected?: (connection: {\n readonly native: unknown;\n readonly endpoint: string;\n }) => void;\n}\n\n/** A maintained Playwright connection, loaded lazily. No driver or protocol capability is returned. */\nexport const playwright = (options: PlaywrightOptions = {}): BrowserBinding => {\n const { resolveEndpoint, onConnected } = options;\n\n return issueBinding(\n { _tag: \"BrowserBinding\" as const },\n {\n connect: (request) =>\n Effect.gen(function* () {\n const address = yield* decoded(\n Schema.NonEmptyString.check(Schema.isMaxLength(16384)),\n \"connect\",\n \"undispatched\",\n )(request.connection);\n\n const endpoint =\n resolveEndpoint === undefined\n ? address\n : yield* resolveEndpoint({ url: Redacted.make(address) });\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/**\n * An integration owns endpoint authority and the meaning of release. Its source must register\n * release in the supplied Scope before returning; the runtime owns only the connection below it.\n */\nexport interface Lifetime {\n readonly reference: unknown;\n readonly connection: (\n remainingMillis: number,\n ) => Effect.Effect<Redacted.Redacted<string>, BrowserError>;\n readonly release: Effect.Effect<unknown>;\n readonly cleanupResult: Effect.Effect<Option.Option<unknown>>;\n readonly closeChecked: Effect.Effect<void, BrowserError>;\n /**\n * Memory-only evidence that canonical owned cleanup terminated native browser control.\n * Omission is unknown. Borrowed disconnection alone never establishes this fact.\n */\n readonly controlRetired?: Effect.Effect<boolean>;\n readonly verifyReconnect?: Effect.Effect<void, BrowserError>;\n}\n\nexport type Source<L extends Lifetime, E, R = never> = (\n cleanup: ConnectionCleanup,\n lifetimeDeadline: number,\n) => Effect.Effect<L, E, R | Scope.Scope>;\n\nexport interface RuntimeOptions {\n readonly implementation: string;\n readonly binding?: BrowserBinding;\n readonly automation?: AutomationOptions;\n readonly viewport?: Viewport;\n readonly preserveViewport?: boolean;\n readonly keepAlive?: boolean;\n}\n\nexport interface AcquireOptions<E = never, R = never> extends OpenOptions<E, R> {\n /** Attach to an existing page without creating a tab or changing its viewport. */\n readonly existingTarget?: { readonly targetId?: string };\n}\n\n/**\n * Resolved host input for an integration constructing its own runtime. Stored paths must already\n * have been authorized by that integration; a session cannot recover these operations afterwards.\n */\nexport type ResolvedFileSelection =\n | { readonly _tag: \"Inline\"; readonly files: ReadonlyArray<InlineFile> }\n | { readonly _tag: \"Stored\"; readonly paths: ReadonlyArray<string> };\n\nexport interface FileRequest {\n readonly selector: string;\n readonly selection: ResolvedFileSelection;\n}\n\nexport class DownloadEvent extends Schema.Class<DownloadEvent>(\"BrowserDownloadEvent\")({\n downloadId: Identifier,\n filename: SafeFilename,\n state: Schema.Literals([\"completed\", \"failed\"]),\n}) {}\n\n/**\n * Modeled host operations for the integration creating this connection. Native authority stays\n * inside the owner; the integration adds only the capabilities its public session supports.\n */\nexport interface Integration<Reference> {\n readonly clickForDownload: (request: ClickRequest) => Effect.Effect<DownloadEvent, BrowserError>;\n readonly selectFiles: (request: FileRequest) => Effect.Effect<ActionResult, BrowserError>;\n readonly clickForFileSelection: (\n request: FileRequest,\n ) => Effect.Effect<ActionResult, BrowserError>;\n readonly liveView: <A>(issue: Effect.Effect<A, BrowserError>) => Effect.Effect<A, BrowserError>;\n readonly beginHandoff: <A>(\n issue: Effect.Effect<A, BrowserError>,\n ) => Effect.Effect<{ readonly token: Redacted.Redacted<string>; readonly view: A }, BrowserError>;\n readonly resume: (\n token: Redacted.Redacted<string>,\n operatorReleasedControl: boolean,\n ) => Effect.Effect<Observation, BrowserError>;\n readonly detach: Effect.Effect<\n { readonly reference: Reference; readonly targetId: string },\n BrowserError\n >;\n readonly reconnect: (\n operatorReleasedControl: boolean,\n ) => Effect.Effect<Observation, BrowserError | InitializationError>;\n}\n\nexport interface Connection<Reference, E = never> {\n /** Preserve this object's identity when adding an integration's public capabilities. */\n readonly session: BrowserSession<E>;\n readonly operations: Integration<Reference>;\n}\n\nexport interface Acquisition<L extends Lifetime, E = never> {\n readonly reference: L[\"reference\"];\n readonly lifetime: L;\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly close: L[\"release\"];\n readonly connect: Effect.Effect<\n Connection<L[\"reference\"], E>,\n BrowserError | InitializationError | E\n >;\n}\n\nexport interface Runtime {\n readonly acquire: <L extends Lifetime, AE, AR, E = never, R = never>(\n policy: BrowserPolicy,\n source: Source<L, AE, AR>,\n request?: AcquireOptions<E, R>,\n ) => Effect.Effect<\n Acquisition<L, E>,\n AE | BrowserError,\n Scope.Scope | AR | Exclude<R, Scope.Scope>\n >;\n}\n\nconst StoredPath = Schema.NonEmptyString.check(\n Schema.isMaxLength(4096),\n Schema.makeFilter(\n (value) =>\n value.startsWith(\"/\") &&\n !value.includes(\"\\\\\") &&\n !value.includes(\"//\") &&\n ![...value].some((character) => character < \" \" || character === \"\\x7f\") &&\n value.split(\"/\").every((segment) => segment !== \".\" && segment !== \"..\"),\n ),\n);\n\nconst Selection = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Inline\"), files: InlineFiles }),\n Schema.Struct({\n _tag: Schema.Literal(\"Stored\"),\n paths: Schema.Array(StoredPath).check(Schema.isMinLength(1), Schema.isMaxLength(8)),\n }),\n]);\n\nconst resolveFiles = (\n selection: ResolvedFileSelection,\n operation: BrowserOperation,\n): Effect.Effect<ReadonlyArray<NativeFileSelection>, BrowserError> =>\n checked(Selection, selection, operation).pipe(\n Effect.map((value) =>\n value._tag === \"Inline\"\n ? value.files.map((file) => ({\n _tag: \"Inline\" as const,\n name: file.name,\n mediaType: file.mediaType,\n bytes: new Uint8Array(file.bytes),\n }))\n : value.paths.map((path) => ({ _tag: \"Remote\" as const, path })),\n ),\n );\n\n/** Validate immutable connection configuration without loading a peer or acquiring a lifetime. */\nexport const make = Effect.fnUntraced(function* (\n options: RuntimeOptions,\n): Effect.fn.Return<Runtime, BrowserError> {\n const implementation = yield* checked(\n Schema.NonEmptyString.check(Schema.isMaxLength(128)),\n options.implementation,\n \"configure\",\n );\n\n const automation = yield* checked(AutomationOptions, options.automation ?? {}, \"configure\");\n\n const viewport = yield* checked(\n Viewport,\n options.viewport ?? { width: 1280, height: 720 },\n \"configure\",\n );\n\n const preserveViewport = yield* checked(\n Schema.Boolean,\n options.preserveViewport ?? false,\n \"configure\",\n );\n\n const keepAlive = yield* checked(Schema.Boolean, options.keepAlive ?? false, \"configure\");\n const engine = bindingImplementation(options.binding ?? defaultBinding);\n\n if (engine === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.UnregisteredSession.make({}),\n outcome: \"undispatched\",\n });\n\n const pageControl = automation.pageControl ?? false;\n const popupPolicy = automation.popupPolicy ?? \"retain\";\n const dialogPolicy = automation.dialogPolicy ?? \"dismiss\";\n\n if (pageControl && (keepAlive || popupPolicy === \"pause\" || dialogPolicy === \"pause\"))\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n\n const driver: DriverOptions = {\n viewport,\n pageControl,\n maxPages: automation.maxPages ?? 10,\n popupPolicy,\n dialogPolicy,\n preserveViewport,\n ...(automation.initialPage === undefined\n ? {}\n : \"targetId\" in automation.initialPage\n ? { initialTargetId: automation.initialPage.targetId }\n : { newPage: true }),\n };\n\n const acquire = Effect.fnUntraced(function* <L extends Lifetime, AE, AR, E = never, R = never>(\n policy: BrowserPolicy,\n source: Source<L, AE, AR>,\n request: AcquireOptions<E, R> = {},\n ) {\n const fixed = yield* checked(BrowserPolicy, policy, \"configure\");\n const plan = yield* preparePlan<E, R>(request.bootstrap ?? Bootstrap.empty);\n\n const existing =\n request.existingTarget === undefined\n ? undefined\n : yield* checked(\n Schema.Struct({ targetId: Schema.optionalKey(Identifier) }),\n request.existingTarget,\n \"configure\",\n );\n\n // Even a parent with parallel finalizers closes this connection before callback scopes end.\n const scope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n const bindings = yield* makeBindings(plan).pipe(Scope.provide(scope));\n const bootstrap = compileBootstrap(plan);\n\n const connectionDriver: DriverOptions =\n existing === undefined\n ? driver\n : {\n viewport,\n pageControl,\n maxPages: driver.maxPages,\n popupPolicy,\n dialogPolicy,\n newPage: false,\n preserveViewport: true,\n ...(existing.targetId === undefined ? {} : { initialTargetId: existing.targetId }),\n };\n\n const acquired = yield* acquireSession(\n {\n maxActions: fixed.maxActions,\n maxElapsedMillis: fixed.maxElapsedMillis,\n actionTimeoutMillis: automation.actionTimeoutMillis ?? 10_000,\n maxHostReads: automation.maxHostReads ?? 10_000,\n },\n {\n implementation,\n remote: source,\n engine,\n keepAlive: existing === undefined && keepAlive,\n driver: { ...connectionDriver, ...(bootstrap === undefined ? {} : { bootstrap }) },\n connectBindings: bindings.connect,\n maxReturnedBytes: fixed.maxReturnedBytes,\n },\n ).pipe(Scope.provide(scope));\n\n const connected = yield* Effect.cached(\n acquired.connect.pipe(\n Effect.map((controls): Connection<L[\"reference\"], E> => {\n const fileOperation = (\n operation: \"select-files\" | \"file-chooser\",\n request: FileRequest,\n ) =>\n checked(Selector, request.selector, operation).pipe(\n Effect.flatMap((selector) =>\n resolveFiles(request.selection, operation).pipe(\n Effect.flatMap((files) =>\n operation === \"select-files\"\n ? controls.selectFiles(selector, files)\n : controls.clickForFileSelection(selector, files),\n ),\n ),\n ),\n Effect.flatMap((url) => decoded(ActionResult, \"action-result\", \"unknown\")({ url })),\n );\n\n return {\n session: makeSession(controls, bindings),\n operations: {\n clickForDownload: (request) =>\n checked(ClickRequest, request, \"download-action\").pipe(\n Effect.flatMap((value) => controls.clickForDownload(value.selector)),\n Effect.flatMap(decoded(DownloadEvent, \"download-action\", \"unknown\")),\n ),\n selectFiles: (request) => fileOperation(\"select-files\", request),\n clickForFileSelection: (request) => fileOperation(\"file-chooser\", request),\n liveView: controls.liveView,\n beginHandoff: controls.beginHandoff,\n resume: controls.resume,\n detach: controls.detach,\n reconnect: controls.reconnect,\n },\n };\n }),\n ),\n );\n\n return {\n reference: acquired.reference,\n lifetime: acquired.lease,\n failure: bindings.failure,\n close: acquired.close,\n connect: Effect.raceFirst(\n bindings.failure,\n acquired.connect.pipe(Effect.andThen(connected)),\n ).pipe(Effect.onError(() => acquired.close.pipe(Effect.asVoid))),\n } satisfies Acquisition<L, E>;\n });\n\n return { acquire } satisfies Runtime;\n});\n"],"mappings":"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"}