@effect-agent/platform-cloudflare 0.1.0-beta.32 → 0.1.0-beta.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -704,14 +704,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
704
704
  readonly createdAt: string;
705
705
  readonly deploymentId: string;
706
706
  readonly payload: {
707
- readonly _tag: "SubagentStarted";
708
- readonly runId: string;
709
- readonly toolCallId: string;
710
- readonly childConversationId: string;
711
- readonly childSubmissionId: string;
712
- readonly childReceiptId: string;
713
- readonly childRunId: string;
714
- } | {
715
707
  readonly _tag: "ConversationCreated";
716
708
  readonly agentId: string;
717
709
  readonly definitions: {
@@ -907,6 +899,14 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
907
899
  readonly childConversationId: string;
908
900
  readonly childPrincipal: string;
909
901
  readonly childIdempotencyKey: string;
902
+ } | {
903
+ readonly _tag: "SubagentStarted";
904
+ readonly runId: string;
905
+ readonly toolCallId: string;
906
+ readonly childConversationId: string;
907
+ readonly childSubmissionId: string;
908
+ readonly childReceiptId: string;
909
+ readonly childRunId: string;
910
910
  } | {
911
911
  readonly _tag: "SubagentJoined";
912
912
  readonly runId: string;
@@ -1603,32 +1603,14 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
1603
1603
  readonly conversationId?: string | undefined;
1604
1604
  readonly submissionId?: string | undefined;
1605
1605
  } | {
1606
- readonly _tag: "RetryRefused";
1607
- readonly submissionId: string;
1608
- readonly refusal: "await-approval-decision" | "await-unknown-resolution" | "settled";
1609
- readonly decisionTag: string;
1606
+ readonly _tag: "DigestError";
1610
1607
  readonly message: string;
1608
+ readonly cause?: Schema.Json | undefined;
1611
1609
  } | {
1612
1610
  readonly _tag: "LedgerError";
1613
1611
  readonly operation: string;
1614
1612
  readonly message: string;
1615
1613
  readonly cause?: Schema.Json | undefined;
1616
- } | {
1617
- readonly _tag: "RunJournalError";
1618
- readonly message: string;
1619
- readonly cause?: Schema.Json | undefined;
1620
- } | {
1621
- readonly _tag: "DigestError";
1622
- readonly message: string;
1623
- readonly cause?: Schema.Json | undefined;
1624
- } | {
1625
- readonly _tag: "OwnershipLost";
1626
- readonly submissionId: string;
1627
- readonly actualEpoch: number;
1628
- } | {
1629
- readonly _tag: "SettlementConflict";
1630
- readonly submissionId: string;
1631
- readonly existingOutcome: "aborted" | "completed" | "failed";
1632
1614
  } | {
1633
1615
  readonly _tag: "ConversationStoreError";
1634
1616
  readonly operation: string;
@@ -1660,6 +1642,24 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
1660
1642
  } | {
1661
1643
  readonly _tag: "HostProtocolError";
1662
1644
  readonly message: string;
1645
+ } | {
1646
+ readonly _tag: "SettlementConflict";
1647
+ readonly submissionId: string;
1648
+ readonly existingOutcome: "aborted" | "completed" | "failed";
1649
+ } | {
1650
+ readonly _tag: "RetryRefused";
1651
+ readonly submissionId: string;
1652
+ readonly refusal: "await-approval-decision" | "await-unknown-resolution" | "settled";
1653
+ readonly decisionTag: string;
1654
+ readonly message: string;
1655
+ } | {
1656
+ readonly _tag: "RunJournalError";
1657
+ readonly message: string;
1658
+ readonly cause?: Schema.Json | undefined;
1659
+ } | {
1660
+ readonly _tag: "OwnershipLost";
1661
+ readonly submissionId: string;
1662
+ readonly actualEpoch: number;
1663
1663
  };
1664
1664
  }, Schema.SchemaError, never>;
1665
1665
  declare const decodeAdminResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AdminFailed | ExplainedRecovery | ObligationsScanned | RetryExecuted | VerifiedIntegrity, Schema.SchemaError, never>;
@@ -138,10 +138,20 @@ const makeProductionPage = (page) => {
138
138
  }, selector, maximumBytes),
