@yielded/agent-platform-cloudflare 0.1.0-beta.173 → 0.1.0-beta.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/{Alarm-BMEAZo3p.mjs → Alarm-4J9B8Fg8.mjs} +54 -32
  2. package/dist/Alarm-4J9B8Fg8.mjs.map +1 -0
  3. package/dist/Alarm.mjs +1 -1
  4. package/dist/BrowserRestCapture.mjs.map +1 -1
  5. package/dist/BrowserRestCrawl.mjs.map +1 -1
  6. package/dist/{BrowserSession-Bx0V1-6_.d.mts → BrowserSession-Cojp7nth.d.mts} +3 -2
  7. package/dist/{BrowserSession-BfNmyayH.mjs → BrowserSession-aovMjfL4.mjs} +14 -14
  8. package/dist/BrowserSession-aovMjfL4.mjs.map +1 -0
  9. package/dist/BrowserSession.d.mts +1 -1
  10. package/dist/BrowserSession.mjs +2 -2
  11. package/dist/BrowserUse.d.mts +40 -64
  12. package/dist/BrowserUse.mjs +223 -2
  13. package/dist/BrowserUse.mjs.map +1 -0
  14. package/dist/CloudflareBrowser-Vt8qTdYW.mjs.map +1 -1
  15. package/dist/CloudflareCodeMode.mjs.map +1 -1
  16. package/dist/CloudflareScheduling.mjs +9 -9
  17. package/dist/CloudflareScheduling.mjs.map +1 -1
  18. package/dist/CloudflareSubscriptions.mjs +15 -15
  19. package/dist/CloudflareSubscriptions.mjs.map +1 -1
  20. package/dist/{CloudflareThreadClient-DgZVrZzF.mjs → CloudflareThreadClient-DU548EEj.mjs} +42 -39
  21. package/dist/CloudflareThreadClient-DU548EEj.mjs.map +1 -0
  22. package/dist/{CloudflareThreadClient-HO_3rkM7.d.mts → CloudflareThreadClient-lTm6baDP.d.mts} +362 -362
  23. package/dist/CloudflareThreadClient.d.mts +1 -1
  24. package/dist/CloudflareThreadClient.mjs +1 -1
  25. package/dist/{InteractiveBrowser-LdKzQeLR.mjs → InteractiveBrowser-BHNlwjZL.mjs} +40 -31
  26. package/dist/InteractiveBrowser-BHNlwjZL.mjs.map +1 -0
  27. package/dist/InteractiveBrowser.mjs +1 -1
  28. package/dist/{ThreadObject-CRbLbdXM.d.mts → ThreadObject-BLYgzcdT.d.mts} +15 -15
  29. package/dist/{ThreadObject-CGIaz6Jv.mjs → ThreadObject-C2LF3btz.mjs} +13 -14
  30. package/dist/ThreadObject-C2LF3btz.mjs.map +1 -0
  31. package/dist/ThreadObject.d.mts +1 -1
  32. package/dist/ThreadObject.mjs +1 -1
  33. package/dist/WakeScheduler.d.mts +1 -1
  34. package/dist/WakeScheduler.mjs +8 -3
  35. package/dist/WakeScheduler.mjs.map +1 -1
  36. package/dist/index.d.mts +3 -3
  37. package/dist/index.mjs +5 -5
  38. package/dist/{prepared-admission-CSdzFM_v.mjs → prepared-admission-BoUPHSNQ.mjs} +2 -2
  39. package/dist/{prepared-admission-CSdzFM_v.mjs.map → prepared-admission-BoUPHSNQ.mjs.map} +1 -1
  40. package/package.json +1 -1
  41. package/src/Alarm.ts +82 -39
  42. package/src/BrowserRestCapture.ts +1 -0
  43. package/src/BrowserRestCrawl.ts +1 -0
  44. package/src/BrowserSession.ts +3 -2
  45. package/src/BrowserUse.ts +287 -1504
  46. package/src/CloudflareCodeMode.ts +6 -0
  47. package/src/CloudflareScheduling.ts +103 -103
  48. package/src/CloudflareSubscriptions.ts +192 -199
  49. package/src/CloudflareThreadClient.ts +256 -268
  50. package/src/InteractiveBrowser.ts +43 -17
  51. package/src/ThreadObject.ts +35 -24
  52. package/src/WakeScheduler.ts +12 -9
  53. package/src/internal/browser-binding.ts +8 -0
  54. package/src/internal/browser-credentials.ts +18 -13
  55. package/src/internal/browser-file-selection.ts +13 -2
  56. package/src/internal/browser-quick-action.ts +1 -0
  57. package/src/internal/browser-session-lifecycle.ts +32 -36
  58. package/src/internal/due-queue.ts +38 -19
  59. package/src/internal/layers.ts +53 -53
  60. package/dist/Alarm-BMEAZo3p.mjs.map +0 -1
  61. package/dist/BrowserSession-BfNmyayH.mjs.map +0 -1
  62. package/dist/BrowserUse-Bc2JdLW2.mjs +0 -1528
  63. package/dist/BrowserUse-Bc2JdLW2.mjs.map +0 -1
  64. package/dist/CloudflareThreadClient-DgZVrZzF.mjs.map +0 -1
  65. package/dist/InteractiveBrowser-LdKzQeLR.mjs.map +0 -1
  66. package/dist/ThreadObject-CGIaz6Jv.mjs.map +0 -1
  67. package/dist/page-function-CmUCcyNP.mjs +0 -11
  68. package/dist/page-function-CmUCcyNP.mjs.map +0 -1
  69. package/src/internal/browser-dom.ts +0 -886
  70. package/src/internal/browser-jev-dom.ts +0 -362
