@effect-agent/platform-cloudflare 0.1.0-beta.130 → 0.1.0-beta.131

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import { BrowserCredentialAccess, CredentialFillError, CredentialFillResult, FillCredentialRequest } from "./BrowserCredentials.mjs";
2
2
  import { A as BrowserRunSessionLifecycle, O as BrowserRunCleanupError, _ as BrowserRunLiveViewRequest, i as BrowserRunHandoffState, k as BrowserRunLifecycleOptions, n as BrowserRunHandoffRequest, r as BrowserRunHandoffResult, v as BrowserRunLiveViewResult } from "./InteractiveBrowser-BnqY_Y-F.mjs";
3
3
  import { Cause, Context, Effect, ErrorReporter, Layer, Redacted, Schema, Scope } from "effect";
4
+ import { HttpClient } from "effect/unstable/http";
4
5
  import { Browser, Page } from "puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js";
5
6
  //#region src/internal/browser-failure.d.ts
6
7
  declare const BrowserRunFailure_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
@@ -34,6 +35,15 @@ declare const BrowserRunBinding_base: Context.ServiceClass<BrowserRunBinding, "@
34
35
  declare class BrowserRunBinding extends BrowserRunBinding_base {
35
36
  static layer(browser: Pick<BrowserRun, "fetch">): Layer.Layer<BrowserRunBinding, never, never>;
36
37
  }
38
+ //#endregion
39
+ //#region src/internal/browser-readonly-live-view.d.ts
40
+ declare const BrowserRunReadonlyLiveView_base: Context.ServiceClass<BrowserRunReadonlyLiveView, "@effect-agent/platform-cloudflare/internal/BrowserRunReadonlyLiveView", {
41
+ readonly mint: (sessionId: Redacted.Redacted<string>, targetId: Redacted.Redacted<string>, request: BrowserRunLiveViewRequest) => Effect.Effect<BrowserRunLiveViewResult, BrowserRunFailure>;
42
+ }>;
43
+ /** Only the REST endpoint can mint provider-enforced read-only connections. */
44
+ declare class BrowserRunReadonlyLiveView extends BrowserRunReadonlyLiveView_base {
45
+ static layer(options: BrowserRunLifecycleOptions): Layer.Layer<BrowserRunReadonlyLiveView, never, HttpClient.HttpClient>;
46
+ }
37
47
  declare namespace BrowserSession_d_exports {
38
48
  export { BrowserRunHandoffRequest, BrowserRunHandoffResult, BrowserRunHandoffState, BrowserRunLiveViewRequest, BrowserRunLiveViewResult, BrowserSession, BrowserSessionError, BrowserSessionOptions, BrowserSessionReference, BrowserSessions, BrowserSessionsOptions };
39
49
  }
@@ -81,6 +91,12 @@ interface BrowserSession {
81
91
  readonly fillCredential: (request: FillCredentialRequest) => Effect.Effect<CredentialFillResult, CredentialFillError | BrowserSessionError, BrowserCredentialAccess>;
82
92
  readonly handoff: <E, R>(authorize: Effect.Effect<void, E, R>, request: BrowserRunHandoffRequest) => Effect.Effect<BrowserRunHandoffResult, E | BrowserSessionError, R>;
83
93
  readonly getLiveView: <E, R>(authorize: Effect.Effect<void, E, R>, request: BrowserRunLiveViewRequest) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;
94
+ /**
95
+ * Mint a provider-enforced read-only connection to this exact page. Requires REST credentials;
96
+ * missing read-only confirmation fails closed, never falling back to an interactive URL.
97
+ * Expiry limits new connections, not established connections or access to visible page data.
98
+ */
99
+ readonly getReadOnlyLiveView: <E, R>(authorize: Effect.Effect<void, E, R>, request: BrowserRunLiveViewRequest) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;
84
100
  readonly getHandoffState: <E, R>(authorize: Effect.Effect<void, E, R>) => Effect.Effect<BrowserRunHandoffState, E | BrowserSessionError, R>;
85
101
  }
86
102
  interface BrowserSessionsOptions extends BrowserRunLifecycleOptions {
@@ -101,9 +117,9 @@ declare const BrowserSessions_base: Context.ServiceClass<BrowserSessions, "@effe
101
117
  }>;
102
118
  /** Native Cloudflare sessions; no framework browser workflow, checkpoint transfer, or observation policy. */
103
119
  declare class BrowserSessions extends BrowserSessions_base {
104
- static readonly layerNoDeps: Layer.Layer<BrowserSessions, never, BrowserRunBinding | BrowserRunSessionLifecycle>;
120
+ static readonly layerNoDeps: Layer.Layer<BrowserSessions, never, BrowserRunBinding | BrowserRunReadonlyLiveView | BrowserRunSessionLifecycle>;
105
121
  static layer(options: BrowserSessionsOptions): Layer.Layer<BrowserSessions, BrowserRunCleanupError, import("effect/unstable/http/HttpClient").HttpClient>;
106
122
  }
107
123
  //#endregion
108
124
  export { BrowserSession_d_exports as a, BrowserSessionReference as i, BrowserSessionError as n, BrowserSessions as o, BrowserSessionOptions as r, BrowserSessionsOptions as s, BrowserSession as t };
109
- //# sourceMappingURL=BrowserSession-DxCN-5F9.d.mts.map
125
+ //# sourceMappingURL=BrowserSession-DP6b-cpL.d.mts.map
@@ -1,7 +1,8 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { BrowserCredentialAccess, CardCredential, CredentialFillError, CredentialFillResult, CredentialOrigin, CredentialTarget, FillCredentialRequest, LoginCredential } from "./BrowserCredentials.mjs";
3
- import { b as reportBrowserCause, c as BrowserRunLiveViewResult, n as BrowserRunHandoffResult, r as BrowserRunHandoffState, s as BrowserRunLiveViewRequest, t as BrowserRunHandoffRequest, v as BrowserRunSessionLifecycle, x as reportedBrowserError, y as BrowserRunBinding } from "./InteractiveBrowser-D-xxDv_f.mjs";
4
- import { Cause, Clock, Context, Effect, Exit, Layer, Redacted, Schema, Scope, Semaphore } from "effect";
3
+ import { C as reportedBrowserError, S as reportBrowserCause, b as BrowserRunFailure, c as BrowserRunLiveViewResult, n as BrowserRunHandoffResult, r as BrowserRunHandoffState, s as BrowserRunLiveViewRequest, t as BrowserRunHandoffRequest, v as BrowserRunSessionLifecycle, x as browserFailure, y as BrowserRunBinding } from "./InteractiveBrowser-CxFT-Nwm.mjs";
4
+ import { Cause, Clock, Context, Effect, Exit, Layer, Redacted, Schema, Scope, Semaphore, Stream } from "effect";
5
+ import { FetchHttpClient, HttpClient, HttpClientRequest } from "effect/unstable/http";
5
6
  //#region src/internal/browser-credentials.ts
6
7
  /** Supplied only under the attachment lock, with the remaining command/session budget. */
7
8
  var BrowserSessionPage = class extends Context.Service()("@effect-agent/platform-cloudflare/internal/BrowserSessionPage") {};
@@ -206,6 +207,63 @@ const fillCredential = Effect.fnUntraced(function* (input) {
206
207
  }), Effect.withTracerEnabled(false));
207
208
  });
208
209
  //#endregion