139
139
  fill: async (selector, value) => {
140
140
  await page.$eval(selector, (element, nextValue) => {
141
- if (!("value" in element)) throw new Error("The selector did not resolve to a fillable field");
141
+ let prototype = Reflect.getPrototypeOf(element);
142
+ let setValue;
143
+ while (prototype !== null) {
144
+ const setter = Reflect.getOwnPropertyDescriptor(prototype, "value")?.set;
145
+ if (typeof setter === "function") {
146
+ setValue = setter;
147
+ break;
148
+ }
149
+ prototype = Reflect.getPrototypeOf(prototype);
150
+ }
151
+ if (setValue === void 0) throw new Error("The selector did not resolve to a fillable field");
142
152
  const focus = Reflect.get(element, "focus");
143
153
  if (typeof focus === "function") Reflect.apply(focus, element, []);
144
- Reflect.set(element, "value", nextValue);
154
+ Reflect.apply(setValue, element, [nextValue]);
145
155
  const dispatchEvent = Reflect.get(element, "dispatchEvent");
146
156
  if (typeof dispatchEvent === "function") {
147
157
  Reflect.apply(dispatchEvent, element, [new Event("input", { bubbles: true })]);
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-browser.mjs","names":[],"sources":["../src/interactive-browser.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport puppeteer, {\n type Browser,\n type BrowserContext,\n type CDPSession,\n type HTTPRequest,\n type Page,\n} from \"@cloudflare/puppeteer\";\nimport {\n BrowserActionResult,\n BrowserScreenshotRequest,\n BrowserScrollRequest,\n BrowserNavigationResult,\n BrowserTextResult,\n InteractiveBrowser,\n InteractiveBrowserActionError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserLimitError,\n InteractiveBrowserPolicy,\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserProtocolError,\n PageScreenshotResult,\n SandboxImplementation,\n type BrowserHandle,\n type InteractiveBrowserError,\n} from \"@effect-agent/sandbox\";\nimport {\n Context,\n Duration,\n Effect,\n Layer,\n Option,\n Redacted,\n Ref,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nexport const browserRunInteractiveImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-run-interactive\",\n});\n\nconst MIN_KEEP_ALIVE_MILLIS = 10_000;\nconst MAX_KEEP_ALIVE_MILLIS = 600_000;\nconst MAX_TEXT_LENGTH = 8 * 1024 * 1024;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\nconst MIN_LIVE_VIEW_EXPIRY_MILLIS = 60_000;\nconst MAX_LIVE_VIEW_EXPIRY_MILLIS = 60 * 60_000;\nconst MAX_HANDOFF_TIMEOUT_MILLIS = 30 * 60_000;\nconst MAX_HOST_TEXT_LENGTH = 8 * 1024;\nconst CLEANUP_STEP_TIMEOUT_MILLIS = 10_000;\nconst CLOSE_SESSION_TIMEOUT_MILLIS = 10_000;\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedHostText = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n);\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\nconst TextObservation = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Text\"), text: BoundedRemoteText }),\n Schema.Struct({ _tag: Schema.Literal(\"MissingElement\") }),\n Schema.Struct({ _tag: Schema.Literal(\"OverLimit\"), observed: Schema.Natural }),\n]);\nconst PngBytes = Schema.Uint8Array.check(\n Schema.isMaxLength(MAX_SCREENSHOT_BYTES),\n Schema.makeFilter(\n (bytes) =>\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a,\n { title: \"PNG bytes\" },\n ),\n);\nconst BrowserRunSessionId = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n Schema.makeFilter((value) => /^[A-Za-z0-9_-]+$/.test(value), {\n title: \"a Browser Run session identifier\",\n }),\n);\nconst LiveViewUrl = Schema.String.check(\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n Schema.makeFilter(\n (value) => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.host === \"live.browser.run\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.pathname === \"/ui/view\" &&\n url.searchParams.get(\"mode\") === \"tab\" &&\n (url.searchParams.get(\"wss\") ?? \"\").startsWith(\"live.browser.run/api/devtools/browser/\")\n );\n } catch {\n return false;\n }\n },\n { title: \"a Cloudflare Live View HTTPS URL\" },\n ),\n);\nconst LiveViewObservation = Schema.Struct({ devtoolsFrontendUrl: LiveViewUrl });\nconst HandoffObservation = Schema.Struct({ handoffId: BoundedHostText });\nconst HandoffDuration = Schema.Natural.check(\n Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS),\n);\nconst HandoffStateObservation = Schema.Union([\n Schema.Struct({\n active: Schema.Literal(true),\n handoffId: BoundedHostText,\n durationMs: HandoffDuration,\n }),\n Schema.Struct({\n active: Schema.Literal(false),\n handoffId: Schema.optionalKey(BoundedHostText),\n durationMs: Schema.optionalKey(HandoffDuration),\n }),\n]);\n\n/** Host-only request for a redacted Cloudflare Live View URL. */\nexport class BrowserRunLiveViewRequest extends Schema.Class<BrowserRunLiveViewRequest>(\n \"BrowserRunLiveViewRequest\",\n)({\n mode: Schema.Literal(\"tab\"),\n expiresInMs: PositiveInt.check(\n Schema.isBetween({\n minimum: MIN_LIVE_VIEW_EXPIRY_MILLIS,\n maximum: MAX_LIVE_VIEW_EXPIRY_MILLIS,\n }),\n ),\n}) {}\n\nexport class BrowserRunLiveViewResult extends Schema.Class<BrowserRunLiveViewResult>(\n \"BrowserRunLiveViewResult\",\n)({ devtoolsFrontendUrl: Schema.Redacted(LiveViewUrl) }) {}\n\n/** Start one bounded handoff; controller ownership remains a consumer concern. */\nexport class BrowserRunHandoffRequest extends Schema.Class<BrowserRunHandoffRequest>(\n \"BrowserRunHandoffRequest\",\n)({\n instructions: BoundedHostText.check(Schema.isMaxLength(1_024)),\n timeout: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS)),\n}) {}\n\nexport class BrowserRunHandoffResult extends Schema.Class<BrowserRunHandoffResult>(\n \"BrowserRunHandoffResult\",\n)({ handoffId: Schema.Redacted(BoundedHostText) }) {}\n\nexport class BrowserRunHandoffState extends Schema.Class<BrowserRunHandoffState>(\n \"BrowserRunHandoffState\",\n)({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.Redacted(BoundedHostText)),\n durationMs: Schema.optionalKey(HandoffDuration),\n}) {}\n\ntype BrowserFailure = typeof InteractiveBrowserError.Type;\ntype BrowserOperation = InteractiveBrowserActionError[\"operation\"];\n\ninterface InteractiveBrowserPolicySnapshot {\n readonly allowedHosts: ReadonlyArray<string>;\n readonly maxActions: number;\n readonly maxElapsedMillis: number;\n readonly maxReturnedBytes: number;\n}\n\n/** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */\nexport interface BrowserRunInteractiveRequest {\n readonly url: () => string;\n readonly abort: () => Promise<void>;\n readonly continue: () => Promise<void>;\n}\n\nexport type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;\n\nexport type BrowserRunCloudflareCommand =\n | \"Cloudflare.getLiveView\"\n | \"Cloudflare.handoff\"\n | \"Cloudflare.getHandoffState\";\n\n/** Narrow CDP boundary for Cloudflare commands absent from the pinned protocol types. */\nexport interface BrowserRunInteractiveCdpSession {\n readonly send: (command: BrowserRunCloudflareCommand, parameters: unknown) => Promise<unknown>;\n readonly detach: () => Promise<void>;\n}\n\n/** Narrow page boundary used by deterministic tests; SDK values remain in this package. */\nexport interface BrowserRunInteractivePage {\n readonly close: () => Promise<void>;\n readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;\n readonly setRequestInterception: (enabled: boolean) => Promise<void>;\n readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly goto: (url: string) => Promise<void>;\n readonly url: () => unknown;\n readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;\n readonly fill: (selector: string, value: string) => Promise<void>;\n readonly click: (selector: string) => Promise<void>;\n readonly screenshot: (fullPage: boolean) => Promise<unknown>;\n readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;\n readonly createCdpSession: () => Promise<BrowserRunInteractiveCdpSession>;\n}\n\nexport interface BrowserRunInteractiveContext {\n readonly newPage: () => Promise<BrowserRunInteractivePage>;\n readonly close: () => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveBrowser {\n readonly createContext: () => Promise<BrowserRunInteractiveContext>;\n readonly close: () => Promise<void>;\n readonly sessionId: () => unknown;\n readonly isConnected: () => boolean;\n readonly onDisconnected: (listener: () => void) => void;\n readonly offDisconnected: (listener: () => void) => void;\n}\n\n/** Host-supplied Browser Run binding projected into one fakeable launch operation. */\nexport class BrowserRunInteractiveBinding extends Context.Service<\n BrowserRunInteractiveBinding,\n {\n readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;\n readonly connect: (sessionId: string) => Promise<BrowserRunInteractiveBrowser>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n }): Layer.Layer<BrowserRunInteractiveBinding> {\n return Layer.succeed(BrowserRunInteractiveBinding)({\n launch: async (keepAliveMillis) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n }),\n ),\n connect: async (sessionId) =>\n makeProductionBrowser(await puppeteer.connect(options.browser, sessionId)),\n });\n }\n}\n\nexport interface BrowserRunInteractiveSession {\n readonly handle: BrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, InteractiveBrowserError>;\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, InteractiveBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, InteractiveBrowserError>;\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\n/** Cloudflare host authority kept separate from the provider-neutral browser handle. */\nexport class BrowserRunInteractiveHost extends Context.Service<\n BrowserRunInteractiveHost,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope>;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveHost\") {}\n\nconst makeProductionRequest = (request: HTTPRequest): BrowserRunInteractiveRequest => ({\n url: () => request.url(),\n abort: () => request.abort(\"blockedbyclient\"),\n continue: () => request.continue(),\n});\n\nconst makeProductionCdpSession = (session: CDPSession): BrowserRunInteractiveCdpSession => ({\n send: async (command, parameters) => {\n const send = Reflect.get(session, \"send\");\n return await Reflect.apply(send, session, [command, parameters]);\n },\n detach: () => session.detach(),\n});\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n return {\n close: () => page.close(),\n setBypassServiceWorker: (enabled) => page.setBypassServiceWorker(enabled),\n setRequestInterception: (enabled) => page.setRequestInterception(enabled),\n onRequest: (listener) => {\n const sdkListener = (request: HTTPRequest) => listener(makeProductionRequest(request));\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n if (sdkListener !== undefined) {\n page.off(\"request\", sdkListener);\n listeners.delete(listener);\n }\n },\n goto: async (url) => {\n await page.goto(url, { waitUntil: \"networkidle0\", timeout: 0 });\n },\n url: () => page.url(),\n readText: (selector, maximumBytes) =>\n page.evaluate(\n (requestedSelector, maximum) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n const element =\n requestedSelector === undefined\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.apply(Reflect.get(pageDocument, \"querySelector\"), pageDocument, [\n requestedSelector,\n ]);\n if (element === null) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n const text =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n const observed = new TextEncoder().encode(text).byteLength;\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n ),\n fill: async (selector, value) => {\n await page.$eval(\n selector,\n (element, nextValue) => {\n if (!(\"value\" in element)) {\n throw new Error(\"The selector did not resolve to a fillable field\");\n }\n const focus = Reflect.get(element, \"focus\");\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.set(element, \"value\", nextValue);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n if (typeof dispatchEvent === \"function\") {\n Reflect.apply(dispatchEvent, element, [new Event(\"input\", { bubbles: true })]);\n Reflect.apply(dispatchEvent, element, [new Event(\"change\", { bubbles: true })]);\n }\n },\n value,\n );\n },\n click: (selector) => page.click(selector),\n // Puppeteer materializes the complete image before returning. The adapter\n // validates the 8 MiB Schema ceiling and pass limit immediately afterward.\n screenshot: (fullPage) => page.screenshot({ type: \"png\", fullPage }),\n scroll: (deltaX, deltaY) =>\n page.evaluate(\n (x, y) => {\n const scrollBy = Reflect.get(globalThis, \"scrollBy\");\n Reflect.apply(scrollBy, globalThis, [{ left: x, top: y, behavior: \"instant\" }]);\n },\n deltaX,\n deltaY,\n ),\n createCdpSession: async () => makeProductionCdpSession(await page.createCDPSession()),\n };\n};\n\nconst makeProductionContext = (context: BrowserContext): BrowserRunInteractiveContext => ({\n newPage: async () => makeProductionPage(await context.newPage()),\n close: () => context.close(),\n});\n\nconst makeProductionBrowser = (browser: Browser): BrowserRunInteractiveBrowser => ({\n createContext: async () => makeProductionContext(await browser.createBrowserContext()),\n close: () => browser.close(),\n sessionId: () => browser.sessionId(),\n isConnected: () => browser.isConnected(),\n onDisconnected: (listener) => {\n browser.on(\"disconnected\", listener);\n },\n offDisconnected: (listener) => {\n browser.off(\"disconnected\", listener);\n },\n});\n\nconst protocolError = (message: string, cause?: unknown): InteractiveBrowserProtocolError =>\n InteractiveBrowserProtocolError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst actionError = (operation: BrowserOperation, cause?: unknown): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation failed`,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst policyError = (message: string): InteractiveBrowserPolicyDeniedError =>\n InteractiveBrowserPolicyDeniedError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n });\n\nconst expiredError = (): InteractiveBrowserExpiredError =>\n InteractiveBrowserExpiredError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The remote browser is no longer usable\",\n });\n\nconst causeText = (cause: unknown): string => {\n if (cause instanceof Error) return cause.message.slice(0, 8_000);\n return String(cause).slice(0, 8_000);\n};\n\nconst isCapacityRefusal = (cause: unknown): boolean =>\n /(^|\\D)429(\\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));\n\nconst isRemoteClosure = (cause: unknown): boolean =>\n /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(\n causeText(cause),\n );\n\nconst snapshotPolicy = (\n input: InteractiveBrowserPolicy,\n): Effect.Effect<InteractiveBrowserPolicySnapshot, InteractiveBrowserPolicyDeniedError> =>\n Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")),\n Effect.map((decoded) =>\n Object.freeze({\n allowedHosts: Object.freeze([...decoded.allowedHosts]),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n }),\n ),\n );\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.allowedHosts.some((host) => host === url.host)\n );\n } catch {\n return false;\n }\n};\n\nconst keepAliveMillis = (policy: InteractiveBrowserPolicySnapshot): number =>\n Math.max(MIN_KEEP_ALIVE_MILLIS, Math.min(MAX_KEEP_ALIVE_MILLIS, policy.maxElapsedMillis));\n\nconst closeLateAcquisition = async <A>(\n signal: AbortSignal,\n acquire: () => Promise<A>,\n close: (acquired: A) => Promise<void>,\n): Promise<A> => {\n const acquired = await acquire();\n if (!signal.aborted) return acquired;\n\n // The SDK does not accept AbortSignal. If an acquisition settles after Effect\n // has interrupted it, ownership never reaches Scope, so close it here instead.\n try {\n await close(acquired);\n } catch {\n // No caller remains to observe a late cleanup failure, and provider details\n // must not escape through an unhandled rejection.\n }\n throw new Error(\"The interrupted browser acquisition completed late\");\n};\n\nconst closeWithWarning = (close: () => Promise<void>, warning: string): Effect.Effect<void> =>\n Effect.tryPromise({\n try: close,\n catch: () => protocolError(warning),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(protocolError(warning)),\n }),\n Effect.catchCause(() => Effect.logWarning(warning)),\n );\n\nconst deadlineError = Effect.fn(\"BrowserRunInteractive.deadlineError\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"elapsed\",\n maximum: policy.maxElapsedMillis,\n observed: Math.max(policy.maxElapsedMillis, now - startedAt),\n message: \"The browser elapsed-time limit was reached\",\n });\n});\n\nconst withinDeadline = Effect.fn(\"BrowserRunInteractive.withinDeadline\")(function* <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n onTimeout?: () => void,\n): Effect.fn.Return<A, E | InteractiveBrowserLimitError, R> {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const elapsed = Math.max(0, now - startedAt);\n const remaining = policy.maxElapsedMillis - elapsed;\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: () =>\n Effect.sync(() => onTimeout?.()).pipe(Effect.andThen(deadlineError(policy, startedAt))),\n }),\n );\n});\n\ninterface HandleState {\n readonly closed: { value: boolean };\n readonly disconnected: { value: boolean };\n readonly uncertain: { value: boolean };\n readonly violation: { value: BrowserFailure | undefined };\n readonly pendingRequests: Set<Promise<void>>;\n}\n\nconst stateFailure = (state: HandleState): BrowserFailure | undefined => {\n if (state.violation.value !== undefined) return state.violation.value;\n if (state.closed.value || state.disconnected.value || state.uncertain.value) {\n return expiredError();\n }\n return undefined;\n};\n\ninterface CloseFailure {\n readonly error: InteractiveBrowserActionError;\n readonly warning: string;\n}\n\ninterface CloseEntry {\n readonly close: Effect.Effect<void, InteractiveBrowserActionError>;\n readonly warning: string;\n}\n\ninterface HandleRuntime {\n readonly handle: BrowserHandle;\n readonly run: <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight?: Effect.Effect<void, BrowserFailure>,\n ) => Effect.Effect<A, BrowserFailure>;\n}\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n return pending.length === 0\n ? Effect.void\n : Effect.promise(() => Promise.all(pending)).pipe(\n Effect.asVoid,\n Effect.andThen(awaitPendingRequests(state)),\n );\n });\n\nconst decodeNavigationResult = Effect.fn(\"BrowserRunInteractive.decodeNavigationResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser navigation URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserNavigationResult)({\n url,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed navigation URL\", cause),\n ),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst decodeActionResult = Effect.fn(\"BrowserRunInteractive.decodeActionResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser page URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n try {\n allowed = hostAllowed(policy, request.url());\n } catch {\n allowed = false;\n }\n if (!allowed) {\n state.violation.value = policyError(\"The browser requested an off-policy URL\");\n }\n\n let settlement: Promise<void>;\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n return;\n }\n const observed = settlement\n .catch(() => {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n })\n .finally(() => {\n state.pendingRequests.delete(observed);\n });\n state.pendingRequests.add(observed);\n };\n\nconst makeHandle = Effect.fn(\"BrowserRunInteractive.makeHandle\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n state: HandleState,\n close: Effect.Effect<void, InteractiveBrowserError>,\n): Effect.fn.Return<HandleRuntime> {\n const permits = yield* Semaphore.make(1);\n const actions = yield* Ref.make(0);\n\n const remote = <A>(operation: BrowserOperation, evaluate: () => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n return expiredError();\n }\n return actionError(operation, cause);\n },\n });\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n const admitted = yield* Ref.modify(actions, (count) =>\n count >= policy.maxActions\n ? [{ allowed: false, observed: count + 1 }, count]\n : [{ allowed: true, observed: count + 1 }, count + 1],\n );\n if (!admitted.allowed) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"actions\",\n maximum: policy.maxActions,\n observed: admitted.observed,\n message: \"The browser action limit was reached\",\n });\n }\n\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\n ),\n ),\n );\n return yield* withinDeadline(completed, policy, startedAt, () => {\n state.uncertain.value = true;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.sync(() => {\n state.uncertain.value = true;\n }),\n ),\n Effect.catch((error) => {\n if (Schema.is(InteractiveBrowserLimitError)(error) && error.limit === \"elapsed\") {\n return Effect.fail(error);\n }\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n InteractiveBrowserBusyError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The browser handle already has an operation in flight\",\n }),\n ),\n ),\n );\n\n const handle: BrowserHandle = {\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n yield* remote(\"navigate\", () => page.goto(request.url));\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n hostAllowed(policy, request.url)\n ? Effect.void\n : Effect.fail(policyError(\"The navigation URL is outside the browser policy\")),\n ),\n ),\n readText: (request) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"read-text\", () =>\n page.readText(request.selector, policy.maxReturnedBytes),\n );\n const observation = yield* Schema.decodeUnknownEffect(TextObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed text observation\", cause),\n ),\n );\n if (observation._tag === \"MissingElement\") {\n return yield* actionError(\"read-text\");\n }\n if (observation._tag === \"OverLimit\") {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: observation.observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n const observed = new TextEncoder().encode(observation.text).byteLength;\n if (observed > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(BrowserTextResult)({\n text: observation.text,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned malformed page text\", cause),\n ),\n );\n }),\n ),\n fill: (request) =>\n run(\n remote(\"fill\", () => page.fill(request.selector, request.value)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n click: (request) =>\n run(\n remote(\"click\", () => page.click(request.selector)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n screenshot: (request) =>\n Schema.decodeUnknownEffect(BrowserScreenshotRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser screenshot request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"screenshot\", () => page.screenshot(decoded.fullPage));\n const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n if (bytes.length > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: bytes.length,\n message: \"The browser screenshot byte limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(PageScreenshotResult)({\n implementation: browserRunInteractiveImplementation,\n mediaType: \"image/png\",\n bytes: new Uint8Array(bytes),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n }),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n scroll: (request) =>\n Schema.decodeUnknownEffect(BrowserScrollRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser scroll request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n remote(\"scroll\", () => page.scroll(decoded.deltaX, decoded.deltaY)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n close,\n };\n return { handle, run };\n});\n\nconst remainingMillis = Effect.fn(\"BrowserRunInteractive.remainingMillis\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return Math.max(0, policy.maxElapsedMillis - Math.max(0, now - startedAt));\n});\n\nconst closeEntry = (close: () => Promise<void>, warning: string): CloseEntry => ({\n close: Effect.tryPromise({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n ),\n warning,\n});\n\nconst syncCloseEntry = (close: () => void, warning: string): CloseEntry => ({\n close: Effect.try({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }),\n warning,\n});\n\nconst runTeardown = (\n entries: ReadonlyArray<CloseEntry>,\n): Effect.Effect<ReadonlyArray<CloseFailure>> =>\n Effect.forEach([...entries].reverse(), (entry) =>\n entry.close.pipe(\n Effect.match({\n onFailure: (error): CloseFailure | undefined => ({ error, warning: entry.warning }),\n onSuccess: (): CloseFailure | undefined => undefined,\n }),\n ),\n ).pipe(Effect.map((failures) => failures.filter((failure) => failure !== undefined)));\n\nconst cdpCommand = <A>(\n page: BrowserRunInteractivePage,\n state: HandleState,\n command: BrowserRunCloudflareCommand,\n parameters: unknown,\n output: Schema.Codec<A>,\n malformedMessage: string,\n): Effect.Effect<A, InteractiveBrowserError> =>\n Effect.scoped(\n Effect.gen(function* () {\n const cdp = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, page.createCdpSession, (acquired) => acquired.detach()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the Cloudflare browser control session failed\", cause),\n }),\n (acquired) =>\n closeWithWarning(\n acquired.detach,\n \"Detaching the Cloudflare browser control session failed\",\n ),\n { interruptible: true },\n );\n const raw = yield* Effect.tryPromise({\n try: () => cdp.send(command, parameters),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"The Cloudflare browser control command failed\", cause),\n });\n return yield* Schema.decodeUnknownEffect(output)(raw).pipe(\n Effect.mapError(() => protocolError(malformedMessage)),\n );\n }),\n );\n\nconst makeHostService = (\n binding: BrowserRunInteractiveBinding[\"Service\"],\n): BrowserRunInteractiveHost[\"Service\"] => {\n const open = Effect.fn(\"BrowserRunInteractiveHost.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope> {\n const fixedPolicy = yield* snapshotPolicy(policy);\n const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const state: HandleState = {\n closed: { value: false },\n disconnected: { value: false },\n uncertain: { value: false },\n violation: { value: undefined },\n pendingRequests: new Set(),\n };\n const lifecycle = {\n managedTeardownInstalled: false,\n explicitCloseInvoked: false,\n };\n const closers: Array<CloseEntry> = [];\n const releaseBeforeManaged = (entry: CloseEntry): Effect.Effect<void> =>\n Effect.suspend(() =>\n lifecycle.managedTeardownInstalled\n ? Effect.void\n : entry.close.pipe(Effect.catchCause(() => Effect.logWarning(entry.warning))),\n );\n\n const browser = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.launch(keepAliveMillis(fixedPolicy)),\n (acquired) => acquired.close(),\n ),\n catch: (cause) =>\n isCapacityRefusal(cause)\n ? InteractiveBrowserCapacityError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"Browser Run has no capacity for a new browser session\",\n })\n : protocolError(\"Launching the Browser Run session failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) => {\n state.disconnected.value = true;\n return releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser failed\"),\n );\n },\n { interruptible: true },\n );\n closers.push(closeEntry(browser.close, \"Closing the interactive browser failed\"));\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => browser.onDisconnected(disconnected),\n catch: (cause) => protocolError(\"Installing the browser disconnect listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n );\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) => protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n if (!connected) {\n state.disconnected.value = true;\n return yield* expiredError();\n }\n\n const sessionIdValue = yield* Effect.try({\n try: browser.sessionId,\n catch: (cause) => protocolError(\"Reading the Browser Run session identity failed\", cause),\n }).pipe(\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(BrowserRunSessionId)(value).pipe(\n Effect.mapError(() => protocolError(\"The Browser Run session identity was malformed\")),\n ),\n ),\n );\n\n const context = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, browser.createContext, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser context failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser context failed\"),\n ),\n { interruptible: true },\n );\n closers.push(closeEntry(context.close, \"Closing the interactive browser context failed\"));\n const page = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, context.newPage, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser page failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser page failed\"),\n ),\n { interruptible: true },\n );\n closers.push(closeEntry(page.close, \"Closing the interactive browser page failed\"));\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setBypassServiceWorker(true),\n catch: (cause) => protocolError(\"Bypassing browser service workers failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n const requestListener = makeRequestListener(fixedPolicy, state);\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => page.onRequest(requestListener),\n catch: (cause) => protocolError(\"Installing the browser request listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setRequestInterception(true),\n catch: (cause) => protocolError(\"Installing the browser request policy failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n yield* withinDeadline(awaitPendingRequests(state), fixedPolicy, startedAt);\n const setupFailure = stateFailure(state);\n if (setupFailure !== undefined) return yield* setupFailure;\n\n const teardown = yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const cached = yield* Effect.cached(runTeardown(closers));\n lifecycle.managedTeardownInstalled = true;\n yield* Effect.addFinalizer(() =>\n Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(cached),\n Effect.flatMap((failures) =>\n lifecycle.explicitCloseInvoked\n ? Effect.void\n : Effect.forEach(failures, (failure) => Effect.logWarning(failure.warning)).pipe(\n Effect.asVoid,\n ),\n ),\n ),\n ),\n );\n return cached;\n }),\n );\n\n const close: Effect.Effect<void, InteractiveBrowserError> = Effect.uninterruptible(\n Effect.sync(() => {\n lifecycle.explicitCloseInvoked = true;\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(teardown),\n Effect.flatMap((failures) =>\n failures[0] === undefined ? Effect.void : Effect.fail(failures[0].error),\n ),\n ),\n );\n\n const runtime = yield* makeHandle(page, fixedPolicy, startedAt, state, close);\n const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);\n const requestFitsSession = (requestedMillis: number): Effect.Effect<void, BrowserFailure> =>\n remainingMillis(fixedPolicy, startedAt).pipe(\n Effect.flatMap((remaining) =>\n remaining > 0 && requestedMillis <= remaining\n ? Effect.void\n : Effect.fail(\n policyError(\"The host browser request exceeds the remaining session time\"),\n ),\n ),\n );\n\n return {\n handle: runtime.handle,\n sessionId: Redacted.make(sessionIdValue),\n getLiveView: (request) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The Live View request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getLiveView\",\n { mode: decoded.mode, expiresInMs: decoded.expiresInMs },\n LiveViewObservation,\n \"Cloudflare returned a malformed Live View response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed Live View response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.expiresInMs))),\n ),\n ),\n ),\n handoff: (request) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser handoff request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.handoff\",\n { instructions: decoded.instructions, timeout: decoded.timeout },\n HandoffObservation,\n \"Cloudflare returned a malformed browser handoff response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffResult)({\n handoffId: Redacted.make(observation.handoffId),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.timeout))),\n ),\n ),\n ),\n getHandoffState: runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getHandoffState\",\n {},\n HandoffStateObservation,\n \"Cloudflare returned a malformed browser handoff state\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffState)({\n active: observation.active,\n ...(observation.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(observation.handoffId) }),\n ...(observation.durationMs === undefined\n ? {}\n : { durationMs: observation.durationMs }),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff state\"),\n ),\n ),\n ),\n ),\n currentPagePreflight,\n ),\n close,\n };\n });\n\n const closeSession = Effect.fn(\"BrowserRunInteractiveHost.closeSession\")(function* (\n sessionId: Redacted.Redacted<string>,\n ) {\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Redacted(BrowserRunSessionId))(\n sessionId,\n ).pipe(\n Effect.mapError(() => policyError(\"The Browser Run cleanup session identity is malformed\")),\n );\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const closeAttempted = { value: false };\n const browser = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.connect(Redacted.value(decoded)),\n (acquired) => acquired.close(),\n ),\n catch: (cause) => actionError(\"close\", cause),\n }),\n (acquired) =>\n closeAttempted.value\n ? Effect.void\n : closeWithWarning(acquired.close, \"Closing the leaked Browser Run session failed\"),\n { interruptible: true },\n );\n return yield* Effect.tryPromise({\n try: () => {\n // Mark and start are synchronous so interruption cannot suppress the\n // Scope fallback before the one remote close attempt begins.\n closeAttempted.value = true;\n return browser.close();\n },\n catch: (cause) => actionError(\"close\", cause),\n });\n }),\n ).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLOSE_SESSION_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n );\n });\n\n return BrowserRunInteractiveHost.of({ open, closeSession });\n};\n\n/** Cloudflare host controls and private session identity for one scoped Browser Run pass. */\nexport const browserRunInteractiveHostLayer = (): Layer.Layer<\n BrowserRunInteractiveHost,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n BrowserRunInteractiveHost,\n Effect.gen(function* () {\n return makeHostService(yield* BrowserRunInteractiveBinding);\n }),\n );\n\n/** Worker-only generic adapter; Cloudflare identity and controls remain host-only. */\nexport const browserRunInteractiveLayer = (): Layer.Layer<\n InteractiveBrowser,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n InteractiveBrowser,\n Effect.gen(function* () {\n const binding = yield* BrowserRunInteractiveBinding;\n const host = makeHostService(binding);\n return InteractiveBrowser.of({\n open: (policy) => host.open(policy).pipe(Effect.map((session) => session.handle)),\n });\n }),\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"interactive-browser.mjs","names":[],"sources":["../src/interactive-browser.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport puppeteer, {\n type Browser,\n type BrowserContext,\n type CDPSession,\n type HTTPRequest,\n type Page,\n} from \"@cloudflare/puppeteer\";\nimport {\n BrowserActionResult,\n BrowserScreenshotRequest,\n BrowserScrollRequest,\n BrowserNavigationResult,\n BrowserTextResult,\n InteractiveBrowser,\n InteractiveBrowserActionError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserLimitError,\n InteractiveBrowserPolicy,\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserProtocolError,\n PageScreenshotResult,\n SandboxImplementation,\n type BrowserHandle,\n type InteractiveBrowserError,\n} from \"@effect-agent/sandbox\";\nimport {\n Context,\n Duration,\n Effect,\n Layer,\n Option,\n Redacted,\n Ref,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nexport const browserRunInteractiveImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-run-interactive\",\n});\n\nconst MIN_KEEP_ALIVE_MILLIS = 10_000;\nconst MAX_KEEP_ALIVE_MILLIS = 600_000;\nconst MAX_TEXT_LENGTH = 8 * 1024 * 1024;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\nconst MIN_LIVE_VIEW_EXPIRY_MILLIS = 60_000;\nconst MAX_LIVE_VIEW_EXPIRY_MILLIS = 60 * 60_000;\nconst MAX_HANDOFF_TIMEOUT_MILLIS = 30 * 60_000;\nconst MAX_HOST_TEXT_LENGTH = 8 * 1024;\nconst CLEANUP_STEP_TIMEOUT_MILLIS = 10_000;\nconst CLOSE_SESSION_TIMEOUT_MILLIS = 10_000;\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedHostText = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n);\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\nconst TextObservation = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Text\"), text: BoundedRemoteText }),\n Schema.Struct({ _tag: Schema.Literal(\"MissingElement\") }),\n Schema.Struct({ _tag: Schema.Literal(\"OverLimit\"), observed: Schema.Natural }),\n]);\nconst PngBytes = Schema.Uint8Array.check(\n Schema.isMaxLength(MAX_SCREENSHOT_BYTES),\n Schema.makeFilter(\n (bytes) =>\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a,\n { title: \"PNG bytes\" },\n ),\n);\nconst BrowserRunSessionId = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n Schema.makeFilter((value) => /^[A-Za-z0-9_-]+$/.test(value), {\n title: \"a Browser Run session identifier\",\n }),\n);\nconst LiveViewUrl = Schema.String.check(\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n Schema.makeFilter(\n (value) => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.host === \"live.browser.run\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.pathname === \"/ui/view\" &&\n url.searchParams.get(\"mode\") === \"tab\" &&\n (url.searchParams.get(\"wss\") ?? \"\").startsWith(\"live.browser.run/api/devtools/browser/\")\n );\n } catch {\n return false;\n }\n },\n { title: \"a Cloudflare Live View HTTPS URL\" },\n ),\n);\nconst LiveViewObservation = Schema.Struct({ devtoolsFrontendUrl: LiveViewUrl });\nconst HandoffObservation = Schema.Struct({ handoffId: BoundedHostText });\nconst HandoffDuration = Schema.Natural.check(\n Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS),\n);\nconst HandoffStateObservation = Schema.Union([\n Schema.Struct({\n active: Schema.Literal(true),\n handoffId: BoundedHostText,\n durationMs: HandoffDuration,\n }),\n Schema.Struct({\n active: Schema.Literal(false),\n handoffId: Schema.optionalKey(BoundedHostText),\n durationMs: Schema.optionalKey(HandoffDuration),\n }),\n]);\n\n/** Host-only request for a redacted Cloudflare Live View URL. */\nexport class BrowserRunLiveViewRequest extends Schema.Class<BrowserRunLiveViewRequest>(\n \"BrowserRunLiveViewRequest\",\n)({\n mode: Schema.Literal(\"tab\"),\n expiresInMs: PositiveInt.check(\n Schema.isBetween({\n minimum: MIN_LIVE_VIEW_EXPIRY_MILLIS,\n maximum: MAX_LIVE_VIEW_EXPIRY_MILLIS,\n }),\n ),\n}) {}\n\nexport class BrowserRunLiveViewResult extends Schema.Class<BrowserRunLiveViewResult>(\n \"BrowserRunLiveViewResult\",\n)({ devtoolsFrontendUrl: Schema.Redacted(LiveViewUrl) }) {}\n\n/** Start one bounded handoff; controller ownership remains a consumer concern. */\nexport class BrowserRunHandoffRequest extends Schema.Class<BrowserRunHandoffRequest>(\n \"BrowserRunHandoffRequest\",\n)({\n instructions: BoundedHostText.check(Schema.isMaxLength(1_024)),\n timeout: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS)),\n}) {}\n\nexport class BrowserRunHandoffResult extends Schema.Class<BrowserRunHandoffResult>(\n \"BrowserRunHandoffResult\",\n)({ handoffId: Schema.Redacted(BoundedHostText) }) {}\n\nexport class BrowserRunHandoffState extends Schema.Class<BrowserRunHandoffState>(\n \"BrowserRunHandoffState\",\n)({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.Redacted(BoundedHostText)),\n durationMs: Schema.optionalKey(HandoffDuration),\n}) {}\n\ntype BrowserFailure = typeof InteractiveBrowserError.Type;\ntype BrowserOperation = InteractiveBrowserActionError[\"operation\"];\n\ninterface InteractiveBrowserPolicySnapshot {\n readonly allowedHosts: ReadonlyArray<string>;\n readonly maxActions: number;\n readonly maxElapsedMillis: number;\n readonly maxReturnedBytes: number;\n}\n\n/** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */\nexport interface BrowserRunInteractiveRequest {\n readonly url: () => string;\n readonly abort: () => Promise<void>;\n readonly continue: () => Promise<void>;\n}\n\nexport type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;\n\nexport type BrowserRunCloudflareCommand =\n | \"Cloudflare.getLiveView\"\n | \"Cloudflare.handoff\"\n | \"Cloudflare.getHandoffState\";\n\n/** Narrow CDP boundary for Cloudflare commands absent from the pinned protocol types. */\nexport interface BrowserRunInteractiveCdpSession {\n readonly send: (command: BrowserRunCloudflareCommand, parameters: unknown) => Promise<unknown>;\n readonly detach: () => Promise<void>;\n}\n\n/** Narrow page boundary used by deterministic tests; SDK values remain in this package. */\nexport interface BrowserRunInteractivePage {\n readonly close: () => Promise<void>;\n readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;\n readonly setRequestInterception: (enabled: boolean) => Promise<void>;\n readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly goto: (url: string) => Promise<void>;\n readonly url: () => unknown;\n readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;\n readonly fill: (selector: string, value: string) => Promise<void>;\n readonly click: (selector: string) => Promise<void>;\n readonly screenshot: (fullPage: boolean) => Promise<unknown>;\n readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;\n readonly createCdpSession: () => Promise<BrowserRunInteractiveCdpSession>;\n}\n\nexport interface BrowserRunInteractiveContext {\n readonly newPage: () => Promise<BrowserRunInteractivePage>;\n readonly close: () => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveBrowser {\n readonly createContext: () => Promise<BrowserRunInteractiveContext>;\n readonly close: () => Promise<void>;\n readonly sessionId: () => unknown;\n readonly isConnected: () => boolean;\n readonly onDisconnected: (listener: () => void) => void;\n readonly offDisconnected: (listener: () => void) => void;\n}\n\n/** Host-supplied Browser Run binding projected into one fakeable launch operation. */\nexport class BrowserRunInteractiveBinding extends Context.Service<\n BrowserRunInteractiveBinding,\n {\n readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;\n readonly connect: (sessionId: string) => Promise<BrowserRunInteractiveBrowser>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n }): Layer.Layer<BrowserRunInteractiveBinding> {\n return Layer.succeed(BrowserRunInteractiveBinding)({\n launch: async (keepAliveMillis) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n }),\n ),\n connect: async (sessionId) =>\n makeProductionBrowser(await puppeteer.connect(options.browser, sessionId)),\n });\n }\n}\n\nexport interface BrowserRunInteractiveSession {\n readonly handle: BrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, InteractiveBrowserError>;\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, InteractiveBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, InteractiveBrowserError>;\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\n/** Cloudflare host authority kept separate from the provider-neutral browser handle. */\nexport class BrowserRunInteractiveHost extends Context.Service<\n BrowserRunInteractiveHost,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope>;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveHost\") {}\n\nconst makeProductionRequest = (request: HTTPRequest): BrowserRunInteractiveRequest => ({\n url: () => request.url(),\n abort: () => request.abort(\"blockedbyclient\"),\n continue: () => request.continue(),\n});\n\nconst makeProductionCdpSession = (session: CDPSession): BrowserRunInteractiveCdpSession => ({\n send: async (command, parameters) => {\n const send = Reflect.get(session, \"send\");\n return await Reflect.apply(send, session, [command, parameters]);\n },\n detach: () => session.detach(),\n});\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n return {\n close: () => page.close(),\n setBypassServiceWorker: (enabled) => page.setBypassServiceWorker(enabled),\n setRequestInterception: (enabled) => page.setRequestInterception(enabled),\n onRequest: (listener) => {\n const sdkListener = (request: HTTPRequest) => listener(makeProductionRequest(request));\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n if (sdkListener !== undefined) {\n page.off(\"request\", sdkListener);\n listeners.delete(listener);\n }\n },\n goto: async (url) => {\n await page.goto(url, { waitUntil: \"networkidle0\", timeout: 0 });\n },\n url: () => page.url(),\n readText: (selector, maximumBytes) =>\n page.evaluate(\n (requestedSelector, maximum) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n const element =\n requestedSelector === undefined\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.apply(Reflect.get(pageDocument, \"querySelector\"), pageDocument, [\n requestedSelector,\n ]);\n if (element === null) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n const text =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n const observed = new TextEncoder().encode(text).byteLength;\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n ),\n fill: async (selector, value) => {\n await page.$eval(\n selector,\n (element, nextValue) => {\n // Bypass instance setters so React can detect the change when events fire.\n let prototype = Reflect.getPrototypeOf(element);\n let setValue: ((value: string) => void) | undefined;\n while (prototype !== null) {\n const setter = Reflect.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n if (typeof setter === \"function\") {\n setValue = setter;\n break;\n }\n prototype = Reflect.getPrototypeOf(prototype);\n }\n if (setValue === undefined) {\n throw new Error(\"The selector did not resolve to a fillable field\");\n }\n const focus = Reflect.get(element, \"focus\");\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.apply(setValue, element, [nextValue]);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n if (typeof dispatchEvent === \"function\") {\n Reflect.apply(dispatchEvent, element, [new Event(\"input\", { bubbles: true })]);\n Reflect.apply(dispatchEvent, element, [new Event(\"change\", { bubbles: true })]);\n }\n },\n value,\n );\n },\n click: (selector) => page.click(selector),\n // Puppeteer materializes the complete image before returning. The adapter\n // validates the 8 MiB Schema ceiling and pass limit immediately afterward.\n screenshot: (fullPage) => page.screenshot({ type: \"png\", fullPage }),\n scroll: (deltaX, deltaY) =>\n page.evaluate(\n (x, y) => {\n const scrollBy = Reflect.get(globalThis, \"scrollBy\");\n Reflect.apply(scrollBy, globalThis, [{ left: x, top: y, behavior: \"instant\" }]);\n },\n deltaX,\n deltaY,\n ),\n createCdpSession: async () => makeProductionCdpSession(await page.createCDPSession()),\n };\n};\n\nconst makeProductionContext = (context: BrowserContext): BrowserRunInteractiveContext => ({\n newPage: async () => makeProductionPage(await context.newPage()),\n close: () => context.close(),\n});\n\nconst makeProductionBrowser = (browser: Browser): BrowserRunInteractiveBrowser => ({\n createContext: async () => makeProductionContext(await browser.createBrowserContext()),\n close: () => browser.close(),\n sessionId: () => browser.sessionId(),\n isConnected: () => browser.isConnected(),\n onDisconnected: (listener) => {\n browser.on(\"disconnected\", listener);\n },\n offDisconnected: (listener) => {\n browser.off(\"disconnected\", listener);\n },\n});\n\nconst protocolError = (message: string, cause?: unknown): InteractiveBrowserProtocolError =>\n InteractiveBrowserProtocolError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst actionError = (operation: BrowserOperation, cause?: unknown): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation failed`,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst policyError = (message: string): InteractiveBrowserPolicyDeniedError =>\n InteractiveBrowserPolicyDeniedError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n });\n\nconst expiredError = (): InteractiveBrowserExpiredError =>\n InteractiveBrowserExpiredError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The remote browser is no longer usable\",\n });\n\nconst causeText = (cause: unknown): string => {\n if (cause instanceof Error) return cause.message.slice(0, 8_000);\n return String(cause).slice(0, 8_000);\n};\n\nconst isCapacityRefusal = (cause: unknown): boolean =>\n /(^|\\D)429(\\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));\n\nconst isRemoteClosure = (cause: unknown): boolean =>\n /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(\n causeText(cause),\n );\n\nconst snapshotPolicy = (\n input: InteractiveBrowserPolicy,\n): Effect.Effect<InteractiveBrowserPolicySnapshot, InteractiveBrowserPolicyDeniedError> =>\n Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")),\n Effect.map((decoded) =>\n Object.freeze({\n allowedHosts: Object.freeze([...decoded.allowedHosts]),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n }),\n ),\n );\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n try {\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.allowedHosts.some((host) => host === url.host)\n );\n } catch {\n return false;\n }\n};\n\nconst keepAliveMillis = (policy: InteractiveBrowserPolicySnapshot): number =>\n Math.max(MIN_KEEP_ALIVE_MILLIS, Math.min(MAX_KEEP_ALIVE_MILLIS, policy.maxElapsedMillis));\n\nconst closeLateAcquisition = async <A>(\n signal: AbortSignal,\n acquire: () => Promise<A>,\n close: (acquired: A) => Promise<void>,\n): Promise<A> => {\n const acquired = await acquire();\n if (!signal.aborted) return acquired;\n\n // The SDK does not accept AbortSignal. If an acquisition settles after Effect\n // has interrupted it, ownership never reaches Scope, so close it here instead.\n try {\n await close(acquired);\n } catch {\n // No caller remains to observe a late cleanup failure, and provider details\n // must not escape through an unhandled rejection.\n }\n throw new Error(\"The interrupted browser acquisition completed late\");\n};\n\nconst closeWithWarning = (close: () => Promise<void>, warning: string): Effect.Effect<void> =>\n Effect.tryPromise({\n try: close,\n catch: () => protocolError(warning),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(protocolError(warning)),\n }),\n Effect.catchCause(() => Effect.logWarning(warning)),\n );\n\nconst deadlineError = Effect.fn(\"BrowserRunInteractive.deadlineError\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"elapsed\",\n maximum: policy.maxElapsedMillis,\n observed: Math.max(policy.maxElapsedMillis, now - startedAt),\n message: \"The browser elapsed-time limit was reached\",\n });\n});\n\nconst withinDeadline = Effect.fn(\"BrowserRunInteractive.withinDeadline\")(function* <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n onTimeout?: () => void,\n): Effect.fn.Return<A, E | InteractiveBrowserLimitError, R> {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const elapsed = Math.max(0, now - startedAt);\n const remaining = policy.maxElapsedMillis - elapsed;\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: () =>\n Effect.sync(() => onTimeout?.()).pipe(Effect.andThen(deadlineError(policy, startedAt))),\n }),\n );\n});\n\ninterface HandleState {\n readonly closed: { value: boolean };\n readonly disconnected: { value: boolean };\n readonly uncertain: { value: boolean };\n readonly violation: { value: BrowserFailure | undefined };\n readonly pendingRequests: Set<Promise<void>>;\n}\n\nconst stateFailure = (state: HandleState): BrowserFailure | undefined => {\n if (state.violation.value !== undefined) return state.violation.value;\n if (state.closed.value || state.disconnected.value || state.uncertain.value) {\n return expiredError();\n }\n return undefined;\n};\n\ninterface CloseFailure {\n readonly error: InteractiveBrowserActionError;\n readonly warning: string;\n}\n\ninterface CloseEntry {\n readonly close: Effect.Effect<void, InteractiveBrowserActionError>;\n readonly warning: string;\n}\n\ninterface HandleRuntime {\n readonly handle: BrowserHandle;\n readonly run: <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight?: Effect.Effect<void, BrowserFailure>,\n ) => Effect.Effect<A, BrowserFailure>;\n}\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n return pending.length === 0\n ? Effect.void\n : Effect.promise(() => Promise.all(pending)).pipe(\n Effect.asVoid,\n Effect.andThen(awaitPendingRequests(state)),\n );\n });\n\nconst decodeNavigationResult = Effect.fn(\"BrowserRunInteractive.decodeNavigationResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser navigation URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserNavigationResult)({\n url,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed navigation URL\", cause),\n ),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst decodeActionResult = Effect.fn(\"BrowserRunInteractive.decodeActionResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser page URL failed\", cause),\n });\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n try {\n allowed = hostAllowed(policy, request.url());\n } catch {\n allowed = false;\n }\n if (!allowed) {\n state.violation.value = policyError(\"The browser requested an off-policy URL\");\n }\n\n let settlement: Promise<void>;\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n return;\n }\n const observed = settlement\n .catch(() => {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n })\n .finally(() => {\n state.pendingRequests.delete(observed);\n });\n state.pendingRequests.add(observed);\n };\n\nconst makeHandle = Effect.fn(\"BrowserRunInteractive.makeHandle\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n state: HandleState,\n close: Effect.Effect<void, InteractiveBrowserError>,\n): Effect.fn.Return<HandleRuntime> {\n const permits = yield* Semaphore.make(1);\n const actions = yield* Ref.make(0);\n\n const remote = <A>(operation: BrowserOperation, evaluate: () => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n return expiredError();\n }\n return actionError(operation, cause);\n },\n });\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n const admitted = yield* Ref.modify(actions, (count) =>\n count >= policy.maxActions\n ? [{ allowed: false, observed: count + 1 }, count]\n : [{ allowed: true, observed: count + 1 }, count + 1],\n );\n if (!admitted.allowed) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"actions\",\n maximum: policy.maxActions,\n observed: admitted.observed,\n message: \"The browser action limit was reached\",\n });\n }\n\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\n ),\n ),\n );\n return yield* withinDeadline(completed, policy, startedAt, () => {\n state.uncertain.value = true;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.sync(() => {\n state.uncertain.value = true;\n }),\n ),\n Effect.catch((error) => {\n if (Schema.is(InteractiveBrowserLimitError)(error) && error.limit === \"elapsed\") {\n return Effect.fail(error);\n }\n const failure = stateFailure(state);\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n InteractiveBrowserBusyError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The browser handle already has an operation in flight\",\n }),\n ),\n ),\n );\n\n const handle: BrowserHandle = {\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n yield* remote(\"navigate\", () => page.goto(request.url));\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n hostAllowed(policy, request.url)\n ? Effect.void\n : Effect.fail(policyError(\"The navigation URL is outside the browser policy\")),\n ),\n ),\n readText: (request) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"read-text\", () =>\n page.readText(request.selector, policy.maxReturnedBytes),\n );\n const observation = yield* Schema.decodeUnknownEffect(TextObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed text observation\", cause),\n ),\n );\n if (observation._tag === \"MissingElement\") {\n return yield* actionError(\"read-text\");\n }\n if (observation._tag === \"OverLimit\") {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: observation.observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n const observed = new TextEncoder().encode(observation.text).byteLength;\n if (observed > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(BrowserTextResult)({\n text: observation.text,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned malformed page text\", cause),\n ),\n );\n }),\n ),\n fill: (request) =>\n run(\n remote(\"fill\", () => page.fill(request.selector, request.value)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n click: (request) =>\n run(\n remote(\"click\", () => page.click(request.selector)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n ),\n screenshot: (request) =>\n Schema.decodeUnknownEffect(BrowserScreenshotRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser screenshot request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"screenshot\", () => page.screenshot(decoded.fullPage));\n const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n if (bytes.length > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: bytes.length,\n message: \"The browser screenshot byte limit was reached\",\n });\n }\n return yield* Schema.decodeUnknownEffect(PageScreenshotResult)({\n implementation: browserRunInteractiveImplementation,\n mediaType: \"image/png\",\n bytes: new Uint8Array(bytes),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n }),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n scroll: (request) =>\n Schema.decodeUnknownEffect(BrowserScrollRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser scroll request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n remote(\"scroll\", () => page.scroll(decoded.deltaX, decoded.deltaY)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n close,\n };\n return { handle, run };\n});\n\nconst remainingMillis = Effect.fn(\"BrowserRunInteractive.remainingMillis\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n return Math.max(0, policy.maxElapsedMillis - Math.max(0, now - startedAt));\n});\n\nconst closeEntry = (close: () => Promise<void>, warning: string): CloseEntry => ({\n close: Effect.tryPromise({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n ),\n warning,\n});\n\nconst syncCloseEntry = (close: () => void, warning: string): CloseEntry => ({\n close: Effect.try({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }),\n warning,\n});\n\nconst runTeardown = (\n entries: ReadonlyArray<CloseEntry>,\n): Effect.Effect<ReadonlyArray<CloseFailure>> =>\n Effect.forEach([...entries].reverse(), (entry) =>\n entry.close.pipe(\n Effect.match({\n onFailure: (error): CloseFailure | undefined => ({ error, warning: entry.warning }),\n onSuccess: (): CloseFailure | undefined => undefined,\n }),\n ),\n ).pipe(Effect.map((failures) => failures.filter((failure) => failure !== undefined)));\n\nconst cdpCommand = <A>(\n page: BrowserRunInteractivePage,\n state: HandleState,\n command: BrowserRunCloudflareCommand,\n parameters: unknown,\n output: Schema.Codec<A>,\n malformedMessage: string,\n): Effect.Effect<A, InteractiveBrowserError> =>\n Effect.scoped(\n Effect.gen(function* () {\n const cdp = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, page.createCdpSession, (acquired) => acquired.detach()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the Cloudflare browser control session failed\", cause),\n }),\n (acquired) =>\n closeWithWarning(\n acquired.detach,\n \"Detaching the Cloudflare browser control session failed\",\n ),\n { interruptible: true },\n );\n const raw = yield* Effect.tryPromise({\n try: () => cdp.send(command, parameters),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"The Cloudflare browser control command failed\", cause),\n });\n return yield* Schema.decodeUnknownEffect(output)(raw).pipe(\n Effect.mapError(() => protocolError(malformedMessage)),\n );\n }),\n );\n\nconst makeHostService = (\n binding: BrowserRunInteractiveBinding[\"Service\"],\n): BrowserRunInteractiveHost[\"Service\"] => {\n const open = Effect.fn(\"BrowserRunInteractiveHost.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope> {\n const fixedPolicy = yield* snapshotPolicy(policy);\n const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const state: HandleState = {\n closed: { value: false },\n disconnected: { value: false },\n uncertain: { value: false },\n violation: { value: undefined },\n pendingRequests: new Set(),\n };\n const lifecycle = {\n managedTeardownInstalled: false,\n explicitCloseInvoked: false,\n };\n const closers: Array<CloseEntry> = [];\n const releaseBeforeManaged = (entry: CloseEntry): Effect.Effect<void> =>\n Effect.suspend(() =>\n lifecycle.managedTeardownInstalled\n ? Effect.void\n : entry.close.pipe(Effect.catchCause(() => Effect.logWarning(entry.warning))),\n );\n\n const browser = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.launch(keepAliveMillis(fixedPolicy)),\n (acquired) => acquired.close(),\n ),\n catch: (cause) =>\n isCapacityRefusal(cause)\n ? InteractiveBrowserCapacityError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"Browser Run has no capacity for a new browser session\",\n })\n : protocolError(\"Launching the Browser Run session failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) => {\n state.disconnected.value = true;\n return releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser failed\"),\n );\n },\n { interruptible: true },\n );\n closers.push(closeEntry(browser.close, \"Closing the interactive browser failed\"));\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => browser.onDisconnected(disconnected),\n catch: (cause) => protocolError(\"Installing the browser disconnect listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n );\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) => protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n if (!connected) {\n state.disconnected.value = true;\n return yield* expiredError();\n }\n\n const sessionIdValue = yield* Effect.try({\n try: browser.sessionId,\n catch: (cause) => protocolError(\"Reading the Browser Run session identity failed\", cause),\n }).pipe(\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(BrowserRunSessionId)(value).pipe(\n Effect.mapError(() => protocolError(\"The Browser Run session identity was malformed\")),\n ),\n ),\n );\n\n const context = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, browser.createContext, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser context failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser context failed\"),\n ),\n { interruptible: true },\n );\n closers.push(closeEntry(context.close, \"Closing the interactive browser context failed\"));\n const page = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, context.newPage, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser page failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser page failed\"),\n ),\n { interruptible: true },\n );\n closers.push(closeEntry(page.close, \"Closing the interactive browser page failed\"));\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setBypassServiceWorker(true),\n catch: (cause) => protocolError(\"Bypassing browser service workers failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n const requestListener = makeRequestListener(fixedPolicy, state);\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => page.onRequest(requestListener),\n catch: (cause) => protocolError(\"Installing the browser request listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setRequestInterception(true),\n catch: (cause) => protocolError(\"Installing the browser request policy failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n yield* withinDeadline(awaitPendingRequests(state), fixedPolicy, startedAt);\n const setupFailure = stateFailure(state);\n if (setupFailure !== undefined) return yield* setupFailure;\n\n const teardown = yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const cached = yield* Effect.cached(runTeardown(closers));\n lifecycle.managedTeardownInstalled = true;\n yield* Effect.addFinalizer(() =>\n Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(cached),\n Effect.flatMap((failures) =>\n lifecycle.explicitCloseInvoked\n ? Effect.void\n : Effect.forEach(failures, (failure) => Effect.logWarning(failure.warning)).pipe(\n Effect.asVoid,\n ),\n ),\n ),\n ),\n );\n return cached;\n }),\n );\n\n const close: Effect.Effect<void, InteractiveBrowserError> = Effect.uninterruptible(\n Effect.sync(() => {\n lifecycle.explicitCloseInvoked = true;\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(teardown),\n Effect.flatMap((failures) =>\n failures[0] === undefined ? Effect.void : Effect.fail(failures[0].error),\n ),\n ),\n );\n\n const runtime = yield* makeHandle(page, fixedPolicy, startedAt, state, close);\n const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);\n const requestFitsSession = (requestedMillis: number): Effect.Effect<void, BrowserFailure> =>\n remainingMillis(fixedPolicy, startedAt).pipe(\n Effect.flatMap((remaining) =>\n remaining > 0 && requestedMillis <= remaining\n ? Effect.void\n : Effect.fail(\n policyError(\"The host browser request exceeds the remaining session time\"),\n ),\n ),\n );\n\n return {\n handle: runtime.handle,\n sessionId: Redacted.make(sessionIdValue),\n getLiveView: (request) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The Live View request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getLiveView\",\n { mode: decoded.mode, expiresInMs: decoded.expiresInMs },\n LiveViewObservation,\n \"Cloudflare returned a malformed Live View response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed Live View response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.expiresInMs))),\n ),\n ),\n ),\n handoff: (request) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser handoff request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.handoff\",\n { instructions: decoded.instructions, timeout: decoded.timeout },\n HandoffObservation,\n \"Cloudflare returned a malformed browser handoff response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffResult)({\n handoffId: Redacted.make(observation.handoffId),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.timeout))),\n ),\n ),\n ),\n getHandoffState: runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getHandoffState\",\n {},\n HandoffStateObservation,\n \"Cloudflare returned a malformed browser handoff state\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffState)({\n active: observation.active,\n ...(observation.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(observation.handoffId) }),\n ...(observation.durationMs === undefined\n ? {}\n : { durationMs: observation.durationMs }),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff state\"),\n ),\n ),\n ),\n ),\n currentPagePreflight,\n ),\n close,\n };\n });\n\n const closeSession = Effect.fn(\"BrowserRunInteractiveHost.closeSession\")(function* (\n sessionId: Redacted.Redacted<string>,\n ) {\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Redacted(BrowserRunSessionId))(\n sessionId,\n ).pipe(\n Effect.mapError(() => policyError(\"The Browser Run cleanup session identity is malformed\")),\n );\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const closeAttempted = { value: false };\n const browser = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.connect(Redacted.value(decoded)),\n (acquired) => acquired.close(),\n ),\n catch: (cause) => actionError(\"close\", cause),\n }),\n (acquired) =>\n closeAttempted.value\n ? Effect.void\n : closeWithWarning(acquired.close, \"Closing the leaked Browser Run session failed\"),\n { interruptible: true },\n );\n return yield* Effect.tryPromise({\n try: () => {\n // Mark and start are synchronous so interruption cannot suppress the\n // Scope fallback before the one remote close attempt begins.\n closeAttempted.value = true;\n return browser.close();\n },\n catch: (cause) => actionError(\"close\", cause),\n });\n }),\n ).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLOSE_SESSION_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n );\n });\n\n return BrowserRunInteractiveHost.of({ open, closeSession });\n};\n\n/** Cloudflare host controls and private session identity for one scoped Browser Run pass. */\nexport const browserRunInteractiveHostLayer = (): Layer.Layer<\n BrowserRunInteractiveHost,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n BrowserRunInteractiveHost,\n Effect.gen(function* () {\n return makeHostService(yield* BrowserRunInteractiveBinding);\n }),\n );\n\n/** Worker-only generic adapter; Cloudflare identity and controls remain host-only. */\nexport const browserRunInteractiveLayer = (): Layer.Layer<\n InteractiveBrowser,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n InteractiveBrowser,\n Effect.gen(function* () {\n const binding = yield* BrowserRunInteractiveBinding;\n const host = makeHostService(binding);\n return InteractiveBrowser.of({\n open: (policy) => host.open(policy).pipe(Effect.map((session) => session.handle)),\n });\n }),\n );\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-agent/platform-cloudflare",
3
- "version": "0.1.0-beta.32",
3
+ "version": "0.1.0-beta.33",
4
4
  "exports": {
5
5
  ".": {
6
6
  "types": "./dist/index.d.mts",
@@ -25,11 +25,11 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@cloudflare/puppeteer": "1.1.0",
28
- "@effect-agent/core": "0.1.0-beta.32",
29
- "@effect-agent/engine": "0.1.0-beta.32",
30
- "@effect-agent/sandbox": "0.1.0-beta.32",
31
- "@effect-agent/session": "0.1.0-beta.32",
32
- "@effect-agent/storage-cloudflare": "0.1.0-beta.32",
28
+ "@effect-agent/core": "0.1.0-beta.33",
29
+ "@effect-agent/engine": "0.1.0-beta.33",
30
+ "@effect-agent/sandbox": "0.1.0-beta.33",
31
+ "@effect-agent/session": "0.1.0-beta.33",
32
+ "@effect-agent/storage-cloudflare": "0.1.0-beta.33",
33
33
  "@effect/platform-browser": "4.0.0-rc.110",
34
34
  "@effect/sql-sqlite-do": "4.0.0-rc.110",
35
35
  "effect": "4.0.0-rc.110"
@@ -342,12 +342,23 @@ const makeProductionPage = (page: Page): BrowserRunInteractivePage => {
342
342
  await page.$eval(
343
343
  selector,
344
344
  (element, nextValue) => {
345
- if (!("value" in element)) {
345
+ // Bypass instance setters so React can detect the change when events fire.
346
+ let prototype = Reflect.getPrototypeOf(element);
347
+ let setValue: ((value: string) => void) | undefined;
348
+ while (prototype !== null) {
349
+ const setter = Reflect.getOwnPropertyDescriptor(prototype, "value")?.set;
350
+ if (typeof setter === "function") {
351
+ setValue = setter;
352
+ break;
353
+ }
354
+ prototype = Reflect.getPrototypeOf(prototype);
355
+ }
356
+ if (setValue === undefined) {
346
357
  throw new Error("The selector did not resolve to a fillable field");
347
358
  }
348
359
  const focus = Reflect.get(element, "focus");
349
360
  if (typeof focus === "function") Reflect.apply(focus, element, []);
350
- Reflect.set(element, "value", nextValue);
361
+ Reflect.apply(setValue, element, [nextValue]);
351
362
  const dispatchEvent = Reflect.get(element, "dispatchEvent");
352
363
  if (typeof dispatchEvent === "function") {
353
364
  Reflect.apply(dispatchEvent, element, [new Event("input", { bubbles: true })]);