@@ -1,2 +1,2 @@
1
- import { A as boundHostDiagnostic, B as decodeUnknownResolutionCommand, C as SettlementReached, D as SubmitSucceeded, E as SubmitRequest, F as decodeCancelProgressRequest, G as encodeCancelProgressRequest, H as encodeApprovalDecisionCommand, I as decodeHostResponse, J as encodeReceipt, K as encodeHostResponse, L as decodeObservePageRequest, M as decodeApprovalDecisionCommand, N as decodeAwaitProgressRequest, O as ThreadClientError, P as decodeAwaitSettlementRequest, R as decodeReceipt, S as ProgressObserved, T as SubmissionStatusResponse, U as encodeAwaitProgressRequest, V as encodeAbortCommand, W as encodeAwaitSettlementRequest, X as encodeUnknownResolutionCommand, Y as encodeSubmitRequest, Z as Frame, _ as HostProtocolError, a as CancelProgressRequest, b as ObservedPage, c as ClientAwaitFailure, d as ClientSubmitFailure, f as ClientUnknownFailure, g as HostFailure, h as HostFailed, i as AwaitSettlementRequest, j as decodeAbortCommand, k as UnknownResolutionRecorded, l as ClientObserveFailure, n as ApprovalRecorded, o as ClientAbortFailure, p as CloudflareThreadClient, q as encodeObservePageRequest, r as AwaitProgressRequest, s as ClientApprovalFailure, t as AbortRecorded, u as ClientProgressFailure, v as HostResponse, w as SettlementRecordReached, x as ProgressCancelled, y as ObservePageRequest, z as decodeSubmitRequest } from "./CloudflareThreadClient-HO_3rkM7.mjs";
1
+ import { A as boundHostDiagnostic, B as decodeUnknownResolutionCommand, C as SettlementReached, D as SubmitSucceeded, E as SubmitRequest, F as decodeCancelProgressRequest, G as encodeCancelProgressRequest, H as encodeApprovalDecisionCommand, I as decodeHostResponse, J as encodeReceipt, K as encodeHostResponse, L as decodeObservePageRequest, M as decodeApprovalDecisionCommand, N as decodeAwaitProgressRequest, O as ThreadClientError, P as decodeAwaitSettlementRequest, R as decodeReceipt, S as ProgressObserved, T as SubmissionStatusResponse, U as encodeAwaitProgressRequest, V as encodeAbortCommand, W as encodeAwaitSettlementRequest, X as encodeUnknownResolutionCommand, Y as encodeSubmitRequest, Z as Frame, _ as HostProtocolError, a as CancelProgressRequest, b as ObservedPage, c as ClientAwaitFailure, d as ClientSubmitFailure, f as ClientUnknownFailure, g as HostFailure, h as HostFailed, i as AwaitSettlementRequest, j as decodeAbortCommand, k as UnknownResolutionRecorded, l as ClientObserveFailure, n as ApprovalRecorded, o as ClientAbortFailure, p as CloudflareThreadClient, q as encodeObservePageRequest, r as AwaitProgressRequest, s as ClientApprovalFailure, t as AbortRecorded, u as ClientProgressFailure, v as HostResponse, w as SettlementRecordReached, x as ProgressCancelled, y as ObservePageRequest, z as decodeSubmitRequest } from "./CloudflareThreadClient-lTm6baDP.mjs";
2
2
  export { AbortRecorded, ApprovalRecorded, AwaitProgressRequest, AwaitSettlementRequest, CancelProgressRequest, ClientAbortFailure, ClientApprovalFailure, ClientAwaitFailure, ClientObserveFailure, ClientProgressFailure, ClientSubmitFailure, ClientUnknownFailure, CloudflareThreadClient, HostFailed, HostFailure, HostProtocolError, HostResponse, Frame as LiveTextFrame, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, SettlementReached, SettlementRecordReached, SubmissionStatusResponse, SubmitRequest, SubmitSucceeded, ThreadClientError, UnknownResolutionRecorded, boundHostDiagnostic, decodeAbortCommand, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeAwaitSettlementRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObservePageRequest, decodeReceipt, decodeSubmitRequest, decodeUnknownResolutionCommand, encodeAbortCommand, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeAwaitSettlementRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand };
@@ -1,2 +1,2 @@
1
- import { A as decodeObservePageRequest, B as encodeObservePageRequest, C as boundHostDiagnostic, D as decodeAwaitSettlementRequest, E as decodeAwaitProgressRequest, F as encodeApprovalDecisionCommand, H as encodeSubmitRequest, I as encodeAwaitProgressRequest, L as encodeAwaitSettlementRequest, M as decodeSubmitRequest, N as decodeUnknownResolutionCommand, O as decodeCancelProgressRequest, P as encodeAbortCommand, R as encodeCancelProgressRequest, S as UnknownResolutionRecorded, T as decodeApprovalDecisionCommand, U as encodeUnknownResolutionCommand, V as encodeReceipt, W as Frame, _ as SettlementRecordReached, a as CancelProgressRequest, b as SubmitSucceeded, c as HostFailed, d as HostResponse, f as ObservePageRequest, g as SettlementReached, h as ProgressObserved, i as AwaitSettlementRequest, j as decodeReceipt, k as decodeHostResponse, l as HostFailure, m as ProgressCancelled, n as ApprovalRecorded, o as CloudflareThreadClient, p as ObservedPage, r as AwaitProgressRequest, t as AbortRecorded, u as HostProtocolError, v as SubmissionStatusResponse, w as decodeAbortCommand, x as ThreadClientError, y as SubmitRequest, z as encodeHostResponse } from "./CloudflareThreadClient-DgZVrZzF.mjs";
1
+ import { A as decodeObservePageRequest, B as encodeObservePageRequest, C as boundHostDiagnostic, D as decodeAwaitSettlementRequest, E as decodeAwaitProgressRequest, F as encodeApprovalDecisionCommand, H as encodeSubmitRequest, I as encodeAwaitProgressRequest, L as encodeAwaitSettlementRequest, M as decodeSubmitRequest, N as decodeUnknownResolutionCommand, O as decodeCancelProgressRequest, P as encodeAbortCommand, R as encodeCancelProgressRequest, S as UnknownResolutionRecorded, T as decodeApprovalDecisionCommand, U as encodeUnknownResolutionCommand, V as encodeReceipt, W as Frame, _ as SettlementRecordReached, a as CancelProgressRequest, b as SubmitSucceeded, c as HostFailed, d as HostResponse, f as ObservePageRequest, g as SettlementReached, h as ProgressObserved, i as AwaitSettlementRequest, j as decodeReceipt, k as decodeHostResponse, l as HostFailure, m as ProgressCancelled, n as ApprovalRecorded, o as CloudflareThreadClient, p as ObservedPage, r as AwaitProgressRequest, t as AbortRecorded, u as HostProtocolError, v as SubmissionStatusResponse, w as decodeAbortCommand, x as ThreadClientError, y as SubmitRequest, z as encodeHostResponse } from "./CloudflareThreadClient-DU548EEj.mjs";
2
2
  export { AbortRecorded, ApprovalRecorded, AwaitProgressRequest, AwaitSettlementRequest, CancelProgressRequest, CloudflareThreadClient, HostFailed, HostFailure, HostProtocolError, HostResponse, Frame as LiveTextFrame, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, SettlementReached, SettlementRecordReached, SubmissionStatusResponse, SubmitRequest, SubmitSucceeded, ThreadClientError, UnknownResolutionRecorded, boundHostDiagnostic, decodeAbortCommand, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeAwaitSettlementRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObservePageRequest, decodeReceipt, decodeSubmitRequest, decodeUnknownResolutionCommand, encodeAbortCommand, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeAwaitSettlementRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand };
@@ -1,4 +1,3 @@
1
- import { t as pageFunction } from "./page-function-CmUCcyNP.mjs";
2
1
  import { Cause, Clock, Context, Data, Duration, Effect, ErrorReporter, Layer, Option, Predicate, Redacted, Schema, Scope, Semaphore, Stream } from "effect";
3
2
  import { PageScreenshotResult } from "@yielded/agent/page-screenshot";
4
3
  import { SandboxImplementation } from "@yielded/agent/sandbox";
@@ -273,6 +272,14 @@ var BrowserRunBinding = class extends Context.Service()("@effect-agent/platform-
273
272
  }
274
273
  };
275
274
  //#endregion
275
+ //#region src/internal/page-function.ts
276
+ /**
277
+ * Puppeteer sends a page function's source to the browser. Bundlers that keep function names,
278
+ * including Wrangler by default, insert `__name(...)` calls into that source, and the page has no
279
+ * such helper. The returned function's source declares a local no-op `__name` first.
280
+ */
281
+ const pageFunction = (fn) => Object.assign((...args) => fn(...args), { toString: () => `(...args) => { const __name = (target) => target; return (${Function.prototype.toString.call(fn)})(...args); }` });
282
+ //#endregion
276
283
  //#region src/internal/browser-file-selection.ts
