@effect-agent/platform-cloudflare 0.1.0-beta.84 → 0.1.0-beta.85
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.mjs +1 -1
- package/dist/Alarm.mjs.map +1 -1
- package/dist/BrowserRestCrawl.mjs +1 -1
- package/dist/BrowserRestCrawl.mjs.map +1 -1
- package/dist/CloudflareMemory.mjs +5 -5
- package/dist/CloudflareMemory.mjs.map +1 -1
- package/dist/CloudflareScheduling.mjs +2 -2
- package/dist/CloudflareScheduling.mjs.map +1 -1
- package/dist/CloudflareSubscriptions.mjs +12 -6
- package/dist/CloudflareSubscriptions.mjs.map +1 -1
- package/dist/CloudflareThreadClient.d.mts +216 -6
- package/dist/CloudflareThreadClient.mjs +2 -2
- package/dist/CloudflareThreadClient.mjs.map +1 -1
- package/dist/InteractiveBrowser.mjs +15 -15
- package/dist/InteractiveBrowser.mjs.map +1 -1
- package/dist/ProtectedBrowser.mjs +12 -12
- package/dist/ProtectedBrowser.mjs.map +1 -1
- package/dist/{ThreadObject-BS1gRV0V.d.mts → ThreadObject-DZMkwIBh.d.mts} +8 -12
- package/dist/{ThreadObject-mmWMMWdY.mjs → ThreadObject-gyx8Qq03.mjs} +5 -3
- package/dist/ThreadObject-gyx8Qq03.mjs.map +1 -0
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/ThreadObject.mjs +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 +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/src/Alarm.ts +6 -6
- package/src/BrowserRestCrawl.ts +1 -1
- package/src/CloudflareMemory.ts +7 -7
- package/src/CloudflareScheduling.ts +2 -2
- package/src/CloudflareSubscriptions.ts +18 -18
- package/src/CloudflareThreadClient.ts +2 -2
- package/src/InteractiveBrowser.ts +19 -22
- package/src/internal/browser-session-lifecycle.ts +8 -8
- package/src/internal/message-delivery.ts +5 -6
- package/src/protected-browser/binding.ts +1 -1
- package/src/protected-browser/policy.ts +29 -31
- package/dist/ThreadObject-mmWMMWdY.mjs.map +0 -1
- package/dist/browser-session-lifecycle-CUbVfEgP.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as BrowserRunSessionLifecycle } from "./browser-session-lifecycle-
|
|
2
|
-
import { Clock, Context, Crypto, Effect, Layer,
|
|
1
|
+
import { n as BrowserRunSessionLifecycle } from "./browser-session-lifecycle-CmbQABHC.mjs";
|
|
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/sandbox/InteractiveBrowser";
|
|
5
5
|
import { BrowserCredentialAccess, CardCredential, CredentialObservationDecision, CredentialOffer, CredentialOfferMetadata, CredentialOrigin, CredentialTarget, CredentialUseResult, ListCredentialOffers, LoginCredential, ProtectedBrowser, ProtectedBrowserClick, ProtectedBrowserControl, ProtectedBrowserError, ProtectedBrowserFill, ProtectedBrowserNavigate, ProtectedBrowserObservation, UseCredential } from "@effect-agent/sandbox/ProtectedBrowser";
|
|
@@ -56,7 +56,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
56
56
|
observation: "closed",
|
|
57
57
|
cleanup: "not-requested"
|
|
58
58
|
});
|
|
59
|
-
const decodedPolicy = yield* Schema.
|
|
59
|
+
const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(Effect.mapError(() => initialError("denied")));
|
|
60
60
|
if (decodedPolicy.network._tag === "PublicWeb") return yield* initialError("unsupported");
|
|
61
61
|
const policy = InteractiveBrowserPolicy.make({
|
|
62
62
|
...decodedPolicy,
|
|
@@ -110,7 +110,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
110
110
|
exposures: [...exposures]
|
|
111
111
|
}).pipe(Effect.mapError((error) => fail(error.reason)));
|
|
112
112
|
if (Redacted.value(yield* caller) !== Redacted.value(principal)) return yield* fail("denied");
|
|
113
|
-
const decision = yield* Schema.
|
|
113
|
+
const decision = yield* Schema.decodeEffect(CredentialObservationDecision)(rawDecision).pipe(Effect.mapError(() => fail("observation-blocked")));
|
|
114
114
|
if (decision === "deny") return yield* fail("observation-blocked");
|
|
115
115
|
if (typeof decision !== "string") {
|
|
116
116
|
origins = [...decision.origins];
|
|
@@ -166,7 +166,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
166
166
|
if (interrupt) return yield* Effect.interrupt;
|
|
167
167
|
return yield* fail(dispatch === "possibly-dispatched" && reason === "provider" ? "outcome-unknown" : reason);
|
|
168
168
|
})), Effect.onInterrupt(() => close), Effect.withTracerEnabled(false));
|
|
169
|
-
})).pipe(Effect.flatMap(
|
|
169
|
+
})).pipe(Effect.flatMap(Effect.fromOption(() => new ProtectedBrowserError({
|
|
170
170
|
reason: "busy",
|
|
171
171
|
dispatch: "not-dispatched",
|
|
172
172
|
milestone: "none",
|
|
@@ -176,7 +176,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
176
176
|
return {
|
|
177
177
|
close,
|
|
178
178
|
navigate: (request) => run(Effect.gen(function* () {
|
|
179
|
-
const decoded = yield* Schema.
|
|
179
|
+
const decoded = yield* Schema.decodeEffect(ProtectedBrowserNavigate)(request).pipe(Effect.mapError(() => fail("denied")));
|
|
180
180
|
let url;
|
|
181
181
|
try {
|
|
182
182
|
url = new URL(decoded.url);
|
|
@@ -207,7 +207,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
207
207
|
}));
|
|
208
208
|
})),
|
|
209
209
|
click: (request) => run(Effect.gen(function* () {
|
|
210
|
-
const decoded = yield* Schema.
|
|
210
|
+
const decoded = yield* Schema.decodeEffect(ProtectedBrowserClick)(request).pipe(Effect.mapError(() => fail("denied")));
|
|
211
211
|
yield* permitObservation;
|
|
212
212
|
const control = yield* target(decoded.ref);
|
|
213
213
|
if (control.role !== "link" && control.role !== "button" && control.role !== "radio" && control.role !== "checkbox" && control.role !== "submit") return yield* fail("unsupported");
|
|
@@ -243,7 +243,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
243
243
|
yield* permitObservation;
|
|
244
244
|
})),
|
|
245
245
|
fill: (request) => run(Effect.gen(function* () {
|
|
246
|
-
const decoded = yield* Schema.
|
|
246
|
+
const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill)(request).pipe(Effect.mapError(() => fail("denied")));
|
|
247
247
|
yield* permitObservation;
|
|
248
248
|
const control = yield* target(decoded.ref);
|
|
249
249
|
if (control.role !== "text" && control.role !== "select") return yield* fail("unsupported");
|
|
@@ -261,7 +261,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
261
261
|
yield* permitObservation;
|
|
262
262
|
})),
|
|
263
263
|
listCredentialOffers: (request) => run(Effect.gen(function* () {
|
|
264
|
-
const decoded = yield* Schema.
|
|
264
|
+
const decoded = yield* Schema.decodeEffect(ListCredentialOffers)(request).pipe(Effect.mapError(() => fail("denied")));
|
|
265
265
|
yield* permitObservation;
|
|
266
266
|
const control = yield* target(decoded.target);
|
|
267
267
|
if (kindFor(control.role) !== decoded.kind) return yield* fail("unsupported");
|
|
@@ -300,7 +300,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
300
300
|
return result;
|
|
301
301
|
})),
|
|
302
302
|
useCredential: (request) => run(Effect.gen(function* () {
|
|
303
|
-
const decoded = yield* Schema.
|
|
303
|
+
const decoded = yield* Schema.decodeEffect(UseCredential)(request).pipe(Effect.mapError(() => fail("denied")));
|
|
304
304
|
const offer = offers.get(decoded.offer);
|
|
305
305
|
if (offer === void 0 || offer.expires <= (yield* Clock.currentTimeMillis)) return yield* fail("stale-reference");
|
|
306
306
|
const principal = yield* caller;
|
|
@@ -334,7 +334,7 @@ const browserRunProtectedLayer = () => Layer.effect(ProtectedBrowser)(Effect.gen
|
|
|
334
334
|
yield* authorize;
|
|
335
335
|
yield* validate;
|
|
336
336
|
const raw = yield* access.resolve(authorization).pipe(Effect.mapError((error) => fail(error.reason)));
|
|
337
|
-
const material = yield* Schema.
|
|
337
|
+
const material = yield* Schema.decodeEffect(offer.kind === "login" ? LoginCredential : CardCredential)(raw).pipe(Effect.mapError(() => fail("resolver")));
|
|
338
338
|
for (const field of decoded.fields) if (secretFor(material, field.role) === void 0) return yield* fail("missing-credential");
|
|
339
339
|
offers.delete(decoded.offer);
|
|
340
340
|
for (const field of decoded.fields) {
|
|
@@ -804,7 +804,7 @@ const browserRunProtectedBindingLayer = (options) => Layer.effect(BrowserRunProt
|
|
|
804
804
|
recording: false,
|
|
805
805
|
keep_alive: Math.min(6e5, Math.max(1e4, policy.maxElapsedMillis))
|
|
806
806
|
});
|
|
807
|
-
sessionId = Redacted.make(Schema.
|
|
807
|
+
sessionId = Redacted.make(Schema.decodeSync(Schema.String.check(Schema.isUUID()))(acquired.sessionId));
|
|
808
808
|
if (!recordingDisabled || signal.aborted || invalid) {
|
|
809
809
|
await runCleanup(terminate);
|
|
810
810
|
throw new ProtectedTransportError({ reason: "stale-reference" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtectedBrowser.mjs","names":[],"sources":["../src/protected-browser/policy.ts","../src/protected-browser/inspect-frame.ts","../src/protected-browser/native.ts","../src/protected-browser/binding.ts"],"sourcesContent":["import { InteractiveBrowserPolicy } from \"@effect-agent/sandbox/InteractiveBrowser\";\n/// <reference types=\"@cloudflare/workers-types\" />\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n CredentialOffer,\n CredentialOfferMetadata,\n CredentialOrigin,\n CredentialObservationDecision,\n type CredentialTarget,\n CredentialUseResult,\n ListCredentialOffers,\n LoginCredential,\n ProtectedBrowser,\n ProtectedBrowserClick,\n ProtectedBrowserError,\n ProtectedBrowserFill,\n ProtectedBrowserNavigate,\n ProtectedBrowserObservation,\n ProtectedBrowserControl,\n UseCredential,\n type CredentialFieldRole,\n type CredentialKind,\n type CredentialUseAuthorization,\n type ProtectedBrowserHandle,\n type ProtectedBrowserAction,\n type ProtectedCleanup,\n type ProtectedObservationState,\n} from \"@effect-agent/sandbox/ProtectedBrowser\";\nimport {\n Clock,\n Context,\n Crypto,\n Effect,\n Layer,\n Option,\n Redacted,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nexport class ProtectedTransportError extends Schema.TaggedError<ProtectedTransportError>()(\n \"ProtectedTransportError\",\n { reason: Schema.Literals([\"stale-reference\", \"needs-attention\", \"unsupported\", \"provider\"]) },\n) {}\n\n/** Per-write evidence authority, provided by the policy immediately around a transport fill. */\nexport class ProtectedBrowserDispatch extends Context.Service<\n ProtectedBrowserDispatch,\n { readonly mark: Effect.Effect<void> }\n>()(\"@effect-agent/platform-cloudflare/ProtectedBrowserDispatch\") {}\n\n/** Decoded adapter boundary. SDK exceptions and page diagnostics never cross this port. */\nexport interface ProtectedBrowserTransport {\n /** Select observation/target origins; undefined restores all network-permitted HTTPS frames. */\n readonly restrictObservation: (\n origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined,\n ) => Effect.Effect<void, ProtectedTransportError>;\n readonly context: Effect.Effect<typeof ProtectedPageContext.Type, ProtectedTransportError>;\n readonly discover: Effect.Effect<typeof ProtectedDiscovery.Type, ProtectedTransportError>;\n readonly target: (ref: string) => Effect.Effect<ProtectedBrowserControl, ProtectedTransportError>;\n readonly navigate: (url: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly click: (ref: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly fill: (\n ref: string,\n role: typeof CredentialFieldRole.Type | \"text\" | \"select\",\n value: Redacted.Redacted<string>,\n ) => Effect.Effect<void, ProtectedTransportError, ProtectedBrowserDispatch>;\n /** Invalidates local references synchronously before bounded exact-session cleanup. */\n readonly invalidate: () => void;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\n/** Adapter-private injection seam for deterministic tests, not a model capability. */\nexport class BrowserRunProtectedTransport extends Context.Service<\n BrowserRunProtectedTransport,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<ProtectedBrowserTransport, ProtectedBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedTransport\") {}\n\nexport const ProtectedPageContext = Schema.Struct({\n document: Schema.String.check(Schema.isUUID()),\n topOrigin: CredentialOrigin,\n frameOrigins: Schema.Array(CredentialOrigin).check(Schema.isMaxLength(16)),\n});\n\nexport const ProtectedDiscovery = Schema.Struct({\n ...ProtectedPageContext.fields,\n text: Schema.String.check(Schema.isMaxLength(64 * 1024)),\n controls: Schema.Array(ProtectedBrowserControl).check(Schema.isMaxLength(64)),\n truncated: Schema.Boolean,\n});\n\nconst sameTarget = (a: CredentialTarget, b: CredentialTarget) =>\n a.topOrigin === b.topOrigin &&\n a.frameOrigin === b.frameOrigin &&\n a.recipientOrigin === b.recipientOrigin &&\n a.document === b.document &&\n a.frame === b.frame &&\n a.form === b.form;\n\nconst kindFor = (role: string): typeof CredentialKind.Type | undefined =>\n role === \"username\" || role === \"password\"\n ? \"login\"\n : role.startsWith(\"card-\")\n ? \"card\"\n : undefined;\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 }\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 * Fresh private passes only. Account administrators and Browser Rendering token holders are\n * trusted operators. No viewer, handoff, raw JavaScript, screenshot or plaintext credential API exists.\n * Hosts explicitly authorize post-exposure observations for recipients they trust not to echo.\n */\nexport const browserRunProtectedLayer = () =>\n Layer.effect(ProtectedBrowser)(\n Effect.gen(function* () {\n const transport = yield* BrowserRunProtectedTransport;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"ProtectedBrowser.open\")(function* (\n input: InteractiveBrowserPolicy,\n ): Effect.fn.Return<\n ProtectedBrowserHandle,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n > {\n const initialError = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({\n reason,\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"not-requested\",\n });\n\n const decodedPolicy = yield* Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(\n input,\n ).pipe(Effect.mapError(() => initialError(\"denied\")));\n\n if (decodedPolicy.network._tag === \"PublicWeb\") return yield* initialError(\"unsupported\");\n\n const policy = InteractiveBrowserPolicy.make({\n ...decodedPolicy,\n network:\n decodedPolicy.network._tag === \"ExactHosts\"\n ? { _tag: \"ExactHosts\", allowedHosts: [...decodedPolicy.network.allowedHosts] }\n : { _tag: \"Unrestricted\" },\n });\n\n // Capture the host access service for THIS execution, not the application singleton.\n const access = yield* BrowserCredentialAccess;\n const started = yield* Clock.currentTimeMillis;\n const driver = yield* transport.open(policy);\n const lock = yield* Semaphore.make(1);\n let observation: typeof ProtectedObservationState.Type = \"before-exposure\";\n let cleanup: typeof ProtectedCleanup.Type = \"not-requested\";\n let actions = 0;\n let dispatch: ProtectedBrowserError[\"dispatch\"] = \"not-dispatched\";\n let milestone: ProtectedBrowserError[\"milestone\"] = \"none\";\n const exposures: Array<CredentialTarget> = [];\n\n const offers = new Map<\n string,\n {\n caller: Redacted.Redacted<string>;\n key: Redacted.Redacted<string>;\n target: CredentialTarget;\n targetRef: string;\n kind: typeof CredentialKind.Type;\n expires: number;\n }\n >();\n\n const fail = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({ reason, dispatch, milestone, observation, cleanup });\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n observation = \"closed\";\n offers.clear();\n driver.invalidate();\n cleanup = yield* driver.close.pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.succeed(\"unconfirmed\" as const),\n }),\n Effect.catchCause(() => Effect.succeed(\"unconfirmed\" as const)),\n );\n\n return cleanup;\n }),\n ),\n );\n\n yield* Effect.addFinalizer(() =>\n close.pipe(\n Effect.flatMap((result) =>\n result === \"unconfirmed\"\n ? Effect.logWarning(\"Protected browser exact-session closure unconfirmed\")\n : Effect.void,\n ),\n ),\n );\n\n const remote = <A, R>(effect: Effect.Effect<A, ProtectedTransportError, R>) =>\n effect.pipe(Effect.mapError((error) => fail(error.reason)));\n\n const decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => fail(\"provider\")));\n\n const caller = access.caller.pipe(Effect.mapError((error) => fail(error.reason)));\n const pageContext = remote(driver.context);\n\n const permitObservation = Effect.gen(function* () {\n const context = yield* pageContext;\n let origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined;\n\n if (exposures.length > 0) {\n observation = \"protected\";\n const principal = yield* caller;\n\n const rawDecision = yield* access\n .observation({ ...context, caller: principal, exposures: [...exposures] })\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n\n const decision = yield* Schema.decodeUnknownEffect(CredentialObservationDecision)(\n rawDecision,\n ).pipe(Effect.mapError(() => fail(\"observation-blocked\")));\n\n if (decision === \"deny\") return yield* fail(\"observation-blocked\");\n if (typeof decision !== \"string\") {\n origins = [...decision.origins];\n if (!origins.includes(context.topOrigin)) return yield* fail(\"observation-blocked\");\n }\n observation = \"approved-after-exposure\";\n }\n yield* remote(driver.restrictObservation(origins));\n\n return {\n ...context,\n frameOrigins: context.frameOrigins.filter(\n (origin) => origins === undefined || origins.includes(origin),\n ),\n };\n });\n\n const target = (ref: string) => remote(driver.target(ref));\n\n const authorizeAction = Effect.fn(\"ProtectedBrowser.authorizeAction\")(function* (\n action: ProtectedBrowserAction,\n ) {\n if (access.authorizeAction === undefined) {\n if (action._tag === \"Submit\") return yield* fail(\"unsupported\");\n\n return;\n }\n const principal = yield* caller;\n\n yield* access\n .authorizeAction({ caller: principal, action, exposures: [...exposures] })\n .pipe(Effect.mapError((error) => fail(error.reason)));\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n if (action._tag !== \"Navigate\") {\n const current = yield* target(action.ref);\n\n if (\n !sameTarget(current.target, action.target) ||\n current.role !== (action._tag === \"Submit\" ? \"submit\" : action.role) ||\n (action._tag === \"Click\" && action.role === \"link\" && current.url !== action.url)\n )\n return yield* fail(\"stale-reference\");\n }\n }, Effect.withTracerEnabled(false));\n\n const bounded = <A>(result: A) => {\n const bytes = new TextEncoder().encode(JSON.stringify(result)).byteLength;\n\n return bytes <= policy.maxReturnedBytes\n ? Effect.succeed(result)\n : Effect.fail(fail(\"limit\"));\n };\n\n const run = <A>(effect: Effect.Effect<A, ProtectedBrowserError>) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n dispatch = \"not-dispatched\";\n milestone = \"none\";\n if (observation === \"closed\") return yield* fail(\"closed\");\n if (++actions > policy.maxActions) return yield* fail(\"limit\");\n\n const remaining =\n policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - started);\n\n if (remaining <= 0) {\n yield* close;\n\n return yield* fail(\"timeout\");\n }\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: remaining,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) =>\n Effect.gen(function* () {\n // No foreign exception or defect is retained. Interrupted operations still finalize.\n const error = cause.reasons.find(\n (reason) =>\n reason._tag === \"Fail\" && Schema.is(ProtectedBrowserError)(reason.error),\n );\n\n const reason =\n error?._tag === \"Fail\" && Schema.is(ProtectedBrowserError)(error.error)\n ? error.error.reason\n : \"provider\";\n\n const interrupt = cause.reasons.some((reason) => reason._tag === \"Interrupt\");\n\n if (\n dispatch !== \"not-dispatched\" ||\n interrupt ||\n reason === \"provider\" ||\n reason === \"timeout\"\n )\n yield* close;\n if (interrupt) return yield* Effect.interrupt;\n\n return yield* fail(\n dispatch === \"possibly-dispatched\" && reason === \"provider\"\n ? \"outcome-unknown\"\n : reason,\n );\n }),\n ),\n Effect.onInterrupt(() => close),\n Effect.withTracerEnabled(false),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n new ProtectedBrowserError({\n reason: \"busy\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation,\n cleanup,\n }),\n ),\n ),\n );\n\n return {\n close,\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(ProtectedBrowserNavigate)(\n request,\n ).pipe(Effect.mapError(() => fail(\"denied\")));\n\n let url: URL;\n\n try {\n url = new URL(decoded.url);\n } catch {\n return yield* fail(\"denied\");\n }\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (policy.network._tag === \"ExactHosts\" &&\n !policy.network.allowedHosts.includes(url.host))\n )\n return yield* fail(\"denied\");\n if (exposures.length > 0) yield* permitObservation;\n yield* authorizeAction({ _tag: \"Navigate\", url: decoded.url });\n offers.clear();\n dispatch = \"possibly-dispatched\";\n yield* remote(driver.navigate(decoded.url));\n dispatch = \"dispatched\";\n yield* permitObservation;\n }),\n ),\n observe: run(\n Effect.gen(function* () {\n const before = yield* permitObservation;\n const result = yield* remote(driver.discover);\n const after = yield* permitObservation;\n\n if (\n before.document !== after.document ||\n result.document !== after.document ||\n result.topOrigin !== after.topOrigin\n )\n return yield* fail(\"stale-reference\");\n if (result.frameOrigins.some((origin) => !after.frameOrigins.includes(origin)))\n return yield* fail(\"observation-blocked\");\n\n return yield* bounded(\n ProtectedBrowserObservation.make({\n ...result,\n observation: exposures.length > 0 ? \"approved-after-exposure\" : \"before-exposure\",\n }),\n );\n }),\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(ProtectedBrowserClick)(\n request,\n ).pipe(Effect.mapError(() => fail(\"denied\")));\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (\n control.role !== \"link\" &&\n control.role !== \"button\" &&\n control.role !== \"radio\" &&\n control.role !== \"checkbox\" &&\n control.role !== \"submit\"\n )\n return yield* fail(\"unsupported\");\n let action: ProtectedBrowserAction;\n\n if (control.role === \"link\") {\n if (control.url === undefined) return yield* fail(\"unsupported\");\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: \"link\",\n url: control.url,\n };\n } else if (control.role === \"submit\") {\n action = { _tag: \"Submit\", ref: decoded.ref, target: control.target };\n } else {\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n };\n }\n yield* authorizeAction(action);\n dispatch = \"possibly-dispatched\";\n yield* remote(driver.click(decoded.ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"not-dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n if (control.role === \"submit\") milestone = \"submission-dispatched\";\n yield* permitObservation;\n }),\n ),\n fill: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(ProtectedBrowserFill)(\n request,\n ).pipe(Effect.mapError(() => fail(\"denied\")));\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (control.role !== \"text\" && control.role !== \"select\")\n return yield* fail(\"unsupported\");\n yield* authorizeAction({\n _tag: \"Fill\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n });\n yield* remote(\n driver.fill(decoded.ref, control.role, Redacted.make(decoded.value)),\n ).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"filled\";\n yield* permitObservation;\n }),\n ),\n listCredentialOffers: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(ListCredentialOffers)(\n request,\n ).pipe(Effect.mapError(() => fail(\"denied\")));\n\n yield* permitObservation;\n const control = yield* target(decoded.target);\n\n if (kindFor(control.role) !== decoded.kind) return yield* fail(\"unsupported\");\n const principal = yield* caller;\n\n const candidates = yield* access\n .list({ caller: principal, kind: decoded.kind, target: control.target })\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n const now = yield* Clock.currentTimeMillis;\n\n for (const [ref, offer] of offers) if (offer.expires <= now) offers.delete(ref);\n if (candidates.length > 16 || offers.size + candidates.length > 64)\n return yield* fail(\"limit\");\n if (!sameTarget(control.target, (yield* target(decoded.target)).target))\n return yield* fail(\"stale-reference\");\n const expires = now + 60_000;\n const result: Array<CredentialOffer> = [];\n const pending: typeof offers = new Map();\n\n for (const candidate of candidates) {\n const metadata = yield* decode(CredentialOfferMetadata, candidate.metadata);\n\n const ref = yield* crypto.randomUUIDv4.pipe(\n Effect.mapError(() => fail(\"provider\")),\n );\n\n pending.set(ref, {\n caller: principal,\n key: candidate.key,\n target: control.target,\n targetRef: decoded.target,\n kind: decoded.kind,\n expires,\n });\n result.push(CredentialOffer.make({ ref, kind: decoded.kind, metadata }));\n }\n yield* bounded(result);\n for (const [ref, offer] of pending) offers.set(ref, offer);\n\n return result;\n }),\n ),\n useCredential: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeUnknownEffect(UseCredential)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n const offer = offers.get(decoded.offer);\n\n if (offer === undefined || offer.expires <= (yield* Clock.currentTimeMillis))\n return yield* fail(\"stale-reference\");\n const principal = yield* caller;\n\n if (Redacted.value(principal) !== Redacted.value(offer.caller))\n return yield* fail(\"denied\");\n if (\n new Set(decoded.fields.map((field) => field.ref)).size !==\n decoded.fields.length ||\n new Set(decoded.fields.map((field) => field.role)).size !== decoded.fields.length\n )\n return yield* fail(\"denied\");\n\n const validate = Effect.gen(function* () {\n if (!sameTarget(offer.target, (yield* target(offer.targetRef)).target))\n return yield* fail(\"stale-reference\");\n for (const field of decoded.fields) {\n const current = yield* target(field.ref);\n\n if (\n field.role !== current.role ||\n kindFor(field.role) !== offer.kind ||\n !sameTarget(offer.target, current.target)\n )\n return yield* fail(\"denied\");\n }\n if (decoded.submit !== undefined) {\n const submit = yield* target(decoded.submit);\n\n if (submit.role !== \"submit\" || !sameTarget(offer.target, submit.target))\n return yield* fail(\"denied\");\n }\n });\n\n yield* validate;\n\n const authorization: CredentialUseAuthorization = {\n caller: principal,\n key: offer.key,\n kind: offer.kind,\n target: offer.target,\n roles: decoded.fields.map((field) => field.role),\n submit: decoded.submit !== undefined,\n };\n\n const authorize = Effect.gen(function* () {\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n yield* access\n .authorize(authorization)\n .pipe(Effect.mapError((error) => fail(error.reason)));\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\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.decodeUnknownEffect(\n offer.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const field of decoded.fields)\n if (secretFor(material, field.role) === undefined)\n return yield* fail(\"missing-credential\");\n offers.delete(decoded.offer);\n for (const field of decoded.fields) {\n yield* validate;\n yield* authorize;\n const value = secretFor(material, field.role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n observation = \"protected\";\n yield* remote(driver.fill(field.ref, field.role, value)).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n if (!exposures.some((target) => sameTarget(target, offer.target)))\n exposures.push(offer.target);\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"partial-fill\";\n }\n milestone = \"filled\";\n if (decoded.submit !== undefined) {\n yield* validate;\n yield* authorize;\n const ref = decoded.submit;\n\n dispatch = \"possibly-dispatched\";\n yield* remote(driver.click(ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"submission-dispatched\";\n }\n yield* permitObservation;\n\n return CredentialUseResult.make({\n dispatch,\n milestone,\n observation,\n cleanup,\n authentication: \"unverified\",\n });\n }),\n ),\n };\n }, Effect.withTracerEnabled(false));\n\n return { open };\n }),\n );\n","// This fixed program runs in an isolated world. Pages cannot replace its native DOM methods.\n// Handles retain actual nodes; a selector is never reconstructed from an opaque reference.\nexport const maxAttributeLength = 2048;\n\nexport const inspectFrame = `(() => {\n const doc = document;\n const forms = [];\n const isChoice = el => el instanceof HTMLInputElement && ['radio','checkbox'].includes(el.type);\n const presented = el => {\n if (el.closest('[hidden],[aria-hidden=\"true\"],[inert]') ||\n ['hidden','collapse'].includes(getComputedStyle(el).visibility)) return false;\n for (let parent = el; parent; parent = parent.parentElement) {\n if (getComputedStyle(parent).opacity === '0') return false;\n }\n return true;\n };\n const hasLayout = el => presented(el) &&\n [...el.getClientRects()].some(rect => rect.width > 0 && rect.height > 0);\n const available = el => el.type !== 'hidden' && !el.closest('[hidden],[aria-hidden=\"true\"],[inert]') &&\n (hasLayout(el) || (isChoice(el) && [...(el.labels ?? [])].some(hasLayout)));\n const elements = [...doc.querySelectorAll('input,textarea,select,button,a[href]')].filter(available).slice(0, 65);\n const labelText = el => {\n const label = el.labels?.[0]?.cloneNode(true);\n label?.querySelectorAll('input,textarea,select,script,style,noscript').forEach(child => child.remove());\n return label?.textContent ?? el.getAttribute('aria-label');\n };\n const describe = (el) => {\n if (doc !== document || !el.isConnected || el.ownerDocument !== doc || !available(el)) return null;\n const form = el.form ?? null;\n let formIndex = forms.indexOf(form);\n if (formIndex < 0) { formIndex = forms.length; forms.push(form); }\n // Resolved href (including path/query/fragment and base-URL changes) is part of the fingerprint.\n const action = el instanceof HTMLAnchorElement ? el.href : form ? (el.hasAttribute('formaction') ? el.formAction : form.action || doc.URL) : doc.URL;\n const method = form ? (el.hasAttribute('formmethod') ? el.formMethod : form.method) : '';\n const enctype = form?.enctype ?? '';\n const name = el.name ?? '';\n const completion = el.getAttribute('autocomplete') ?? '';\n const inputType = el.type ?? '';\n const choiceValue = isChoice(el) ? el.value : '';\n // Reject before parsing, fingerprinting or CDP transfer. Truncation could hide a target change.\n if ([action, method, enctype, name, completion, inputType, choiceValue].some(value => value.length > ${maxAttributeLength})) return null;\n const type = inputType.toLowerCase();\n const autocomplete = completion.trim().toLowerCase().split(/\\\\s+/).at(-1);\n const cardRoles = { 'cc-name':'card-name', 'cc-number':'card-number', 'cc-exp':'card-expiry',\n 'cc-exp-month':'card-expiry-month', 'cc-exp-year':'card-expiry-year', 'cc-csc':'card-security-code' };\n let role = 'unsupported';\n const nativeField = el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement;\n if (nativeField && !['submit','button'].includes(type) && !el.matches(':disabled') && !el.readOnly && !(el instanceof HTMLSelectElement && el.multiple)) {\n if (isChoice(el)) role = type;\n else if (type === 'password' || ['current-password','new-password','one-time-code'].includes(autocomplete)) {\n if (type === 'password' && form) role = 'password';\n } else if (['text','email','tel','number','month','search','url','date','time','week','datetime-local','textarea',''].includes(type) || el instanceof HTMLSelectElement) {\n if (cardRoles[autocomplete]) { if (form) role = cardRoles[autocomplete]; }\n else if (autocomplete === 'username' || autocomplete === 'email') { if (form) role = 'username'; }\n else if (['text','email'].includes(type) && form && form.querySelector('input[type=\"password\"]')) role = 'username';\n else if (el instanceof HTMLSelectElement) { if (!el.multiple) role = 'select'; }\n else role = 'text';\n }\n } else if (el instanceof HTMLButtonElement || (el instanceof HTMLInputElement && ['submit','button'].includes(type))) {\n if (!el.matches(':disabled')) role = type === 'submit' && form ? 'submit' : type === 'button' ? 'button' : 'unsupported';\n } else if (el instanceof HTMLAnchorElement) role = 'link';\n const fingerprint = JSON.stringify([role, action, method, enctype, name, completion, type, choiceValue]);\n return { role, formIndex, action, fingerprint, ...(isChoice(el) ? {checked: el.checked} : {}),\n label: (labelText(el) ?? (nativeField ? '' : el.textContent) ?? '').slice(0,200) };\n };\n const expose = ({role, formIndex, action, label, checked}) =>\n ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked})});\n const original = elements.map(describe);\n const validate = (index) => {\n const current = describe(elements[index]);\n if (!current || !original[index] || current.fingerprint !== original[index].fingerprint ||\n current.formIndex !== original[index].formIndex) return null;\n return expose(current);\n };\n return {\n doc, elements, original: original.map(current => current && expose(current)), validate,\n text: () => {\n if (doc !== document) return null;\n if (!doc.body) return '';\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);\n const range = doc.createRange();\n let text = '';\n for (let node = walker.nextNode(); node && text.length < 65536; node = walker.nextNode()) {\n const parent = node.parentElement;\n if (!parent || parent.closest('input,textarea,select,script,style,noscript,iframe,object,embed')) continue;\n if (!presented(parent)) continue;\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some(rect => rect.width > 0 && rect.height > 0)) continue;\n text += (node.textContent ?? '').replace(/\\\\s+/g, ' ') + ' ';\n }\n return text.slice(0,65536);\n },\n fill: (index, role, value) => {\n const current = validate(index);\n if (!current || current.role !== role) return false;\n const el = elements[index];\n if (role === 'select') {\n const options = [...el.options].filter(option => !option.matches(':disabled'));\n const values = options.filter(option => option.value === value);\n const matches = values.length > 0 ? values : options.filter(option => option.textContent?.trim() === value);\n if (matches.length !== 1) return 'unsupported';\n value = matches[0].value;\n if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported';\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 false;\n // Validate and mutate in one isolated-world task, without focusing first and running\n // page handlers between validation and assignment. Native setters support controlled inputs.\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 true;\n },\n click: (index) => {\n const current = validate(index);\n if (!current || !['button','submit','link','radio','checkbox'].includes(current.role)) return false;\n if (current.role === 'submit' && elements[index].form && !elements[index].form.matches(':valid')) return 'needs-attention';\n elements[index].click();\n return true;\n }\n };\n})()`;\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport type { Browser, Frame, JSHandle, Page } from \"@cloudflare/puppeteer\";\nimport { type InteractiveBrowserPolicy } from \"@effect-agent/sandbox/InteractiveBrowser\";\nimport {\n CredentialOrigin,\n CredentialTarget,\n ProtectedBrowserControl,\n} from \"@effect-agent/sandbox/ProtectedBrowser\";\nimport { Clock, Context, Crypto, Effect, Redacted, Schema, type Scope } from \"effect\";\n\nimport { inspectFrame, maxAttributeLength } from \"./inspect-frame.ts\";\nimport {\n ProtectedBrowserDispatch,\n ProtectedTransportError,\n ProtectedDiscovery,\n ProtectedPageContext,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n// The pinned SDK implements this method but strips its internal declaration from lib/types.d.ts.\n// Keep the declaration narrow and refuse runtimes without it. No main-world fallback is safe.\ndeclare module \"@cloudflare/puppeteer\" {\n interface Frame {\n isolatedRealm(): { evaluateHandle(source: string): Promise<JSHandle<unknown>> };\n }\n}\n\nconst Description = Schema.Struct({\n role: ProtectedBrowserControl.fields.role,\n formIndex: Schema.Natural,\n action: Schema.String.check(Schema.isMaxLength(maxAttributeLength)),\n label: Schema.String.check(Schema.isMaxLength(200)),\n checked: Schema.optionalKey(Schema.Boolean),\n});\n\nconst Descriptions = Schema.Array(Schema.NullOr(Description)).check(Schema.isMaxLength(65));\n\ninterface FrameState {\n readonly frame: Frame;\n readonly handle: JSHandle<unknown>;\n readonly ref: string;\n readonly document: string;\n readonly forms: Map<number, string>;\n}\ninterface ControlState {\n readonly frame: FrameState;\n readonly index: number;\n readonly control: ProtectedBrowserControl;\n readonly expires: number;\n}\n\n/** One host-private acquired session. The SDK handles and exact-session cleanup have one owner. */\nexport class ProtectedNativeSession extends Context.Service<\n ProtectedNativeSession,\n {\n readonly browser: Browser;\n readonly page: Page;\n readonly close: Effect.Effect<\"confirmed\" | \"unconfirmed\">;\n }\n>()(\"@effect-agent/platform-cloudflare/ProtectedNativeSession\") {}\n\nconst transportError = (reason: ProtectedTransportError[\"reason\"]) =>\n new ProtectedTransportError({ reason });\n\nconst decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => transportError(\"provider\")));\n\n// Attach rejection handling inside the SDK callback before workerd can report foreign diagnostics.\nconst 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: () => transportError(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(transportError(\"provider\")),\n ),\n );\n\n/** Host-private scoped transport. Session capabilities are requirements; policy is per-pass data. */\nexport const makeProtectedNativeTransport = Effect.fn(\"ProtectedNativeTransport.make\")(function* (\n policy: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n ProtectedBrowserTransport,\n never,\n ProtectedNativeSession | Crypto.Crypto | Scope.Scope\n> {\n const session = yield* ProtectedNativeSession;\n const { browser, page } = session;\n const crypto = yield* Crypto.Crypto;\n const clock = yield* Clock.Clock;\n const uuid = crypto.randomUUIDv4.pipe(Effect.mapError(() => transportError(\"provider\")));\n let closed = false;\n let violation = false;\n let documentRef: string | undefined;\n let observationOrigins: ReadonlySet<string> | undefined;\n const frames = new Map<Frame, FrameState>();\n const controls = new Map<string, ControlState>();\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 transportError(\"stale-reference\");\n if (!Schema.is(CredentialOrigin)(url.origin)) throw transportError(\"unsupported\");\n if (policy.network._tag === \"ExactHosts\" && !policy.network.allowedHosts.includes(url.host))\n throw transportError(\"stale-reference\");\n\n return url.origin;\n },\n catch: (cause) =>\n Schema.is(ProtectedTransportError)(cause) ? cause : transportError(\"provider\"),\n });\n\n const check = Effect.suspend(() =>\n closed || violation || !browser.isConnected()\n ? Effect.fail(transportError(\"stale-reference\"))\n : Effect.void,\n );\n\n const clear = () => {\n controls.clear();\n // Browser event callbacks only invalidate. The next Effect operation allocates the new identity.\n documentRef = undefined;\n };\n\n const onNavigated = () => {\n clear();\n };\n\n const onTarget = (target: { type(): string }) => {\n if (target.type() !== \"page\") return;\n // No popup or additional page may inherit an observation channel.\n violation = true;\n clear();\n };\n\n const invalidate = () => {\n closed = true;\n clear();\n };\n\n const observationFrames = Effect.gen(function* () {\n const list = page.frames();\n\n if (list.length > 32) return yield* transportError(\"unsupported\");\n\n // Opaque/blank child documents have no observation channel or credential targets.\n // The main document and every retained HTTPS child still require strict origin validation.\n return yield* Effect.filter(list, (frame) =>\n frame === page.mainFrame()\n ? Effect.succeed(true)\n : Effect.try({\n try: () => frame.url() !== \"\" && new URL(frame.url()).protocol === \"https:\",\n catch: () => transportError(\"provider\"),\n }),\n );\n });\n\n const context = Effect.gen(function* () {\n yield* check;\n const list = yield* observationFrames;\n const topOrigin = yield* origin(page.url());\n const frameOrigins = [...new Set(yield* Effect.forEach(list, (frame) => origin(frame.url())))];\n\n if (frameOrigins.length > 16) return yield* transportError(\"unsupported\");\n\n if (documentRef === undefined) documentRef = yield* uuid;\n\n return yield* decode(ProtectedPageContext, { document: documentRef, topOrigin, frameOrigins });\n });\n\n const isCurrent = Effect.fn(\"ProtectedNativeTransport.isCurrent\")(function* (state: FrameState) {\n if (state.frame.detached) return false;\n\n return yield* remote(() =>\n state.handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.get(held, \"doc\") === Reflect.get(globalThis, \"document\");\n }),\n );\n });\n\n const get = Effect.fn(\"ProtectedNativeTransport.get\")(function* (ref: string) {\n yield* check;\n const state = controls.get(ref);\n\n if (\n !state ||\n (observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)) ||\n state.expires <= (yield* clock.currentTimeMillis) ||\n !(yield* isCurrent(state.frame))\n )\n return yield* transportError(\"stale-reference\");\n\n const current = yield* remote(() =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"validate\"), held, [index]);\n }, state.index),\n );\n\n const description = yield* decode(Schema.NullOr(Description), current);\n\n if (description === null) return yield* transportError(\"stale-reference\");\n const ctx = yield* context;\n\n if (\n ctx.topOrigin !== state.control.target.topOrigin ||\n (yield* origin(state.frame.frame.url())) !== state.control.target.frameOrigin ||\n (yield* origin(description.action)) !== state.control.target.recipientOrigin ||\n description.role !== state.control.role\n )\n return yield* transportError(\"stale-reference\");\n\n return state;\n });\n\n const close = yield* Effect.cached(\n Effect.gen(function* () {\n invalidate();\n\n return yield* session.close;\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n page.off(\"framenavigated\", onNavigated);\n page.off(\"framedetached\", onNavigated);\n browser.off(\"targetcreated\", onTarget);\n // Handles die with the exact session. Do not block remote termination on local disposal.\n frames.clear();\n }),\n ),\n ),\n );\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n page.on(\"framenavigated\", onNavigated);\n page.on(\"framedetached\", onNavigated);\n browser.on(\"targetcreated\", onTarget);\n }),\n () => close,\n );\n\n return {\n restrictObservation: Effect.fn(\"ProtectedNativeTransport.restrictObservation\")(\n function* (origins) {\n yield* check;\n observationOrigins =\n origins === undefined\n ? undefined\n : new Set(yield* decode(Schema.Array(CredentialOrigin), origins));\n // A later grant expansion must not revive previously excluded references.\n for (const [ref, state] of controls)\n if (\n observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)\n )\n controls.delete(ref);\n },\n ),\n context,\n invalidate,\n close,\n navigate: Effect.fn(\"ProtectedNativeTransport.navigate\")(function* (url) {\n yield* check;\n yield* origin(url);\n clear();\n yield* remote(() => page.goto(url, { waitUntil: \"load\" }));\n yield* context;\n }),\n target: (ref) => get(ref).pipe(Effect.map((state) => state.control)),\n discover: Effect.gen(function* () {\n const before = yield* context;\n\n controls.clear();\n for (const state of frames.values()) yield* remote(() => state.handle.dispose());\n frames.clear();\n const discovered: Array<ProtectedBrowserControl> = [];\n let text = \"\";\n let truncated = false;\n const frameOrigins = new Set<string>();\n\n for (const frame of yield* observationFrames) {\n const frameOrigin = yield* origin(frame.url());\n\n if (observationOrigins !== undefined && !observationOrigins.has(frameOrigin)) continue;\n frameOrigins.add(frameOrigin);\n if (typeof frame.isolatedRealm !== \"function\") return yield* transportError(\"unsupported\");\n const handle = yield* remote(() => frame.isolatedRealm().evaluateHandle(inspectFrame));\n\n const state: FrameState = {\n frame,\n handle,\n ref: yield* uuid,\n document: yield* uuid,\n forms: new Map(),\n };\n\n frames.set(frame, state);\n\n const raw = yield* remote(() =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.get(held, \"original\");\n }),\n );\n\n const descriptions = yield* decode(Descriptions, raw);\n\n for (let index = 0; index < descriptions.length; index++) {\n const desc = descriptions[index];\n\n if (!desc) continue;\n if (discovered.length === 64) {\n truncated = true;\n break;\n }\n let form = state.forms.get(desc.formIndex);\n\n if (form === undefined) {\n form = yield* uuid;\n state.forms.set(desc.formIndex, form);\n }\n // Unsupported destinations/controls are not offered as credential targets.\n const recipient = yield* origin(desc.action).pipe(Effect.result);\n\n if (recipient._tag === \"Failure\") continue;\n\n const control = ProtectedBrowserControl.make({\n ref: yield* uuid,\n role: desc.role,\n label: desc.label,\n ...(desc.checked === undefined ? {} : { checked: desc.checked }),\n ...(desc.role === \"link\" ? { url: desc.action } : {}),\n target: CredentialTarget.make({\n topOrigin: before.topOrigin,\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: recipient.success,\n document: state.document,\n frame: state.ref,\n form,\n }),\n });\n\n controls.set(control.ref, {\n frame: state,\n index,\n control,\n expires: (yield* clock.currentTimeMillis) + 60_000,\n });\n discovered.push(control);\n }\n\n const rawText = yield* remote(() =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"text\"), held, []);\n }),\n );\n\n text += yield* decode(Schema.String.check(Schema.isMaxLength(65536)), rawText);\n if (text.length > 65536) {\n text = text.slice(0, 65536);\n truncated = true;\n }\n }\n if ((yield* context).document !== before.document)\n return yield* transportError(\"stale-reference\");\n\n return yield* decode(ProtectedDiscovery, {\n ...before,\n frameOrigins: [...frameOrigins],\n text,\n controls: discovered,\n truncated,\n });\n }),\n fill: Effect.fn(\"ProtectedNativeTransport.fill\")(function* (ref, role, value) {\n const dispatch = yield* ProtectedBrowserDispatch;\n const state = yield* get(ref);\n\n // CDP dispatch may mutate before its reply is lost, so uncertainty starts here.\n yield* dispatch.mark;\n\n const filled = yield* remote(() =>\n state.frame.handle.evaluate(\n (held, index, expectedRole, secret) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"fill\"), held, [index, expectedRole, secret]);\n },\n state.index,\n role,\n Redacted.value(value),\n ),\n );\n\n if (filled === \"unsupported\") return yield* transportError(\"unsupported\");\n if (filled !== true) return yield* transportError(\"stale-reference\");\n }),\n click: Effect.fn(\"ProtectedNativeTransport.click\")(function* (ref) {\n const state = yield* get(ref);\n\n const clicked = yield* remote(() =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"click\"), held, [index]);\n }, state.index),\n );\n\n if (clicked === \"needs-attention\") return yield* transportError(\"needs-attention\");\n if (clicked !== true) return yield* transportError(\"stale-reference\");\n }),\n };\n}, Effect.withTracerEnabled(false));\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport puppeteer, { type Browser } from \"@cloudflare/puppeteer\";\nimport { type InteractiveBrowserPolicy } from \"@effect-agent/sandbox/InteractiveBrowser\";\nimport { ProtectedBrowserError } from \"@effect-agent/sandbox/ProtectedBrowser\";\nimport { Clock, Context, Crypto, Effect, Layer, Redacted, Schema, type Scope } from \"effect\";\n\nimport { BrowserRunSessionLifecycle } from \"../internal/browser-session-lifecycle.ts\";\nimport { makeProtectedNativeTransport, ProtectedNativeSession } from \"./native.ts\";\nimport {\n BrowserRunProtectedTransport,\n ProtectedTransportError,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n/**\n * Acquires through BROWSER with recording=false explicitly on the wire. The trusted provider's\n * documented opt-in semantics are the recording guarantee; no recording-status API exists.\n * Account operators remain trusted, and must not attach external observers to private passes.\n */\nexport const browserRunProtectedBindingLayer = (options: {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}) =>\n Layer.effect(BrowserRunProtectedTransport)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"BrowserRunProtectedTransport.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<ProtectedBrowserTransport, ProtectedBrowserError, Scope.Scope> {\n const failure = () =>\n new ProtectedBrowserError({\n reason: \"provider\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"unconfirmed\",\n });\n\n let sessionId: Redacted.Redacted<string> | undefined;\n let browser: Browser | undefined;\n let driver: ProtectedBrowserTransport | undefined;\n let invalid = false;\n // SDK acquisition may finish after interruption. Its late-reply callback must await cleanup,\n // using this pass's clock rather than starting an Effect runtime with default services.\n const runCleanup = Effect.runPromiseWith(Context.make(Clock.Clock, yield* Clock.Clock));\n\n const terminate = Effect.gen(function* () {\n invalid = true;\n driver?.invalidate();\n if (sessionId === undefined) return \"unconfirmed\" as const;\n\n const cleanup = yield* lifecycle.close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause(() => Effect.succeed(\"unconfirmed\" as const)),\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.succeed(\"unconfirmed\" as const),\n }),\n );\n\n // Local disconnect is not remote-closure evidence. Do it even when confirmation fails.\n const connected = browser;\n\n if (connected !== undefined)\n yield* Effect.promise(() => connected.disconnect()).pipe(\n Effect.catchCause(() => Effect.void),\n Effect.interruptible,\n Effect.timeoutOrElse({ duration: \"1 second\", orElse: () => Effect.void }),\n );\n\n return cleanup;\n });\n\n const close = yield* Effect.cached(terminate);\n\n yield* Effect.addFinalizer(() =>\n close.pipe(\n Effect.flatMap((state) =>\n state === \"confirmed\"\n ? Effect.void\n : Effect.logWarning(\"Protected browser exact-session closure unconfirmed\"),\n ),\n ),\n );\n\n const acquired = yield* Effect.tryPromise({\n try: async (signal) => {\n let recordingDisabled = false;\n\n const binding = {\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const request = new Request(input, init);\n const url = new URL(request.url);\n\n if (url.pathname === \"/v1/devtools/browser\" && request.method === \"POST\") {\n url.searchParams.set(\"recording\", \"false\");\n recordingDisabled = url.searchParams.get(\"recording\") === \"false\";\n\n return options.browser.fetch(new Request(url, request));\n }\n\n return options.browser.fetch(request);\n },\n };\n\n const acquired = await puppeteer.acquire(binding, {\n recording: false,\n // Provider inactivity timeout, independent of the finite total pass deadline.\n keep_alive: Math.min(600_000, Math.max(10_000, policy.maxElapsedMillis)),\n });\n\n sessionId = Redacted.make(\n Schema.decodeUnknownSync(Schema.String.check(Schema.isUUID()))(acquired.sessionId),\n );\n if (!recordingDisabled || signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n // Initial attachment only. No recovery/reconnection path exists.\n browser = await puppeteer.connect(options.browser, acquired.sessionId);\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n const context = await browser.createBrowserContext();\n const page = await context.newPage();\n\n await page.setBypassServiceWorker(true);\n await page.setRequestInterception(true);\n page.on(\"request\", (request) => {\n let allowed = policy.network._tag === \"Unrestricted\";\n\n try {\n const url = new URL(request.url());\n\n allowed ||=\n policy.network._tag === \"ExactHosts\" &&\n url.protocol === \"https:\" &&\n !url.username &&\n !url.password &&\n policy.network.allowedHosts.includes(url.host);\n } catch {\n /* Refuse malformed destinations. */\n }\n void (\n allowed && !invalid ? request.continue() : request.abort(\"blockedbyclient\")\n ).catch(() => {\n invalid = true;\n driver?.invalidate();\n });\n });\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n\n return ProtectedNativeSession.of({ browser, page, close });\n },\n catch: failure,\n }).pipe(\n Effect.timeoutOrElse({\n duration: Math.min(policy.maxElapsedMillis, 30_000),\n orElse: () =>\n Effect.fail(new ProtectedBrowserError({ ...failure(), reason: \"timeout\" })),\n }),\n Effect.catch((error) =>\n close.pipe(\n Effect.flatMap((cleanup) =>\n Effect.fail(new ProtectedBrowserError({ ...error, cleanup })),\n ),\n ),\n ),\n );\n\n driver = yield* makeProtectedNativeTransport(policy).pipe(\n Effect.provideService(ProtectedNativeSession, acquired),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n return driver;\n }, Effect.withTracerEnabled(false));\n\n return { open };\n }),\n );\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProtectedBrowser.mjs","names":[],"sources":["../src/protected-browser/policy.ts","../src/protected-browser/inspect-frame.ts","../src/protected-browser/native.ts","../src/protected-browser/binding.ts"],"sourcesContent":["import { InteractiveBrowserPolicy } from \"@effect-agent/sandbox/InteractiveBrowser\";\n/// <reference types=\"@cloudflare/workers-types\" />\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n CredentialOffer,\n CredentialOfferMetadata,\n CredentialOrigin,\n CredentialObservationDecision,\n type CredentialTarget,\n CredentialUseResult,\n ListCredentialOffers,\n LoginCredential,\n ProtectedBrowser,\n ProtectedBrowserClick,\n ProtectedBrowserError,\n ProtectedBrowserFill,\n ProtectedBrowserNavigate,\n ProtectedBrowserObservation,\n ProtectedBrowserControl,\n UseCredential,\n type CredentialFieldRole,\n type CredentialKind,\n type CredentialUseAuthorization,\n type ProtectedBrowserHandle,\n type ProtectedBrowserAction,\n type ProtectedCleanup,\n type ProtectedObservationState,\n} from \"@effect-agent/sandbox/ProtectedBrowser\";\nimport {\n Clock,\n Context,\n Crypto,\n Effect,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nexport class ProtectedTransportError extends Schema.TaggedError<ProtectedTransportError>()(\n \"ProtectedTransportError\",\n { reason: Schema.Literals([\"stale-reference\", \"needs-attention\", \"unsupported\", \"provider\"]) },\n) {}\n\n/** Per-write evidence authority, provided by the policy immediately around a transport fill. */\nexport class ProtectedBrowserDispatch extends Context.Service<\n ProtectedBrowserDispatch,\n { readonly mark: Effect.Effect<void> }\n>()(\"@effect-agent/platform-cloudflare/ProtectedBrowserDispatch\") {}\n\n/** Decoded adapter boundary. SDK exceptions and page diagnostics never cross this port. */\nexport interface ProtectedBrowserTransport {\n /** Select observation/target origins; undefined restores all network-permitted HTTPS frames. */\n readonly restrictObservation: (\n origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined,\n ) => Effect.Effect<void, ProtectedTransportError>;\n readonly context: Effect.Effect<typeof ProtectedPageContext.Type, ProtectedTransportError>;\n readonly discover: Effect.Effect<typeof ProtectedDiscovery.Type, ProtectedTransportError>;\n readonly target: (ref: string) => Effect.Effect<ProtectedBrowserControl, ProtectedTransportError>;\n readonly navigate: (url: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly click: (ref: string) => Effect.Effect<void, ProtectedTransportError>;\n readonly fill: (\n ref: string,\n role: typeof CredentialFieldRole.Type | \"text\" | \"select\",\n value: Redacted.Redacted<string>,\n ) => Effect.Effect<void, ProtectedTransportError, ProtectedBrowserDispatch>;\n /** Invalidates local references synchronously before bounded exact-session cleanup. */\n readonly invalidate: () => void;\n readonly close: Effect.Effect<typeof ProtectedCleanup.Type>;\n}\n\n/** Adapter-private injection seam for deterministic tests, not a model capability. */\nexport class BrowserRunProtectedTransport extends Context.Service<\n BrowserRunProtectedTransport,\n {\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<ProtectedBrowserTransport, ProtectedBrowserError, Scope.Scope>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunProtectedTransport\") {}\n\nexport const ProtectedPageContext = Schema.Struct({\n document: Schema.String.check(Schema.isUUID()),\n topOrigin: CredentialOrigin,\n frameOrigins: Schema.Array(CredentialOrigin).check(Schema.isMaxLength(16)),\n});\n\nexport const ProtectedDiscovery = Schema.Struct({\n ...ProtectedPageContext.fields,\n text: Schema.String.check(Schema.isMaxLength(64 * 1024)),\n controls: Schema.Array(ProtectedBrowserControl).check(Schema.isMaxLength(64)),\n truncated: Schema.Boolean,\n});\n\nconst sameTarget = (a: CredentialTarget, b: CredentialTarget) =>\n a.topOrigin === b.topOrigin &&\n a.frameOrigin === b.frameOrigin &&\n a.recipientOrigin === b.recipientOrigin &&\n a.document === b.document &&\n a.frame === b.frame &&\n a.form === b.form;\n\nconst kindFor = (role: string): typeof CredentialKind.Type | undefined =>\n role === \"username\" || role === \"password\"\n ? \"login\"\n : role.startsWith(\"card-\")\n ? \"card\"\n : undefined;\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 }\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 * Fresh private passes only. Account administrators and Browser Rendering token holders are\n * trusted operators. No viewer, handoff, raw JavaScript, screenshot or plaintext credential API exists.\n * Hosts explicitly authorize post-exposure observations for recipients they trust not to echo.\n */\nexport const browserRunProtectedLayer = () =>\n Layer.effect(ProtectedBrowser)(\n Effect.gen(function* () {\n const transport = yield* BrowserRunProtectedTransport;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"ProtectedBrowser.open\")(function* (\n input: InteractiveBrowserPolicy,\n ): Effect.fn.Return<\n ProtectedBrowserHandle,\n ProtectedBrowserError,\n Scope.Scope | BrowserCredentialAccess\n > {\n const initialError = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({\n reason,\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"not-requested\",\n });\n\n const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => initialError(\"denied\")),\n );\n\n if (decodedPolicy.network._tag === \"PublicWeb\") return yield* initialError(\"unsupported\");\n\n const policy = InteractiveBrowserPolicy.make({\n ...decodedPolicy,\n network:\n decodedPolicy.network._tag === \"ExactHosts\"\n ? { _tag: \"ExactHosts\", allowedHosts: [...decodedPolicy.network.allowedHosts] }\n : { _tag: \"Unrestricted\" },\n });\n\n // Capture the host access service for THIS execution, not the application singleton.\n const access = yield* BrowserCredentialAccess;\n const started = yield* Clock.currentTimeMillis;\n const driver = yield* transport.open(policy);\n const lock = yield* Semaphore.make(1);\n let observation: typeof ProtectedObservationState.Type = \"before-exposure\";\n let cleanup: typeof ProtectedCleanup.Type = \"not-requested\";\n let actions = 0;\n let dispatch: ProtectedBrowserError[\"dispatch\"] = \"not-dispatched\";\n let milestone: ProtectedBrowserError[\"milestone\"] = \"none\";\n const exposures: Array<CredentialTarget> = [];\n\n const offers = new Map<\n string,\n {\n caller: Redacted.Redacted<string>;\n key: Redacted.Redacted<string>;\n target: CredentialTarget;\n targetRef: string;\n kind: typeof CredentialKind.Type;\n expires: number;\n }\n >();\n\n const fail = (reason: ProtectedBrowserError[\"reason\"]) =>\n new ProtectedBrowserError({ reason, dispatch, milestone, observation, cleanup });\n\n const close = yield* Effect.cached(\n Effect.uninterruptible(\n Effect.gen(function* () {\n observation = \"closed\";\n offers.clear();\n driver.invalidate();\n cleanup = yield* driver.close.pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.succeed(\"unconfirmed\" as const),\n }),\n Effect.catchCause(() => Effect.succeed(\"unconfirmed\" as const)),\n );\n\n return cleanup;\n }),\n ),\n );\n\n yield* Effect.addFinalizer(() =>\n close.pipe(\n Effect.flatMap((result) =>\n result === \"unconfirmed\"\n ? Effect.logWarning(\"Protected browser exact-session closure unconfirmed\")\n : Effect.void,\n ),\n ),\n );\n\n const remote = <A, R>(effect: Effect.Effect<A, ProtectedTransportError, R>) =>\n effect.pipe(Effect.mapError((error) => fail(error.reason)));\n\n const decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => fail(\"provider\")));\n\n const caller = access.caller.pipe(Effect.mapError((error) => fail(error.reason)));\n const pageContext = remote(driver.context);\n\n const permitObservation = Effect.gen(function* () {\n const context = yield* pageContext;\n let origins: ReadonlyArray<typeof CredentialOrigin.Type> | undefined;\n\n if (exposures.length > 0) {\n observation = \"protected\";\n const principal = yield* caller;\n\n const rawDecision = yield* access\n .observation({ ...context, caller: principal, exposures: [...exposures] })\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n\n const decision = yield* Schema.decodeEffect(CredentialObservationDecision)(\n rawDecision,\n ).pipe(Effect.mapError(() => fail(\"observation-blocked\")));\n\n if (decision === \"deny\") return yield* fail(\"observation-blocked\");\n if (typeof decision !== \"string\") {\n origins = [...decision.origins];\n if (!origins.includes(context.topOrigin)) return yield* fail(\"observation-blocked\");\n }\n observation = \"approved-after-exposure\";\n }\n yield* remote(driver.restrictObservation(origins));\n\n return {\n ...context,\n frameOrigins: context.frameOrigins.filter(\n (origin) => origins === undefined || origins.includes(origin),\n ),\n };\n });\n\n const target = (ref: string) => remote(driver.target(ref));\n\n const authorizeAction = Effect.fn(\"ProtectedBrowser.authorizeAction\")(function* (\n action: ProtectedBrowserAction,\n ) {\n if (access.authorizeAction === undefined) {\n if (action._tag === \"Submit\") return yield* fail(\"unsupported\");\n\n return;\n }\n const principal = yield* caller;\n\n yield* access\n .authorizeAction({ caller: principal, action, exposures: [...exposures] })\n .pipe(Effect.mapError((error) => fail(error.reason)));\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n if (action._tag !== \"Navigate\") {\n const current = yield* target(action.ref);\n\n if (\n !sameTarget(current.target, action.target) ||\n current.role !== (action._tag === \"Submit\" ? \"submit\" : action.role) ||\n (action._tag === \"Click\" && action.role === \"link\" && current.url !== action.url)\n )\n return yield* fail(\"stale-reference\");\n }\n }, Effect.withTracerEnabled(false));\n\n const bounded = <A>(result: A) => {\n const bytes = new TextEncoder().encode(JSON.stringify(result)).byteLength;\n\n return bytes <= policy.maxReturnedBytes\n ? Effect.succeed(result)\n : Effect.fail(fail(\"limit\"));\n };\n\n const run = <A>(effect: Effect.Effect<A, ProtectedBrowserError>) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n dispatch = \"not-dispatched\";\n milestone = \"none\";\n if (observation === \"closed\") return yield* fail(\"closed\");\n if (++actions > policy.maxActions) return yield* fail(\"limit\");\n\n const remaining =\n policy.maxElapsedMillis - ((yield* Clock.currentTimeMillis) - started);\n\n if (remaining <= 0) {\n yield* close;\n\n return yield* fail(\"timeout\");\n }\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: remaining,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) =>\n Effect.gen(function* () {\n // No foreign exception or defect is retained. Interrupted operations still finalize.\n const error = cause.reasons.find(\n (reason) =>\n reason._tag === \"Fail\" && Schema.is(ProtectedBrowserError)(reason.error),\n );\n\n const reason =\n error?._tag === \"Fail\" && Schema.is(ProtectedBrowserError)(error.error)\n ? error.error.reason\n : \"provider\";\n\n const interrupt = cause.reasons.some((reason) => reason._tag === \"Interrupt\");\n\n if (\n dispatch !== \"not-dispatched\" ||\n interrupt ||\n reason === \"provider\" ||\n reason === \"timeout\"\n )\n yield* close;\n if (interrupt) return yield* Effect.interrupt;\n\n return yield* fail(\n dispatch === \"possibly-dispatched\" && reason === \"provider\"\n ? \"outcome-unknown\"\n : reason,\n );\n }),\n ),\n Effect.onInterrupt(() => close),\n Effect.withTracerEnabled(false),\n );\n }),\n )\n .pipe(\n Effect.flatMap(\n Effect.fromOption(\n () =>\n new ProtectedBrowserError({\n reason: \"busy\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation,\n cleanup,\n }),\n ),\n ),\n );\n\n return {\n close,\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserNavigate)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n let url: URL;\n\n try {\n url = new URL(decoded.url);\n } catch {\n return yield* fail(\"denied\");\n }\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (policy.network._tag === \"ExactHosts\" &&\n !policy.network.allowedHosts.includes(url.host))\n )\n return yield* fail(\"denied\");\n if (exposures.length > 0) yield* permitObservation;\n yield* authorizeAction({ _tag: \"Navigate\", url: decoded.url });\n offers.clear();\n dispatch = \"possibly-dispatched\";\n yield* remote(driver.navigate(decoded.url));\n dispatch = \"dispatched\";\n yield* permitObservation;\n }),\n ),\n observe: run(\n Effect.gen(function* () {\n const before = yield* permitObservation;\n const result = yield* remote(driver.discover);\n const after = yield* permitObservation;\n\n if (\n before.document !== after.document ||\n result.document !== after.document ||\n result.topOrigin !== after.topOrigin\n )\n return yield* fail(\"stale-reference\");\n if (result.frameOrigins.some((origin) => !after.frameOrigins.includes(origin)))\n return yield* fail(\"observation-blocked\");\n\n return yield* bounded(\n ProtectedBrowserObservation.make({\n ...result,\n observation: exposures.length > 0 ? \"approved-after-exposure\" : \"before-exposure\",\n }),\n );\n }),\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserClick)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (\n control.role !== \"link\" &&\n control.role !== \"button\" &&\n control.role !== \"radio\" &&\n control.role !== \"checkbox\" &&\n control.role !== \"submit\"\n )\n return yield* fail(\"unsupported\");\n let action: ProtectedBrowserAction;\n\n if (control.role === \"link\") {\n if (control.url === undefined) return yield* fail(\"unsupported\");\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: \"link\",\n url: control.url,\n };\n } else if (control.role === \"submit\") {\n action = { _tag: \"Submit\", ref: decoded.ref, target: control.target };\n } else {\n action = {\n _tag: \"Click\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n };\n }\n yield* authorizeAction(action);\n dispatch = \"possibly-dispatched\";\n yield* remote(driver.click(decoded.ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"not-dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n if (control.role === \"submit\") milestone = \"submission-dispatched\";\n yield* permitObservation;\n }),\n ),\n fill: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.ref);\n\n if (control.role !== \"text\" && control.role !== \"select\")\n return yield* fail(\"unsupported\");\n yield* authorizeAction({\n _tag: \"Fill\",\n ref: decoded.ref,\n target: control.target,\n role: control.role,\n });\n yield* remote(\n driver.fill(decoded.ref, control.role, Redacted.make(decoded.value)),\n ).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"filled\";\n yield* permitObservation;\n }),\n ),\n listCredentialOffers: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(ListCredentialOffers)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n yield* permitObservation;\n const control = yield* target(decoded.target);\n\n if (kindFor(control.role) !== decoded.kind) return yield* fail(\"unsupported\");\n const principal = yield* caller;\n\n const candidates = yield* access\n .list({ caller: principal, kind: decoded.kind, target: control.target })\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n const now = yield* Clock.currentTimeMillis;\n\n for (const [ref, offer] of offers) if (offer.expires <= now) offers.delete(ref);\n if (candidates.length > 16 || offers.size + candidates.length > 64)\n return yield* fail(\"limit\");\n if (!sameTarget(control.target, (yield* target(decoded.target)).target))\n return yield* fail(\"stale-reference\");\n const expires = now + 60_000;\n const result: Array<CredentialOffer> = [];\n const pending: typeof offers = new Map();\n\n for (const candidate of candidates) {\n const metadata = yield* decode(CredentialOfferMetadata, candidate.metadata);\n\n const ref = yield* crypto.randomUUIDv4.pipe(\n Effect.mapError(() => fail(\"provider\")),\n );\n\n pending.set(ref, {\n caller: principal,\n key: candidate.key,\n target: control.target,\n targetRef: decoded.target,\n kind: decoded.kind,\n expires,\n });\n result.push(CredentialOffer.make({ ref, kind: decoded.kind, metadata }));\n }\n yield* bounded(result);\n for (const [ref, offer] of pending) offers.set(ref, offer);\n\n return result;\n }),\n ),\n useCredential: (request) =>\n run(\n Effect.gen(function* () {\n const decoded = yield* Schema.decodeEffect(UseCredential)(request).pipe(\n Effect.mapError(() => fail(\"denied\")),\n );\n\n const offer = offers.get(decoded.offer);\n\n if (offer === undefined || offer.expires <= (yield* Clock.currentTimeMillis))\n return yield* fail(\"stale-reference\");\n const principal = yield* caller;\n\n if (Redacted.value(principal) !== Redacted.value(offer.caller))\n return yield* fail(\"denied\");\n if (\n new Set(decoded.fields.map((field) => field.ref)).size !==\n decoded.fields.length ||\n new Set(decoded.fields.map((field) => field.role)).size !== decoded.fields.length\n )\n return yield* fail(\"denied\");\n\n const validate = Effect.gen(function* () {\n if (!sameTarget(offer.target, (yield* target(offer.targetRef)).target))\n return yield* fail(\"stale-reference\");\n for (const field of decoded.fields) {\n const current = yield* target(field.ref);\n\n if (\n field.role !== current.role ||\n kindFor(field.role) !== offer.kind ||\n !sameTarget(offer.target, current.target)\n )\n return yield* fail(\"denied\");\n }\n if (decoded.submit !== undefined) {\n const submit = yield* target(decoded.submit);\n\n if (submit.role !== \"submit\" || !sameTarget(offer.target, submit.target))\n return yield* fail(\"denied\");\n }\n });\n\n yield* validate;\n\n const authorization: CredentialUseAuthorization = {\n caller: principal,\n key: offer.key,\n kind: offer.kind,\n target: offer.target,\n roles: decoded.fields.map((field) => field.role),\n submit: decoded.submit !== undefined,\n };\n\n const authorize = Effect.gen(function* () {\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\n yield* access\n .authorize(authorization)\n .pipe(Effect.mapError((error) => fail(error.reason)));\n if (Redacted.value(yield* caller) !== Redacted.value(principal))\n return yield* fail(\"denied\");\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 offer.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const field of decoded.fields)\n if (secretFor(material, field.role) === undefined)\n return yield* fail(\"missing-credential\");\n offers.delete(decoded.offer);\n for (const field of decoded.fields) {\n yield* validate;\n yield* authorize;\n const value = secretFor(material, field.role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n observation = \"protected\";\n yield* remote(driver.fill(field.ref, field.role, value)).pipe(\n Effect.provideService(ProtectedBrowserDispatch, {\n mark: Effect.sync(() => {\n dispatch = \"possibly-dispatched\";\n if (!exposures.some((target) => sameTarget(target, offer.target)))\n exposures.push(offer.target);\n }),\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"partial-fill\";\n }\n milestone = \"filled\";\n if (decoded.submit !== undefined) {\n yield* validate;\n yield* authorize;\n const ref = decoded.submit;\n\n dispatch = \"possibly-dispatched\";\n yield* remote(driver.click(ref)).pipe(\n Effect.catch((error) => {\n if (error.reason === \"needs-attention\") dispatch = \"dispatched\";\n\n return Effect.fail(error);\n }),\n );\n dispatch = \"dispatched\";\n milestone = \"submission-dispatched\";\n }\n yield* permitObservation;\n\n return CredentialUseResult.make({\n dispatch,\n milestone,\n observation,\n cleanup,\n authentication: \"unverified\",\n });\n }),\n ),\n };\n }, Effect.withTracerEnabled(false));\n\n return { open };\n }),\n );\n","// This fixed program runs in an isolated world. Pages cannot replace its native DOM methods.\n// Handles retain actual nodes; a selector is never reconstructed from an opaque reference.\nexport const maxAttributeLength = 2048;\n\nexport const inspectFrame = `(() => {\n const doc = document;\n const forms = [];\n const isChoice = el => el instanceof HTMLInputElement && ['radio','checkbox'].includes(el.type);\n const presented = el => {\n if (el.closest('[hidden],[aria-hidden=\"true\"],[inert]') ||\n ['hidden','collapse'].includes(getComputedStyle(el).visibility)) return false;\n for (let parent = el; parent; parent = parent.parentElement) {\n if (getComputedStyle(parent).opacity === '0') return false;\n }\n return true;\n };\n const hasLayout = el => presented(el) &&\n [...el.getClientRects()].some(rect => rect.width > 0 && rect.height > 0);\n const available = el => el.type !== 'hidden' && !el.closest('[hidden],[aria-hidden=\"true\"],[inert]') &&\n (hasLayout(el) || (isChoice(el) && [...(el.labels ?? [])].some(hasLayout)));\n const elements = [...doc.querySelectorAll('input,textarea,select,button,a[href]')].filter(available).slice(0, 65);\n const labelText = el => {\n const label = el.labels?.[0]?.cloneNode(true);\n label?.querySelectorAll('input,textarea,select,script,style,noscript').forEach(child => child.remove());\n return label?.textContent ?? el.getAttribute('aria-label');\n };\n const describe = (el) => {\n if (doc !== document || !el.isConnected || el.ownerDocument !== doc || !available(el)) return null;\n const form = el.form ?? null;\n let formIndex = forms.indexOf(form);\n if (formIndex < 0) { formIndex = forms.length; forms.push(form); }\n // Resolved href (including path/query/fragment and base-URL changes) is part of the fingerprint.\n const action = el instanceof HTMLAnchorElement ? el.href : form ? (el.hasAttribute('formaction') ? el.formAction : form.action || doc.URL) : doc.URL;\n const method = form ? (el.hasAttribute('formmethod') ? el.formMethod : form.method) : '';\n const enctype = form?.enctype ?? '';\n const name = el.name ?? '';\n const completion = el.getAttribute('autocomplete') ?? '';\n const inputType = el.type ?? '';\n const choiceValue = isChoice(el) ? el.value : '';\n // Reject before parsing, fingerprinting or CDP transfer. Truncation could hide a target change.\n if ([action, method, enctype, name, completion, inputType, choiceValue].some(value => value.length > ${maxAttributeLength})) return null;\n const type = inputType.toLowerCase();\n const autocomplete = completion.trim().toLowerCase().split(/\\\\s+/).at(-1);\n const cardRoles = { 'cc-name':'card-name', 'cc-number':'card-number', 'cc-exp':'card-expiry',\n 'cc-exp-month':'card-expiry-month', 'cc-exp-year':'card-expiry-year', 'cc-csc':'card-security-code' };\n let role = 'unsupported';\n const nativeField = el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement;\n if (nativeField && !['submit','button'].includes(type) && !el.matches(':disabled') && !el.readOnly && !(el instanceof HTMLSelectElement && el.multiple)) {\n if (isChoice(el)) role = type;\n else if (type === 'password' || ['current-password','new-password','one-time-code'].includes(autocomplete)) {\n if (type === 'password' && form) role = 'password';\n } else if (['text','email','tel','number','month','search','url','date','time','week','datetime-local','textarea',''].includes(type) || el instanceof HTMLSelectElement) {\n if (cardRoles[autocomplete]) { if (form) role = cardRoles[autocomplete]; }\n else if (autocomplete === 'username' || autocomplete === 'email') { if (form) role = 'username'; }\n else if (['text','email'].includes(type) && form && form.querySelector('input[type=\"password\"]')) role = 'username';\n else if (el instanceof HTMLSelectElement) { if (!el.multiple) role = 'select'; }\n else role = 'text';\n }\n } else if (el instanceof HTMLButtonElement || (el instanceof HTMLInputElement && ['submit','button'].includes(type))) {\n if (!el.matches(':disabled')) role = type === 'submit' && form ? 'submit' : type === 'button' ? 'button' : 'unsupported';\n } else if (el instanceof HTMLAnchorElement) role = 'link';\n const fingerprint = JSON.stringify([role, action, method, enctype, name, completion, type, choiceValue]);\n return { role, formIndex, action, fingerprint, ...(isChoice(el) ? {checked: el.checked} : {}),\n label: (labelText(el) ?? (nativeField ? '' : el.textContent) ?? '').slice(0,200) };\n };\n const expose = ({role, formIndex, action, label, checked}) =>\n ({role, formIndex, action, label, ...(checked === undefined ? {} : {checked})});\n const original = elements.map(describe);\n const validate = (index) => {\n const current = describe(elements[index]);\n if (!current || !original[index] || current.fingerprint !== original[index].fingerprint ||\n current.formIndex !== original[index].formIndex) return null;\n return expose(current);\n };\n return {\n doc, elements, original: original.map(current => current && expose(current)), validate,\n text: () => {\n if (doc !== document) return null;\n if (!doc.body) return '';\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);\n const range = doc.createRange();\n let text = '';\n for (let node = walker.nextNode(); node && text.length < 65536; node = walker.nextNode()) {\n const parent = node.parentElement;\n if (!parent || parent.closest('input,textarea,select,script,style,noscript,iframe,object,embed')) continue;\n if (!presented(parent)) continue;\n range.selectNodeContents(node);\n if (![...range.getClientRects()].some(rect => rect.width > 0 && rect.height > 0)) continue;\n text += (node.textContent ?? '').replace(/\\\\s+/g, ' ') + ' ';\n }\n return text.slice(0,65536);\n },\n fill: (index, role, value) => {\n const current = validate(index);\n if (!current || current.role !== role) return false;\n const el = elements[index];\n if (role === 'select') {\n const options = [...el.options].filter(option => !option.matches(':disabled'));\n const values = options.filter(option => option.value === value);\n const matches = values.length > 0 ? values : options.filter(option => option.textContent?.trim() === value);\n if (matches.length !== 1) return 'unsupported';\n value = matches[0].value;\n if ([...el.options].filter(option => option.value === value).length !== 1) return 'unsupported';\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 false;\n // Validate and mutate in one isolated-world task, without focusing first and running\n // page handlers between validation and assignment. Native setters support controlled inputs.\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 true;\n },\n click: (index) => {\n const current = validate(index);\n if (!current || !['button','submit','link','radio','checkbox'].includes(current.role)) return false;\n if (current.role === 'submit' && elements[index].form && !elements[index].form.matches(':valid')) return 'needs-attention';\n elements[index].click();\n return true;\n }\n };\n})()`;\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport type { Browser, Frame, JSHandle, Page } from \"@cloudflare/puppeteer\";\nimport { type InteractiveBrowserPolicy } from \"@effect-agent/sandbox/InteractiveBrowser\";\nimport {\n CredentialOrigin,\n CredentialTarget,\n ProtectedBrowserControl,\n} from \"@effect-agent/sandbox/ProtectedBrowser\";\nimport { Clock, Context, Crypto, Effect, Redacted, Schema, type Scope } from \"effect\";\n\nimport { inspectFrame, maxAttributeLength } from \"./inspect-frame.ts\";\nimport {\n ProtectedBrowserDispatch,\n ProtectedTransportError,\n ProtectedDiscovery,\n ProtectedPageContext,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n// The pinned SDK implements this method but strips its internal declaration from lib/types.d.ts.\n// Keep the declaration narrow and refuse runtimes without it. No main-world fallback is safe.\ndeclare module \"@cloudflare/puppeteer\" {\n interface Frame {\n isolatedRealm(): { evaluateHandle(source: string): Promise<JSHandle<unknown>> };\n }\n}\n\nconst Description = Schema.Struct({\n role: ProtectedBrowserControl.fields.role,\n formIndex: Schema.Natural,\n action: Schema.String.check(Schema.isMaxLength(maxAttributeLength)),\n label: Schema.String.check(Schema.isMaxLength(200)),\n checked: Schema.optionalKey(Schema.Boolean),\n});\n\nconst Descriptions = Schema.Array(Schema.NullOr(Description)).check(Schema.isMaxLength(65));\n\ninterface FrameState {\n readonly frame: Frame;\n readonly handle: JSHandle<unknown>;\n readonly ref: string;\n readonly document: string;\n readonly forms: Map<number, string>;\n}\ninterface ControlState {\n readonly frame: FrameState;\n readonly index: number;\n readonly control: ProtectedBrowserControl;\n readonly expires: number;\n}\n\n/** One host-private acquired session. The SDK handles and exact-session cleanup have one owner. */\nexport class ProtectedNativeSession extends Context.Service<\n ProtectedNativeSession,\n {\n readonly browser: Browser;\n readonly page: Page;\n readonly close: Effect.Effect<\"confirmed\" | \"unconfirmed\">;\n }\n>()(\"@effect-agent/platform-cloudflare/ProtectedNativeSession\") {}\n\nconst transportError = (reason: ProtectedTransportError[\"reason\"]) =>\n new ProtectedTransportError({ reason });\n\nconst decode = <A>(schema: Schema.Codec<A>, value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => transportError(\"provider\")));\n\n// Attach rejection handling inside the SDK callback before workerd can report foreign diagnostics.\nconst 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: () => transportError(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(transportError(\"provider\")),\n ),\n );\n\n/** Host-private scoped transport. Session capabilities are requirements; policy is per-pass data. */\nexport const makeProtectedNativeTransport = Effect.fn(\"ProtectedNativeTransport.make\")(function* (\n policy: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n ProtectedBrowserTransport,\n never,\n ProtectedNativeSession | Crypto.Crypto | Scope.Scope\n> {\n const session = yield* ProtectedNativeSession;\n const { browser, page } = session;\n const crypto = yield* Crypto.Crypto;\n const clock = yield* Clock.Clock;\n const uuid = crypto.randomUUIDv4.pipe(Effect.mapError(() => transportError(\"provider\")));\n let closed = false;\n let violation = false;\n let documentRef: string | undefined;\n let observationOrigins: ReadonlySet<string> | undefined;\n const frames = new Map<Frame, FrameState>();\n const controls = new Map<string, ControlState>();\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 transportError(\"stale-reference\");\n if (!Schema.is(CredentialOrigin)(url.origin)) throw transportError(\"unsupported\");\n if (policy.network._tag === \"ExactHosts\" && !policy.network.allowedHosts.includes(url.host))\n throw transportError(\"stale-reference\");\n\n return url.origin;\n },\n catch: (cause) =>\n Schema.is(ProtectedTransportError)(cause) ? cause : transportError(\"provider\"),\n });\n\n const check = Effect.suspend(() =>\n closed || violation || !browser.isConnected()\n ? Effect.fail(transportError(\"stale-reference\"))\n : Effect.void,\n );\n\n const clear = () => {\n controls.clear();\n // Browser event callbacks only invalidate. The next Effect operation allocates the new identity.\n documentRef = undefined;\n };\n\n const onNavigated = () => {\n clear();\n };\n\n const onTarget = (target: { type(): string }) => {\n if (target.type() !== \"page\") return;\n // No popup or additional page may inherit an observation channel.\n violation = true;\n clear();\n };\n\n const invalidate = () => {\n closed = true;\n clear();\n };\n\n const observationFrames = Effect.gen(function* () {\n const list = page.frames();\n\n if (list.length > 32) return yield* transportError(\"unsupported\");\n\n // Opaque/blank child documents have no observation channel or credential targets.\n // The main document and every retained HTTPS child still require strict origin validation.\n return yield* Effect.filter(list, (frame) =>\n frame === page.mainFrame()\n ? Effect.succeed(true)\n : Effect.try({\n try: () => frame.url() !== \"\" && new URL(frame.url()).protocol === \"https:\",\n catch: () => transportError(\"provider\"),\n }),\n );\n });\n\n const context = Effect.gen(function* () {\n yield* check;\n const list = yield* observationFrames;\n const topOrigin = yield* origin(page.url());\n const frameOrigins = [...new Set(yield* Effect.forEach(list, (frame) => origin(frame.url())))];\n\n if (frameOrigins.length > 16) return yield* transportError(\"unsupported\");\n\n if (documentRef === undefined) documentRef = yield* uuid;\n\n return yield* decode(ProtectedPageContext, { document: documentRef, topOrigin, frameOrigins });\n });\n\n const isCurrent = Effect.fn(\"ProtectedNativeTransport.isCurrent\")(function* (state: FrameState) {\n if (state.frame.detached) return false;\n\n return yield* remote(() =>\n state.handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.get(held, \"doc\") === Reflect.get(globalThis, \"document\");\n }),\n );\n });\n\n const get = Effect.fn(\"ProtectedNativeTransport.get\")(function* (ref: string) {\n yield* check;\n const state = controls.get(ref);\n\n if (\n !state ||\n (observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)) ||\n state.expires <= (yield* clock.currentTimeMillis) ||\n !(yield* isCurrent(state.frame))\n )\n return yield* transportError(\"stale-reference\");\n\n const current = yield* remote(() =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"validate\"), held, [index]);\n }, state.index),\n );\n\n const description = yield* decode(Schema.NullOr(Description), current);\n\n if (description === null) return yield* transportError(\"stale-reference\");\n const ctx = yield* context;\n\n if (\n ctx.topOrigin !== state.control.target.topOrigin ||\n (yield* origin(state.frame.frame.url())) !== state.control.target.frameOrigin ||\n (yield* origin(description.action)) !== state.control.target.recipientOrigin ||\n description.role !== state.control.role\n )\n return yield* transportError(\"stale-reference\");\n\n return state;\n });\n\n const close = yield* Effect.cached(\n Effect.gen(function* () {\n invalidate();\n\n return yield* session.close;\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n page.off(\"framenavigated\", onNavigated);\n page.off(\"framedetached\", onNavigated);\n browser.off(\"targetcreated\", onTarget);\n // Handles die with the exact session. Do not block remote termination on local disposal.\n frames.clear();\n }),\n ),\n ),\n );\n\n yield* Effect.acquireRelease(\n Effect.sync(() => {\n page.on(\"framenavigated\", onNavigated);\n page.on(\"framedetached\", onNavigated);\n browser.on(\"targetcreated\", onTarget);\n }),\n () => close,\n );\n\n return {\n restrictObservation: Effect.fn(\"ProtectedNativeTransport.restrictObservation\")(\n function* (origins) {\n yield* check;\n observationOrigins =\n origins === undefined\n ? undefined\n : new Set(yield* decode(Schema.Array(CredentialOrigin), origins));\n // A later grant expansion must not revive previously excluded references.\n for (const [ref, state] of controls)\n if (\n observationOrigins !== undefined &&\n !observationOrigins.has(state.control.target.frameOrigin)\n )\n controls.delete(ref);\n },\n ),\n context,\n invalidate,\n close,\n navigate: Effect.fn(\"ProtectedNativeTransport.navigate\")(function* (url) {\n yield* check;\n yield* origin(url);\n clear();\n yield* remote(() => page.goto(url, { waitUntil: \"load\" }));\n yield* context;\n }),\n target: (ref) => get(ref).pipe(Effect.map((state) => state.control)),\n discover: Effect.gen(function* () {\n const before = yield* context;\n\n controls.clear();\n for (const state of frames.values()) yield* remote(() => state.handle.dispose());\n frames.clear();\n const discovered: Array<ProtectedBrowserControl> = [];\n let text = \"\";\n let truncated = false;\n const frameOrigins = new Set<string>();\n\n for (const frame of yield* observationFrames) {\n const frameOrigin = yield* origin(frame.url());\n\n if (observationOrigins !== undefined && !observationOrigins.has(frameOrigin)) continue;\n frameOrigins.add(frameOrigin);\n if (typeof frame.isolatedRealm !== \"function\") return yield* transportError(\"unsupported\");\n const handle = yield* remote(() => frame.isolatedRealm().evaluateHandle(inspectFrame));\n\n const state: FrameState = {\n frame,\n handle,\n ref: yield* uuid,\n document: yield* uuid,\n forms: new Map(),\n };\n\n frames.set(frame, state);\n\n const raw = yield* remote(() =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.get(held, \"original\");\n }),\n );\n\n const descriptions = yield* decode(Descriptions, raw);\n\n for (let index = 0; index < descriptions.length; index++) {\n const desc = descriptions[index];\n\n if (!desc) continue;\n if (discovered.length === 64) {\n truncated = true;\n break;\n }\n let form = state.forms.get(desc.formIndex);\n\n if (form === undefined) {\n form = yield* uuid;\n state.forms.set(desc.formIndex, form);\n }\n // Unsupported destinations/controls are not offered as credential targets.\n const recipient = yield* origin(desc.action).pipe(Effect.result);\n\n if (recipient._tag === \"Failure\") continue;\n\n const control = ProtectedBrowserControl.make({\n ref: yield* uuid,\n role: desc.role,\n label: desc.label,\n ...(desc.checked === undefined ? {} : { checked: desc.checked }),\n ...(desc.role === \"link\" ? { url: desc.action } : {}),\n target: CredentialTarget.make({\n topOrigin: before.topOrigin,\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: recipient.success,\n document: state.document,\n frame: state.ref,\n form,\n }),\n });\n\n controls.set(control.ref, {\n frame: state,\n index,\n control,\n expires: (yield* clock.currentTimeMillis) + 60_000,\n });\n discovered.push(control);\n }\n\n const rawText = yield* remote(() =>\n handle.evaluate((held) => {\n if (typeof held !== \"object\" || held === null) return null;\n\n return Reflect.apply(Reflect.get(held, \"text\"), held, []);\n }),\n );\n\n text += yield* decode(Schema.String.check(Schema.isMaxLength(65536)), rawText);\n if (text.length > 65536) {\n text = text.slice(0, 65536);\n truncated = true;\n }\n }\n if ((yield* context).document !== before.document)\n return yield* transportError(\"stale-reference\");\n\n return yield* decode(ProtectedDiscovery, {\n ...before,\n frameOrigins: [...frameOrigins],\n text,\n controls: discovered,\n truncated,\n });\n }),\n fill: Effect.fn(\"ProtectedNativeTransport.fill\")(function* (ref, role, value) {\n const dispatch = yield* ProtectedBrowserDispatch;\n const state = yield* get(ref);\n\n // CDP dispatch may mutate before its reply is lost, so uncertainty starts here.\n yield* dispatch.mark;\n\n const filled = yield* remote(() =>\n state.frame.handle.evaluate(\n (held, index, expectedRole, secret) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"fill\"), held, [index, expectedRole, secret]);\n },\n state.index,\n role,\n Redacted.value(value),\n ),\n );\n\n if (filled === \"unsupported\") return yield* transportError(\"unsupported\");\n if (filled !== true) return yield* transportError(\"stale-reference\");\n }),\n click: Effect.fn(\"ProtectedNativeTransport.click\")(function* (ref) {\n const state = yield* get(ref);\n\n const clicked = yield* remote(() =>\n state.frame.handle.evaluate((held, index) => {\n if (typeof held !== \"object\" || held === null) return false;\n\n return Reflect.apply(Reflect.get(held, \"click\"), held, [index]);\n }, state.index),\n );\n\n if (clicked === \"needs-attention\") return yield* transportError(\"needs-attention\");\n if (clicked !== true) return yield* transportError(\"stale-reference\");\n }),\n };\n}, Effect.withTracerEnabled(false));\n","/// <reference types=\"@cloudflare/workers-types\" />\nimport puppeteer, { type Browser } from \"@cloudflare/puppeteer\";\nimport { type InteractiveBrowserPolicy } from \"@effect-agent/sandbox/InteractiveBrowser\";\nimport { ProtectedBrowserError } from \"@effect-agent/sandbox/ProtectedBrowser\";\nimport { Clock, Context, Crypto, Effect, Layer, Redacted, Schema, type Scope } from \"effect\";\n\nimport { BrowserRunSessionLifecycle } from \"../internal/browser-session-lifecycle.ts\";\nimport { makeProtectedNativeTransport, ProtectedNativeSession } from \"./native.ts\";\nimport {\n BrowserRunProtectedTransport,\n ProtectedTransportError,\n type ProtectedBrowserTransport,\n} from \"./policy.ts\";\n\n/**\n * Acquires through BROWSER with recording=false explicitly on the wire. The trusted provider's\n * documented opt-in semantics are the recording guarantee; no recording-status API exists.\n * Account operators remain trusted, and must not attach external observers to private passes.\n */\nexport const browserRunProtectedBindingLayer = (options: {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}) =>\n Layer.effect(BrowserRunProtectedTransport)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const crypto = yield* Crypto.Crypto;\n\n const open = Effect.fn(\"BrowserRunProtectedTransport.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<ProtectedBrowserTransport, ProtectedBrowserError, Scope.Scope> {\n const failure = () =>\n new ProtectedBrowserError({\n reason: \"provider\",\n dispatch: \"not-dispatched\",\n milestone: \"none\",\n observation: \"closed\",\n cleanup: \"unconfirmed\",\n });\n\n let sessionId: Redacted.Redacted<string> | undefined;\n let browser: Browser | undefined;\n let driver: ProtectedBrowserTransport | undefined;\n let invalid = false;\n // SDK acquisition may finish after interruption. Its late-reply callback must await cleanup,\n // using this pass's clock rather than starting an Effect runtime with default services.\n const runCleanup = Effect.runPromiseWith(Context.make(Clock.Clock, yield* Clock.Clock));\n\n const terminate = Effect.gen(function* () {\n invalid = true;\n driver?.invalidate();\n if (sessionId === undefined) return \"unconfirmed\" as const;\n\n const cleanup = yield* lifecycle.close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause(() => Effect.succeed(\"unconfirmed\" as const)),\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.succeed(\"unconfirmed\" as const),\n }),\n );\n\n // Local disconnect is not remote-closure evidence. Do it even when confirmation fails.\n const connected = browser;\n\n if (connected !== undefined)\n yield* Effect.promise(() => connected.disconnect()).pipe(\n Effect.catchCause(() => Effect.void),\n Effect.interruptible,\n Effect.timeoutOrElse({ duration: \"1 second\", orElse: () => Effect.void }),\n );\n\n return cleanup;\n });\n\n const close = yield* Effect.cached(terminate);\n\n yield* Effect.addFinalizer(() =>\n close.pipe(\n Effect.flatMap((state) =>\n state === \"confirmed\"\n ? Effect.void\n : Effect.logWarning(\"Protected browser exact-session closure unconfirmed\"),\n ),\n ),\n );\n\n const acquired = yield* Effect.tryPromise({\n try: async (signal) => {\n let recordingDisabled = false;\n\n const binding = {\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const request = new Request(input, init);\n const url = new URL(request.url);\n\n if (url.pathname === \"/v1/devtools/browser\" && request.method === \"POST\") {\n url.searchParams.set(\"recording\", \"false\");\n recordingDisabled = url.searchParams.get(\"recording\") === \"false\";\n\n return options.browser.fetch(new Request(url, request));\n }\n\n return options.browser.fetch(request);\n },\n };\n\n const acquired = await puppeteer.acquire(binding, {\n recording: false,\n // Provider inactivity timeout, independent of the finite total pass deadline.\n keep_alive: Math.min(600_000, Math.max(10_000, policy.maxElapsedMillis)),\n });\n\n sessionId = Redacted.make(\n Schema.decodeSync(Schema.String.check(Schema.isUUID()))(acquired.sessionId),\n );\n if (!recordingDisabled || signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n // Initial attachment only. No recovery/reconnection path exists.\n browser = await puppeteer.connect(options.browser, acquired.sessionId);\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n const context = await browser.createBrowserContext();\n const page = await context.newPage();\n\n await page.setBypassServiceWorker(true);\n await page.setRequestInterception(true);\n page.on(\"request\", (request) => {\n let allowed = policy.network._tag === \"Unrestricted\";\n\n try {\n const url = new URL(request.url());\n\n allowed ||=\n policy.network._tag === \"ExactHosts\" &&\n url.protocol === \"https:\" &&\n !url.username &&\n !url.password &&\n policy.network.allowedHosts.includes(url.host);\n } catch {\n /* Refuse malformed destinations. */\n }\n void (\n allowed && !invalid ? request.continue() : request.abort(\"blockedbyclient\")\n ).catch(() => {\n invalid = true;\n driver?.invalidate();\n });\n });\n if (signal.aborted || invalid) {\n await runCleanup(terminate);\n throw new ProtectedTransportError({ reason: \"stale-reference\" });\n }\n\n return ProtectedNativeSession.of({ browser, page, close });\n },\n catch: failure,\n }).pipe(\n Effect.timeoutOrElse({\n duration: Math.min(policy.maxElapsedMillis, 30_000),\n orElse: () =>\n Effect.fail(new ProtectedBrowserError({ ...failure(), reason: \"timeout\" })),\n }),\n Effect.catch((error) =>\n close.pipe(\n Effect.flatMap((cleanup) =>\n Effect.fail(new ProtectedBrowserError({ ...error, cleanup })),\n ),\n ),\n ),\n );\n\n driver = yield* makeProtectedNativeTransport(policy).pipe(\n Effect.provideService(ProtectedNativeSession, acquired),\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n return driver;\n }, Effect.withTracerEnabled(false));\n\n return { open };\n }),\n );\n"],"mappings":"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"}
|
|
@@ -155,12 +155,10 @@ interface ThreadPublicationOptions<E = never, R = never, P = never> {
|
|
|
155
155
|
* Tool, Schema, and model requirements remain visible until satisfied by Layer composition.
|
|
156
156
|
* Use Layer.unwrap for registration values that need effectful application setup.
|
|
157
157
|
*/
|
|
158
|
-
declare const registeredLayer: <const Entries extends ReadonlyArray<AgentRegistration>, E = never, R = never>(registrations: Entries, options?: ThreadPublicationOptions<E, R>) => Layer.Layer<CloudflareDurableRuntimeServices, E | DigestError | MessageDeliveryError | DoStorageInitializationError, DurableObjectContext | ThreadObjectNamespace | Exclude<R, SqlClient | SubmissionLedger | ThreadStore> | Exclude<[Entries[number]] extends [never] ? never :
|
|
159
|
-
readonly attemptLayer: (context: import("@effect-agent/thread/AgentRegistration").AgentAttemptContext) => Layer.Layer<infer Provides, never, infer Requires>;
|
|
160
|
-
} ? Requires | Exclude<T_3 extends (infer T_4) ? T_4 extends T_3 ? T_4 extends {
|
|
158
|
+
declare const registeredLayer: <const Entries extends ReadonlyArray<AgentRegistration>, E = never, R = never>(registrations: Entries, options?: ThreadPublicationOptions<E, R>) => Layer.Layer<CloudflareDurableRuntimeServices, E | DigestError | MessageDeliveryError | DoStorageInitializationError, DurableObjectContext | ThreadObjectNamespace | Exclude<R, SqlClient | SubmissionLedger | ThreadStore> | Exclude<[Entries[number]] extends [never] ? never : Entries[number] extends (infer T_3) ? T_3 extends Entries[number] ? T_3 extends unknown ? (("attemptLayer" extends keyof T_3 ? T_3[keyof T_3 & "attemptLayer"] : undefined) extends (infer T_4) ? T_4 extends ("attemptLayer" extends keyof T_3 ? T_3[keyof T_3 & "attemptLayer"] : undefined) ? T_4 extends ((context: import("@effect-agent/thread/AgentRegistration").AgentAttemptContext) => Layer.Layer<infer Provides, never, infer Requires>) ? Requires | Exclude<T_3 extends {
|
|
161
159
|
readonly agent: infer A extends import("@effect-agent/thread/AgentRegistration").ExecutableAgentBinding;
|
|
162
|
-
} ? import("@effect-agent/thread/DurableAgentRuntime").DurableWorkerRequirements<A> :
|
|
163
|
-
readonly agent: infer D extends import("@effect-agent/core/Agent").Definition<Schema.Top, Schema.Top, unknown, import("effect/unstable/ai/Toolkit").Any, import("@effect-agent/core/Agent").RunDispositionDeclaration<never, Schema.Top> | undefined, unknown> & {
|
|
160
|
+
} ? import("@effect-agent/thread/DurableAgentRuntime").DurableWorkerRequirements<A> : T_3 extends {
|
|
161
|
+
readonly agent: infer D extends import("@effect-agent/core/Agent").Definition<Schema.Top, Schema.Top, unknown, import("effect/unstable/ai/Toolkit").Any, import("@effect-agent/core/Agent").RunDispositionDeclaration<never, Schema.Top> | undefined, unknown, Schema.Top | undefined> & {
|
|
164
162
|
readonly instructions: import("@effect-agent/core/Agent").InstructionSource<never, unknown, unknown>;
|
|
165
163
|
readonly inputPrompt?: import("@effect-agent/core/Agent").InputPromptSource<never, unknown, unknown> | undefined;
|
|
166
164
|
};
|
|
@@ -168,10 +166,10 @@ declare const registeredLayer: <const Entries extends ReadonlyArray<AgentRegistr
|
|
|
168
166
|
} ? import("@effect-agent/thread/DurableAgentRuntime").DurableWorkerRequirements<{
|
|
169
167
|
readonly definition: D;
|
|
170
168
|
readonly model: M;
|
|
171
|
-
}> : never
|
|
169
|
+
}> : never, Provides> : T_3 extends {
|
|
172
170
|
readonly agent: infer A extends import("@effect-agent/thread/AgentRegistration").ExecutableAgentBinding;
|
|
173
171
|
} ? import("@effect-agent/thread/DurableAgentRuntime").DurableWorkerRequirements<A> : T_3 extends {
|
|
174
|
-
readonly agent: infer D extends import("@effect-agent/core/Agent").Definition<Schema.Top, Schema.Top, unknown, import("effect/unstable/ai/Toolkit").Any, import("@effect-agent/core/Agent").RunDispositionDeclaration<never, Schema.Top> | undefined, unknown> & {
|
|
172
|
+
readonly agent: infer D extends import("@effect-agent/core/Agent").Definition<Schema.Top, Schema.Top, unknown, import("effect/unstable/ai/Toolkit").Any, import("@effect-agent/core/Agent").RunDispositionDeclaration<never, Schema.Top> | undefined, unknown, Schema.Top | undefined> & {
|
|
175
173
|
readonly instructions: import("@effect-agent/core/Agent").InstructionSource<never, unknown, unknown>;
|
|
176
174
|
readonly inputPrompt?: import("@effect-agent/core/Agent").InputPromptSource<never, unknown, unknown> | undefined;
|
|
177
175
|
};
|
|
@@ -179,9 +177,7 @@ declare const registeredLayer: <const Entries extends ReadonlyArray<AgentRegistr
|
|
|
179
177
|
} ? import("@effect-agent/thread/DurableAgentRuntime").DurableWorkerRequirements<{
|
|
180
178
|
readonly definition: D;
|
|
181
179
|
readonly model: M;
|
|
182
|
-
}> : never : never : never) | (
|
|
183
|
-
readonly reporting: infer Reports extends ReadonlyArray<import("@effect-agent/engine/SubagentHost").WorkerReporting<unknown, unknown>>;
|
|
184
|
-
} ? [Reports[number]] extends [never] ? never : Reports[number] extends import("@effect-agent/engine/SubagentHost").WorkerReporting<unknown, infer R_1> ? Exclude<R_1, import("effect/Scope").Scope> : never : never : never : never), import("effect/Scope").Scope> | CloudflareBootstrapServices>;
|
|
180
|
+
}> : never : never : never) | ("reporting" extends keyof T_3 ? T_3[keyof T_3 & "reporting"] extends (infer T_5) ? T_5 extends T_3[keyof T_3 & "reporting"] ? T_5 extends readonly import("@effect-agent/engine/SubagentHost").WorkerReporting<unknown, unknown>[] ? [T_5[number]] extends [never] ? never : T_5[number] extends import("@effect-agent/engine/SubagentHost").WorkerReporting<unknown, infer R_1> ? Exclude<R_1, import("effect/Scope").Scope> : never : never : never : never : never) : never : never : never, import("effect/Scope").Scope> | CloudflareBootstrapServices>;
|
|
185
181
|
/** Preserve additional index services only when a projection Layer is actually supplied. */
|
|
186
182
|
declare function layer<const Entries extends ReadonlyArray<AgentRegistration>, E = never, R = never, P = never, PE = never, PR = never>(registrations: Entries, options: Omit<ThreadPublicationOptions<E, R>, "projection"> & {
|
|
187
183
|
readonly projection: Layer.Layer<ThreadProjectionMaintenance | P, PE, PR>;
|
|
@@ -723,7 +719,7 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
723
719
|
readonly cause?: Schema.Json | undefined;
|
|
724
720
|
} | {
|
|
725
721
|
readonly _tag: "DurableRuntimeFailpointError";
|
|
726
|
-
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" | "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";
|
|
722
|
+
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";
|
|
727
723
|
} | {
|
|
728
724
|
readonly _tag: "FenceRejected";
|
|
729
725
|
readonly threadId: string;
|
|
@@ -813,4 +809,4 @@ interface Class<EventServices = never> {
|
|
|
813
809
|
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>;
|
|
814
810
|
//#endregion
|
|
815
811
|
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 };
|
|
816
|
-
//# sourceMappingURL=ThreadObject-
|
|
812
|
+
//# sourceMappingURL=ThreadObject-DZMkwIBh.d.mts.map
|
|
@@ -58,14 +58,16 @@ const guardedMessageDeliveryStoreLayer = Layer.effect(MessageDeliveryStore, Effe
|
|
|
58
58
|
return current;
|
|
59
59
|
}));
|
|
60
60
|
return MessageDeliveryStore.of({
|
|
61
|
+
limits: store.limits,
|
|
62
|
+
maxStoredValueBytes: store.maxStoredValueBytes,
|
|
61
63
|
insert: (record) => local(record.key.ownerThreadId, mutate(store.insert(record)).pipe(Effect.tap(() => wakes.notify(record.key.ownerThreadId)))),
|
|
62
64
|
get: (key) => local(key.ownerThreadId, store.get(key)),
|
|
63
65
|
list: (request) => local(request.ownerThreadId, store.list(request)),
|
|
64
66
|
change: (key, change) => local(key.ownerThreadId, mutate(store.change(key, change))),
|
|
65
|
-
due: (nowMillis, limit, owner) => local(owner, store.due(nowMillis, limit, owner)).pipe(Effect.
|
|
67
|
+
due: (nowMillis, limit, owner) => local(owner, store.due(nowMillis, limit, owner)).pipe(Effect.filterOrFail((keys) => keys.every((key) => ownsThread(key.ownerThreadId)), () => MessageDeliveryError.make({
|
|
66
68
|
reason: "validation",
|
|
67
69
|
operation: "message owner"
|
|
68
|
-
})))
|
|
70
|
+
}))),
|
|
69
71
|
nextDeadline: (owner) => local(owner, owner === void 0 ? nextDeadline : store.nextDeadline(owner))
|
|
70
72
|
});
|
|
71
73
|
}));
|
|
@@ -830,4 +832,4 @@ const make = (applicationLayer, options) => {
|
|
|
830
832
|
//#endregion
|
|
831
833
|
export { layer as C, layerInHost as E, ThreadObjectPorts as S, layerHostConfig as T, encodeAdminResponse as _, AdminVerifyRequest as a, portCall as b, RetryExecuted as c, VerifiedIntegrity as d, decodeAdminExplainRequest as f, decodeRetryCommand as g, decodeObligationThresholds as h, AdminResponse as i, ThreadObject_exports as l, decodeAdminVerifyRequest as m, AdminFailed as n, ExplainedRecovery as o, decodeAdminResponse as p, AdminFailure as r, ObligationsScanned as s, AdminExplainRequest as t, ThreadRpcOperation as u, handleRpc as v, layerConfig as w, submit as x, make as y };
|
|
832
834
|
|
|
833
|
-
//# sourceMappingURL=ThreadObject-
|
|
835
|
+
//# sourceMappingURL=ThreadObject-gyx8Qq03.mjs.map
|