@effect-agent/platform-cloudflare 0.1.0-beta.90 → 0.1.0-beta.92

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.
@@ -454,13 +454,13 @@ declare const encodeUnknownResolutionCommand: (input: UnknownResolutionCommand,
454
454
  readonly author: string;
455
455
  readonly reason: string;
456
456
  readonly resolution: {
457
+ readonly _tag: "SafeToRetry";
458
+ } | {
457
459
  readonly _tag: "CompletedWithResult";
458
460
  readonly result: Schema.Json;
459
461
  readonly isFailure: boolean;
460
462
  } | {
461
463
  readonly _tag: "NeverHappened";
462
- } | {
463
- readonly _tag: "SafeToRetry";
464
464
  } | {
465
465
  readonly _tag: "AbortSubmission";
466
466
  };
@@ -596,6 +596,19 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
596
596
  readonly createdAt: string;
597
597
  readonly deploymentId: string;
598
598
  readonly payload: {
599
+ readonly _tag: "SubagentStarted";
600
+ readonly runId: string;
601
+ readonly toolCallId: string;
602
+ readonly childThreadId: string;
603
+ readonly childSubmissionId: string;
604
+ readonly childReceiptId: string;
605
+ readonly childRunId: string;
606
+ } | {
607
+ readonly _tag: "AbortRequested";
608
+ readonly submissionId: string;
609
+ readonly author: string;
610
+ readonly reason: string;
611
+ } | {
599
612
  readonly _tag: "ThreadCreated";
600
613
  readonly agentId: string;
601
614
  readonly definitions: {
@@ -839,11 +852,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
839
852
  readonly runDisposition?: Schema.Json | undefined;
840
853
  readonly finishReason?: "budget-exhausted" | undefined;
841
854
  readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
842
- } | {
843
- readonly _tag: "AbortRequested";
844
- readonly submissionId: string;
845
- readonly author: string;
846
- readonly reason: string;
847
855
  } | {
848
856
  readonly _tag: "SubmissionSettled";
849
857
  readonly submissionId: string;
@@ -971,14 +979,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
971
979
  readonly childLifetimes?: readonly ("attached" | "background")[] | undefined;
972
980
  } | undefined;
973
981
  readonly depth?: number | undefined;
974
- } | {
975
- readonly _tag: "SubagentStarted";
976
- readonly runId: string;
977
- readonly toolCallId: string;
978
- readonly childThreadId: string;
979
- readonly childSubmissionId: string;
980
- readonly childReceiptId: string;
981
- readonly childRunId: string;
982
982
  } | {
983
983
  readonly _tag: "SubagentJoined";
984
984
  readonly runId: string;
@@ -1332,13 +1332,13 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
1332
1332
  readonly author: string;
1333
1333
  readonly reason: string;
1334
1334
  readonly resolution: {
1335
+ readonly _tag: "SafeToRetry";
1336
+ } | {
1335
1337
  readonly _tag: "CompletedWithResult";
1336
1338
  readonly result: Schema.Json;
1337
1339
  readonly isFailure: boolean;
1338
1340
  } | {
1339
1341
  readonly _tag: "NeverHappened";
1340
- } | {
1341
- readonly _tag: "SafeToRetry";
1342
1342
  } | {
1343
1343
  readonly _tag: "AbortSubmission";
1344
1344
  };
@@ -1348,10 +1348,37 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
1348
1348
  } | {
1349
1349
  readonly _tag: "HostFailed";
1350
1350
  readonly failure: {
1351
+ readonly _tag: "AdmissionConflict";
1352
+ readonly threadId: string;
1353
+ readonly principal: string;
1354
+ readonly idempotencyKey: string;
1355
+ readonly existingInputDigest: string;
1356
+ readonly attemptedInputDigest: string;
1357
+ } | {
1358
+ readonly _tag: "AdmissionPolicyError";
1359
+ readonly reason: "occupied" | "refused" | "unavailable";
1360
+ readonly code: string;
1361
+ } | {
1362
+ readonly _tag: "SettlementConflict";
1363
+ readonly submissionId: string;
1364
+ readonly existingOutcome: "aborted" | "completed" | "failed";
1365
+ } | {
1366
+ readonly _tag: "JoinedToHost";
1367
+ readonly submissionId: string;
1368
+ readonly hostSubmissionId: string;
1369
+ } | {
1351
1370
  readonly _tag: "LedgerError";
1352
1371
  readonly operation: string;
1353
1372
  readonly message: string;
1354
1373
  readonly cause?: Schema.Json | undefined;
1374
+ } | {
1375
+ readonly _tag: "ThreadStoreError";
1376
+ readonly operation: string;
1377
+ readonly message: string;
1378
+ readonly cause?: Schema.Json | undefined;
1379
+ } | {
1380
+ readonly _tag: "ThreadNotMaterialized";
1381
+ readonly threadId: string;
1355
1382
  } | {
1356
1383
  readonly _tag: "AppendConflict";
1357
1384
  readonly threadId: string;
@@ -1365,30 +1392,13 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
1365
1392
  readonly actualEpoch: number;
1366
1393
  readonly attemptedEpoch: number;
1367
1394
  } | {
1368
- readonly _tag: "ThreadNotMaterialized";
1369
- readonly threadId: string;
1395
+ readonly _tag: "HostProtocolError";
1396
+ readonly message: string;
1370
1397
  } | {
1371
- readonly _tag: "ThreadStoreError";
1398
+ readonly _tag: "DurableAlarmError";
1372
1399
  readonly operation: string;
1373
1400
  readonly message: string;
1374
1401
  readonly cause?: Schema.Json | undefined;
1375
- } | {
1376
- readonly _tag: "OperationDenied";
1377
- readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
1378
- readonly reason: string;
1379
- readonly threadId?: string | undefined;
1380
- readonly submissionId?: string | undefined;
1381
- } | {
1382
- readonly _tag: "AdmissionConflict";
1383
- readonly threadId: string;
1384
- readonly principal: string;
1385
- readonly idempotencyKey: string;
1386
- readonly existingInputDigest: string;
1387
- readonly attemptedInputDigest: string;
1388
- } | {
1389
- readonly _tag: "AdmissionPolicyError";
1390
- readonly reason: "occupied" | "refused" | "unavailable";
1391
- readonly code: string;
1392
1402
  } | {
1393
1403
  readonly _tag: "AgentInputError";
1394
1404
  readonly message: string;
@@ -1396,25 +1406,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
1396
1406
  readonly _tag: "DigestError";
1397
1407
  readonly message: string;
1398
1408
  readonly cause?: Schema.Json | undefined;
1399
- } | {
1400
- readonly _tag: "DurableRuntimeFailpointError";
1401
- readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-subtree-append";
1402
- } | {
1403
- readonly _tag: "SettlementConflict";
1404
- readonly submissionId: string;
1405
- readonly existingOutcome: "aborted" | "completed" | "failed";
1406
- } | {
1407
- readonly _tag: "JoinedToHost";
1408
- readonly submissionId: string;
1409
- readonly hostSubmissionId: string;
1410
- } | {
1411
- readonly _tag: "DurableAlarmError";
1412
- readonly operation: string;
1413
- readonly message: string;
1414
- readonly cause?: Schema.Json | undefined;
1415
- } | {
1416
- readonly _tag: "HostProtocolError";
1417
- readonly message: string;
1418
1409
  } | {
1419
1410
  readonly _tag: "ApprovalConflict";
1420
1411
  readonly submissionId: string;
@@ -1424,11 +1415,20 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
1424
1415
  readonly _tag: "UnknownResolutionConflict";
1425
1416
  readonly submissionId: string;
1426
1417
  readonly toolCallId: string;
1418
+ } | {
1419
+ readonly _tag: "DurableRuntimeFailpointError";
1420
+ readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-start-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:before-prepared-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-subtree-append";
1427
1421
  } | {
1428
1422
  readonly _tag: "AdmissionLimitExceeded";
1429
1423
  readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
1430
1424
  readonly actual: number;
1431
1425
  readonly maximum: number;
1426
+ } | {
1427
+ readonly _tag: "OperationDenied";
1428
+ readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
1429
+ readonly reason: string;
1430
+ readonly threadId?: string | undefined;
1431
+ readonly submissionId?: string | undefined;
1432
1432
  };
1433
1433
  }, Schema.SchemaError, never>;
1434
1434
  declare const decodeHostResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AbortRecorded | ApprovalRecorded | HostFailed | ObservedPage | ProgressCancelled | ProgressObserved | SettlementReached | SubmissionStatusResponse | SubmitSucceeded | UnknownResolutionRecorded, Schema.SchemaError, never>;
@@ -680,7 +680,7 @@ const causeText = (cause) => {
680
680
  const isCapacityRefusal = (cause) => /(^|\D)429(\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));
681
681
  const isRemoteClosure = (cause) => /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(causeText(cause));
682
682
  const snapshotPolicy = Effect.fn("BrowserRunInteractive.snapshotPolicy")(function* (input) {
683
- const decoded = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(Effect.mapError(() => policyError("The interactive browser policy is malformed")));
683
+ const decoded = yield* Schema.decodeEffect(InteractiveBrowserPolicy, { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => policyError("The interactive browser policy is malformed")));
684
684
  if (decoded.network._tag === "PublicWeb") return yield* InteractiveBrowserUnsupportedError.make({
685
685
  implementation: browserRunInteractiveImplementation,
686
686
  feature: "policy",
@@ -1166,4 +1166,4 @@ const CloudflareInteractiveBrowser = {
1166
1166
  //#endregion
1167
1167
  export { BrowserRunInteractiveHost as a, BrowserRunViewport as c, browserRunInteractiveImplementation as d, browserRunInteractiveLayer as f, BrowserRunSessionLifecycle as h, BrowserRunInteractiveBinding as i, CloudflareInteractiveBrowser as l, BrowserRunCleanupError as m, BrowserRunHandoffResult as n, BrowserRunLiveViewRequest as o, isBrowserRunUndispatchedActionError as p, BrowserRunHandoffState as r, BrowserRunLiveViewResult as s, BrowserRunHandoffRequest as t, browserRunInteractiveHostLayer as u };
1168
1168
 
1169
- //# sourceMappingURL=InteractiveBrowser-DupDtfw2.mjs.map
1169
+ //# sourceMappingURL=InteractiveBrowser-CUsy34tv.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InteractiveBrowser-CUsy34tv.mjs","names":[],"sources":["../src/internal/browser-session-lifecycle.ts","../src/InteractiveBrowser.ts"],"sourcesContent":["import { Context, Effect, Layer, Option, Redacted, Schema, Stream } from \"effect\";\nimport { FetchHttpClient, HttpClient, HttpClientRequest } from \"effect/unstable/http\";\n\nexport class BrowserRunCleanupError extends Schema.TaggedError<BrowserRunCleanupError>()(\n \"BrowserRunCleanupError\",\n {\n reason: Schema.Literals([\n \"configuration\",\n \"authorization\",\n \"rate-limited\",\n \"provider\",\n \"malformed\",\n \"timeout\",\n \"pending\",\n ]),\n status: Schema.optionalKey(Schema.Int),\n },\n) {}\n\nexport interface BrowserRunLifecycleOptions {\n readonly accountId: string;\n readonly apiToken: Redacted.Redacted<string>;\n}\n\nconst Identity = Schema.String.check(Schema.isUUID());\nconst Account = Schema.String.check(Schema.isPattern(/^[a-f0-9]{32}$/));\nconst Closed = Schema.Struct({ status: Schema.Literals([\"closing\", \"closed\"]) });\nconst Metadata = Schema.Struct({ sessionId: Identity, endTime: Schema.optionalKey(Schema.Finite) });\n// This exact provider response is accepted only on a fixed-origin, authenticated,\n// exact-session request. An arbitrary 404 or a listing omission is never absence.\nconst Absent = Schema.Struct({ error: Schema.Literal(\"Session not found\") });\n\nexport class BrowserRunSessionLifecycle extends Context.Service<\n BrowserRunSessionLifecycle,\n {\n readonly close: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserRunCleanupError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunSessionLifecycle\") {\n static layer(options: BrowserRunLifecycleOptions) {\n return Layer.effect(\n this,\n Effect.gen(function* () {\n if (\n !Schema.is(Account)(options.accountId) ||\n Redacted.value(options.apiToken).length === 0\n ) {\n return yield* new BrowserRunCleanupError({ reason: \"configuration\" });\n }\n const client = yield* HttpClient.HttpClient;\n\n const request = Effect.fn(\"BrowserRunSessionLifecycle.request\")(function* (\n method: \"GET\" | \"DELETE\",\n sessionId: string,\n ) {\n const path = method === \"DELETE\" ? \"browser\" : \"session\";\n\n const response = yield* client\n .execute(\n HttpClientRequest.make(method)(\n `https://api.cloudflare.com/client/v4/accounts/${options.accountId}/browser-rendering/devtools/${path}/${sessionId}`,\n ).pipe(HttpClientRequest.bearerToken(options.apiToken)),\n )\n .pipe(\n // workerd supports manual/follow, not error. Reject every redirect below.\n Effect.provideService(FetchHttpClient.RequestInit, { redirect: \"manual\" }),\n Effect.mapError(() => new BrowserRunCleanupError({ reason: \"provider\" })),\n );\n\n if (response.status === 401 || response.status === 403)\n return yield* new BrowserRunCleanupError({\n reason: \"authorization\",\n status: response.status,\n });\n if (response.status === 429)\n return yield* new BrowserRunCleanupError({\n reason: \"rate-limited\",\n status: response.status,\n });\n if (response.status !== 200 && response.status !== 404)\n return yield* new BrowserRunCleanupError({\n reason: \"provider\",\n status: response.status,\n });\n if (response.headers[\"content-type\"]?.split(\";\", 1)[0]?.trim() !== \"application/json\")\n return yield* new BrowserRunCleanupError({ reason: \"malformed\" });\n\n const bytes = yield* Stream.runFoldEffect(\n response.stream,\n () => new Uint8Array(),\n (body, chunk) => {\n if (body.byteLength + chunk.byteLength > 16_384)\n return Effect.fail(new BrowserRunCleanupError({ reason: \"malformed\" }));\n const combined = new Uint8Array(body.byteLength + chunk.byteLength);\n\n combined.set(body);\n combined.set(chunk, body.byteLength);\n\n return Effect.succeed(combined);\n },\n ).pipe(Effect.mapError(() => new BrowserRunCleanupError({ reason: \"malformed\" })));\n\n const body = yield* Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: false }).decode(bytes),\n catch: () => new BrowserRunCleanupError({ reason: \"malformed\" }),\n });\n\n if (response.status === 404) {\n const absent = Schema.decodeOption(Schema.fromJsonString(Absent))(body, {\n onExcessProperty: \"error\",\n });\n\n if (Option.isSome(absent)) return true;\n\n return yield* new BrowserRunCleanupError({ reason: \"malformed\" });\n }\n if (method === \"DELETE\") {\n const result = yield* Schema.decodeEffect(Schema.fromJsonString(Closed))(body).pipe(\n Effect.mapError(() => new BrowserRunCleanupError({ reason: \"malformed\" })),\n );\n\n return result.status === \"closed\";\n }\n\n const result = yield* Schema.decodeEffect(Schema.fromJsonString(Metadata))(body).pipe(\n Effect.mapError(() => new BrowserRunCleanupError({ reason: \"malformed\" })),\n );\n\n if (result.sessionId !== sessionId)\n return yield* new BrowserRunCleanupError({ reason: \"malformed\" });\n\n return result.endTime !== undefined && result.endTime > 0;\n });\n\n const close = Effect.fn(\"BrowserRunSessionLifecycle.close\")(\n function* (sessionId: Redacted.Redacted<string>) {\n const id = yield* Schema.decodeEffect(Identity)(Redacted.value(sessionId)).pipe(\n Effect.mapError(() => new BrowserRunCleanupError({ reason: \"configuration\" })),\n );\n\n if (yield* request(\"DELETE\", id)) return;\n for (let read = 0; read < 2; read++) {\n if (yield* request(\"GET\", id)) return;\n }\n\n return yield* new BrowserRunCleanupError({ reason: \"pending\" });\n },\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(new BrowserRunCleanupError({ reason: \"timeout\" })),\n }),\n Effect.withTracerEnabled(false),\n );\n\n return { close };\n }),\n );\n }\n}\n","/// <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 Context,\n Clock,\n Duration,\n Effect,\n Layer,\n Redacted,\n Ref,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\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 InteractiveBrowserTargetUrl,\n InteractiveBrowserUnsupportedError,\n type BrowserHandle,\n type InteractiveBrowserError,\n type InteractiveBrowserNetworkPolicy,\n} from \"effect-agent/interactive-browser\";\nimport { PageScreenshotResult } from \"effect-agent/page-screenshot\";\nimport { SandboxImplementation } from \"effect-agent/sandbox\";\n\nimport {\n BrowserRunSessionLifecycle,\n type BrowserRunLifecycleOptions,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport {\n BrowserRunCleanupError,\n BrowserRunSessionLifecycle,\n} from \"./internal/browser-session-lifecycle.ts\";\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 ACTION_NETWORK_QUIET_MILLIS = 200;\nconst ACTION_NETWORK_SETTLE_MILLIS = 2_000;\nconst ACTION_POST_STATE_MILLIS = 250;\nconst MAX_OBSERVED_CONTROLS = 64;\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n\nconst BoundedHostText = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n);\n\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\n\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]);\n\nconst ActionTargetState = Schema.Struct({\n matchCount: Schema.Natural,\n invalidSelector: Schema.optionalKey(Schema.Boolean),\n kind: Schema.optionalKey(\n Schema.Literals([\"button\", \"checkbox\", \"radio\", \"select\", \"text\", \"link\", \"other\"]),\n ),\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n disabled: Schema.optionalKey(Schema.Boolean),\n required: Schema.optionalKey(Schema.Boolean),\n valid: Schema.optionalKey(Schema.Boolean),\n formValid: Schema.optionalKey(Schema.Boolean),\n});\n\nconst ActionNetworkState = Schema.Struct({\n total: Schema.Natural,\n status2xx: Schema.Natural,\n status3xx: Schema.Natural,\n status4xx: Schema.Natural,\n status5xx: Schema.Natural,\n failed: Schema.Natural,\n pending: Schema.Natural,\n settleTimedOut: Schema.Boolean,\n});\n\nconst ActionObservation = Schema.Struct({\n before: ActionTargetState,\n after: Schema.optionalKey(ActionTargetState),\n afterUnavailable: Schema.Boolean,\n network: ActionNetworkState,\n});\n\nconst PageObservation = Schema.fromJsonString(\n Schema.Struct({\n pageText: BoundedRemoteText,\n selectorMatchCount: Schema.Natural,\n controlsTruncated: Schema.Boolean,\n controls: Schema.Array(\n Schema.Struct({\n selector: BoundedRemoteText,\n kind: BoundedRemoteText,\n label: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(200))),\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n disabled: Schema.optionalKey(Schema.Boolean),\n required: Schema.optionalKey(Schema.Boolean),\n valid: Schema.optionalKey(Schema.Boolean),\n formValid: Schema.optionalKey(Schema.Boolean),\n }),\n ).check(Schema.isMaxLength(MAX_OBSERVED_CONTROLS)),\n }),\n);\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);\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);\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\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);\n\nconst LiveViewObservation = Schema.Struct({ devtoolsFrontendUrl: LiveViewUrl });\nconst HandoffObservation = Schema.Struct({ handoffId: BoundedHostText });\n\nconst HandoffDuration = Schema.Natural.check(\n Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS),\n);\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/**\n * Host presentation state in CSS pixels. Dimensions are integers in 1..2048,\n * density is finite in 1..2 (default 1), and neither scaled dimension may exceed\n * 2048 pixels. Mobile, touch, and orientation emulation are not supported.\n */\nexport class BrowserRunViewport extends Schema.Class<BrowserRunViewport>(\"BrowserRunViewport\")(\n Schema.Struct({\n width: PositiveInt.check(Schema.isLessThanOrEqualTo(2_048)),\n height: PositiveInt.check(Schema.isLessThanOrEqualTo(2_048)),\n deviceScaleFactor: Schema.optionalKey(\n Schema.Finite.check(Schema.isBetween({ minimum: 1, maximum: 2 })),\n ),\n }).check(\n Schema.makeFilter(\n (viewport) =>\n Math.max(viewport.width, viewport.height) * (viewport.deviceScaleFactor ?? 1) <= 2_048,\n { title: \"a viewport with scaled dimensions no larger than 2048 pixels\" },\n ),\n ),\n) {}\n\nconst decodeViewport = (input: BrowserRunViewport) =>\n Schema.decodeEffect(BrowserRunViewport)(input, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => policyError(\"The browser viewport is malformed\")),\n // Copy only presentation fields, including for Schema class instances.\n Effect.map((viewport) => ({\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor: viewport.deviceScaleFactor ?? 1,\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 network: Exclude<InteractiveBrowserNetworkPolicy, { readonly _tag: \"PublicWeb\" }>;\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: (\n selector: string,\n value: string,\n signal: AbortSignal,\n onDispatch: () => void,\n ) => Promise<unknown>;\n readonly click: (\n selector: string,\n signal: AbortSignal,\n onDispatch: () => void,\n ) => Promise<unknown>;\n readonly screenshot: (fullPage: boolean) => Promise<unknown>;\n readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;\n readonly setViewport: (viewport: BrowserRunViewport) => 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 /** Success proves whole-browser termination or exact-session absence. */\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n readonly viewport?: BrowserRunViewport;\n }): Layer.Layer<\n BrowserRunInteractiveBinding,\n InteractiveBrowserPolicyDeniedError,\n BrowserRunSessionLifecycle\n > {\n return Layer.effect(BrowserRunInteractiveBinding)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n\n const viewport =\n options.viewport === undefined ? undefined : yield* decodeViewport(options.viewport);\n\n return {\n launch: async (keepAliveMillis: number) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n ...(viewport === undefined ? {} : { defaultViewport: { ...viewport } }),\n }),\n ),\n closeSession: (sessionId: Redacted.Redacted<string>) =>\n lifecycle\n .close(sessionId)\n .pipe(Effect.mapError((cause) => actionError(\"close\", cause))),\n };\n }),\n );\n }\n}\n\nexport interface BrowserRunInteractiveSession {\n readonly handle: BrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n /**\n * Resize without charging an agent action or changing emulation modes. Shares\n * the handle's fail-fast lock, page-policy preflight, and elapsed deadline.\n * A timeout or interruption leaves the session unusable; no resize is retried.\n * The host must authorize callers. No viewer ownership or durable state is added.\n */\n readonly resizeViewport: (\n viewport: BrowserRunViewport,\n ) => Effect.Effect<void, InteractiveBrowserError>;\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 cleanupSemantics?: \"confirmed-terminal\";\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\n return await Reflect.apply(send, session, [command, parameters]);\n },\n detach: () => session.detach(),\n});\n\nclass BrowserRunActionUndispatched extends Error {\n readonly matchCount: number;\n\n constructor(matchCount: number) {\n super(\"The browser action selector did not resolve to exactly one element\");\n this.matchCount = matchCount;\n }\n}\n\nconst readActionTarget = (page: Page, selector: string): Promise<unknown> =>\n page.evaluate((requestedSelector) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n let matches;\n\n try {\n matches = Reflect.apply(Reflect.get(pageDocument, \"querySelectorAll\"), pageDocument, [\n requestedSelector,\n ]);\n } catch (cause) {\n if (cause instanceof Error && cause.name === \"SyntaxError\") {\n return { matchCount: 0, invalidSelector: true };\n }\n throw cause;\n }\n if (typeof matches !== \"object\" || matches === null) throw new Error(\"Invalid query result\");\n const matchCount = Math.min(10_000, Reflect.get(matches, \"length\"));\n const element = Reflect.get(matches, 0);\n\n if (element === undefined) return { matchCount };\n\n const associated = Reflect.get(element, \"control\") ?? element;\n const tagName = String(Reflect.get(associated, \"tagName\") ?? \"\").toLowerCase();\n const inputType = String(Reflect.get(associated, \"type\") ?? \"\").toLowerCase();\n\n const role = String(\n Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\"role\"]) ?? \"\",\n ).toLowerCase();\n\n const kind =\n tagName === \"button\" || role === \"button\"\n ? \"button\"\n : inputType === \"checkbox\" || role === \"checkbox\" || role === \"switch\"\n ? \"checkbox\"\n : inputType === \"radio\" || role === \"radio\"\n ? \"radio\"\n : tagName === \"select\"\n ? \"select\"\n : tagName === \"input\" || tagName === \"textarea\"\n ? \"text\"\n : tagName === \"a\"\n ? \"link\"\n : \"other\";\n\n const checked = Reflect.get(associated, \"checked\");\n\n const selected =\n tagName === \"select\"\n ? Reflect.get(associated, \"selectedIndex\") >= 0\n : Reflect.get(associated, \"selected\");\n\n const disabled = Reflect.get(associated, \"disabled\");\n const required = Reflect.get(associated, \"required\");\n const validity = Reflect.get(associated, \"validity\");\n const form = Reflect.get(associated, \"form\");\n\n const formMatches =\n form === null || form === undefined ? undefined : Reflect.get(form, \"matches\");\n\n const ariaChecked = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-checked\",\n ]);\n\n const ariaDisabled = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-disabled\",\n ]);\n\n const ariaSelected = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-selected\",\n ]);\n\n return {\n matchCount,\n kind,\n ...(typeof checked === \"boolean\"\n ? { checked }\n : ariaChecked === \"true\" || ariaChecked === \"false\"\n ? { checked: ariaChecked === \"true\" }\n : {}),\n ...(typeof selected === \"boolean\"\n ? { selected }\n : ariaSelected === \"true\" || ariaSelected === \"false\"\n ? { selected: ariaSelected === \"true\" }\n : {}),\n disabled: typeof disabled === \"boolean\" ? disabled : ariaDisabled === \"true\",\n ...(typeof required === \"boolean\" ? { required } : {}),\n ...(validity !== undefined && typeof Reflect.get(validity, \"valid\") === \"boolean\"\n ? { valid: Reflect.get(validity, \"valid\") }\n : {}),\n ...(typeof formMatches === \"function\"\n ? { formValid: Reflect.apply(formMatches, form, [\":valid\"]) }\n : {}),\n };\n }, selector);\n\n// SDK promises cannot be cancelled. Clear our timer and observe late rejections;\n// the owning browser Scope is responsible for terminating the remote session.\nconst boundedBestEffort = async <A>(\n promise: Promise<A>,\n millis: number,\n): Promise<A | undefined> => {\n let timer: ReturnType<typeof setTimeout> | number | undefined;\n\n try {\n return await Promise.race([\n promise.catch(() => undefined),\n new Promise<undefined>((resolve) => {\n timer = setTimeout(resolve, millis);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n};\n\nconst readActionTargetAfter = (page: Page, selector: string) =>\n boundedBestEffort(\n readActionTarget(page, selector).then(Schema.decodeUnknownSync(ActionTargetState)),\n ACTION_POST_STATE_MILLIS,\n );\n\nconst makeActionRequestTracker = (page: Page, signal: AbortSignal) => {\n const pending = new Set<HTTPRequest>();\n let total = 0;\n let status2xx = 0;\n let status3xx = 0;\n let status4xx = 0;\n let status5xx = 0;\n let failed = 0;\n let lastChange = performance.now();\n let closed = false;\n let wake: (() => void) | undefined;\n let timer: ReturnType<typeof setTimeout> | number | undefined;\n\n const relevant = (request: HTTPRequest) => {\n const resourceType = request.resourceType();\n\n return resourceType === \"fetch\" || resourceType === \"xhr\";\n };\n\n const onRequest = (request: HTTPRequest) => {\n if (!relevant(request)) return;\n pending.add(request);\n total++;\n lastChange = performance.now();\n };\n\n const onFinished = (request: HTTPRequest) => {\n if (!pending.delete(request)) return;\n let status: number | undefined;\n\n try {\n status = request.response()?.status();\n } catch {\n // Provider response details remain intentionally unavailable to diagnostics.\n }\n if (status !== undefined) {\n if (status >= 200 && status < 300) status2xx++;\n else if (status >= 300 && status < 400) status3xx++;\n else if (status >= 400 && status < 500) status4xx++;\n else if (status >= 500 && status < 600) status5xx++;\n }\n lastChange = performance.now();\n };\n\n const onFailed = (request: HTTPRequest) => {\n if (!pending.delete(request)) return;\n failed++;\n lastChange = performance.now();\n };\n\n const close = () => {\n if (closed) return;\n closed = true;\n page.off(\"request\", onRequest);\n page.off(\"requestfinished\", onFinished);\n page.off(\"requestfailed\", onFailed);\n signal.removeEventListener(\"abort\", close);\n clearTimeout(timer);\n wake?.();\n };\n\n try {\n page.on(\"request\", onRequest);\n page.on(\"requestfinished\", onFinished);\n page.on(\"requestfailed\", onFailed);\n signal.addEventListener(\"abort\", close, { once: true });\n if (signal.aborted) close();\n } catch (cause) {\n close();\n throw cause;\n }\n\n const wait = async () => {\n const startedAt = performance.now();\n let settleTimedOut = false;\n\n while (!closed) {\n const now = performance.now();\n\n if (pending.size === 0 && now - lastChange >= ACTION_NETWORK_QUIET_MILLIS) break;\n if (now - startedAt >= ACTION_NETWORK_SETTLE_MILLIS) {\n settleTimedOut = true;\n break;\n }\n await new Promise<void>((resolve) => {\n wake = resolve;\n timer = setTimeout(() => resolve(), 50);\n });\n wake = undefined;\n }\n\n return {\n total,\n status2xx,\n status3xx,\n status4xx,\n status5xx,\n failed,\n pending: pending.size,\n settleTimedOut,\n };\n };\n\n return {\n wait,\n close,\n markActionSettled: () => {\n lastChange = performance.now();\n },\n };\n};\n\nconst disposeActionHandles = async (handles: ReadonlyArray<{ dispose: () => Promise<void> }>) => {\n await boundedBestEffort(\n Promise.allSettled(handles.map(async (handle) => handle.dispose())),\n ACTION_POST_STATE_MILLIS,\n );\n};\n\nconst runObservedPageAction = async (\n page: Page,\n selector: string,\n signal: AbortSignal,\n onDispatch: () => void,\n action: (element: NonNullable<Awaited<ReturnType<Page[\"$\"]>>>) => Promise<void>,\n): Promise<unknown> => {\n if (signal.aborted) throw new BrowserRunActionUndispatched(0);\n\n const before = Schema.decodeUnknownSync(ActionTargetState)(\n await readActionTarget(page, selector),\n );\n\n if (before.matchCount !== 1 || before.invalidSelector === true) {\n throw new BrowserRunActionUndispatched(before.matchCount);\n }\n const matches = await page.$$(selector);\n\n if (matches.length !== 1 || matches[0] === undefined) {\n await disposeActionHandles(matches);\n throw new BrowserRunActionUndispatched(Math.min(10_000, matches.length));\n }\n if (signal.aborted) {\n await disposeActionHandles(matches);\n throw new BrowserRunActionUndispatched(1);\n }\n\n let tracker: ReturnType<typeof makeActionRequestTracker> | undefined;\n let disposing: Promise<void> | undefined;\n const dispose = () => (disposing ??= disposeActionHandles(matches));\n\n const onAbort = () => {\n void dispose();\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n tracker = makeActionRequestTracker(page, signal);\n // No await between the final cancellation fence and SDK dispatch. Once\n // dispatched, interruption is uncertain, even if the SDK later resolves.\n if (signal.aborted) throw new BrowserRunActionUndispatched(1);\n onDispatch();\n await action(matches[0]);\n tracker.markActionSettled();\n const network = await tracker.wait();\n const after = signal.aborted ? undefined : await readActionTargetAfter(page, selector);\n\n return {\n before,\n ...(after === undefined ? {} : { after }),\n afterUnavailable: after === undefined,\n network,\n };\n } finally {\n tracker?.close();\n signal.removeEventListener(\"abort\", onAbort);\n await dispose();\n }\n};\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n\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\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n\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: \"domcontentloaded\", timeout: 30_000 });\n },\n url: () => page.url(),\n readText: async (selector, maximumBytes) => {\n const observation = Schema.decodeUnknownSync(TextObservation)(\n await page.evaluate(\n (requestedSelector, maximum, maximumControls) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n\n const matches =\n requestedSelector === undefined\n ? undefined\n : Reflect.apply(Reflect.get(pageDocument, \"querySelectorAll\"), pageDocument, [\n requestedSelector,\n ]);\n\n const selectorMatchCount =\n matches === undefined || matches === null\n ? 1\n : Math.min(10_000, Reflect.get(matches, \"length\"));\n\n const element =\n matches === undefined || matches === null\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.get(matches, 0);\n\n if (element === null) return { _tag: \"MissingElement\" };\n if (element === undefined) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n\n const pageText =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n\n const primaryControlSelector =\n 'input,select,textarea,label,button,[role=\"checkbox\"],[role=\"radio\"],[role=\"option\"],[role=\"switch\"],[role=\"tab\"],[role=\"button\"]';\n\n const optionSelector = \"select option\";\n const secondaryControlSelector = \"a[href]\";\n const controlSelector = `${primaryControlSelector},${optionSelector},${secondaryControlSelector}`;\n\n const selectorFor = (candidate: object) => {\n const parts: Array<string> = [];\n let current: object | null = candidate;\n\n while (current !== null && current !== undefined) {\n const tagName = String(Reflect.get(current, \"tagName\") ?? \"\").toLowerCase();\n\n if (tagName === \"\") break;\n const parent: object | null = Reflect.get(current, \"parentElement\");\n\n if (parent === null) {\n parts.push(tagName);\n break;\n }\n let sibling = Reflect.get(current, \"previousElementSibling\");\n let index = 1;\n\n while (sibling !== null && sibling !== undefined) {\n if (String(Reflect.get(sibling, \"tagName\") ?? \"\").toLowerCase() === tagName)\n index++;\n sibling = Reflect.get(sibling, \"previousElementSibling\");\n }\n parts.push(`${tagName}:nth-of-type(${index})`);\n current = parent;\n }\n\n return parts.reverse().join(\" > \");\n };\n\n const visible = (candidate: object) => {\n const hidden = Reflect.get(candidate, \"hidden\");\n\n const ariaHidden = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-hidden\",\n ]);\n\n const rects = Reflect.apply(Reflect.get(candidate, \"getClientRects\"), candidate, []);\n\n return (\n hidden !== true &&\n ariaHidden !== \"true\" &&\n typeof rects === \"object\" &&\n rects !== null &&\n Reflect.get(rects, \"length\") > 0\n );\n };\n\n const candidates: Array<object> = [];\n let controlsTruncated = false;\n\n const consider = (candidate: object) => {\n const tagName = String(Reflect.get(candidate, \"tagName\") ?? \"\").toLowerCase();\n\n // Collapsed native options have no client rects. Their owning\n // select determines visibility; observe text/selection, never value.\n const visibilityTarget =\n tagName === \"option\"\n ? Reflect.apply(Reflect.get(candidate, \"closest\"), candidate, [\"select\"])\n : candidate;\n\n const actionable = tagName !== \"label\" || Reflect.get(candidate, \"control\") !== null;\n\n if (\n !actionable ||\n typeof visibilityTarget !== \"object\" ||\n visibilityTarget === null ||\n !visible(visibilityTarget)\n )\n return;\n candidates.push(candidate);\n if (candidates.length > maximumControls) controlsTruncated = true;\n };\n\n const elementMatches = Reflect.get(element, \"matches\");\n\n if (\n typeof elementMatches === \"function\" &&\n Reflect.apply(elementMatches, element, [controlSelector])\n ) {\n consider(element);\n }\n\n const considerSelector = (candidateSelector: string) => {\n const descendants = Reflect.apply(Reflect.get(element, \"querySelectorAll\"), element, [\n candidateSelector,\n ]);\n\n if (typeof descendants !== \"object\" || descendants === null) return;\n const descendantCount = Reflect.get(descendants, \"length\");\n\n for (let index = 0; index < descendantCount && !controlsTruncated; index++) {\n consider(Reflect.get(descendants, index));\n }\n };\n\n considerSelector(primaryControlSelector);\n if (!controlsTruncated) considerSelector(optionSelector);\n if (!controlsTruncated) considerSelector(secondaryControlSelector);\n\n const controls = candidates.slice(0, maximumControls).map((candidate) => {\n const associated = Reflect.get(candidate, \"control\") ?? candidate;\n const tagName = String(Reflect.get(candidate, \"tagName\") ?? \"\").toLowerCase();\n const inputType = String(Reflect.get(associated, \"type\") ?? \"\").toLowerCase();\n\n const role = String(\n Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\"role\"]) ?? \"\",\n ).toLowerCase();\n\n const ariaLabel = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-label\",\n ]);\n\n const candidateText =\n tagName === \"textarea\" || tagName === \"input\" || tagName === \"select\"\n ? undefined\n : Reflect.get(candidate, tagName === \"option\" ? \"label\" : \"innerText\");\n\n const associatedLabels = Reflect.get(associated, \"labels\");\n\n const associatedLabel =\n associatedLabels !== undefined &&\n associatedLabels !== null &&\n Reflect.get(associatedLabels, \"length\") > 0\n ? Reflect.get(Reflect.get(associatedLabels, 0), \"innerText\")\n : undefined;\n\n const label = String(\n typeof ariaLabel === \"string\" && ariaLabel !== \"\"\n ? ariaLabel\n : typeof candidateText === \"string\" && candidateText !== \"\"\n ? candidateText\n : (associatedLabel ?? \"\"),\n )\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200);\n\n const checked = Reflect.get(associated, \"checked\");\n\n const selected =\n tagName === \"select\"\n ? Reflect.get(associated, \"selectedIndex\") >= 0\n : Reflect.get(associated, \"selected\");\n\n const disabled = Reflect.get(associated, \"disabled\");\n const required = Reflect.get(associated, \"required\");\n const validity = Reflect.get(associated, \"validity\");\n const form = Reflect.get(associated, \"form\");\n\n const formMatches =\n form === null || form === undefined ? undefined : Reflect.get(form, \"matches\");\n\n const ariaChecked = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-checked\",\n ]);\n\n const ariaSelected = Reflect.apply(\n Reflect.get(candidate, \"getAttribute\"),\n candidate,\n [\"aria-selected\"],\n );\n\n const ariaDisabled = Reflect.apply(\n Reflect.get(candidate, \"getAttribute\"),\n candidate,\n [\"aria-disabled\"],\n );\n\n return {\n selector: selectorFor(candidate),\n kind:\n tagName === \"label\"\n ? `label:${inputType || \"control\"}`\n : tagName === \"input\"\n ? `input:${inputType || \"text\"}`\n : role !== \"\"\n ? `role:${role}`\n : tagName,\n ...(label === \"\" ? {} : { label }),\n ...(typeof checked === \"boolean\"\n ? { checked }\n : ariaChecked === \"true\" || ariaChecked === \"false\"\n ? { checked: ariaChecked === \"true\" }\n : {}),\n ...(typeof selected === \"boolean\"\n ? { selected }\n : ariaSelected === \"true\" || ariaSelected === \"false\"\n ? { selected: ariaSelected === \"true\" }\n : {}),\n ...(typeof disabled === \"boolean\"\n ? { disabled }\n : ariaDisabled === \"true\" || ariaDisabled === \"false\"\n ? { disabled: ariaDisabled === \"true\" }\n : {}),\n ...(typeof required === \"boolean\" ? { required } : {}),\n ...(validity !== undefined && typeof Reflect.get(validity, \"valid\") === \"boolean\"\n ? { valid: Reflect.get(validity, \"valid\") }\n : {}),\n ...(typeof formMatches === \"function\"\n ? { formValid: Reflect.apply(formMatches, form, [\":valid\"]) }\n : {}),\n };\n });\n\n // JSON is the bounded wire representation of this existing text result.\n // eslint-disable-next-line no-restricted-properties\n const text = JSON.stringify({\n pageText,\n selectorMatchCount,\n controls,\n controlsTruncated,\n });\n\n const observed = new TextEncoder().encode(text).byteLength;\n\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n MAX_OBSERVED_CONTROLS,\n ),\n );\n\n if (observation._tag === \"Text\") Schema.decodeSync(PageObservation)(observation.text);\n\n return observation;\n },\n fill: (selector, value, signal, onDispatch) =>\n runObservedPageAction(page, selector, signal, onDispatch, (element) =>\n element.evaluate((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\n while (prototype !== null) {\n const setter = Reflect.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n\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\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.apply(setValue, element, [nextValue]);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n\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 }, value),\n ),\n click: (selector, signal, onDispatch) =>\n runObservedPageAction(page, selector, signal, onDispatch, (element) => element.click()),\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\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 setViewport: (viewport) => page.setViewport(viewport),\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 undispatchedActionError = (operation: BrowserOperation): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation was not dispatched`,\n });\n\n/** Recognizes a local pre-dispatch refusal without exposing selector or page content. */\nexport const isBrowserRunUndispatchedActionError = (error: unknown): boolean =>\n Schema.is(InteractiveBrowserActionError)(error) &&\n error.implementation.identity === browserRunInteractiveImplementation.identity &&\n (error.operation === \"click\" || error.operation === \"fill\") &&\n error.message === `The interactive browser ${error.operation} operation was not dispatched`;\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\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 = Effect.fn(\"BrowserRunInteractive.snapshotPolicy\")(function* (\n input: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n InteractiveBrowserPolicySnapshot,\n InteractiveBrowserPolicyDeniedError | InteractiveBrowserUnsupportedError\n> {\n const decoded = yield* Schema.decodeEffect(InteractiveBrowserPolicy, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")));\n\n if (decoded.network._tag === \"PublicWeb\") {\n return yield* InteractiveBrowserUnsupportedError.make({\n implementation: browserRunInteractiveImplementation,\n feature: \"policy\",\n message:\n \"Cloudflare Browser Run cannot enforce the PublicWeb network policy for all session traffic\",\n });\n }\n\n return Object.freeze({\n network:\n decoded.network._tag === \"ExactHosts\"\n ? Object.freeze({\n _tag: decoded.network._tag,\n allowedHosts: Object.freeze([...decoded.network.allowedHosts]),\n })\n : Object.freeze({ _tag: decoded.network._tag }),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n });\n});\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n if (policy.network._tag === \"Unrestricted\") return true;\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.network.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\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\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\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n\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\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 consumeAction?: boolean,\n ) => Effect.Effect<A, BrowserFailure>;\n}\n\nclass BrowserRunRemoteFailure {\n readonly cause: unknown;\n\n constructor(cause: unknown) {\n this.cause = cause;\n }\n}\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n\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\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\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\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\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n\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\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n\n return;\n }\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\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: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => new BrowserRunRemoteFailure(cause),\n }).pipe(\n Effect.catch(\n (\n failure,\n ): Effect.Effect<never, InteractiveBrowserActionError | InteractiveBrowserExpiredError> => {\n const cause = failure.cause;\n\n if (cause instanceof BrowserRunActionUndispatched) {\n return Effect.logInfo(\"Browser interactive action was not dispatched\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.selector_match_count\": cause.matchCount,\n }),\n Effect.andThen(Effect.fail(undispatchedActionError(operation))),\n );\n }\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n\n return Effect.fail(expiredError());\n }\n\n return Effect.fail(actionError(operation, cause));\n },\n ),\n );\n\n const observedAction = (\n operation: \"fill\" | \"click\",\n evaluate: (signal: AbortSignal, onDispatch: () => void) => Promise<unknown>,\n ) =>\n Effect.suspend(() => {\n let dispatched = false;\n let pending: Promise<unknown> | undefined;\n\n return remote(operation, (signal) => {\n pending = evaluate(signal, () => {\n dispatched = true;\n });\n\n return pending;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.gen(function* () {\n state.uncertain.value = true;\n // Retain evidence before Scope teardown, without claiming SDK\n // cancellation or success. A late completion never makes this replayable.\n yield* Effect.logWarning(\"Browser interactive action interrupted\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.action_dispatched\": dispatched,\n \"browser.action_outcome_unknown\": dispatched,\n }),\n );\n const completion = pending;\n\n if (completion !== undefined) {\n yield* Effect.promise(() => boundedBestEffort(completion, 500));\n }\n }),\n ),\n );\n });\n\n const decodeActionObservation = Effect.fn(\"BrowserRunInteractive.decodeActionObservation\")(\n function* (raw: unknown) {\n return yield* Schema.decodeUnknownEffect(ActionObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed action observation\", cause),\n ),\n );\n },\n );\n\n const logActionObservation = (\n operation: \"fill\" | \"click\",\n observation: typeof ActionObservation.Type,\n ) =>\n Effect.logInfo(\"Browser interactive action observed\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.selector_match_count\": observation.before.matchCount,\n ...(observation.before.kind === undefined\n ? {}\n : { \"browser.target_kind\": observation.before.kind }),\n ...(observation.before.checked === undefined\n ? {}\n : { \"browser.target_checked_before\": observation.before.checked }),\n ...(observation.after?.checked === undefined\n ? {}\n : { \"browser.target_checked_after\": observation.after.checked }),\n ...(observation.before.selected === undefined\n ? {}\n : { \"browser.target_selected_before\": observation.before.selected }),\n ...(observation.after?.selected === undefined\n ? {}\n : { \"browser.target_selected_after\": observation.after.selected }),\n ...(observation.before.disabled === undefined\n ? {}\n : { \"browser.target_disabled_before\": observation.before.disabled }),\n ...(observation.after?.disabled === undefined\n ? {}\n : { \"browser.target_disabled_after\": observation.after.disabled }),\n ...(observation.before.required === undefined\n ? {}\n : { \"browser.target_required_before\": observation.before.required }),\n ...(observation.after?.required === undefined\n ? {}\n : { \"browser.target_required_after\": observation.after.required }),\n ...(observation.before.valid === undefined\n ? {}\n : { \"browser.target_valid_before\": observation.before.valid }),\n ...(observation.after?.valid === undefined\n ? {}\n : { \"browser.target_valid_after\": observation.after.valid }),\n ...(observation.before.formValid === undefined\n ? {}\n : { \"browser.form_valid_before\": observation.before.formValid }),\n ...(observation.after?.formValid === undefined\n ? {}\n : { \"browser.form_valid_after\": observation.after.formValid }),\n \"browser.target_after_unavailable\": observation.afterUnavailable,\n \"browser.fetch_xhr_total\": observation.network.total,\n \"browser.fetch_xhr_2xx\": observation.network.status2xx,\n \"browser.fetch_xhr_3xx\": observation.network.status3xx,\n \"browser.fetch_xhr_4xx\": observation.network.status4xx,\n \"browser.fetch_xhr_5xx\": observation.network.status5xx,\n \"browser.fetch_xhr_failed\": observation.network.failed,\n \"browser.fetch_xhr_pending\": observation.network.pending,\n \"browser.network_settle_timed_out\": observation.network.settleTimedOut,\n }),\n );\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n consumeAction = true,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n if (consumeAction) {\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\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\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\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\n if (\n Schema.is(InteractiveBrowserActionError)(error) &&\n !isBrowserRunUndispatchedActionError(error)\n ) {\n state.uncertain.value = true;\n }\n\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap(\n Effect.fromOption(() =>\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\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n Schema.is(InteractiveBrowserTargetUrl)(request.url) && 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\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\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\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\n return yield* Schema.decodeEffect(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 Effect.gen(function* () {\n const observation = yield* observedAction(\"fill\", (signal, onDispatch) =>\n page.fill(request.selector, request.value, signal, onDispatch),\n ).pipe(Effect.flatMap(decodeActionObservation));\n\n yield* logActionObservation(\"fill\", observation);\n\n return yield* decodeActionResult(page, policy);\n }),\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const observation = yield* observedAction(\"click\", (signal, onDispatch) =>\n page.click(request.selector, signal, onDispatch),\n ).pipe(Effect.flatMap(decodeActionObservation));\n\n yield* logActionObservation(\"click\", observation);\n\n return yield* decodeActionResult(page, policy);\n }),\n ),\n screenshot: (request) =>\n Schema.decodeEffect(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\n const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\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\n return yield* Schema.decodeEffect(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.decodeEffect(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\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\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\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\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 closeSession = binding.closeSession;\n\n const terminate = Effect.fn(\"BrowserRunInteractiveHost.terminate\")(function* (\n sessionId: Redacted.Redacted<string>,\n entries: ReadonlyArray<CloseEntry>,\n ) {\n const deadline = (yield* Clock.currentTimeMillis) + 10_000;\n\n yield* closeSession(sessionId).pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n );\n const remaining = deadline - (yield* Clock.currentTimeMillis);\n\n if (remaining <= 0)\n return yield* Effect.logWarning(\n \"Local browser teardown skipped after confirmed termination deadline\",\n );\n // Remote termination is authoritative. Local cleanup must not veto it or extend the deadline.\n yield* runTeardown(entries).pipe(\n Effect.flatMap((failures) =>\n Effect.forEach(failures, (failure) => Effect.logWarning(failure.warning), {\n discard: true,\n }),\n ),\n Effect.interruptible,\n Effect.timeout(`${remaining} millis`),\n Effect.catchCause(() =>\n Effect.logWarning(\"Local browser teardown incomplete after confirmed termination\"),\n ),\n );\n });\n\n const closeAcquired = Effect.fn(\"BrowserRunInteractiveHost.closeAcquired\")(function* (\n browser: BrowserRunInteractiveBrowser,\n ) {\n const sessionId = yield* Effect.try({\n try: browser.sessionId,\n catch: () => actionError(\"close\"),\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(BrowserRunSessionId)),\n Effect.mapError(() => actionError(\"close\")),\n Effect.onError(() =>\n closeWithWarning(browser.close, \"Closing an unidentified browser failed\"),\n ),\n );\n\n yield* terminate(Redacted.make(sessionId), [\n closeEntry(browser.close, \"Closing the local browser connection failed\"),\n ]);\n });\n\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 // Late SDK replies outlive the opening fiber; cleanup retains this pass's clock.\n const runCleanup = Effect.runPromiseWith(Context.make(Clock.Clock, yield* Clock.Clock));\n\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\n const lifecycle = {\n managedTeardownInstalled: false,\n };\n\n const closers: Array<CloseEntry> = [];\n\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) => runCleanup(closeAcquired(acquired)),\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\n return lifecycle.managedTeardownInstalled\n ? Effect.void\n : closeAcquired(acquired).pipe(\n Effect.catch(() => Effect.logWarning(\"Whole-browser cleanup remains unconfirmed\")),\n );\n },\n { interruptible: true },\n );\n\n closers.push(closeEntry(browser.close, \"Closing the interactive browser failed\"));\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\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\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) => protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n\n if (!connected) {\n state.disconnected.value = true;\n\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\n closers.push(closeEntry(context.close, \"Closing the interactive browser context failed\"));\n\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\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\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\n if (setupFailure !== undefined) return yield* setupFailure;\n\n const teardown = yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const cached = yield* Effect.cached(terminate(Redacted.make(sessionIdValue), closers));\n\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.catch(() => Effect.logWarning(\"Whole-browser cleanup remains unconfirmed\")),\n ),\n ),\n );\n\n return cached;\n }),\n );\n\n const close: Effect.Effect<void, InteractiveBrowserError> = Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(Effect.andThen(teardown)),\n );\n\n const runtime = yield* makeHandle(page, fixedPolicy, startedAt, state, close);\n const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);\n\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 resizeViewport: (viewport) =>\n decodeViewport(viewport).pipe(\n Effect.flatMap((decoded) =>\n runtime.run(\n Effect.tryPromise({\n try: () => page.setViewport(decoded),\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n\n return expiredError();\n }\n\n return protocolError(\"Resizing the browser viewport failed\", cause);\n },\n }),\n currentPagePreflight,\n false,\n ),\n ),\n ),\n getLiveView: (request) =>\n Schema.decodeEffect(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.decodeEffect(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.decodeEffect(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.decodeEffect(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.decodeEffect(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 return BrowserRunInteractiveHost.of({\n open,\n closeSession,\n cleanupSemantics: \"confirmed-terminal\",\n });\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\n return InteractiveBrowser.of({\n open: (policy) => host.open(policy).pipe(Effect.map((session) => session.handle)),\n });\n }),\n );\n\n/** Resolved Worker binding, cleanup credentials, and optional initial viewport. */\nexport interface CloudflareInteractiveBrowserOptions extends BrowserRunLifecycleOptions {\n readonly browser: BrowserRun;\n readonly viewport?: BrowserRunViewport;\n}\n\nconst interactiveBindingLayer = (options: CloudflareInteractiveBrowserOptions) =>\n BrowserRunInteractiveBinding.layer(options).pipe(\n Layer.provide(BrowserRunSessionLifecycle.layer(options)),\n );\n\n/** Worker-only assembly; importing ordinary capture never loads Puppeteer. */\nexport const CloudflareInteractiveBrowser = {\n /**\n * Assemble binding, confirmed-session cleanup, and the generic browser service.\n * HttpClient and construction errors remain visible. Opening a pass still requires\n * an explicit policy and Scope; no browser is launched during Layer construction.\n */\n layer: (options: CloudflareInteractiveBrowserOptions) =>\n browserRunInteractiveLayer().pipe(Layer.provide(interactiveBindingLayer(options))),\n /** Opt into private host controls instead of exposing them through the generic service. */\n hostLayer: (options: CloudflareInteractiveBrowserOptions) =>\n browserRunInteractiveHostLayer().pipe(Layer.provide(interactiveBindingLayer(options))),\n};\n"],"mappings":";;;;;;;AAGA,IAAa,yBAAb,cAA4C,OAAO,YAAoC,CAAC,CACtF,0BACA;CACE,QAAQ,OAAO,SAAS;EACtB;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,QAAQ,OAAO,YAAY,OAAO,GAAG;AACvC,CACF,CAAC,CAAC,CAAC;AAOH,MAAM,WAAW,OAAO,OAAO,MAAM,OAAO,OAAO,CAAC;AACpD,MAAM,UAAU,OAAO,OAAO,MAAM,OAAO,UAAU,gBAAgB,CAAC;AACtE,MAAM,SAAS,OAAO,OAAO,EAAE,QAAQ,OAAO,SAAS,CAAC,WAAW,QAAQ,CAAC,EAAE,CAAC;AAC/E,MAAM,WAAW,OAAO,OAAO;CAAE,WAAW;CAAU,SAAS,OAAO,YAAY,OAAO,MAAM;AAAE,CAAC;AAGlG,MAAM,SAAS,OAAO,OAAO,EAAE,OAAO,OAAO,QAAQ,mBAAmB,EAAE,CAAC;AAE3E,IAAa,6BAAb,cAAgD,QAAQ,QAOtD,CAAC,CAAC,8DAA8D,CAAC,CAAC;CAClE,OAAO,MAAM,SAAqC;EAChD,OAAO,MAAM,OACX,MACA,OAAO,IAAI,aAAa;GACtB,IACE,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,QAAQ,SAAS,KACrC,SAAS,MAAM,QAAQ,QAAQ,CAAC,CAAC,WAAW,GAE5C,OAAO,OAAO,IAAI,uBAAuB,EAAE,QAAQ,gBAAgB,CAAC;GAEtE,MAAM,SAAS,OAAO,WAAW;GAEjC,MAAM,UAAU,OAAO,GAAG,oCAAoC,CAAC,CAAC,WAC9D,QACA,WACA;IACA,MAAM,OAAO,WAAW,WAAW,YAAY;IAE/C,MAAM,WAAW,OAAO,OACrB,QACC,kBAAkB,KAAK,MAAM,CAAC,CAC5B,iDAAiD,QAAQ,UAAU,8BAA8B,KAAK,GAAG,WAC3G,CAAC,CAAC,KAAK,kBAAkB,YAAY,QAAQ,QAAQ,CAAC,CACxD,CAAC,CACA,KAEC,OAAO,eAAe,gBAAgB,aAAa,EAAE,UAAU,SAAS,CAAC,GACzE,OAAO,eAAe,IAAI,uBAAuB,EAAE,QAAQ,WAAW,CAAC,CAAC,CAC1E;IAEF,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KACjD,OAAO,OAAO,IAAI,uBAAuB;KACvC,QAAQ;KACR,QAAQ,SAAS;IACnB,CAAC;IACH,IAAI,SAAS,WAAW,KACtB,OAAO,OAAO,IAAI,uBAAuB;KACvC,QAAQ;KACR,QAAQ,SAAS;IACnB,CAAC;IACH,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KACjD,OAAO,OAAO,IAAI,uBAAuB;KACvC,QAAQ;KACR,QAAQ,SAAS;IACnB,CAAC;IACH,IAAI,SAAS,QAAQ,eAAe,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,MAAM,oBACjE,OAAO,OAAO,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC;IAElE,MAAM,QAAQ,OAAO,OAAO,cAC1B,SAAS,8BACH,IAAI,WAAW,IACpB,MAAM,UAAU;KACf,IAAI,KAAK,aAAa,MAAM,aAAa,OACvC,OAAO,OAAO,KAAK,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC,CAAC;KACxE,MAAM,WAAW,IAAI,WAAW,KAAK,aAAa,MAAM,UAAU;KAElE,SAAS,IAAI,IAAI;KACjB,SAAS,IAAI,OAAO,KAAK,UAAU;KAEnC,OAAO,OAAO,QAAQ,QAAQ;IAChC,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC,CAAC,CAAC;IAEjF,MAAM,OAAO,OAAO,OAAO,IAAI;KAC7B,WAAW,IAAI,YAAY,SAAS;MAAE,OAAO;MAAM,WAAW;KAAM,CAAC,CAAC,CAAC,OAAO,KAAK;KACnF,aAAa,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC;IACjE,CAAC;IAED,IAAI,SAAS,WAAW,KAAK;KAC3B,MAAM,SAAS,OAAO,aAAa,OAAO,eAAe,MAAM,CAAC,CAAC,CAAC,MAAM,EACtE,kBAAkB,QACpB,CAAC;KAED,IAAI,OAAO,OAAO,MAAM,GAAG,OAAO;KAElC,OAAO,OAAO,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC;IAClE;IACA,IAAI,WAAW,UAKb,QAAO,OAJe,OAAO,aAAa,OAAO,eAAe,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAC7E,OAAO,eAAe,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC,CAAC,CAC3E,EAAA,CAEc,WAAW;IAG3B,MAAM,SAAS,OAAO,OAAO,aAAa,OAAO,eAAe,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAC/E,OAAO,eAAe,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC,CAAC,CAC3E;IAEA,IAAI,OAAO,cAAc,WACvB,OAAO,OAAO,IAAI,uBAAuB,EAAE,QAAQ,YAAY,CAAC;IAElE,OAAO,OAAO,YAAY,KAAA,KAAa,OAAO,UAAU;GAC1D,CAAC;GAsBD,OAAO,EAAE,OApBK,OAAO,GAAG,kCAAkC,CAAC,CACzD,WAAW,WAAsC;IAC/C,MAAM,KAAK,OAAO,OAAO,aAAa,QAAQ,CAAC,CAAC,SAAS,MAAM,SAAS,CAAC,CAAC,CAAC,KACzE,OAAO,eAAe,IAAI,uBAAuB,EAAE,QAAQ,gBAAgB,CAAC,CAAC,CAC/E;IAEA,IAAI,OAAO,QAAQ,UAAU,EAAE,GAAG;IAClC,KAAK,IAAI,OAAO,GAAG,OAAO,GAAG,QAC3B,IAAI,OAAO,QAAQ,OAAO,EAAE,GAAG;IAGjC,OAAO,OAAO,IAAI,uBAAuB,EAAE,QAAQ,UAAU,CAAC;GAChE,GACA,OAAO,cAAc;IACnB,UAAU;IACV,cAAc,OAAO,KAAK,IAAI,uBAAuB,EAAE,QAAQ,UAAU,CAAC,CAAC;GAC7E,CAAC,GACD,OAAO,kBAAkB,KAAK,CAGnB,EAAE;EACjB,CAAC,CACH;CACF;AACF;;;ACxGA,MAAa,sCAAsC,sBAAsB,KAAK;CAC5E,WAAW;CACX,UAAU;AACZ,CAAC;AAED,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAC9B,MAAM,kBAAkB;AACxB,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,6BAA6B;AACnC,MAAM,uBAAuB;AAC7B,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,+BAA+B;AACrC,MAAM,2BAA2B;AACjC,MAAM,wBAAwB;AAC9B,MAAM,cAAc,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;AAE5D,MAAM,kBAAkB,OAAO,OAAO,MACpC,OAAO,YAAY,CAAC,GACpB,OAAO,YAAY,oBAAoB,CACzC;AAEA,MAAM,oBAAoB,OAAO,OAAO,MAAM,OAAO,YAAY,eAAe,CAAC;AAEjF,MAAM,kBAAkB,OAAO,MAAM;CACnC,OAAO,OAAO;EAAE,MAAM,OAAO,QAAQ,MAAM;EAAG,MAAM;CAAkB,CAAC;CACvE,OAAO,OAAO,EAAE,MAAM,OAAO,QAAQ,gBAAgB,EAAE,CAAC;CACxD,OAAO,OAAO;EAAE,MAAM,OAAO,QAAQ,WAAW;EAAG,UAAU,OAAO;CAAQ,CAAC;AAC/E,CAAC;AAED,MAAM,oBAAoB,OAAO,OAAO;CACtC,YAAY,OAAO;CACnB,iBAAiB,OAAO,YAAY,OAAO,OAAO;CAClD,MAAM,OAAO,YACX,OAAO,SAAS;EAAC;EAAU;EAAY;EAAS;EAAU;EAAQ;EAAQ;CAAO,CAAC,CACpF;CACA,SAAS,OAAO,YAAY,OAAO,OAAO;CAC1C,UAAU,OAAO,YAAY,OAAO,OAAO;CAC3C,UAAU,OAAO,YAAY,OAAO,OAAO;CAC3C,UAAU,OAAO,YAAY,OAAO,OAAO;CAC3C,OAAO,OAAO,YAAY,OAAO,OAAO;CACxC,WAAW,OAAO,YAAY,OAAO,OAAO;AAC9C,CAAC;AAED,MAAM,qBAAqB,OAAO,OAAO;CACvC,OAAO,OAAO;CACd,WAAW,OAAO;CAClB,WAAW,OAAO;CAClB,WAAW,OAAO;CAClB,WAAW,OAAO;CAClB,QAAQ,OAAO;CACf,SAAS,OAAO;CAChB,gBAAgB,OAAO;AACzB,CAAC;AAED,MAAM,oBAAoB,OAAO,OAAO;CACtC,QAAQ;CACR,OAAO,OAAO,YAAY,iBAAiB;CAC3C,kBAAkB,OAAO;CACzB,SAAS;AACX,CAAC;AAED,MAAM,kBAAkB,OAAO,eAC7B,OAAO,OAAO;CACZ,UAAU;CACV,oBAAoB,OAAO;CAC3B,mBAAmB,OAAO;CAC1B,UAAU,OAAO,MACf,OAAO,OAAO;EACZ,UAAU;EACV,MAAM;EACN,OAAO,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC,CAAC;EACtE,SAAS,OAAO,YAAY,OAAO,OAAO;EAC1C,UAAU,OAAO,YAAY,OAAO,OAAO;EAC3C,UAAU,OAAO,YAAY,OAAO,OAAO;EAC3C,UAAU,OAAO,YAAY,OAAO,OAAO;EAC3C,OAAO,OAAO,YAAY,OAAO,OAAO;EACxC,WAAW,OAAO,YAAY,OAAO,OAAO;CAC9C,CAAC,CACH,CAAC,CAAC,MAAM,OAAO,YAAY,qBAAqB,CAAC;AACnD,CAAC,CACH;AAEA,MAAM,WAAW,OAAO,WAAW,MACjC,OAAO,YAAY,oBAAoB,GACvC,OAAO,YACJ,UACC,MAAM,UAAU,KAChB,MAAM,OAAO,OACb,MAAM,OAAO,MACb,MAAM,OAAO,MACb,MAAM,OAAO,MACb,MAAM,OAAO,MACb,MAAM,OAAO,MACb,MAAM,OAAO,MACb,MAAM,OAAO,IACf,EAAE,OAAO,YAAY,CACvB,CACF;AAEA,MAAM,sBAAsB,OAAO,OAAO,MACxC,OAAO,YAAY,CAAC,GACpB,OAAO,YAAY,GAAG,GACtB,OAAO,YAAY,UAAU,mBAAmB,KAAK,KAAK,GAAG,EAC3D,OAAO,mCACT,CAAC,CACH;AAEA,MAAM,cAAc,OAAO,OAAO,MAChC,OAAO,YAAY,oBAAoB,GACvC,OAAO,YACJ,UAAU;CACT,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,OACE,IAAI,aAAa,YACjB,IAAI,SAAS,sBACb,IAAI,aAAa,MACjB,IAAI,aAAa,MACjB,IAAI,aAAa,cACjB,IAAI,aAAa,IAAI,MAAM,MAAM,UAChC,IAAI,aAAa,IAAI,KAAK,KAAK,GAAA,CAAI,WAAW,wCAAwC;CAE3F,QAAQ;EACN,OAAO;CACT;AACF,GACA,EAAE,OAAO,mCAAmC,CAC9C,CACF;AAEA,MAAM,sBAAsB,OAAO,OAAO,EAAE,qBAAqB,YAAY,CAAC;AAC9E,MAAM,qBAAqB,OAAO,OAAO,EAAE,WAAW,gBAAgB,CAAC;AAEvE,MAAM,kBAAkB,OAAO,QAAQ,MACrC,OAAO,oBAAoB,0BAA0B,CACvD;AAEA,MAAM,0BAA0B,OAAO,MAAM,CAC3C,OAAO,OAAO;CACZ,QAAQ,OAAO,QAAQ,IAAI;CAC3B,WAAW;CACX,YAAY;AACd,CAAC,GACD,OAAO,OAAO;CACZ,QAAQ,OAAO,QAAQ,KAAK;CAC5B,WAAW,OAAO,YAAY,eAAe;CAC7C,YAAY,OAAO,YAAY,eAAe;AAChD,CAAC,CACH,CAAC;;;;;;AAOD,IAAa,qBAAb,cAAwC,OAAO,MAA0B,oBAAoB,CAAC,CAC5F,OAAO,OAAO;CACZ,OAAO,YAAY,MAAM,OAAO,oBAAoB,IAAK,CAAC;CAC1D,QAAQ,YAAY,MAAM,OAAO,oBAAoB,IAAK,CAAC;CAC3D,mBAAmB,OAAO,YACxB,OAAO,OAAO,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAE,CAAC,CAAC,CAClE;AACF,CAAC,CAAC,CAAC,MACD,OAAO,YACJ,aACC,KAAK,IAAI,SAAS,OAAO,SAAS,MAAM,KAAK,SAAS,qBAAqB,MAAM,MACnF,EAAE,OAAO,+DAA+D,CAC1E,CACF,CACF,CAAC,CAAC,CAAC;AAEH,MAAM,kBAAkB,UACtB,OAAO,aAAa,kBAAkB,CAAC,CAAC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KAC5E,OAAO,eAAe,YAAY,mCAAmC,CAAC,GAEtE,OAAO,KAAK,cAAc;CACxB,OAAO,SAAS;CAChB,QAAQ,SAAS;CACjB,mBAAmB,SAAS,qBAAqB;AACnD,EAAE,CACJ;;AAGF,IAAa,4BAAb,cAA+C,OAAO,MACpD,2BACF,CAAC,CAAC;CACA,MAAM,OAAO,QAAQ,KAAK;CAC1B,aAAa,YAAY,MACvB,OAAO,UAAU;EACf,SAAS;EACT,SAAS;CACX,CAAC,CACH;AACF,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,2BAAb,cAA8C,OAAO,MACnD,0BACF,CAAC,CAAC,EAAE,qBAAqB,OAAO,SAAS,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;;AAG1D,IAAa,2BAAb,cAA8C,OAAO,MACnD,0BACF,CAAC,CAAC;CACA,cAAc,gBAAgB,MAAM,OAAO,YAAY,IAAK,CAAC;CAC7D,SAAS,YAAY,MAAM,OAAO,oBAAoB,0BAA0B,CAAC;AACnF,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,0BAAb,cAA6C,OAAO,MAClD,yBACF,CAAC,CAAC,EAAE,WAAW,OAAO,SAAS,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;AAEpD,IAAa,yBAAb,cAA4C,OAAO,MACjD,wBACF,CAAC,CAAC;CACA,QAAQ,OAAO;CACf,WAAW,OAAO,YAAY,OAAO,SAAS,eAAe,CAAC;CAC9D,YAAY,OAAO,YAAY,eAAe;AAChD,CAAC,CAAC,CAAC,CAAC;;AA0EJ,IAAa,+BAAb,MAAa,qCAAqC,QAAQ,QASxD,CAAC,CAAC,gEAAgE,CAAC,CAAC;CACpE,OAAO,MAAM,SAOX;EACA,OAAO,MAAM,OAAO,4BAA4B,CAAC,CAC/C,OAAO,IAAI,aAAa;GACtB,MAAM,YAAY,OAAO;GAEzB,MAAM,WACJ,QAAQ,aAAa,KAAA,IAAY,KAAA,IAAY,OAAO,eAAe,QAAQ,QAAQ;GAErF,OAAO;IACL,QAAQ,OAAO,oBACb,sBACE,MAAM,UAAU,OAAO,QAAQ,SAAS;KACtC,YAAY;KACZ,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,SAAS,EAAE;IACvE,CAAC,CACH;IACF,eAAe,cACb,UACG,MAAM,SAAS,CAAC,CAChB,KAAK,OAAO,UAAU,UAAU,YAAY,SAAS,KAAK,CAAC,CAAC;GACnE;EACF,CAAC,CACH;CACF;AACF;;AAyBA,IAAa,4BAAb,cAA+C,QAAQ,QAWrD,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC;AAEpE,MAAM,yBAAyB,aAAwD;CACrF,WAAW,QAAQ,IAAI;CACvB,aAAa,QAAQ,MAAM,iBAAiB;CAC5C,gBAAgB,QAAQ,SAAS;AACnC;AAEA,MAAM,4BAA4B,aAA0D;CAC1F,MAAM,OAAO,SAAS,eAAe;EACnC,MAAM,OAAO,QAAQ,IAAI,SAAS,MAAM;EAExC,OAAO,MAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,SAAS,UAAU,CAAC;CACjE;CACA,cAAc,QAAQ,OAAO;AAC/B;AAEA,IAAM,+BAAN,cAA2C,MAAM;CAC/C;CAEA,YAAY,YAAoB;EAC9B,MAAM,oEAAoE;EAC1E,KAAK,aAAa;CACpB;AACF;AAEA,MAAM,oBAAoB,MAAY,aACpC,KAAK,UAAU,sBAAsB;CACnC,MAAM,eAAe,QAAQ,IAAI,YAAY,UAAU;CACvD,IAAI;CAEJ,IAAI;EACF,UAAU,QAAQ,MAAM,QAAQ,IAAI,cAAc,kBAAkB,GAAG,cAAc,CACnF,iBACF,CAAC;CACH,SAAS,OAAO;EACd,IAAI,iBAAiB,SAAS,MAAM,SAAS,eAC3C,OAAO;GAAE,YAAY;GAAG,iBAAiB;EAAK;EAEhD,MAAM;CACR;CACA,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM,MAAM,IAAI,MAAM,sBAAsB;CAC3F,MAAM,aAAa,KAAK,IAAI,KAAQ,QAAQ,IAAI,SAAS,QAAQ,CAAC;CAClE,MAAM,UAAU,QAAQ,IAAI,SAAS,CAAC;CAEtC,IAAI,YAAY,KAAA,GAAW,OAAO,EAAE,WAAW;CAE/C,MAAM,aAAa,QAAQ,IAAI,SAAS,SAAS,KAAK;CACtD,MAAM,UAAU,OAAO,QAAQ,IAAI,YAAY,SAAS,KAAK,EAAE,CAAC,CAAC,YAAY;CAC7E,MAAM,YAAY,OAAO,QAAQ,IAAI,YAAY,MAAM,KAAK,EAAE,CAAC,CAAC,YAAY;CAE5E,MAAM,OAAO,OACX,QAAQ,MAAM,QAAQ,IAAI,SAAS,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,EAC5E,CAAC,CAAC,YAAY;CAEd,MAAM,OACJ,YAAY,YAAY,SAAS,WAC7B,WACA,cAAc,cAAc,SAAS,cAAc,SAAS,WAC1D,aACA,cAAc,WAAW,SAAS,UAChC,UACA,YAAY,WACV,WACA,YAAY,WAAW,YAAY,aACjC,SACA,YAAY,MACV,SACA;CAEhB,MAAM,UAAU,QAAQ,IAAI,YAAY,SAAS;CAEjD,MAAM,WACJ,YAAY,WACR,QAAQ,IAAI,YAAY,eAAe,KAAK,IAC5C,QAAQ,IAAI,YAAY,UAAU;CAExC,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;CACnD,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;CACnD,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;CACnD,MAAM,OAAO,QAAQ,IAAI,YAAY,MAAM;CAE3C,MAAM,cACJ,SAAS,QAAQ,SAAS,KAAA,IAAY,KAAA,IAAY,QAAQ,IAAI,MAAM,SAAS;CAE/E,MAAM,cAAc,QAAQ,MAAM,QAAQ,IAAI,SAAS,cAAc,GAAG,SAAS,CAC/E,cACF,CAAC;CAED,MAAM,eAAe,QAAQ,MAAM,QAAQ,IAAI,SAAS,cAAc,GAAG,SAAS,CAChF,eACF,CAAC;CAED,MAAM,eAAe,QAAQ,MAAM,QAAQ,IAAI,SAAS,cAAc,GAAG,SAAS,CAChF,eACF,CAAC;CAED,OAAO;EACL;EACA;EACA,GAAI,OAAO,YAAY,YACnB,EAAE,QAAQ,IACV,gBAAgB,UAAU,gBAAgB,UACxC,EAAE,SAAS,gBAAgB,OAAO,IAClC,CAAC;EACP,GAAI,OAAO,aAAa,YACpB,EAAE,SAAS,IACX,iBAAiB,UAAU,iBAAiB,UAC1C,EAAE,UAAU,iBAAiB,OAAO,IACpC,CAAC;EACP,UAAU,OAAO,aAAa,YAAY,WAAW,iBAAiB;EACtE,GAAI,OAAO,aAAa,YAAY,EAAE,SAAS,IAAI,CAAC;EACpD,GAAI,aAAa,KAAA,KAAa,OAAO,QAAQ,IAAI,UAAU,OAAO,MAAM,YACpE,EAAE,OAAO,QAAQ,IAAI,UAAU,OAAO,EAAE,IACxC,CAAC;EACL,GAAI,OAAO,gBAAgB,aACvB,EAAE,WAAW,QAAQ,MAAM,aAAa,MAAM,CAAC,QAAQ,CAAC,EAAE,IAC1D,CAAC;CACP;AACF,GAAG,QAAQ;AAIb,MAAM,oBAAoB,OACxB,SACA,WAC2B;CAC3B,IAAI;CAEJ,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK,CACxB,QAAQ,YAAY,KAAA,CAAS,GAC7B,IAAI,SAAoB,YAAY;GAClC,QAAQ,WAAW,SAAS,MAAM;EACpC,CAAC,CACH,CAAC;CACH,UAAU;EACR,aAAa,KAAK;CACpB;AACF;AAEA,MAAM,yBAAyB,MAAY,aACzC,kBACE,iBAAiB,MAAM,QAAQ,CAAC,CAAC,KAAK,OAAO,kBAAkB,iBAAiB,CAAC,GACjF,wBACF;AAEF,MAAM,4BAA4B,MAAY,WAAwB;CACpE,MAAM,0BAAU,IAAI,IAAiB;CACrC,IAAI,QAAQ;CACZ,IAAI,YAAY;CAChB,IAAI,YAAY;CAChB,IAAI,YAAY;CAChB,IAAI,YAAY;CAChB,IAAI,SAAS;CACb,IAAI,aAAa,YAAY,IAAI;CACjC,IAAI,SAAS;CACb,IAAI;CACJ,IAAI;CAEJ,MAAM,YAAY,YAAyB;EACzC,MAAM,eAAe,QAAQ,aAAa;EAE1C,OAAO,iBAAiB,WAAW,iBAAiB;CACtD;CAEA,MAAM,aAAa,YAAyB;EAC1C,IAAI,CAAC,SAAS,OAAO,GAAG;EACxB,QAAQ,IAAI,OAAO;EACnB;EACA,aAAa,YAAY,IAAI;CAC/B;CAEA,MAAM,cAAc,YAAyB;EAC3C,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG;EAC9B,IAAI;EAEJ,IAAI;GACF,SAAS,QAAQ,SAAS,CAAC,EAAE,OAAO;EACtC,QAAQ,CAER;EACA,IAAI,WAAW,KAAA,GAAW;GACxB,IAAI,UAAU,OAAO,SAAS,KAAK;QAC9B,IAAI,UAAU,OAAO,SAAS,KAAK;QACnC,IAAI,UAAU,OAAO,SAAS,KAAK;QACnC,IAAI,UAAU,OAAO,SAAS,KAAK;EAC1C;EACA,aAAa,YAAY,IAAI;CAC/B;CAEA,MAAM,YAAY,YAAyB;EACzC,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG;EAC9B;EACA,aAAa,YAAY,IAAI;CAC/B;CAEA,MAAM,cAAc;EAClB,IAAI,QAAQ;EACZ,SAAS;EACT,KAAK,IAAI,WAAW,SAAS;EAC7B,KAAK,IAAI,mBAAmB,UAAU;EACtC,KAAK,IAAI,iBAAiB,QAAQ;EAClC,OAAO,oBAAoB,SAAS,KAAK;EACzC,aAAa,KAAK;EAClB,OAAO;CACT;CAEA,IAAI;EACF,KAAK,GAAG,WAAW,SAAS;EAC5B,KAAK,GAAG,mBAAmB,UAAU;EACrC,KAAK,GAAG,iBAAiB,QAAQ;EACjC,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;EACtD,IAAI,OAAO,SAAS,MAAM;CAC5B,SAAS,OAAO;EACd,MAAM;EACN,MAAM;CACR;CAEA,MAAM,OAAO,YAAY;EACvB,MAAM,YAAY,YAAY,IAAI;EAClC,IAAI,iBAAiB;EAErB,OAAO,CAAC,QAAQ;GACd,MAAM,MAAM,YAAY,IAAI;GAE5B,IAAI,QAAQ,SAAS,KAAK,MAAM,cAAc,6BAA6B;GAC3E,IAAI,MAAM,aAAa,8BAA8B;IACnD,iBAAiB;IACjB;GACF;GACA,MAAM,IAAI,SAAe,YAAY;IACnC,OAAO;IACP,QAAQ,iBAAiB,QAAQ,GAAG,EAAE;GACxC,CAAC;GACD,OAAO,KAAA;EACT;EAEA,OAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA,SAAS,QAAQ;GACjB;EACF;CACF;CAEA,OAAO;EACL;EACA;EACA,yBAAyB;GACvB,aAAa,YAAY,IAAI;EAC/B;CACF;AACF;AAEA,MAAM,uBAAuB,OAAO,YAA6D;CAC/F,MAAM,kBACJ,QAAQ,WAAW,QAAQ,IAAI,OAAO,WAAW,OAAO,QAAQ,CAAC,CAAC,GAClE,wBACF;AACF;AAEA,MAAM,wBAAwB,OAC5B,MACA,UACA,QACA,YACA,WACqB;CACrB,IAAI,OAAO,SAAS,MAAM,IAAI,6BAA6B,CAAC;CAE5D,MAAM,SAAS,OAAO,kBAAkB,iBAAiB,CAAC,CACxD,MAAM,iBAAiB,MAAM,QAAQ,CACvC;CAEA,IAAI,OAAO,eAAe,KAAK,OAAO,oBAAoB,MACxD,MAAM,IAAI,6BAA6B,OAAO,UAAU;CAE1D,MAAM,UAAU,MAAM,KAAK,GAAG,QAAQ;CAEtC,IAAI,QAAQ,WAAW,KAAK,QAAQ,OAAO,KAAA,GAAW;EACpD,MAAM,qBAAqB,OAAO;EAClC,MAAM,IAAI,6BAA6B,KAAK,IAAI,KAAQ,QAAQ,MAAM,CAAC;CACzE;CACA,IAAI,OAAO,SAAS;EAClB,MAAM,qBAAqB,OAAO;EAClC,MAAM,IAAI,6BAA6B,CAAC;CAC1C;CAEA,IAAI;CACJ,IAAI;CACJ,MAAM,gBAAiB,cAAc,qBAAqB,OAAO;CAEjE,MAAM,gBAAgB;EACpB,QAAa;CACf;CAEA,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CACxD,IAAI;EACF,UAAU,yBAAyB,MAAM,MAAM;EAG/C,IAAI,OAAO,SAAS,MAAM,IAAI,6BAA6B,CAAC;EAC5D,WAAW;EACX,MAAM,OAAO,QAAQ,EAAE;EACvB,QAAQ,kBAAkB;EAC1B,MAAM,UAAU,MAAM,QAAQ,KAAK;EACnC,MAAM,QAAQ,OAAO,UAAU,KAAA,IAAY,MAAM,sBAAsB,MAAM,QAAQ;EAErF,OAAO;GACL;GACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;GACvC,kBAAkB,UAAU,KAAA;GAC5B;EACF;CACF,UAAU;EACR,SAAS,MAAM;EACf,OAAO,oBAAoB,SAAS,OAAO;EAC3C,MAAM,QAAQ;CAChB;AACF;AAEA,MAAM,sBAAsB,SAA0C;CACpE,MAAM,4BAAY,IAAI,IAA0E;CAEhG,OAAO;EACL,aAAa,KAAK,MAAM;EACxB,yBAAyB,YAAY,KAAK,uBAAuB,OAAO;EACxE,yBAAyB,YAAY,KAAK,uBAAuB,OAAO;EACxE,YAAY,aAAa;GACvB,MAAM,eAAe,YAAyB,SAAS,sBAAsB,OAAO,CAAC;GAErF,UAAU,IAAI,UAAU,WAAW;GACnC,KAAK,GAAG,WAAW,WAAW;EAChC;EACA,aAAa,aAAa;GACxB,MAAM,cAAc,UAAU,IAAI,QAAQ;GAE1C,IAAI,gBAAgB,KAAA,GAAW;IAC7B,KAAK,IAAI,WAAW,WAAW;IAC/B,UAAU,OAAO,QAAQ;GAC3B;EACF;EACA,MAAM,OAAO,QAAQ;GACnB,MAAM,KAAK,KAAK,KAAK;IAAE,WAAW;IAAoB,SAAS;GAAO,CAAC;EACzE;EACA,WAAW,KAAK,IAAI;EACpB,UAAU,OAAO,UAAU,iBAAiB;GAC1C,MAAM,cAAc,OAAO,kBAAkB,eAAe,CAAC,CAC3D,MAAM,KAAK,UACR,mBAAmB,SAAS,oBAAoB;IAC/C,MAAM,eAAe,QAAQ,IAAI,YAAY,UAAU;IAEvD,MAAM,UACJ,sBAAsB,KAAA,IAClB,KAAA,IACA,QAAQ,MAAM,QAAQ,IAAI,cAAc,kBAAkB,GAAG,cAAc,CACzE,iBACF,CAAC;IAEP,MAAM,qBACJ,YAAY,KAAA,KAAa,YAAY,OACjC,IACA,KAAK,IAAI,KAAQ,QAAQ,IAAI,SAAS,QAAQ,CAAC;IAErD,MAAM,UACJ,YAAY,KAAA,KAAa,YAAY,OACjC,QAAQ,IAAI,cAAc,MAAM,IAChC,QAAQ,IAAI,SAAS,CAAC;IAE5B,IAAI,YAAY,MAAM,OAAO,EAAE,MAAM,iBAAiB;IACtD,IAAI,YAAY,KAAA,GAAW,OAAO,EAAE,MAAM,iBAAiB;IAC3D,MAAM,YAAY,QAAQ,IAAI,SAAS,WAAW;IAClD,MAAM,cAAc,QAAQ,IAAI,SAAS,aAAa;IAEtD,MAAM,WACJ,OAAO,cAAc,WACjB,YACA,OAAO,gBAAgB,WACrB,cACA;IAER,MAAM,yBACJ;IAEF,MAAM,iBAAiB;IACvB,MAAM,2BAA2B;IACjC,MAAM,kBAAkB,GAAG,uBAAuB,GAAG,eAAe,GAAG;IAEvE,MAAM,eAAe,cAAsB;KACzC,MAAM,QAAuB,CAAC;KAC9B,IAAI,UAAyB;KAE7B,OAAO,YAAY,QAAQ,YAAY,KAAA,GAAW;MAChD,MAAM,UAAU,OAAO,QAAQ,IAAI,SAAS,SAAS,KAAK,EAAE,CAAC,CAAC,YAAY;MAE1E,IAAI,YAAY,IAAI;MACpB,MAAM,SAAwB,QAAQ,IAAI,SAAS,eAAe;MAElE,IAAI,WAAW,MAAM;OACnB,MAAM,KAAK,OAAO;OAClB;MACF;MACA,IAAI,UAAU,QAAQ,IAAI,SAAS,wBAAwB;MAC3D,IAAI,QAAQ;MAEZ,OAAO,YAAY,QAAQ,YAAY,KAAA,GAAW;OAChD,IAAI,OAAO,QAAQ,IAAI,SAAS,SAAS,KAAK,EAAE,CAAC,CAAC,YAAY,MAAM,SAClE;OACF,UAAU,QAAQ,IAAI,SAAS,wBAAwB;MACzD;MACA,MAAM,KAAK,GAAG,QAAQ,eAAe,MAAM,EAAE;MAC7C,UAAU;KACZ;KAEA,OAAO,MAAM,QAAQ,CAAC,CAAC,KAAK,KAAK;IACnC;IAEA,MAAM,WAAW,cAAsB;KACrC,MAAM,SAAS,QAAQ,IAAI,WAAW,QAAQ;KAE9C,MAAM,aAAa,QAAQ,MAAM,QAAQ,IAAI,WAAW,cAAc,GAAG,WAAW,CAClF,aACF,CAAC;KAED,MAAM,QAAQ,QAAQ,MAAM,QAAQ,IAAI,WAAW,gBAAgB,GAAG,WAAW,CAAC,CAAC;KAEnF,OACE,WAAW,QACX,eAAe,UACf,OAAO,UAAU,YACjB,UAAU,QACV,QAAQ,IAAI,OAAO,QAAQ,IAAI;IAEnC;IAEA,MAAM,aAA4B,CAAC;IACnC,IAAI,oBAAoB;IAExB,MAAM,YAAY,cAAsB;KACtC,MAAM,UAAU,OAAO,QAAQ,IAAI,WAAW,SAAS,KAAK,EAAE,CAAC,CAAC,YAAY;KAI5E,MAAM,mBACJ,YAAY,WACR,QAAQ,MAAM,QAAQ,IAAI,WAAW,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,IACtE;KAIN,IACE,EAHiB,YAAY,WAAW,QAAQ,IAAI,WAAW,SAAS,MAAM,SAI9E,OAAO,qBAAqB,YAC5B,qBAAqB,QACrB,CAAC,QAAQ,gBAAgB,GAEzB;KACF,WAAW,KAAK,SAAS;KACzB,IAAI,WAAW,SAAS,iBAAiB,oBAAoB;IAC/D;IAEA,MAAM,iBAAiB,QAAQ,IAAI,SAAS,SAAS;IAErD,IACE,OAAO,mBAAmB,cAC1B,QAAQ,MAAM,gBAAgB,SAAS,CAAC,eAAe,CAAC,GAExD,SAAS,OAAO;IAGlB,MAAM,oBAAoB,sBAA8B;KACtD,MAAM,cAAc,QAAQ,MAAM,QAAQ,IAAI,SAAS,kBAAkB,GAAG,SAAS,CACnF,iBACF,CAAC;KAED,IAAI,OAAO,gBAAgB,YAAY,gBAAgB,MAAM;KAC7D,MAAM,kBAAkB,QAAQ,IAAI,aAAa,QAAQ;KAEzD,KAAK,IAAI,QAAQ,GAAG,QAAQ,mBAAmB,CAAC,mBAAmB,SACjE,SAAS,QAAQ,IAAI,aAAa,KAAK,CAAC;IAE5C;IAEA,iBAAiB,sBAAsB;IACvC,IAAI,CAAC,mBAAmB,iBAAiB,cAAc;IACvD,IAAI,CAAC,mBAAmB,iBAAiB,wBAAwB;IAEjE,MAAM,WAAW,WAAW,MAAM,GAAG,eAAe,CAAC,CAAC,KAAK,cAAc;KACvE,MAAM,aAAa,QAAQ,IAAI,WAAW,SAAS,KAAK;KACxD,MAAM,UAAU,OAAO,QAAQ,IAAI,WAAW,SAAS,KAAK,EAAE,CAAC,CAAC,YAAY;KAC5E,MAAM,YAAY,OAAO,QAAQ,IAAI,YAAY,MAAM,KAAK,EAAE,CAAC,CAAC,YAAY;KAE5E,MAAM,OAAO,OACX,QAAQ,MAAM,QAAQ,IAAI,WAAW,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAChF,CAAC,CAAC,YAAY;KAEd,MAAM,YAAY,QAAQ,MAAM,QAAQ,IAAI,WAAW,cAAc,GAAG,WAAW,CACjF,YACF,CAAC;KAED,MAAM,gBACJ,YAAY,cAAc,YAAY,WAAW,YAAY,WACzD,KAAA,IACA,QAAQ,IAAI,WAAW,YAAY,WAAW,UAAU,WAAW;KAEzE,MAAM,mBAAmB,QAAQ,IAAI,YAAY,QAAQ;KAEzD,MAAM,kBACJ,qBAAqB,KAAA,KACrB,qBAAqB,QACrB,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,IACtC,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,CAAC,GAAG,WAAW,IACzD,KAAA;KAEN,MAAM,QAAQ,OACZ,OAAO,cAAc,YAAY,cAAc,KAC3C,YACA,OAAO,kBAAkB,YAAY,kBAAkB,KACrD,gBACC,mBAAmB,EAC5B,CAAC,CACE,QAAQ,QAAQ,GAAG,CAAC,CACpB,KAAK,CAAC,CACN,MAAM,GAAG,GAAG;KAEf,MAAM,UAAU,QAAQ,IAAI,YAAY,SAAS;KAEjD,MAAM,WACJ,YAAY,WACR,QAAQ,IAAI,YAAY,eAAe,KAAK,IAC5C,QAAQ,IAAI,YAAY,UAAU;KAExC,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;KACnD,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;KACnD,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;KACnD,MAAM,OAAO,QAAQ,IAAI,YAAY,MAAM;KAE3C,MAAM,cACJ,SAAS,QAAQ,SAAS,KAAA,IAAY,KAAA,IAAY,QAAQ,IAAI,MAAM,SAAS;KAE/E,MAAM,cAAc,QAAQ,MAAM,QAAQ,IAAI,WAAW,cAAc,GAAG,WAAW,CACnF,cACF,CAAC;KAED,MAAM,eAAe,QAAQ,MAC3B,QAAQ,IAAI,WAAW,cAAc,GACrC,WACA,CAAC,eAAe,CAClB;KAEA,MAAM,eAAe,QAAQ,MAC3B,QAAQ,IAAI,WAAW,cAAc,GACrC,WACA,CAAC,eAAe,CAClB;KAEA,OAAO;MACL,UAAU,YAAY,SAAS;MAC/B,MACE,YAAY,UACR,SAAS,aAAa,cACtB,YAAY,UACV,SAAS,aAAa,WACtB,SAAS,KACP,QAAQ,SACR;MACV,GAAI,UAAU,KAAK,CAAC,IAAI,EAAE,MAAM;MAChC,GAAI,OAAO,YAAY,YACnB,EAAE,QAAQ,IACV,gBAAgB,UAAU,gBAAgB,UACxC,EAAE,SAAS,gBAAgB,OAAO,IAClC,CAAC;MACP,GAAI,OAAO,aAAa,YACpB,EAAE,SAAS,IACX,iBAAiB,UAAU,iBAAiB,UAC1C,EAAE,UAAU,iBAAiB,OAAO,IACpC,CAAC;MACP,GAAI,OAAO,aAAa,YACpB,EAAE,SAAS,IACX,iBAAiB,UAAU,iBAAiB,UAC1C,EAAE,UAAU,iBAAiB,OAAO,IACpC,CAAC;MACP,GAAI,OAAO,aAAa,YAAY,EAAE,SAAS,IAAI,CAAC;MACpD,GAAI,aAAa,KAAA,KAAa,OAAO,QAAQ,IAAI,UAAU,OAAO,MAAM,YACpE,EAAE,OAAO,QAAQ,IAAI,UAAU,OAAO,EAAE,IACxC,CAAC;MACL,GAAI,OAAO,gBAAgB,aACvB,EAAE,WAAW,QAAQ,MAAM,aAAa,MAAM,CAAC,QAAQ,CAAC,EAAE,IAC1D,CAAC;KACP;IACF,CAAC;IAID,MAAM,OAAO,KAAK,UAAU;KAC1B;KACA;KACA;KACA;IACF,CAAC;IAED,MAAM,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;IAEhD,OAAO,WAAW,UAAU;KAAE,MAAM;KAAa;IAAS,IAAI;KAAE,MAAM;KAAQ;IAAK;GACrF,GACA,UACA,cACA,qBACF,CACF;GAEA,IAAI,YAAY,SAAS,QAAQ,OAAO,WAAW,eAAe,CAAC,CAAC,YAAY,IAAI;GAEpF,OAAO;EACT;EACA,OAAO,UAAU,OAAO,QAAQ,eAC9B,sBAAsB,MAAM,UAAU,QAAQ,aAAa,YACzD,QAAQ,UAAU,SAAS,cAAc;GAEvC,IAAI,YAAY,QAAQ,eAAe,OAAO;GAC9C,IAAI;GAEJ,OAAO,cAAc,MAAM;IACzB,MAAM,SAAS,QAAQ,yBAAyB,WAAW,OAAO,CAAC,EAAE;IAErE,IAAI,OAAO,WAAW,YAAY;KAChC,WAAW;KACX;IACF;IACA,YAAY,QAAQ,eAAe,SAAS;GAC9C;GACA,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,kDAAkD;GAEpE,MAAM,QAAQ,QAAQ,IAAI,SAAS,OAAO;GAE1C,IAAI,OAAO,UAAU,YAAY,QAAQ,MAAM,OAAO,SAAS,CAAC,CAAC;GACjE,QAAQ,MAAM,UAAU,SAAS,CAAC,SAAS,CAAC;GAC5C,MAAM,gBAAgB,QAAQ,IAAI,SAAS,eAAe;GAE1D,IAAI,OAAO,kBAAkB,YAAY;IACvC,QAAQ,MAAM,eAAe,SAAS,CAAC,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC;IAC7E,QAAQ,MAAM,eAAe,SAAS,CAAC,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC;GAChF;EACF,GAAG,KAAK,CACV;EACF,QAAQ,UAAU,QAAQ,eACxB,sBAAsB,MAAM,UAAU,QAAQ,aAAa,YAAY,QAAQ,MAAM,CAAC;EAGxF,aAAa,aAAa,KAAK,WAAW;GAAE,MAAM;GAAO;EAAS,CAAC;EACnE,SAAS,QAAQ,WACf,KAAK,UACF,GAAG,MAAM;GACR,MAAM,WAAW,QAAQ,IAAI,YAAY,UAAU;GAEnD,QAAQ,MAAM,UAAU,YAAY,CAAC;IAAE,MAAM;IAAG,KAAK;IAAG,UAAU;GAAU,CAAC,CAAC;EAChF,GACA,QACA,MACF;EACF,kBAAkB,YAAY,yBAAyB,MAAM,KAAK,iBAAiB,CAAC;EACpF,cAAc,aAAa,KAAK,YAAY,QAAQ;CACtD;AACF;AAEA,MAAM,yBAAyB,aAA2D;CACxF,SAAS,YAAY,mBAAmB,MAAM,QAAQ,QAAQ,CAAC;CAC/D,aAAa,QAAQ,MAAM;AAC7B;AAEA,MAAM,yBAAyB,aAAoD;CACjF,eAAe,YAAY,sBAAsB,MAAM,QAAQ,qBAAqB,CAAC;CACrF,aAAa,QAAQ,MAAM;CAC3B,iBAAiB,QAAQ,UAAU;CACnC,mBAAmB,QAAQ,YAAY;CACvC,iBAAiB,aAAa;EAC5B,QAAQ,GAAG,gBAAgB,QAAQ;CACrC;CACA,kBAAkB,aAAa;EAC7B,QAAQ,IAAI,gBAAgB,QAAQ;CACtC;AACF;AAEA,MAAM,iBAAiB,SAAiB,UACtC,gCAAgC,KAAK;CACnC,gBAAgB;CAChB;CACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;AACzC,CAAC;AAEH,MAAM,eAAe,WAA6B,UAChD,8BAA8B,KAAK;CACjC,gBAAgB;CAChB;CACA,SAAS,2BAA2B,UAAU;CAC9C,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;AACzC,CAAC;AAEH,MAAM,2BAA2B,cAC/B,8BAA8B,KAAK;CACjC,gBAAgB;CAChB;CACA,SAAS,2BAA2B,UAAU;AAChD,CAAC;;AAGH,MAAa,uCAAuC,UAClD,OAAO,GAAG,6BAA6B,CAAC,CAAC,KAAK,KAC9C,MAAM,eAAe,aAAa,oCAAoC,aACrE,MAAM,cAAc,WAAW,MAAM,cAAc,WACpD,MAAM,YAAY,2BAA2B,MAAM,UAAU;AAE/D,MAAM,eAAe,YACnB,oCAAoC,KAAK;CACvC,gBAAgB;CAChB;AACF,CAAC;AAEH,MAAM,qBACJ,+BAA+B,KAAK;CAClC,gBAAgB;CAChB,SAAS;AACX,CAAC;AAEH,MAAM,aAAa,UAA2B;CAC5C,IAAI,iBAAiB,OAAO,OAAO,MAAM,QAAQ,MAAM,GAAG,GAAK;CAE/D,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,GAAK;AACrC;AAEA,MAAM,qBAAqB,UACzB,mEAAmE,KAAK,UAAU,KAAK,CAAC;AAE1F,MAAM,mBAAmB,UACvB,oGAAoG,KAClG,UAAU,KAAK,CACjB;AAEF,MAAM,iBAAiB,OAAO,GAAG,sCAAsC,CAAC,CAAC,WACvE,OAIA;CACA,MAAM,UAAU,OAAO,OAAO,aAAa,0BAA0B,EACnE,kBAAkB,QACpB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,eAAe,YAAY,6CAA6C,CAAC,CAAC;CAEhG,IAAI,QAAQ,QAAQ,SAAS,aAC3B,OAAO,OAAO,mCAAmC,KAAK;EACpD,gBAAgB;EAChB,SAAS;EACT,SACE;CACJ,CAAC;CAGH,OAAO,OAAO,OAAO;EACnB,SACE,QAAQ,QAAQ,SAAS,eACrB,OAAO,OAAO;GACZ,MAAM,QAAQ,QAAQ;GACtB,cAAc,OAAO,OAAO,CAAC,GAAG,QAAQ,QAAQ,YAAY,CAAC;EAC/D,CAAC,IACD,OAAO,OAAO,EAAE,MAAM,QAAQ,QAAQ,KAAK,CAAC;EAClD,YAAY,QAAQ;EACpB,kBAAkB,QAAQ;EAC1B,kBAAkB,QAAQ;CAC5B,CAAC;AACH,CAAC;AAED,MAAM,eAAe,QAA0C,UAA2B;CACxF,IAAI,OAAO,QAAQ,SAAS,gBAAgB,OAAO;CACnD,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EAEzB,OACE,IAAI,aAAa,YACjB,IAAI,aAAa,MACjB,IAAI,aAAa,MACjB,OAAO,QAAQ,aAAa,MAAM,SAAS,SAAS,IAAI,IAAI;CAEhE,QAAQ;EACN,OAAO;CACT;AACF;AAEA,MAAM,mBAAmB,WACvB,KAAK,IAAI,uBAAuB,KAAK,IAAI,uBAAuB,OAAO,gBAAgB,CAAC;AAE1F,MAAM,uBAAuB,OAC3B,QACA,SACA,UACe;CACf,MAAM,WAAW,MAAM,QAAQ;CAE/B,IAAI,CAAC,OAAO,SAAS,OAAO;CAI5B,IAAI;EACF,MAAM,MAAM,QAAQ;CACtB,QAAQ,CAGR;CACA,MAAM,IAAI,MAAM,oDAAoD;AACtE;AAEA,MAAM,oBAAoB,OAA4B,YACpD,OAAO,WAAW;CAChB,KAAK;CACL,aAAa,cAAc,OAAO;AACpC,CAAC,CAAC,CAAC,KACD,OAAO,cAAc;CACnB,UAAU,SAAS,OAAO,2BAA2B;CACrD,cAAc,OAAO,KAAK,cAAc,OAAO,CAAC;AAClD,CAAC,GACD,OAAO,iBAAiB,OAAO,WAAW,OAAO,CAAC,CACpD;AAEF,MAAM,gBAAgB,OAAO,GAAG,qCAAqC,CAAC,CAAC,WACrE,QACA,WACA;CACA,MAAM,MAAM,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB;CAEtE,OAAO,OAAO,6BAA6B,KAAK;EAC9C,gBAAgB;EAChB,OAAO;EACP,SAAS,OAAO;EAChB,UAAU,KAAK,IAAI,OAAO,kBAAkB,MAAM,SAAS;EAC3D,SAAS;CACX,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,OAAO,GAAG,sCAAsC,CAAC,CAAC,WACvE,QACA,QACA,WACA,WAC0D;CAC1D,MAAM,MAAM,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB;CACtE,MAAM,UAAU,KAAK,IAAI,GAAG,MAAM,SAAS;CAC3C,MAAM,YAAY,OAAO,mBAAmB;CAE5C,IAAI,aAAa,GAAG,OAAO,OAAO,cAAc,QAAQ,SAAS;CAEjE,OAAO,OAAO,OAAO,KACnB,OAAO,cAAc;EACnB,UAAU,SAAS,OAAO,SAAS;EACnC,cACE,OAAO,WAAW,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,cAAc,QAAQ,SAAS,CAAC,CAAC;CAC1F,CAAC,CACH;AACF,CAAC;AAUD,MAAM,gBAAgB,UAAmD;CACvE,IAAI,MAAM,UAAU,UAAU,KAAA,GAAW,OAAO,MAAM,UAAU;CAChE,IAAI,MAAM,OAAO,SAAS,MAAM,aAAa,SAAS,MAAM,UAAU,OACpE,OAAO,aAAa;AAIxB;AAqBA,IAAM,0BAAN,MAA8B;CAC5B;CAEA,YAAY,OAAgB;EAC1B,KAAK,QAAQ;CACf;AACF;AAEA,MAAM,wBAAwB,UAC5B,OAAO,cAAc;CACnB,MAAM,UAAU,CAAC,GAAG,MAAM,eAAe;CAEzC,OAAO,QAAQ,WAAW,IACtB,OAAO,OACP,OAAO,cAAc,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,KACzC,OAAO,QACP,OAAO,QAAQ,qBAAqB,KAAK,CAAC,CAC5C;AACN,CAAC;AAEH,MAAM,yBAAyB,OAAO,GAAG,8CAA8C,CAAC,CAAC,WACvF,MACA,QACA;CACA,MAAM,MAAM,OAAO,OAAO,IAAI;EAC5B,KAAK,KAAK;EACV,QAAQ,UAAU,cAAc,6CAA6C,KAAK;CACpF,CAAC;CAED,MAAM,SAAS,OAAO,OAAO,oBAAoB,uBAAuB,CAAC,CAAC,EACxE,IACF,CAAC,CAAC,CAAC,KACD,OAAO,UAAU,UACf,cAAc,mDAAmD,KAAK,CACxE,CACF;CAEA,IAAI,CAAC,YAAY,QAAQ,OAAO,GAAG,GACjC,OAAO,OAAO,YAAY,6CAA6C;CAGzE,OAAO;AACT,CAAC;AAED,MAAM,qBAAqB,OAAO,GAAG,0CAA0C,CAAC,CAAC,WAC/E,MACA,QACA;CACA,MAAM,MAAM,OAAO,OAAO,IAAI;EAC5B,KAAK,KAAK;EACV,QAAQ,UAAU,cAAc,uCAAuC,KAAK;CAC9E,CAAC;CAED,MAAM,SAAS,OAAO,OAAO,oBAAoB,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAC7E,OAAO,UAAU,UAAU,cAAc,6CAA6C,KAAK,CAAC,CAC9F;CAEA,IAAI,CAAC,YAAY,QAAQ,OAAO,GAAG,GACjC,OAAO,OAAO,YAAY,6CAA6C;CAGzE,OAAO;AACT,CAAC;AAED,MAAM,uBAEF,QACA,WAED,YAAY;CACX,IAAI,UAAU;CAEd,IAAI;EACF,UAAU,YAAY,QAAQ,QAAQ,IAAI,CAAC;CAC7C,QAAQ;EACN,UAAU;CACZ;CACA,IAAI,CAAC,SACH,MAAM,UAAU,QAAQ,YAAY,yCAAyC;CAG/E,IAAI;CAEJ,IAAI;EACF,aAAa,UAAU,QAAQ,SAAS,IAAI,QAAQ,MAAM;CAC5D,QAAQ;EACN,MAAM,UAAU,QAAQ,cAAc,iDAAiD;EAEvF;CACF;CAEA,MAAM,WAAW,WACd,YAAY;EACX,MAAM,UAAU,QAAQ,cAAc,iDAAiD;CACzF,CAAC,CAAC,CACD,cAAc;EACb,MAAM,gBAAgB,OAAO,QAAQ;CACvC,CAAC;CAEH,MAAM,gBAAgB,IAAI,QAAQ;AACpC;AAEF,MAAM,aAAa,OAAO,GAAG,kCAAkC,CAAC,CAAC,WAC/D,MACA,QACA,WACA,OACA,OACiC;CACjC,MAAM,UAAU,OAAO,UAAU,KAAK,CAAC;CACvC,MAAM,UAAU,OAAO,IAAI,KAAK,CAAC;CAEjC,MAAM,UAAa,WAA6B,aAC9C,OAAO,WAAW;EAChB,KAAK;EACL,QAAQ,UAAU,IAAI,wBAAwB,KAAK;CACrD,CAAC,CAAC,CAAC,KACD,OAAO,OAEH,YACyF;EACzF,MAAM,QAAQ,QAAQ;EAEtB,IAAI,iBAAiB,8BACnB,OAAO,OAAO,QAAQ,+CAA+C,CAAC,CAAC,KACrE,OAAO,aAAa;GAClB,kBAAkB;GAClB,gCAAgC,MAAM;EACxC,CAAC,GACD,OAAO,QAAQ,OAAO,KAAK,wBAAwB,SAAS,CAAC,CAAC,CAChE;EAEF,IAAI,MAAM,aAAa,SAAS,gBAAgB,KAAK,GAAG;GACtD,MAAM,aAAa,QAAQ;GAE3B,OAAO,OAAO,KAAK,aAAa,CAAC;EACnC;EAEA,OAAO,OAAO,KAAK,YAAY,WAAW,KAAK,CAAC;CAClD,CACF,CACF;CAEF,MAAM,kBACJ,WACA,aAEA,OAAO,cAAc;EACnB,IAAI,aAAa;EACjB,IAAI;EAEJ,OAAO,OAAO,YAAY,WAAW;GACnC,UAAU,SAAS,cAAc;IAC/B,aAAa;GACf,CAAC;GAED,OAAO;EACT,CAAC,CAAC,CAAC,KACD,OAAO,kBACL,OAAO,IAAI,aAAa;GACtB,MAAM,UAAU,QAAQ;GAGxB,OAAO,OAAO,WAAW,wCAAwC,CAAC,CAAC,KACjE,OAAO,aAAa;IAClB,kBAAkB;IAClB,6BAA6B;IAC7B,kCAAkC;GACpC,CAAC,CACH;GACA,MAAM,aAAa;GAEnB,IAAI,eAAe,KAAA,GACjB,OAAO,OAAO,cAAc,kBAAkB,YAAY,GAAG,CAAC;EAElE,CAAC,CACH,CACF;CACF,CAAC;CAEH,MAAM,0BAA0B,OAAO,GAAG,+CAA+C,CAAC,CACxF,WAAW,KAAc;EACvB,OAAO,OAAO,OAAO,oBAAoB,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,KAC/D,OAAO,UAAU,UACf,cAAc,uDAAuD,KAAK,CAC5E,CACF;CACF,CACF;CAEA,MAAM,wBACJ,WACA,gBAEA,OAAO,QAAQ,qCAAqC,CAAC,CAAC,KACpD,OAAO,aAAa;EAClB,kBAAkB;EAClB,gCAAgC,YAAY,OAAO;EACnD,GAAI,YAAY,OAAO,SAAS,KAAA,IAC5B,CAAC,IACD,EAAE,uBAAuB,YAAY,OAAO,KAAK;EACrD,GAAI,YAAY,OAAO,YAAY,KAAA,IAC/B,CAAC,IACD,EAAE,iCAAiC,YAAY,OAAO,QAAQ;EAClE,GAAI,YAAY,OAAO,YAAY,KAAA,IAC/B,CAAC,IACD,EAAE,gCAAgC,YAAY,MAAM,QAAQ;EAChE,GAAI,YAAY,OAAO,aAAa,KAAA,IAChC,CAAC,IACD,EAAE,kCAAkC,YAAY,OAAO,SAAS;EACpE,GAAI,YAAY,OAAO,aAAa,KAAA,IAChC,CAAC,IACD,EAAE,iCAAiC,YAAY,MAAM,SAAS;EAClE,GAAI,YAAY,OAAO,aAAa,KAAA,IAChC,CAAC,IACD,EAAE,kCAAkC,YAAY,OAAO,SAAS;EACpE,GAAI,YAAY,OAAO,aAAa,KAAA,IAChC,CAAC,IACD,EAAE,iCAAiC,YAAY,MAAM,SAAS;EAClE,GAAI,YAAY,OAAO,aAAa,KAAA,IAChC,CAAC,IACD,EAAE,kCAAkC,YAAY,OAAO,SAAS;EACpE,GAAI,YAAY,OAAO,aAAa,KAAA,IAChC,CAAC,IACD,EAAE,iCAAiC,YAAY,MAAM,SAAS;EAClE,GAAI,YAAY,OAAO,UAAU,KAAA,IAC7B,CAAC,IACD,EAAE,+BAA+B,YAAY,OAAO,MAAM;EAC9D,GAAI,YAAY,OAAO,UAAU,KAAA,IAC7B,CAAC,IACD,EAAE,8BAA8B,YAAY,MAAM,MAAM;EAC5D,GAAI,YAAY,OAAO,cAAc,KAAA,IACjC,CAAC,IACD,EAAE,6BAA6B,YAAY,OAAO,UAAU;EAChE,GAAI,YAAY,OAAO,cAAc,KAAA,IACjC,CAAC,IACD,EAAE,4BAA4B,YAAY,MAAM,UAAU;EAC9D,oCAAoC,YAAY;EAChD,2BAA2B,YAAY,QAAQ;EAC/C,yBAAyB,YAAY,QAAQ;EAC7C,yBAAyB,YAAY,QAAQ;EAC7C,yBAAyB,YAAY,QAAQ;EAC7C,yBAAyB,YAAY,QAAQ;EAC7C,4BAA4B,YAAY,QAAQ;EAChD,6BAA6B,YAAY,QAAQ;EACjD,oCAAoC,YAAY,QAAQ;CAC1D,CAAC,CACH;CAEF,MAAM,OACJ,QACA,YAAiD,OAAO,MACxD,gBAAgB,SAEhB,QACG,uBAAuB,CAAC,CAAC,CACxB,OAAO,IAAI,aAAa;EACtB,MAAM,cAAc,aAAa,KAAK;EAEtC,IAAI,gBAAgB,KAAA,GAAW,OAAO,OAAO;EAC7C,OAAO;EAEP,IAAI,eAAe;GACjB,MAAM,WAAW,OAAO,IAAI,OAAO,UAAU,UAC3C,SAAS,OAAO,aACZ,CAAC;IAAE,SAAS;IAAO,UAAU,QAAQ;GAAE,GAAG,KAAK,IAC/C,CAAC;IAAE,SAAS;IAAM,UAAU,QAAQ;GAAE,GAAG,QAAQ,CAAC,CACxD;GAEA,IAAI,CAAC,SAAS,SACZ,OAAO,OAAO,6BAA6B,KAAK;IAC9C,gBAAgB;IAChB,OAAO;IACP,SAAS,OAAO;IAChB,UAAU,SAAS;IACnB,SAAS;GACX,CAAC;EAEL;EAEA,MAAM,YAAY,OAAO,KACvB,OAAO,OAAO,UAAU;GACtB,MAAM,UAAU,aAAa,KAAK;GAElC,OAAO,OAAO,KAAK,WAAW,KAAK;EACrC,CAAC,GACD,OAAO,SAAS,WACd,qBAAqB,KAAK,CAAC,CAAC,KAC1B,OAAO,cAAc;GACnB,MAAM,UAAU,aAAa,KAAK;GAElC,OAAO,YAAY,KAAA,IAAY,OAAO,QAAQ,MAAM,IAAI,OAAO,KAAK,OAAO;EAC7E,CAAC,CACH,CACF,CACF;EAEA,OAAO,OAAO,eAAe,WAAW,QAAQ,iBAAiB;GAC/D,MAAM,UAAU,QAAQ;EAC1B,CAAC,CAAC,CAAC,KACD,OAAO,kBACL,OAAO,WAAW;GAChB,MAAM,UAAU,QAAQ;EAC1B,CAAC,CACH,GACA,OAAO,OAAO,UAAU;GACtB,IAAI,OAAO,GAAG,4BAA4B,CAAC,CAAC,KAAK,KAAK,MAAM,UAAU,WACpE,OAAO,OAAO,KAAK,KAAK;GAE1B,MAAM,UAAU,aAAa,KAAK;GAElC,IACE,OAAO,GAAG,6BAA6B,CAAC,CAAC,KAAK,KAC9C,CAAC,oCAAoC,KAAK,GAE1C,MAAM,UAAU,QAAQ;GAG1B,OAAO,OAAO,KAAK,WAAW,KAAK;EACrC,CAAC,CACH;CACF,CAAC,CACH,CAAC,CACA,KACC,OAAO,QACL,OAAO,iBACL,4BAA4B,KAAK;EAC/B,gBAAgB;EAChB,SAAS;CACX,CAAC,CACH,CACF,CACF;CA2IJ,OAAO;EAAE,QAAA;GAxIP,WAAW,YACT,IACE,OAAO,IAAI,aAAa;IACtB,OAAO,OAAO,kBAAkB,KAAK,KAAK,QAAQ,GAAG,CAAC;IAEtD,OAAO,OAAO,uBAAuB,MAAM,MAAM;GACnD,CAAC,GACD,OAAO,cACL,OAAO,GAAG,2BAA2B,CAAC,CAAC,QAAQ,GAAG,KAAK,YAAY,QAAQ,QAAQ,GAAG,IAClF,OAAO,OACP,OAAO,KAAK,YAAY,kDAAkD,CAAC,CACjF,CACF;GACF,WAAW,YACT,IACE,OAAO,IAAI,aAAa;IACtB,MAAM,MAAM,OAAO,OAAO,mBACxB,KAAK,SAAS,QAAQ,UAAU,OAAO,gBAAgB,CACzD;IAEA,MAAM,cAAc,OAAO,OAAO,oBAAoB,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,KAC1E,OAAO,UAAU,UACf,cAAc,qDAAqD,KAAK,CAC1E,CACF;IAEA,IAAI,YAAY,SAAS,kBACvB,OAAO,OAAO,YAAY,WAAW;IAEvC,IAAI,YAAY,SAAS,aACvB,OAAO,OAAO,6BAA6B,KAAK;KAC9C,gBAAgB;KAChB,OAAO;KACP,SAAS,OAAO;KAChB,UAAU,YAAY;KACtB,SAAS;IACX,CAAC;IAEH,MAAM,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,YAAY,IAAI,CAAC,CAAC;IAE5D,IAAI,WAAW,OAAO,kBACpB,OAAO,OAAO,6BAA6B,KAAK;KAC9C,gBAAgB;KAChB,OAAO;KACP,SAAS,OAAO;KAChB;KACA,SAAS;IACX,CAAC;IAGH,OAAO,OAAO,OAAO,aAAa,iBAAiB,CAAC,CAAC,EACnD,MAAM,YAAY,KACpB,CAAC,CAAC,CAAC,KACD,OAAO,UAAU,UACf,cAAc,4CAA4C,KAAK,CACjE,CACF;GACF,CAAC,CACH;GACF,OAAO,YACL,IACE,OAAO,IAAI,aAAa;IACtB,MAAM,cAAc,OAAO,eAAe,SAAS,QAAQ,eACzD,KAAK,KAAK,QAAQ,UAAU,QAAQ,OAAO,QAAQ,UAAU,CAC/D,CAAC,CAAC,KAAK,OAAO,QAAQ,uBAAuB,CAAC;IAE9C,OAAO,qBAAqB,QAAQ,WAAW;IAE/C,OAAO,OAAO,mBAAmB,MAAM,MAAM;GAC/C,CAAC,CACH;GACF,QAAQ,YACN,IACE,OAAO,IAAI,aAAa;IACtB,MAAM,cAAc,OAAO,eAAe,UAAU,QAAQ,eAC1D,KAAK,MAAM,QAAQ,UAAU,QAAQ,UAAU,CACjD,CAAC,CAAC,KAAK,OAAO,QAAQ,uBAAuB,CAAC;IAE9C,OAAO,qBAAqB,SAAS,WAAW;IAEhD,OAAO,OAAO,mBAAmB,MAAM,MAAM;GAC/C,CAAC,CACH;GACF,aAAa,YACX,OAAO,aAAa,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,KACrD,OAAO,eAAe,YAAY,6CAA6C,CAAC,GAChF,OAAO,SAAS,YACd,IACE,OAAO,IAAI,aAAa;IACtB,MAAM,MAAM,OAAO,OAAO,oBAAoB,KAAK,WAAW,QAAQ,QAAQ,CAAC;IAE/E,MAAM,QAAQ,OAAO,OAAO,oBAAoB,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAC7D,OAAO,eACL,cAAc,iDAAiD,CACjE,CACF;IAEA,IAAI,MAAM,SAAS,OAAO,kBACxB,OAAO,OAAO,6BAA6B,KAAK;KAC9C,gBAAgB;KAChB,OAAO;KACP,SAAS,OAAO;KAChB,UAAU,MAAM;KAChB,SAAS;IACX,CAAC;IAGH,OAAO,OAAO,OAAO,aAAa,oBAAoB,CAAC,CAAC;KACtD,gBAAgB;KAChB,WAAW;KACX,OAAO,IAAI,WAAW,KAAK;IAC7B,CAAC,CAAC,CAAC,KACD,OAAO,eACL,cAAc,iDAAiD,CACjE,CACF;GACF,CAAC,GACD,mBAAmB,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,MAAM,CACrD,CACF,CACF;GACF,SAAS,YACP,OAAO,aAAa,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC,KACjD,OAAO,eAAe,YAAY,yCAAyC,CAAC,GAC5E,OAAO,SAAS,YACd,IACE,OAAO,gBAAgB,KAAK,OAAO,QAAQ,QAAQ,QAAQ,MAAM,CAAC,CAAC,CAAC,KAClE,OAAO,QAAQ,mBAAmB,MAAM,MAAM,CAAC,CACjD,GACA,mBAAmB,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,MAAM,CACrD,CACF,CACF;GACF;EAGY;EAAG;CAAI;AACvB,CAAC;AAED,MAAM,kBAAkB,OAAO,GAAG,uCAAuC,CAAC,CAAC,WACzE,QACA,WACA;CACA,MAAM,MAAM,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB;CAEtE,OAAO,KAAK,IAAI,GAAG,OAAO,mBAAmB,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,cAAc,OAA4B,aAAiC;CAC/E,OAAO,OAAO,WAAW;EACvB,KAAK;EACL,QAAQ,UAAU,YAAY,SAAS,KAAK;CAC9C,CAAC,CAAC,CAAC,KACD,OAAO,cAAc;EACnB,UAAU,SAAS,OAAO,2BAA2B;EACrD,cAAc,OAAO,KAAK,YAAY,OAAO,CAAC;CAChD,CAAC,CACH;CACA;AACF;AAEA,MAAM,kBAAkB,OAAmB,aAAiC;CAC1E,OAAO,OAAO,IAAI;EAChB,KAAK;EACL,QAAQ,UAAU,YAAY,SAAS,KAAK;CAC9C,CAAC;CACD;AACF;AAEA,MAAM,eACJ,YAEA,OAAO,QAAQ,CAAC,GAAG,OAAO,CAAC,CAAC,QAAQ,IAAI,UACtC,MAAM,MAAM,KACV,OAAO,MAAM;CACX,YAAY,WAAqC;EAAE;EAAO,SAAS,MAAM;CAAQ;CACjF,iBAA2C,KAAA;AAC7C,CAAC,CACH,CACF,CAAC,CAAC,KAAK,OAAO,KAAK,aAAa,SAAS,QAAQ,YAAY,YAAY,KAAA,CAAS,CAAC,CAAC;AAEtF,MAAM,cACJ,MACA,OACA,SACA,YACA,QACA,qBAEA,OAAO,OACL,OAAO,IAAI,aAAa;CACtB,MAAM,MAAM,OAAO,OAAO,eACxB,OAAO,WAAW;EAChB,MAAM,WACJ,qBAAqB,QAAQ,KAAK,mBAAmB,aAAa,SAAS,OAAO,CAAC;EACrF,QAAQ,UACN,MAAM,aAAa,SAAS,gBAAgB,KAAK,IAC7C,aAAa,IACb,cAAc,0DAA0D,KAAK;CACrF,CAAC,IACA,aACC,iBACE,SAAS,QACT,yDACF,GACF,EAAE,eAAe,KAAK,CACxB;CAEA,MAAM,MAAM,OAAO,OAAO,WAAW;EACnC,WAAW,IAAI,KAAK,SAAS,UAAU;EACvC,QAAQ,UACN,MAAM,aAAa,SAAS,gBAAgB,KAAK,IAC7C,aAAa,IACb,cAAc,iDAAiD,KAAK;CAC5E,CAAC;CAED,OAAO,OAAO,OAAO,oBAAoB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KACpD,OAAO,eAAe,cAAc,gBAAgB,CAAC,CACvD;AACF,CAAC,CACH;AAEF,MAAM,mBACJ,YACyC;CACzC,MAAM,eAAe,QAAQ;CAE7B,MAAM,YAAY,OAAO,GAAG,qCAAqC,CAAC,CAAC,WACjE,WACA,SACA;EACA,MAAM,YAAY,OAAO,MAAM,qBAAqB;EAEpD,OAAO,aAAa,SAAS,CAAC,CAAC,KAC7B,OAAO,eACP,OAAO,cAAc;GACnB,UAAU;GACV,cAAc,OAAO,KAAK,YAAY,OAAO,CAAC;EAChD,CAAC,CACH;EACA,MAAM,YAAY,YAAY,OAAO,MAAM;EAE3C,IAAI,aAAa,GACf,OAAO,OAAO,OAAO,WACnB,qEACF;EAEF,OAAO,YAAY,OAAO,CAAC,CAAC,KAC1B,OAAO,SAAS,aACd,OAAO,QAAQ,WAAW,YAAY,OAAO,WAAW,QAAQ,OAAO,GAAG,EACxE,SAAS,KACX,CAAC,CACH,GACA,OAAO,eACP,OAAO,QAAQ,GAAG,UAAU,QAAQ,GACpC,OAAO,iBACL,OAAO,WAAW,+DAA+D,CACnF,CACF;CACF,CAAC;CAED,MAAM,gBAAgB,OAAO,GAAG,yCAAyC,CAAC,CAAC,WACzE,SACA;EACA,MAAM,YAAY,OAAO,OAAO,IAAI;GAClC,KAAK,QAAQ;GACb,aAAa,YAAY,OAAO;EAClC,CAAC,CAAC,CAAC,KACD,OAAO,QAAQ,OAAO,oBAAoB,mBAAmB,CAAC,GAC9D,OAAO,eAAe,YAAY,OAAO,CAAC,GAC1C,OAAO,cACL,iBAAiB,QAAQ,OAAO,wCAAwC,CAC1E,CACF;EAEA,OAAO,UAAU,SAAS,KAAK,SAAS,GAAG,CACzC,WAAW,QAAQ,OAAO,6CAA6C,CACzE,CAAC;CACH,CAAC;CAED,MAAM,OAAO,OAAO,GAAG,gCAAgC,CAAC,CAAC,WACvD,QACsF;EACtF,MAAM,cAAc,OAAO,eAAe,MAAM;EAChD,MAAM,YAAY,OAAO,OAAO,WAAW,UAAU,MAAM,iBAAiB;EAE5E,MAAM,aAAa,OAAO,eAAe,QAAQ,KAAK,MAAM,OAAO,OAAO,MAAM,KAAK,CAAC;EAEtF,MAAM,QAAqB;GACzB,QAAQ,EAAE,OAAO,MAAM;GACvB,cAAc,EAAE,OAAO,MAAM;GAC7B,WAAW,EAAE,OAAO,MAAM;GAC1B,WAAW,EAAE,OAAO,KAAA,EAAU;GAC9B,iCAAiB,IAAI,IAAI;EAC3B;EAEA,MAAM,YAAY,EAChB,0BAA0B,MAC5B;EAEA,MAAM,UAA6B,CAAC;EAEpC,MAAM,wBAAwB,UAC5B,OAAO,cACL,UAAU,2BACN,OAAO,OACP,MAAM,MAAM,KAAK,OAAO,iBAAiB,OAAO,WAAW,MAAM,OAAO,CAAC,CAAC,CAChF;EAEF,MAAM,UAAU,OAAO,OAAO,eAC5B,eACE,OAAO,WAAW;GAChB,MAAM,WACJ,qBACE,cACM,QAAQ,OAAO,gBAAgB,WAAW,CAAC,IAChD,aAAa,WAAW,cAAc,QAAQ,CAAC,CAClD;GACF,QAAQ,UACN,kBAAkB,KAAK,IACnB,gCAAgC,KAAK;IACnC,gBAAgB;IAChB,SAAS;GACX,CAAC,IACD,cAAc,4CAA4C,KAAK;EACvE,CAAC,GACD,aACA,SACF,IACC,aAAa;GACZ,MAAM,aAAa,QAAQ;GAE3B,OAAO,UAAU,2BACb,OAAO,OACP,cAAc,QAAQ,CAAC,CAAC,KACtB,OAAO,YAAY,OAAO,WAAW,2CAA2C,CAAC,CACnF;EACN,GACA,EAAE,eAAe,KAAK,CACxB;EAEA,QAAQ,KAAK,WAAW,QAAQ,OAAO,wCAAwC,CAAC;EAEhF,MAAM,qBAAqB;GACzB,MAAM,aAAa,QAAQ;EAC7B;EAEA,OAAO,OAAO,eACZ,OAAO,IAAI;GACT,WAAW,QAAQ,eAAe,YAAY;GAC9C,QAAQ,UAAU,cAAc,qDAAqD,KAAK;EAC5F,CAAC,SAEC,qBACE,qBACQ,QAAQ,gBAAgB,YAAY,GAC1C,iDACF,CACF,CACJ;EACA,QAAQ,KACN,qBACQ,QAAQ,gBAAgB,YAAY,GAC1C,iDACF,CACF;EAOA,IAAI,EAAC,OALoB,OAAO,IAAI;GAClC,KAAK,QAAQ;GACb,QAAQ,UAAU,cAAc,mDAAmD,KAAK;EAC1F,CAAC,IAEe;GACd,MAAM,aAAa,QAAQ;GAE3B,OAAO,OAAO,aAAa;EAC7B;EAEA,MAAM,iBAAiB,OAAO,OAAO,IAAI;GACvC,KAAK,QAAQ;GACb,QAAQ,UAAU,cAAc,mDAAmD,KAAK;EAC1F,CAAC,CAAC,CAAC,KACD,OAAO,SAAS,UACd,OAAO,oBAAoB,mBAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,KACrD,OAAO,eAAe,cAAc,gDAAgD,CAAC,CACvF,CACF,CACF;EAEA,MAAM,UAAU,OAAO,OAAO,eAC5B,eACE,OAAO,WAAW;GAChB,MAAM,WACJ,qBAAqB,QAAQ,QAAQ,gBAAgB,aAAa,SAAS,MAAM,CAAC;GACpF,QAAQ,UACN,MAAM,aAAa,SAAS,gBAAgB,KAAK,IAC7C,aAAa,IACb,cAAc,uCAAuC,KAAK;EAClE,CAAC,GACD,aACA,SACF,IACC,aACC,qBACE,WAAW,SAAS,OAAO,gDAAgD,CAC7E,GACF,EAAE,eAAe,KAAK,CACxB;EAEA,QAAQ,KAAK,WAAW,QAAQ,OAAO,gDAAgD,CAAC;EAExF,MAAM,OAAO,OAAO,OAAO,eACzB,eACE,OAAO,WAAW;GAChB,MAAM,WACJ,qBAAqB,QAAQ,QAAQ,UAAU,aAAa,SAAS,MAAM,CAAC;GAC9E,QAAQ,UACN,MAAM,aAAa,SAAS,gBAAgB,KAAK,IAC7C,aAAa,IACb,cAAc,oCAAoC,KAAK;EAC/D,CAAC,GACD,aACA,SACF,IACC,aACC,qBACE,WAAW,SAAS,OAAO,6CAA6C,CAC1E,GACF,EAAE,eAAe,KAAK,CACxB;EAEA,QAAQ,KAAK,WAAW,KAAK,OAAO,6CAA6C,CAAC;EAElF,OAAO,eACL,OAAO,WAAW;GAChB,WAAW,KAAK,uBAAuB,IAAI;GAC3C,QAAQ,UAAU,cAAc,4CAA4C,KAAK;EACnF,CAAC,GACD,aACA,SACF;EAEA,MAAM,kBAAkB,oBAAoB,aAAa,KAAK;EAE9D,OAAO,OAAO,eACZ,OAAO,IAAI;GACT,WAAW,KAAK,UAAU,eAAe;GACzC,QAAQ,UAAU,cAAc,kDAAkD,KAAK;EACzF,CAAC,SAEC,qBACE,qBACQ,KAAK,WAAW,eAAe,GACrC,4CACF,CACF,CACJ;EACA,QAAQ,KACN,qBACQ,KAAK,WAAW,eAAe,GACrC,4CACF,CACF;EAEA,OAAO,eACL,OAAO,WAAW;GAChB,WAAW,KAAK,uBAAuB,IAAI;GAC3C,QAAQ,UAAU,cAAc,gDAAgD,KAAK;EACvF,CAAC,GACD,aACA,SACF;EAEA,OAAO,eAAe,qBAAqB,KAAK,GAAG,aAAa,SAAS;EACzE,MAAM,eAAe,aAAa,KAAK;EAEvC,IAAI,iBAAiB,KAAA,GAAW,OAAO,OAAO;EAE9C,MAAM,WAAW,OAAO,OAAO,gBAC7B,OAAO,IAAI,aAAa;GACtB,MAAM,SAAS,OAAO,OAAO,OAAO,UAAU,SAAS,KAAK,cAAc,GAAG,OAAO,CAAC;GAErF,UAAU,2BAA2B;GACrC,OAAO,OAAO,mBACZ,OAAO,gBACL,OAAO,WAAW;IAChB,MAAM,OAAO,QAAQ;IACrB,MAAM,aAAa,QAAQ;GAC7B,CAAC,CAAC,CAAC,KACD,OAAO,QAAQ,MAAM,GACrB,OAAO,YAAY,OAAO,WAAW,2CAA2C,CAAC,CACnF,CACF,CACF;GAEA,OAAO;EACT,CAAC,CACH;EAEA,MAAM,QAAsD,OAAO,gBACjE,OAAO,WAAW;GAChB,MAAM,OAAO,QAAQ;GACrB,MAAM,aAAa,QAAQ;EAC7B,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAClC;EAEA,MAAM,UAAU,OAAO,WAAW,MAAM,aAAa,WAAW,OAAO,KAAK;EAC5E,MAAM,uBAAuB,mBAAmB,MAAM,WAAW,CAAC,CAAC,KAAK,OAAO,MAAM;EAErF,MAAM,sBAAsB,oBAC1B,gBAAgB,aAAa,SAAS,CAAC,CAAC,KACtC,OAAO,SAAS,cACd,YAAY,KAAK,mBAAmB,YAChC,OAAO,OACP,OAAO,KACL,YAAY,6DAA6D,CAC3E,CACN,CACF;EAEF,OAAO;GACL,QAAQ,QAAQ;GAChB,WAAW,SAAS,KAAK,cAAc;GACvC,iBAAiB,aACf,eAAe,QAAQ,CAAC,CAAC,KACvB,OAAO,SAAS,YACd,QAAQ,IACN,OAAO,WAAW;IAChB,WAAW,KAAK,YAAY,OAAO;IACnC,QAAQ,UAAU;KAChB,IAAI,MAAM,aAAa,SAAS,gBAAgB,KAAK,GAAG;MACtD,MAAM,aAAa,QAAQ;MAE3B,OAAO,aAAa;KACtB;KAEA,OAAO,cAAc,wCAAwC,KAAK;IACpE;GACF,CAAC,GACD,sBACA,KACF,CACF,CACF;GACF,cAAc,YACZ,OAAO,aAAa,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,KACtD,OAAO,eAAe,YAAY,oCAAoC,CAAC,GACvE,OAAO,SAAS,YACd,QAAQ,IACN,WACE,MACA,OACA,0BACA;IAAE,MAAM,QAAQ;IAAM,aAAa,QAAQ;GAAY,GACvD,qBACA,oDACF,CAAC,CAAC,KACA,OAAO,SAAS,gBACd,OAAO,aAAa,wBAAwB,CAAC,CAAC,EAC5C,qBAAqB,SAAS,KAAK,YAAY,mBAAmB,EACpE,CAAC,CAAC,CAAC,KACD,OAAO,eACL,cAAc,oDAAoD,CACpE,CACF,CACF,CACF,GACA,qBAAqB,KAAK,OAAO,QAAQ,mBAAmB,QAAQ,WAAW,CAAC,CAAC,CACnF,CACF,CACF;GACF,UAAU,YACR,OAAO,aAAa,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,KACrD,OAAO,eAAe,YAAY,0CAA0C,CAAC,GAC7E,OAAO,SAAS,YACd,QAAQ,IACN,WACE,MACA,OACA,sBACA;IAAE,cAAc,QAAQ;IAAc,SAAS,QAAQ;GAAQ,GAC/D,oBACA,0DACF,CAAC,CAAC,KACA,OAAO,SAAS,gBACd,OAAO,aAAa,uBAAuB,CAAC,CAAC,EAC3C,WAAW,SAAS,KAAK,YAAY,SAAS,EAChD,CAAC,CAAC,CAAC,KACD,OAAO,eACL,cAAc,0DAA0D,CAC1E,CACF,CACF,CACF,GACA,qBAAqB,KAAK,OAAO,QAAQ,mBAAmB,QAAQ,OAAO,CAAC,CAAC,CAC/E,CACF,CACF;GACF,iBAAiB,QAAQ,IACvB,WACE,MACA,OACA,8BACA,CAAC,GACD,yBACA,uDACF,CAAC,CAAC,KACA,OAAO,SAAS,gBACd,OAAO,aAAa,sBAAsB,CAAC,CAAC;IAC1C,QAAQ,YAAY;IACpB,GAAI,YAAY,cAAc,KAAA,IAC1B,CAAC,IACD,EAAE,WAAW,SAAS,KAAK,YAAY,SAAS,EAAE;IACtD,GAAI,YAAY,eAAe,KAAA,IAC3B,CAAC,IACD,EAAE,YAAY,YAAY,WAAW;GAC3C,CAAC,CAAC,CAAC,KACD,OAAO,eACL,cAAc,uDAAuD,CACvE,CACF,CACF,CACF,GACA,oBACF;GACA;EACF;CACF,CAAC;CAED,OAAO,0BAA0B,GAAG;EAClC;EACA;EACA,kBAAkB;CACpB,CAAC;AACH;;AAGA,MAAa,uCAKX,MAAM,OACJ,2BACA,OAAO,IAAI,aAAa;CACtB,OAAO,gBAAgB,OAAO,4BAA4B;AAC5D,CAAC,CACH;;AAGF,MAAa,mCAKX,MAAM,OACJ,oBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,OAAO,gBAAgB,OAAO;CAEpC,OAAO,mBAAmB,GAAG,EAC3B,OAAO,WAAW,KAAK,KAAK,MAAM,CAAC,CAAC,KAAK,OAAO,KAAK,YAAY,QAAQ,MAAM,CAAC,EAClF,CAAC;AACH,CAAC,CACH;AAQF,MAAM,2BAA2B,YAC/B,6BAA6B,MAAM,OAAO,CAAC,CAAC,KAC1C,MAAM,QAAQ,2BAA2B,MAAM,OAAO,CAAC,CACzD;;AAGF,MAAa,+BAA+B;;;;;;CAM1C,QAAQ,YACN,2BAA2B,CAAC,CAAC,KAAK,MAAM,QAAQ,wBAAwB,OAAO,CAAC,CAAC;;CAEnF,YAAY,YACV,+BAA+B,CAAC,CAAC,KAAK,MAAM,QAAQ,wBAAwB,OAAO,CAAC,CAAC;AACzF"}
@@ -1,2 +1,2 @@
1
- import { a as BrowserRunInteractiveHost, c as BrowserRunViewport, d as browserRunInteractiveImplementation, f as browserRunInteractiveLayer, h as BrowserRunSessionLifecycle, i as BrowserRunInteractiveBinding, l as CloudflareInteractiveBrowser, m as BrowserRunCleanupError, n as BrowserRunHandoffResult, o as BrowserRunLiveViewRequest, p as isBrowserRunUndispatchedActionError, r as BrowserRunHandoffState, s as BrowserRunLiveViewResult, t as BrowserRunHandoffRequest, u as browserRunInteractiveHostLayer } from "./InteractiveBrowser-DupDtfw2.mjs";
1
+ import { a as BrowserRunInteractiveHost, c as BrowserRunViewport, d as browserRunInteractiveImplementation, f as browserRunInteractiveLayer, h as BrowserRunSessionLifecycle, i as BrowserRunInteractiveBinding, l as CloudflareInteractiveBrowser, m as BrowserRunCleanupError, n as BrowserRunHandoffResult, o as BrowserRunLiveViewRequest, p as isBrowserRunUndispatchedActionError, r as BrowserRunHandoffState, s as BrowserRunLiveViewResult, t as BrowserRunHandoffRequest, u as browserRunInteractiveHostLayer } from "./InteractiveBrowser-CUsy34tv.mjs";
2
2
  export { BrowserRunCleanupError, BrowserRunHandoffRequest, BrowserRunHandoffResult, BrowserRunHandoffState, BrowserRunInteractiveBinding, BrowserRunInteractiveHost, BrowserRunLiveViewRequest, BrowserRunLiveViewResult, BrowserRunSessionLifecycle, BrowserRunViewport, CloudflareInteractiveBrowser, browserRunInteractiveHostLayer, browserRunInteractiveImplementation, browserRunInteractiveLayer, isBrowserRunUndispatchedActionError };
@@ -1,4 +1,4 @@
1
- import { h as BrowserRunSessionLifecycle, o as BrowserRunLiveViewRequest, r as BrowserRunHandoffState, s as BrowserRunLiveViewResult, t as BrowserRunHandoffRequest } from "./InteractiveBrowser-DupDtfw2.mjs";
1
+ import { h as BrowserRunSessionLifecycle, o as BrowserRunLiveViewRequest, r as BrowserRunHandoffState, s as BrowserRunLiveViewResult, t as BrowserRunHandoffRequest } from "./InteractiveBrowser-CUsy34tv.mjs";
2
2
  import { Clock, Context, Crypto, Effect, Layer, Redacted, Schema, Semaphore } from "effect";
3
3
  import puppeteer from "@cloudflare/puppeteer";
4
4
  import { InteractiveBrowserPolicy } from "effect-agent/interactive-browser";
@@ -49,7 +49,7 @@ const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(function*
49
49
  observation: "closed",
50
50
  cleanup: "not-requested"
51
51
  });
52
- const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(Effect.mapError(() => initialError("denied")));
52
+ const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy, { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => initialError("denied")));
53
53
  if (decodedPolicy.network._tag === "PublicWeb") return yield* initialError("unsupported");
54
54
  const policy = InteractiveBrowserPolicy.make({
55
55
  ...decodedPolicy,
@@ -251,7 +251,7 @@ const makeProtectedBrowserPolicy = Effect.fn("ProtectedBrowser.open")(function*
251
251
  yield* permitObservation;
252
252
  })),
253
253
  fill: (request) => run(Effect.gen(function* () {
254
- const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill)(request).pipe(Effect.mapError(() => fail("denied")));
254
+ const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill, { onExcessProperty: "error" })(request).pipe(Effect.mapError(() => fail("denied")));
255
255
  yield* permitObservation;
256
256
  const control = yield* target(decoded.ref);
257
257
  if (control.role !== "text" && control.role !== "select") return yield* fail("unsupported");
@@ -1026,7 +1026,7 @@ const browserRunProtectedHostLayer = () => Layer.effect(BrowserRunProtectedHost)
1026
1026
  const lifecycle = yield* BrowserRunSessionLifecycle;
1027
1027
  const crypto = yield* Crypto.Crypto;
1028
1028
  const open = Effect.fn("BrowserRunProtectedHost.open")(function* (input, checkpoint) {
1029
- const policy = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(Effect.mapError(() => failure("denied")));
1029
+ const policy = yield* Schema.decodeEffect(InteractiveBrowserPolicy, { onExcessProperty: "error" })(input).pipe(Effect.mapError(() => failure("denied")));
1030
1030
  if (policy.network._tag !== "Unrestricted") return yield* failure("unsupported");
1031
1031
  if (policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - (checkpoint?.protected.startedAt ?? (yield* Clock.currentTimeMillis))) <= 0 || checkpoint !== void 0 && checkpoint.protected.startedAt > (yield* Clock.currentTimeMillis)) return yield* failure("timeout");
1032
1032
  if (checkpoint !== void 0 && checkpoint.protected.actions > policy.maxActions) return yield* failure("denied");