277
284
  function setFileSelection(element, encoded, name, type) {
278
285
  if (Reflect.get(element, "type") !== "file" || Reflect.get(element, "disabled") || Reflect.get(element, "webkitdirectory")) throw new Error("The target is not an enabled file input");
@@ -293,7 +300,7 @@ const makeFileSelection = (page) => async (request, signal) => {
293
300
  await session.send("Page.enable");
294
301
  await session.send("Page.setInterceptFileChooserDialog", { enabled: true });
295
302
  } catch (cause) {
296
- await session.detach();
303
+ await session.detach().catch(() => {});
297
304
  throw cause;
298
305
  }
299
306
  const select = async (element) => {
@@ -369,34 +376,34 @@ const Absent = Schema.Struct({ error: Schema.Literal("Session not found") });
369
376
  var BrowserRunSessionLifecycle = class extends Context.Service()("@effect-agent/platform-cloudflare/BrowserRunSessionLifecycle") {
370
377
  static layer(options) {
371
378
  return Layer.effect(this, Effect.gen(function* () {
372
- if (!Schema.is(Account)(options.accountId) || Redacted.value(options.apiToken).length === 0) return yield* new BrowserRunCleanupError({ reason: "configuration" });
379
+ if (!Schema.is(Account)(options.accountId) || Redacted.value(options.apiToken).length === 0) return yield* BrowserRunCleanupError.make({ reason: "configuration" });
373
380
  const client = yield* HttpClient.HttpClient;
374
381
  const request = Effect.fnUntraced(function* (method, sessionId) {
375
382
  const path = method === "DELETE" ? "browser" : "session";
376
- const response = yield* client.execute(HttpClientRequest.make(method)(`https://api.cloudflare.com/client/v4/accounts/${options.accountId}/browser-rendering/devtools/${path}/${sessionId}`).pipe(HttpClientRequest.bearerToken(options.apiToken))).pipe(Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" }), Effect.mapError((cause) => new BrowserRunCleanupError({
383
+ const response = yield* client.execute(HttpClientRequest.make(method)(`https://api.cloudflare.com/client/v4/accounts/${options.accountId}/browser-rendering/devtools/${path}/${sessionId}`).pipe(HttpClientRequest.bearerToken(options.apiToken))).pipe(Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" }), Effect.mapError((cause) => BrowserRunCleanupError.make({
377
384
  reason: "provider",
378
385
  cause: browserFailure("browser.close.request", cause)
379
386
  })));
380
- if (response.status === 401 || response.status === 403) return yield* new BrowserRunCleanupError({
387
+ if (response.status === 401 || response.status === 403) return yield* BrowserRunCleanupError.make({
381
388
  reason: "authorization",
382
389
  status: response.status
383
390
  });
384
- if (response.status === 429) return yield* new BrowserRunCleanupError({
391
+ if (response.status === 429) return yield* BrowserRunCleanupError.make({
385
392
  reason: "rate-limited",
386
393
  status: response.status
387
394
  });
388
- if (response.status !== 200 && response.status !== 404) return yield* new BrowserRunCleanupError({
395
+ if (response.status !== 200 && response.status !== 404) return yield* BrowserRunCleanupError.make({
389
396
  reason: "provider",
390
397
  status: response.status
391
398
  });
392
- if (response.headers["content-type"]?.split(";", 1)[0]?.trim() !== "application/json") return yield* new BrowserRunCleanupError({ reason: "malformed" });
399
+ if (response.headers["content-type"]?.split(";", 1)[0]?.trim() !== "application/json") return yield* BrowserRunCleanupError.make({ reason: "malformed" });
393
400
  const bytes = yield* Stream.runFoldEffect(response.stream, () => /* @__PURE__ */ new Uint8Array(), (body, chunk) => {
394
- if (body.byteLength + chunk.byteLength > 16384) return Effect.fail(new BrowserRunCleanupError({ reason: "malformed" }));
401
+ if (body.byteLength + chunk.byteLength > 16384) return Effect.fail(BrowserRunCleanupError.make({ reason: "malformed" }));
395
402
  const combined = new Uint8Array(body.byteLength + chunk.byteLength);
396
403
  combined.set(body);
397
404
  combined.set(chunk, body.byteLength);
398
405
  return Effect.succeed(combined);
399
- }).pipe(Effect.mapError((cause) => new BrowserRunCleanupError({
406
+ }).pipe(Effect.mapError((cause) => BrowserRunCleanupError.make({
400
407
  reason: "malformed",
401
408
  cause: browserFailure("browser.close.response", cause)
402
409
  })));
@@ -405,7 +412,7 @@ var BrowserRunSessionLifecycle = class extends Context.Service()("@effect-agent/
405
412
  fatal: true,
406
413
  ignoreBOM: false
407
414
  }).decode(bytes),
408
- catch: (cause) => new BrowserRunCleanupError({
415
+ catch: (cause) => BrowserRunCleanupError.make({
409
416
  reason: "malformed",
410
417
  cause: browserFailure("browser.close.decode", cause)
411
418
  })
@@ -413,27 +420,27 @@ var BrowserRunSessionLifecycle = class extends Context.Service()("@effect-agent/
413
420
  if (response.status === 404) {
414
421
  const absent = Schema.decodeOption(Schema.fromJsonString(Absent))(body, { onExcessProperty: "error" });
415
422
  if (Option.isSome(absent)) return true;
416
- return yield* new BrowserRunCleanupError({ reason: "malformed" });
423
+ return yield* BrowserRunCleanupError.make({ reason: "malformed" });
417
424
  }
418
- if (method === "DELETE") return (yield* Schema.decodeEffect(Schema.fromJsonString(Closed))(body).pipe(Effect.mapError((cause) => new BrowserRunCleanupError({
425
+ if (method === "DELETE") return (yield* Schema.decodeEffect(Schema.fromJsonString(Closed))(body).pipe(Effect.mapError((cause) => BrowserRunCleanupError.make({
419
426
  reason: "malformed",
420
427
  cause: browserFailure("browser.close.response", cause)
421
428
  })))).status === "closed";
422
- const result = yield* Schema.decodeEffect(Schema.fromJsonString(Metadata))(body).pipe(Effect.mapError((cause) => new BrowserRunCleanupError({
429
+ const result = yield* Schema.decodeEffect(Schema.fromJsonString(Metadata))(body).pipe(Effect.mapError((cause) => BrowserRunCleanupError.make({
423
430
  reason: "malformed",
424
431
  cause: browserFailure("browser.close.response", cause)
425
432
  })));
426
- if (result.sessionId !== sessionId) return yield* new BrowserRunCleanupError({ reason: "malformed" });
433
+ if (result.sessionId !== sessionId) return yield* BrowserRunCleanupError.make({ reason: "malformed" });
427
434
  return result.endTime !== void 0 && result.endTime > 0;
428
435
  });
429
436
  return { close: Effect.fnUntraced(function* (sessionId) {
430
- const id = yield* Schema.decodeEffect(Identity)(Redacted.value(sessionId)).pipe(Effect.mapError(() => new BrowserRunCleanupError({ reason: "configuration" })));
437
+ const id = yield* Schema.decodeEffect(Identity)(Redacted.value(sessionId)).pipe(Effect.mapError(() => BrowserRunCleanupError.make({ reason: "configuration" })));
431
438
  if (yield* request("DELETE", id)) return;
432
439
  for (let read = 0; read < 2; read++) if (yield* request("GET", id)) return;
433
- return yield* new BrowserRunCleanupError({ reason: "pending" });
440
+ return yield* BrowserRunCleanupError.make({ reason: "pending" });
434
441
  }, Effect.timeoutOrElse({
435
442
  duration: "10 seconds",
436
- orElse: () => Effect.fail(new BrowserRunCleanupError({ reason: "timeout" }))
443
+ orElse: () => Effect.fail(BrowserRunCleanupError.make({ reason: "timeout" }))
437
444
  }), Effect.withTracerEnabled(false)) };
438
445
  }));
439
446
  }
@@ -1760,12 +1767,13 @@ const makeHostService = (binding) => {
1760
1767
  state.disconnected.value = true;
1761
1768
  return yield* expiredError();
1762
1769
  }
1763
- const reattached = resume === void 0 ? void 0 : yield* withinDeadline(Effect.tryPromise({
1764
- try: async () => {
1765
- if (browser.reattach === void 0 || browser.detach === void 0) throw new Error("The browser binding does not support exact reattachment");
1766
- return await browser.reattach(resume.page);
1767
- },
1768
- catch: (cause) => protocolError("Reattaching the exact browser page failed", cause)
1770
+ const reattached = resume === void 0 ? void 0 : yield* withinDeadline(Effect.gen(function* () {
1771
+ if (browser.reattach === void 0 || browser.detach === void 0) return yield* protocolError("The browser binding does not support exact reattachment");
1772
+ const reattach = browser.reattach.bind(browser);
1773
+ return yield* Effect.tryPromise({
1774
+ try: () => reattach(resume.page),
1775
+ catch: (cause) => protocolError("Reattaching the exact browser page failed", cause)
1776
+ });
1769
1777
  }).pipe(Effect.timeoutOrElse({
1770
1778
  duration: "10 seconds",
1771
1779
  orElse: () => Effect.fail(protocolError("Reattaching the exact browser page timed out"))
@@ -1837,12 +1845,13 @@ const makeHostService = (binding) => {
1837
1845
  const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);
1838
1846
  const requestFitsSession = (requestedMillis) => remainingMillis(fixedPolicy, startedAt).pipe(Effect.flatMap((remaining) => remaining > 0 && requestedMillis <= remaining ? Effect.void : Effect.fail(policyError("The host browser request exceeds the remaining session time"))));
1839
1847
  const inputState = Effect.sync(() => state.uncertain.value ? "unknown" : state.pendingInputs.size > 0 ? "running" : "idle");
1840
- const pageIdentity = yield* Effect.cached(Effect.tryPromise({
1841
- try: async () => {
1842
- if (page.identity === void 0) throw new Error("The browser binding does not expose page identity");
1843
- return await page.identity();
1844
- },
1845
- catch: (cause) => protocolError("Reading the exact browser page identity failed", cause)
1848
+ const pageIdentity = yield* Effect.cached(Effect.gen(function* () {
1849
+ if (page.identity === void 0) return yield* protocolError("The browser binding does not expose page identity");
1850
+ const identity = page.identity.bind(page);
1851
+ return yield* Effect.tryPromise({
1852
+ try: () => identity(),
1853
+ catch: (cause) => protocolError("Reading the exact browser page identity failed", cause)
1854
+ });
1846
1855
  }).pipe(Effect.catchTag("InteractiveBrowserProtocolError", (error) => failReportedProtocol("interactive.checkpoint", error))));
1847
1856
  const observeResize = yield* makeHostInputObserver(state, "interactive.resize.late");
1848
1857
  return {
@@ -1930,4 +1939,4 @@ const CloudflareInteractiveBrowser = {
1930
1939
  //#endregion
1931
1940
  export { reportedBrowserError as C, reportBrowserCause as S, BrowserRunCleanupError as _, BrowserRunInteractiveCheckpoint as a, BrowserRunFailure as b, BrowserRunLiveViewResult as c, BrowserRunViewport as d, CloudflareInteractiveBrowser as f, isBrowserRunUndispatchedActionError as g, browserRunInteractiveLayer as h, BrowserRunInteractiveBinding as i, BrowserRunPageIdentity as l, browserRunInteractiveImplementation as m, BrowserRunHandoffResult as n, BrowserRunInteractiveHost as o, browserRunInteractiveHostLayer as p, BrowserRunHandoffState as r, BrowserRunLiveViewRequest as s, BrowserRunHandoffRequest as t, BrowserRunPageObservation as u, BrowserRunSessionLifecycle as v, browserFailure as x, BrowserRunBinding as y };
1932
1941
 
1933
- //# sourceMappingURL=InteractiveBrowser-LdKzQeLR.mjs.map
1942
+ //# sourceMappingURL=InteractiveBrowser-BHNlwjZL.mjs.map