effect-browserbase 0.1.0-beta.102 → 0.1.0-beta.104

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"Browser-joE4Zgys.mjs","names":["Registration.snapshot","Registration.invoke","invoke","Bootstrap.empty"],"sources":["../src/internal/browser/BindingRunner.ts","../src/internal/browser/Bootstrap.ts","../src/internal/browser/Bindings.ts","../src/internal/session/Attachment.ts","../src/internal/browser/Owner.ts","../src/internal/browser/Session.ts","../src/Browser.ts"],"sourcesContent":["import { Effect, Exit, FiberSet, Scope } from \"effect\";\n\nimport type { CallbackFailureMode } from \"./CallbackTasks.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 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: () => 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 run = yield* FiberSet.makeRuntimePromise<R, Exit.Exit<A, E>, never>().pipe(\n Scope.provide(runtimeScope),\n );\n\n let accepting = true;\n let faulted = false;\n let inFlight = 0;\n\n const close = () => {\n accepting = false;\n };\n\n const fault = () => {\n if (!accepting || faulted) return;\n faulted = true;\n onFault();\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, 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 } from \"../../Errors.ts\";\nimport * as Registration from \"./BindingRegistration.ts\";\nimport { makeBindingRunner } from \"./BindingRunner.ts\";\nimport { duplicateStep } from \"./Bootstrap.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: () => void,\n isActive: () => boolean,\n isCurrent?: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\nconst invalidPlan = () =>\n BrowserError.make({ operation: \"configure\", reason: \"configuration\", outcome: \"undispatched\" });\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 = \"BrowserbaseBindingError\";\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: () => 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 ) => {\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 for (const connection of connections) connection.close();\n onFault();\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 }\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 });\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 Schema.is(InitializationError)(cause) ? error(cause.reason) : error(\"native\"),\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.close);\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);\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()) record(registration, Cause.fail(error(\"native\")));\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 },\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 { Effect, Exit, Option, Scope } from \"effect\";\n\nimport type { CleanupResult } from \"../../Cleanup.ts\";\nimport { BrowserbaseClient } from \"../../Client.ts\";\nimport { SessionError } from \"../../Errors.ts\";\nimport type { SessionReference } from \"../../References.ts\";\nimport { isTerminalSessionStatus } from \"../../SessionData.ts\";\nimport { BrowserbaseSessions } from \"../../Sessions.ts\";\nimport { connectionAddress } from \"../provider/Connection.ts\";\nimport {\n makeCleanup,\n noLocalConnection,\n reported,\n type CleanupLimits,\n type LocalCleanup,\n} from \"./Cleanup.ts\";\nimport { reportCleanup } from \"./Diagnostics.ts\";\n\nexport interface AttachmentOptions {\n readonly reference: SessionReference;\n /** Bounded admission of a session the provider has not finished starting. */\n readonly pendingWaitMillis?: number;\n readonly onCleanup?: (result: CleanupResult) => Effect.Effect<void>;\n}\n\nconst failure = (reason: SessionError[\"reason\"]) =>\n SessionError.make({ operation: \"session-attach\", reason, outcome: \"undispatched\" });\n\n/**\n * Borrowing an already running session. This scope owns its local connection and nothing\n * else: no allocation attempt is made, no release is requested, and no Context-writer\n * authority is claimed. Whoever allocated the session keeps all three.\n */\nexport const attachRemote = Effect.fnUntraced(function* (\n options: AttachmentOptions,\n local: LocalCleanup = noLocalConnection,\n limits?: CleanupLimits,\n) {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n const parent = yield* Scope.Scope;\n const pendingWaitMillis = options.pendingWaitMillis ?? 0;\n\n if (\n !Number.isSafeInteger(pendingWaitMillis) ||\n pendingWaitMillis < 0 ||\n pendingWaitMillis > 600_000\n )\n return yield* failure(\"configuration\");\n\n // The status read validates project authority before anything is borrowed. A terminal\n // session needs a fresh allocation from durable state, never a reattachment.\n const observed = yield* sessions.retrieve(options.reference);\n\n if (isTerminalSessionStatus(observed.status)) return yield* failure(\"expired\");\n if (observed.status !== \"RUNNING\") {\n if (pendingWaitMillis === 0) return yield* failure(\"active\");\n yield* sessions.waitUntilRunning(observed.reference, { timeoutMillis: pendingWaitMillis });\n }\n const reference = observed.reference;\n\n return yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const resourceScope = yield* Scope.make();\n let closing = false;\n let cleanup: CleanupResult | undefined;\n\n const terminate = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n closing = true;\n\n const coordinator = yield* makeCleanup(\n reference,\n \"borrowed\",\n sessions,\n local,\n (result) => {\n cleanup = result;\n },\n limits,\n );\n\n yield* coordinator.close;\n if (cleanup !== undefined) yield* reportCleanup(cleanup);\n if (cleanup !== undefined && options.onCleanup !== undefined)\n yield* reported(options.onCleanup(cleanup));\n }),\n ),\n );\n\n const closeScope = yield* Effect.cached(Scope.close(resourceScope, Exit.void));\n\n // Teardown is registered before the first connection, exactly as an owned scope does.\n yield* Scope.addFinalizer(resourceScope, terminate);\n yield* Scope.addFinalizer(parent, closeScope);\n\n return {\n reference,\n status: observed,\n connection: (timeoutMillis: number) =>\n Effect.suspend(() =>\n closing\n ? Effect.fail(\n SessionError.make({\n operation: \"session-connect\",\n reason: \"expired\",\n outcome: \"undispatched\",\n }),\n )\n : // Credentials are fetched fresh: an expiry can race the caller's own read.\n connectionAddress(client, sessions, reference, timeoutMillis),\n ),\n release: closeScope.pipe(\n Effect.andThen(\n Effect.suspend(() =>\n cleanup === undefined\n ? Effect.die(new Error(\"Borrowed session closed without cleanup evidence\"))\n : Effect.succeed(cleanup),\n ),\n ),\n ),\n cleanupResult: Effect.sync(() => Option.fromNullishOr(cleanup)),\n };\n }),\n );\n});\n","import { Clock, Effect, Schema, Semaphore } from \"effect\";\n\nimport { BrowserError, type BrowserOperation } from \"../../Errors.ts\";\nimport { deadlineAfter, nowMillis, until } from \"../Deadline.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 operation: BrowserOperation,\n onTimeout?: () => void,\n): Effect.Effect<A, E | BrowserError, R> =>\n until(effect, deadline, () => {\n onTimeout?.();\n\n return BrowserError.make({ operation, reason: \"timeout\" });\n });\n\nexport type Phase =\n | \"acquiring\"\n | \"open\"\n | \"paused\"\n | \"detached\"\n | \"uncertain\"\n | \"closing\"\n | \"closed\";\n\nexport type Invalidation =\n | \"observation\"\n | \"target-changed\"\n | \"resized\"\n | \"paused\"\n | \"disconnected\"\n | \"uncertain\"\n | \"closed\";\n\n/** One admitted native operation; checks at dispatch also fence late Promise continuations. */\nexport interface Ticket {\n readonly signal: AbortSignal;\n readonly deadline: number;\n readonly generation: number;\n readonly dispatched: boolean;\n readonly remainingMillis: () => number;\n check(): void;\n dispatch(): 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 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 const lifetimeDeadline = yield* deadlineAfter(limits.maxElapsedMillis);\n const hooks = new Set<(reason: Invalidation) => void>();\n\n const state = {\n phase: \"acquiring\" as Phase,\n generation: 0,\n revision: 0,\n selection: 0,\n actions: 0,\n };\n\n let active: AbortController | undefined;\n const reservations = new Map<string, AbortController>();\n\n const invalidate = (reason: Invalidation) => {\n state.revision++;\n for (const hook of hooks) hook(reason);\n };\n\n const fence = (phase: Phase, reason: Invalidation) => {\n if (\n state.phase === \"closed\" ||\n (state.phase === \"closing\" && phase !== \"closed\" && phase !== \"closing\")\n )\n return;\n state.phase = phase;\n state.generation++;\n active?.abort();\n for (const reservation of reservations.values()) reservation.abort();\n reservations.clear();\n invalidate(reason);\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\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 === \"unknown\") fence(\"uncertain\", \"uncertain\");\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;\n readonly mutation?: boolean;\n readonly phases?: ReadonlyArray<Phase>;\n readonly verifyAfter?: boolean;\n readonly preflight?: Effect.Effect<void, BrowserError>;\n } = {},\n ): Effect.Effect<A, E | BrowserError, R> =>\n semaphore\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n if (!(options.phases ?? [\"open\"]).includes(state.phase)) {\n return yield* BrowserError.make({\n operation,\n reason: state.phase === \"paused\" ? \"busy\" : \"closed\",\n outcome: \"undispatched\",\n });\n }\n yield* options.preflight ?? Effect.void;\n const now = yield* nowMillis;\n\n if (now >= lifetimeDeadline) {\n fence(\"uncertain\", \"uncertain\");\n\n return yield* BrowserError.make({\n operation,\n reason: \"timeout\",\n outcome: \"undispatched\",\n });\n }\n if (options.charge !== false) {\n if (state.actions >= limits.maxActions)\n return yield* BrowserError.make({\n operation,\n reason: \"limit\",\n outcome: \"undispatched\",\n });\n 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 (\n controller.signal.aborted ||\n state.generation !== generation ||\n !allowed.includes(state.phase)\n ) {\n throw BrowserError.make({\n operation,\n reason: \"stale\",\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n }\n };\n\n const ticket: Ticket = {\n signal: controller.signal,\n deadline: Math.min(now + limits.actionTimeoutMillis, lifetimeDeadline),\n generation,\n remainingMillis: () =>\n Math.max(\n 1,\n Math.min(now + limits.actionTimeoutMillis, lifetimeDeadline) -\n Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000,\n ),\n get dispatched() {\n return dispatched;\n },\n check,\n dispatch() {\n check();\n if (!dispatched && options.mutation) invalidate(\"observation\");\n dispatched = true;\n },\n };\n\n const uncertain = () => {\n controller.abort();\n if (dispatched && state.phase !== \"closing\" && state.phase !== \"closed\")\n fence(\"uncertain\", \"uncertain\");\n };\n\n return yield* within(body(ticket), ticket.deadline, operation, uncertain).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: \"stale\",\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 ?? (dispatched ? \"unknown\" : \"undispatched\"),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.retryAfterMillis === undefined\n ? {}\n : { retryAfterMillis: error.retryAfterMillis }),\n }),\n );\n }),\n Effect.onInterrupt(() => Effect.sync(uncertain)),\n Effect.ensuring(\n Effect.sync(() => {\n controller.abort();\n if (active === controller) active = undefined;\n }),\n ),\n );\n }),\n )\n .pipe(\n Effect.flatMap(\n Effect.fromOption(() =>\n BrowserError.make({ operation, reason: \"busy\", outcome: \"undispatched\" }),\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 invalidate,\n fence,\n onInvalidate(hook: (reason: Invalidation) => 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: \"provider\",\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: \"stale\",\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, type Option, Redacted, Schema, Scope } from \"effect\";\n\nimport { BrowserbaseBrowserBinding } from \"../../BrowserBinding.ts\";\nimport {\n type KeyModifier,\n Observation,\n type ObservedElement,\n type PageInfo,\n type PageSuspension,\n Target,\n type Viewport,\n} from \"../../BrowserData.ts\";\nimport type { CleanupResult } from \"../../Cleanup.ts\";\nimport { BrowserbaseClient } from \"../../Client.ts\";\nimport {\n type AllocationError,\n type ContextError,\n type SessionError,\n BrowserError,\n type BrowserOperation,\n} from \"../../Errors.ts\";\nimport type { LaunchRecipe } from \"../../Launch.ts\";\nimport type { AllocationAttempt, SessionReference } from \"../../References.ts\";\nimport { BrowserbaseSessions } from \"../../Sessions.ts\";\nimport { acquireRemote } from \"../session/Acquisition.ts\";\nimport { attachRemote } from \"../session/Attachment.ts\";\nimport type { LocalCleanup } from \"../session/Cleanup.ts\";\nimport type { ContextWriterPermit } from \"../session/WriterFacts.ts\";\nimport { type CaptureParent } from \"./Association.ts\";\nimport { bindingImplementation } from \"./Binding.ts\";\nimport type { ConnectionBindings } from \"./Bindings.ts\";\nimport type { Driver, DriverEvents, DriverOptions, NativeFileSelection } from \"./Driver.ts\";\nimport { issueLiveView } from \"./LiveView.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport { makeOwner, native, type Limits, type Ticket } from \"./Owner.ts\";\nimport type { NativeInput, NativePoint } from \"./Pointer.ts\";\n\n/**\n * What this owner needs from the remote session it drives, whether it allocated that session\n * or borrowed one. Release authority lives behind `release`, so a borrowed lease cannot\n * accidentally expose one: the lease decides what closing means.\n */\nexport interface RemoteLease {\n readonly reference: SessionReference;\n readonly attempt?: AllocationAttempt;\n readonly connection: (\n timeoutMillis: number,\n ) => Effect.Effect<Redacted.Redacted<string>, SessionError>;\n readonly release: Effect.Effect<CleanupResult>;\n readonly cleanupResult: Effect.Effect<Option.Option<CleanupResult>>;\n}\n\nexport type RemoteSource<L extends RemoteLease, E> = (\n local: LocalCleanup,\n lifetimeDeadline: number,\n) => Effect.Effect<L, E, BrowserbaseClient | BrowserbaseSessions | Scope.Scope>;\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\nexport interface SessionOptions<L extends RemoteLease, E> {\n readonly remote: RemoteSource<L, E>;\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: () => void,\n isActive: () => boolean,\n isCurrent: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\nexport interface OwnedLease extends RemoteLease {\n readonly attempt: AllocationAttempt;\n}\n\nexport interface OwnedOptions {\n /** The single provider-faithful launch description; the owner adds no second default body. */\n readonly launch: LaunchRecipe;\n /** Required for a persistent context; the writer permit, not this owner, holds that authority. */\n readonly contextWriter?: ContextWriterPermit;\n readonly onCleanup?: (result: CleanupResult) => Effect.Effect<void>;\n readonly onAllocationUncertain?: (attempt: AllocationAttempt) => Effect.Effect<void>;\n}\n\n/** Allocates the session, and therefore owns releasing it. */\nexport const ownedRemote =\n (\n options: OwnedOptions,\n ): RemoteSource<OwnedLease, AllocationError | BrowserError | ContextError> =>\n (local, lifetimeDeadline) =>\n acquireRemote(\n {\n launch: options.launch,\n ...(options.contextWriter === undefined ? {} : { contextWriter: options.contextWriter }),\n allocationDeadline: lifetimeDeadline,\n ...(options.onCleanup === undefined ? {} : { onCleanup: options.onCleanup }),\n ...(options.onAllocationUncertain === undefined\n ? {}\n : { onAllocationUncertain: options.onAllocationUncertain }),\n },\n local,\n );\n\n/** Borrows a running session: local connection only, and never a release request. */\nexport const borrowedRemote =\n (options: {\n readonly reference: SessionReference;\n readonly pendingWaitMillis?: number;\n readonly onCleanup?: (result: CleanupResult) => Effect.Effect<void>;\n }): RemoteSource<RemoteLease, SessionError> =>\n (local) =>\n attachRemote(options, local);\n\n/**\n * The one owned browser. Remote allocation, release and terminal observation belong to the\n * canonical control plane; this owner supplies only the local connection's cleanup evidence.\n */\nexport const acquireSession = Effect.fnUntraced(function* <L extends RemoteLease, E>(\n limits: Limits,\n options: SessionOptions<L, E>,\n) {\n // The engine is resolved before anything is allocated, so an unissued binding costs nothing.\n const engine = bindingImplementation(yield* BrowserbaseBrowserBinding);\n\n if (engine === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\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\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: () => BrowserError.make({ operation: \"close\", reason: \"provider\" }),\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) throw BrowserError.make({ operation: \"target\", reason: \"closed\" });\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({ operation: \"capture\", reason: \"closed\" });\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) => {\n driver?.invalidateObservation();\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: LocalCleanup = {\n fence: Effect.sync(() => {\n owner.fence(\"closing\", \"closed\");\n handoffToken = undefined;\n activeConnection = undefined;\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<CleanupResult[\"local\"]>(connectPending ? \"pending\" : \"not-connected\");\n\n return Effect.tryPromise({\n try: () => acquired.disconnect(),\n catch: () => BrowserError.make({ operation: \"disconnect\", reason: \"provider\" }),\n }).pipe(Effect.as<CleanupResult[\"local\"]>(\"closed\"));\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n owner.state.phase = \"closed\";\n }),\n ),\n ),\n };\n\n const acquired = yield* options.remote(local, owner.lifetimeDeadline);\n\n const ref = acquired.reference;\n\n const closeScope = acquired.release.pipe(\n Effect.ensuring(Deferred.succeed(ended, undefined)),\n Effect.asVoid,\n );\n\n const connectionEvents = (connectionLease: object): DriverEvents => ({\n invalidate: (reason) => {\n if (activeConnection === connectionLease) owner.invalidate(reason);\n },\n disconnected: () => {\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.fence(\"uncertain\", \"disconnected\");\n }\n },\n pause: () => {\n if (activeConnection !== connectionLease) return;\n if (owner.state.phase === \"open\") owner.fence(\"paused\", \"paused\");\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.fence(\"uncertain\", \"uncertain\");\n },\n fault: () => {\n if (activeConnection !== connectionLease) return;\n if (owner.state.phase !== \"closing\" && owner.state.phase !== \"closed\")\n owner.fence(\"uncertain\", \"uncertain\");\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);\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\"].includes(owner.state.phase);\n\n if (retired()) {\n bindings?.close();\n yield* bindings?.dispose ?? Effect.void;\n\n return yield* BrowserError.make({ operation: \"connect\", reason: \"closed\" });\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 ) {\n yield* Effect.tryPromise({\n try: () => acquired.disconnect(),\n catch: () => BrowserError.make({ operation: \"connect\", reason: \"provider\" }),\n }).pipe(Effect.ignore);\n driver = undefined;\n\n return yield* BrowserError.make({ operation: \"connect\", reason: \"closed\" });\n }\n\n return acquired;\n }),\n );\n\n const getDriver = () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"target\",\n reason: \"closed\",\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 (operation: BrowserOperation, ticket: Ticket) => {\n if (!dependent.includes(operation)) return;\n const state = await getDriver().documentReadiness(ticket);\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 ? \"stale\"\n : state.reason === \"timeout\"\n ? \"timeout\"\n : \"failed\",\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?.checkSelected(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({ operation: \"observe\", reason: \"stale\" });\n\n const result = yield* Effect.try({\n try: () => Observation.make({ ...raw, target: capture.target(), revision }),\n catch: (error) => publicError(error, \"observe\", { reason: \"malformed\" }),\n });\n\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(Observation))(\n result,\n ).pipe(\n Effect.mapError(() =>\n BrowserError.make({ operation: \"observe\", reason: \"malformed\" }),\n ),\n );\n\n if (new TextEncoder().encode(encoded).length > options.maxReturnedBytes) {\n return yield* BrowserError.make({ operation: \"observe\", reason: \"limit\" });\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({ operation, reason: \"configuration\", outcome: \"undispatched\" }),\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({ operation: \"target\", reason: \"closed\", outcome: \"undispatched\" }),\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) =>\n Effect.suspend(() => {\n let pageId: string | undefined;\n\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)\n ? Effect.fail(BrowserError.make({ operation, reason: \"busy\", outcome: \"undispatched\" }))\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;\n /** Opening or closing a tab is independent of the selected page's document. */\n readonly anyPage?: boolean;\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 \"file-chooser\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n ].includes(operation)\n )\n await getDriver().pageControl?.checkSelected(ticket);\n await requireReady(operation, ticket);\n\n return action(getDriver(), ticket);\n }),\n {\n ...options,\n ...(options.mutation === true && options.anyPage !== true\n ? { preflight: unreserved(operation) }\n : {}),\n },\n );\n\n /** A bound handle captures the page selection and connection generation, never the current DOM. */\n const bind = () => {\n const generation = owner.state.generation,\n selection = owner.state.selection;\n\n const check = () => {\n if (owner.state.generation !== generation || owner.state.selection !== selection) {\n return Effect.fail(\n BrowserError.make({ operation: \"handle\", reason: \"stale\", outcome: \"undispatched\" }),\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?.checkSelected(ticket);\n await requireReady(operation, ticket);\n\n return action(getDriver(), ticket);\n }),\n {\n mutation,\n preflight: mutation\n ? Effect.suspend(check).pipe(Effect.andThen(unreserved(operation)))\n : Effect.suspend(check),\n },\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 = capture.target();\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 const begun = yield* run(\n \"navigate\",\n async (driver, ticket) => {\n const target = capture.target();\n const navigation = await driver.beginNavigation(url, timeoutMillis, ticket);\n\n return { target, navigation, reservation: owner.reserve(navigation.pageId) };\n },\n true,\n );\n\n const { navigation, reservation } = begun;\n const outcome = yield* Deferred.make<string, BrowserError>();\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 (Deferred.isDoneUnsafe(outcome)) return;\n reservation.settle(known ? \"known\" : \"unknown\");\n Deferred.doneUnsafe(outcome, result);\n };\n\n navigation.settled.then(\n (url) => decide(Effect.succeed(url), true),\n // Failed after dispatch, and nothing says what the browser did: unknown, as it always was.\n (error: unknown) =>\n decide(\n Effect.fail(publicError(error, \"navigate\", { reason: \"provider\", outcome: \"unknown\" })),\n false,\n ),\n );\n // A fence already cleared the reservation; this only releases anyone still waiting.\n reservation.signal.addEventListener(\"abort\", () => decide(failed(\"stale\"), true), {\n once: true,\n });\n // Left unsettled, nothing knows what the browser did with it.\n yield* Effect.addFinalizer(() => Effect.sync(() => decide(failed(\"stale\"), false)));\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: Effect.tryPromise({\n try: () => navigation.stop(),\n catch: (error) =>\n publicError(error, \"navigate-stop\", { reason: \"provider\", outcome: \"unknown\" }),\n }).pipe(\n Effect.timeoutOrElse({\n duration: 3000,\n orElse: () =>\n Effect.fail(\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: \"timeout\",\n outcome: \"unknown\",\n }),\n ),\n }),\n Effect.tap(() => Effect.sync(() => decide(failed(\"interrupted\"), true))),\n ),\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) =>\n Effect.scoped(\n startNavigation(url).pipe(Effect.flatMap((operation) => operation.completed)),\n ),\n readText: (selector?: string) =>\n run(\"read-text\", (driver, ticket) =>\n driver.readText(selector, options.maxReturnedBytes, ticket),\n ),\n click: (target: string | ObservedElement, policy?: AdmissionPolicy) =>\n run(\"click\", (driver, ticket) => driver.click(target, ticket, policy), true),\n fill: (target: string | ObservedElement, value: string, policy?: AdmissionPolicy) =>\n run(\"fill\", (driver, ticket) => driver.fill(target, value, ticket, policy), true),\n scroll: (x: number, y: number) =>\n run(\"scroll\", (driver, ticket) => driver.scroll(x, y, ticket), true),\n pointerMove: (to: NativePoint) =>\n input(\"pointer-move\", (driver, ticket) => driver.pointerMove(to, ticket)),\n hover: (target: string | ObservedElement, policy?: AdmissionPolicy) =>\n input(\"hover\", (driver, ticket) => driver.hover(target, ticket, policy)),\n wheel: (deltaX: number, deltaY: number, at?: NativePoint) =>\n input(\"wheel\", (driver, ticket) => driver.wheel(deltaX, deltaY, at, ticket)),\n press: (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n into?: string | ObservedElement,\n policy?: AdmissionPolicy,\n ) => input(\"press\", (driver, ticket) => driver.press(key, modifiers, into, ticket, policy)),\n type: (text: string, into?: string | ObservedElement, policy?: AdmissionPolicy) =>\n input(\"type\", (driver, ticket) => driver.type(text, into, ticket, policy)),\n screenshot: (full: boolean) =>\n run(\"screenshot\", (driver, ticket) =>\n driver.screenshot(full, options.maxReturnedBytes, ticket),\n ),\n };\n };\n\n /**\n * The remaining execution lifetime bounds waiting for a RUNNING session and its endpoint,\n * within the resource service's own maximum wait. A long business budget does not become\n * an invalid provider-wait configuration.\n */\n const remainingMillis = () =>\n Math.min(\n 600_000,\n Math.max(\n 1,\n Math.ceil(owner.lifetimeDeadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n ),\n );\n\n const connectionUrl = (operation: BrowserOperation) =>\n Effect.suspend(() => acquired.connection(remainingMillis())).pipe(\n Effect.mapError((error) => BrowserError.make({ operation, reason: error.reason })),\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.state.phase = \"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: \"unsupported\",\n outcome: \"undispatched\",\n });\n\n return port;\n };\n\n const controls = {\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 }),\n resume: (receipt: PageSuspension) =>\n nativeOperation(\"page-resume\", (_driver, ticket) => execution().resume(receipt, ticket), {\n charge: false,\n }),\n },\n reference: ref,\n capture,\n bind,\n currentTarget: readSelected,\n cleanupResult: acquired.cleanupResult,\n close: acquired.release.pipe(Effect.ensuring(Deferred.succeed(ended, undefined))),\n observe: (reading: Reading = { scope: \"document\" }) =>\n textBudget(\"observe\", reading.maxTextBytes).pipe(\n Effect.flatMap((bytes) =>\n owner.guard(\"observe\", (ticket) =>\n observeInside(ticket, bytes, reading.maxControls ?? 32, true, reading.scope),\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(\"checkpoint\", 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 ),\n ),\n controlFacts: (reference: ObservedElement) =>\n nativeOperation(\"control-facts\", (driver, ticket) => driver.controlFacts(reference, ticket)),\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 selectPage: (id: string) =>\n nativeOperation(\n \"select-page\",\n async (driver, ticket) => {\n await driver.selectPage(id, 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 charge: false,\n anyPage: true,\n }),\n closePage: (id: string) =>\n nativeOperation(\"close-page\", (driver, ticket) => driver.closePage(id, ticket), {\n mutation: true,\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 nativeOperation(\"wait\", (driver, ticket) => driver.waitFor(selector, state, ticket)),\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: (ttl: number) =>\n owner.guard(\"live-view\", () => issueLiveView(client, ref, ttl), {\n charge: false,\n phases: [\"open\", \"paused\"],\n }),\n beginHandoff: (ttl: number) =>\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: \"unsupported\",\n outcome: \"undispatched\",\n });\n if (owner.state.phase === \"open\") owner.fence(\"paused\", \"paused\");\n handoffToken ??= globalThis.crypto.randomUUID();\n // Failure to mint a view leaves automation paused; there is no finally/resume pair.\n const view = yield* issueLiveView(client, ref, ttl);\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: \"authorization\",\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.state.phase = \"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: \"unsupported\",\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\");\n const initialization = yield* Effect.exit(disposeBindings);\n\n const disconnected = yield* Effect.tryPromise({\n try: () => attached.disconnect(),\n catch: () => BrowserError.make({ operation: \"detach\", reason: \"disconnected\" }),\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 (!options.keepAlive || reconnectTarget === undefined || !operatorReleasedControl) {\n return yield* BrowserError.make({\n operation: \"reconnect\",\n reason: \"unsupported\",\n outcome: \"undispatched\",\n });\n }\n\n const status = yield* sessions\n .retrieve(ref)\n .pipe(\n Effect.mapError((error) =>\n BrowserError.make({ operation: \"reconnect\", reason: error.reason }),\n ),\n );\n\n if (status.status !== \"RUNNING\")\n return yield* BrowserError.make({ operation: \"reconnect\", reason: \"expired\" });\n owner.state.phase = \"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.state.phase = \"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) => (expired ? closeScope : Effect.void)),\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: \"closed\",\n outcome: \"undispatched\",\n }),\n )\n : connected.pipe(Effect.as(controls)),\n ),\n };\n});\n\nexport type SessionControls =\n Effect.Success<ReturnType<typeof acquireSession>> extends {\n connect: Effect.Effect<infer A, infer _E, infer _R>;\n }\n ? A\n : never;\n\nexport type BoundControls = ReturnType<SessionControls[\"bind\"]>;\n","import { Context, Effect, Layer, type Option, type Redacted, Schema, Scope } from \"effect\";\n\nimport * as Bootstrap from \"./Bootstrap.ts\";\nimport { BrowserbaseBrowserBinding } from \"./BrowserBinding.ts\";\nimport {\n type ControlFacts,\n ActionResult,\n AutomationOptions,\n BrowserPolicy,\n Checkpoint,\n CheckpointOptions,\n ClickRequest,\n FillRequest,\n type FrameInfo,\n HoverRequest,\n InlineFiles,\n InputReceipt,\n KeyStroke,\n NavigateRequest,\n NavigationResult,\n type Observation,\n ObservationOptions,\n ObservedElement,\n type PageInfo,\n PointerMoveRequest,\n PressRequest,\n ReadTextRequest,\n ScreenshotRequest,\n ScreenshotResult,\n ScrollRequest,\n type SelectFilesRequest,\n StartNavigationRequest,\n Selector,\n type Target,\n TextResult,\n TypeRequest,\n Viewport,\n WheelRequest,\n} from \"./BrowserData.ts\";\nimport type { CleanupResult } from \"./Cleanup.ts\";\nimport { BrowserbaseClient } from \"./Client.ts\";\nimport {\n type AllocationError,\n BrowserError,\n type BrowserOperation,\n type ContextError,\n InitializationError,\n type SessionError,\n} from \"./Errors.ts\";\nimport { associate } from \"./internal/browser/Association.ts\";\nimport { makeBindings, preparePlan, type Bindings } from \"./internal/browser/Bindings.ts\";\nimport { compileBootstrap } from \"./internal/browser/Bootstrap.ts\";\nimport type { NativeFileSelection } from \"./internal/browser/Driver.ts\";\nimport type { LiveView } from \"./internal/browser/LiveView.ts\";\nimport { associatePageControl } from \"./internal/browser/PageControlAssociation.ts\";\nimport {\n acquireSession,\n borrowedRemote,\n ownedRemote,\n type BoundControls,\n type SessionControls,\n} from \"./internal/browser/Session.ts\";\nimport type { ContextWriterPermit } from \"./internal/session/WriterFacts.ts\";\nimport { issuedUpload } from \"./internal/upload/Issued.ts\";\nimport type { LaunchRecipe } from \"./Launch.ts\";\nimport { Identifier, type AllocationAttempt, type SessionReference } from \"./References.ts\";\nimport { BrowserbaseSessions } from \"./Sessions.ts\";\nimport { DownloadObservation } from \"./Transfers.ts\";\n\nexport type { LiveView } from \"./internal/browser/LiveView.ts\";\n\n/** Host configuration. Credentials live in the Client; a model never selects these values. */\nexport interface BrowserOptions extends AutomationOptions {\n readonly launch: LaunchRecipe;\n /** Required whenever the launch recipe persists a context. */\n readonly contextWriter?: ContextWriterPermit;\n readonly onCleanup?: (result: CleanupResult) => Effect.Effect<void>;\n readonly onAllocationUncertain?: (attempt: AllocationAttempt) => Effect.Effect<void>;\n}\n\nexport interface Handoff {\n readonly token: Redacted.Redacted<string>;\n readonly view: LiveView;\n}\n\n/**\n * A host's decision about one control, made on facts read from the exact node immediately\n * before input. Returning anything but `true`, or throwing, sends nothing and fails `denied`.\n * It is a plain synchronous function on purpose: it runs while the owner's permit is held, where\n * waiting on a model or a network call would stall every other operation. It is not an atomic\n * check-and-input transaction, because page script can still run before the native input lands.\n */\nexport interface ElementAdmission {\n readonly admit: (facts: ControlFacts) => boolean;\n}\n\n/**\n * A navigation the browser is still performing. The owner's permit was released when it was\n * dispatched, so while it loads a host may read, `checkpoint`, hold and resume this page, and\n * use any other page. Anything that would change this page fails `busy` until it settles.\n *\n * Leaving its scope unsettled fences the session, exactly as an interrupted mutation does,\n * because nothing then knows what the browser did. It is never replayed.\n */\nexport interface NavigationOperation {\n /** What was navigated, read before dispatch. */\n readonly target: Target;\n /**\n * The document reached DOMContentLoaded. It belongs to this one navigation: a successor that\n * reaches the same URL fails it instead. Interrupting a waiter stops nothing in the browser.\n */\n readonly completed: Effect.Effect<NavigationResult, BrowserError>;\n /**\n * Asks the browser to stop loading and waits for this navigation to settle, after which\n * `completed` fails `interrupted`. Success is a known outcome and the session stays usable:\n * the page holds whatever had loaded. It does not undo anything the page already did.\n */\n readonly stop: Effect.Effect<void, BrowserError>;\n}\n\n/** One selected page and frame at one connection generation, never the current DOM. */\nexport interface BoundTarget {\n readonly navigate: (request: NavigateRequest) => Effect.Effect<NavigationResult, BrowserError>;\n /** `navigate`, left in flight: the same single dispatch, completed by the caller. */\n readonly startNavigation: (\n request: StartNavigationRequest,\n ) => Effect.Effect<NavigationOperation, BrowserError, Scope.Scope>;\n readonly readText: (request: ReadTextRequest) => Effect.Effect<TextResult, BrowserError>;\n readonly click: (request: ClickRequest) => Effect.Effect<ActionResult, BrowserError>;\n readonly fill: (request: FillRequest) => Effect.Effect<ActionResult, BrowserError>;\n /** Script in the page: instantaneous, and it raises no wheel event. */\n readonly scroll: (request: ScrollRequest) => Effect.Effect<ActionResult, BrowserError>;\n /** One real pointer move, in main-frame viewport pixels. */\n readonly pointerMove: (request: PointerMoveRequest) => Effect.Effect<InputReceipt, BrowserError>;\n /** Places the pointer on one exact element where it is, or fails `not-visible` unsent. */\n readonly hover: (request: HoverRequest) => Effect.Effect<InputReceipt, BrowserError>;\n /** One real wheel event; the browser decides what under the pointer scrolls. */\n readonly wheel: (request: WheelRequest) => Effect.Effect<InputReceipt, BrowserError>;\n /** One real key stroke to whatever has focus, or fails `not-focused` unsent if `into` lacks it. */\n readonly press: (request: PressRequest) => Effect.Effect<InputReceipt, BrowserError>;\n /** Text as the real key strokes that produce it, under the same focus rule as `press`. */\n readonly type: (request: TypeRequest) => Effect.Effect<InputReceipt, BrowserError>;\n readonly screenshot: (\n request: ScreenshotRequest,\n ) => Effect.Effect<ScreenshotResult, BrowserError>;\n}\n\n/**\n * Host control over one owned browser. This is not a serializable model value: copying a\n * session object cannot copy its capture, page-control or connection authority.\n */\nexport interface BrowserbaseSession<E = never> {\n readonly reference: SessionReference;\n /** First fail-session callback cause, preserving the consumer's error type on the host. */\n readonly failure: Effect.Effect<never, E | InitializationError>;\n /** Bounded host-only evidence; consumer causes are never projected into a page reply. */\n readonly bindingDiagnostics: Effect.Effect<Bootstrap.BindingDiagnostics<E>>;\n readonly bind: () => BoundTarget;\n /** Re-reads the live selection first, so a stale generation fails before any dispatch. */\n readonly currentTarget: Effect.Effect<BoundTarget, BrowserError>;\n readonly target: Effect.Effect<Target, BrowserError>;\n /**\n * The one observation whose nodes later actions may name. `scope: \"viewport\"` keeps only text\n * and controls that are on screen and reachable; the default reads the whole document. It is\n * safe to show a model: it carries no destination, form or field value.\n */\n readonly observe: (options?: ObservationOptions) => Effect.Effect<Observation, BrowserError>;\n /**\n * Passive evidence for a recorder, with a picture when asked. It issues no references and\n * leaves the observation above exactly as it was. Host-only: it carries control facts.\n */\n readonly checkpoint: (options?: CheckpointOptions) => Effect.Effect<Checkpoint, BrowserError>;\n /** Host-only facts about one observed control, read from that exact node just now. */\n readonly controlFacts: (reference: ObservedElement) => Effect.Effect<ControlFacts, BrowserError>;\n /**\n * After a page hold, nothing observed on that page may be acted on unchecked. This checks one\n * reference: still attached, and still the control that was inspected. It never searches by\n * selector or label for a substitute, and it sends nothing.\n */\n readonly revalidateElement: (\n reference: ObservedElement,\n ) => Effect.Effect<ObservedElement, BrowserError>;\n readonly clickElement: (\n reference: ObservedElement,\n admission?: ElementAdmission,\n ) => Effect.Effect<ActionResult, BrowserError>;\n readonly fillElement: (\n reference: ObservedElement,\n value: string,\n admission?: ElementAdmission,\n ) => Effect.Effect<ActionResult, BrowserError>;\n readonly hoverElement: (\n reference: ObservedElement,\n admission?: ElementAdmission,\n ) => Effect.Effect<InputReceipt, BrowserError>;\n /** A key stroke sent only if the exact node an observation named already has focus. */\n readonly pressElement: (\n reference: ObservedElement,\n stroke: KeyStroke,\n admission?: ElementAdmission,\n ) => Effect.Effect<InputReceipt, BrowserError>;\n /** Real typing with `fillElement`'s exactness: that node must already have focus. */\n readonly typeElement: (\n reference: ObservedElement,\n text: string,\n admission?: ElementAdmission,\n ) => Effect.Effect<InputReceipt, BrowserError>;\n readonly pages: Effect.Effect<ReadonlyArray<PageInfo>, BrowserError>;\n readonly frames: Effect.Effect<ReadonlyArray<FrameInfo>, BrowserError>;\n readonly selectPage: (pageId: string) => Effect.Effect<BoundTarget, BrowserError>;\n readonly selectFrame: (frameId: string) => Effect.Effect<BoundTarget, BrowserError>;\n /** Create a tab without selecting it. */\n readonly createPage: Effect.Effect<string, BrowserError>;\n readonly closePage: (pageId: string) => Effect.Effect<void, BrowserError>;\n readonly resizeViewport: (viewport: Viewport) => Effect.Effect<void, BrowserError>;\n readonly waitFor: (request: {\n readonly selector: string;\n readonly state: \"visible\" | \"hidden\" | \"attached\" | \"detached\";\n }) => Effect.Effect<void, BrowserError>;\n /** Navigation observation is registered before the single click dispatch. */\n readonly clickAndWait: (request: ClickRequest) => Effect.Effect<ActionResult, BrowserError>;\n readonly clickForDownload: (\n request: ClickRequest,\n ) => Effect.Effect<DownloadObservation, BrowserError>;\n /** Attaches to an existing file input; an uploaded branch needs a receipt for this session. */\n readonly selectFiles: (request: SelectFilesRequest) => Effect.Effect<ActionResult, BrowserError>;\n /** Registers the chooser observation before the single click that opens it. */\n readonly clickForFileSelection: (\n request: SelectFilesRequest,\n ) => Effect.Effect<ActionResult, BrowserError>;\n /**\n * Readiness of the current document only. Dependent operations wait for it themselves;\n * this reports it without charging an action, so a caller can decide what to do about a\n * document that predates the registrations.\n */\n readonly ready: Effect.Effect<Bootstrap.ReadinessOutcome, InitializationError>;\n readonly liveView: (expiresInSeconds?: number) => Effect.Effect<LiveView, BrowserError>;\n readonly beginHandoff: (expiresInSeconds?: number) => Effect.Effect<Handoff, 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: SessionReference; readonly targetId: string },\n BrowserError\n >;\n readonly reconnect: (\n operatorReleasedControl: boolean,\n ) => Effect.Effect<Observation, BrowserError | InitializationError>;\n readonly close: Effect.Effect<CleanupResult, BrowserError>;\n readonly cleanupResult: Effect.Effect<Option.Option<CleanupResult>>;\n}\n\n/** Dependencies are captured at acquisition, not erased into an environment-free service Layer. */\nexport interface OpenOptions<E = never, R = never> {\n readonly bootstrap?: Bootstrap.Plan<E, R>;\n}\n\nexport interface AttachRequest<E = never, R = never> extends OpenOptions<E, R> {\n readonly policy: BrowserPolicy;\n /** The exact page to resume; without it the session must have exactly one page. */\n readonly target?: { readonly targetId: string };\n /** Bounded admission of a session the provider has not finished starting. */\n readonly pendingWaitMillis?: number;\n}\n\nexport interface BrowserAcquisition<E = never> {\n readonly reference: SessionReference;\n readonly attempt: AllocationAttempt;\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly connect: Effect.Effect<BrowserbaseSession<E>, BrowserError | E | InitializationError>;\n readonly close: Effect.Effect<CleanupResult, BrowserError>;\n}\n\nconst 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(() =>\n BrowserError.make({ operation, reason: \"configuration\", outcome: \"undispatched\" }),\n ),\n );\n\nconst decoded =\n <A>(schema: Schema.Codec<A, unknown, never, never>, operation: BrowserOperation) =>\n (value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError(() => BrowserError.make({ operation, reason: \"malformed\" })),\n );\n\nconst action = decoded(ActionResult, \"action-result\");\nconst pointerMoved = decoded(InputReceipt, \"pointer-move\");\nconst hovered = decoded(InputReceipt, \"hover\");\nconst wheeled = decoded(InputReceipt, \"wheel\");\nconst pressed = decoded(InputReceipt, \"press\");\nconst typed = decoded(InputReceipt, \"type\");\n\nconst makeTarget = (bound: BoundControls): BoundTarget => ({\n navigate: (request) =>\n checked(NavigateRequest, request, \"navigate\").pipe(\n Effect.flatMap((value) => bound.navigate(value.url)),\n Effect.flatMap((url) => decoded(NavigationResult, \"navigate\")({ 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\")({ 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\")({ 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 )({ mediaType: \"image/png\", bytes: new Uint8Array(bytes) }),\n ),\n ),\n});\n\n/**\n * Uploaded selection is admitted by the identity of a receipt this package issued for this\n * exact session, never by a path read off the caller's value. A fabricated receipt has no\n * issuance record, so an arbitrary server pathname can never become an attached file.\n */\nconst selection = (\n request: SelectFilesRequest,\n reference: SessionReference,\n operation: BrowserOperation,\n): Effect.Effect<ReadonlyArray<NativeFileSelection>, BrowserError> =>\n Effect.suspend(() => {\n const invalid = BrowserError.make({\n operation,\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n\n if (request.selection._tag === \"Inline\") {\n return checked(InlineFiles, request.selection.files, operation).pipe(\n Effect.map((files) =>\n files.map((file) => ({\n _tag: \"Inline\" as const,\n name: file.name,\n mediaType: file.mediaType,\n // The dispatched bytes cannot change after they were validated.\n bytes: new Uint8Array(file.bytes),\n })),\n ),\n );\n }\n\n const uploads = request.selection.uploads;\n\n if (!Array.isArray(uploads) || uploads.length < 1 || uploads.length > 8)\n return Effect.fail(invalid);\n const files: NativeFileSelection[] = [];\n\n for (const receipt of uploads) {\n const issued = issuedUpload(receipt);\n\n if (issued === undefined)\n return Effect.fail(\n BrowserError.make({ operation, reason: \"authorization\", outcome: \"undispatched\" }),\n );\n if (\n issued.reference.projectId !== reference.projectId ||\n issued.reference.sessionId !== reference.sessionId\n )\n return Effect.fail(\n BrowserError.make({ operation, reason: \"authorization\", outcome: \"undispatched\" }),\n );\n files.push({ _tag: \"Remote\", path: issued.remotePath });\n }\n\n return Effect.succeed(files);\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 === \"busy\"\n ? \"busy\"\n : reason === \"closed\" || reason === \"disconnected\"\n ? \"closed\"\n : reason === \"timeout\"\n ? \"timeout\"\n : reason === \"stale\"\n ? \"stale\"\n : reason === \"unsupported\"\n ? \"unsupported\"\n : reason === \"configuration\"\n ? \"configuration\"\n : \"native\";\n\nconst makeSession = <E>(\n controls: SessionControls,\n bindings: Bindings<E>,\n): BrowserbaseSession<E> => {\n const currentTarget = controls.currentTarget.pipe(Effect.map(() => makeTarget(controls.bind())));\n\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: BrowserbaseSession<E> = {\n reference: controls.reference,\n failure: bindings.failure,\n bindingDiagnostics: bindings.diagnostics,\n bind: () => makeTarget(controls.bind()),\n currentTarget,\n target: controls.currentTarget,\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 )({\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.bind().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.bind().fill(element, text, admission?.admit)),\n ),\n ),\n Effect.flatMap(navigate),\n ),\n hoverElement: (reference, admission) =>\n checked(ObservedElement, reference, \"hover\").pipe(\n Effect.flatMap((value) => controls.bind().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.bind().press(value.key, value.modifiers ?? [], element, admission?.admit),\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.bind().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 selectPage: (id) =>\n checked(Identifier, id, \"select-page\").pipe(\n Effect.flatMap(controls.selectPage),\n Effect.andThen(currentTarget),\n ),\n selectFrame: (id) =>\n checked(Identifier, id, \"select-frame\").pipe(\n Effect.flatMap(controls.selectFrame),\n Effect.andThen(currentTarget),\n ),\n createPage: controls.createPage(),\n closePage: (id) =>\n checked(Identifier, id, \"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 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 clickForDownload: (request) =>\n checked(ClickRequest, request, \"download-action\").pipe(\n Effect.flatMap((value) => controls.clickForDownload(value.selector)),\n Effect.flatMap((raw) =>\n decoded(\n DownloadObservation,\n \"download-action\",\n )({ ...raw, reference: controls.reference }),\n ),\n ),\n selectFiles: (request) =>\n checked(Selector, request.selector, \"select-files\").pipe(\n Effect.flatMap((selector) =>\n selection(request, controls.reference, \"select-files\").pipe(\n Effect.flatMap((files) => controls.selectFiles(selector, files)),\n ),\n ),\n Effect.flatMap(navigate),\n ),\n clickForFileSelection: (request) =>\n checked(Selector, request.selector, \"file-chooser\").pipe(\n Effect.flatMap((selector) =>\n selection(request, controls.reference, \"file-chooser\").pipe(\n Effect.flatMap((files) => controls.clickForFileSelection(selector, files)),\n ),\n ),\n Effect.flatMap(navigate),\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 liveView: (ttl = 60) => controls.liveView(ttl),\n beginHandoff: (ttl = 60) => controls.beginHandoff(ttl),\n resume: (token, released) => controls.resume(token, released),\n detach: controls.detach,\n reconnect: (released) => controls.reconnect(released),\n close: controls.close,\n cleanupResult: controls.cleanupResult,\n };\n\n associate(session, controls.capture);\n associatePageControl(session, controls.pageControl);\n\n return session;\n};\n\n/**\n * Credentials, budgets and connection lifetime are fixed when this Layer is built. Building it\n * allocates nothing and loads no native peer; every acquisition is scoped by its caller.\n */\nexport class BrowserbaseBrowser extends Context.Service<\n BrowserbaseBrowser,\n {\n readonly acquire: <E = never, R = never>(\n policy: BrowserPolicy,\n request?: OpenOptions<E, R>,\n ) => Effect.Effect<\n BrowserAcquisition<E>,\n AllocationError | BrowserError | ContextError,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n /** Borrowed control of a session this process did not allocate and will not release. */\n readonly attach: <E = never, R = never>(\n reference: SessionReference,\n request: AttachRequest<E, R>,\n ) => Effect.Effect<\n BrowserbaseSession<E>,\n BrowserError | SessionError | E | InitializationError,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n readonly open: <E = never, R = never>(\n policy: BrowserPolicy,\n request?: OpenOptions<E, R>,\n ) => Effect.Effect<\n BrowserbaseSession<E>,\n AllocationError | BrowserError | ContextError | E | InitializationError,\n Scope.Scope | Exclude<R, Scope.Scope>\n >;\n /** Race the consumer with typed callback failure and confirm cleanup before normal success. */\n readonly withBrowser: <E, R, A, E2, R2>(\n policy: BrowserPolicy,\n request: OpenOptions<E, R>,\n use: (session: BrowserbaseSession<E>) => Effect.Effect<A, E2, R2>,\n ) => Effect.Effect<\n A,\n AllocationError | BrowserError | ContextError | InitializationError | E | E2,\n Exclude<R | R2, Scope.Scope>\n >;\n }\n>()(\"effect-browserbase/Browser\") {\n static layer(\n options: BrowserOptions,\n ): Layer.Layer<BrowserbaseBrowser, BrowserError, BrowserbaseClient | BrowserbaseSessions> {\n return Layer.effect(\n BrowserbaseBrowser,\n Effect.gen(function* () {\n const client = yield* BrowserbaseClient;\n const sessions = yield* BrowserbaseSessions;\n // The engine is fixed where the Layer is built, like the account it connects for.\n const binding = yield* BrowserbaseBrowserBinding;\n const automation = yield* checked(AutomationOptions, projected(options), \"configure\");\n\n const viewport = yield* checked(\n Viewport,\n options.launch.viewport._tag === \"Fixed\"\n ? { width: options.launch.viewport.width, height: options.launch.viewport.height }\n : { width: 1280, height: 720 },\n \"configure\",\n );\n\n const actionTimeoutMillis = automation.actionTimeoutMillis ?? 10_000;\n const maxPages = automation.maxPages ?? 10;\n const pageControl = automation.pageControl ?? false;\n const popupPolicy = automation.popupPolicy ?? \"retain\";\n const dialogPolicy = automation.dialogPolicy ?? \"dismiss\";\n\n if (\n pageControl &&\n (options.launch.keepAlive === true || popupPolicy === \"pause\" || dialogPolicy === \"pause\")\n )\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: \"unsupported\",\n outcome: \"undispatched\",\n });\n\n if (options.launch.context?.persist === true && options.contextWriter === undefined)\n return yield* BrowserError.make({ operation: \"configure\", reason: \"context-lease\" });\n\n // A retired layer-level bootstrap must not be silently discarded for JavaScript callers.\n if (Object.prototype.hasOwnProperty.call(options, \"bootstrap\"))\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n });\n\n const driver = {\n pageControl,\n viewport,\n maxPages,\n popupPolicy,\n dialogPolicy,\n preserveViewport: options.launch.viewport._tag !== \"Fixed\",\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* <E = never, R = never>(\n policy: BrowserPolicy,\n request: OpenOptions<E, R> = {},\n ) {\n const fixed = yield* checked(BrowserPolicy, policy, \"configure\");\n const plan = yield* preparePlan<E, R>(request.bootstrap ?? Bootstrap.empty);\n // The sequential child keeps remote cleanup ahead of callback-scope finalization even\n // when a consumer deliberately gives its outer Scope parallel finalizers.\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 acquired = yield* acquireSession(\n {\n maxActions: fixed.maxActions,\n maxElapsedMillis: fixed.maxElapsedMillis,\n actionTimeoutMillis,\n },\n {\n remote: ownedRemote({\n launch: options.launch,\n ...(options.contextWriter === undefined\n ? {}\n : { contextWriter: options.contextWriter }),\n ...(options.onCleanup === undefined ? {} : { onCleanup: options.onCleanup }),\n ...(options.onAllocationUncertain === undefined\n ? {}\n : { onAllocationUncertain: options.onAllocationUncertain }),\n }),\n keepAlive: options.launch.keepAlive === true,\n driver: { ...driver, ...(bootstrap === undefined ? {} : { bootstrap }) },\n connectBindings: bindings.connect,\n maxReturnedBytes: fixed.maxReturnedBytes,\n },\n ).pipe(\n // The Layer owns the one account and resource service; acquisition never re-resolves them.\n Effect.provideService(BrowserbaseClient, client),\n Effect.provideService(BrowserbaseSessions, sessions),\n Effect.provideService(BrowserbaseBrowserBinding, binding),\n Scope.provide(scope),\n );\n\n // One public session object is shared by repeated connect calls in this scope.\n const connected = yield* Effect.cached(\n acquired.connect.pipe(Effect.map((controls) => makeSession(controls, bindings))),\n );\n\n return {\n reference: acquired.reference,\n attempt: acquired.lease.attempt,\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 BrowserAcquisition<E>;\n });\n\n /**\n * Borrowing a session another process allocated. The launch recipe is not replayed and\n * no allocation is attempted: the requested target is resolved explicitly, credentials\n * are fetched fresh because expiry races the caller's own status read, and this scope\n * disconnects locally without ever requesting release. Detaching and reattaching inside\n * a borrowed scope is deliberately absent; attaching again is the cross-process path,\n * and it revalidates the session instead of assuming it is still there.\n */\n const attach = Effect.fnUntraced(function* <E = never, R = never>(\n reference: SessionReference,\n request: AttachRequest<E, R>,\n ) {\n const fixed = yield* checked(BrowserPolicy, request.policy, \"configure\");\n const plan = yield* preparePlan<E, R>(request.bootstrap ?? Bootstrap.empty);\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 targetId =\n request.target === undefined\n ? undefined\n : yield* checked(Identifier, request.target.targetId, \"configure\");\n\n const acquired = yield* acquireSession(\n {\n maxActions: fixed.maxActions,\n maxElapsedMillis: fixed.maxElapsedMillis,\n actionTimeoutMillis,\n },\n {\n remote: borrowedRemote({\n reference,\n ...(request.pendingWaitMillis === undefined\n ? {}\n : { pendingWaitMillis: request.pendingWaitMillis }),\n ...(options.onCleanup === undefined ? {} : { onCleanup: options.onCleanup }),\n }),\n keepAlive: false,\n driver: {\n ...driver,\n ...(bootstrap === undefined ? {} : { bootstrap }),\n newPage: false,\n preserveViewport: true,\n ...(targetId === undefined ? {} : { initialTargetId: targetId }),\n },\n maxReturnedBytes: fixed.maxReturnedBytes,\n connectBindings: bindings.connect,\n },\n ).pipe(\n Effect.provideService(BrowserbaseClient, client),\n Effect.provideService(BrowserbaseSessions, sessions),\n Effect.provideService(BrowserbaseBrowserBinding, binding),\n Scope.provide(scope),\n );\n\n return yield* Effect.raceFirst(\n bindings.failure,\n acquired.connect.pipe(Effect.map((controls) => makeSession(controls, bindings))),\n ).pipe(Effect.onError(() => acquired.close.pipe(Effect.asVoid)));\n });\n\n return BrowserbaseBrowser.of({\n acquire,\n attach,\n open: (policy, request) =>\n acquire(policy, request).pipe(Effect.flatMap((acquired) => acquired.connect)),\n withBrowser: (policy, request, use) =>\n Effect.scoped(\n Effect.gen(function* () {\n const acquired = yield* acquire(policy, request);\n const session = yield* acquired.connect;\n\n const result = yield* Effect.raceFirst(\n session.failure,\n Effect.suspend(() => use(session)),\n );\n\n const cleanup = yield* session.close;\n\n if (\n cleanup.remote !== \"confirmed\" ||\n cleanup.local !== \"closed\" ||\n cleanup.issues.length > 0\n )\n return yield* BrowserError.make({\n operation: \"close\",\n reason: \"provider\",\n outcome: \"unknown\",\n });\n\n return result;\n }),\n ),\n });\n }),\n );\n }\n}\n\n/** Only the automation fields cross the schema boundary; launch and callbacks are separate. */\nconst projected = (options: BrowserOptions) => ({\n ...(options.actionTimeoutMillis === undefined\n ? {}\n : { actionTimeoutMillis: options.actionTimeoutMillis }),\n ...(options.maxPages === undefined ? {} : { maxPages: options.maxPages }),\n ...(options.initialPage === undefined ? {} : { initialPage: options.initialPage }),\n ...(options.popupPolicy === undefined ? {} : { popupPolicy: options.popupPolicy }),\n ...(options.dialogPolicy === undefined ? {} : { dialogPolicy: options.dialogPolicy }),\n ...(options.pageControl === undefined ? {} : { pageControl: options.pageControl }),\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Capture-CZJPuD7b.mjs","names":[],"sources":["../src/internal/capture/CaptureTypes.ts","../src/internal/capture/FrameBuffer.ts","../src/internal/capture/Capture.ts","../src/Capture.ts"],"sourcesContent":["import { Schema, type Effect, type Stream } from \"effect\";\n\nimport { PageInfo, Target } from \"../../BrowserData.ts\";\nimport { BrowserError } from \"../../Errors.ts\";\nconst Dimension = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 16384 }));\nconst BufferedBytes = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 64 * 1024 * 1024 }));\n\n/** Defaults shared by admission and the optional public data schema. */\nexport const CaptureDefaults = Object.freeze({\n maxFrames: 4,\n maxBufferedBytes: 16 * 1024 * 1024,\n maxFrameBytes: 4 * 1024 * 1024,\n maxDurationMillis: 60000,\n quality: 80,\n});\n\nconst LimitFields = {\n maxFrames: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 64 })),\n maxBufferedBytes: BufferedBytes,\n maxFrameBytes: BufferedBytes,\n maxDurationMillis: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 600000 })),\n quality: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 100 })),\n};\n\nconst FrameBudget = Schema.makeFilter(\n (value: { readonly maxFrameBytes?: number; readonly maxBufferedBytes?: number }) =>\n (value.maxFrameBytes ?? CaptureDefaults.maxFrameBytes) <=\n (value.maxBufferedBytes ?? CaptureDefaults.maxBufferedBytes),\n { message: \"A frame must fit within the resolved buffer budget\" },\n);\n\n/** Private resolved admission schema. It is not an additional public options API. */\nexport const CaptureLimits = Schema.Struct(LimitFields).check(FrameBudget);\n\n/**\n * Binary frame data, not a live capability or a JSON/thread/Tool value. Decoding validates\n * fields; it does not copy bytes, decode JPEG pixels, prove target authority, or repair clocks.\n * Capture itself owns the byte copy, freezes its shared target identity, and verifies JPEG framing.\n */\nexport const CapturedFrame = Schema.Struct({\n bytes: Schema.Uint8Array.check(Schema.isMinLength(4), Schema.isMaxLength(64 * 1024 * 1024)),\n mediaType: Schema.Literal(\"image/jpeg\"),\n target: Target,\n sequence: Schema.Natural,\n /**\n * Which document of its page this frame was received during: 0 at the start, one more for each\n * main-frame navigation the interval observed. It is attribution by receipt order, not proof\n * of whose pixels these are: a frame received just after a navigation can still show the\n * document before it. Always 0 for an interval that lasts one document.\n */\n document: Schema.Natural,\n sourceTimeMillis: Schema.Finite.check(Schema.isGreaterThan(0)),\n sourceClock: Schema.Literal(\"presentation-unix-millis\"),\n receivedMonotonicNanos: Schema.BigInt,\n width: Dimension,\n height: Dimension,\n viewportWidth: Dimension,\n viewportHeight: Dimension,\n}).check(\n Schema.makeFilter((frame) => frame.width * frame.height <= 33_554_432, {\n message: \"Frame geometry exceeds the capture pixel bound\",\n }),\n);\n\nexport type CapturedFrame = typeof CapturedFrame.Type;\n\n/** Source-fit request in pixels. Actual JPEG bounds are checked before any frame is delivered. */\nexport const CaptureSize = Schema.Struct({ width: Dimension, height: Dimension });\n\nexport type CaptureSize = typeof CaptureSize.Type;\n\n/** Optional capture data. Defaults are applied at admission, not during schema decoding. */\nexport const CaptureOptions = Schema.Struct({\n /** Pin to a page from `session.pages`; omission preserves selected-page behavior. */\n target: Schema.optionalKey(PageInfo),\n maxFrames: Schema.optionalKey(LimitFields.maxFrames),\n maxBufferedBytes: Schema.optionalKey(LimitFields.maxBufferedBytes),\n maxFrameBytes: Schema.optionalKey(LimitFields.maxFrameBytes),\n maxDurationMillis: Schema.optionalKey(LimitFields.maxDurationMillis),\n quality: Schema.optionalKey(LimitFields.quality),\n /** Source fit only. Does not resize the viewport or impose an FPS cap. */\n size: Schema.optionalKey(CaptureSize),\n /**\n * `document`, the default, ends the interval when its page navigates. `page` follows the page\n * across documents, so a capture started before a navigation covers the loading in between.\n * It applies to a page's main frame; a capture bound to a child frame still ends with it.\n */\n lifetime: Schema.optionalKey(Schema.Literals([\"document\", \"page\"])),\n}).check(FrameBudget);\n\nexport type CaptureOptions = typeof CaptureOptions.Type;\n\n/** An address as the browser reported it. One longer than this is recorded as null, not cut. */\nconst DocumentUrl = Schema.NullOr(Schema.String.check(Schema.isMaxLength(8192)));\n\nexport class CaptureSummary extends Schema.Class<CaptureSummary>(\"BrowserbaseCaptureSummary\")({\n target: Target,\n reason: Schema.String.check(Schema.isMaxLength(64)),\n received: Schema.Natural,\n delivered: Schema.Natural,\n dropped: Schema.Natural,\n duplicates: Schema.Natural,\n /** Arrived after a newer frame was accepted; counted within `dropped`, never reordered in. */\n late: Schema.Natural,\n peakBufferedFrames: Schema.Natural,\n peakBufferedBytes: Schema.Natural,\n bufferedFrames: Schema.Natural,\n bufferedBytes: Schema.Natural,\n sourceFirstMillis: Schema.NullOr(Schema.Finite),\n sourceLastMillis: Schema.NullOr(Schema.Finite),\n /**\n * The captured frame's address when this interval began watching it: the URL of document 0.\n * It is read in the same turn the watch is installed, so no navigation can fall between them.\n */\n initialUrl: DocumentUrl,\n /**\n * Each main-frame navigation a `page` interval observed, in order, with the last frame\n * received before it and the address the new document committed. The native screencast is\n * never restarted for one, so a boundary is not a gap this package introduced; what Chromium\n * omitted while loading stays `upstreamDrops`. A boundary is the commit. When that navigation\n * started and when its document finished loading are the caller's to stamp, on this same\n * clock, around the operation that caused it. A title is page state, not part of a transition.\n */\n documentBoundaries: Schema.Array(\n Schema.Struct({\n document: Schema.Natural,\n observedMonotonicNanos: Schema.BigInt,\n afterSequence: Schema.NullOr(Schema.Natural),\n url: DocumentUrl,\n }),\n ).check(Schema.isMaxLength(64)),\n /** More navigations were observed than are recorded above. Frames still count them all. */\n documentBoundariesTruncated: Schema.Boolean,\n nativeStop: Schema.Literals([\"confirmed\", \"unconfirmed\"]),\n /** Package accounting cannot measure frames omitted by Chromium, transport, or the provider. */\n upstreamDrops: Schema.Literal(\"unknown\"),\n error: Schema.optionalKey(BrowserError),\n}) {}\n\n/** Live stream/Effect capabilities intentionally have no data schema or serialization contract. */\nexport interface CaptureInterval {\n /** Single subscription. Ending or interrupting it stops this interval, not its browser. */\n readonly frames: Stream.Stream<CapturedFrame, BrowserError>;\n readonly stop: Effect.Effect<CaptureSummary>;\n readonly completed: Effect.Effect<CaptureSummary>;\n}\n","/** Callback-side bounded retention. No Promise, Effect, blocked producer, or per-frame fiber. */\nexport class FrameBuffer<A extends { readonly bytes: Uint8Array }> {\n readonly maximumFrames: number;\n readonly maximumBytes: number;\n private readonly items: A[] = [];\n private retained = 0;\n dropped = 0;\n received = 0;\n highWaterBytes = 0;\n highWaterFrames = 0;\n\n constructor(maximumFrames: number, maximumBytes: number) {\n if (\n !Number.isSafeInteger(maximumFrames) ||\n maximumFrames < 1 ||\n maximumFrames > 64 ||\n !Number.isSafeInteger(maximumBytes) ||\n maximumBytes < 1 ||\n maximumBytes > 64 * 1024 * 1024\n ) {\n throw new RangeError(\"Invalid capture retention limits\");\n }\n this.maximumFrames = maximumFrames;\n this.maximumBytes = maximumBytes;\n }\n\n offer(frame: A): boolean {\n this.received++;\n if (frame.bytes.byteLength > this.maximumBytes) {\n this.dropped++;\n\n return false;\n }\n while (\n this.items.length >= this.maximumFrames ||\n this.retained + frame.bytes.byteLength > this.maximumBytes\n ) {\n const removed = this.items.shift();\n\n if (removed === undefined) break;\n this.retained -= removed.bytes.byteLength;\n this.dropped++;\n }\n this.items.push(frame);\n this.retained += frame.bytes.byteLength;\n this.highWaterBytes = Math.max(this.highWaterBytes, this.retained);\n this.highWaterFrames = Math.max(this.highWaterFrames, this.items.length);\n\n return true;\n }\n\n take(): A | undefined {\n const frame = this.items.shift();\n\n if (frame !== undefined) this.retained -= frame.bytes.byteLength;\n\n return frame;\n }\n\n clear(): void {\n this.items.length = 0;\n this.retained = 0;\n }\n\n get size(): number {\n return this.items.length;\n }\n get bytes(): number {\n return this.retained;\n }\n}\n","import { Cause, Clock, Deferred, Effect, Exit, Queue, Schema, Stream } from \"effect\";\n\nimport type { Target } from \"../../BrowserData.ts\";\nimport { BrowserError } from \"../../Errors.ts\";\nimport { type CaptureLease, type CaptureParent } from \"../browser/Association.ts\";\nimport type { CaptureSource, NativeFrame } from \"../browser/Driver.ts\";\nimport {\n CaptureDefaults,\n CaptureLimits,\n CaptureSize,\n CaptureSummary,\n type CaptureInterval,\n type CaptureOptions,\n type CapturedFrame,\n} from \"./CaptureTypes.ts\";\nimport { FrameBuffer } from \"./FrameBuffer.ts\";\nimport { jpegGeometry } from \"./Images.ts\";\n\nconst MaxParentCaptures = 4;\nconst MaxParentBufferedBytes = 64 * 1024 * 1024;\nconst MaxDocumentBoundaries = 64;\nconst MaxDocumentUrlLength = 8192;\n\n/** An over-long address is recorded as null rather than cut into one that was never shown. */\nconst documentUrl = (url: unknown): string | null =>\n typeof url === \"string\" && url.length <= MaxDocumentUrlLength ? url : null;\n\n/**\n * Chromium stamps a screencast frame on its UI thread, encodes it on an unsequenced thread\n * pool, and emits it when that encode completes. It admits a new frame while at most two are\n * unacknowledged (`kMaxScreencastFramesInFlight`), so up to three encode at once and two\n * frames stamped close together can complete in either order. Every frame stamped before an\n * accepted one was already in flight when that one was stamped, so at most two late frames\n * can arrive in a row. A longer run is source time that really went backwards.\n */\nconst MaxConsecutiveLateFrames = 2;\n\n// Synchronous Schema decoding at the callback boundary; no Effect/Fiber is allocated for each frame.\nconst Metadata = Schema.Struct({\n timestamp: Schema.Finite.check(Schema.isGreaterThan(0)),\n viewportWidth: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 16384 })),\n viewportHeight: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 16384 })),\n});\n\nconst parseMetadata = Schema.decodeUnknownSync(Metadata);\n\n/** Private seam for deterministic callback/lifetime tests. The public start accepts a real live session. */\nexport const startCapture = Effect.fnUntraced(function* (\n parent: CaptureParent,\n options: CaptureOptions = {},\n) {\n const maxFrames = options.maxFrames ?? CaptureDefaults.maxFrames;\n const maxBytes = options.maxBufferedBytes ?? CaptureDefaults.maxBufferedBytes;\n const maxFrameBytes = options.maxFrameBytes ?? CaptureDefaults.maxFrameBytes;\n const duration = options.maxDurationMillis ?? CaptureDefaults.maxDurationMillis;\n const quality = options.quality ?? CaptureDefaults.quality;\n\n const size =\n options.size === undefined\n ? undefined\n : yield* Schema.decodeEffect(CaptureSize)(options.size, { onExcessProperty: \"error\" }).pipe(\n Effect.map(({ width, height }) => Object.freeze({ width, height })),\n Effect.mapError(() =>\n BrowserError.make({\n operation: \"capture\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n\n yield* Schema.decodeEffect(CaptureLimits)({\n maxFrames,\n maxBufferedBytes: maxBytes,\n maxFrameBytes,\n maxDurationMillis: duration,\n quality,\n }).pipe(\n Effect.mapError(() =>\n BrowserError.make({\n operation: \"capture\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n );\n const clock = yield* Clock.Clock;\n const wake = yield* Queue.dropping<void>(1);\n const finished = yield* Queue.dropping<void>(1);\n const completed = yield* Deferred.make<void>();\n\n yield* Effect.addFinalizer(() =>\n Queue.shutdown(wake).pipe(Effect.andThen(Queue.shutdown(finished)), Effect.asVoid),\n );\n const buffer = new FrameBuffer<CapturedFrame>(maxFrames, maxBytes);\n let source: CaptureSource | undefined;\n let startPromise: Promise<void> | undefined;\n let startSettled = true;\n let target: Target | undefined;\n let leaseKey: string | undefined;\n\n let ended = false,\n subscribed = false,\n cleanupFinished = false;\n\n let reason = \"stopped\";\n let error: BrowserError | undefined;\n\n let received = 0,\n delivered = 0,\n rejected = 0,\n duplicates = 0,\n late = 0,\n lateRun = 0;\n\n let first: number | undefined, last: number | undefined;\n let document = 0;\n let initialUrl: string | null = null;\n let documentBoundariesTruncated = false;\n const documentBoundaries: Array<CaptureSummary[\"documentBoundaries\"][number]> = [];\n\n /** The page navigated and its screencast kept running: later frames belong to a new document. */\n const nextDocument = (url: string): void => {\n if (ended) return;\n document++;\n if (documentBoundaries.length >= MaxDocumentBoundaries) documentBoundariesTruncated = true;\n else\n documentBoundaries.push({\n document,\n observedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n afterSequence: received === 0 ? null : received - 1,\n url: documentUrl(url),\n });\n };\n\n let geometry:\n | { width: number; height: number; viewportWidth: number; viewportHeight: number }\n | undefined;\n\n let nativeStop: CaptureSummary[\"nativeStop\"] = \"unconfirmed\";\n let lease: CaptureLease | undefined;\n\n const finish = (why: string, failure?: BrowserError) => {\n if (ended) return;\n ended = true;\n reason = why;\n error = failure;\n Queue.offerUnsafe(wake, undefined);\n Queue.offerUnsafe(finished, undefined);\n };\n\n const snapshot = (): CaptureSummary => {\n if (target === undefined) throw new Error(\"Capture target was not admitted\");\n\n return CaptureSummary.make({\n target,\n reason,\n received,\n delivered,\n dropped: buffer.dropped + rejected,\n duplicates,\n late,\n peakBufferedFrames: buffer.highWaterFrames,\n peakBufferedBytes: buffer.highWaterBytes,\n bufferedFrames: buffer.size,\n bufferedBytes: buffer.bytes,\n sourceFirstMillis: first ?? null,\n sourceLastMillis: last ?? null,\n initialUrl,\n documentBoundaries: [...documentBoundaries],\n documentBoundariesTruncated,\n nativeStop,\n upstreamDrops: \"unknown\",\n ...(error === undefined ? {} : { error }),\n });\n };\n\n const performStop = yield* Effect.cached(\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n finish(\"stopped\");\n // Wait for an in-flight start before stop. If it will not settle, quarantine this page lease.\n if (startPromise !== undefined && !startSettled) {\n yield* restore(\n Effect.tryPromise({\n try: () => startPromise!,\n catch: () => BrowserError.make({ operation: \"capture-start\", reason: \"provider\" }),\n }).pipe(Effect.timeout(2000), Effect.exit),\n );\n }\n if (source !== undefined) {\n const stopped = yield* restore(\n Effect.tryPromise({\n try: () => source!.stop(),\n catch: () => BrowserError.make({ operation: \"capture-stop\", reason: \"provider\" }),\n }).pipe(Effect.timeout(3000)),\n ).pipe(Effect.exit);\n\n if (Exit.isSuccess(stopped) && startSettled) nativeStop = \"confirmed\";\n } else nativeStop = \"confirmed\";\n // No older attachment may clear a replacement. Unconfirmed native cleanup quarantines only this page.\n if (\n nativeStop === \"confirmed\" &&\n leaseKey !== undefined &&\n lease !== undefined &&\n parent.captureLeases.get(leaseKey) === lease\n ) {\n parent.captureLeases.delete(leaseKey);\n parent.captureReservedBytes = Math.max(\n 0,\n parent.captureReservedBytes - lease.reservedBytes,\n );\n }\n cleanupFinished = true;\n\n return snapshot();\n }),\n ),\n );\n\n // Publish completion only after the cached cleanup Exit has settled. Publishing\n // inside it lets the caller close Scope and interrupt the caching fiber first.\n const stopNative = performStop.pipe(Effect.tap(() => Deferred.succeed(completed, undefined)));\n\n const receive = (frame: NativeFrame): void => {\n if (ended) return;\n if (\n target === undefined ||\n parent.owner.state.generation !== target.generation ||\n parent.owner.state.phase !== \"open\"\n ) {\n finish(\"parent-unavailable\", BrowserError.make({ operation: \"capture\", reason: \"closed\" }));\n\n return;\n }\n const sequence = received++;\n\n try {\n const meta = parseMetadata(frame);\n\n if (!(frame.data instanceof Uint8Array) || frame.data.length > maxFrameBytes) {\n rejected++;\n finish(\"frame-limit\", BrowserError.make({ operation: \"capture\", reason: \"limit\" }));\n\n return;\n }\n if (last !== undefined && meta.timestamp < last) {\n // A newer frame is already accepted, so this one can no longer be presented in order.\n // It is discarded and counted rather than sorted in or given an invented time.\n rejected++;\n late++;\n if (++lateRun > MaxConsecutiveLateFrames) {\n finish(\n \"timestamp-discontinuity\",\n BrowserError.make({ operation: \"capture\", reason: \"timestamp\" }),\n );\n }\n\n return;\n }\n if (last === meta.timestamp) {\n duplicates++;\n rejected++;\n\n return;\n }\n const dimensions = jpegGeometry(frame.data);\n\n if (\n dimensions.width > 16384 ||\n dimensions.height > 16384 ||\n (size !== undefined &&\n (dimensions.width > size.width || dimensions.height > size.height)) ||\n dimensions.width * dimensions.height > 33_554_432 ||\n frame.data[frame.data.length - 2] !== 255 ||\n frame.data[frame.data.length - 1] !== 217\n ) {\n rejected++;\n finish(\"frame-limit\", BrowserError.make({ operation: \"capture\", reason: \"limit\" }));\n\n return;\n }\n if (\n geometry !== undefined &&\n (geometry.width !== dimensions.width ||\n geometry.height !== dimensions.height ||\n geometry.viewportWidth !== meta.viewportWidth ||\n geometry.viewportHeight !== meta.viewportHeight)\n ) {\n rejected++;\n finish(\"resized\", BrowserError.make({ operation: \"capture\", reason: \"resized\" }));\n\n return;\n }\n geometry ??= {\n ...dimensions,\n viewportWidth: meta.viewportWidth,\n viewportHeight: meta.viewportHeight,\n };\n first ??= meta.timestamp;\n last = meta.timestamp;\n lateRun = 0;\n buffer.offer({\n bytes: new Uint8Array(frame.data),\n mediaType: \"image/jpeg\",\n target,\n sequence,\n document,\n sourceTimeMillis: meta.timestamp,\n sourceClock: \"presentation-unix-millis\",\n receivedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n ...dimensions,\n viewportWidth: meta.viewportWidth,\n viewportHeight: meta.viewportHeight,\n });\n Queue.offerUnsafe(wake, undefined);\n } catch {\n rejected++;\n finish(\"malformed-frame\", BrowserError.make({ operation: \"capture\", reason: \"malformed\" }));\n }\n };\n\n yield* parent.owner\n .guard(\n \"capture-start\",\n (ticket) =>\n Effect.gen(function* () {\n const resolved = yield* parent.resolve(ticket, options.target);\n\n // Frames and summaries share this identity with the generation guard. It must not\n // become writable through consumer-owned frame data.\n target = Object.freeze(resolved.target);\n source = resolved.source;\n leaseKey = resolved.key;\n if (parent.captureLeases.has(leaseKey)) {\n return yield* BrowserError.make({\n operation: \"capture\",\n reason: \"busy\",\n outcome: \"undispatched\",\n });\n }\n if (\n parent.captureLeases.size >= MaxParentCaptures ||\n parent.captureReservedBytes + maxBytes > MaxParentBufferedBytes\n ) {\n return yield* BrowserError.make({\n operation: \"capture\",\n reason: \"limit\",\n outcome: \"undispatched\",\n });\n }\n lease = {\n reservedBytes: maxBytes,\n stop: stopNative.pipe(Effect.asVoid),\n invalidate: (why) =>\n finish(\n why,\n BrowserError.make({\n operation: \"capture\",\n reason: why === \"resized\" ? \"resized\" : \"target-changed\",\n }),\n ),\n };\n parent.captureLeases.set(leaseKey, lease);\n parent.captureReservedBytes += maxBytes;\n // Installed before native acquisition. A cancelled capture cannot escape its caller's scope.\n yield* Effect.addFinalizer(() =>\n stopNative.pipe(\n Effect.andThen(\n Effect.sync(() => {\n rejected += buffer.size;\n buffer.clear();\n }),\n ),\n ),\n );\n startSettled = false;\n yield* Effect.tryPromise({\n try: () => {\n startPromise = source!.start({\n receive,\n quality,\n invalidate: (why) => lease?.invalidate(why),\n opened: (url) => {\n initialUrl = documentUrl(url);\n },\n ...(size === undefined ? {} : { size }),\n ...(options.lifetime === \"page\" ? { document: nextDocument } : {}),\n });\n void startPromise.then(\n () => {\n startSettled = true;\n if (\n cleanupFinished &&\n nativeStop === \"unconfirmed\" &&\n leaseKey !== undefined &&\n parent.captureLeases.get(leaseKey) === lease\n ) {\n // One late acquisition cleanup, not a callback-side worker. Keep the page quarantined.\n void source!.stop().catch(() => {});\n }\n },\n () => {\n startSettled = true;\n },\n );\n\n return startPromise;\n },\n catch: () => BrowserError.make({ operation: \"capture-start\", reason: \"provider\" }),\n });\n ticket.check();\n }),\n { charge: false },\n )\n .pipe(\n Effect.onError(() => (lease === undefined ? Effect.void : stopNative.pipe(Effect.asVoid))),\n Effect.onInterrupt(() =>\n lease === undefined ? Effect.void : stopNative.pipe(Effect.asVoid),\n ),\n );\n // One monitor, not a fiber per frame. The finalizer also calls stop directly if this monitor is interrupted.\n // The timeout and explicit-finish branches intentionally carry different\n // values before shared cleanup; preserve the proven first-completion semantics.\n // @effect-diagnostics-next-line raceFirstWithSleepToTimeout:off\n yield* Effect.raceFirst(\n Queue.take(finished).pipe(Effect.as(false)),\n Effect.sleep(duration).pipe(Effect.as(true)),\n ).pipe(\n Effect.tap((expired) => (expired ? Effect.sync(() => finish(\"duration-limit\")) : Effect.void)),\n Effect.andThen(stopNative),\n Effect.forkScoped,\n );\n\n const next: Effect.Effect<CapturedFrame, BrowserError | Cause.Done> = Effect.suspend(() => {\n const frame = buffer.take();\n\n if (frame !== undefined) {\n delivered++;\n\n return Effect.succeed(frame);\n }\n if (ended) return error === undefined ? Cause.done() : Effect.fail(error);\n\n return Queue.take(wake).pipe(Effect.andThen(next));\n });\n\n const frames = Stream.unwrap(\n Effect.suspend(() => {\n if (subscribed)\n return Effect.fail(BrowserError.make({ operation: \"capture-consume\", reason: \"busy\" }));\n subscribed = true;\n\n return Effect.succeed(\n Stream.fromEffectRepeat(next).pipe(Stream.ensuring(stopNative.pipe(Effect.asVoid))),\n );\n }),\n );\n\n return {\n frames,\n stop: stopNative,\n completed: Deferred.await(completed).pipe(Effect.map(snapshot)),\n } satisfies CaptureInterval;\n});\n","import { Effect, Schema, type Scope } from \"effect\";\n\nimport type { BrowserbaseSession } from \"./Browser.ts\";\nimport { PageInfo } from \"./BrowserData.ts\";\nimport { BrowserError } from \"./Errors.ts\";\nimport { captureParent } from \"./internal/browser/Association.ts\";\nimport { startCapture } from \"./internal/capture/Capture.ts\";\nimport type { CaptureInterval, CaptureOptions } from \"./internal/capture/CaptureTypes.ts\";\n\nexport {\n CapturedFrame,\n CaptureOptions,\n CaptureSize,\n CaptureSummary,\n} from \"./internal/capture/CaptureTypes.ts\";\n\nexport type { CaptureInterval } from \"./internal/capture/CaptureTypes.ts\";\n\n/**\n * Capture one remote page independently of the session's selected page.\n *\n * Requires the exact live session returned by the host; copying a session object or decoding\n * a durable reference cannot copy its capture authority. The private owner is not frame data.\n * `CapturedFrame` and `CaptureOptions` are Schema values as well as structural types. Frame\n * decoding checks binary/metadata fields, not the complete JPEG bitstream or target authority,\n * and does not copy bytes. Options decoding preserves omissions; admission applies defaults.\n * `CaptureInterval` remains a live scoped capability, not a schema or JSON/Tool value.\n */\nexport const start = <E>(\n session: BrowserbaseSession<E>,\n options: CaptureOptions = {},\n): Effect.Effect<CaptureInterval, BrowserError, Scope.Scope> =>\n Effect.suspend(() => {\n const parent = captureParent(session);\n\n if (parent === undefined)\n return Effect.fail(BrowserError.make({ operation: \"capture\", reason: \"closed\" }));\n if (options.target === undefined) return startCapture(parent, options);\n\n return Schema.decodeEffect(PageInfo)(options.target, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() =>\n BrowserError.make({\n operation: \"capture\",\n reason: \"configuration\",\n outcome: \"undispatched\",\n }),\n ),\n Effect.flatMap((target) => startCapture(parent, { ...options, target })),\n );\n });\n"],"mappings":"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"}