@effect-agent/platform-cloudflare 0.1.0-beta.130 → 0.1.0-beta.131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BrowserSession-DxCN-5F9.d.mts → BrowserSession-DP6b-cpL.d.mts} +18 -2
- package/dist/{BrowserSession-BplIoNfi.mjs → BrowserSession-DWoRC_iM.mjs} +67 -4
- package/dist/BrowserSession-DWoRC_iM.mjs.map +1 -0
- package/dist/BrowserSession.d.mts +1 -1
- package/dist/BrowserSession.mjs +2 -2
- package/dist/CloudflareThreadClient.d.mts +86 -86
- package/dist/{InteractiveBrowser-D-xxDv_f.mjs → InteractiveBrowser-CxFT-Nwm.mjs} +2 -2
- package/dist/{InteractiveBrowser-D-xxDv_f.mjs.map → InteractiveBrowser-CxFT-Nwm.mjs.map} +1 -1
- package/dist/InteractiveBrowser.mjs +1 -1
- package/dist/{ThreadObject-CcS4Q2iT.d.mts → ThreadObject-D8GzJxJB.d.mts} +41 -41
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/src/BrowserSession.ts +33 -0
- package/src/internal/browser-readonly-live-view.ts +111 -0
- package/dist/BrowserSession-BplIoNfi.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as BrowserRunCleanupError, a as BrowserRunInteractiveCheckpoint, c as BrowserRunLiveViewResult, d as BrowserRunViewport, f as CloudflareInteractiveBrowser, g as isBrowserRunUndispatchedActionError, h as browserRunInteractiveLayer, i as BrowserRunInteractiveBinding, l as BrowserRunPageIdentity, m as browserRunInteractiveImplementation, n as BrowserRunHandoffResult, o as BrowserRunInteractiveHost, p as browserRunInteractiveHostLayer, r as BrowserRunHandoffState, s as BrowserRunLiveViewRequest, t as BrowserRunHandoffRequest, u as BrowserRunPageObservation, v as BrowserRunSessionLifecycle } from "./InteractiveBrowser-
|
|
1
|
+
import { _ as BrowserRunCleanupError, a as BrowserRunInteractiveCheckpoint, c as BrowserRunLiveViewResult, d as BrowserRunViewport, f as CloudflareInteractiveBrowser, g as isBrowserRunUndispatchedActionError, h as browserRunInteractiveLayer, i as BrowserRunInteractiveBinding, l as BrowserRunPageIdentity, m as browserRunInteractiveImplementation, n as BrowserRunHandoffResult, o as BrowserRunInteractiveHost, p as browserRunInteractiveHostLayer, r as BrowserRunHandoffState, s as BrowserRunLiveViewRequest, t as BrowserRunHandoffRequest, u as BrowserRunPageObservation, v as BrowserRunSessionLifecycle } from "./InteractiveBrowser-CxFT-Nwm.mjs";
|
|
2
2
|
export { BrowserRunCleanupError, BrowserRunHandoffRequest, BrowserRunHandoffResult, BrowserRunHandoffState, BrowserRunInteractiveBinding, BrowserRunInteractiveCheckpoint, BrowserRunInteractiveHost, BrowserRunLiveViewRequest, BrowserRunLiveViewResult, BrowserRunPageIdentity, BrowserRunPageObservation, BrowserRunSessionLifecycle, BrowserRunViewport, CloudflareInteractiveBrowser, browserRunInteractiveHostLayer, browserRunInteractiveImplementation, browserRunInteractiveLayer, isBrowserRunUndispatchedActionError };
|
|
@@ -710,19 +710,25 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
710
710
|
readonly message: string;
|
|
711
711
|
readonly cause?: Schema.Json | undefined;
|
|
712
712
|
} | {
|
|
713
|
-
readonly _tag: "
|
|
713
|
+
readonly _tag: "ThreadNotMaterialized";
|
|
714
|
+
readonly threadId: string;
|
|
715
|
+
} | {
|
|
716
|
+
readonly _tag: "ThreadStoreError";
|
|
717
|
+
readonly operation: string;
|
|
714
718
|
readonly message: string;
|
|
719
|
+
readonly cause?: Schema.Json | undefined;
|
|
720
|
+
readonly diagnostic?: {
|
|
721
|
+
readonly causeTag: string;
|
|
722
|
+
readonly operation: string;
|
|
723
|
+
readonly decoder?: string | undefined;
|
|
724
|
+
readonly issueTag?: string | undefined;
|
|
725
|
+
readonly sequence?: number | undefined;
|
|
726
|
+
} | undefined;
|
|
715
727
|
} | {
|
|
716
728
|
readonly _tag: "LedgerError";
|
|
717
729
|
readonly operation: string;
|
|
718
730
|
readonly message: string;
|
|
719
731
|
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
720
|
-
} | {
|
|
721
|
-
readonly _tag: "AdmissionPolicyError";
|
|
722
|
-
readonly reason: "occupied" | "refused" | "unavailable";
|
|
723
|
-
readonly code: string;
|
|
724
|
-
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
725
|
-
readonly stack?: string | undefined;
|
|
726
732
|
} | {
|
|
727
733
|
readonly _tag: "AppendConflict";
|
|
728
734
|
readonly threadId: string;
|
|
@@ -730,36 +736,11 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
730
736
|
readonly reason: "batch-digest" | "record-identity" | "tail";
|
|
731
737
|
readonly actualTailSequence?: number | undefined;
|
|
732
738
|
readonly actualTailDigest?: string | undefined;
|
|
733
|
-
} | {
|
|
734
|
-
readonly _tag: "DigestError";
|
|
735
|
-
readonly message: string;
|
|
736
|
-
readonly cause?: Schema.Json | undefined;
|
|
737
|
-
} | {
|
|
738
|
-
readonly _tag: "DurableRuntimeFailpointError";
|
|
739
|
-
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-duration-append" | "run:after-start-append" | "run:before-duration-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:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-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-stop-append" | "worker:after-stop-seal" | "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-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
|
|
740
739
|
} | {
|
|
741
740
|
readonly _tag: "FenceRejected";
|
|
742
741
|
readonly threadId: string;
|
|
743
742
|
readonly actualEpoch: number;
|
|
744
743
|
readonly attemptedEpoch: number;
|
|
745
|
-
} | {
|
|
746
|
-
readonly _tag: "ThreadNotMaterialized";
|
|
747
|
-
readonly threadId: string;
|
|
748
|
-
} | {
|
|
749
|
-
readonly _tag: "ThreadStoreError";
|
|
750
|
-
readonly operation: string;
|
|
751
|
-
readonly message: string;
|
|
752
|
-
readonly cause?: Schema.Json | undefined;
|
|
753
|
-
readonly diagnostic?: {
|
|
754
|
-
readonly causeTag: string;
|
|
755
|
-
readonly operation: string;
|
|
756
|
-
readonly decoder?: string | undefined;
|
|
757
|
-
readonly issueTag?: string | undefined;
|
|
758
|
-
readonly sequence?: number | undefined;
|
|
759
|
-
} | undefined;
|
|
760
|
-
} | {
|
|
761
|
-
readonly _tag: "ApprovalSuspensionError";
|
|
762
|
-
readonly cause: Schema.Json;
|
|
763
744
|
} | {
|
|
764
745
|
readonly _tag: "OperationDenied";
|
|
765
746
|
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
@@ -767,23 +748,42 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
767
748
|
readonly threadId?: string | undefined;
|
|
768
749
|
readonly submissionId?: string | undefined;
|
|
769
750
|
} | {
|
|
770
|
-
readonly _tag: "
|
|
771
|
-
readonly
|
|
772
|
-
readonly
|
|
773
|
-
readonly
|
|
774
|
-
readonly
|
|
751
|
+
readonly _tag: "AdmissionPolicyError";
|
|
752
|
+
readonly reason: "occupied" | "refused" | "unavailable";
|
|
753
|
+
readonly code: string;
|
|
754
|
+
readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
|
|
755
|
+
readonly stack?: string | undefined;
|
|
775
756
|
} | {
|
|
776
|
-
readonly _tag: "
|
|
757
|
+
readonly _tag: "DigestError";
|
|
777
758
|
readonly message: string;
|
|
778
759
|
readonly cause?: Schema.Json | undefined;
|
|
760
|
+
} | {
|
|
761
|
+
readonly _tag: "DurableRuntimeFailpointError";
|
|
762
|
+
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-duration-append" | "run:after-start-append" | "run:before-duration-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:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-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-stop-append" | "worker:after-stop-seal" | "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-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
|
|
763
|
+
} | {
|
|
764
|
+
readonly _tag: "SettlementConflict";
|
|
765
|
+
readonly submissionId: string;
|
|
766
|
+
readonly existingOutcome: "aborted" | "completed" | "failed";
|
|
767
|
+
} | {
|
|
768
|
+
readonly _tag: "ApprovalSuspensionError";
|
|
769
|
+
readonly cause: Schema.Json;
|
|
779
770
|
} | {
|
|
780
771
|
readonly _tag: "OwnershipLost";
|
|
781
772
|
readonly submissionId: string;
|
|
782
773
|
readonly actualEpoch: number;
|
|
783
774
|
} | {
|
|
784
|
-
readonly _tag: "
|
|
775
|
+
readonly _tag: "RunJournalError";
|
|
776
|
+
readonly message: string;
|
|
777
|
+
readonly cause?: Schema.Json | undefined;
|
|
778
|
+
} | {
|
|
779
|
+
readonly _tag: "HostProtocolError";
|
|
780
|
+
readonly message: string;
|
|
781
|
+
} | {
|
|
782
|
+
readonly _tag: "RetryRefused";
|
|
785
783
|
readonly submissionId: string;
|
|
786
|
-
readonly
|
|
784
|
+
readonly refusal: "await-approval-decision" | "await-unknown-resolution" | "settled";
|
|
785
|
+
readonly decisionTag: string;
|
|
786
|
+
readonly message: string;
|
|
787
787
|
};
|
|
788
788
|
}, Schema.SchemaError, never>;
|
|
789
789
|
declare const decodeAdminResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AdminFailed | ExplainedRecovery | ObligationsScanned | RetryExecuted | VerifiedIntegrity, Schema.SchemaError, never>;
|
|
@@ -836,4 +836,4 @@ interface Class<EventServices = never> {
|
|
|
836
836
|
declare const make: <ApplicationServices, ApplicationError, EventServices = never, EventLayerError = never>(applicationLayer: Layer.Layer<CloudflareDurableRuntimeServices | ApplicationServices, ApplicationError, CloudflareBootstrapServices | DurableObjectState$1.DurableObjectState | WorkerEnvironment | DurableObjectContext | ThreadObjectNamespace>, options: Options<ApplicationServices, EventServices, EventLayerError>) => Class<ApplicationServices | EventServices>;
|
|
837
837
|
//#endregion
|
|
838
838
|
export { ThreadPublicationOptions as A, portCall as C, CloudflareDurableRuntimeOptions as D, CloudflareDurableRuntimeInitializationError as E, layerConfig as M, layerHostConfig as N, CloudflareDurableRuntimeServices as O, layerInHost as P, make as S, CloudflareBootstrapServices as T, decodeAdminVerifyRequest as _, AdminVerifyRequest as a, encodeAdminResponse as b, Instance as c, RetryExecuted as d, ThreadObject_d_exports as f, decodeAdminResponse as g, decodeAdminExplainRequest as h, AdminResponse as i, layer as j, ThreadObjectPorts as k, ObligationsScanned as l, VerifiedIntegrity as m, AdminFailed as n, Class as o, ThreadRpcOperation as p, AdminFailure as r, ExplainedRecovery as s, AdminExplainRequest as t, Options as u, decodeObligationThresholds as v, submit as w, handleRpc as x, decodeRetryCommand as y };
|
|
839
|
-
//# sourceMappingURL=ThreadObject-
|
|
839
|
+
//# sourceMappingURL=ThreadObject-D8GzJxJB.d.mts.map
|
package/dist/ThreadObject.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-
|
|
1
|
+
import { A as ThreadPublicationOptions, C as portCall, D as CloudflareDurableRuntimeOptions, E as CloudflareDurableRuntimeInitializationError, M as layerConfig, N as layerHostConfig, O as CloudflareDurableRuntimeServices, P as layerInHost, S as make, T as CloudflareBootstrapServices, _ as decodeAdminVerifyRequest, a as AdminVerifyRequest, b as encodeAdminResponse, c as Instance, d as RetryExecuted, g as decodeAdminResponse, h as decodeAdminExplainRequest, i as AdminResponse, j as layer, k as ThreadObjectPorts, l as ObligationsScanned, m as VerifiedIntegrity, n as AdminFailed, o as Class, p as ThreadRpcOperation, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeObligationThresholds, w as submit, x as handleRpc, y as decodeRetryCommand } from "./ThreadObject-D8GzJxJB.mjs";
|
|
2
2
|
export { AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, type CloudflareBootstrapServices as BootstrapServices, Class, ExplainedRecovery, type CloudflareDurableRuntimeInitializationError as InitializationError, Instance, ObligationsScanned, Options, type ThreadPublicationOptions as PublicationOptions, RetryExecuted, type CloudflareDurableRuntimeOptions as RuntimeOptions, type CloudflareDurableRuntimeServices as Services, ThreadObjectPorts, ThreadRpcOperation, VerifiedIntegrity, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeObligationThresholds, decodeRetryCommand, encodeAdminResponse, handleRpc, layer, layerConfig, layerHostConfig, layerInHost, make, portCall, submit };
|
package/dist/index.d.mts
CHANGED
|
@@ -3,13 +3,13 @@ import { o as CloudflareConfig_d_exports } from "./CloudflareConfig-DKXGo8L3.mjs
|
|
|
3
3
|
import { t as Alarm_d_exports } from "./Alarm.mjs";
|
|
4
4
|
import { t as BrowserCredentials_d_exports } from "./BrowserCredentials.mjs";
|
|
5
5
|
import { t as CloudflareBrowser_d_exports } from "./CloudflareBrowser-Doe1M7R5.mjs";
|
|
6
|
-
import { a as BrowserSession_d_exports } from "./BrowserSession-
|
|
6
|
+
import { a as BrowserSession_d_exports } from "./BrowserSession-DP6b-cpL.mjs";
|
|
7
7
|
import { t as CloudflareAiGateway_d_exports } from "./CloudflareAiGateway.mjs";
|
|
8
8
|
import { t as CloudflareCodeMode_d_exports } from "./CloudflareCodeMode.mjs";
|
|
9
9
|
import { t as CloudflareMemory_d_exports } from "./CloudflareMemory.mjs";
|
|
10
10
|
import { t as CloudflareScheduling_d_exports } from "./CloudflareScheduling.mjs";
|
|
11
11
|
import { t as CloudflareSubscriptions_d_exports } from "./CloudflareSubscriptions.mjs";
|
|
12
12
|
import { t as CloudflareThreadClient_d_exports } from "./CloudflareThreadClient.mjs";
|
|
13
|
-
import { f as ThreadObject_d_exports } from "./ThreadObject-
|
|
13
|
+
import { f as ThreadObject_d_exports } from "./ThreadObject-D8GzJxJB.mjs";
|
|
14
14
|
import { t as WakeScheduler_d_exports } from "./WakeScheduler.mjs";
|
|
15
15
|
export { Alarm_d_exports as Alarm, BrowserCredentials_d_exports as BrowserCredentials, BrowserSession_d_exports as BrowserSession, CloudflareAiGateway_d_exports as CloudflareAiGateway, CloudflareBindings_d_exports as CloudflareBindings, CloudflareBrowser_d_exports as CloudflareBrowser, CloudflareCodeMode_d_exports as CloudflareCodeMode, CloudflareConfig_d_exports as CloudflareConfig, CloudflareMemory_d_exports as CloudflareMemory, CloudflareScheduling_d_exports as CloudflareScheduling, CloudflareSubscriptions_d_exports as CloudflareSubscriptions, CloudflareThreadClient_d_exports as CloudflareThreadClient, ThreadObject_d_exports as ThreadObject, WakeScheduler_d_exports as WakeScheduler };
|
package/dist/index.mjs
CHANGED
|
@@ -11,5 +11,5 @@ import { t as WakeScheduler_exports } from "./WakeScheduler.mjs";
|
|
|
11
11
|
import { l as ThreadObject_exports } from "./ThreadObject-CVhZC-7l.mjs";
|
|
12
12
|
import { t as CloudflareAiGateway_exports } from "./CloudflareAiGateway.mjs";
|
|
13
13
|
import { t as BrowserCredentials_exports } from "./BrowserCredentials.mjs";
|
|
14
|
-
import { i as BrowserSession_exports } from "./BrowserSession-
|
|
14
|
+
import { i as BrowserSession_exports } from "./BrowserSession-DWoRC_iM.mjs";
|
|
15
15
|
export { Alarm_exports as Alarm, BrowserCredentials_exports as BrowserCredentials, BrowserSession_exports as BrowserSession, CloudflareAiGateway_exports as CloudflareAiGateway, CloudflareBindings_exports as CloudflareBindings, CloudflareBrowser_exports as CloudflareBrowser, CloudflareCodeMode_exports as CloudflareCodeMode, CloudflareConfig_exports as CloudflareConfig, CloudflareMemory_exports as CloudflareMemory, CloudflareScheduling_exports as CloudflareScheduling, CloudflareSubscriptions_exports as CloudflareSubscriptions, CloudflareThreadClient_exports as CloudflareThreadClient, ThreadObject_exports as ThreadObject, WakeScheduler_exports as WakeScheduler };
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.
|
|
1
|
+
{"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.131","dependencies":{"@effect-agent/storage-cloudflare":"0.1.0-beta.131","@effect/platform-browser":"4.0.0-rc.116","@effect/sql-sqlite-do":"4.0.0-rc.116","effect-agent":"0.1.0-beta.131","puppeteer-core":"24.29.0"},"devDependencies":{"@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/testing":"0.1.0-beta.131","@effect/platform-node":"4.0.0-rc.116","@effect/sql-d1":"4.0.0-rc.116","@effect/vitest":"4.0.0-rc.116","effect":"4.0.0-rc.116","effect-cf":"0.44.1","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.2","vitest":"4.1.11"},"peerDependencies":{"effect":"^4.0.0-rc.116","effect-cf":"^0.44.1 || ^0.45.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./browser-rest-capture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./browser-rest-crawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./cloudflare-bindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./cloudflare-browser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./cloudflare-code-mode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./cloudflare-config":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./cloudflare-memory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./cloudflare-scheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./cloudflare-subscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./cloudflare-thread-client":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./interactive-browser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./browser-session":{"types":"./dist/BrowserSession.d.mts","default":"./dist/BrowserSession.mjs"},"./browser-credentials":{"types":"./dist/BrowserCredentials.d.mts","default":"./dist/BrowserCredentials.mjs"},"./thread-object":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./wake-scheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"},"./cloudflare-ai-gateway":{"types":"./dist/CloudflareAiGateway.d.mts","default":"./dist/CloudflareAiGateway.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"}}
|
package/src/BrowserSession.ts
CHANGED
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
import { BrowserRunBinding, type BrowserRunAttachment } from "./internal/browser-binding.ts";
|
|
31
31
|
import { BrowserSessionPage, fillCredential } from "./internal/browser-credentials.ts";
|
|
32
32
|
import { reportBrowserCause, reportedBrowserError } from "./internal/browser-failure.ts";
|
|
33
|
+
import { BrowserRunReadonlyLiveView } from "./internal/browser-readonly-live-view.ts";
|
|
33
34
|
import {
|
|
34
35
|
BrowserRunSessionLifecycle,
|
|
35
36
|
type BrowserRunLifecycleOptions,
|
|
@@ -126,6 +127,15 @@ export interface BrowserSession {
|
|
|
126
127
|
authorize: Effect.Effect<void, E, R>,
|
|
127
128
|
request: BrowserRunLiveViewRequest,
|
|
128
129
|
) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;
|
|
130
|
+
/**
|
|
131
|
+
* Mint a provider-enforced read-only connection to this exact page. Requires REST credentials;
|
|
132
|
+
* missing read-only confirmation fails closed, never falling back to an interactive URL.
|
|
133
|
+
* Expiry limits new connections, not established connections or access to visible page data.
|
|
134
|
+
*/
|
|
135
|
+
readonly getReadOnlyLiveView: <E, R>(
|
|
136
|
+
authorize: Effect.Effect<void, E, R>,
|
|
137
|
+
request: BrowserRunLiveViewRequest,
|
|
138
|
+
) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;
|
|
129
139
|
readonly getHandoffState: <E, R>(
|
|
130
140
|
authorize: Effect.Effect<void, E, R>,
|
|
131
141
|
) => Effect.Effect<BrowserRunHandoffState, E | BrowserSessionError, R>;
|
|
@@ -217,6 +227,7 @@ export class BrowserSessions extends Context.Service<
|
|
|
217
227
|
Effect.gen(function* () {
|
|
218
228
|
const binding = yield* BrowserRunBinding;
|
|
219
229
|
const lifecycle = yield* BrowserRunSessionLifecycle;
|
|
230
|
+
const readonlyLiveView = yield* BrowserRunReadonlyLiveView;
|
|
220
231
|
|
|
221
232
|
const close = (sessionId: Redacted.Redacted<string>) =>
|
|
222
233
|
decode(SessionId, sessionId).pipe(
|
|
@@ -506,6 +517,27 @@ export class BrowserSessions extends Context.Service<
|
|
|
506
517
|
}),
|
|
507
518
|
),
|
|
508
519
|
),
|
|
520
|
+
getReadOnlyLiveView: (authorize, request) =>
|
|
521
|
+
decode(BrowserRunLiveViewRequest, request).pipe(
|
|
522
|
+
Effect.flatMap((value) =>
|
|
523
|
+
runEffect((commandTimeoutMillis) =>
|
|
524
|
+
authorize.pipe(
|
|
525
|
+
Effect.andThen(() =>
|
|
526
|
+
readonlyLiveView.mint(reference.sessionId, reference.targetId, value).pipe(
|
|
527
|
+
Effect.tapCause((cause) =>
|
|
528
|
+
reportBrowserCause("session.readonlyLiveView", cause),
|
|
529
|
+
),
|
|
530
|
+
Effect.mapError(() => reportedBrowserError(failure("provider"))),
|
|
531
|
+
),
|
|
532
|
+
),
|
|
533
|
+
Effect.timeoutOrElse({
|
|
534
|
+
duration: commandTimeoutMillis,
|
|
535
|
+
orElse: () => Effect.fail(failure("timeout")),
|
|
536
|
+
}),
|
|
537
|
+
),
|
|
538
|
+
),
|
|
539
|
+
),
|
|
540
|
+
),
|
|
509
541
|
getHandoffState: (authorize) =>
|
|
510
542
|
command(
|
|
511
543
|
authorize,
|
|
@@ -586,6 +618,7 @@ export class BrowserSessions extends Context.Service<
|
|
|
586
618
|
return this.layerNoDeps.pipe(
|
|
587
619
|
Layer.provide(BrowserRunBinding.layer(options.browser)),
|
|
588
620
|
Layer.provide(BrowserRunSessionLifecycle.layer(options)),
|
|
621
|
+
Layer.provide(BrowserRunReadonlyLiveView.layer(options)),
|
|
589
622
|
);
|
|
590
623
|
}
|
|
591
624
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Redacted, Schema, Stream } from "effect";
|
|
2
|
+
import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http";
|
|
3
|
+
|
|
4
|
+
import { BrowserRunLiveViewRequest, BrowserRunLiveViewResult } from "../InteractiveBrowser.ts";
|
|
5
|
+
import { browserFailure, BrowserRunFailure } from "./browser-failure.ts";
|
|
6
|
+
import type { BrowserRunLifecycleOptions } from "./browser-session-lifecycle.ts";
|
|
7
|
+
|
|
8
|
+
const Identity = Schema.Struct({
|
|
9
|
+
sessionId: Schema.String.check(Schema.isUUID()),
|
|
10
|
+
targetId: Schema.NonEmptyString.check(Schema.isMaxLength(256)),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const Reply = Schema.fromJsonString(
|
|
14
|
+
Schema.Struct({
|
|
15
|
+
id: Identity.fields.targetId,
|
|
16
|
+
options: Schema.Struct({
|
|
17
|
+
mode: Schema.Literal("tab"),
|
|
18
|
+
guardrails: Schema.Struct({ mode: Schema.Literal("readonly") }),
|
|
19
|
+
}),
|
|
20
|
+
devtoolsFrontendUrl: Schema.String,
|
|
21
|
+
}),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
const operation = "session.readonlyLiveView";
|
|
25
|
+
|
|
26
|
+
/** Only the REST endpoint can mint provider-enforced read-only connections. */
|
|
27
|
+
export class BrowserRunReadonlyLiveView extends Context.Service<
|
|
28
|
+
BrowserRunReadonlyLiveView,
|
|
29
|
+
{
|
|
30
|
+
readonly mint: (
|
|
31
|
+
sessionId: Redacted.Redacted<string>,
|
|
32
|
+
targetId: Redacted.Redacted<string>,
|
|
33
|
+
request: BrowserRunLiveViewRequest,
|
|
34
|
+
) => Effect.Effect<BrowserRunLiveViewResult, BrowserRunFailure>;
|
|
35
|
+
}
|
|
36
|
+
>()("@effect-agent/platform-cloudflare/internal/BrowserRunReadonlyLiveView") {
|
|
37
|
+
static layer(options: BrowserRunLifecycleOptions) {
|
|
38
|
+
return Layer.effect(
|
|
39
|
+
this,
|
|
40
|
+
Effect.gen(function* () {
|
|
41
|
+
const client = yield* HttpClient.HttpClient;
|
|
42
|
+
|
|
43
|
+
const mint = Effect.fnUntraced(
|
|
44
|
+
function* (
|
|
45
|
+
sessionId: Redacted.Redacted<string>,
|
|
46
|
+
targetId: Redacted.Redacted<string>,
|
|
47
|
+
request: BrowserRunLiveViewRequest,
|
|
48
|
+
) {
|
|
49
|
+
const identity = yield* Schema.decodeEffect(Identity)({
|
|
50
|
+
sessionId: Redacted.value(sessionId),
|
|
51
|
+
targetId: Redacted.value(targetId),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const input = yield* Schema.decodeEffect(BrowserRunLiveViewRequest)(request);
|
|
55
|
+
|
|
56
|
+
const response = yield* client
|
|
57
|
+
.execute(
|
|
58
|
+
HttpClientRequest.post(
|
|
59
|
+
`https://api.cloudflare.com/client/v4/accounts/${options.accountId}/browser-rendering/devtools/browser/${identity.sessionId}/live_view`,
|
|
60
|
+
).pipe(
|
|
61
|
+
HttpClientRequest.bearerToken(options.apiToken),
|
|
62
|
+
HttpClientRequest.bodyJsonUnsafe({
|
|
63
|
+
mode: input.mode,
|
|
64
|
+
expiresInMs: input.expiresInMs,
|
|
65
|
+
targetId: identity.targetId,
|
|
66
|
+
guardrails: { mode: "readonly" },
|
|
67
|
+
}),
|
|
68
|
+
),
|
|
69
|
+
)
|
|
70
|
+
.pipe(Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" }));
|
|
71
|
+
|
|
72
|
+
if (response.status !== 200)
|
|
73
|
+
return yield* new BrowserRunFailure({
|
|
74
|
+
operation,
|
|
75
|
+
reason: "provider",
|
|
76
|
+
status: response.status,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const bytes = yield* Stream.runFoldEffect(
|
|
80
|
+
response.stream,
|
|
81
|
+
() => new Uint8Array(),
|
|
82
|
+
(body, chunk) => {
|
|
83
|
+
if (body.byteLength + chunk.byteLength > 16_384)
|
|
84
|
+
return Effect.fail(new BrowserRunFailure({ operation, reason: "malformed" }));
|
|
85
|
+
const combined = new Uint8Array(body.byteLength + chunk.byteLength);
|
|
86
|
+
|
|
87
|
+
combined.set(body);
|
|
88
|
+
combined.set(chunk, body.byteLength);
|
|
89
|
+
|
|
90
|
+
return Effect.succeed(combined);
|
|
91
|
+
},
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const reply = yield* Schema.decodeEffect(Reply)(new TextDecoder().decode(bytes));
|
|
95
|
+
|
|
96
|
+
if (reply.id !== identity.targetId)
|
|
97
|
+
return yield* new BrowserRunFailure({ operation, reason: "malformed" });
|
|
98
|
+
|
|
99
|
+
return yield* Schema.decodeEffect(BrowserRunLiveViewResult)({
|
|
100
|
+
devtoolsFrontendUrl: Redacted.make(reply.devtoolsFrontendUrl),
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
Effect.mapError((cause) => browserFailure(operation, cause)),
|
|
104
|
+
Effect.withTracerEnabled(false),
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
return { mint };
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserSession-BplIoNfi.mjs","names":[],"sources":["../src/internal/browser-credentials.ts","../src/BrowserSession.ts"],"sourcesContent":["import { Cause, Context, Effect, Redacted, Schema } from \"effect\";\nimport type { Frame, Page } from \"puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js\";\n\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n type CredentialDispatch,\n type CredentialFieldRole,\n CredentialFillError,\n CredentialFillResult,\n CredentialOrigin,\n CredentialTarget,\n FillCredentialRequest,\n LoginCredential,\n type CredentialAccessRequest,\n} from \"../BrowserCredentials.ts\";\n\n/** Supplied only under the attachment lock, with the remaining command/session budget. */\nexport class BrowserSessionPage extends Context.Service<\n BrowserSessionPage,\n {\n readonly page: Page;\n readonly commandTimeoutMillis: number;\n }\n>()(\"@effect-agent/platform-cloudflare/internal/BrowserSessionPage\") {}\n\nconst TargetReply = Schema.Union([\n Schema.Struct({ action: Schema.String.check(Schema.isMaxLength(2048)) }),\n Schema.Struct({ reason: Schema.Literals([\"stale-target\", \"unsupported\"]) }),\n]);\n\nconst WriteReply = Schema.Literals([\n \"filled\",\n \"stale-target\",\n \"unsupported-before-write\",\n \"unsupported\",\n]);\n\n// One invocation-local isolated-world handle. Actual nodes and fingerprints never leave the page.\n// This program neither discovers controls nor classifies roles nor observes page content.\nconst prepareFields = `(() => {\n const doc = document;\n let fields = [];\n let form;\n let snapshots = [];\n const describe = el => {\n if (!el || !el.isConnected || el.ownerDocument !== doc || doc !== document) return null;\n const native = el instanceof HTMLTextAreaElement ||\n (el instanceof HTMLSelectElement && !el.multiple) ||\n (el instanceof HTMLInputElement && ['text','email','password','tel','number','month','search','url','date','time','week','datetime-local'].includes(el.type));\n if (!native || el.matches(':disabled') || el.readOnly || !el.form) return null;\n const values = [el.form.action, el.form.method, el.form.enctype, el.name, el.type, el.autocomplete ?? ''];\n if (values.some(value => value.length > 2048)) return null;\n return JSON.stringify(values);\n };\n const validate = () => fields.length > 0 && fields.every((el, index) =>\n el.form === form && describe(el) !== null && describe(el) === snapshots[index]);\n return {\n prepare(selectors) {\n try {\n fields = selectors.map(selector => {\n const matches = doc.querySelectorAll(selector);\n return matches.length === 1 ? matches[0] : null;\n });\n } catch { return {reason: 'stale-target'}; }\n if (fields.some(el => !el) || new Set(fields).size !== fields.length) return {reason: 'stale-target'};\n snapshots = fields.map(describe);\n form = fields[0].form;\n if (!form || snapshots.some(value => value === null) || fields.some(el => el.form !== form)) return {reason: 'unsupported'};\n return {action: form.action};\n },\n target() { return validate() ? {action: form.action} : {reason: 'stale-target'}; },\n fill(index, value) {\n if (!validate()) return 'stale-target';\n const el = fields[index];\n if (el instanceof HTMLSelectElement) {\n const options = [...el.options].filter(option => option.value === value);\n if (options.length !== 1 || options[0].matches(':disabled')) return 'unsupported-before-write';\n }\n let prototype = Object.getPrototypeOf(el);\n let setter;\n while (prototype && !setter) { setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set; prototype = Object.getPrototypeOf(prototype); }\n if (!setter) return 'unsupported-before-write';\n setter.call(el, value);\n if (el.value !== value) return 'unsupported';\n el.dispatchEvent(new Event('input', {bubbles: true}));\n el.dispatchEvent(new Event('change', {bubbles: true}));\n return 'filled';\n }\n };\n})()`;\n\nconst secretFor = (material: BrowserCredentialMaterial, role: typeof CredentialFieldRole.Type) => {\n if (material._tag === \"LoginCredential\")\n return role === \"username\"\n ? material.username\n : role === \"password\"\n ? material.password\n : undefined;\n switch (role) {\n case \"card-name\":\n return material.name;\n case \"card-number\":\n return material.number;\n case \"card-expiry\":\n return material.expiry;\n case \"card-expiry-month\":\n return material.expiryMonth;\n case \"card-expiry-year\":\n return material.expiryYear;\n case \"card-security-code\":\n return material.securityCode;\n case \"username\":\n case \"password\":\n return undefined;\n }\n};\n\n/**\n * Fill explicit native fields on an existing page without submitting. The owning browser session\n * serializes operations and closes on timeout, interruption or uncertain dispatch; this function releases\n * only its local handles. Ordinary native observations remain available, including credential echoes.\n */\nexport const fillCredential = Effect.fnUntraced(function* (\n input: FillCredentialRequest,\n): Effect.fn.Return<\n CredentialFillResult,\n CredentialFillError,\n BrowserCredentialAccess | BrowserSessionPage\n> {\n const { page, commandTimeoutMillis } = yield* BrowserSessionPage;\n let dispatch: typeof CredentialDispatch.Type = \"not-dispatched\";\n let filled = 0;\n\n const fail = (reason: CredentialFillError[\"reason\"]) =>\n new CredentialFillError({ reason, dispatch, filled, cleanup: \"not-requested\" });\n\n const remote = <A>(run: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await run(signal) };\n } catch {\n return { ok: false as const };\n }\n },\n catch: () => fail(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(fail(\"provider\")),\n ),\n );\n\n const release = (handles: ReadonlyArray<{ dispose(): Promise<void> }>) =>\n Effect.promise(async () => {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => {})));\n }).pipe(Effect.interruptible, Effect.timeoutOption(\"1 second\"), Effect.asVoid);\n\n const acquire = <A extends { dispose(): Promise<void> }>(run: () => Promise<ReadonlyArray<A>>) =>\n Effect.acquireRelease(\n remote(async (signal) => {\n const handles = await run();\n\n if (signal.aborted) {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => {})));\n throw fail(\"provider\");\n }\n\n return handles;\n }).pipe(Effect.interruptible),\n release,\n );\n\n const origin = (value: string) =>\n Effect.try({\n try: () => {\n const url = new URL(value);\n\n if (url.username || url.password) throw fail(\"denied\");\n\n return url.origin;\n },\n catch: () => fail(\"denied\"),\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(CredentialOrigin)),\n Effect.mapError(() => fail(\"denied\")),\n );\n\n return yield* Effect.gen(function* () {\n const request = yield* Schema.decodeEffect(FillCredentialRequest, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => fail(\"denied\")));\n\n const roles = request.fields.map((field) => field.role);\n\n if (\n new Set(roles).size !== roles.length ||\n roles.some(\n (role) => (request.kind === \"login\") !== (role === \"username\" || role === \"password\"),\n )\n )\n return yield* fail(\"denied\");\n const access = yield* BrowserCredentialAccess;\n let frame: Frame = page.mainFrame();\n\n for (const selector of request.frame ?? []) {\n const matches = yield* acquire(() => frame.$$(selector));\n const element = matches[0];\n\n if (matches.length !== 1 || element === undefined) return yield* fail(\"stale-target\");\n const child = yield* remote(() => element.contentFrame());\n\n if (child === null) return yield* fail(\"unsupported\");\n frame = child;\n }\n\n const handles = yield* acquire(async () => [\n await frame.isolatedRealm().evaluateHandle(prepareFields),\n ]);\n\n const held = handles[0];\n\n if (held === undefined) return yield* fail(\"provider\");\n\n const inspect = (raw: unknown) =>\n Schema.decodeUnknownEffect(TargetReply)(raw).pipe(\n Effect.mapError(() => fail(\"provider\")),\n Effect.flatMap((reply) =>\n \"reason\" in reply ? Effect.fail(fail(reply.reason)) : Effect.succeed(reply.action),\n ),\n );\n\n const action = yield* remote(() =>\n held.evaluate(\n (state, selectors) => {\n if (typeof state !== \"object\" || state === null) return null;\n\n return Reflect.apply(Reflect.get(state, \"prepare\"), state, [selectors]);\n },\n request.fields.map((field) => field.selector),\n ),\n ).pipe(Effect.flatMap(inspect));\n\n const target = CredentialTarget.make({\n topOrigin: yield* origin(page.url()),\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: yield* origin(action),\n });\n\n const authorization: CredentialAccessRequest = {\n credential: request.credential,\n kind: request.kind,\n target,\n roles,\n };\n\n const authorize = Effect.suspend(() => access.authorize(authorization)).pipe(\n Effect.mapError((error) => fail(error.reason)),\n );\n\n const validate = Effect.gen(function* () {\n if (\n frame.detached ||\n (yield* origin(page.url())) !== target.topOrigin ||\n (yield* origin(frame.url())) !== target.frameOrigin\n )\n return yield* fail(\"stale-target\");\n\n const current = yield* remote(() =>\n held.evaluate((state) => {\n if (typeof state !== \"object\" || state === null) return null;\n\n return Reflect.apply(Reflect.get(state, \"target\"), state, []);\n }),\n ).pipe(Effect.flatMap(inspect));\n\n if ((yield* origin(current)) !== target.recipientOrigin) return yield* fail(\"stale-target\");\n });\n\n yield* authorize;\n yield* validate;\n\n const raw = yield* access\n .resolve(authorization)\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n const material = yield* Schema.decodeEffect(\n request.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const role of roles)\n if (secretFor(material, role) === undefined) return yield* fail(\"missing-credential\");\n for (const [index, role] of roles.entries()) {\n yield* authorize;\n yield* validate;\n const value = secretFor(material, role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n const previous = dispatch;\n\n const result = yield* remote((signal) => {\n if (signal.aborted) return Promise.reject(fail(\"provider\"));\n dispatch = \"possibly-dispatched\";\n\n return held.evaluate(\n (state, field, secret) => {\n if (typeof state !== \"object\" || state === null) return \"stale-target\";\n\n return Reflect.apply(Reflect.get(state, \"fill\"), state, [field, secret]);\n },\n index,\n Redacted.value(value),\n );\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(WriteReply)),\n Effect.mapError(() => fail(\"provider\")),\n );\n\n if (result === \"stale-target\" || result === \"unsupported-before-write\") {\n dispatch = previous;\n\n return yield* fail(result === \"stale-target\" ? \"stale-target\" : \"unsupported\");\n }\n if (result === \"unsupported\") return yield* fail(\"unsupported\");\n dispatch = \"dispatched\";\n filled++;\n }\n\n return CredentialFillResult.make({ dispatch: \"dispatched\", filled });\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) => {\n if (Cause.hasInterrupts(cause)) return Effect.interrupt;\n if (\n cause.reasons.some(\n (reason) =>\n reason._tag === \"Die\" ||\n (reason._tag === \"Fail\" && !Schema.is(CredentialFillError)(reason.error)),\n )\n )\n return Effect.fail(fail(\"provider\"));\n\n const expected = cause.reasons.find(\n (reason) => reason._tag === \"Fail\" && Schema.is(CredentialFillError)(reason.error),\n );\n\n return Effect.fail(\n fail(\n expected?._tag === \"Fail\" && Schema.is(CredentialFillError)(expected.error)\n ? expected.error.reason\n : \"provider\",\n ),\n );\n }),\n Effect.withTracerEnabled(false),\n );\n});\n","/// <reference types=\"@cloudflare/workers-types\" />\n\nimport {\n Cause,\n Clock,\n Context,\n Effect,\n Exit,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n Scope,\n} from \"effect\";\nimport type { Page } from \"puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js\";\n\nimport {\n CredentialFillError,\n type BrowserCredentialAccess,\n type CredentialFillResult,\n type FillCredentialRequest,\n} from \"./BrowserCredentials.ts\";\nimport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffResult,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n} from \"./InteractiveBrowser.ts\";\nimport { BrowserRunBinding, type BrowserRunAttachment } from \"./internal/browser-binding.ts\";\nimport { BrowserSessionPage, fillCredential } from \"./internal/browser-credentials.ts\";\nimport { reportBrowserCause, reportedBrowserError } from \"./internal/browser-failure.ts\";\nimport {\n BrowserRunSessionLifecycle,\n type BrowserRunLifecycleOptions,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffResult,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n};\n\nconst PositiveMillis = Schema.Int.check(\n Schema.isGreaterThan(0),\n Schema.isLessThanOrEqualTo(Number.MAX_SAFE_INTEGER),\n);\n\nconst SessionId = Schema.Redacted(Schema.String.check(Schema.isUUID()));\nconst ProviderId = Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256)));\n\n/** Private host record, not a model capability. Persist together with the owner's controller state. */\nexport class BrowserSessionReference extends Schema.Class<BrowserSessionReference>(\n \"BrowserSessionReference\",\n)({\n version: Schema.Literal(1),\n sessionId: SessionId,\n contextId: ProviderId,\n targetId: ProviderId,\n expiresAt: PositiveMillis,\n commandTimeoutMillis: PositiveMillis,\n}) {}\n\nexport class BrowserSessionOptions extends Schema.Class<BrowserSessionOptions>(\n \"BrowserSessionOptions\",\n)({\n maxElapsedMillis: PositiveMillis,\n keepAliveMillis: Schema.optionalKey(PositiveMillis.check(Schema.isLessThanOrEqualTo(600_000))),\n commandTimeoutMillis: Schema.optionalKey(PositiveMillis),\n}) {}\n\n/** No SDK text, selectors, page data, or credential values are retained in public failures. */\nexport class BrowserSessionError extends Schema.TaggedError<BrowserSessionError>()(\n \"BrowserSessionError\",\n {\n reason: Schema.Literals([\n \"invalid\",\n \"expired\",\n \"missing-page\",\n \"busy\",\n \"closed\",\n \"provider\",\n \"timeout\",\n \"cleanup\",\n ]),\n dispatch: Schema.Literals([\"not-dispatched\", \"possibly-dispatched\"]),\n cleanup: Schema.Literals([\"not-requested\", \"confirmed\", \"unconfirmed\"]),\n },\n) {}\n\n/**\n * One local attachment to an application-owned browser. Scope release disconnects; it never\n * transfers ownership or closes a healthy remote session. The owner serializes attachments,\n * fences old attempts, authorizes human access, and calls BrowserSessions.close on expiry/stop.\n * Native callbacks are trusted host code: never retain SDK handles or start unawaited work.\n */\nexport interface BrowserSession {\n readonly reference: BrowserSessionReference;\n /**\n * Check current authority under the lock before native dispatch. A settled SDK rejection leaves\n * the session available for inspection, but may have changed the website; never retry blindly.\n * Timeout/interruption fences outstanding SDK work and terminates the exact browser.\n */\n readonly run: <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n action: (page: Page) => Promise<A>,\n ) => Effect.Effect<A, E | BrowserSessionError, R>;\n /**\n * Resolves host-owned material under fresh credential grants. Never submits or retries a write.\n * Credential timeouts retain acknowledged writes and dispatch evidence alongside cleanup.\n */\n readonly fillCredential: (\n request: FillCredentialRequest,\n ) => Effect.Effect<\n CredentialFillResult,\n CredentialFillError | BrowserSessionError,\n BrowserCredentialAccess\n >;\n readonly handoff: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, E | BrowserSessionError, R>;\n readonly getLiveView: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;\n readonly getHandoffState: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n ) => Effect.Effect<BrowserRunHandoffState, E | BrowserSessionError, R>;\n}\n\nconst failure = (\n reason: BrowserSessionError[\"reason\"],\n dispatch: BrowserSessionError[\"dispatch\"] = \"not-dispatched\",\n cleanup: BrowserSessionError[\"cleanup\"] = \"not-requested\",\n) => new BrowserSessionError({ reason, dispatch, cleanup });\n\nconst decode = <A>(schema: Schema.Codec<A>, input: unknown) =>\n Schema.decodeUnknownEffect(schema, { onExcessProperty: \"error\" })(input).pipe(\n Effect.mapError(() => failure(\"invalid\")),\n );\n\n// Catch inside the Promise before workerd can report an unhandled foreign diagnostic.\nconst native = Effect.fnUntraced(function* <A>(\n operation: string,\n action: (signal: AbortSignal) => Promise<A>,\n) {\n const runReport = Effect.runPromiseWith(yield* Effect.context<never>());\n\n return yield* Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await action(signal) };\n } catch (cause) {\n if (!signal.aborted || cause !== signal.reason)\n await runReport(reportBrowserCause(operation, Cause.fail(cause)));\n\n return { ok: false as const };\n }\n },\n catch: () => failure(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok\n ? Effect.succeed(result.value)\n : Effect.fail(reportedBrowserError(failure(\"provider\"))),\n ),\n Effect.withTracerEnabled(false),\n );\n});\n\nconst targetId = (page: Page) =>\n native(\"session.target\", async () => {\n const cdp = await page.createCDPSession();\n\n try {\n return (await cdp.send(\"Target.getTargetInfo\")).targetInfo.targetId;\n } finally {\n await cdp.detach();\n }\n });\n\nexport interface BrowserSessionsOptions extends BrowserRunLifecycleOptions {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}\n\n/** Native Cloudflare sessions; no framework browser workflow, checkpoint transfer, or observation policy. */\nexport class BrowserSessions extends Context.Service<\n BrowserSessions,\n {\n /**\n * Allocate once and commit its private reference in retain. Failed/uncommitted creation closes\n * the allocation. After retain succeeds the application owns remote cleanup, independent of\n * attempt Scopes. A lost allocation reply can remain indeterminate until provider idle expiry.\n */\n readonly create: <E, R>(\n options: BrowserSessionOptions,\n retain: (reference: BrowserSessionReference) => Effect.Effect<void, E, R>,\n ) => Effect.Effect<BrowserSessionReference, E | BrowserSessionError, R>;\n /** Attach only the exact saved context/page. Never recreate missing/expired state. */\n readonly attach: (\n reference: BrowserSessionReference,\n ) => Effect.Effect<BrowserSession, BrowserSessionError, Scope.Scope>;\n /** Refresh provider inactivity only; the owner must still enforce its expiresAt. */\n readonly keepAlive: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserSessionError>;\n readonly close: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserSessionError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserSessions\") {\n static readonly layerNoDeps = Layer.effect(\n this,\n Effect.gen(function* () {\n const binding = yield* BrowserRunBinding;\n const lifecycle = yield* BrowserRunSessionLifecycle;\n\n const close = (sessionId: Redacted.Redacted<string>) =>\n decode(SessionId, sessionId).pipe(\n Effect.flatMap((id) =>\n lifecycle\n .close(id)\n .pipe(Effect.mapError(() => failure(\"cleanup\", \"not-dispatched\", \"unconfirmed\"))),\n ),\n );\n\n const cleanup = (sessionId: Redacted.Redacted<string>) =>\n close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"session.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n );\n\n const connect = Effect.fnUntraced(function* (sessionId: Redacted.Redacted<string>) {\n let attachment: BrowserRunAttachment | undefined;\n\n const retire = Effect.suspend(() =>\n attachment === undefined\n ? Effect.void\n : attachment.retire.pipe(\n // Dispatch is already fenced; give the socket close handshake the same\n // bounded window as keepalive instead of failing a settled command after 1s.\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(failure(\"cleanup\")),\n }),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"session.disconnect\", cause).pipe(\n Effect.andThen(Effect.die(failure(\"cleanup\", \"not-dispatched\", \"unconfirmed\"))),\n ),\n ),\n ),\n );\n\n yield* Effect.addFinalizer(() => retire);\n\n const browser = yield* native(\"session.connect\", (signal) => {\n attachment = binding.connect(Redacted.value(sessionId), \"session.connect\", signal);\n\n return attachment.browser;\n });\n\n return { browser, retire };\n });\n\n const create = <E, R>(\n input: BrowserSessionOptions,\n retain: (reference: BrowserSessionReference) => Effect.Effect<void, E, R>,\n ) =>\n Effect.gen(function* () {\n const options = yield* decode(BrowserSessionOptions, input);\n const expiresAt = (yield* Clock.currentTimeMillis) + options.maxElapsedMillis;\n\n if (!Number.isSafeInteger(expiresAt)) return yield* failure(\"invalid\");\n let sessionId: Redacted.Redacted<string> | undefined;\n let retained = false;\n const runCleanup = Effect.runPromiseWith(yield* Effect.context<never>());\n\n yield* Effect.addFinalizer(() =>\n sessionId === undefined || retained ? Effect.void : cleanup(sessionId),\n );\n sessionId = yield* native(\"session.acquire\", async (signal) => {\n const id = Redacted.make(\n await binding.acquire(options.keepAliveMillis ?? 600_000, \"session.acquire\"),\n );\n\n if (signal.aborted) {\n await runCleanup(cleanup(id));\n signal.throwIfAborted();\n }\n\n return id;\n });\n const { browser } = yield* connect(sessionId);\n\n const page = yield* native(\"session.page\", async () => {\n const context = await browser.createBrowserContext();\n\n return await context.newPage();\n });\n\n const reference = yield* decode(BrowserSessionReference, {\n version: 1,\n sessionId,\n contextId: Redacted.make(page.browserContext().id ?? \"\"),\n targetId: Redacted.make(yield* targetId(page)),\n expiresAt,\n commandTimeoutMillis: options.commandTimeoutMillis ?? 30_000,\n });\n\n yield* Effect.uninterruptibleMask((restore) =>\n restore(retain(reference)).pipe(\n Effect.tap(() =>\n Effect.sync(() => {\n retained = true;\n }),\n ),\n ),\n );\n\n return reference;\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: \"30 seconds\",\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n Effect.withTracerEnabled(false),\n );\n\n const attachPage = Effect.fnUntraced(function* (input: BrowserSessionReference) {\n const reference = yield* decode(BrowserSessionReference, input);\n\n if (reference.expiresAt <= (yield* Clock.currentTimeMillis))\n return yield* failure(\"expired\");\n const scope = yield* Effect.scope;\n const { browser, retire } = yield* connect(reference.sessionId);\n\n const context = browser\n .browserContexts()\n .find((value) => value.id === Redacted.value(reference.contextId));\n\n if (context === undefined) return yield* failure(\"missing-page\");\n let page: Page | undefined;\n\n for (const candidate of yield* native(\"session.pages\", () => context.pages())) {\n if ((yield* targetId(candidate)) === Redacted.value(reference.targetId)) {\n page = candidate;\n break;\n }\n }\n if (page === undefined) return yield* failure(\"missing-page\");\n const currentPage = page;\n const lock = yield* Semaphore.make(1);\n let invalid = false;\n\n const terminate = Effect.suspend(() => {\n invalid = true;\n\n return retire.pipe(\n Effect.catchCause((cause) => reportBrowserCause(\"session.disconnect\", cause)),\n Effect.andThen(cleanup(reference.sessionId)),\n );\n });\n\n const runEffect = <A, E, R>(\n action: (commandTimeoutMillis: number) => Effect.Effect<A, E, R>,\n ) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n if (invalid || scope.state._tag === \"Closed\" || !browser.isConnected())\n return yield* failure(\"closed\");\n const remaining = reference.expiresAt - (yield* Clock.currentTimeMillis);\n\n if (remaining <= 0) {\n return yield* failure(\"expired\", \"not-dispatched\", yield* terminate);\n }\n\n return yield* action(Math.min(remaining, reference.commandTimeoutMillis)).pipe(\n Effect.catchDefect((defect) =>\n reportBrowserCause(\"session.command\", Cause.die(defect)).pipe(\n Effect.andThen(terminate),\n Effect.flatMap((closed) =>\n Effect.fail(failure(\"provider\", \"possibly-dispatched\", closed)),\n ),\n ),\n ),\n Effect.onInterrupt(() => terminate),\n );\n }),\n )\n .pipe(\n Effect.flatMap(Effect.fromOption(() => failure(\"busy\"))),\n Effect.withTracerEnabled(false),\n );\n\n const run = <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n action: (page: Page) => Promise<A>,\n terminateOnError = false,\n ) =>\n runEffect((commandTimeoutMillis) =>\n authorize.pipe(\n Effect.andThen(() =>\n native(\"session.command\", () => action(currentPage)).pipe(\n Effect.catch((error) =>\n Effect.gen(function* () {\n const closed = terminateOnError ? yield* terminate : \"not-requested\";\n\n return yield* reportedBrowserError(\n failure(error.reason, \"possibly-dispatched\", closed),\n );\n }),\n ),\n ),\n ),\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () =>\n terminate.pipe(\n Effect.flatMap((closed) =>\n Effect.fail(failure(\"timeout\", \"possibly-dispatched\", closed)),\n ),\n ),\n }),\n ),\n );\n\n const command = <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n method: string,\n parameters: Record<string, string | number>,\n schema: Schema.Codec<A>,\n ) =>\n run(\n authorize,\n async (page) => {\n const cdp = await page.createCDPSession();\n\n try {\n const result: unknown = await Reflect.apply(cdp.send, cdp, [method, parameters]);\n\n return Schema.decodeUnknownSync(schema)(result);\n } finally {\n await cdp.detach();\n }\n },\n method === \"Cloudflare.handoff\",\n );\n\n const session: BrowserSession = {\n reference,\n run,\n fillCredential: (request) =>\n runEffect((commandTimeoutMillis) =>\n fillCredential(request).pipe(\n Effect.provideService(BrowserSessionPage, {\n page: currentPage,\n commandTimeoutMillis,\n }),\n Effect.catchIf(\n (error) => error.reason === \"timeout\" || error.dispatch === \"possibly-dispatched\",\n (error) =>\n terminate.pipe(\n Effect.flatMap((cleanup) =>\n Effect.fail(CredentialFillError.make({ ...error, cleanup })),\n ),\n ),\n ),\n ),\n ),\n handoff: (authorize, request) =>\n decode(BrowserRunHandoffRequest, request).pipe(\n Effect.flatMap((value) =>\n command(\n authorize,\n \"Cloudflare.handoff\",\n { instructions: value.instructions, timeout: value.timeout },\n Schema.Struct({\n handoffId: Schema.NonEmptyString.check(Schema.isMaxLength(1024)),\n }),\n ),\n ),\n Effect.map((value) =>\n BrowserRunHandoffResult.make({ handoffId: Redacted.make(value.handoffId) }),\n ),\n ),\n getLiveView: (authorize, request) =>\n decode(BrowserRunLiveViewRequest, request).pipe(\n Effect.flatMap((value) =>\n command(\n authorize,\n \"Cloudflare.getLiveView\",\n { mode: value.mode, expiresInMs: value.expiresInMs },\n Schema.Struct({ devtoolsFrontendUrl: Schema.String }),\n ),\n ),\n Effect.flatMap((value) =>\n decode(BrowserRunLiveViewResult, {\n devtoolsFrontendUrl: Redacted.make(value.devtoolsFrontendUrl),\n }),\n ),\n ),\n getHandoffState: (authorize) =>\n command(\n authorize,\n \"Cloudflare.getHandoffState\",\n {},\n Schema.Struct({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(\n Schema.NonEmptyString.check(Schema.isMaxLength(1024)),\n ),\n durationMs: Schema.optionalKey(Schema.Natural),\n }),\n ).pipe(\n Effect.map((value) =>\n BrowserRunHandoffState.make({\n active: value.active,\n ...(value.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(value.handoffId) }),\n ...(value.durationMs === undefined ? {} : { durationMs: value.durationMs }),\n }),\n ),\n ),\n };\n\n return session;\n });\n\n const attach = Effect.fnUntraced(function* (input: BrowserSessionReference) {\n const reference = yield* decode(BrowserSessionReference, input);\n const scope = yield* Scope.fork(yield* Effect.scope);\n\n return yield* attachPage(reference).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.timeoutOrElse({\n duration: reference.commandTimeoutMillis,\n orElse: () =>\n reportBrowserCause(\"session.connect\", Cause.fail(failure(\"timeout\"))).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"timeout\")))),\n ),\n }),\n Effect.onExit((exit) => (Exit.isFailure(exit) ? Scope.close(scope, exit) : Effect.void)),\n );\n });\n\n return BrowserSessions.of({\n create,\n attach,\n close,\n keepAlive: (sessionId) =>\n decode(SessionId, sessionId).pipe(\n Effect.flatMap((id) =>\n binding.keepAlive(Redacted.value(id)).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"session.keepAlive\", Cause.fail(error)).pipe(\n Effect.andThen(\n Effect.fail(\n reportedBrowserError(\n failure(error.reason === \"timeout\" ? \"timeout\" : \"provider\"),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n Effect.withTracerEnabled(false),\n ),\n });\n }),\n );\n\n static layer(options: BrowserSessionsOptions) {\n return this.layerNoDeps.pipe(\n Layer.provide(BrowserRunBinding.layer(options.browser)),\n Layer.provide(BrowserRunSessionLifecycle.layer(options)),\n );\n }\n}\n"],"mappings":"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"}
|