210
+ //#region src/internal/browser-readonly-live-view.ts
211
+ const Identity = Schema.Struct({
212
+ sessionId: Schema.String.check(Schema.isUUID()),
213
+ targetId: Schema.NonEmptyString.check(Schema.isMaxLength(256))
214
+ });
215
+ const Reply = Schema.fromJsonString(Schema.Struct({
216
+ id: Identity.fields.targetId,
217
+ options: Schema.Struct({
218
+ mode: Schema.Literal("tab"),
219
+ guardrails: Schema.Struct({ mode: Schema.Literal("readonly") })
220
+ }),
221
+ devtoolsFrontendUrl: Schema.String
222
+ }));
223
+ const operation = "session.readonlyLiveView";
224
+ /** Only the REST endpoint can mint provider-enforced read-only connections. */
225
+ var BrowserRunReadonlyLiveView = class extends Context.Service()("@effect-agent/platform-cloudflare/internal/BrowserRunReadonlyLiveView") {
226
+ static layer(options) {
227
+ return Layer.effect(this, Effect.gen(function* () {
228
+ const client = yield* HttpClient.HttpClient;
229
+ return { mint: Effect.fnUntraced(function* (sessionId, targetId, request) {
230
+ const identity = yield* Schema.decodeEffect(Identity)({
231
+ sessionId: Redacted.value(sessionId),
232
+ targetId: Redacted.value(targetId)
233
+ });
234
+ const input = yield* Schema.decodeEffect(BrowserRunLiveViewRequest)(request);
235
+ const response = yield* client.execute(HttpClientRequest.post(`https://api.cloudflare.com/client/v4/accounts/${options.accountId}/browser-rendering/devtools/browser/${identity.sessionId}/live_view`).pipe(HttpClientRequest.bearerToken(options.apiToken), HttpClientRequest.bodyJsonUnsafe({
236
+ mode: input.mode,
237
+ expiresInMs: input.expiresInMs,
238
+ targetId: identity.targetId,
239
+ guardrails: { mode: "readonly" }
240
+ }))).pipe(Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" }));
241
+ if (response.status !== 200) return yield* new BrowserRunFailure({
242
+ operation,
243
+ reason: "provider",
244
+ status: response.status
245
+ });
246
+ const bytes = yield* Stream.runFoldEffect(response.stream, () => /* @__PURE__ */ new Uint8Array(), (body, chunk) => {
247
+ if (body.byteLength + chunk.byteLength > 16384) return Effect.fail(new BrowserRunFailure({
248
+ operation,
249
+ reason: "malformed"
250
+ }));
251
+ const combined = new Uint8Array(body.byteLength + chunk.byteLength);
252
+ combined.set(body);
253
+ combined.set(chunk, body.byteLength);
254
+ return Effect.succeed(combined);
255
+ });
256
+ const reply = yield* Schema.decodeEffect(Reply)(new TextDecoder().decode(bytes));
257
+ if (reply.id !== identity.targetId) return yield* new BrowserRunFailure({
258
+ operation,
259
+ reason: "malformed"
260
+ });
261
+ return yield* Schema.decodeEffect(BrowserRunLiveViewResult)({ devtoolsFrontendUrl: Redacted.make(reply.devtoolsFrontendUrl) });
262
+ }, Effect.mapError((cause) => browserFailure(operation, cause)), Effect.withTracerEnabled(false)) };
263
+ }));
264
+ }
265
+ };
266
+ //#endregion
209
267
  //#region src/BrowserSession.ts
210
268
  var BrowserSession_exports = /* @__PURE__ */ __exportAll({
211
269
  BrowserRunHandoffRequest: () => BrowserRunHandoffRequest,
@@ -290,6 +348,7 @@ var BrowserSessions = class BrowserSessions extends Context.Service()("@effect-a
290
348
  static layerNoDeps = Layer.effect(this, Effect.gen(function* () {
291
349
  const binding = yield* BrowserRunBinding;
292
350
  const lifecycle = yield* BrowserRunSessionLifecycle;
351
+ const readonlyLiveView = yield* BrowserRunReadonlyLiveView;
293
352
  const close = (sessionId) => decode(SessionId, sessionId).pipe(Effect.flatMap((id) => lifecycle.close(id).pipe(Effect.mapError(() => failure("cleanup", "not-dispatched", "unconfirmed")))));
294
353
  const cleanup = (sessionId) => close(sessionId).pipe(Effect.as("confirmed"), Effect.catchCause((cause) => reportBrowserCause("session.close", cause).pipe(Effect.as("unconfirmed"))));
295
354
  const connect = Effect.fnUntraced(function* (sessionId) {
@@ -403,6 +462,10 @@ var BrowserSessions = class BrowserSessions extends Context.Service()("@effect-a
403
462
  mode: value.mode,
404
463
  expiresInMs: value.expiresInMs
405
464
  }, Schema.Struct({ devtoolsFrontendUrl: Schema.String }))), Effect.flatMap((value) => decode(BrowserRunLiveViewResult, { devtoolsFrontendUrl: Redacted.make(value.devtoolsFrontendUrl) }))),
465
+ getReadOnlyLiveView: (authorize, request) => decode(BrowserRunLiveViewRequest, request).pipe(Effect.flatMap((value) => runEffect((commandTimeoutMillis) => authorize.pipe(Effect.andThen(() => readonlyLiveView.mint(reference.sessionId, reference.targetId, value).pipe(Effect.tapCause((cause) => reportBrowserCause("session.readonlyLiveView", cause)), Effect.mapError(() => reportedBrowserError(failure("provider"))))), Effect.timeoutOrElse({
466
+ duration: commandTimeoutMillis,
467
+ orElse: () => Effect.fail(failure("timeout"))
468
+ }))))),
406
469
  getHandoffState: (authorize) => command(authorize, "Cloudflare.getHandoffState", {}, Schema.Struct({
407
470
  active: Schema.Boolean,
408
471
  handoffId: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(1024))),
@@ -433,10 +496,10 @@ var BrowserSessions = class BrowserSessions extends Context.Service()("@effect-a
433
496
  });
434
497
  }));
435
498
  static layer(options) {
436
- return this.layerNoDeps.pipe(Layer.provide(BrowserRunBinding.layer(options.browser)), Layer.provide(BrowserRunSessionLifecycle.layer(options)));
499
+ return this.layerNoDeps.pipe(Layer.provide(BrowserRunBinding.layer(options.browser)), Layer.provide(BrowserRunSessionLifecycle.layer(options)), Layer.provide(BrowserRunReadonlyLiveView.layer(options)));
437
500
  }
438
501
  };
439
502
  //#endregion
440
503
  export { BrowserSessions as a, BrowserSession_exports as i, BrowserSessionOptions as n, BrowserSessionReference as r, BrowserSessionError as t };
441
504
 
442
- //# sourceMappingURL=BrowserSession-BplIoNfi.mjs.map
505
+ //# sourceMappingURL=BrowserSession-DWoRC_iM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserSession-DWoRC_iM.mjs","names":[],"sources":["../src/internal/browser-credentials.ts","../src/internal/browser-readonly-live-view.ts","../src/BrowserSession.ts"],"sourcesContent":["import { Cause, Context, Effect, Redacted, Schema } from \"effect\";\nimport type { Frame, Page } from \"puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js\";\n\nimport {\n BrowserCredentialAccess,\n type BrowserCredentialMaterial,\n CardCredential,\n type CredentialDispatch,\n type CredentialFieldRole,\n CredentialFillError,\n CredentialFillResult,\n CredentialOrigin,\n CredentialTarget,\n FillCredentialRequest,\n LoginCredential,\n type CredentialAccessRequest,\n} from \"../BrowserCredentials.ts\";\n\n/** Supplied only under the attachment lock, with the remaining command/session budget. */\nexport class BrowserSessionPage extends Context.Service<\n BrowserSessionPage,\n {\n readonly page: Page;\n readonly commandTimeoutMillis: number;\n }\n>()(\"@effect-agent/platform-cloudflare/internal/BrowserSessionPage\") {}\n\nconst TargetReply = Schema.Union([\n Schema.Struct({ action: Schema.String.check(Schema.isMaxLength(2048)) }),\n Schema.Struct({ reason: Schema.Literals([\"stale-target\", \"unsupported\"]) }),\n]);\n\nconst WriteReply = Schema.Literals([\n \"filled\",\n \"stale-target\",\n \"unsupported-before-write\",\n \"unsupported\",\n]);\n\n// One invocation-local isolated-world handle. Actual nodes and fingerprints never leave the page.\n// This program neither discovers controls nor classifies roles nor observes page content.\nconst prepareFields = `(() => {\n const doc = document;\n let fields = [];\n let form;\n let snapshots = [];\n const describe = el => {\n if (!el || !el.isConnected || el.ownerDocument !== doc || doc !== document) return null;\n const native = el instanceof HTMLTextAreaElement ||\n (el instanceof HTMLSelectElement && !el.multiple) ||\n (el instanceof HTMLInputElement && ['text','email','password','tel','number','month','search','url','date','time','week','datetime-local'].includes(el.type));\n if (!native || el.matches(':disabled') || el.readOnly || !el.form) return null;\n const values = [el.form.action, el.form.method, el.form.enctype, el.name, el.type, el.autocomplete ?? ''];\n if (values.some(value => value.length > 2048)) return null;\n return JSON.stringify(values);\n };\n const validate = () => fields.length > 0 && fields.every((el, index) =>\n el.form === form && describe(el) !== null && describe(el) === snapshots[index]);\n return {\n prepare(selectors) {\n try {\n fields = selectors.map(selector => {\n const matches = doc.querySelectorAll(selector);\n return matches.length === 1 ? matches[0] : null;\n });\n } catch { return {reason: 'stale-target'}; }\n if (fields.some(el => !el) || new Set(fields).size !== fields.length) return {reason: 'stale-target'};\n snapshots = fields.map(describe);\n form = fields[0].form;\n if (!form || snapshots.some(value => value === null) || fields.some(el => el.form !== form)) return {reason: 'unsupported'};\n return {action: form.action};\n },\n target() { return validate() ? {action: form.action} : {reason: 'stale-target'}; },\n fill(index, value) {\n if (!validate()) return 'stale-target';\n const el = fields[index];\n if (el instanceof HTMLSelectElement) {\n const options = [...el.options].filter(option => option.value === value);\n if (options.length !== 1 || options[0].matches(':disabled')) return 'unsupported-before-write';\n }\n let prototype = Object.getPrototypeOf(el);\n let setter;\n while (prototype && !setter) { setter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set; prototype = Object.getPrototypeOf(prototype); }\n if (!setter) return 'unsupported-before-write';\n setter.call(el, value);\n if (el.value !== value) return 'unsupported';\n el.dispatchEvent(new Event('input', {bubbles: true}));\n el.dispatchEvent(new Event('change', {bubbles: true}));\n return 'filled';\n }\n };\n})()`;\n\nconst secretFor = (material: BrowserCredentialMaterial, role: typeof CredentialFieldRole.Type) => {\n if (material._tag === \"LoginCredential\")\n return role === \"username\"\n ? material.username\n : role === \"password\"\n ? material.password\n : undefined;\n switch (role) {\n case \"card-name\":\n return material.name;\n case \"card-number\":\n return material.number;\n case \"card-expiry\":\n return material.expiry;\n case \"card-expiry-month\":\n return material.expiryMonth;\n case \"card-expiry-year\":\n return material.expiryYear;\n case \"card-security-code\":\n return material.securityCode;\n case \"username\":\n case \"password\":\n return undefined;\n }\n};\n\n/**\n * Fill explicit native fields on an existing page without submitting. The owning browser session\n * serializes operations and closes on timeout, interruption or uncertain dispatch; this function releases\n * only its local handles. Ordinary native observations remain available, including credential echoes.\n */\nexport const fillCredential = Effect.fnUntraced(function* (\n input: FillCredentialRequest,\n): Effect.fn.Return<\n CredentialFillResult,\n CredentialFillError,\n BrowserCredentialAccess | BrowserSessionPage\n> {\n const { page, commandTimeoutMillis } = yield* BrowserSessionPage;\n let dispatch: typeof CredentialDispatch.Type = \"not-dispatched\";\n let filled = 0;\n\n const fail = (reason: CredentialFillError[\"reason\"]) =>\n new CredentialFillError({ reason, dispatch, filled, cleanup: \"not-requested\" });\n\n const remote = <A>(run: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await run(signal) };\n } catch {\n return { ok: false as const };\n }\n },\n catch: () => fail(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok ? Effect.succeed(result.value) : Effect.fail(fail(\"provider\")),\n ),\n );\n\n const release = (handles: ReadonlyArray<{ dispose(): Promise<void> }>) =>\n Effect.promise(async () => {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => {})));\n }).pipe(Effect.interruptible, Effect.timeoutOption(\"1 second\"), Effect.asVoid);\n\n const acquire = <A extends { dispose(): Promise<void> }>(run: () => Promise<ReadonlyArray<A>>) =>\n Effect.acquireRelease(\n remote(async (signal) => {\n const handles = await run();\n\n if (signal.aborted) {\n await Promise.all(handles.map((handle) => handle.dispose().catch(() => {})));\n throw fail(\"provider\");\n }\n\n return handles;\n }).pipe(Effect.interruptible),\n release,\n );\n\n const origin = (value: string) =>\n Effect.try({\n try: () => {\n const url = new URL(value);\n\n if (url.username || url.password) throw fail(\"denied\");\n\n return url.origin;\n },\n catch: () => fail(\"denied\"),\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(CredentialOrigin)),\n Effect.mapError(() => fail(\"denied\")),\n );\n\n return yield* Effect.gen(function* () {\n const request = yield* Schema.decodeEffect(FillCredentialRequest, {\n onExcessProperty: \"error\",\n })(input).pipe(Effect.mapError(() => fail(\"denied\")));\n\n const roles = request.fields.map((field) => field.role);\n\n if (\n new Set(roles).size !== roles.length ||\n roles.some(\n (role) => (request.kind === \"login\") !== (role === \"username\" || role === \"password\"),\n )\n )\n return yield* fail(\"denied\");\n const access = yield* BrowserCredentialAccess;\n let frame: Frame = page.mainFrame();\n\n for (const selector of request.frame ?? []) {\n const matches = yield* acquire(() => frame.$$(selector));\n const element = matches[0];\n\n if (matches.length !== 1 || element === undefined) return yield* fail(\"stale-target\");\n const child = yield* remote(() => element.contentFrame());\n\n if (child === null) return yield* fail(\"unsupported\");\n frame = child;\n }\n\n const handles = yield* acquire(async () => [\n await frame.isolatedRealm().evaluateHandle(prepareFields),\n ]);\n\n const held = handles[0];\n\n if (held === undefined) return yield* fail(\"provider\");\n\n const inspect = (raw: unknown) =>\n Schema.decodeUnknownEffect(TargetReply)(raw).pipe(\n Effect.mapError(() => fail(\"provider\")),\n Effect.flatMap((reply) =>\n \"reason\" in reply ? Effect.fail(fail(reply.reason)) : Effect.succeed(reply.action),\n ),\n );\n\n const action = yield* remote(() =>\n held.evaluate(\n (state, selectors) => {\n if (typeof state !== \"object\" || state === null) return null;\n\n return Reflect.apply(Reflect.get(state, \"prepare\"), state, [selectors]);\n },\n request.fields.map((field) => field.selector),\n ),\n ).pipe(Effect.flatMap(inspect));\n\n const target = CredentialTarget.make({\n topOrigin: yield* origin(page.url()),\n frameOrigin: yield* origin(frame.url()),\n recipientOrigin: yield* origin(action),\n });\n\n const authorization: CredentialAccessRequest = {\n credential: request.credential,\n kind: request.kind,\n target,\n roles,\n };\n\n const authorize = Effect.suspend(() => access.authorize(authorization)).pipe(\n Effect.mapError((error) => fail(error.reason)),\n );\n\n const validate = Effect.gen(function* () {\n if (\n frame.detached ||\n (yield* origin(page.url())) !== target.topOrigin ||\n (yield* origin(frame.url())) !== target.frameOrigin\n )\n return yield* fail(\"stale-target\");\n\n const current = yield* remote(() =>\n held.evaluate((state) => {\n if (typeof state !== \"object\" || state === null) return null;\n\n return Reflect.apply(Reflect.get(state, \"target\"), state, []);\n }),\n ).pipe(Effect.flatMap(inspect));\n\n if ((yield* origin(current)) !== target.recipientOrigin) return yield* fail(\"stale-target\");\n });\n\n yield* authorize;\n yield* validate;\n\n const raw = yield* access\n .resolve(authorization)\n .pipe(Effect.mapError((error) => fail(error.reason)));\n\n const material = yield* Schema.decodeEffect(\n request.kind === \"login\" ? LoginCredential : CardCredential,\n )(raw).pipe(Effect.mapError(() => fail(\"resolver\")));\n\n for (const role of roles)\n if (secretFor(material, role) === undefined) return yield* fail(\"missing-credential\");\n for (const [index, role] of roles.entries()) {\n yield* authorize;\n yield* validate;\n const value = secretFor(material, role);\n\n if (value === undefined) return yield* fail(\"missing-credential\");\n const previous = dispatch;\n\n const result = yield* remote((signal) => {\n if (signal.aborted) return Promise.reject(fail(\"provider\"));\n dispatch = \"possibly-dispatched\";\n\n return held.evaluate(\n (state, field, secret) => {\n if (typeof state !== \"object\" || state === null) return \"stale-target\";\n\n return Reflect.apply(Reflect.get(state, \"fill\"), state, [field, secret]);\n },\n index,\n Redacted.value(value),\n );\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(WriteReply)),\n Effect.mapError(() => fail(\"provider\")),\n );\n\n if (result === \"stale-target\" || result === \"unsupported-before-write\") {\n dispatch = previous;\n\n return yield* fail(result === \"stale-target\" ? \"stale-target\" : \"unsupported\");\n }\n if (result === \"unsupported\") return yield* fail(\"unsupported\");\n dispatch = \"dispatched\";\n filled++;\n }\n\n return CredentialFillResult.make({ dispatch: \"dispatched\", filled });\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () => Effect.fail(fail(\"timeout\")),\n }),\n Effect.catchCause((cause) => {\n if (Cause.hasInterrupts(cause)) return Effect.interrupt;\n if (\n cause.reasons.some(\n (reason) =>\n reason._tag === \"Die\" ||\n (reason._tag === \"Fail\" && !Schema.is(CredentialFillError)(reason.error)),\n )\n )\n return Effect.fail(fail(\"provider\"));\n\n const expected = cause.reasons.find(\n (reason) => reason._tag === \"Fail\" && Schema.is(CredentialFillError)(reason.error),\n );\n\n return Effect.fail(\n fail(\n expected?._tag === \"Fail\" && Schema.is(CredentialFillError)(expected.error)\n ? expected.error.reason\n : \"provider\",\n ),\n );\n }),\n Effect.withTracerEnabled(false),\n );\n});\n","import { Context, Effect, Layer, Redacted, Schema, Stream } from \"effect\";\nimport { FetchHttpClient, HttpClient, HttpClientRequest } from \"effect/unstable/http\";\n\nimport { BrowserRunLiveViewRequest, BrowserRunLiveViewResult } from \"../InteractiveBrowser.ts\";\nimport { browserFailure, BrowserRunFailure } from \"./browser-failure.ts\";\nimport type { BrowserRunLifecycleOptions } from \"./browser-session-lifecycle.ts\";\n\nconst Identity = Schema.Struct({\n sessionId: Schema.String.check(Schema.isUUID()),\n targetId: Schema.NonEmptyString.check(Schema.isMaxLength(256)),\n});\n\nconst Reply = Schema.fromJsonString(\n Schema.Struct({\n id: Identity.fields.targetId,\n options: Schema.Struct({\n mode: Schema.Literal(\"tab\"),\n guardrails: Schema.Struct({ mode: Schema.Literal(\"readonly\") }),\n }),\n devtoolsFrontendUrl: Schema.String,\n }),\n);\n\nconst operation = \"session.readonlyLiveView\";\n\n/** Only the REST endpoint can mint provider-enforced read-only connections. */\nexport class BrowserRunReadonlyLiveView extends Context.Service<\n BrowserRunReadonlyLiveView,\n {\n readonly mint: (\n sessionId: Redacted.Redacted<string>,\n targetId: Redacted.Redacted<string>,\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, BrowserRunFailure>;\n }\n>()(\"@effect-agent/platform-cloudflare/internal/BrowserRunReadonlyLiveView\") {\n static layer(options: BrowserRunLifecycleOptions) {\n return Layer.effect(\n this,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n\n const mint = Effect.fnUntraced(\n function* (\n sessionId: Redacted.Redacted<string>,\n targetId: Redacted.Redacted<string>,\n request: BrowserRunLiveViewRequest,\n ) {\n const identity = yield* Schema.decodeEffect(Identity)({\n sessionId: Redacted.value(sessionId),\n targetId: Redacted.value(targetId),\n });\n\n const input = yield* Schema.decodeEffect(BrowserRunLiveViewRequest)(request);\n\n const response = yield* client\n .execute(\n HttpClientRequest.post(\n `https://api.cloudflare.com/client/v4/accounts/${options.accountId}/browser-rendering/devtools/browser/${identity.sessionId}/live_view`,\n ).pipe(\n HttpClientRequest.bearerToken(options.apiToken),\n HttpClientRequest.bodyJsonUnsafe({\n mode: input.mode,\n expiresInMs: input.expiresInMs,\n targetId: identity.targetId,\n guardrails: { mode: \"readonly\" },\n }),\n ),\n )\n .pipe(Effect.provideService(FetchHttpClient.RequestInit, { redirect: \"manual\" }));\n\n if (response.status !== 200)\n return yield* new BrowserRunFailure({\n operation,\n reason: \"provider\",\n status: response.status,\n });\n\n const bytes = yield* Stream.runFoldEffect(\n response.stream,\n () => new Uint8Array(),\n (body, chunk) => {\n if (body.byteLength + chunk.byteLength > 16_384)\n return Effect.fail(new BrowserRunFailure({ operation, reason: \"malformed\" }));\n const combined = new Uint8Array(body.byteLength + chunk.byteLength);\n\n combined.set(body);\n combined.set(chunk, body.byteLength);\n\n return Effect.succeed(combined);\n },\n );\n\n const reply = yield* Schema.decodeEffect(Reply)(new TextDecoder().decode(bytes));\n\n if (reply.id !== identity.targetId)\n return yield* new BrowserRunFailure({ operation, reason: \"malformed\" });\n\n return yield* Schema.decodeEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(reply.devtoolsFrontendUrl),\n });\n },\n Effect.mapError((cause) => browserFailure(operation, cause)),\n Effect.withTracerEnabled(false),\n );\n\n return { mint };\n }),\n );\n }\n}\n","/// <reference types=\"@cloudflare/workers-types\" />\n\nimport {\n Cause,\n Clock,\n Context,\n Effect,\n Exit,\n Layer,\n Redacted,\n Schema,\n Semaphore,\n Scope,\n} from \"effect\";\nimport type { Page } from \"puppeteer-core/lib/esm/puppeteer/puppeteer-core-browser.js\";\n\nimport {\n CredentialFillError,\n type BrowserCredentialAccess,\n type CredentialFillResult,\n type FillCredentialRequest,\n} from \"./BrowserCredentials.ts\";\nimport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffResult,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n} from \"./InteractiveBrowser.ts\";\nimport { BrowserRunBinding, type BrowserRunAttachment } from \"./internal/browser-binding.ts\";\nimport { BrowserSessionPage, fillCredential } from \"./internal/browser-credentials.ts\";\nimport { reportBrowserCause, reportedBrowserError } from \"./internal/browser-failure.ts\";\nimport { BrowserRunReadonlyLiveView } from \"./internal/browser-readonly-live-view.ts\";\nimport {\n BrowserRunSessionLifecycle,\n type BrowserRunLifecycleOptions,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport {\n BrowserRunHandoffRequest,\n BrowserRunHandoffResult,\n BrowserRunHandoffState,\n BrowserRunLiveViewRequest,\n BrowserRunLiveViewResult,\n};\n\nconst PositiveMillis = Schema.Int.check(\n Schema.isGreaterThan(0),\n Schema.isLessThanOrEqualTo(Number.MAX_SAFE_INTEGER),\n);\n\nconst SessionId = Schema.Redacted(Schema.String.check(Schema.isUUID()));\nconst ProviderId = Schema.Redacted(Schema.NonEmptyString.check(Schema.isMaxLength(256)));\n\n/** Private host record, not a model capability. Persist together with the owner's controller state. */\nexport class BrowserSessionReference extends Schema.Class<BrowserSessionReference>(\n \"BrowserSessionReference\",\n)({\n version: Schema.Literal(1),\n sessionId: SessionId,\n contextId: ProviderId,\n targetId: ProviderId,\n expiresAt: PositiveMillis,\n commandTimeoutMillis: PositiveMillis,\n}) {}\n\nexport class BrowserSessionOptions extends Schema.Class<BrowserSessionOptions>(\n \"BrowserSessionOptions\",\n)({\n maxElapsedMillis: PositiveMillis,\n keepAliveMillis: Schema.optionalKey(PositiveMillis.check(Schema.isLessThanOrEqualTo(600_000))),\n commandTimeoutMillis: Schema.optionalKey(PositiveMillis),\n}) {}\n\n/** No SDK text, selectors, page data, or credential values are retained in public failures. */\nexport class BrowserSessionError extends Schema.TaggedError<BrowserSessionError>()(\n \"BrowserSessionError\",\n {\n reason: Schema.Literals([\n \"invalid\",\n \"expired\",\n \"missing-page\",\n \"busy\",\n \"closed\",\n \"provider\",\n \"timeout\",\n \"cleanup\",\n ]),\n dispatch: Schema.Literals([\"not-dispatched\", \"possibly-dispatched\"]),\n cleanup: Schema.Literals([\"not-requested\", \"confirmed\", \"unconfirmed\"]),\n },\n) {}\n\n/**\n * One local attachment to an application-owned browser. Scope release disconnects; it never\n * transfers ownership or closes a healthy remote session. The owner serializes attachments,\n * fences old attempts, authorizes human access, and calls BrowserSessions.close on expiry/stop.\n * Native callbacks are trusted host code: never retain SDK handles or start unawaited work.\n */\nexport interface BrowserSession {\n readonly reference: BrowserSessionReference;\n /**\n * Check current authority under the lock before native dispatch. A settled SDK rejection leaves\n * the session available for inspection, but may have changed the website; never retry blindly.\n * Timeout/interruption fences outstanding SDK work and terminates the exact browser.\n */\n readonly run: <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n action: (page: Page) => Promise<A>,\n ) => Effect.Effect<A, E | BrowserSessionError, R>;\n /**\n * Resolves host-owned material under fresh credential grants. Never submits or retries a write.\n * Credential timeouts retain acknowledged writes and dispatch evidence alongside cleanup.\n */\n readonly fillCredential: (\n request: FillCredentialRequest,\n ) => Effect.Effect<\n CredentialFillResult,\n CredentialFillError | BrowserSessionError,\n BrowserCredentialAccess\n >;\n readonly handoff: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, E | BrowserSessionError, R>;\n readonly getLiveView: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;\n /**\n * Mint a provider-enforced read-only connection to this exact page. Requires REST credentials;\n * missing read-only confirmation fails closed, never falling back to an interactive URL.\n * Expiry limits new connections, not established connections or access to visible page data.\n */\n readonly getReadOnlyLiveView: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, E | BrowserSessionError, R>;\n readonly getHandoffState: <E, R>(\n authorize: Effect.Effect<void, E, R>,\n ) => Effect.Effect<BrowserRunHandoffState, E | BrowserSessionError, R>;\n}\n\nconst failure = (\n reason: BrowserSessionError[\"reason\"],\n dispatch: BrowserSessionError[\"dispatch\"] = \"not-dispatched\",\n cleanup: BrowserSessionError[\"cleanup\"] = \"not-requested\",\n) => new BrowserSessionError({ reason, dispatch, cleanup });\n\nconst decode = <A>(schema: Schema.Codec<A>, input: unknown) =>\n Schema.decodeUnknownEffect(schema, { onExcessProperty: \"error\" })(input).pipe(\n Effect.mapError(() => failure(\"invalid\")),\n );\n\n// Catch inside the Promise before workerd can report an unhandled foreign diagnostic.\nconst native = Effect.fnUntraced(function* <A>(\n operation: string,\n action: (signal: AbortSignal) => Promise<A>,\n) {\n const runReport = Effect.runPromiseWith(yield* Effect.context<never>());\n\n return yield* Effect.tryPromise({\n try: async (signal) => {\n try {\n return { ok: true as const, value: await action(signal) };\n } catch (cause) {\n if (!signal.aborted || cause !== signal.reason)\n await runReport(reportBrowserCause(operation, Cause.fail(cause)));\n\n return { ok: false as const };\n }\n },\n catch: () => failure(\"provider\"),\n }).pipe(\n Effect.flatMap((result) =>\n result.ok\n ? Effect.succeed(result.value)\n : Effect.fail(reportedBrowserError(failure(\"provider\"))),\n ),\n Effect.withTracerEnabled(false),\n );\n});\n\nconst targetId = (page: Page) =>\n native(\"session.target\", async () => {\n const cdp = await page.createCDPSession();\n\n try {\n return (await cdp.send(\"Target.getTargetInfo\")).targetInfo.targetId;\n } finally {\n await cdp.detach();\n }\n });\n\nexport interface BrowserSessionsOptions extends BrowserRunLifecycleOptions {\n readonly browser: Pick<BrowserRun, \"fetch\">;\n}\n\n/** Native Cloudflare sessions; no framework browser workflow, checkpoint transfer, or observation policy. */\nexport class BrowserSessions extends Context.Service<\n BrowserSessions,\n {\n /**\n * Allocate once and commit its private reference in retain. Failed/uncommitted creation closes\n * the allocation. After retain succeeds the application owns remote cleanup, independent of\n * attempt Scopes. A lost allocation reply can remain indeterminate until provider idle expiry.\n */\n readonly create: <E, R>(\n options: BrowserSessionOptions,\n retain: (reference: BrowserSessionReference) => Effect.Effect<void, E, R>,\n ) => Effect.Effect<BrowserSessionReference, E | BrowserSessionError, R>;\n /** Attach only the exact saved context/page. Never recreate missing/expired state. */\n readonly attach: (\n reference: BrowserSessionReference,\n ) => Effect.Effect<BrowserSession, BrowserSessionError, Scope.Scope>;\n /** Refresh provider inactivity only; the owner must still enforce its expiresAt. */\n readonly keepAlive: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserSessionError>;\n readonly close: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, BrowserSessionError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserSessions\") {\n static readonly layerNoDeps = Layer.effect(\n this,\n Effect.gen(function* () {\n const binding = yield* BrowserRunBinding;\n const lifecycle = yield* BrowserRunSessionLifecycle;\n const readonlyLiveView = yield* BrowserRunReadonlyLiveView;\n\n const close = (sessionId: Redacted.Redacted<string>) =>\n decode(SessionId, sessionId).pipe(\n Effect.flatMap((id) =>\n lifecycle\n .close(id)\n .pipe(Effect.mapError(() => failure(\"cleanup\", \"not-dispatched\", \"unconfirmed\"))),\n ),\n );\n\n const cleanup = (sessionId: Redacted.Redacted<string>) =>\n close(sessionId).pipe(\n Effect.as(\"confirmed\" as const),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"session.close\", cause).pipe(Effect.as(\"unconfirmed\" as const)),\n ),\n );\n\n const connect = Effect.fnUntraced(function* (sessionId: Redacted.Redacted<string>) {\n let attachment: BrowserRunAttachment | undefined;\n\n const retire = Effect.suspend(() =>\n attachment === undefined\n ? Effect.void\n : attachment.retire.pipe(\n // Dispatch is already fenced; give the socket close handshake the same\n // bounded window as keepalive instead of failing a settled command after 1s.\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(failure(\"cleanup\")),\n }),\n Effect.catchCause((cause) =>\n reportBrowserCause(\"session.disconnect\", cause).pipe(\n Effect.andThen(Effect.die(failure(\"cleanup\", \"not-dispatched\", \"unconfirmed\"))),\n ),\n ),\n ),\n );\n\n yield* Effect.addFinalizer(() => retire);\n\n const browser = yield* native(\"session.connect\", (signal) => {\n attachment = binding.connect(Redacted.value(sessionId), \"session.connect\", signal);\n\n return attachment.browser;\n });\n\n return { browser, retire };\n });\n\n const create = <E, R>(\n input: BrowserSessionOptions,\n retain: (reference: BrowserSessionReference) => Effect.Effect<void, E, R>,\n ) =>\n Effect.gen(function* () {\n const options = yield* decode(BrowserSessionOptions, input);\n const expiresAt = (yield* Clock.currentTimeMillis) + options.maxElapsedMillis;\n\n if (!Number.isSafeInteger(expiresAt)) return yield* failure(\"invalid\");\n let sessionId: Redacted.Redacted<string> | undefined;\n let retained = false;\n const runCleanup = Effect.runPromiseWith(yield* Effect.context<never>());\n\n yield* Effect.addFinalizer(() =>\n sessionId === undefined || retained ? Effect.void : cleanup(sessionId),\n );\n sessionId = yield* native(\"session.acquire\", async (signal) => {\n const id = Redacted.make(\n await binding.acquire(options.keepAliveMillis ?? 600_000, \"session.acquire\"),\n );\n\n if (signal.aborted) {\n await runCleanup(cleanup(id));\n signal.throwIfAborted();\n }\n\n return id;\n });\n const { browser } = yield* connect(sessionId);\n\n const page = yield* native(\"session.page\", async () => {\n const context = await browser.createBrowserContext();\n\n return await context.newPage();\n });\n\n const reference = yield* decode(BrowserSessionReference, {\n version: 1,\n sessionId,\n contextId: Redacted.make(page.browserContext().id ?? \"\"),\n targetId: Redacted.make(yield* targetId(page)),\n expiresAt,\n commandTimeoutMillis: options.commandTimeoutMillis ?? 30_000,\n });\n\n yield* Effect.uninterruptibleMask((restore) =>\n restore(retain(reference)).pipe(\n Effect.tap(() =>\n Effect.sync(() => {\n retained = true;\n }),\n ),\n ),\n );\n\n return reference;\n }).pipe(\n Effect.scoped,\n Effect.timeoutOrElse({\n duration: \"30 seconds\",\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n Effect.withTracerEnabled(false),\n );\n\n const attachPage = Effect.fnUntraced(function* (input: BrowserSessionReference) {\n const reference = yield* decode(BrowserSessionReference, input);\n\n if (reference.expiresAt <= (yield* Clock.currentTimeMillis))\n return yield* failure(\"expired\");\n const scope = yield* Effect.scope;\n const { browser, retire } = yield* connect(reference.sessionId);\n\n const context = browser\n .browserContexts()\n .find((value) => value.id === Redacted.value(reference.contextId));\n\n if (context === undefined) return yield* failure(\"missing-page\");\n let page: Page | undefined;\n\n for (const candidate of yield* native(\"session.pages\", () => context.pages())) {\n if ((yield* targetId(candidate)) === Redacted.value(reference.targetId)) {\n page = candidate;\n break;\n }\n }\n if (page === undefined) return yield* failure(\"missing-page\");\n const currentPage = page;\n const lock = yield* Semaphore.make(1);\n let invalid = false;\n\n const terminate = Effect.suspend(() => {\n invalid = true;\n\n return retire.pipe(\n Effect.catchCause((cause) => reportBrowserCause(\"session.disconnect\", cause)),\n Effect.andThen(cleanup(reference.sessionId)),\n );\n });\n\n const runEffect = <A, E, R>(\n action: (commandTimeoutMillis: number) => Effect.Effect<A, E, R>,\n ) =>\n lock\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n if (invalid || scope.state._tag === \"Closed\" || !browser.isConnected())\n return yield* failure(\"closed\");\n const remaining = reference.expiresAt - (yield* Clock.currentTimeMillis);\n\n if (remaining <= 0) {\n return yield* failure(\"expired\", \"not-dispatched\", yield* terminate);\n }\n\n return yield* action(Math.min(remaining, reference.commandTimeoutMillis)).pipe(\n Effect.catchDefect((defect) =>\n reportBrowserCause(\"session.command\", Cause.die(defect)).pipe(\n Effect.andThen(terminate),\n Effect.flatMap((closed) =>\n Effect.fail(failure(\"provider\", \"possibly-dispatched\", closed)),\n ),\n ),\n ),\n Effect.onInterrupt(() => terminate),\n );\n }),\n )\n .pipe(\n Effect.flatMap(Effect.fromOption(() => failure(\"busy\"))),\n Effect.withTracerEnabled(false),\n );\n\n const run = <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n action: (page: Page) => Promise<A>,\n terminateOnError = false,\n ) =>\n runEffect((commandTimeoutMillis) =>\n authorize.pipe(\n Effect.andThen(() =>\n native(\"session.command\", () => action(currentPage)).pipe(\n Effect.catch((error) =>\n Effect.gen(function* () {\n const closed = terminateOnError ? yield* terminate : \"not-requested\";\n\n return yield* reportedBrowserError(\n failure(error.reason, \"possibly-dispatched\", closed),\n );\n }),\n ),\n ),\n ),\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () =>\n terminate.pipe(\n Effect.flatMap((closed) =>\n Effect.fail(failure(\"timeout\", \"possibly-dispatched\", closed)),\n ),\n ),\n }),\n ),\n );\n\n const command = <A, E, R>(\n authorize: Effect.Effect<void, E, R>,\n method: string,\n parameters: Record<string, string | number>,\n schema: Schema.Codec<A>,\n ) =>\n run(\n authorize,\n async (page) => {\n const cdp = await page.createCDPSession();\n\n try {\n const result: unknown = await Reflect.apply(cdp.send, cdp, [method, parameters]);\n\n return Schema.decodeUnknownSync(schema)(result);\n } finally {\n await cdp.detach();\n }\n },\n method === \"Cloudflare.handoff\",\n );\n\n const session: BrowserSession = {\n reference,\n run,\n fillCredential: (request) =>\n runEffect((commandTimeoutMillis) =>\n fillCredential(request).pipe(\n Effect.provideService(BrowserSessionPage, {\n page: currentPage,\n commandTimeoutMillis,\n }),\n Effect.catchIf(\n (error) => error.reason === \"timeout\" || error.dispatch === \"possibly-dispatched\",\n (error) =>\n terminate.pipe(\n Effect.flatMap((cleanup) =>\n Effect.fail(CredentialFillError.make({ ...error, cleanup })),\n ),\n ),\n ),\n ),\n ),\n handoff: (authorize, request) =>\n decode(BrowserRunHandoffRequest, request).pipe(\n Effect.flatMap((value) =>\n command(\n authorize,\n \"Cloudflare.handoff\",\n { instructions: value.instructions, timeout: value.timeout },\n Schema.Struct({\n handoffId: Schema.NonEmptyString.check(Schema.isMaxLength(1024)),\n }),\n ),\n ),\n Effect.map((value) =>\n BrowserRunHandoffResult.make({ handoffId: Redacted.make(value.handoffId) }),\n ),\n ),\n getLiveView: (authorize, request) =>\n decode(BrowserRunLiveViewRequest, request).pipe(\n Effect.flatMap((value) =>\n command(\n authorize,\n \"Cloudflare.getLiveView\",\n { mode: value.mode, expiresInMs: value.expiresInMs },\n Schema.Struct({ devtoolsFrontendUrl: Schema.String }),\n ),\n ),\n Effect.flatMap((value) =>\n decode(BrowserRunLiveViewResult, {\n devtoolsFrontendUrl: Redacted.make(value.devtoolsFrontendUrl),\n }),\n ),\n ),\n getReadOnlyLiveView: (authorize, request) =>\n decode(BrowserRunLiveViewRequest, request).pipe(\n Effect.flatMap((value) =>\n runEffect((commandTimeoutMillis) =>\n authorize.pipe(\n Effect.andThen(() =>\n readonlyLiveView.mint(reference.sessionId, reference.targetId, value).pipe(\n Effect.tapCause((cause) =>\n reportBrowserCause(\"session.readonlyLiveView\", cause),\n ),\n Effect.mapError(() => reportedBrowserError(failure(\"provider\"))),\n ),\n ),\n Effect.timeoutOrElse({\n duration: commandTimeoutMillis,\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n ),\n ),\n ),\n ),\n getHandoffState: (authorize) =>\n command(\n authorize,\n \"Cloudflare.getHandoffState\",\n {},\n Schema.Struct({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(\n Schema.NonEmptyString.check(Schema.isMaxLength(1024)),\n ),\n durationMs: Schema.optionalKey(Schema.Natural),\n }),\n ).pipe(\n Effect.map((value) =>\n BrowserRunHandoffState.make({\n active: value.active,\n ...(value.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(value.handoffId) }),\n ...(value.durationMs === undefined ? {} : { durationMs: value.durationMs }),\n }),\n ),\n ),\n };\n\n return session;\n });\n\n const attach = Effect.fnUntraced(function* (input: BrowserSessionReference) {\n const reference = yield* decode(BrowserSessionReference, input);\n const scope = yield* Scope.fork(yield* Effect.scope);\n\n return yield* attachPage(reference).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.timeoutOrElse({\n duration: reference.commandTimeoutMillis,\n orElse: () =>\n reportBrowserCause(\"session.connect\", Cause.fail(failure(\"timeout\"))).pipe(\n Effect.andThen(Effect.fail(reportedBrowserError(failure(\"timeout\")))),\n ),\n }),\n Effect.onExit((exit) => (Exit.isFailure(exit) ? Scope.close(scope, exit) : Effect.void)),\n );\n });\n\n return BrowserSessions.of({\n create,\n attach,\n close,\n keepAlive: (sessionId) =>\n decode(SessionId, sessionId).pipe(\n Effect.flatMap((id) =>\n binding.keepAlive(Redacted.value(id)).pipe(\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(failure(\"timeout\")),\n }),\n Effect.catch((error) =>\n reportBrowserCause(\"session.keepAlive\", Cause.fail(error)).pipe(\n Effect.andThen(\n Effect.fail(\n reportedBrowserError(\n failure(error.reason === \"timeout\" ? \"timeout\" : \"provider\"),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n Effect.withTracerEnabled(false),\n ),\n });\n }),\n );\n\n static layer(options: BrowserSessionsOptions) {\n return this.layerNoDeps.pipe(\n Layer.provide(BrowserRunBinding.layer(options.browser)),\n Layer.provide(BrowserRunSessionLifecycle.layer(options)),\n Layer.provide(BrowserRunReadonlyLiveView.layer(options)),\n );\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { _ as BrowserRunLiveViewRequest, i as BrowserRunHandoffState, n as BrowserRunHandoffRequest, r as BrowserRunHandoffResult, v as BrowserRunLiveViewResult } from "./InteractiveBrowser-BnqY_Y-F.mjs";
2
- import { i as BrowserSessionReference, n as BrowserSessionError, o as BrowserSessions, r as BrowserSessionOptions, s as BrowserSessionsOptions, t as BrowserSession } from "./BrowserSession-DxCN-5F9.mjs";
2
+ import { i as BrowserSessionReference, n as BrowserSessionError, o as BrowserSessions, r as BrowserSessionOptions, s as BrowserSessionsOptions, t as BrowserSession } from "./BrowserSession-DP6b-cpL.mjs";
3
3
  export { BrowserRunHandoffRequest, BrowserRunHandoffResult, BrowserRunHandoffState, BrowserRunLiveViewRequest, BrowserRunLiveViewResult, BrowserSession, BrowserSessionError, BrowserSessionOptions, BrowserSessionReference, BrowserSessions, BrowserSessionsOptions };
@@ -1,4 +1,4 @@
1
1
  import "./BrowserCredentials.mjs";
2
- import { c as BrowserRunLiveViewResult, n as BrowserRunHandoffResult, r as BrowserRunHandoffState, s as BrowserRunLiveViewRequest, t as BrowserRunHandoffRequest } from "./InteractiveBrowser-D-xxDv_f.mjs";
3
- import { a as BrowserSessions, n as BrowserSessionOptions, r as BrowserSessionReference, t as BrowserSessionError } from "./BrowserSession-BplIoNfi.mjs";
2
+ import { c as BrowserRunLiveViewResult, n as BrowserRunHandoffResult, r as BrowserRunHandoffState, s as BrowserRunLiveViewRequest, t as BrowserRunHandoffRequest } from "./InteractiveBrowser-CxFT-Nwm.mjs";
3
+ import { a as BrowserSessions, n as BrowserSessionOptions, r as BrowserSessionReference, t as BrowserSessionError } from "./BrowserSession-DWoRC_iM.mjs";
4
4
  export { BrowserRunHandoffRequest, BrowserRunHandoffResult, BrowserRunHandoffState, BrowserRunLiveViewRequest, BrowserRunLiveViewResult, BrowserSessionError, BrowserSessionOptions, BrowserSessionReference, BrowserSessions };
@@ -692,53 +692,6 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
692
692
  readonly createdAt: string;
693
693
  readonly deploymentId: string;
694
694
  readonly payload: {
695
- readonly _tag: "SubagentStarted";
696
- readonly runId: string;
697
- readonly toolCallId: string;
698
- readonly childThreadId: string;
699
- readonly childSubmissionId: string;
700
- readonly childReceiptId: string;
701
- readonly childRunId: string;
702
- } | {
703
- readonly _tag: "ToolCallPrepared";
704
- readonly runId: string;
705
- readonly turnId: string;
706
- readonly turn: number;
707
- readonly toolCallId: string;
708
- readonly toolName: string;
709
- readonly parameters: Schema.Json;
710
- readonly parametersDigest: string;
711
- readonly executionKind?: "delegation" | "orchestration" | "ordinary" | undefined;
712
- readonly executionClass?: "idempotent" | "readonly" | "uncertain" | undefined;
713
- readonly replay?: string | undefined;
714
- } | {
715
- readonly _tag: "ToolCallUnknown";
716
- readonly runId: string;
717
- readonly turn: number;
718
- readonly toolCallId: string;
719
- readonly toolName: string;
720
- readonly reason: string;
721
- } | {
722
- readonly _tag: "ToolApprovalDecided";
723
- readonly runId: string;
724
- readonly turn: number;
725
- readonly toolCallId: string;
726
- readonly decision: "approved" | "denied";
727
- readonly resolver: string;
728
- readonly reason: string;
729
- } | {
730
- readonly _tag: "ToolCallResolved";
731
- readonly runId: string;
732
- readonly toolCallId: string;
733
- readonly resolution: "completed-with-result" | "failed-with-error" | "never-started" | "safe-retry";
734
- readonly author: string;
735
- readonly reason: string;
736
- } | {
737
- readonly _tag: "AbortRequested";
738
- readonly submissionId: string;
739
- readonly author: string;
740
- readonly reason: string;
741
- } | {
742
695
  readonly _tag: "ThreadCreated";
743
696
  readonly agentId: string;
744
697
  readonly definitions: {
@@ -930,6 +883,18 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
930
883
  readonly inputTokens?: number | undefined;
931
884
  readonly outputTokens?: number | undefined;
932
885
  readonly costMicrousd?: number | undefined;
886
+ } | {
887
+ readonly _tag: "ToolCallPrepared";
888
+ readonly runId: string;
889
+ readonly turnId: string;
890
+ readonly turn: number;
891
+ readonly toolCallId: string;
892
+ readonly toolName: string;
893
+ readonly parameters: Schema.Json;
894
+ readonly parametersDigest: string;
895
+ readonly executionKind?: "delegation" | "orchestration" | "ordinary" | undefined;
896
+ readonly executionClass?: "idempotent" | "readonly" | "uncertain" | undefined;
897
+ readonly replay?: string | undefined;
933
898
  } | {
934
899
  readonly _tag: "ToolCallSettled";
935
900
  readonly toolSelection?: {
@@ -941,6 +906,20 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
941
906
  readonly result: Schema.Json;
942
907
  readonly isFailure: boolean;
943
908
  readonly budgetRejected?: true | undefined;
909
+ } | {
910
+ readonly _tag: "ToolCallUnknown";
911
+ readonly runId: string;
912
+ readonly turn: number;
913
+ readonly toolCallId: string;
914
+ readonly toolName: string;
915
+ readonly reason: string;
916
+ } | {
917
+ readonly _tag: "ToolCallResolved";
918
+ readonly runId: string;
919
+ readonly toolCallId: string;
920
+ readonly resolution: "completed-with-result" | "failed-with-error" | "never-started" | "safe-retry";
921
+ readonly author: string;
922
+ readonly reason: string;
944
923
  } | {
945
924
  readonly _tag: "ToolStepSettled";
946
925
  readonly runId: string;
@@ -956,6 +935,14 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
956
935
  readonly toolCallId: string;
957
936
  readonly toolName: string;
958
937
  readonly parametersDigest: string;
938
+ } | {
939
+ readonly _tag: "ToolApprovalDecided";
940
+ readonly runId: string;
941
+ readonly turn: number;
942
+ readonly toolCallId: string;
943
+ readonly decision: "approved" | "denied";
944
+ readonly resolver: string;
945
+ readonly reason: string;
959
946
  } | {
960
947
  readonly _tag: "ModelResponseInterrupted";
961
948
  readonly runId: string;
@@ -982,6 +969,11 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
982
969
  readonly runDisposition?: Schema.Json | undefined;
983
970
  readonly finishReason?: "budget-exhausted" | undefined;
984
971
  readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
972
+ } | {
973
+ readonly _tag: "AbortRequested";
974
+ readonly submissionId: string;
975
+ readonly author: string;
976
+ readonly reason: string;
985
977
  } | {
986
978
  readonly _tag: "SubmissionSettled";
987
979
  readonly submissionId: string;
@@ -1116,6 +1108,14 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1116
1108
  readonly childLifetimes?: readonly ("attached" | "background")[] | undefined;
1117
1109
  } | undefined;
1118
1110
  readonly depth?: number | undefined;
1111
+ } | {
1112
+ readonly _tag: "SubagentStarted";
1113
+ readonly runId: string;
1114
+ readonly toolCallId: string;
1115
+ readonly childThreadId: string;
1116
+ readonly childSubmissionId: string;
1117
+ readonly childReceiptId: string;
1118
+ readonly childRunId: string;
1119
1119
  } | {
1120
1120
  readonly _tag: "SubagentJoined";
1121
1121
  readonly runId: string;
@@ -1600,18 +1600,43 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1600
1600
  readonly message: string;
1601
1601
  readonly cause?: Schema.Json | undefined;
1602
1602
  } | {
1603
- readonly _tag: "HostProtocolError";
1604
- readonly message: string;
1603
+ readonly _tag: "ThreadNotMaterialized";
1604
+ readonly threadId: string;
1605
1605
  } | {
1606
- readonly _tag: "AdmissionLimitExceeded";
1607
- readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
1608
- readonly actual: number;
1609
- readonly maximum: number;
1606
+ readonly _tag: "ThreadStoreError";
1607
+ readonly operation: string;
1608
+ readonly message: string;
1609
+ readonly cause?: Schema.Json | undefined;
1610
+ readonly diagnostic?: {
1611
+ readonly causeTag: string;
1612
+ readonly operation: string;
1613
+ readonly decoder?: string | undefined;
1614
+ readonly issueTag?: string | undefined;
1615
+ readonly sequence?: number | undefined;
1616
+ } | undefined;
1610
1617
  } | {
1611
1618
  readonly _tag: "LedgerError";
1612
1619
  readonly operation: string;
1613
1620
  readonly message: string;
1614
1621
  readonly cause?: import("effect-agent/failure-diagnostic").Diagnostic | undefined;
1622
+ } | {
1623
+ readonly _tag: "AppendConflict";
1624
+ readonly threadId: string;
1625
+ readonly batchId: string;
1626
+ readonly reason: "batch-digest" | "record-identity" | "tail";
1627
+ readonly actualTailSequence?: number | undefined;
1628
+ readonly actualTailDigest?: string | undefined;
1629
+ } | {
1630
+ readonly _tag: "FenceRejected";
1631
+ readonly threadId: string;
1632
+ readonly actualEpoch: number;
1633
+ readonly attemptedEpoch: number;
1634
+ } | {
1635
+ readonly _tag: "OperationDenied";
1636
+ readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
1637
+ readonly reason: string;
1638
+ readonly threadId?: string | undefined;
1639
+ readonly submissionId?: string | undefined;
1615
1640
  } | {
1616
1641
  readonly _tag: "AdmissionConflict";
1617
1642
  readonly threadId: string;
@@ -1628,13 +1653,6 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1628
1653
  } | {
1629
1654
  readonly _tag: "AgentInputError";
1630
1655
  readonly message: string;
1631
- } | {
1632
- readonly _tag: "AppendConflict";
1633
- readonly threadId: string;
1634
- readonly batchId: string;
1635
- readonly reason: "batch-digest" | "record-identity" | "tail";
1636
- readonly actualTailSequence?: number | undefined;
1637
- readonly actualTailDigest?: string | undefined;
1638
1656
  } | {
1639
1657
  readonly _tag: "DigestError";
1640
1658
  readonly message: string;
@@ -1642,32 +1660,6 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1642
1660
  } | {
1643
1661
  readonly _tag: "DurableRuntimeFailpointError";
1644
1662
  readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "checkpoint:after-save" | "checkpoint:before-save" | "claim:after-claim" | "compaction:after-canonical-append" | "compaction:before-canonical-append" | "input:after-canonical-append" | "join:after-canonical-append" | "join:after-claim" | "policy:after-reservation-append" | "policy:before-reservation-append" | "resolve:after-intent" | "run:after-duration-append" | "run:after-start-append" | "run:before-duration-append" | "run:before-start-append" | "step:after-step-append" | "subagent:after-admit" | "subagent:after-child-abort-intent" | "subagent:after-child-ready" | "subagent:after-join-append" | "subagent:after-release" | "subagent:after-release-pending" | "subagent:after-request-append" | "subagent:after-reserve" | "subagent:after-sibling-settle" | "subagent:after-start-append" | "subagent:after-suspend" | "subagent:before-join-append" | "submit:after-admit" | "submit:after-materialize" | "terminalize:after-canonical-append" | "terminalize:after-reserve" | "tools:after-prepared-append" | "tools:after-unavailable-append" | "tools:before-prepared-append" | "tools:before-unavailable-append" | "turn:after-canonical-append" | "turn:after-response-append" | "turn:after-results-append" | "update:after-canonical-append" | "update:after-delivery-insert" | "update:before-canonical-append" | "update:before-delivery-insert" | "worker:after-completion-append" | "worker:after-origin-append" | "worker:after-report-append" | "worker:after-report-delivery" | "worker:after-source-append" | "worker:after-stop-append" | "worker:after-stop-seal" | "worker:after-subtree-append" | "worker:before-completion-append" | "worker:before-origin-append" | "worker:before-report-append" | "worker:before-report-delivery" | "worker:before-source-append" | "worker:before-stop-append" | "worker:before-stop-seal" | "worker:before-subtree-append";
1645
- } | {
1646
- readonly _tag: "FenceRejected";
1647
- readonly threadId: string;
1648
- readonly actualEpoch: number;
1649
- readonly attemptedEpoch: number;
1650
- } | {
1651
- readonly _tag: "ThreadNotMaterialized";
1652
- readonly threadId: string;
1653
- } | {
1654
- readonly _tag: "ThreadStoreError";
1655
- readonly operation: string;
1656
- readonly message: string;
1657
- readonly cause?: Schema.Json | undefined;
1658
- readonly diagnostic?: {
1659
- readonly causeTag: string;
1660
- readonly operation: string;
1661
- readonly decoder?: string | undefined;
1662
- readonly issueTag?: string | undefined;
1663
- readonly sequence?: number | undefined;
1664
- } | undefined;
1665
- } | {
1666
- readonly _tag: "OperationDenied";
1667
- readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
1668
- readonly reason: string;
1669
- readonly threadId?: string | undefined;
1670
- readonly submissionId?: string | undefined;
1671
1663
  } | {
1672
1664
  readonly _tag: "SettlementConflict";
1673
1665
  readonly submissionId: string;
@@ -1676,6 +1668,14 @@ export declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorde
1676
1668
  readonly _tag: "JoinedToHost";
1677
1669
  readonly submissionId: string;
1678
1670
  readonly hostSubmissionId: string;
1671
+ } | {
1672
+ readonly _tag: "AdmissionLimitExceeded";
1673
+ readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
1674
+ readonly actual: number;
1675
+ readonly maximum: number;
1676
+ } | {
1677
+ readonly _tag: "HostProtocolError";
1678
+ readonly message: string;
1679
1679
  } | {
1680
1680
  readonly _tag: "ApprovalConflict";
1681
1681
  readonly submissionId: string;
@@ -1918,6 +1918,6 @@ const CloudflareInteractiveBrowser = {
1918
1918
  hostLayer: (options) => browserRunInteractiveHostLayer().pipe(Layer.provide(interactiveBindingLayer(options)))
1919
1919
  };
1920
1920
  //#endregion
1921
- export { BrowserRunCleanupError as _, BrowserRunInteractiveCheckpoint as a, reportBrowserCause as b, BrowserRunLiveViewResult as c, BrowserRunViewport as d, CloudflareInteractiveBrowser as f, isBrowserRunUndispatchedActionError as g, browserRunInteractiveLayer as h, BrowserRunInteractiveBinding as i, BrowserRunPageIdentity as l, browserRunInteractiveImplementation as m, BrowserRunHandoffResult as n, BrowserRunInteractiveHost as o, browserRunInteractiveHostLayer as p, BrowserRunHandoffState as r, BrowserRunLiveViewRequest as s, BrowserRunHandoffRequest as t, BrowserRunPageObservation as u, BrowserRunSessionLifecycle as v, reportedBrowserError as x, BrowserRunBinding as y };
1921
+ export { reportedBrowserError as C, reportBrowserCause as S, BrowserRunCleanupError as _, BrowserRunInteractiveCheckpoint as a, BrowserRunFailure as b, BrowserRunLiveViewResult as c, BrowserRunViewport as d, CloudflareInteractiveBrowser as f, isBrowserRunUndispatchedActionError as g, browserRunInteractiveLayer as h, BrowserRunInteractiveBinding as i, BrowserRunPageIdentity as l, browserRunInteractiveImplementation as m, BrowserRunHandoffResult as n, BrowserRunInteractiveHost as o, browserRunInteractiveHostLayer as p, BrowserRunHandoffState as r, BrowserRunLiveViewRequest as s, BrowserRunHandoffRequest as t, BrowserRunPageObservation as u, BrowserRunSessionLifecycle as v, browserFailure as x, BrowserRunBinding as y };
1922
1922
 
1923
- //# sourceMappingURL=InteractiveBrowser-D-xxDv_f.mjs.map
1923
+ //# sourceMappingURL=InteractiveBrowser-CxFT-Nwm.mjs.map