@effect-agent/platform-cloudflare 0.1.0-beta.84 → 0.1.0-beta.86
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/Alarm.d.mts +4 -4
- package/dist/Alarm.mjs +6 -6
- package/dist/Alarm.mjs.map +1 -1
- package/dist/BrowserRestCapture.d.mts +3 -3
- package/dist/BrowserRestCapture.mjs +3 -3
- package/dist/BrowserRestCapture.mjs.map +1 -1
- package/dist/BrowserRestCrawl.d.mts +2 -2
- package/dist/BrowserRestCrawl.mjs +3 -3
- package/dist/BrowserRestCrawl.mjs.map +1 -1
- package/dist/CloudflareBindings.d.mts +2 -2
- package/dist/CloudflareBindings.mjs +2 -2
- package/dist/CloudflareBindings.mjs.map +1 -1
- package/dist/{CloudflareBrowser-D4YqaTAl.mjs → CloudflareBrowser-DV6kya1H.mjs} +4 -4
- package/dist/CloudflareBrowser-DV6kya1H.mjs.map +1 -0
- package/dist/{CloudflareBrowser-DJq53niJ.d.mts → CloudflareBrowser-Doe1M7R5.d.mts} +4 -4
- package/dist/CloudflareBrowser.d.mts +1 -1
- package/dist/CloudflareBrowser.mjs +1 -1
- package/dist/CloudflareCodeMode.d.mts +2 -2
- package/dist/CloudflareCodeMode.mjs +2 -2
- package/dist/CloudflareCodeMode.mjs.map +1 -1
- package/dist/CloudflareConfig.mjs +3 -3
- package/dist/CloudflareConfig.mjs.map +1 -1
- package/dist/CloudflareMemory.d.mts +26 -26
- package/dist/CloudflareMemory.mjs +16 -16
- package/dist/CloudflareMemory.mjs.map +1 -1
- package/dist/CloudflareScheduling.d.mts +3 -3
- package/dist/CloudflareScheduling.mjs +11 -11
- package/dist/CloudflareScheduling.mjs.map +1 -1
- package/dist/CloudflareSubscriptions.d.mts +5 -5
- package/dist/CloudflareSubscriptions.mjs +20 -14
- package/dist/CloudflareSubscriptions.mjs.map +1 -1
- package/dist/CloudflareThreadClient.d.mts +228 -18
- package/dist/CloudflareThreadClient.mjs +12 -12
- package/dist/CloudflareThreadClient.mjs.map +1 -1
- package/dist/InteractiveBrowser.d.mts +2 -2
- package/dist/InteractiveBrowser.mjs +18 -18
- package/dist/InteractiveBrowser.mjs.map +1 -1
- package/dist/ProtectedBrowser.d.mts +2 -2
- package/dist/ProtectedBrowser.mjs +14 -14
- package/dist/ProtectedBrowser.mjs.map +1 -1
- package/dist/{ThreadObject-mmWMMWdY.mjs → ThreadObject-B4gJ7t0d.mjs} +29 -27
- package/dist/ThreadObject-B4gJ7t0d.mjs.map +1 -0
- package/dist/{ThreadObject-BS1gRV0V.d.mts → ThreadObject-BT0c-_vx.d.mts} +61 -65
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/ThreadObject.mjs +1 -1
- package/dist/WakeScheduler.d.mts +1 -1
- package/dist/WakeScheduler.mjs +2 -2
- package/dist/WakeScheduler.mjs.map +1 -1
- package/dist/{browser-session-lifecycle-CUbVfEgP.mjs → browser-session-lifecycle-CmbQABHC.mjs} +5 -5
- package/dist/browser-session-lifecycle-CmbQABHC.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{prepared-admission-DSi55W-7.mjs → prepared-admission-DU0_T-ev.mjs} +7 -7
- package/dist/prepared-admission-DU0_T-ev.mjs.map +1 -0
- package/package.json +1 -1
- package/src/Alarm.ts +19 -19
- package/src/BrowserRestCapture.ts +3 -3
- package/src/BrowserRestCrawl.ts +13 -13
- package/src/CloudflareBindings.ts +2 -2
- package/src/CloudflareCodeMode.ts +4 -4
- package/src/CloudflareConfig.ts +3 -3
- package/src/CloudflareMemory.ts +29 -29
- package/src/CloudflareScheduling.ts +13 -13
- package/src/CloudflareSubscriptions.ts +28 -32
- package/src/CloudflareThreadClient.ts +14 -14
- package/src/InteractiveBrowser.ts +34 -37
- package/src/ThreadObject.ts +14 -14
- package/src/WakeScheduler.ts +2 -2
- package/src/internal/browser-quick-action.ts +4 -4
- package/src/internal/browser-session-lifecycle.ts +8 -8
- package/src/internal/layers.ts +47 -47
- package/src/internal/message-delivery.ts +9 -10
- package/src/internal/prepared-admission.ts +7 -7
- package/src/internal/transport.ts +1 -1
- package/src/protected-browser/binding.ts +3 -3
- package/src/protected-browser/native.ts +3 -3
- package/src/protected-browser/policy.ts +42 -44
- package/dist/CloudflareBrowser-D4YqaTAl.mjs.map +0 -1
- package/dist/ThreadObject-mmWMMWdY.mjs.map +0 -1
- package/dist/browser-session-lifecycle-CUbVfEgP.mjs.map +0 -1
- package/dist/prepared-admission-DSi55W-7.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as BrowserRunSessionLifecycle, t as BrowserRunCleanupError } from "./browser-session-lifecycle-
|
|
2
|
-
import { Clock, Context, Duration, Effect, Layer,
|
|
3
|
-
import { PageScreenshotResult } from "
|
|
4
|
-
import { SandboxImplementation } from "
|
|
1
|
+
import { n as BrowserRunSessionLifecycle, t as BrowserRunCleanupError } from "./browser-session-lifecycle-CmbQABHC.mjs";
|
|
2
|
+
import { Clock, Context, Duration, Effect, Layer, Redacted, Ref, Schema, Semaphore } from "effect";
|
|
3
|
+
import { PageScreenshotResult } from "effect-agent/page-screenshot";
|
|
4
|
+
import { SandboxImplementation } from "effect-agent/sandbox";
|
|
5
5
|
import puppeteer from "@cloudflare/puppeteer";
|
|
6
|
-
import { BrowserActionResult, BrowserNavigationResult, BrowserScreenshotRequest, BrowserScrollRequest, BrowserTextResult, InteractiveBrowser, InteractiveBrowserActionError, InteractiveBrowserBusyError, InteractiveBrowserCapacityError, InteractiveBrowserExpiredError, InteractiveBrowserLimitError, InteractiveBrowserPolicy, InteractiveBrowserPolicyDeniedError, InteractiveBrowserProtocolError, InteractiveBrowserTargetUrl, InteractiveBrowserUnsupportedError } from "
|
|
6
|
+
import { BrowserActionResult, BrowserNavigationResult, BrowserScreenshotRequest, BrowserScrollRequest, BrowserTextResult, InteractiveBrowser, InteractiveBrowserActionError, InteractiveBrowserBusyError, InteractiveBrowserCapacityError, InteractiveBrowserExpiredError, InteractiveBrowserLimitError, InteractiveBrowserPolicy, InteractiveBrowserPolicyDeniedError, InteractiveBrowserProtocolError, InteractiveBrowserTargetUrl, InteractiveBrowserUnsupportedError } from "effect-agent/interactive-browser";
|
|
7
7
|
//#region src/InteractiveBrowser.ts
|
|
8
8
|
const browserRunInteractiveImplementation = SandboxImplementation.make({
|
|
9
9
|
isolation: "isolated",
|
|
@@ -122,7 +122,7 @@ var BrowserRunViewport = class extends Schema.Class("BrowserRunViewport")(Schema
|
|
|
122
122
|
maximum: 2
|
|
123
123
|
})))
|
|
124
124
|
}).check(Schema.makeFilter((viewport) => Math.max(viewport.width, viewport.height) * (viewport.deviceScaleFactor ?? 1) <= 2048, { title: "a viewport with scaled dimensions no larger than 2048 pixels" }))) {};
|
|
125
|
-
const decodeViewport = (input) => Schema.
|
|
125
|
+
const decodeViewport = (input) => Schema.decodeEffect(BrowserRunViewport)(input, { onExcessProperty: "error" }).pipe(Effect.mapError(() => policyError("The browser viewport is malformed")), Effect.map((viewport) => ({
|
|
126
126
|
width: viewport.width,
|
|
127
127
|
height: viewport.height,
|
|
128
128
|
deviceScaleFactor: viewport.deviceScaleFactor ?? 1
|
|
@@ -511,7 +511,7 @@ const makeProductionPage = (page) => {
|
|
|
511
511
|
text
|
|
512
512
|
};
|
|
513
513
|
}, selector, maximumBytes, MAX_OBSERVED_CONTROLS));
|
|
514
|
-
if (observation._tag === "Text") Schema.
|
|
514
|
+
if (observation._tag === "Text") Schema.decodeSync(PageObservation)(observation.text);
|
|
515
515
|
return observation;
|
|
516
516
|
},
|
|
517
517
|
fill: (selector, value, signal, onDispatch) => runObservedPageAction(page, selector, signal, onDispatch, (element) => element.evaluate((element, nextValue) => {
|
|
@@ -601,7 +601,7 @@ const causeText = (cause) => {
|
|
|
601
601
|
const isCapacityRefusal = (cause) => /(^|\D)429(\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));
|
|
602
602
|
const isRemoteClosure = (cause) => /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(causeText(cause));
|
|
603
603
|
const snapshotPolicy = Effect.fn("BrowserRunInteractive.snapshotPolicy")(function* (input) {
|
|
604
|
-
const decoded = yield* Schema.
|
|
604
|
+
const decoded = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(Effect.mapError(() => policyError("The interactive browser policy is malformed")));
|
|
605
605
|
if (decoded.network._tag === "PublicWeb") return yield* InteractiveBrowserUnsupportedError.make({
|
|
606
606
|
implementation: browserRunInteractiveImplementation,
|
|
607
607
|
feature: "policy",
|
|
@@ -819,7 +819,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (page
|
|
|
819
819
|
if (Schema.is(InteractiveBrowserActionError)(error) && !isBrowserRunUndispatchedActionError(error)) state.uncertain.value = true;
|
|
820
820
|
return Effect.fail(failure ?? error);
|
|
821
821
|
}));
|
|
822
|
-
})).pipe(Effect.flatMap(
|
|
822
|
+
})).pipe(Effect.flatMap(Effect.fromOption(() => InteractiveBrowserBusyError.make({
|
|
823
823
|
implementation: browserRunInteractiveImplementation,
|
|
824
824
|
message: "The browser handle already has an operation in flight"
|
|
825
825
|
}))));
|
|
@@ -848,7 +848,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (page
|
|
|
848
848
|
observed,
|
|
849
849
|
message: "The browser returned-text limit was reached"
|
|
850
850
|
});
|
|
851
|
-
return yield* Schema.
|
|
851
|
+
return yield* Schema.decodeEffect(BrowserTextResult)({ text: observation.text }).pipe(Effect.mapError((cause) => protocolError("The browser returned malformed page text", cause)));
|
|
852
852
|
})),
|
|
853
853
|
fill: (request) => run(Effect.gen(function* () {
|
|
854
854
|
const observation = yield* observedAction("fill", (signal, onDispatch) => page.fill(request.selector, request.value, signal, onDispatch)).pipe(Effect.flatMap(decodeActionObservation));
|
|
@@ -860,7 +860,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (page
|
|
|
860
860
|
yield* logActionObservation("click", observation);
|
|
861
861
|
return yield* decodeActionResult(page, policy);
|
|
862
862
|
})),
|
|
863
|
-
screenshot: (request) => Schema.
|
|
863
|
+
screenshot: (request) => Schema.decodeEffect(BrowserScreenshotRequest)(request).pipe(Effect.mapError(() => policyError("The browser screenshot request is malformed")), Effect.flatMap((decoded) => run(Effect.gen(function* () {
|
|
864
864
|
const raw = yield* remote("screenshot", () => page.screenshot(decoded.fullPage));
|
|
865
865
|
const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(Effect.mapError(() => protocolError("The browser returned a malformed PNG screenshot")));
|
|
866
866
|
if (bytes.length > policy.maxReturnedBytes) return yield* InteractiveBrowserLimitError.make({
|
|
@@ -870,13 +870,13 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (page
|
|
|
870
870
|
observed: bytes.length,
|
|
871
871
|
message: "The browser screenshot byte limit was reached"
|
|
872
872
|
});
|
|
873
|
-
return yield* Schema.
|
|
873
|
+
return yield* Schema.decodeEffect(PageScreenshotResult)({
|
|
874
874
|
implementation: browserRunInteractiveImplementation,
|
|
875
875
|
mediaType: "image/png",
|
|
876
876
|
bytes: new Uint8Array(bytes)
|
|
877
877
|
}).pipe(Effect.mapError(() => protocolError("The browser returned a malformed PNG screenshot")));
|
|
878
878
|
}), decodeActionResult(page, policy).pipe(Effect.asVoid)))),
|
|
879
|
-
scroll: (request) => Schema.
|
|
879
|
+
scroll: (request) => Schema.decodeEffect(BrowserScrollRequest)(request).pipe(Effect.mapError(() => policyError("The browser scroll request is malformed")), Effect.flatMap((decoded) => run(remote("scroll", () => page.scroll(decoded.deltaX, decoded.deltaY)).pipe(Effect.andThen(decodeActionResult(page, policy))), decodeActionResult(page, policy).pipe(Effect.asVoid)))),
|
|
880
880
|
close
|
|
881
881
|
},
|
|
882
882
|
run
|
|
@@ -1040,15 +1040,15 @@ const makeHostService = (binding) => {
|
|
|
1040
1040
|
return protocolError("Resizing the browser viewport failed", cause);
|
|
1041
1041
|
}
|
|
1042
1042
|
}), currentPagePreflight, false))),
|
|
1043
|
-
getLiveView: (request) => Schema.
|
|
1043
|
+
getLiveView: (request) => Schema.decodeEffect(BrowserRunLiveViewRequest)(request).pipe(Effect.mapError(() => policyError("The Live View request is malformed")), Effect.flatMap((decoded) => runtime.run(cdpCommand(page, state, "Cloudflare.getLiveView", {
|
|
1044
1044
|
mode: decoded.mode,
|
|
1045
1045
|
expiresInMs: decoded.expiresInMs
|
|
1046
|
-
}, LiveViewObservation, "Cloudflare returned a malformed Live View response").pipe(Effect.flatMap((observation) => Schema.
|
|
1047
|
-
handoff: (request) => Schema.
|
|
1046
|
+
}, LiveViewObservation, "Cloudflare returned a malformed Live View response").pipe(Effect.flatMap((observation) => Schema.decodeEffect(BrowserRunLiveViewResult)({ devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl) }).pipe(Effect.mapError(() => protocolError("Cloudflare returned a malformed Live View response"))))), currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.expiresInMs)))))),
|
|
1047
|
+
handoff: (request) => Schema.decodeEffect(BrowserRunHandoffRequest)(request).pipe(Effect.mapError(() => policyError("The browser handoff request is malformed")), Effect.flatMap((decoded) => runtime.run(cdpCommand(page, state, "Cloudflare.handoff", {
|
|
1048
1048
|
instructions: decoded.instructions,
|
|
1049
1049
|
timeout: decoded.timeout
|
|
1050
|
-
}, HandoffObservation, "Cloudflare returned a malformed browser handoff response").pipe(Effect.flatMap((observation) => Schema.
|
|
1051
|
-
getHandoffState: runtime.run(cdpCommand(page, state, "Cloudflare.getHandoffState", {}, HandoffStateObservation, "Cloudflare returned a malformed browser handoff state").pipe(Effect.flatMap((observation) => Schema.
|
|
1050
|
+
}, HandoffObservation, "Cloudflare returned a malformed browser handoff response").pipe(Effect.flatMap((observation) => Schema.decodeEffect(BrowserRunHandoffResult)({ handoffId: Redacted.make(observation.handoffId) }).pipe(Effect.mapError(() => protocolError("Cloudflare returned a malformed browser handoff response"))))), currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.timeout)))))),
|
|
1051
|
+
getHandoffState: runtime.run(cdpCommand(page, state, "Cloudflare.getHandoffState", {}, HandoffStateObservation, "Cloudflare returned a malformed browser handoff state").pipe(Effect.flatMap((observation) => Schema.decodeEffect(BrowserRunHandoffState)({
|
|
1052
1052
|
active: observation.active,
|
|
1053
1053
|
...observation.handoffId === void 0 ? {} : { handoffId: Redacted.make(observation.handoffId) },
|
|
1054
1054
|
...observation.durationMs === void 0 ? {} : { durationMs: observation.durationMs }
|