@effect-agent/platform-cloudflare 0.1.0-beta.48 → 0.1.0-beta.50
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/CloudflareCodeMode.mjs +0 -7
- package/dist/CloudflareCodeMode.mjs.map +1 -1
- package/dist/CloudflareThreadClient.d.mts +40 -39
- package/dist/InteractiveBrowser.mjs +2 -1
- package/dist/InteractiveBrowser.mjs.map +1 -1
- package/dist/{ThreadObject-DH1RYqyz.d.mts → ThreadObject-CmeEjnBK.d.mts} +18 -18
- package/dist/ThreadObject.d.mts +1 -1
- package/dist/index.d.mts +1 -1
- package/package.json +1 -1
- package/src/CloudflareCodeMode.ts +0 -12
- package/src/InteractiveBrowser.ts +3 -1
|
@@ -201,7 +201,6 @@ const HarnessCompleted = Schema.TaggedStruct("completed", {
|
|
|
201
201
|
logBytes: Schema.Natural,
|
|
202
202
|
resultBytes: Schema.Natural
|
|
203
203
|
});
|
|
204
|
-
const HarnessSourceInvalid = Schema.TaggedStruct("source-invalid", { message: Schema.String });
|
|
205
204
|
const HarnessNotAFunction = Schema.TaggedStruct("source-not-a-function", { actual: Schema.String });
|
|
206
205
|
const HarnessProgramFailed = Schema.TaggedStruct("program-failed", {
|
|
207
206
|
reason: Schema.Literals([
|
|
@@ -229,7 +228,6 @@ const HarnessHostCallLimit = Schema.TaggedStruct("host-call-limit", { logs: Boun
|
|
|
229
228
|
const HarnessProtocol = Schema.TaggedStruct("protocol", { message: Schema.String });
|
|
230
229
|
const HarnessOutcome = Schema.Union([
|
|
231
230
|
HarnessCompleted,
|
|
232
|
-
HarnessSourceInvalid,
|
|
233
231
|
HarnessNotAFunction,
|
|
234
232
|
HarnessProgramFailed,
|
|
235
233
|
HarnessLogLimit,
|
|
@@ -522,11 +520,6 @@ const makeExecute = (options, clock) => Effect.fn("DynamicWorkerCodeExecutor.exe
|
|
|
522
520
|
resultBytes: outcome.value.resultBytes
|
|
523
521
|
})
|
|
524
522
|
});
|
|
525
|
-
case "source-invalid": return yield* CodeSourceError.make({
|
|
526
|
-
implementation: dynamicWorkerImplementation,
|
|
527
|
-
reason: "invalid",
|
|
528
|
-
message: outcome.value.message.slice(0, 8e3)
|
|
529
|
-
});
|
|
530
523
|
case "source-not-a-function": return yield* CodeSourceError.make({
|
|
531
524
|
implementation: dynamicWorkerImplementation,
|
|
532
525
|
reason: "not-a-function",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudflareCodeMode.mjs","names":["#dispatch"],"sources":["../src/CloudflareCodeMode.ts"],"sourcesContent":["import {\n CodeExecutionHost,\n CodeExecutionResourceUse,\n CodeExecutionResult,\n CodeExecutionTimeoutError,\n CodeExecutor,\n CodeExecutorStartError,\n CodeExecutorTerminatedError,\n CodeExecutorUnsupportedError,\n CodeExecutionProtocolError,\n CodeHostCall,\n CodeHostCallLimitError,\n CodeHostCallResult,\n CodeOutputLimitError,\n CodeProgramFailedError,\n CodeSourceError,\n type CodeExecutorExecute,\n type CodeExecutionRequest,\n} from \"@effect-agent/sandbox/CodeExecutor\";\nimport { SandboxImplementation } from \"@effect-agent/sandbox/Sandbox\";\nimport { RpcTarget } from \"cloudflare:workers\";\nimport { Clock, Duration, Effect, Exit, Fiber, Layer, Option, Queue, Schema } from \"effect\";\n\nimport { safeCauseDiagnostic, safeCauseMessage } from \"./internal/boundary.ts\";\n\n/**\n * The Cloudflare Dynamic Worker `CodeExecutor` adapter (C4 of ADR-0017;\n * DEPLOY-011). Each pass loads one fresh Worker through the Worker Loader\n * with `globalOutbound: null`, so generated code has no ambient network,\n * bindings, or secrets; its only authority is the pass-scoped RPC target that\n * routes back into the owning event's `CodeExecutionHost` service. Platform\n * CPU limits stop synchronous runaway programs; the executor-owned wall-clock\n * deadline interrupts asynchronously suspended passes. Deployment class `E`\n * only: the adapter records no persistent state and a later pass may run in a\n * completely different isolate.\n */\nexport const dynamicWorkerImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-dynamic-worker\",\n});\n\ninterface CodeModePassHost extends Rpc.RpcTargetBranded {\n readonly call: (hostCall: unknown) => Promise<unknown>;\n}\n\ninterface CodeModeHarnessEntrypoint extends Rpc.WorkerEntrypointBranded {\n readonly run: (host: CodeModePassHost) => Promise<unknown>;\n}\n\n/**\n * One object-capability endpoint for one execution pass. Workers RPC invokes\n * the target in the request context where it was created, so the native\n * Promise returned by `dispatch` and the Effect fiber that settles it share\n * one I/O owner. Passing the target as `run()`'s argument also scopes the\n * remote stub to that RPC call; no request state lives at module scope.\n */\nclass CodeModePassHostTarget extends RpcTarget implements CodeModePassHost {\n readonly #dispatch: (hostCall: unknown) => Promise<unknown>;\n\n constructor(dispatch: (hostCall: unknown) => Promise<unknown>) {\n super();\n this.#dispatch = dispatch;\n }\n\n call(hostCall: unknown): Promise<unknown> {\n return this.#dispatch(hostCall);\n }\n}\n\n/**\n * The fixed harness loaded as the dynamic worker's main module. The generated\n * source becomes `program.mjs` (`export default (<expression>);`) — a module,\n * never `eval`. The harness installs namespace globals and a bounded console,\n * imports the program, invokes it exactly once, and returns one envelope the\n * host validates through Effect Schema.\n */\nconst HARNESS_MODULE = String.raw`\nimport { WorkerEntrypoint } from \"cloudflare:workers\";\nimport programDefault from \"./program.js\";\n\nconst encoder = new TextEncoder();\nconst utf8 = (text) => encoder.encode(text).byteLength;\nconst safeText = (value) => {\n try {\n if (value instanceof Error) return (value.name + \": \" + value.message).slice(0, 4000);\n if (typeof value === \"string\") return value.slice(0, 4000);\n const encoded = JSON.stringify(value);\n return (encoded === undefined ? String(value) : encoded).slice(0, 4000);\n } catch {\n return \"[unserializable value]\";\n }\n};\nconst safeJson = (value) => {\n try {\n const encoded = JSON.stringify(value);\n if (encoded !== undefined && encoded.length <= 4000) return JSON.parse(encoded);\n } catch {}\n return safeText(value);\n};\n\nexport default class CodeModeHarness extends WorkerEntrypoint {\n async run(host) {\n const config = this.env.CODE_MODE_PASS;\n const limits = config.limits;\n const logs = [];\n let logBytes = 0;\n let fatal;\n const boundedLogs = () => logs.slice(0, 4096);\n const write = (...values) => {\n const joined = values.map(safeText).join(\" \");\n const line = joined.length > 16000 ? joined.slice(0, 15999) + \"…\" : joined;\n const bytes = utf8(line);\n if (logs.length >= 4096 || logBytes + bytes > limits.maxLogBytes) {\n fatal = fatal ?? { _tag: \"log-limit\", observed: logBytes + bytes, logs: boundedLogs() };\n throw new Error(\"code-mode log limit exceeded\");\n }\n logs.push(line);\n logBytes += bytes;\n };\n globalThis.console = { log: write, info: write, warn: write, error: write, debug: write };\n\n let hostCalls = 0;\n const makeMethod = (namespace, method) => async (argument) => {\n hostCalls += 1;\n if (hostCalls > limits.maxHostCalls) {\n fatal = fatal ?? { _tag: \"host-call-limit\", logs: boundedLogs() };\n throw new Error(\"code-mode host-call limit exceeded\");\n }\n let argText;\n try {\n argText = JSON.stringify(argument);\n } catch {}\n if (argText === undefined || utf8(argText) > limits.maxHostCallArgumentBytes) {\n fatal = fatal ?? {\n _tag: \"argument-limit\",\n observed: argText === undefined ? 0 : utf8(argText),\n logs: boundedLogs(),\n };\n throw new Error(\"code-mode host-call argument limit exceeded\");\n }\n const outcome = await host.call({\n namespace,\n method,\n argument: JSON.parse(argText),\n });\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallSuccess\") {\n return outcome.value;\n }\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallFailure\") {\n throw outcome.error;\n }\n fatal = fatal ?? { _tag: \"protocol\", message: \"host returned an unrecognized outcome\" };\n throw new Error(\"code-mode host protocol violation\");\n };\n for (const namespace of config.namespaces) {\n const methods = {};\n for (const method of namespace.methods) {\n methods[method] = makeMethod(namespace.name, method);\n }\n globalThis[namespace.name] = methods;\n }\n\n // program.js is imported statically at the top of this module, so a\n // syntactically invalid program fails the whole harness at load (mapped\n // to a source error by the host). Using a static import keeps this module\n // free of dynamic-import expressions, which single-script Miniflare hosts\n // reject. The isolation boundary does NOT depend on the ordering of this\n // import versus the console/namespace shims installed below: the loaded\n // Worker has globalOutbound: null and no bindings, secrets, or env from\n // the Worker Loader config BEFORE any module in the graph evaluates, so\n // module-level program code has no ambient authority regardless. The\n // shims below are usability wrappers (bounded console, namespace globals),\n // and the accepted program is a single async-function expression whose\n // body runs only when invoked here — after the shims exist.\n const program = programDefault;\n if (typeof program !== \"function\") {\n return { _tag: \"source-not-a-function\", actual: typeof program };\n }\n try {\n const value = await program();\n if (fatal !== undefined) return fatal;\n let text;\n try {\n text = JSON.stringify(value);\n } catch {}\n if (text === undefined) {\n return {\n _tag: \"program-failed\",\n reason: \"non-json-result\",\n thrown: null,\n message: \"The program must return a JSON value\",\n logs: boundedLogs(),\n };\n }\n const resultBytes = utf8(text);\n if (resultBytes > limits.maxResultBytes) {\n return { _tag: \"result-limit\", observed: resultBytes, logs: boundedLogs() };\n }\n return {\n _tag: \"completed\",\n value: JSON.parse(text),\n logs: boundedLogs(),\n hostCalls,\n logBytes,\n resultBytes,\n };\n } catch (cause) {\n if (fatal !== undefined) return fatal;\n return {\n _tag: \"program-failed\",\n reason: cause instanceof Error ? \"threw\" : \"rejected\",\n thrown: safeJson(cause),\n message: safeText(cause),\n logs: boundedLogs(),\n };\n }\n }\n}\n`;\n\nconst BoundedLogs = Schema.Array(Schema.String.check(Schema.isMaxLength(16 * 1024))).check(\n Schema.isMaxLength(4_096),\n);\n\nconst HarnessCompleted = Schema.TaggedStruct(\"completed\", {\n value: Schema.Json,\n logs: BoundedLogs,\n hostCalls: Schema.Natural,\n logBytes: Schema.Natural,\n resultBytes: Schema.Natural,\n});\n\nconst HarnessSourceInvalid = Schema.TaggedStruct(\"source-invalid\", {\n message: Schema.String,\n});\n\nconst HarnessNotAFunction = Schema.TaggedStruct(\"source-not-a-function\", {\n actual: Schema.String,\n});\n\nconst HarnessProgramFailed = Schema.TaggedStruct(\"program-failed\", {\n reason: Schema.Literals([\"threw\", \"rejected\", \"non-json-result\"]),\n thrown: Schema.Json,\n message: Schema.String,\n logs: BoundedLogs,\n});\n\nconst HarnessLogLimit = Schema.TaggedStruct(\"log-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessArgumentLimit = Schema.TaggedStruct(\"argument-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessResultLimit = Schema.TaggedStruct(\"result-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessHostCallLimit = Schema.TaggedStruct(\"host-call-limit\", {\n logs: BoundedLogs,\n});\n\nconst HarnessProtocol = Schema.TaggedStruct(\"protocol\", {\n message: Schema.String,\n});\n\nconst HarnessOutcome = Schema.Union([\n HarnessCompleted,\n HarnessSourceInvalid,\n HarnessNotAFunction,\n HarnessProgramFailed,\n HarnessLogLimit,\n HarnessArgumentLimit,\n HarnessResultLimit,\n HarnessHostCallLimit,\n HarnessProtocol,\n]);\n\nconst HarnessPassConfig = Schema.Struct({\n namespaces: Schema.Array(\n Schema.Struct({\n name: Schema.NonEmptyString,\n methods: Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(64)),\n }),\n ).check(Schema.isMaxLength(32)),\n limits: Schema.Struct({\n maxLogBytes: Schema.Natural,\n maxResultBytes: Schema.Natural,\n maxHostCalls: Schema.Natural,\n maxHostCallArgumentBytes: Schema.Natural,\n }),\n});\n\nconst encodeHarnessPassConfig = Schema.encodeSync(HarnessPassConfig);\nconst encodeJsonPayload = Schema.encodeSync(Schema.fromJsonString(Schema.Json));\nconst decodeJsonPayload = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));\n\nconst decodeHarnessOutcome = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(HarnessOutcome)(value);\n } catch {\n return Option.none<typeof HarnessOutcome.Type>();\n }\n};\n\nconst decodeHostCall = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCall)(value);\n } catch {\n return Option.none<CodeHostCall>();\n }\n};\n\nconst decodeHostCallResult = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCallResult)(value);\n } catch {\n return Option.none<CodeHostCallResult>();\n }\n};\n\n/** Dispose a Cloudflare RPC handle when the runtime supplies its untyped disposal hook. @internal */\nexport const disposeRpcHandle = (handle: unknown): Effect.Effect<void> =>\n Effect.try({\n try: () => {\n if ((typeof handle !== \"object\" && typeof handle !== \"function\") || handle === null) return;\n if (!(Symbol.dispose in handle)) return;\n const dispose = Reflect.get(handle, Symbol.dispose);\n\n if (typeof dispose === \"function\") {\n Reflect.apply(dispose, handle, []);\n }\n },\n catch: (cause) =>\n safeCauseDiagnostic(cause, \"The Cloudflare RPC disposal hook failed without a diagnostic\"),\n }).pipe(\n Effect.catch((diagnostic) =>\n Effect.logWarning(`Cloudflare RPC handle disposal failed: ${diagnostic}`).pipe(\n Effect.ignoreCause,\n ),\n ),\n );\n\n/**\n * Project a host outcome to the plain JSON envelope the harness reads. A\n * `CodeExecutionHost` may return either real `CodeHostCallResult` instances\n * (the substitute and conformance kit) or plain-object equivalents (the Code\n * Mode capability's broker route), so this reads the shared fields rather than\n * `Schema.encodeSync`, which would reject a plain object.\n */\ninterface EncodedHostResultPayload {\n readonly encodedPayload: string;\n readonly resultBytes: number;\n}\n\nconst encodeHostResultPayload = (\n outcome: CodeHostCallResult,\n): EncodedHostResultPayload | undefined => {\n try {\n const payload = outcome._tag === \"CodeHostCallSuccess\" ? outcome.value : outcome.error;\n const encodedPayload = encodeJsonPayload(payload);\n\n return {\n encodedPayload,\n resultBytes: utf8ByteLength(encodedPayload),\n };\n } catch {\n return undefined;\n }\n};\n\nconst utf8ByteLength = (value: string): number => {\n let total = 0;\n\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n\n total += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;\n }\n\n return total;\n};\n\ninterface QueuedHostCall {\n readonly call: CodeHostCall;\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n}\n\ntype HostWork =\n | { readonly _tag: \"call\"; readonly queued: QueuedHostCall }\n | { readonly _tag: \"limit\" };\n\ntype HostDispatchError =\n | CodeExecutionTimeoutError\n | CodeOutputLimitError\n | CodeExecutionProtocolError\n | CodeHostCallLimitError;\n\n/** Reserved global names the harness owns inside the dynamic worker. */\nconst reservedHarnessGlobals = new Set([\"console\"]);\n\nexport interface DynamicWorkerCodeExecutorOptions {\n /** The `worker_loader` binding. */\n readonly loader: WorkerLoader;\n /** Compatibility date for dynamic workers; defaults to `2025-05-01`. */\n readonly compatibilityDate?: string | undefined;\n}\n\nconst makeExecute = (\n options: DynamicWorkerCodeExecutorOptions,\n clock: Clock.Clock,\n): CodeExecutorExecute =>\n Effect.fn(\"DynamicWorkerCodeExecutor.execute\")(function* (request: CodeExecutionRequest) {\n if (request.network._tag !== \"NetworkDisabled\") {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"network\",\n message:\n \"The Dynamic Worker executor denies all egress with globalOutbound: null; an allowlist is not supported in the first slice\",\n });\n }\n const sourceBytes = utf8ByteLength(request.source);\n\n if (sourceBytes > request.limits.maxSourceBytes) {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"oversized\",\n message: `Source is ${sourceBytes} bytes; the request allows ${request.limits.maxSourceBytes}`,\n });\n }\n for (const namespace of request.namespaces) {\n if (reservedHarnessGlobals.has(namespace.name)) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"namespaces\",\n message: `Namespace ${namespace.name} collides with a harness binding`,\n });\n }\n }\n const host = yield* CodeExecutionHost;\n\n // This synchronous clock access is confined to callbacks that must compute a timeout\n // immediately. The Clock service remains the authority, so tests and hosts can replace it.\n const startedAt = clock.monotonicTimeNanosUnsafe();\n const passDeadline = startedAt + Duration.toNanosUnsafe(request.limits.maxWallTime);\n\n const remainingPassWallTime = (): Duration.Duration => {\n const now = clock.monotonicTimeNanosUnsafe();\n\n return Duration.nanos(passDeadline > now ? passDeadline - now : 0n);\n };\n\n let issuedHostCalls = 0;\n let passOpen = true;\n const queuedHostCalls: Array<QueuedHostCall> = [];\n let passFailure: HostDispatchError | undefined;\n\n const failPass = (error: HostDispatchError): void => {\n if (passFailure === undefined) passFailure = error;\n };\n\n const rejectQueuedHostCalls = (reason: Error): void => {\n for (const queued of queuedHostCalls.splice(0)) {\n queued.reject(reason);\n }\n };\n\n const queue = yield* Queue.unbounded<HostWork>();\n\n const deliverHostOutcome = (\n queued: QueuedHostCall,\n outcome: CodeHostCallResult,\n ): Effect.Effect<void, CodeExecutionProtocolError | CodeOutputLimitError> =>\n Effect.gen(function* () {\n const decoded = decodeHostCallResult(outcome);\n\n if (Option.isNone(decoded)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a value outside the CodeHostCallResult schema\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n const encoded = encodeHostResultPayload(decoded.value);\n\n if (encoded === undefined || encoded.resultBytes > request.limits.maxHostCallResultBytes) {\n const error = CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-result\",\n limit: request.limits.maxHostCallResultBytes,\n observed: encoded?.resultBytes ?? 0,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const normalizedPayload = decodeJsonPayload(encoded.encodedPayload);\n\n if (Option.isNone(normalizedPayload)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a result that could not cross the JSON boundary\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n queued.resolve(\n decoded.value._tag === \"CodeHostCallSuccess\"\n ? { _tag: \"CodeHostCallSuccess\", value: normalizedPayload.value }\n : { _tag: \"CodeHostCallFailure\", error: normalizedPayload.value },\n );\n });\n\n // Workers RPC into the loader isolate cannot settle on the fiber blocked\n // in `entrypoint.run()`. A Scope-owned sibling fiber keeps that\n // independence while inheriting the pass Context and dying with the Scope.\n const serveHostCalls = Effect.gen(function* () {\n while (true) {\n const work = yield* Queue.take(queue);\n\n if (work._tag === \"limit\") {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const queued = work.queued;\n\n yield* host.call(queued.call).pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () => {\n const error = CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n });\n\n failPass(error);\n\n return error;\n },\n }),\n Effect.flatMap((outcome) => deliverHostOutcome(queued, outcome)),\n Effect.tapError(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode host call failed\"))),\n ),\n Effect.onInterrupt(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode pass is closing\"))),\n ),\n );\n }\n });\n\n const server = yield* serveHostCalls.pipe(Effect.forkScoped);\n\n const dispatch = (hostCall: unknown): Promise<unknown> => {\n if (!passOpen) {\n return Promise.reject(new Error(\"Code Mode pass is closing\"));\n }\n issuedHostCalls += 1;\n if (issuedHostCalls > request.limits.maxHostCalls) {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n Queue.offerUnsafe(queue, { _tag: \"limit\" });\n\n return Promise.reject(new Error(\"host-call limit exceeded\"));\n }\n const decoded = decodeHostCall(hostCall);\n\n if (Option.isNone(decoded)) {\n return Promise.reject(new TypeError(\"host calls must match the CodeHostCall schema\"));\n }\n\n return new Promise((resolve, reject) => {\n const queued = { call: decoded.value, resolve, reject };\n\n queuedHostCalls.push(queued);\n Queue.offerUnsafe(queue, { _tag: \"call\", queued });\n });\n };\n\n const closeAdmission = Effect.sync(() => {\n passOpen = false;\n rejectQueuedHostCalls(new Error(\"Code Mode pass is closing\"));\n });\n\n yield* Effect.addFinalizer(() => closeAdmission.pipe(Effect.andThen(Fiber.interrupt(server))));\n\n // No `allowExperimental`: the runtime only accepts it when the CALLING\n // worker carries the `experimental` compatibility flag, which deployed\n // consumers cannot set — the option would reject every pass in\n // production. The harness needs no experimental runtime features.\n const workerCode: WorkerLoaderWorkerCode = {\n compatibilityDate: options.compatibilityDate ?? \"2025-05-01\",\n mainModule: \"harness.js\",\n modules: {\n \"harness.js\": HARNESS_MODULE,\n \"program.js\": `export default (\\n${request.source}\\n);`,\n },\n env: {\n CODE_MODE_PASS: encodeHarnessPassConfig({\n namespaces: request.namespaces.map((namespace) => ({\n name: namespace.name,\n methods: namespace.methods,\n })),\n limits: {\n maxLogBytes: request.limits.maxLogBytes,\n maxResultBytes: request.limits.maxResultBytes,\n maxHostCalls: request.limits.maxHostCalls,\n maxHostCallArgumentBytes: request.limits.maxHostCallArgumentBytes,\n },\n }),\n },\n globalOutbound: null,\n ...(request.limits.cpuMillis === undefined\n ? {}\n : {\n limits: {\n cpuMs: request.limits.cpuMillis,\n subRequests: request.limits.maxHostCalls + 8,\n },\n }),\n };\n\n const worker = yield* Effect.acquireRelease(\n Effect.try({\n try: () => options.loader.load(workerCode),\n catch: (cause) => {\n const text = safeCauseMessage(cause, \"The Worker Loader failed without a diagnostic\");\n\n // Blame the program's source ONLY on a genuine compile diagnostic;\n // any other load rejection is an infrastructure start failure, not\n // the model's fault (see classifyWorkerFailure for the same split).\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: `The Worker Loader rejected the pass: ${text}`.slice(0, 8_000),\n cause,\n });\n },\n }),\n disposeRpcHandle,\n );\n\n const entrypoint = yield* Effect.acquireRelease(\n Effect.try({\n try: () => worker.getEntrypoint<CodeModeHarnessEntrypoint>(),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n }),\n disposeRpcHandle,\n );\n\n const rpc = Effect.tryPromise({\n try: () => entrypoint.run(new CodeModePassHostTarget(dispatch)),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n });\n\n const exit = yield* Effect.raceFirst(\n rpc.pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () =>\n CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n }),\n }),\n ),\n Fiber.join(server),\n ).pipe(Effect.exit);\n\n yield* closeAdmission;\n yield* Fiber.interrupt(server);\n if (passFailure !== undefined) {\n return yield* passFailure;\n }\n if (Exit.isFailure(exit)) {\n return yield* Effect.failCause(exit.cause);\n }\n const raw = exit.value;\n const finishedAt = clock.monotonicTimeNanosUnsafe();\n\n const outcome = decodeHarnessOutcome(raw);\n\n if (Option.isNone(outcome)) {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The dynamic worker returned a value outside the harness envelope schema\",\n });\n }\n switch (outcome.value._tag) {\n case \"completed\": {\n return CodeExecutionResult.make({\n implementation: dynamicWorkerImplementation,\n value: outcome.value.value,\n logs: outcome.value.logs,\n resourceUse: CodeExecutionResourceUse.make({\n wallTime: Duration.nanos(finishedAt > startedAt ? finishedAt - startedAt : 0n),\n hostCalls: outcome.value.hostCalls,\n logBytes: outcome.value.logBytes,\n resultBytes: outcome.value.resultBytes,\n }),\n });\n }\n case \"source-invalid\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n case \"source-not-a-function\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"not-a-function\",\n message: `The source expression evaluated to ${outcome.value.actual}; it must evaluate to one async function`,\n });\n }\n case \"program-failed\": {\n return yield* CodeProgramFailedError.make({\n implementation: dynamicWorkerImplementation,\n reason: outcome.value.reason,\n thrown: outcome.value.thrown,\n message: outcome.value.message.slice(0, 8_000),\n logs: outcome.value.logs,\n });\n }\n case \"log-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"logs\",\n limit: request.limits.maxLogBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"argument-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-argument\",\n limit: request.limits.maxHostCallArgumentBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"result-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"result\",\n limit: request.limits.maxResultBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"host-call-limit\": {\n return yield* CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: outcome.value.logs,\n });\n }\n case \"protocol\": {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n }\n });\n\n/**\n * Expected worker-level failures map into the typed union with bounded\n * diagnostics; anything unrecognized stays a start/termination error rather\n * than a fabricated program result.\n */\nconst classifyWorkerFailure = (\n cause: unknown,\n maxWallTime: Duration.Duration,\n):\n | CodeExecutionTimeoutError\n | CodeExecutorTerminatedError\n | CodeExecutorStartError\n | CodeSourceError => {\n const text = safeCauseDiagnostic(cause, \"[unserializable worker failure]\");\n\n // `WorkerLoader.load()` is lazy, so a module-compile error in the generated\n // program surfaces here at first use. Blame the program's source ONLY on a\n // genuine compile diagnostic (a `SyntaxError` or an explicit compile\n // failure) — the fixed harness is valid, so the fault is in program.js. A\n // bare \"failed to start Worker\" without a compile diagnostic is an\n // infrastructure start failure, not the model's fault, so it must NOT be\n // misclassified as a source error.\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n if (/cpu/i.test(text)) {\n return CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"cpu\",\n maxWallTime,\n logs: [],\n });\n }\n if (/failed to start worker/i.test(text)) {\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n cause,\n });\n }\n\n return CodeExecutorTerminatedError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n });\n};\n\n/** Layer building the Dynamic Worker `CodeExecutor` from resolved bindings. */\nexport const dynamicWorkerCodeExecutorLayer = (\n options: DynamicWorkerCodeExecutorOptions,\n): Layer.Layer<CodeExecutor> =>\n Layer.effect(\n CodeExecutor,\n Effect.gen(function* () {\n const clock = yield* Clock.Clock;\n\n return CodeExecutor.of({ execute: makeExecute(options, clock) });\n }),\n );\n\n/** Assemble Code Mode handlers with the isolated Dynamic Worker executor. */\nexport const CloudflareCodeMode = {\n /**\n * Provide the selected tool handlers at construction, where Code Mode captures them.\n * Their errors and remaining dependencies stay visible. The definition still owns the\n * allowlist and limits; the runtime supplies the live Tool broker for each scoped pass.\n */\n layer: <A, E, R, Handlers, HandlerError, HandlerRequirements>(\n definition: { readonly handlers: Layer.Layer<A, E, R> },\n options: DynamicWorkerCodeExecutorOptions & {\n readonly handlers: Layer.Layer<Handlers, HandlerError, HandlerRequirements>;\n },\n ) =>\n definition.handlers.pipe(\n Layer.provide(options.handlers),\n Layer.provide(dynamicWorkerCodeExecutorLayer(options)),\n ),\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CloudflareCodeMode.mjs","names":["#dispatch"],"sources":["../src/CloudflareCodeMode.ts"],"sourcesContent":["import {\n CodeExecutionHost,\n CodeExecutionResourceUse,\n CodeExecutionResult,\n CodeExecutionTimeoutError,\n CodeExecutor,\n CodeExecutorStartError,\n CodeExecutorTerminatedError,\n CodeExecutorUnsupportedError,\n CodeExecutionProtocolError,\n CodeHostCall,\n CodeHostCallLimitError,\n CodeHostCallResult,\n CodeOutputLimitError,\n CodeProgramFailedError,\n CodeSourceError,\n type CodeExecutorExecute,\n type CodeExecutionRequest,\n} from \"@effect-agent/sandbox/CodeExecutor\";\nimport { SandboxImplementation } from \"@effect-agent/sandbox/Sandbox\";\nimport { RpcTarget } from \"cloudflare:workers\";\nimport { Clock, Duration, Effect, Exit, Fiber, Layer, Option, Queue, Schema } from \"effect\";\n\nimport { safeCauseDiagnostic, safeCauseMessage } from \"./internal/boundary.ts\";\n\n/**\n * The Cloudflare Dynamic Worker `CodeExecutor` adapter (C4 of ADR-0017;\n * DEPLOY-011). Each pass loads one fresh Worker through the Worker Loader\n * with `globalOutbound: null`, so generated code has no ambient network,\n * bindings, or secrets; its only authority is the pass-scoped RPC target that\n * routes back into the owning event's `CodeExecutionHost` service. Platform\n * CPU limits stop synchronous runaway programs; the executor-owned wall-clock\n * deadline interrupts asynchronously suspended passes. Deployment class `E`\n * only: the adapter records no persistent state and a later pass may run in a\n * completely different isolate.\n */\nexport const dynamicWorkerImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-dynamic-worker\",\n});\n\ninterface CodeModePassHost extends Rpc.RpcTargetBranded {\n readonly call: (hostCall: unknown) => Promise<unknown>;\n}\n\ninterface CodeModeHarnessEntrypoint extends Rpc.WorkerEntrypointBranded {\n readonly run: (host: CodeModePassHost) => Promise<unknown>;\n}\n\n/**\n * One object-capability endpoint for one execution pass. Workers RPC invokes\n * the target in the request context where it was created, so the native\n * Promise returned by `dispatch` and the Effect fiber that settles it share\n * one I/O owner. Passing the target as `run()`'s argument also scopes the\n * remote stub to that RPC call; no request state lives at module scope.\n */\nclass CodeModePassHostTarget extends RpcTarget implements CodeModePassHost {\n readonly #dispatch: (hostCall: unknown) => Promise<unknown>;\n\n constructor(dispatch: (hostCall: unknown) => Promise<unknown>) {\n super();\n this.#dispatch = dispatch;\n }\n\n call(hostCall: unknown): Promise<unknown> {\n return this.#dispatch(hostCall);\n }\n}\n\n/**\n * The fixed harness loaded as the dynamic worker's main module. The generated\n * source becomes `program.mjs` (`export default (<expression>);`) — a module,\n * never `eval`. The harness installs namespace globals and a bounded console,\n * imports the program, invokes it exactly once, and returns one envelope the\n * host validates through Effect Schema.\n */\nconst HARNESS_MODULE = String.raw`\nimport { WorkerEntrypoint } from \"cloudflare:workers\";\nimport programDefault from \"./program.js\";\n\nconst encoder = new TextEncoder();\nconst utf8 = (text) => encoder.encode(text).byteLength;\nconst safeText = (value) => {\n try {\n if (value instanceof Error) return (value.name + \": \" + value.message).slice(0, 4000);\n if (typeof value === \"string\") return value.slice(0, 4000);\n const encoded = JSON.stringify(value);\n return (encoded === undefined ? String(value) : encoded).slice(0, 4000);\n } catch {\n return \"[unserializable value]\";\n }\n};\nconst safeJson = (value) => {\n try {\n const encoded = JSON.stringify(value);\n if (encoded !== undefined && encoded.length <= 4000) return JSON.parse(encoded);\n } catch {}\n return safeText(value);\n};\n\nexport default class CodeModeHarness extends WorkerEntrypoint {\n async run(host) {\n const config = this.env.CODE_MODE_PASS;\n const limits = config.limits;\n const logs = [];\n let logBytes = 0;\n let fatal;\n const boundedLogs = () => logs.slice(0, 4096);\n const write = (...values) => {\n const joined = values.map(safeText).join(\" \");\n const line = joined.length > 16000 ? joined.slice(0, 15999) + \"…\" : joined;\n const bytes = utf8(line);\n if (logs.length >= 4096 || logBytes + bytes > limits.maxLogBytes) {\n fatal = fatal ?? { _tag: \"log-limit\", observed: logBytes + bytes, logs: boundedLogs() };\n throw new Error(\"code-mode log limit exceeded\");\n }\n logs.push(line);\n logBytes += bytes;\n };\n globalThis.console = { log: write, info: write, warn: write, error: write, debug: write };\n\n let hostCalls = 0;\n const makeMethod = (namespace, method) => async (argument) => {\n hostCalls += 1;\n if (hostCalls > limits.maxHostCalls) {\n fatal = fatal ?? { _tag: \"host-call-limit\", logs: boundedLogs() };\n throw new Error(\"code-mode host-call limit exceeded\");\n }\n let argText;\n try {\n argText = JSON.stringify(argument);\n } catch {}\n if (argText === undefined || utf8(argText) > limits.maxHostCallArgumentBytes) {\n fatal = fatal ?? {\n _tag: \"argument-limit\",\n observed: argText === undefined ? 0 : utf8(argText),\n logs: boundedLogs(),\n };\n throw new Error(\"code-mode host-call argument limit exceeded\");\n }\n const outcome = await host.call({\n namespace,\n method,\n argument: JSON.parse(argText),\n });\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallSuccess\") {\n return outcome.value;\n }\n if (outcome !== null && typeof outcome === \"object\" && outcome._tag === \"CodeHostCallFailure\") {\n throw outcome.error;\n }\n fatal = fatal ?? { _tag: \"protocol\", message: \"host returned an unrecognized outcome\" };\n throw new Error(\"code-mode host protocol violation\");\n };\n for (const namespace of config.namespaces) {\n const methods = {};\n for (const method of namespace.methods) {\n methods[method] = makeMethod(namespace.name, method);\n }\n globalThis[namespace.name] = methods;\n }\n\n // program.js is imported statically at the top of this module, so a\n // syntactically invalid program fails the whole harness at load (mapped\n // to a source error by the host). Using a static import keeps this module\n // free of dynamic-import expressions, which single-script Miniflare hosts\n // reject. The isolation boundary does NOT depend on the ordering of this\n // import versus the console/namespace shims installed below: the loaded\n // Worker has globalOutbound: null and no bindings, secrets, or env from\n // the Worker Loader config BEFORE any module in the graph evaluates, so\n // module-level program code has no ambient authority regardless. The\n // shims below are usability wrappers (bounded console, namespace globals),\n // and the accepted program is a single async-function expression whose\n // body runs only when invoked here — after the shims exist.\n const program = programDefault;\n if (typeof program !== \"function\") {\n return { _tag: \"source-not-a-function\", actual: typeof program };\n }\n try {\n const value = await program();\n if (fatal !== undefined) return fatal;\n let text;\n try {\n text = JSON.stringify(value);\n } catch {}\n if (text === undefined) {\n return {\n _tag: \"program-failed\",\n reason: \"non-json-result\",\n thrown: null,\n message: \"The program must return a JSON value\",\n logs: boundedLogs(),\n };\n }\n const resultBytes = utf8(text);\n if (resultBytes > limits.maxResultBytes) {\n return { _tag: \"result-limit\", observed: resultBytes, logs: boundedLogs() };\n }\n return {\n _tag: \"completed\",\n value: JSON.parse(text),\n logs: boundedLogs(),\n hostCalls,\n logBytes,\n resultBytes,\n };\n } catch (cause) {\n if (fatal !== undefined) return fatal;\n return {\n _tag: \"program-failed\",\n reason: cause instanceof Error ? \"threw\" : \"rejected\",\n thrown: safeJson(cause),\n message: safeText(cause),\n logs: boundedLogs(),\n };\n }\n }\n}\n`;\n\nconst BoundedLogs = Schema.Array(Schema.String.check(Schema.isMaxLength(16 * 1024))).check(\n Schema.isMaxLength(4_096),\n);\n\nconst HarnessCompleted = Schema.TaggedStruct(\"completed\", {\n value: Schema.Json,\n logs: BoundedLogs,\n hostCalls: Schema.Natural,\n logBytes: Schema.Natural,\n resultBytes: Schema.Natural,\n});\n\nconst HarnessNotAFunction = Schema.TaggedStruct(\"source-not-a-function\", {\n actual: Schema.String,\n});\n\nconst HarnessProgramFailed = Schema.TaggedStruct(\"program-failed\", {\n reason: Schema.Literals([\"threw\", \"rejected\", \"non-json-result\"]),\n thrown: Schema.Json,\n message: Schema.String,\n logs: BoundedLogs,\n});\n\nconst HarnessLogLimit = Schema.TaggedStruct(\"log-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessArgumentLimit = Schema.TaggedStruct(\"argument-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessResultLimit = Schema.TaggedStruct(\"result-limit\", {\n observed: Schema.Natural,\n logs: BoundedLogs,\n});\n\nconst HarnessHostCallLimit = Schema.TaggedStruct(\"host-call-limit\", {\n logs: BoundedLogs,\n});\n\nconst HarnessProtocol = Schema.TaggedStruct(\"protocol\", {\n message: Schema.String,\n});\n\nconst HarnessOutcome = Schema.Union([\n HarnessCompleted,\n HarnessNotAFunction,\n HarnessProgramFailed,\n HarnessLogLimit,\n HarnessArgumentLimit,\n HarnessResultLimit,\n HarnessHostCallLimit,\n HarnessProtocol,\n]);\n\nconst HarnessPassConfig = Schema.Struct({\n namespaces: Schema.Array(\n Schema.Struct({\n name: Schema.NonEmptyString,\n methods: Schema.Array(Schema.NonEmptyString).check(Schema.isMaxLength(64)),\n }),\n ).check(Schema.isMaxLength(32)),\n limits: Schema.Struct({\n maxLogBytes: Schema.Natural,\n maxResultBytes: Schema.Natural,\n maxHostCalls: Schema.Natural,\n maxHostCallArgumentBytes: Schema.Natural,\n }),\n});\n\nconst encodeHarnessPassConfig = Schema.encodeSync(HarnessPassConfig);\nconst encodeJsonPayload = Schema.encodeSync(Schema.fromJsonString(Schema.Json));\nconst decodeJsonPayload = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Json));\n\nconst decodeHarnessOutcome = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(HarnessOutcome)(value);\n } catch {\n return Option.none<typeof HarnessOutcome.Type>();\n }\n};\n\nconst decodeHostCall = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCall)(value);\n } catch {\n return Option.none<CodeHostCall>();\n }\n};\n\nconst decodeHostCallResult = (value: unknown) => {\n try {\n return Schema.decodeUnknownOption(CodeHostCallResult)(value);\n } catch {\n return Option.none<CodeHostCallResult>();\n }\n};\n\n/** Dispose a Cloudflare RPC handle when the runtime supplies its untyped disposal hook. @internal */\nexport const disposeRpcHandle = (handle: unknown): Effect.Effect<void> =>\n Effect.try({\n try: () => {\n if ((typeof handle !== \"object\" && typeof handle !== \"function\") || handle === null) return;\n if (!(Symbol.dispose in handle)) return;\n const dispose = Reflect.get(handle, Symbol.dispose);\n\n if (typeof dispose === \"function\") {\n Reflect.apply(dispose, handle, []);\n }\n },\n catch: (cause) =>\n safeCauseDiagnostic(cause, \"The Cloudflare RPC disposal hook failed without a diagnostic\"),\n }).pipe(\n Effect.catch((diagnostic) =>\n Effect.logWarning(`Cloudflare RPC handle disposal failed: ${diagnostic}`).pipe(\n Effect.ignoreCause,\n ),\n ),\n );\n\n/**\n * Project a host outcome to the plain JSON envelope the harness reads. A\n * `CodeExecutionHost` may return either real `CodeHostCallResult` instances\n * (the substitute and conformance kit) or plain-object equivalents (the Code\n * Mode capability's broker route), so this reads the shared fields rather than\n * `Schema.encodeSync`, which would reject a plain object.\n */\ninterface EncodedHostResultPayload {\n readonly encodedPayload: string;\n readonly resultBytes: number;\n}\n\nconst encodeHostResultPayload = (\n outcome: CodeHostCallResult,\n): EncodedHostResultPayload | undefined => {\n try {\n const payload = outcome._tag === \"CodeHostCallSuccess\" ? outcome.value : outcome.error;\n const encodedPayload = encodeJsonPayload(payload);\n\n return {\n encodedPayload,\n resultBytes: utf8ByteLength(encodedPayload),\n };\n } catch {\n return undefined;\n }\n};\n\nconst utf8ByteLength = (value: string): number => {\n let total = 0;\n\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n\n total += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;\n }\n\n return total;\n};\n\ninterface QueuedHostCall {\n readonly call: CodeHostCall;\n readonly resolve: (value: unknown) => void;\n readonly reject: (reason: unknown) => void;\n}\n\ntype HostWork =\n | { readonly _tag: \"call\"; readonly queued: QueuedHostCall }\n | { readonly _tag: \"limit\" };\n\ntype HostDispatchError =\n | CodeExecutionTimeoutError\n | CodeOutputLimitError\n | CodeExecutionProtocolError\n | CodeHostCallLimitError;\n\n/** Reserved global names the harness owns inside the dynamic worker. */\nconst reservedHarnessGlobals = new Set([\"console\"]);\n\nexport interface DynamicWorkerCodeExecutorOptions {\n /** The `worker_loader` binding. */\n readonly loader: WorkerLoader;\n /** Compatibility date for dynamic workers; defaults to `2025-05-01`. */\n readonly compatibilityDate?: string | undefined;\n}\n\nconst makeExecute = (\n options: DynamicWorkerCodeExecutorOptions,\n clock: Clock.Clock,\n): CodeExecutorExecute =>\n Effect.fn(\"DynamicWorkerCodeExecutor.execute\")(function* (request: CodeExecutionRequest) {\n if (request.network._tag !== \"NetworkDisabled\") {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"network\",\n message:\n \"The Dynamic Worker executor denies all egress with globalOutbound: null; an allowlist is not supported in the first slice\",\n });\n }\n const sourceBytes = utf8ByteLength(request.source);\n\n if (sourceBytes > request.limits.maxSourceBytes) {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"oversized\",\n message: `Source is ${sourceBytes} bytes; the request allows ${request.limits.maxSourceBytes}`,\n });\n }\n for (const namespace of request.namespaces) {\n if (reservedHarnessGlobals.has(namespace.name)) {\n return yield* CodeExecutorUnsupportedError.make({\n implementation: dynamicWorkerImplementation,\n feature: \"namespaces\",\n message: `Namespace ${namespace.name} collides with a harness binding`,\n });\n }\n }\n const host = yield* CodeExecutionHost;\n\n // This synchronous clock access is confined to callbacks that must compute a timeout\n // immediately. The Clock service remains the authority, so tests and hosts can replace it.\n const startedAt = clock.monotonicTimeNanosUnsafe();\n const passDeadline = startedAt + Duration.toNanosUnsafe(request.limits.maxWallTime);\n\n const remainingPassWallTime = (): Duration.Duration => {\n const now = clock.monotonicTimeNanosUnsafe();\n\n return Duration.nanos(passDeadline > now ? passDeadline - now : 0n);\n };\n\n let issuedHostCalls = 0;\n let passOpen = true;\n const queuedHostCalls: Array<QueuedHostCall> = [];\n let passFailure: HostDispatchError | undefined;\n\n const failPass = (error: HostDispatchError): void => {\n if (passFailure === undefined) passFailure = error;\n };\n\n const rejectQueuedHostCalls = (reason: Error): void => {\n for (const queued of queuedHostCalls.splice(0)) {\n queued.reject(reason);\n }\n };\n\n const queue = yield* Queue.unbounded<HostWork>();\n\n const deliverHostOutcome = (\n queued: QueuedHostCall,\n outcome: CodeHostCallResult,\n ): Effect.Effect<void, CodeExecutionProtocolError | CodeOutputLimitError> =>\n Effect.gen(function* () {\n const decoded = decodeHostCallResult(outcome);\n\n if (Option.isNone(decoded)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a value outside the CodeHostCallResult schema\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n const encoded = encodeHostResultPayload(decoded.value);\n\n if (encoded === undefined || encoded.resultBytes > request.limits.maxHostCallResultBytes) {\n const error = CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-result\",\n limit: request.limits.maxHostCallResultBytes,\n observed: encoded?.resultBytes ?? 0,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const normalizedPayload = decodeJsonPayload(encoded.encodedPayload);\n\n if (Option.isNone(normalizedPayload)) {\n const error = CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The execution host returned a result that could not cross the JSON boundary\",\n });\n\n failPass(error);\n\n return yield* error;\n }\n queued.resolve(\n decoded.value._tag === \"CodeHostCallSuccess\"\n ? { _tag: \"CodeHostCallSuccess\", value: normalizedPayload.value }\n : { _tag: \"CodeHostCallFailure\", error: normalizedPayload.value },\n );\n });\n\n // Workers RPC into the loader isolate cannot settle on the fiber blocked\n // in `entrypoint.run()`. A Scope-owned sibling fiber keeps that\n // independence while inheriting the pass Context and dying with the Scope.\n const serveHostCalls = Effect.gen(function* () {\n while (true) {\n const work = yield* Queue.take(queue);\n\n if (work._tag === \"limit\") {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n\n return yield* error;\n }\n const queued = work.queued;\n\n yield* host.call(queued.call).pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () => {\n const error = CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n });\n\n failPass(error);\n\n return error;\n },\n }),\n Effect.flatMap((outcome) => deliverHostOutcome(queued, outcome)),\n Effect.tapError(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode host call failed\"))),\n ),\n Effect.onInterrupt(() =>\n Effect.sync(() => queued.reject(new Error(\"Code Mode pass is closing\"))),\n ),\n );\n }\n });\n\n const server = yield* serveHostCalls.pipe(Effect.forkScoped);\n\n const dispatch = (hostCall: unknown): Promise<unknown> => {\n if (!passOpen) {\n return Promise.reject(new Error(\"Code Mode pass is closing\"));\n }\n issuedHostCalls += 1;\n if (issuedHostCalls > request.limits.maxHostCalls) {\n const error = CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: [],\n });\n\n failPass(error);\n Queue.offerUnsafe(queue, { _tag: \"limit\" });\n\n return Promise.reject(new Error(\"host-call limit exceeded\"));\n }\n const decoded = decodeHostCall(hostCall);\n\n if (Option.isNone(decoded)) {\n return Promise.reject(new TypeError(\"host calls must match the CodeHostCall schema\"));\n }\n\n return new Promise((resolve, reject) => {\n const queued = { call: decoded.value, resolve, reject };\n\n queuedHostCalls.push(queued);\n Queue.offerUnsafe(queue, { _tag: \"call\", queued });\n });\n };\n\n const closeAdmission = Effect.sync(() => {\n passOpen = false;\n rejectQueuedHostCalls(new Error(\"Code Mode pass is closing\"));\n });\n\n yield* Effect.addFinalizer(() => closeAdmission.pipe(Effect.andThen(Fiber.interrupt(server))));\n\n // No `allowExperimental`: the runtime only accepts it when the CALLING\n // worker carries the `experimental` compatibility flag, which deployed\n // consumers cannot set — the option would reject every pass in\n // production. The harness needs no experimental runtime features.\n const workerCode: WorkerLoaderWorkerCode = {\n compatibilityDate: options.compatibilityDate ?? \"2025-05-01\",\n mainModule: \"harness.js\",\n modules: {\n \"harness.js\": HARNESS_MODULE,\n \"program.js\": `export default (\\n${request.source}\\n);`,\n },\n env: {\n CODE_MODE_PASS: encodeHarnessPassConfig({\n namespaces: request.namespaces.map((namespace) => ({\n name: namespace.name,\n methods: namespace.methods,\n })),\n limits: {\n maxLogBytes: request.limits.maxLogBytes,\n maxResultBytes: request.limits.maxResultBytes,\n maxHostCalls: request.limits.maxHostCalls,\n maxHostCallArgumentBytes: request.limits.maxHostCallArgumentBytes,\n },\n }),\n },\n globalOutbound: null,\n ...(request.limits.cpuMillis === undefined\n ? {}\n : {\n limits: {\n cpuMs: request.limits.cpuMillis,\n subRequests: request.limits.maxHostCalls + 8,\n },\n }),\n };\n\n const worker = yield* Effect.acquireRelease(\n Effect.try({\n try: () => options.loader.load(workerCode),\n catch: (cause) => {\n const text = safeCauseMessage(cause, \"The Worker Loader failed without a diagnostic\");\n\n // Blame the program's source ONLY on a genuine compile diagnostic;\n // any other load rejection is an infrastructure start failure, not\n // the model's fault (see classifyWorkerFailure for the same split).\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: `The Worker Loader rejected the pass: ${text}`.slice(0, 8_000),\n cause,\n });\n },\n }),\n disposeRpcHandle,\n );\n\n const entrypoint = yield* Effect.acquireRelease(\n Effect.try({\n try: () => worker.getEntrypoint<CodeModeHarnessEntrypoint>(),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n }),\n disposeRpcHandle,\n );\n\n const rpc = Effect.tryPromise({\n try: () => entrypoint.run(new CodeModePassHostTarget(dispatch)),\n catch: (cause) => classifyWorkerFailure(cause, request.limits.maxWallTime),\n });\n\n const exit = yield* Effect.raceFirst(\n rpc.pipe(\n Effect.timeoutOrElse({\n duration: remainingPassWallTime(),\n orElse: () =>\n CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"wall-clock\",\n maxWallTime: request.limits.maxWallTime,\n logs: [],\n }),\n }),\n ),\n Fiber.join(server),\n ).pipe(Effect.exit);\n\n yield* closeAdmission;\n yield* Fiber.interrupt(server);\n if (passFailure !== undefined) {\n return yield* passFailure;\n }\n if (Exit.isFailure(exit)) {\n return yield* Effect.failCause(exit.cause);\n }\n const raw = exit.value;\n const finishedAt = clock.monotonicTimeNanosUnsafe();\n\n const outcome = decodeHarnessOutcome(raw);\n\n if (Option.isNone(outcome)) {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: \"The dynamic worker returned a value outside the harness envelope schema\",\n });\n }\n switch (outcome.value._tag) {\n case \"completed\": {\n return CodeExecutionResult.make({\n implementation: dynamicWorkerImplementation,\n value: outcome.value.value,\n logs: outcome.value.logs,\n resourceUse: CodeExecutionResourceUse.make({\n wallTime: Duration.nanos(finishedAt > startedAt ? finishedAt - startedAt : 0n),\n hostCalls: outcome.value.hostCalls,\n logBytes: outcome.value.logBytes,\n resultBytes: outcome.value.resultBytes,\n }),\n });\n }\n case \"source-not-a-function\": {\n return yield* CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"not-a-function\",\n message: `The source expression evaluated to ${outcome.value.actual}; it must evaluate to one async function`,\n });\n }\n case \"program-failed\": {\n return yield* CodeProgramFailedError.make({\n implementation: dynamicWorkerImplementation,\n reason: outcome.value.reason,\n thrown: outcome.value.thrown,\n message: outcome.value.message.slice(0, 8_000),\n logs: outcome.value.logs,\n });\n }\n case \"log-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"logs\",\n limit: request.limits.maxLogBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"argument-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"host-call-argument\",\n limit: request.limits.maxHostCallArgumentBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"result-limit\": {\n return yield* CodeOutputLimitError.make({\n implementation: dynamicWorkerImplementation,\n surface: \"result\",\n limit: request.limits.maxResultBytes,\n observed: outcome.value.observed,\n logs: outcome.value.logs,\n });\n }\n case \"host-call-limit\": {\n return yield* CodeHostCallLimitError.make({\n implementation: dynamicWorkerImplementation,\n limit: request.limits.maxHostCalls,\n logs: outcome.value.logs,\n });\n }\n case \"protocol\": {\n return yield* CodeExecutionProtocolError.make({\n implementation: dynamicWorkerImplementation,\n message: outcome.value.message.slice(0, 8_000),\n });\n }\n }\n });\n\n/**\n * Expected worker-level failures map into the typed union with bounded\n * diagnostics; anything unrecognized stays a start/termination error rather\n * than a fabricated program result.\n */\nconst classifyWorkerFailure = (\n cause: unknown,\n maxWallTime: Duration.Duration,\n):\n | CodeExecutionTimeoutError\n | CodeExecutorTerminatedError\n | CodeExecutorStartError\n | CodeSourceError => {\n const text = safeCauseDiagnostic(cause, \"[unserializable worker failure]\");\n\n // `WorkerLoader.load()` is lazy, so a module-compile error in the generated\n // program surfaces here at first use. Blame the program's source ONLY on a\n // genuine compile diagnostic (a `SyntaxError` or an explicit compile\n // failure) — the fixed harness is valid, so the fault is in program.js. A\n // bare \"failed to start Worker\" without a compile diagnostic is an\n // infrastructure start failure, not the model's fault, so it must NOT be\n // misclassified as a source error.\n if (/syntaxerror|failed to (compile|parse)/i.test(text)) {\n return CodeSourceError.make({\n implementation: dynamicWorkerImplementation,\n reason: \"invalid\",\n message: text.slice(0, 8_000),\n });\n }\n if (/cpu/i.test(text)) {\n return CodeExecutionTimeoutError.make({\n implementation: dynamicWorkerImplementation,\n kind: \"cpu\",\n maxWallTime,\n logs: [],\n });\n }\n if (/failed to start worker/i.test(text)) {\n return CodeExecutorStartError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n cause,\n });\n }\n\n return CodeExecutorTerminatedError.make({\n implementation: dynamicWorkerImplementation,\n message: text.slice(0, 8_000),\n });\n};\n\n/** Layer building the Dynamic Worker `CodeExecutor` from resolved bindings. */\nexport const dynamicWorkerCodeExecutorLayer = (\n options: DynamicWorkerCodeExecutorOptions,\n): Layer.Layer<CodeExecutor> =>\n Layer.effect(\n CodeExecutor,\n Effect.gen(function* () {\n const clock = yield* Clock.Clock;\n\n return CodeExecutor.of({ execute: makeExecute(options, clock) });\n }),\n );\n\n/** Assemble Code Mode handlers with the isolated Dynamic Worker executor. */\nexport const CloudflareCodeMode = {\n /**\n * Provide the selected tool handlers at construction, where Code Mode captures them.\n * Their errors and remaining dependencies stay visible. The definition still owns the\n * allowlist and limits; the runtime supplies the live Tool broker for each scoped pass.\n */\n layer: <A, E, R, Handlers, HandlerError, HandlerRequirements>(\n definition: { readonly handlers: Layer.Layer<A, E, R> },\n options: DynamicWorkerCodeExecutorOptions & {\n readonly handlers: Layer.Layer<Handlers, HandlerError, HandlerRequirements>;\n },\n ) =>\n definition.handlers.pipe(\n Layer.provide(options.handlers),\n Layer.provide(dynamicWorkerCodeExecutorLayer(options)),\n ),\n};\n"],"mappings":"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"}
|
|
@@ -246,6 +246,19 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
246
246
|
readonly createdAt: string;
|
|
247
247
|
readonly deploymentId: string;
|
|
248
248
|
readonly payload: {
|
|
249
|
+
readonly _tag: "SubagentStarted";
|
|
250
|
+
readonly runId: string;
|
|
251
|
+
readonly toolCallId: string;
|
|
252
|
+
readonly childThreadId: string;
|
|
253
|
+
readonly childSubmissionId: string;
|
|
254
|
+
readonly childReceiptId: string;
|
|
255
|
+
readonly childRunId: string;
|
|
256
|
+
} | {
|
|
257
|
+
readonly _tag: "AbortRequested";
|
|
258
|
+
readonly submissionId: string;
|
|
259
|
+
readonly author: string;
|
|
260
|
+
readonly reason: string;
|
|
261
|
+
} | {
|
|
249
262
|
readonly _tag: "ThreadCreated";
|
|
250
263
|
readonly agentId: string;
|
|
251
264
|
readonly definitions: {
|
|
@@ -368,9 +381,10 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
368
381
|
readonly _tag: "CompactionCreated";
|
|
369
382
|
readonly runId: string;
|
|
370
383
|
readonly turn: number;
|
|
371
|
-
readonly kind: "clear-tool-results" | "summarize";
|
|
384
|
+
readonly kind: "clear-tool-results" | "rollover" | "summarize";
|
|
372
385
|
readonly coversThrough: number;
|
|
373
386
|
readonly summary?: string | undefined;
|
|
387
|
+
readonly handoff?: string | undefined;
|
|
374
388
|
} | {
|
|
375
389
|
readonly _tag: "RunFailed";
|
|
376
390
|
readonly runId: string;
|
|
@@ -382,11 +396,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
382
396
|
readonly runDisposition?: Schema.Json | undefined;
|
|
383
397
|
readonly finishReason?: "budget-exhausted" | undefined;
|
|
384
398
|
readonly exhausted?: "tokens" | "tool-calls" | "turns" | undefined;
|
|
385
|
-
} | {
|
|
386
|
-
readonly _tag: "AbortRequested";
|
|
387
|
-
readonly submissionId: string;
|
|
388
|
-
readonly author: string;
|
|
389
|
-
readonly reason: string;
|
|
390
399
|
} | {
|
|
391
400
|
readonly _tag: "SubmissionSettled";
|
|
392
401
|
readonly submissionId: string;
|
|
@@ -478,14 +487,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
478
487
|
readonly resultBytes: number;
|
|
479
488
|
};
|
|
480
489
|
} | undefined;
|
|
481
|
-
} | {
|
|
482
|
-
readonly _tag: "SubagentStarted";
|
|
483
|
-
readonly runId: string;
|
|
484
|
-
readonly toolCallId: string;
|
|
485
|
-
readonly childThreadId: string;
|
|
486
|
-
readonly childSubmissionId: string;
|
|
487
|
-
readonly childReceiptId: string;
|
|
488
|
-
readonly childRunId: string;
|
|
489
490
|
} | {
|
|
490
491
|
readonly _tag: "SubagentJoined";
|
|
491
492
|
readonly runId: string;
|
|
@@ -573,21 +574,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
573
574
|
} | {
|
|
574
575
|
readonly _tag: "HostFailed";
|
|
575
576
|
readonly failure: {
|
|
576
|
-
readonly _tag: "DurableAlarmError";
|
|
577
|
-
readonly operation: string;
|
|
578
|
-
readonly message: string;
|
|
579
|
-
readonly cause?: Schema.Json | undefined;
|
|
580
|
-
} | {
|
|
581
|
-
readonly _tag: "HostProtocolError";
|
|
582
|
-
readonly message: string;
|
|
583
|
-
} | {
|
|
584
|
-
readonly _tag: "AgentInputError";
|
|
585
|
-
readonly message: string;
|
|
586
|
-
} | {
|
|
587
|
-
readonly _tag: "DigestError";
|
|
588
|
-
readonly message: string;
|
|
589
|
-
readonly cause?: Schema.Json | undefined;
|
|
590
|
-
} | {
|
|
591
577
|
readonly _tag: "AdmissionConflict";
|
|
592
578
|
readonly threadId: string;
|
|
593
579
|
readonly principal: string;
|
|
@@ -598,15 +584,6 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
598
584
|
readonly _tag: "SettlementConflict";
|
|
599
585
|
readonly submissionId: string;
|
|
600
586
|
readonly existingOutcome: "aborted" | "completed" | "failed";
|
|
601
|
-
} | {
|
|
602
|
-
readonly _tag: "ApprovalConflict";
|
|
603
|
-
readonly submissionId: string;
|
|
604
|
-
readonly toolCallId: string;
|
|
605
|
-
readonly existingDecision: "approved" | "denied";
|
|
606
|
-
} | {
|
|
607
|
-
readonly _tag: "UnknownResolutionConflict";
|
|
608
|
-
readonly submissionId: string;
|
|
609
|
-
readonly toolCallId: string;
|
|
610
587
|
} | {
|
|
611
588
|
readonly _tag: "JoinedToHost";
|
|
612
589
|
readonly submissionId: string;
|
|
@@ -636,9 +613,33 @@ declare const encodeHostResponse: (input: AbortRecorded | ApprovalRecorded | Hos
|
|
|
636
613
|
readonly threadId: string;
|
|
637
614
|
readonly actualEpoch: number;
|
|
638
615
|
readonly attemptedEpoch: number;
|
|
616
|
+
} | {
|
|
617
|
+
readonly _tag: "DurableAlarmError";
|
|
618
|
+
readonly operation: string;
|
|
619
|
+
readonly message: string;
|
|
620
|
+
readonly cause?: Schema.Json | undefined;
|
|
621
|
+
} | {
|
|
622
|
+
readonly _tag: "HostProtocolError";
|
|
623
|
+
readonly message: string;
|
|
624
|
+
} | {
|
|
625
|
+
readonly _tag: "AgentInputError";
|
|
626
|
+
readonly message: string;
|
|
627
|
+
} | {
|
|
628
|
+
readonly _tag: "DigestError";
|
|
629
|
+
readonly message: string;
|
|
630
|
+
readonly cause?: Schema.Json | undefined;
|
|
631
|
+
} | {
|
|
632
|
+
readonly _tag: "ApprovalConflict";
|
|
633
|
+
readonly submissionId: string;
|
|
634
|
+
readonly toolCallId: string;
|
|
635
|
+
readonly existingDecision: "approved" | "denied";
|
|
636
|
+
} | {
|
|
637
|
+
readonly _tag: "UnknownResolutionConflict";
|
|
638
|
+
readonly submissionId: string;
|
|
639
|
+
readonly toolCallId: string;
|
|
639
640
|
} | {
|
|
640
641
|
readonly _tag: "DurableRuntimeFailpointError";
|
|
641
|
-
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "claim:after-claim" | "compaction:after-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" | "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";
|
|
642
|
+
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "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" | "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";
|
|
642
643
|
} | {
|
|
643
644
|
readonly _tag: "AdmissionLimitExceeded";
|
|
644
645
|
readonly limit: "database-bytes" | "input-bytes" | "queue-depth";
|
|
@@ -943,6 +943,7 @@ const makeHostService = (binding) => {
|
|
|
943
943
|
const open = Effect.fn("BrowserRunInteractiveHost.open")(function* (policy) {
|
|
944
944
|
const fixedPolicy = yield* snapshotPolicy(policy);
|
|
945
945
|
const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);
|
|
946
|
+
const runCleanup = Effect.runPromiseWith(Context.make(Clock.Clock, yield* Clock.Clock));
|
|
946
947
|
const state = {
|
|
947
948
|
closed: { value: false },
|
|
948
949
|
disconnected: { value: false },
|
|
@@ -954,7 +955,7 @@ const makeHostService = (binding) => {
|
|
|
954
955
|
const closers = [];
|
|
955
956
|
const releaseBeforeManaged = (entry) => Effect.suspend(() => lifecycle.managedTeardownInstalled ? Effect.void : entry.close.pipe(Effect.catchCause(() => Effect.logWarning(entry.warning))));
|
|
956
957
|
const browser = yield* Effect.acquireRelease(withinDeadline(Effect.tryPromise({
|
|
957
|
-
try: (signal) => closeLateAcquisition(signal, () => binding.launch(keepAliveMillis(fixedPolicy)), (acquired) =>
|
|
958
|
+
try: (signal) => closeLateAcquisition(signal, () => binding.launch(keepAliveMillis(fixedPolicy)), (acquired) => runCleanup(closeAcquired(acquired))),
|
|
958
959
|
catch: (cause) => isCapacityRefusal(cause) ? InteractiveBrowserCapacityError.make({
|
|
959
960
|
implementation: browserRunInteractiveImplementation,
|
|
960
961
|
message: "Browser Run has no capacity for a new browser session"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractiveBrowser.mjs","names":[],"sources":["../src/InteractiveBrowser.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport puppeteer, {\n type Browser,\n type BrowserContext,\n type CDPSession,\n type HTTPRequest,\n type Page,\n} from \"@cloudflare/puppeteer\";\nimport {\n BrowserActionResult,\n BrowserScreenshotRequest,\n BrowserScrollRequest,\n BrowserNavigationResult,\n BrowserTextResult,\n InteractiveBrowser,\n InteractiveBrowserActionError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserLimitError,\n InteractiveBrowserPolicy,\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserProtocolError,\n InteractiveBrowserTargetUrl,\n InteractiveBrowserUnsupportedError,\n type BrowserHandle,\n type InteractiveBrowserError,\n type InteractiveBrowserNetworkPolicy,\n} from \"@effect-agent/sandbox/InteractiveBrowser\";\nimport { PageScreenshotResult } from \"@effect-agent/sandbox/PageScreenshot\";\nimport { SandboxImplementation } from \"@effect-agent/sandbox/Sandbox\";\nimport {\n Context,\n Clock,\n Duration,\n Effect,\n Layer,\n Option,\n Redacted,\n Ref,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nimport {\n BrowserRunSessionLifecycle,\n type BrowserRunLifecycleOptions,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport {\n BrowserRunCleanupError,\n BrowserRunSessionLifecycle,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport const browserRunInteractiveImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-run-interactive\",\n});\n\nconst MIN_KEEP_ALIVE_MILLIS = 10_000;\nconst MAX_KEEP_ALIVE_MILLIS = 600_000;\nconst MAX_TEXT_LENGTH = 8 * 1024 * 1024;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\nconst MIN_LIVE_VIEW_EXPIRY_MILLIS = 60_000;\nconst MAX_LIVE_VIEW_EXPIRY_MILLIS = 60 * 60_000;\nconst MAX_HANDOFF_TIMEOUT_MILLIS = 30 * 60_000;\nconst MAX_HOST_TEXT_LENGTH = 8 * 1024;\nconst CLEANUP_STEP_TIMEOUT_MILLIS = 10_000;\nconst ACTION_NETWORK_QUIET_MILLIS = 200;\nconst ACTION_NETWORK_SETTLE_MILLIS = 2_000;\nconst ACTION_POST_STATE_MILLIS = 250;\nconst MAX_OBSERVED_CONTROLS = 64;\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n\nconst BoundedHostText = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n);\n\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\n\nconst TextObservation = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Text\"), text: BoundedRemoteText }),\n Schema.Struct({ _tag: Schema.Literal(\"MissingElement\") }),\n Schema.Struct({ _tag: Schema.Literal(\"OverLimit\"), observed: Schema.Natural }),\n]);\n\nconst ActionTargetState = Schema.Struct({\n matchCount: Schema.Natural,\n invalidSelector: Schema.optionalKey(Schema.Boolean),\n kind: Schema.optionalKey(\n Schema.Literals([\"button\", \"checkbox\", \"radio\", \"select\", \"text\", \"link\", \"other\"]),\n ),\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n disabled: Schema.optionalKey(Schema.Boolean),\n required: Schema.optionalKey(Schema.Boolean),\n valid: Schema.optionalKey(Schema.Boolean),\n formValid: Schema.optionalKey(Schema.Boolean),\n});\n\nconst ActionNetworkState = Schema.Struct({\n total: Schema.Natural,\n status2xx: Schema.Natural,\n status3xx: Schema.Natural,\n status4xx: Schema.Natural,\n status5xx: Schema.Natural,\n failed: Schema.Natural,\n pending: Schema.Natural,\n settleTimedOut: Schema.Boolean,\n});\n\nconst ActionObservation = Schema.Struct({\n before: ActionTargetState,\n after: Schema.optionalKey(ActionTargetState),\n afterUnavailable: Schema.Boolean,\n network: ActionNetworkState,\n});\n\nconst PageObservation = Schema.fromJsonString(\n Schema.Struct({\n pageText: BoundedRemoteText,\n selectorMatchCount: Schema.Natural,\n controlsTruncated: Schema.Boolean,\n controls: Schema.Array(\n Schema.Struct({\n selector: BoundedRemoteText,\n kind: BoundedRemoteText,\n label: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(200))),\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n disabled: Schema.optionalKey(Schema.Boolean),\n required: Schema.optionalKey(Schema.Boolean),\n valid: Schema.optionalKey(Schema.Boolean),\n formValid: Schema.optionalKey(Schema.Boolean),\n }),\n ).check(Schema.isMaxLength(MAX_OBSERVED_CONTROLS)),\n }),\n);\n\nconst PngBytes = Schema.Uint8Array.check(\n Schema.isMaxLength(MAX_SCREENSHOT_BYTES),\n Schema.makeFilter(\n (bytes) =>\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a,\n { title: \"PNG bytes\" },\n ),\n);\n\nconst BrowserRunSessionId = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n Schema.makeFilter((value) => /^[A-Za-z0-9_-]+$/.test(value), {\n title: \"a Browser Run session identifier\",\n }),\n);\n\nconst LiveViewUrl = Schema.String.check(\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n Schema.makeFilter(\n (value) => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n url.host === \"live.browser.run\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.pathname === \"/ui/view\" &&\n url.searchParams.get(\"mode\") === \"tab\" &&\n (url.searchParams.get(\"wss\") ?? \"\").startsWith(\"live.browser.run/api/devtools/browser/\")\n );\n } catch {\n return false;\n }\n },\n { title: \"a Cloudflare Live View HTTPS URL\" },\n ),\n);\n\nconst LiveViewObservation = Schema.Struct({ devtoolsFrontendUrl: LiveViewUrl });\nconst HandoffObservation = Schema.Struct({ handoffId: BoundedHostText });\n\nconst HandoffDuration = Schema.Natural.check(\n Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS),\n);\n\nconst HandoffStateObservation = Schema.Union([\n Schema.Struct({\n active: Schema.Literal(true),\n handoffId: BoundedHostText,\n durationMs: HandoffDuration,\n }),\n Schema.Struct({\n active: Schema.Literal(false),\n handoffId: Schema.optionalKey(BoundedHostText),\n durationMs: Schema.optionalKey(HandoffDuration),\n }),\n]);\n\n/**\n * Host presentation state in CSS pixels. Dimensions are integers in 1..2048,\n * density is finite in 1..2 (default 1), and neither scaled dimension may exceed\n * 2048 pixels. Mobile, touch, and orientation emulation are not supported.\n */\nexport class BrowserRunViewport extends Schema.Class<BrowserRunViewport>(\"BrowserRunViewport\")(\n Schema.Struct({\n width: PositiveInt.check(Schema.isLessThanOrEqualTo(2_048)),\n height: PositiveInt.check(Schema.isLessThanOrEqualTo(2_048)),\n deviceScaleFactor: Schema.optionalKey(\n Schema.Finite.check(Schema.isBetween({ minimum: 1, maximum: 2 })),\n ),\n }).check(\n Schema.makeFilter(\n (viewport) =>\n Math.max(viewport.width, viewport.height) * (viewport.deviceScaleFactor ?? 1) <= 2_048,\n { title: \"a viewport with scaled dimensions no larger than 2048 pixels\" },\n ),\n ),\n) {}\n\nconst decodeViewport = (input: BrowserRunViewport) =>\n Schema.decodeUnknownEffect(BrowserRunViewport)(input, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => policyError(\"The browser viewport is malformed\")),\n // Copy only presentation fields, including for Schema class instances.\n Effect.map((viewport) => ({\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor: viewport.deviceScaleFactor ?? 1,\n })),\n );\n\n/** Host-only request for a redacted Cloudflare Live View URL. */\nexport class BrowserRunLiveViewRequest extends Schema.Class<BrowserRunLiveViewRequest>(\n \"BrowserRunLiveViewRequest\",\n)({\n mode: Schema.Literal(\"tab\"),\n expiresInMs: PositiveInt.check(\n Schema.isBetween({\n minimum: MIN_LIVE_VIEW_EXPIRY_MILLIS,\n maximum: MAX_LIVE_VIEW_EXPIRY_MILLIS,\n }),\n ),\n}) {}\n\nexport class BrowserRunLiveViewResult extends Schema.Class<BrowserRunLiveViewResult>(\n \"BrowserRunLiveViewResult\",\n)({ devtoolsFrontendUrl: Schema.Redacted(LiveViewUrl) }) {}\n\n/** Start one bounded handoff; controller ownership remains a consumer concern. */\nexport class BrowserRunHandoffRequest extends Schema.Class<BrowserRunHandoffRequest>(\n \"BrowserRunHandoffRequest\",\n)({\n instructions: BoundedHostText.check(Schema.isMaxLength(1_024)),\n timeout: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS)),\n}) {}\n\nexport class BrowserRunHandoffResult extends Schema.Class<BrowserRunHandoffResult>(\n \"BrowserRunHandoffResult\",\n)({ handoffId: Schema.Redacted(BoundedHostText) }) {}\n\nexport class BrowserRunHandoffState extends Schema.Class<BrowserRunHandoffState>(\n \"BrowserRunHandoffState\",\n)({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.Redacted(BoundedHostText)),\n durationMs: Schema.optionalKey(HandoffDuration),\n}) {}\n\ntype BrowserFailure = typeof InteractiveBrowserError.Type;\ntype BrowserOperation = InteractiveBrowserActionError[\"operation\"];\n\ninterface InteractiveBrowserPolicySnapshot {\n readonly network: Exclude<InteractiveBrowserNetworkPolicy, { readonly _tag: \"PublicWeb\" }>;\n readonly maxActions: number;\n readonly maxElapsedMillis: number;\n readonly maxReturnedBytes: number;\n}\n\n/** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */\nexport interface BrowserRunInteractiveRequest {\n readonly url: () => string;\n readonly abort: () => Promise<void>;\n readonly continue: () => Promise<void>;\n}\n\nexport type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;\n\nexport type BrowserRunCloudflareCommand =\n | \"Cloudflare.getLiveView\"\n | \"Cloudflare.handoff\"\n | \"Cloudflare.getHandoffState\";\n\n/** Narrow CDP boundary for Cloudflare commands absent from the pinned protocol types. */\nexport interface BrowserRunInteractiveCdpSession {\n readonly send: (command: BrowserRunCloudflareCommand, parameters: unknown) => Promise<unknown>;\n readonly detach: () => Promise<void>;\n}\n\n/** Narrow page boundary used by deterministic tests; SDK values remain in this package. */\nexport interface BrowserRunInteractivePage {\n readonly close: () => Promise<void>;\n readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;\n readonly setRequestInterception: (enabled: boolean) => Promise<void>;\n readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly goto: (url: string) => Promise<void>;\n readonly url: () => unknown;\n readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;\n readonly fill: (\n selector: string,\n value: string,\n signal: AbortSignal,\n onDispatch: () => void,\n ) => Promise<unknown>;\n readonly click: (\n selector: string,\n signal: AbortSignal,\n onDispatch: () => void,\n ) => Promise<unknown>;\n readonly screenshot: (fullPage: boolean) => Promise<unknown>;\n readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;\n readonly setViewport: (viewport: BrowserRunViewport) => Promise<void>;\n readonly createCdpSession: () => Promise<BrowserRunInteractiveCdpSession>;\n}\n\nexport interface BrowserRunInteractiveContext {\n readonly newPage: () => Promise<BrowserRunInteractivePage>;\n readonly close: () => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveBrowser {\n readonly createContext: () => Promise<BrowserRunInteractiveContext>;\n readonly close: () => Promise<void>;\n readonly sessionId: () => unknown;\n readonly isConnected: () => boolean;\n readonly onDisconnected: (listener: () => void) => void;\n readonly offDisconnected: (listener: () => void) => void;\n}\n\n/** Host-supplied Browser Run binding projected into one fakeable launch operation. */\nexport class BrowserRunInteractiveBinding extends Context.Service<\n BrowserRunInteractiveBinding,\n {\n readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;\n /** Success proves whole-browser termination or exact-session absence. */\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n readonly viewport?: BrowserRunViewport;\n }): Layer.Layer<\n BrowserRunInteractiveBinding,\n InteractiveBrowserPolicyDeniedError,\n BrowserRunSessionLifecycle\n > {\n return Layer.effect(BrowserRunInteractiveBinding)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n\n const viewport =\n options.viewport === undefined ? undefined : yield* decodeViewport(options.viewport);\n\n return {\n launch: async (keepAliveMillis: number) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n ...(viewport === undefined ? {} : { defaultViewport: { ...viewport } }),\n }),\n ),\n closeSession: (sessionId: Redacted.Redacted<string>) =>\n lifecycle\n .close(sessionId)\n .pipe(Effect.mapError((cause) => actionError(\"close\", cause))),\n };\n }),\n );\n }\n}\n\nexport interface BrowserRunInteractiveSession {\n readonly handle: BrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n /**\n * Resize without charging an agent action or changing emulation modes. Shares\n * the handle's fail-fast lock, page-policy preflight, and elapsed deadline.\n * A timeout or interruption leaves the session unusable; no resize is retried.\n * The host must authorize callers. No viewer ownership or durable state is added.\n */\n readonly resizeViewport: (\n viewport: BrowserRunViewport,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, InteractiveBrowserError>;\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, InteractiveBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, InteractiveBrowserError>;\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\n/** Cloudflare host authority kept separate from the provider-neutral browser handle. */\nexport class BrowserRunInteractiveHost extends Context.Service<\n BrowserRunInteractiveHost,\n {\n readonly cleanupSemantics?: \"confirmed-terminal\";\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope>;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveHost\") {}\n\nconst makeProductionRequest = (request: HTTPRequest): BrowserRunInteractiveRequest => ({\n url: () => request.url(),\n abort: () => request.abort(\"blockedbyclient\"),\n continue: () => request.continue(),\n});\n\nconst makeProductionCdpSession = (session: CDPSession): BrowserRunInteractiveCdpSession => ({\n send: async (command, parameters) => {\n const send = Reflect.get(session, \"send\");\n\n return await Reflect.apply(send, session, [command, parameters]);\n },\n detach: () => session.detach(),\n});\n\nclass BrowserRunActionUndispatched extends Error {\n readonly matchCount: number;\n\n constructor(matchCount: number) {\n super(\"The browser action selector did not resolve to exactly one element\");\n this.matchCount = matchCount;\n }\n}\n\nconst readActionTarget = (page: Page, selector: string): Promise<unknown> =>\n page.evaluate((requestedSelector) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n let matches;\n\n try {\n matches = Reflect.apply(Reflect.get(pageDocument, \"querySelectorAll\"), pageDocument, [\n requestedSelector,\n ]);\n } catch (cause) {\n if (cause instanceof Error && cause.name === \"SyntaxError\") {\n return { matchCount: 0, invalidSelector: true };\n }\n throw cause;\n }\n if (typeof matches !== \"object\" || matches === null) throw new Error(\"Invalid query result\");\n const matchCount = Math.min(10_000, Reflect.get(matches, \"length\"));\n const element = Reflect.get(matches, 0);\n\n if (element === undefined) return { matchCount };\n\n const associated = Reflect.get(element, \"control\") ?? element;\n const tagName = String(Reflect.get(associated, \"tagName\") ?? \"\").toLowerCase();\n const inputType = String(Reflect.get(associated, \"type\") ?? \"\").toLowerCase();\n\n const role = String(\n Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\"role\"]) ?? \"\",\n ).toLowerCase();\n\n const kind =\n tagName === \"button\" || role === \"button\"\n ? \"button\"\n : inputType === \"checkbox\" || role === \"checkbox\" || role === \"switch\"\n ? \"checkbox\"\n : inputType === \"radio\" || role === \"radio\"\n ? \"radio\"\n : tagName === \"select\"\n ? \"select\"\n : tagName === \"input\" || tagName === \"textarea\"\n ? \"text\"\n : tagName === \"a\"\n ? \"link\"\n : \"other\";\n\n const checked = Reflect.get(associated, \"checked\");\n\n const selected =\n tagName === \"select\"\n ? Reflect.get(associated, \"selectedIndex\") >= 0\n : Reflect.get(associated, \"selected\");\n\n const disabled = Reflect.get(associated, \"disabled\");\n const required = Reflect.get(associated, \"required\");\n const validity = Reflect.get(associated, \"validity\");\n const form = Reflect.get(associated, \"form\");\n\n const formMatches =\n form === null || form === undefined ? undefined : Reflect.get(form, \"matches\");\n\n const ariaChecked = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-checked\",\n ]);\n\n const ariaDisabled = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-disabled\",\n ]);\n\n const ariaSelected = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-selected\",\n ]);\n\n return {\n matchCount,\n kind,\n ...(typeof checked === \"boolean\"\n ? { checked }\n : ariaChecked === \"true\" || ariaChecked === \"false\"\n ? { checked: ariaChecked === \"true\" }\n : {}),\n ...(typeof selected === \"boolean\"\n ? { selected }\n : ariaSelected === \"true\" || ariaSelected === \"false\"\n ? { selected: ariaSelected === \"true\" }\n : {}),\n disabled: typeof disabled === \"boolean\" ? disabled : ariaDisabled === \"true\",\n ...(typeof required === \"boolean\" ? { required } : {}),\n ...(validity !== undefined && typeof Reflect.get(validity, \"valid\") === \"boolean\"\n ? { valid: Reflect.get(validity, \"valid\") }\n : {}),\n ...(typeof formMatches === \"function\"\n ? { formValid: Reflect.apply(formMatches, form, [\":valid\"]) }\n : {}),\n };\n }, selector);\n\n// SDK promises cannot be cancelled. Clear our timer and observe late rejections;\n// the owning browser Scope is responsible for terminating the remote session.\nconst boundedBestEffort = async <A>(\n promise: Promise<A>,\n millis: number,\n): Promise<A | undefined> => {\n let timer: ReturnType<typeof setTimeout> | number | undefined;\n\n try {\n return await Promise.race([\n promise.catch(() => undefined),\n new Promise<undefined>((resolve) => {\n timer = setTimeout(resolve, millis);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n};\n\nconst readActionTargetAfter = (page: Page, selector: string) =>\n boundedBestEffort(\n readActionTarget(page, selector).then(Schema.decodeUnknownSync(ActionTargetState)),\n ACTION_POST_STATE_MILLIS,\n );\n\nconst makeActionRequestTracker = (page: Page, signal: AbortSignal) => {\n const pending = new Set<HTTPRequest>();\n let total = 0;\n let status2xx = 0;\n let status3xx = 0;\n let status4xx = 0;\n let status5xx = 0;\n let failed = 0;\n let lastChange = performance.now();\n let closed = false;\n let wake: (() => void) | undefined;\n let timer: ReturnType<typeof setTimeout> | number | undefined;\n\n const relevant = (request: HTTPRequest) => {\n const resourceType = request.resourceType();\n\n return resourceType === \"fetch\" || resourceType === \"xhr\";\n };\n\n const onRequest = (request: HTTPRequest) => {\n if (!relevant(request)) return;\n pending.add(request);\n total++;\n lastChange = performance.now();\n };\n\n const onFinished = (request: HTTPRequest) => {\n if (!pending.delete(request)) return;\n let status: number | undefined;\n\n try {\n status = request.response()?.status();\n } catch {\n // Provider response details remain intentionally unavailable to diagnostics.\n }\n if (status !== undefined) {\n if (status >= 200 && status < 300) status2xx++;\n else if (status >= 300 && status < 400) status3xx++;\n else if (status >= 400 && status < 500) status4xx++;\n else if (status >= 500 && status < 600) status5xx++;\n }\n lastChange = performance.now();\n };\n\n const onFailed = (request: HTTPRequest) => {\n if (!pending.delete(request)) return;\n failed++;\n lastChange = performance.now();\n };\n\n const close = () => {\n if (closed) return;\n closed = true;\n page.off(\"request\", onRequest);\n page.off(\"requestfinished\", onFinished);\n page.off(\"requestfailed\", onFailed);\n signal.removeEventListener(\"abort\", close);\n clearTimeout(timer);\n wake?.();\n };\n\n try {\n page.on(\"request\", onRequest);\n page.on(\"requestfinished\", onFinished);\n page.on(\"requestfailed\", onFailed);\n signal.addEventListener(\"abort\", close, { once: true });\n if (signal.aborted) close();\n } catch (cause) {\n close();\n throw cause;\n }\n\n const wait = async () => {\n const startedAt = performance.now();\n let settleTimedOut = false;\n\n while (!closed) {\n const now = performance.now();\n\n if (pending.size === 0 && now - lastChange >= ACTION_NETWORK_QUIET_MILLIS) break;\n if (now - startedAt >= ACTION_NETWORK_SETTLE_MILLIS) {\n settleTimedOut = true;\n break;\n }\n await new Promise<void>((resolve) => {\n wake = resolve;\n timer = setTimeout(() => resolve(), 50);\n });\n wake = undefined;\n }\n\n return {\n total,\n status2xx,\n status3xx,\n status4xx,\n status5xx,\n failed,\n pending: pending.size,\n settleTimedOut,\n };\n };\n\n return {\n wait,\n close,\n markActionSettled: () => {\n lastChange = performance.now();\n },\n };\n};\n\nconst disposeActionHandles = async (handles: ReadonlyArray<{ dispose: () => Promise<void> }>) => {\n await boundedBestEffort(\n Promise.allSettled(handles.map(async (handle) => handle.dispose())),\n ACTION_POST_STATE_MILLIS,\n );\n};\n\nconst runObservedPageAction = async (\n page: Page,\n selector: string,\n signal: AbortSignal,\n onDispatch: () => void,\n action: (element: NonNullable<Awaited<ReturnType<Page[\"$\"]>>>) => Promise<void>,\n): Promise<unknown> => {\n if (signal.aborted) throw new BrowserRunActionUndispatched(0);\n\n const before = Schema.decodeUnknownSync(ActionTargetState)(\n await readActionTarget(page, selector),\n );\n\n if (before.matchCount !== 1 || before.invalidSelector === true) {\n throw new BrowserRunActionUndispatched(before.matchCount);\n }\n const matches = await page.$$(selector);\n\n if (matches.length !== 1 || matches[0] === undefined) {\n await disposeActionHandles(matches);\n throw new BrowserRunActionUndispatched(Math.min(10_000, matches.length));\n }\n if (signal.aborted) {\n await disposeActionHandles(matches);\n throw new BrowserRunActionUndispatched(1);\n }\n\n let tracker: ReturnType<typeof makeActionRequestTracker> | undefined;\n let disposing: Promise<void> | undefined;\n const dispose = () => (disposing ??= disposeActionHandles(matches));\n\n const onAbort = () => {\n void dispose();\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n tracker = makeActionRequestTracker(page, signal);\n // No await between the final cancellation fence and SDK dispatch. Once\n // dispatched, interruption is uncertain, even if the SDK later resolves.\n if (signal.aborted) throw new BrowserRunActionUndispatched(1);\n onDispatch();\n await action(matches[0]);\n tracker.markActionSettled();\n const network = await tracker.wait();\n const after = signal.aborted ? undefined : await readActionTargetAfter(page, selector);\n\n return {\n before,\n ...(after === undefined ? {} : { after }),\n afterUnavailable: after === undefined,\n network,\n };\n } finally {\n tracker?.close();\n signal.removeEventListener(\"abort\", onAbort);\n await dispose();\n }\n};\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n\n return {\n close: () => page.close(),\n setBypassServiceWorker: (enabled) => page.setBypassServiceWorker(enabled),\n setRequestInterception: (enabled) => page.setRequestInterception(enabled),\n onRequest: (listener) => {\n const sdkListener = (request: HTTPRequest) => listener(makeProductionRequest(request));\n\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n\n if (sdkListener !== undefined) {\n page.off(\"request\", sdkListener);\n listeners.delete(listener);\n }\n },\n goto: async (url) => {\n await page.goto(url, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n },\n url: () => page.url(),\n readText: async (selector, maximumBytes) => {\n const observation = Schema.decodeUnknownSync(TextObservation)(\n await page.evaluate(\n (requestedSelector, maximum, maximumControls) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n\n const matches =\n requestedSelector === undefined\n ? undefined\n : Reflect.apply(Reflect.get(pageDocument, \"querySelectorAll\"), pageDocument, [\n requestedSelector,\n ]);\n\n const selectorMatchCount =\n matches === undefined || matches === null\n ? 1\n : Math.min(10_000, Reflect.get(matches, \"length\"));\n\n const element =\n matches === undefined || matches === null\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.get(matches, 0);\n\n if (element === null) return { _tag: \"MissingElement\" };\n if (element === undefined) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n\n const pageText =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n\n const primaryControlSelector =\n 'input,select,textarea,label,button,[role=\"checkbox\"],[role=\"radio\"],[role=\"option\"],[role=\"switch\"],[role=\"tab\"],[role=\"button\"]';\n\n const optionSelector = \"select option\";\n const secondaryControlSelector = \"a[href]\";\n const controlSelector = `${primaryControlSelector},${optionSelector},${secondaryControlSelector}`;\n\n const selectorFor = (candidate: object) => {\n const parts: Array<string> = [];\n let current: object | null = candidate;\n\n while (current !== null && current !== undefined) {\n const tagName = String(Reflect.get(current, \"tagName\") ?? \"\").toLowerCase();\n\n if (tagName === \"\") break;\n const parent: object | null = Reflect.get(current, \"parentElement\");\n\n if (parent === null) {\n parts.push(tagName);\n break;\n }\n let sibling = Reflect.get(current, \"previousElementSibling\");\n let index = 1;\n\n while (sibling !== null && sibling !== undefined) {\n if (String(Reflect.get(sibling, \"tagName\") ?? \"\").toLowerCase() === tagName)\n index++;\n sibling = Reflect.get(sibling, \"previousElementSibling\");\n }\n parts.push(`${tagName}:nth-of-type(${index})`);\n current = parent;\n }\n\n return parts.reverse().join(\" > \");\n };\n\n const visible = (candidate: object) => {\n const hidden = Reflect.get(candidate, \"hidden\");\n\n const ariaHidden = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-hidden\",\n ]);\n\n const rects = Reflect.apply(Reflect.get(candidate, \"getClientRects\"), candidate, []);\n\n return (\n hidden !== true &&\n ariaHidden !== \"true\" &&\n typeof rects === \"object\" &&\n rects !== null &&\n Reflect.get(rects, \"length\") > 0\n );\n };\n\n const candidates: Array<object> = [];\n let controlsTruncated = false;\n\n const consider = (candidate: object) => {\n const tagName = String(Reflect.get(candidate, \"tagName\") ?? \"\").toLowerCase();\n\n // Collapsed native options have no client rects. Their owning\n // select determines visibility; observe text/selection, never value.\n const visibilityTarget =\n tagName === \"option\"\n ? Reflect.apply(Reflect.get(candidate, \"closest\"), candidate, [\"select\"])\n : candidate;\n\n const actionable = tagName !== \"label\" || Reflect.get(candidate, \"control\") !== null;\n\n if (\n !actionable ||\n typeof visibilityTarget !== \"object\" ||\n visibilityTarget === null ||\n !visible(visibilityTarget)\n )\n return;\n candidates.push(candidate);\n if (candidates.length > maximumControls) controlsTruncated = true;\n };\n\n const elementMatches = Reflect.get(element, \"matches\");\n\n if (\n typeof elementMatches === \"function\" &&\n Reflect.apply(elementMatches, element, [controlSelector])\n ) {\n consider(element);\n }\n\n const considerSelector = (candidateSelector: string) => {\n const descendants = Reflect.apply(Reflect.get(element, \"querySelectorAll\"), element, [\n candidateSelector,\n ]);\n\n if (typeof descendants !== \"object\" || descendants === null) return;\n const descendantCount = Reflect.get(descendants, \"length\");\n\n for (let index = 0; index < descendantCount && !controlsTruncated; index++) {\n consider(Reflect.get(descendants, index));\n }\n };\n\n considerSelector(primaryControlSelector);\n if (!controlsTruncated) considerSelector(optionSelector);\n if (!controlsTruncated) considerSelector(secondaryControlSelector);\n\n const controls = candidates.slice(0, maximumControls).map((candidate) => {\n const associated = Reflect.get(candidate, \"control\") ?? candidate;\n const tagName = String(Reflect.get(candidate, \"tagName\") ?? \"\").toLowerCase();\n const inputType = String(Reflect.get(associated, \"type\") ?? \"\").toLowerCase();\n\n const role = String(\n Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\"role\"]) ?? \"\",\n ).toLowerCase();\n\n const ariaLabel = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-label\",\n ]);\n\n const candidateText =\n tagName === \"textarea\" || tagName === \"input\" || tagName === \"select\"\n ? undefined\n : Reflect.get(candidate, tagName === \"option\" ? \"label\" : \"innerText\");\n\n const associatedLabels = Reflect.get(associated, \"labels\");\n\n const associatedLabel =\n associatedLabels !== undefined &&\n associatedLabels !== null &&\n Reflect.get(associatedLabels, \"length\") > 0\n ? Reflect.get(Reflect.get(associatedLabels, 0), \"innerText\")\n : undefined;\n\n const label = String(\n typeof ariaLabel === \"string\" && ariaLabel !== \"\"\n ? ariaLabel\n : typeof candidateText === \"string\" && candidateText !== \"\"\n ? candidateText\n : (associatedLabel ?? \"\"),\n )\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200);\n\n const checked = Reflect.get(associated, \"checked\");\n\n const selected =\n tagName === \"select\"\n ? Reflect.get(associated, \"selectedIndex\") >= 0\n : Reflect.get(associated, \"selected\");\n\n const disabled = Reflect.get(associated, \"disabled\");\n const required = Reflect.get(associated, \"required\");\n const validity = Reflect.get(associated, \"validity\");\n const form = Reflect.get(associated, \"form\");\n\n const formMatches =\n form === null || form === undefined ? undefined : Reflect.get(form, \"matches\");\n\n const ariaChecked = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-checked\",\n ]);\n\n const ariaSelected = Reflect.apply(\n Reflect.get(candidate, \"getAttribute\"),\n candidate,\n [\"aria-selected\"],\n );\n\n const ariaDisabled = Reflect.apply(\n Reflect.get(candidate, \"getAttribute\"),\n candidate,\n [\"aria-disabled\"],\n );\n\n return {\n selector: selectorFor(candidate),\n kind:\n tagName === \"label\"\n ? `label:${inputType || \"control\"}`\n : tagName === \"input\"\n ? `input:${inputType || \"text\"}`\n : role !== \"\"\n ? `role:${role}`\n : tagName,\n ...(label === \"\" ? {} : { label }),\n ...(typeof checked === \"boolean\"\n ? { checked }\n : ariaChecked === \"true\" || ariaChecked === \"false\"\n ? { checked: ariaChecked === \"true\" }\n : {}),\n ...(typeof selected === \"boolean\"\n ? { selected }\n : ariaSelected === \"true\" || ariaSelected === \"false\"\n ? { selected: ariaSelected === \"true\" }\n : {}),\n ...(typeof disabled === \"boolean\"\n ? { disabled }\n : ariaDisabled === \"true\" || ariaDisabled === \"false\"\n ? { disabled: ariaDisabled === \"true\" }\n : {}),\n ...(typeof required === \"boolean\" ? { required } : {}),\n ...(validity !== undefined && typeof Reflect.get(validity, \"valid\") === \"boolean\"\n ? { valid: Reflect.get(validity, \"valid\") }\n : {}),\n ...(typeof formMatches === \"function\"\n ? { formValid: Reflect.apply(formMatches, form, [\":valid\"]) }\n : {}),\n };\n });\n\n // JSON is the bounded wire representation of this existing text result.\n // eslint-disable-next-line no-restricted-properties\n const text = JSON.stringify({\n pageText,\n selectorMatchCount,\n controls,\n controlsTruncated,\n });\n\n const observed = new TextEncoder().encode(text).byteLength;\n\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n MAX_OBSERVED_CONTROLS,\n ),\n );\n\n if (observation._tag === \"Text\") Schema.decodeUnknownSync(PageObservation)(observation.text);\n\n return observation;\n },\n fill: (selector, value, signal, onDispatch) =>\n runObservedPageAction(page, selector, signal, onDispatch, (element) =>\n element.evaluate((element, nextValue) => {\n // Bypass instance setters so React can detect the change when events fire.\n let prototype = Reflect.getPrototypeOf(element);\n let setValue: ((value: string) => void) | undefined;\n\n while (prototype !== null) {\n const setter = Reflect.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n\n if (typeof setter === \"function\") {\n setValue = setter;\n break;\n }\n prototype = Reflect.getPrototypeOf(prototype);\n }\n if (setValue === undefined) {\n throw new Error(\"The selector did not resolve to a fillable field\");\n }\n const focus = Reflect.get(element, \"focus\");\n\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.apply(setValue, element, [nextValue]);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n\n if (typeof dispatchEvent === \"function\") {\n Reflect.apply(dispatchEvent, element, [new Event(\"input\", { bubbles: true })]);\n Reflect.apply(dispatchEvent, element, [new Event(\"change\", { bubbles: true })]);\n }\n }, value),\n ),\n click: (selector, signal, onDispatch) =>\n runObservedPageAction(page, selector, signal, onDispatch, (element) => element.click()),\n // Puppeteer materializes the complete image before returning. The adapter\n // validates the 8 MiB Schema ceiling and pass limit immediately afterward.\n screenshot: (fullPage) => page.screenshot({ type: \"png\", fullPage }),\n scroll: (deltaX, deltaY) =>\n page.evaluate(\n (x, y) => {\n const scrollBy = Reflect.get(globalThis, \"scrollBy\");\n\n Reflect.apply(scrollBy, globalThis, [{ left: x, top: y, behavior: \"instant\" }]);\n },\n deltaX,\n deltaY,\n ),\n createCdpSession: async () => makeProductionCdpSession(await page.createCDPSession()),\n setViewport: (viewport) => page.setViewport(viewport),\n };\n};\n\nconst makeProductionContext = (context: BrowserContext): BrowserRunInteractiveContext => ({\n newPage: async () => makeProductionPage(await context.newPage()),\n close: () => context.close(),\n});\n\nconst makeProductionBrowser = (browser: Browser): BrowserRunInteractiveBrowser => ({\n createContext: async () => makeProductionContext(await browser.createBrowserContext()),\n close: () => browser.close(),\n sessionId: () => browser.sessionId(),\n isConnected: () => browser.isConnected(),\n onDisconnected: (listener) => {\n browser.on(\"disconnected\", listener);\n },\n offDisconnected: (listener) => {\n browser.off(\"disconnected\", listener);\n },\n});\n\nconst protocolError = (message: string, cause?: unknown): InteractiveBrowserProtocolError =>\n InteractiveBrowserProtocolError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst actionError = (operation: BrowserOperation, cause?: unknown): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation failed`,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst undispatchedActionError = (operation: BrowserOperation): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation was not dispatched`,\n });\n\n/** Recognizes a local pre-dispatch refusal without exposing selector or page content. */\nexport const isBrowserRunUndispatchedActionError = (error: unknown): boolean =>\n Schema.is(InteractiveBrowserActionError)(error) &&\n error.implementation.identity === browserRunInteractiveImplementation.identity &&\n (error.operation === \"click\" || error.operation === \"fill\") &&\n error.message === `The interactive browser ${error.operation} operation was not dispatched`;\n\nconst policyError = (message: string): InteractiveBrowserPolicyDeniedError =>\n InteractiveBrowserPolicyDeniedError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n });\n\nconst expiredError = (): InteractiveBrowserExpiredError =>\n InteractiveBrowserExpiredError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The remote browser is no longer usable\",\n });\n\nconst causeText = (cause: unknown): string => {\n if (cause instanceof Error) return cause.message.slice(0, 8_000);\n\n return String(cause).slice(0, 8_000);\n};\n\nconst isCapacityRefusal = (cause: unknown): boolean =>\n /(^|\\D)429(\\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));\n\nconst isRemoteClosure = (cause: unknown): boolean =>\n /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(\n causeText(cause),\n );\n\nconst snapshotPolicy = Effect.fn(\"BrowserRunInteractive.snapshotPolicy\")(function* (\n input: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n InteractiveBrowserPolicySnapshot,\n InteractiveBrowserPolicyDeniedError | InteractiveBrowserUnsupportedError\n> {\n const decoded = yield* Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")),\n );\n\n if (decoded.network._tag === \"PublicWeb\") {\n return yield* InteractiveBrowserUnsupportedError.make({\n implementation: browserRunInteractiveImplementation,\n feature: \"policy\",\n message:\n \"Cloudflare Browser Run cannot enforce the PublicWeb network policy for all session traffic\",\n });\n }\n\n return Object.freeze({\n network:\n decoded.network._tag === \"ExactHosts\"\n ? Object.freeze({\n _tag: decoded.network._tag,\n allowedHosts: Object.freeze([...decoded.network.allowedHosts]),\n })\n : Object.freeze({ _tag: decoded.network._tag }),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n });\n});\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n if (policy.network._tag === \"Unrestricted\") return true;\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.network.allowedHosts.some((host) => host === url.host)\n );\n } catch {\n return false;\n }\n};\n\nconst keepAliveMillis = (policy: InteractiveBrowserPolicySnapshot): number =>\n Math.max(MIN_KEEP_ALIVE_MILLIS, Math.min(MAX_KEEP_ALIVE_MILLIS, policy.maxElapsedMillis));\n\nconst closeLateAcquisition = async <A>(\n signal: AbortSignal,\n acquire: () => Promise<A>,\n close: (acquired: A) => Promise<void>,\n): Promise<A> => {\n const acquired = await acquire();\n\n if (!signal.aborted) return acquired;\n\n // The SDK does not accept AbortSignal. If an acquisition settles after Effect\n // has interrupted it, ownership never reaches Scope, so close it here instead.\n try {\n await close(acquired);\n } catch {\n // No caller remains to observe a late cleanup failure, and provider details\n // must not escape through an unhandled rejection.\n }\n throw new Error(\"The interrupted browser acquisition completed late\");\n};\n\nconst closeWithWarning = (close: () => Promise<void>, warning: string): Effect.Effect<void> =>\n Effect.tryPromise({\n try: close,\n catch: () => protocolError(warning),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(protocolError(warning)),\n }),\n Effect.catchCause(() => Effect.logWarning(warning)),\n );\n\nconst deadlineError = Effect.fn(\"BrowserRunInteractive.deadlineError\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"elapsed\",\n maximum: policy.maxElapsedMillis,\n observed: Math.max(policy.maxElapsedMillis, now - startedAt),\n message: \"The browser elapsed-time limit was reached\",\n });\n});\n\nconst withinDeadline = Effect.fn(\"BrowserRunInteractive.withinDeadline\")(function* <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n onTimeout?: () => void,\n): Effect.fn.Return<A, E | InteractiveBrowserLimitError, R> {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const elapsed = Math.max(0, now - startedAt);\n const remaining = policy.maxElapsedMillis - elapsed;\n\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: () =>\n Effect.sync(() => onTimeout?.()).pipe(Effect.andThen(deadlineError(policy, startedAt))),\n }),\n );\n});\n\ninterface HandleState {\n readonly closed: { value: boolean };\n readonly disconnected: { value: boolean };\n readonly uncertain: { value: boolean };\n readonly violation: { value: BrowserFailure | undefined };\n readonly pendingRequests: Set<Promise<void>>;\n}\n\nconst stateFailure = (state: HandleState): BrowserFailure | undefined => {\n if (state.violation.value !== undefined) return state.violation.value;\n if (state.closed.value || state.disconnected.value || state.uncertain.value) {\n return expiredError();\n }\n\n return undefined;\n};\n\ninterface CloseFailure {\n readonly error: InteractiveBrowserActionError;\n readonly warning: string;\n}\n\ninterface CloseEntry {\n readonly close: Effect.Effect<void, InteractiveBrowserActionError>;\n readonly warning: string;\n}\n\ninterface HandleRuntime {\n readonly handle: BrowserHandle;\n readonly run: <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight?: Effect.Effect<void, BrowserFailure>,\n consumeAction?: boolean,\n ) => Effect.Effect<A, BrowserFailure>;\n}\n\nclass BrowserRunRemoteFailure {\n readonly cause: unknown;\n\n constructor(cause: unknown) {\n this.cause = cause;\n }\n}\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n\n return pending.length === 0\n ? Effect.void\n : Effect.promise(() => Promise.all(pending)).pipe(\n Effect.asVoid,\n Effect.andThen(awaitPendingRequests(state)),\n );\n });\n\nconst decodeNavigationResult = Effect.fn(\"BrowserRunInteractive.decodeNavigationResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser navigation URL failed\", cause),\n });\n\n const result = yield* Schema.decodeUnknownEffect(BrowserNavigationResult)({\n url,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed navigation URL\", cause),\n ),\n );\n\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n\n return result;\n});\n\nconst decodeActionResult = Effect.fn(\"BrowserRunInteractive.decodeActionResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser page URL failed\", cause),\n });\n\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n\n try {\n allowed = hostAllowed(policy, request.url());\n } catch {\n allowed = false;\n }\n if (!allowed) {\n state.violation.value = policyError(\"The browser requested an off-policy URL\");\n }\n\n let settlement: Promise<void>;\n\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n\n return;\n }\n\n const observed = settlement\n .catch(() => {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n })\n .finally(() => {\n state.pendingRequests.delete(observed);\n });\n\n state.pendingRequests.add(observed);\n };\n\nconst makeHandle = Effect.fn(\"BrowserRunInteractive.makeHandle\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n state: HandleState,\n close: Effect.Effect<void, InteractiveBrowserError>,\n): Effect.fn.Return<HandleRuntime> {\n const permits = yield* Semaphore.make(1);\n const actions = yield* Ref.make(0);\n\n const remote = <A>(operation: BrowserOperation, evaluate: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => new BrowserRunRemoteFailure(cause),\n }).pipe(\n Effect.catch(\n (\n failure,\n ): Effect.Effect<never, InteractiveBrowserActionError | InteractiveBrowserExpiredError> => {\n const cause = failure.cause;\n\n if (cause instanceof BrowserRunActionUndispatched) {\n return Effect.logInfo(\"Browser interactive action was not dispatched\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.selector_match_count\": cause.matchCount,\n }),\n Effect.andThen(Effect.fail(undispatchedActionError(operation))),\n );\n }\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n\n return Effect.fail(expiredError());\n }\n\n return Effect.fail(actionError(operation, cause));\n },\n ),\n );\n\n const observedAction = (\n operation: \"fill\" | \"click\",\n evaluate: (signal: AbortSignal, onDispatch: () => void) => Promise<unknown>,\n ) =>\n Effect.suspend(() => {\n let dispatched = false;\n let pending: Promise<unknown> | undefined;\n\n return remote(operation, (signal) => {\n pending = evaluate(signal, () => {\n dispatched = true;\n });\n\n return pending;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.gen(function* () {\n state.uncertain.value = true;\n // Retain evidence before Scope teardown, without claiming SDK\n // cancellation or success. A late completion never makes this replayable.\n yield* Effect.logWarning(\"Browser interactive action interrupted\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.action_dispatched\": dispatched,\n \"browser.action_outcome_unknown\": dispatched,\n }),\n );\n const completion = pending;\n\n if (completion !== undefined) {\n yield* Effect.promise(() => boundedBestEffort(completion, 500));\n }\n }),\n ),\n );\n });\n\n const decodeActionObservation = Effect.fn(\"BrowserRunInteractive.decodeActionObservation\")(\n function* (raw: unknown) {\n return yield* Schema.decodeUnknownEffect(ActionObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed action observation\", cause),\n ),\n );\n },\n );\n\n const logActionObservation = (\n operation: \"fill\" | \"click\",\n observation: typeof ActionObservation.Type,\n ) =>\n Effect.logInfo(\"Browser interactive action observed\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.selector_match_count\": observation.before.matchCount,\n ...(observation.before.kind === undefined\n ? {}\n : { \"browser.target_kind\": observation.before.kind }),\n ...(observation.before.checked === undefined\n ? {}\n : { \"browser.target_checked_before\": observation.before.checked }),\n ...(observation.after?.checked === undefined\n ? {}\n : { \"browser.target_checked_after\": observation.after.checked }),\n ...(observation.before.selected === undefined\n ? {}\n : { \"browser.target_selected_before\": observation.before.selected }),\n ...(observation.after?.selected === undefined\n ? {}\n : { \"browser.target_selected_after\": observation.after.selected }),\n ...(observation.before.disabled === undefined\n ? {}\n : { \"browser.target_disabled_before\": observation.before.disabled }),\n ...(observation.after?.disabled === undefined\n ? {}\n : { \"browser.target_disabled_after\": observation.after.disabled }),\n ...(observation.before.required === undefined\n ? {}\n : { \"browser.target_required_before\": observation.before.required }),\n ...(observation.after?.required === undefined\n ? {}\n : { \"browser.target_required_after\": observation.after.required }),\n ...(observation.before.valid === undefined\n ? {}\n : { \"browser.target_valid_before\": observation.before.valid }),\n ...(observation.after?.valid === undefined\n ? {}\n : { \"browser.target_valid_after\": observation.after.valid }),\n ...(observation.before.formValid === undefined\n ? {}\n : { \"browser.form_valid_before\": observation.before.formValid }),\n ...(observation.after?.formValid === undefined\n ? {}\n : { \"browser.form_valid_after\": observation.after.formValid }),\n \"browser.target_after_unavailable\": observation.afterUnavailable,\n \"browser.fetch_xhr_total\": observation.network.total,\n \"browser.fetch_xhr_2xx\": observation.network.status2xx,\n \"browser.fetch_xhr_3xx\": observation.network.status3xx,\n \"browser.fetch_xhr_4xx\": observation.network.status4xx,\n \"browser.fetch_xhr_5xx\": observation.network.status5xx,\n \"browser.fetch_xhr_failed\": observation.network.failed,\n \"browser.fetch_xhr_pending\": observation.network.pending,\n \"browser.network_settle_timed_out\": observation.network.settleTimedOut,\n }),\n );\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n consumeAction = true,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n if (consumeAction) {\n const admitted = yield* Ref.modify(actions, (count) =>\n count >= policy.maxActions\n ? [{ allowed: false, observed: count + 1 }, count]\n : [{ allowed: true, observed: count + 1 }, count + 1],\n );\n\n if (!admitted.allowed) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"actions\",\n maximum: policy.maxActions,\n observed: admitted.observed,\n message: \"The browser action limit was reached\",\n });\n }\n }\n\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\n ),\n ),\n );\n\n return yield* withinDeadline(completed, policy, startedAt, () => {\n state.uncertain.value = true;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.sync(() => {\n state.uncertain.value = true;\n }),\n ),\n Effect.catch((error) => {\n if (Schema.is(InteractiveBrowserLimitError)(error) && error.limit === \"elapsed\") {\n return Effect.fail(error);\n }\n const failure = stateFailure(state);\n\n if (\n Schema.is(InteractiveBrowserActionError)(error) &&\n !isBrowserRunUndispatchedActionError(error)\n ) {\n state.uncertain.value = true;\n }\n\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n InteractiveBrowserBusyError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The browser handle already has an operation in flight\",\n }),\n ),\n ),\n );\n\n const handle: BrowserHandle = {\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n yield* remote(\"navigate\", () => page.goto(request.url));\n\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n Schema.is(InteractiveBrowserTargetUrl)(request.url) && hostAllowed(policy, request.url)\n ? Effect.void\n : Effect.fail(policyError(\"The navigation URL is outside the browser policy\")),\n ),\n ),\n readText: (request) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"read-text\", () =>\n page.readText(request.selector, policy.maxReturnedBytes),\n );\n\n const observation = yield* Schema.decodeUnknownEffect(TextObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed text observation\", cause),\n ),\n );\n\n if (observation._tag === \"MissingElement\") {\n return yield* actionError(\"read-text\");\n }\n if (observation._tag === \"OverLimit\") {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: observation.observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n const observed = new TextEncoder().encode(observation.text).byteLength;\n\n if (observed > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n\n return yield* Schema.decodeUnknownEffect(BrowserTextResult)({\n text: observation.text,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned malformed page text\", cause),\n ),\n );\n }),\n ),\n fill: (request) =>\n run(\n Effect.gen(function* () {\n const observation = yield* observedAction(\"fill\", (signal, onDispatch) =>\n page.fill(request.selector, request.value, signal, onDispatch),\n ).pipe(Effect.flatMap(decodeActionObservation));\n\n yield* logActionObservation(\"fill\", observation);\n\n return yield* decodeActionResult(page, policy);\n }),\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const observation = yield* observedAction(\"click\", (signal, onDispatch) =>\n page.click(request.selector, signal, onDispatch),\n ).pipe(Effect.flatMap(decodeActionObservation));\n\n yield* logActionObservation(\"click\", observation);\n\n return yield* decodeActionResult(page, policy);\n }),\n ),\n screenshot: (request) =>\n Schema.decodeUnknownEffect(BrowserScreenshotRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser screenshot request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"screenshot\", () => page.screenshot(decoded.fullPage));\n\n const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n\n if (bytes.length > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: bytes.length,\n message: \"The browser screenshot byte limit was reached\",\n });\n }\n\n return yield* Schema.decodeUnknownEffect(PageScreenshotResult)({\n implementation: browserRunInteractiveImplementation,\n mediaType: \"image/png\",\n bytes: new Uint8Array(bytes),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n }),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n scroll: (request) =>\n Schema.decodeUnknownEffect(BrowserScrollRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser scroll request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n remote(\"scroll\", () => page.scroll(decoded.deltaX, decoded.deltaY)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n close,\n };\n\n return { handle, run };\n});\n\nconst remainingMillis = Effect.fn(\"BrowserRunInteractive.remainingMillis\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n\n return Math.max(0, policy.maxElapsedMillis - Math.max(0, now - startedAt));\n});\n\nconst closeEntry = (close: () => Promise<void>, warning: string): CloseEntry => ({\n close: Effect.tryPromise({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n ),\n warning,\n});\n\nconst syncCloseEntry = (close: () => void, warning: string): CloseEntry => ({\n close: Effect.try({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }),\n warning,\n});\n\nconst runTeardown = (\n entries: ReadonlyArray<CloseEntry>,\n): Effect.Effect<ReadonlyArray<CloseFailure>> =>\n Effect.forEach([...entries].reverse(), (entry) =>\n entry.close.pipe(\n Effect.match({\n onFailure: (error): CloseFailure | undefined => ({ error, warning: entry.warning }),\n onSuccess: (): CloseFailure | undefined => undefined,\n }),\n ),\n ).pipe(Effect.map((failures) => failures.filter((failure) => failure !== undefined)));\n\nconst cdpCommand = <A>(\n page: BrowserRunInteractivePage,\n state: HandleState,\n command: BrowserRunCloudflareCommand,\n parameters: unknown,\n output: Schema.Codec<A>,\n malformedMessage: string,\n): Effect.Effect<A, InteractiveBrowserError> =>\n Effect.scoped(\n Effect.gen(function* () {\n const cdp = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, page.createCdpSession, (acquired) => acquired.detach()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the Cloudflare browser control session failed\", cause),\n }),\n (acquired) =>\n closeWithWarning(\n acquired.detach,\n \"Detaching the Cloudflare browser control session failed\",\n ),\n { interruptible: true },\n );\n\n const raw = yield* Effect.tryPromise({\n try: () => cdp.send(command, parameters),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"The Cloudflare browser control command failed\", cause),\n });\n\n return yield* Schema.decodeUnknownEffect(output)(raw).pipe(\n Effect.mapError(() => protocolError(malformedMessage)),\n );\n }),\n );\n\nconst makeHostService = (\n binding: BrowserRunInteractiveBinding[\"Service\"],\n): BrowserRunInteractiveHost[\"Service\"] => {\n const closeSession = binding.closeSession;\n\n const terminate = Effect.fn(\"BrowserRunInteractiveHost.terminate\")(function* (\n sessionId: Redacted.Redacted<string>,\n entries: ReadonlyArray<CloseEntry>,\n ) {\n const deadline = (yield* Clock.currentTimeMillis) + 10_000;\n\n yield* closeSession(sessionId).pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n );\n const remaining = deadline - (yield* Clock.currentTimeMillis);\n\n if (remaining <= 0)\n return yield* Effect.logWarning(\n \"Local browser teardown skipped after confirmed termination deadline\",\n );\n // Remote termination is authoritative. Local cleanup must not veto it or extend the deadline.\n yield* runTeardown(entries).pipe(\n Effect.flatMap((failures) =>\n Effect.forEach(failures, (failure) => Effect.logWarning(failure.warning), {\n discard: true,\n }),\n ),\n Effect.interruptible,\n Effect.timeout(`${remaining} millis`),\n Effect.catchCause(() =>\n Effect.logWarning(\"Local browser teardown incomplete after confirmed termination\"),\n ),\n );\n });\n\n const closeAcquired = Effect.fn(\"BrowserRunInteractiveHost.closeAcquired\")(function* (\n browser: BrowserRunInteractiveBrowser,\n ) {\n const sessionId = yield* Effect.try({\n try: browser.sessionId,\n catch: () => actionError(\"close\"),\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(BrowserRunSessionId)),\n Effect.mapError(() => actionError(\"close\")),\n Effect.onError(() =>\n closeWithWarning(browser.close, \"Closing an unidentified browser failed\"),\n ),\n );\n\n yield* terminate(Redacted.make(sessionId), [\n closeEntry(browser.close, \"Closing the local browser connection failed\"),\n ]);\n });\n\n const open = Effect.fn(\"BrowserRunInteractiveHost.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope> {\n const fixedPolicy = yield* snapshotPolicy(policy);\n const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n\n const state: HandleState = {\n closed: { value: false },\n disconnected: { value: false },\n uncertain: { value: false },\n violation: { value: undefined },\n pendingRequests: new Set(),\n };\n\n const lifecycle = {\n managedTeardownInstalled: false,\n };\n\n const closers: Array<CloseEntry> = [];\n\n const releaseBeforeManaged = (entry: CloseEntry): Effect.Effect<void> =>\n Effect.suspend(() =>\n lifecycle.managedTeardownInstalled\n ? Effect.void\n : entry.close.pipe(Effect.catchCause(() => Effect.logWarning(entry.warning))),\n );\n\n const browser = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.launch(keepAliveMillis(fixedPolicy)),\n (acquired) => Effect.runPromise(closeAcquired(acquired)),\n ),\n catch: (cause) =>\n isCapacityRefusal(cause)\n ? InteractiveBrowserCapacityError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"Browser Run has no capacity for a new browser session\",\n })\n : protocolError(\"Launching the Browser Run session failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) => {\n state.disconnected.value = true;\n\n return lifecycle.managedTeardownInstalled\n ? Effect.void\n : closeAcquired(acquired).pipe(\n Effect.catch(() => Effect.logWarning(\"Whole-browser cleanup remains unconfirmed\")),\n );\n },\n { interruptible: true },\n );\n\n closers.push(closeEntry(browser.close, \"Closing the interactive browser failed\"));\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\n\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => browser.onDisconnected(disconnected),\n catch: (cause) => protocolError(\"Installing the browser disconnect listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n );\n\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) => protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n\n if (!connected) {\n state.disconnected.value = true;\n\n return yield* expiredError();\n }\n\n const sessionIdValue = yield* Effect.try({\n try: browser.sessionId,\n catch: (cause) => protocolError(\"Reading the Browser Run session identity failed\", cause),\n }).pipe(\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(BrowserRunSessionId)(value).pipe(\n Effect.mapError(() => protocolError(\"The Browser Run session identity was malformed\")),\n ),\n ),\n );\n\n const context = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, browser.createContext, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser context failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser context failed\"),\n ),\n { interruptible: true },\n );\n\n closers.push(closeEntry(context.close, \"Closing the interactive browser context failed\"));\n\n const page = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, context.newPage, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser page failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser page failed\"),\n ),\n { interruptible: true },\n );\n\n closers.push(closeEntry(page.close, \"Closing the interactive browser page failed\"));\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setBypassServiceWorker(true),\n catch: (cause) => protocolError(\"Bypassing browser service workers failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n const requestListener = makeRequestListener(fixedPolicy, state);\n\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => page.onRequest(requestListener),\n catch: (cause) => protocolError(\"Installing the browser request listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setRequestInterception(true),\n catch: (cause) => protocolError(\"Installing the browser request policy failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n yield* withinDeadline(awaitPendingRequests(state), fixedPolicy, startedAt);\n const setupFailure = stateFailure(state);\n\n if (setupFailure !== undefined) return yield* setupFailure;\n\n const teardown = yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const cached = yield* Effect.cached(terminate(Redacted.make(sessionIdValue), closers));\n\n lifecycle.managedTeardownInstalled = true;\n yield* Effect.addFinalizer(() =>\n Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(cached),\n Effect.catch(() => Effect.logWarning(\"Whole-browser cleanup remains unconfirmed\")),\n ),\n ),\n );\n\n return cached;\n }),\n );\n\n const close: Effect.Effect<void, InteractiveBrowserError> = Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(Effect.andThen(teardown)),\n );\n\n const runtime = yield* makeHandle(page, fixedPolicy, startedAt, state, close);\n const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);\n\n const requestFitsSession = (requestedMillis: number): Effect.Effect<void, BrowserFailure> =>\n remainingMillis(fixedPolicy, startedAt).pipe(\n Effect.flatMap((remaining) =>\n remaining > 0 && requestedMillis <= remaining\n ? Effect.void\n : Effect.fail(\n policyError(\"The host browser request exceeds the remaining session time\"),\n ),\n ),\n );\n\n return {\n handle: runtime.handle,\n sessionId: Redacted.make(sessionIdValue),\n resizeViewport: (viewport) =>\n decodeViewport(viewport).pipe(\n Effect.flatMap((decoded) =>\n runtime.run(\n Effect.tryPromise({\n try: () => page.setViewport(decoded),\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n\n return expiredError();\n }\n\n return protocolError(\"Resizing the browser viewport failed\", cause);\n },\n }),\n currentPagePreflight,\n false,\n ),\n ),\n ),\n getLiveView: (request) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The Live View request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getLiveView\",\n { mode: decoded.mode, expiresInMs: decoded.expiresInMs },\n LiveViewObservation,\n \"Cloudflare returned a malformed Live View response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed Live View response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.expiresInMs))),\n ),\n ),\n ),\n handoff: (request) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser handoff request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.handoff\",\n { instructions: decoded.instructions, timeout: decoded.timeout },\n HandoffObservation,\n \"Cloudflare returned a malformed browser handoff response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffResult)({\n handoffId: Redacted.make(observation.handoffId),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.timeout))),\n ),\n ),\n ),\n getHandoffState: runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getHandoffState\",\n {},\n HandoffStateObservation,\n \"Cloudflare returned a malformed browser handoff state\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffState)({\n active: observation.active,\n ...(observation.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(observation.handoffId) }),\n ...(observation.durationMs === undefined\n ? {}\n : { durationMs: observation.durationMs }),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff state\"),\n ),\n ),\n ),\n ),\n currentPagePreflight,\n ),\n close,\n };\n });\n\n return BrowserRunInteractiveHost.of({\n open,\n closeSession,\n cleanupSemantics: \"confirmed-terminal\",\n });\n};\n\n/** Cloudflare host controls and private session identity for one scoped Browser Run pass. */\nexport const browserRunInteractiveHostLayer = (): Layer.Layer<\n BrowserRunInteractiveHost,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n BrowserRunInteractiveHost,\n Effect.gen(function* () {\n return makeHostService(yield* BrowserRunInteractiveBinding);\n }),\n );\n\n/** Worker-only generic adapter; Cloudflare identity and controls remain host-only. */\nexport const browserRunInteractiveLayer = (): Layer.Layer<\n InteractiveBrowser,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n InteractiveBrowser,\n Effect.gen(function* () {\n const binding = yield* BrowserRunInteractiveBinding;\n const host = makeHostService(binding);\n\n return InteractiveBrowser.of({\n open: (policy) => host.open(policy).pipe(Effect.map((session) => session.handle)),\n });\n }),\n );\n\n/** Resolved Worker binding, cleanup credentials, and optional initial viewport. */\nexport interface CloudflareInteractiveBrowserOptions extends BrowserRunLifecycleOptions {\n readonly browser: BrowserRun;\n readonly viewport?: BrowserRunViewport;\n}\n\nconst interactiveBindingLayer = (options: CloudflareInteractiveBrowserOptions) =>\n BrowserRunInteractiveBinding.layer(options).pipe(\n Layer.provide(BrowserRunSessionLifecycle.layer(options)),\n );\n\n/** Worker-only assembly; importing ordinary capture never loads Puppeteer. */\nexport const CloudflareInteractiveBrowser = {\n /**\n * Assemble binding, confirmed-session cleanup, and the generic browser service.\n * HttpClient and construction errors remain visible. Opening a pass still requires\n * an explicit policy and Scope; no browser is launched during Layer construction.\n */\n layer: (options: CloudflareInteractiveBrowserOptions) =>\n browserRunInteractiveLayer().pipe(Layer.provide(interactiveBindingLayer(options))),\n /** Opt into private host controls instead of exposing them through the generic service. */\n hostLayer: (options: CloudflareInteractiveBrowserOptions) =>\n browserRunInteractiveHostLayer().pipe(Layer.provide(interactiveBindingLayer(options))),\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InteractiveBrowser.mjs","names":[],"sources":["../src/InteractiveBrowser.ts"],"sourcesContent":["/// <reference types=\"@cloudflare/workers-types\" />\n\nimport puppeteer, {\n type Browser,\n type BrowserContext,\n type CDPSession,\n type HTTPRequest,\n type Page,\n} from \"@cloudflare/puppeteer\";\nimport {\n BrowserActionResult,\n BrowserScreenshotRequest,\n BrowserScrollRequest,\n BrowserNavigationResult,\n BrowserTextResult,\n InteractiveBrowser,\n InteractiveBrowserActionError,\n InteractiveBrowserBusyError,\n InteractiveBrowserCapacityError,\n InteractiveBrowserExpiredError,\n InteractiveBrowserLimitError,\n InteractiveBrowserPolicy,\n InteractiveBrowserPolicyDeniedError,\n InteractiveBrowserProtocolError,\n InteractiveBrowserTargetUrl,\n InteractiveBrowserUnsupportedError,\n type BrowserHandle,\n type InteractiveBrowserError,\n type InteractiveBrowserNetworkPolicy,\n} from \"@effect-agent/sandbox/InteractiveBrowser\";\nimport { PageScreenshotResult } from \"@effect-agent/sandbox/PageScreenshot\";\nimport { SandboxImplementation } from \"@effect-agent/sandbox/Sandbox\";\nimport {\n Context,\n Clock,\n Duration,\n Effect,\n Layer,\n Option,\n Redacted,\n Ref,\n Schema,\n Semaphore,\n type Scope,\n} from \"effect\";\n\nimport {\n BrowserRunSessionLifecycle,\n type BrowserRunLifecycleOptions,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport {\n BrowserRunCleanupError,\n BrowserRunSessionLifecycle,\n} from \"./internal/browser-session-lifecycle.ts\";\n\nexport const browserRunInteractiveImplementation = SandboxImplementation.make({\n isolation: \"isolated\",\n identity: \"cloudflare-browser-run-interactive\",\n});\n\nconst MIN_KEEP_ALIVE_MILLIS = 10_000;\nconst MAX_KEEP_ALIVE_MILLIS = 600_000;\nconst MAX_TEXT_LENGTH = 8 * 1024 * 1024;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\nconst MIN_LIVE_VIEW_EXPIRY_MILLIS = 60_000;\nconst MAX_LIVE_VIEW_EXPIRY_MILLIS = 60 * 60_000;\nconst MAX_HANDOFF_TIMEOUT_MILLIS = 30 * 60_000;\nconst MAX_HOST_TEXT_LENGTH = 8 * 1024;\nconst CLEANUP_STEP_TIMEOUT_MILLIS = 10_000;\nconst ACTION_NETWORK_QUIET_MILLIS = 200;\nconst ACTION_NETWORK_SETTLE_MILLIS = 2_000;\nconst ACTION_POST_STATE_MILLIS = 250;\nconst MAX_OBSERVED_CONTROLS = 64;\nconst PositiveInt = Schema.Int.check(Schema.isGreaterThan(0));\n\nconst BoundedHostText = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n);\n\nconst BoundedRemoteText = Schema.String.check(Schema.isMaxLength(MAX_TEXT_LENGTH));\n\nconst TextObservation = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Text\"), text: BoundedRemoteText }),\n Schema.Struct({ _tag: Schema.Literal(\"MissingElement\") }),\n Schema.Struct({ _tag: Schema.Literal(\"OverLimit\"), observed: Schema.Natural }),\n]);\n\nconst ActionTargetState = Schema.Struct({\n matchCount: Schema.Natural,\n invalidSelector: Schema.optionalKey(Schema.Boolean),\n kind: Schema.optionalKey(\n Schema.Literals([\"button\", \"checkbox\", \"radio\", \"select\", \"text\", \"link\", \"other\"]),\n ),\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n disabled: Schema.optionalKey(Schema.Boolean),\n required: Schema.optionalKey(Schema.Boolean),\n valid: Schema.optionalKey(Schema.Boolean),\n formValid: Schema.optionalKey(Schema.Boolean),\n});\n\nconst ActionNetworkState = Schema.Struct({\n total: Schema.Natural,\n status2xx: Schema.Natural,\n status3xx: Schema.Natural,\n status4xx: Schema.Natural,\n status5xx: Schema.Natural,\n failed: Schema.Natural,\n pending: Schema.Natural,\n settleTimedOut: Schema.Boolean,\n});\n\nconst ActionObservation = Schema.Struct({\n before: ActionTargetState,\n after: Schema.optionalKey(ActionTargetState),\n afterUnavailable: Schema.Boolean,\n network: ActionNetworkState,\n});\n\nconst PageObservation = Schema.fromJsonString(\n Schema.Struct({\n pageText: BoundedRemoteText,\n selectorMatchCount: Schema.Natural,\n controlsTruncated: Schema.Boolean,\n controls: Schema.Array(\n Schema.Struct({\n selector: BoundedRemoteText,\n kind: BoundedRemoteText,\n label: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(200))),\n checked: Schema.optionalKey(Schema.Boolean),\n selected: Schema.optionalKey(Schema.Boolean),\n disabled: Schema.optionalKey(Schema.Boolean),\n required: Schema.optionalKey(Schema.Boolean),\n valid: Schema.optionalKey(Schema.Boolean),\n formValid: Schema.optionalKey(Schema.Boolean),\n }),\n ).check(Schema.isMaxLength(MAX_OBSERVED_CONTROLS)),\n }),\n);\n\nconst PngBytes = Schema.Uint8Array.check(\n Schema.isMaxLength(MAX_SCREENSHOT_BYTES),\n Schema.makeFilter(\n (bytes) =>\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a,\n { title: \"PNG bytes\" },\n ),\n);\n\nconst BrowserRunSessionId = Schema.String.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n Schema.makeFilter((value) => /^[A-Za-z0-9_-]+$/.test(value), {\n title: \"a Browser Run session identifier\",\n }),\n);\n\nconst LiveViewUrl = Schema.String.check(\n Schema.isMaxLength(MAX_HOST_TEXT_LENGTH),\n Schema.makeFilter(\n (value) => {\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n url.host === \"live.browser.run\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n url.pathname === \"/ui/view\" &&\n url.searchParams.get(\"mode\") === \"tab\" &&\n (url.searchParams.get(\"wss\") ?? \"\").startsWith(\"live.browser.run/api/devtools/browser/\")\n );\n } catch {\n return false;\n }\n },\n { title: \"a Cloudflare Live View HTTPS URL\" },\n ),\n);\n\nconst LiveViewObservation = Schema.Struct({ devtoolsFrontendUrl: LiveViewUrl });\nconst HandoffObservation = Schema.Struct({ handoffId: BoundedHostText });\n\nconst HandoffDuration = Schema.Natural.check(\n Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS),\n);\n\nconst HandoffStateObservation = Schema.Union([\n Schema.Struct({\n active: Schema.Literal(true),\n handoffId: BoundedHostText,\n durationMs: HandoffDuration,\n }),\n Schema.Struct({\n active: Schema.Literal(false),\n handoffId: Schema.optionalKey(BoundedHostText),\n durationMs: Schema.optionalKey(HandoffDuration),\n }),\n]);\n\n/**\n * Host presentation state in CSS pixels. Dimensions are integers in 1..2048,\n * density is finite in 1..2 (default 1), and neither scaled dimension may exceed\n * 2048 pixels. Mobile, touch, and orientation emulation are not supported.\n */\nexport class BrowserRunViewport extends Schema.Class<BrowserRunViewport>(\"BrowserRunViewport\")(\n Schema.Struct({\n width: PositiveInt.check(Schema.isLessThanOrEqualTo(2_048)),\n height: PositiveInt.check(Schema.isLessThanOrEqualTo(2_048)),\n deviceScaleFactor: Schema.optionalKey(\n Schema.Finite.check(Schema.isBetween({ minimum: 1, maximum: 2 })),\n ),\n }).check(\n Schema.makeFilter(\n (viewport) =>\n Math.max(viewport.width, viewport.height) * (viewport.deviceScaleFactor ?? 1) <= 2_048,\n { title: \"a viewport with scaled dimensions no larger than 2048 pixels\" },\n ),\n ),\n) {}\n\nconst decodeViewport = (input: BrowserRunViewport) =>\n Schema.decodeUnknownEffect(BrowserRunViewport)(input, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError(() => policyError(\"The browser viewport is malformed\")),\n // Copy only presentation fields, including for Schema class instances.\n Effect.map((viewport) => ({\n width: viewport.width,\n height: viewport.height,\n deviceScaleFactor: viewport.deviceScaleFactor ?? 1,\n })),\n );\n\n/** Host-only request for a redacted Cloudflare Live View URL. */\nexport class BrowserRunLiveViewRequest extends Schema.Class<BrowserRunLiveViewRequest>(\n \"BrowserRunLiveViewRequest\",\n)({\n mode: Schema.Literal(\"tab\"),\n expiresInMs: PositiveInt.check(\n Schema.isBetween({\n minimum: MIN_LIVE_VIEW_EXPIRY_MILLIS,\n maximum: MAX_LIVE_VIEW_EXPIRY_MILLIS,\n }),\n ),\n}) {}\n\nexport class BrowserRunLiveViewResult extends Schema.Class<BrowserRunLiveViewResult>(\n \"BrowserRunLiveViewResult\",\n)({ devtoolsFrontendUrl: Schema.Redacted(LiveViewUrl) }) {}\n\n/** Start one bounded handoff; controller ownership remains a consumer concern. */\nexport class BrowserRunHandoffRequest extends Schema.Class<BrowserRunHandoffRequest>(\n \"BrowserRunHandoffRequest\",\n)({\n instructions: BoundedHostText.check(Schema.isMaxLength(1_024)),\n timeout: PositiveInt.check(Schema.isLessThanOrEqualTo(MAX_HANDOFF_TIMEOUT_MILLIS)),\n}) {}\n\nexport class BrowserRunHandoffResult extends Schema.Class<BrowserRunHandoffResult>(\n \"BrowserRunHandoffResult\",\n)({ handoffId: Schema.Redacted(BoundedHostText) }) {}\n\nexport class BrowserRunHandoffState extends Schema.Class<BrowserRunHandoffState>(\n \"BrowserRunHandoffState\",\n)({\n active: Schema.Boolean,\n handoffId: Schema.optionalKey(Schema.Redacted(BoundedHostText)),\n durationMs: Schema.optionalKey(HandoffDuration),\n}) {}\n\ntype BrowserFailure = typeof InteractiveBrowserError.Type;\ntype BrowserOperation = InteractiveBrowserActionError[\"operation\"];\n\ninterface InteractiveBrowserPolicySnapshot {\n readonly network: Exclude<InteractiveBrowserNetworkPolicy, { readonly _tag: \"PublicWeb\" }>;\n readonly maxActions: number;\n readonly maxElapsedMillis: number;\n readonly maxReturnedBytes: number;\n}\n\n/** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */\nexport interface BrowserRunInteractiveRequest {\n readonly url: () => string;\n readonly abort: () => Promise<void>;\n readonly continue: () => Promise<void>;\n}\n\nexport type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;\n\nexport type BrowserRunCloudflareCommand =\n | \"Cloudflare.getLiveView\"\n | \"Cloudflare.handoff\"\n | \"Cloudflare.getHandoffState\";\n\n/** Narrow CDP boundary for Cloudflare commands absent from the pinned protocol types. */\nexport interface BrowserRunInteractiveCdpSession {\n readonly send: (command: BrowserRunCloudflareCommand, parameters: unknown) => Promise<unknown>;\n readonly detach: () => Promise<void>;\n}\n\n/** Narrow page boundary used by deterministic tests; SDK values remain in this package. */\nexport interface BrowserRunInteractivePage {\n readonly close: () => Promise<void>;\n readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;\n readonly setRequestInterception: (enabled: boolean) => Promise<void>;\n readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;\n readonly goto: (url: string) => Promise<void>;\n readonly url: () => unknown;\n readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;\n readonly fill: (\n selector: string,\n value: string,\n signal: AbortSignal,\n onDispatch: () => void,\n ) => Promise<unknown>;\n readonly click: (\n selector: string,\n signal: AbortSignal,\n onDispatch: () => void,\n ) => Promise<unknown>;\n readonly screenshot: (fullPage: boolean) => Promise<unknown>;\n readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;\n readonly setViewport: (viewport: BrowserRunViewport) => Promise<void>;\n readonly createCdpSession: () => Promise<BrowserRunInteractiveCdpSession>;\n}\n\nexport interface BrowserRunInteractiveContext {\n readonly newPage: () => Promise<BrowserRunInteractivePage>;\n readonly close: () => Promise<void>;\n}\n\nexport interface BrowserRunInteractiveBrowser {\n readonly createContext: () => Promise<BrowserRunInteractiveContext>;\n readonly close: () => Promise<void>;\n readonly sessionId: () => unknown;\n readonly isConnected: () => boolean;\n readonly onDisconnected: (listener: () => void) => void;\n readonly offDisconnected: (listener: () => void) => void;\n}\n\n/** Host-supplied Browser Run binding projected into one fakeable launch operation. */\nexport class BrowserRunInteractiveBinding extends Context.Service<\n BrowserRunInteractiveBinding,\n {\n readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;\n /** Success proves whole-browser termination or exact-session absence. */\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding\") {\n static layer(options: {\n readonly browser: BrowserRun;\n readonly viewport?: BrowserRunViewport;\n }): Layer.Layer<\n BrowserRunInteractiveBinding,\n InteractiveBrowserPolicyDeniedError,\n BrowserRunSessionLifecycle\n > {\n return Layer.effect(BrowserRunInteractiveBinding)(\n Effect.gen(function* () {\n const lifecycle = yield* BrowserRunSessionLifecycle;\n\n const viewport =\n options.viewport === undefined ? undefined : yield* decodeViewport(options.viewport);\n\n return {\n launch: async (keepAliveMillis: number) =>\n makeProductionBrowser(\n await puppeteer.launch(options.browser, {\n keep_alive: keepAliveMillis,\n ...(viewport === undefined ? {} : { defaultViewport: { ...viewport } }),\n }),\n ),\n closeSession: (sessionId: Redacted.Redacted<string>) =>\n lifecycle\n .close(sessionId)\n .pipe(Effect.mapError((cause) => actionError(\"close\", cause))),\n };\n }),\n );\n }\n}\n\nexport interface BrowserRunInteractiveSession {\n readonly handle: BrowserHandle;\n readonly sessionId: Redacted.Redacted<string>;\n /**\n * Resize without charging an agent action or changing emulation modes. Shares\n * the handle's fail-fast lock, page-policy preflight, and elapsed deadline.\n * A timeout or interruption leaves the session unusable; no resize is retried.\n * The host must authorize callers. No viewer ownership or durable state is added.\n */\n readonly resizeViewport: (\n viewport: BrowserRunViewport,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n readonly getLiveView: (\n request: BrowserRunLiveViewRequest,\n ) => Effect.Effect<BrowserRunLiveViewResult, InteractiveBrowserError>;\n readonly handoff: (\n request: BrowserRunHandoffRequest,\n ) => Effect.Effect<BrowserRunHandoffResult, InteractiveBrowserError>;\n readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, InteractiveBrowserError>;\n readonly close: Effect.Effect<void, InteractiveBrowserError>;\n}\n\n/** Cloudflare host authority kept separate from the provider-neutral browser handle. */\nexport class BrowserRunInteractiveHost extends Context.Service<\n BrowserRunInteractiveHost,\n {\n readonly cleanupSemantics?: \"confirmed-terminal\";\n readonly open: (\n policy: InteractiveBrowserPolicy,\n ) => Effect.Effect<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope>;\n readonly closeSession: (\n sessionId: Redacted.Redacted<string>,\n ) => Effect.Effect<void, InteractiveBrowserError>;\n }\n>()(\"@effect-agent/platform-cloudflare/BrowserRunInteractiveHost\") {}\n\nconst makeProductionRequest = (request: HTTPRequest): BrowserRunInteractiveRequest => ({\n url: () => request.url(),\n abort: () => request.abort(\"blockedbyclient\"),\n continue: () => request.continue(),\n});\n\nconst makeProductionCdpSession = (session: CDPSession): BrowserRunInteractiveCdpSession => ({\n send: async (command, parameters) => {\n const send = Reflect.get(session, \"send\");\n\n return await Reflect.apply(send, session, [command, parameters]);\n },\n detach: () => session.detach(),\n});\n\nclass BrowserRunActionUndispatched extends Error {\n readonly matchCount: number;\n\n constructor(matchCount: number) {\n super(\"The browser action selector did not resolve to exactly one element\");\n this.matchCount = matchCount;\n }\n}\n\nconst readActionTarget = (page: Page, selector: string): Promise<unknown> =>\n page.evaluate((requestedSelector) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n let matches;\n\n try {\n matches = Reflect.apply(Reflect.get(pageDocument, \"querySelectorAll\"), pageDocument, [\n requestedSelector,\n ]);\n } catch (cause) {\n if (cause instanceof Error && cause.name === \"SyntaxError\") {\n return { matchCount: 0, invalidSelector: true };\n }\n throw cause;\n }\n if (typeof matches !== \"object\" || matches === null) throw new Error(\"Invalid query result\");\n const matchCount = Math.min(10_000, Reflect.get(matches, \"length\"));\n const element = Reflect.get(matches, 0);\n\n if (element === undefined) return { matchCount };\n\n const associated = Reflect.get(element, \"control\") ?? element;\n const tagName = String(Reflect.get(associated, \"tagName\") ?? \"\").toLowerCase();\n const inputType = String(Reflect.get(associated, \"type\") ?? \"\").toLowerCase();\n\n const role = String(\n Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\"role\"]) ?? \"\",\n ).toLowerCase();\n\n const kind =\n tagName === \"button\" || role === \"button\"\n ? \"button\"\n : inputType === \"checkbox\" || role === \"checkbox\" || role === \"switch\"\n ? \"checkbox\"\n : inputType === \"radio\" || role === \"radio\"\n ? \"radio\"\n : tagName === \"select\"\n ? \"select\"\n : tagName === \"input\" || tagName === \"textarea\"\n ? \"text\"\n : tagName === \"a\"\n ? \"link\"\n : \"other\";\n\n const checked = Reflect.get(associated, \"checked\");\n\n const selected =\n tagName === \"select\"\n ? Reflect.get(associated, \"selectedIndex\") >= 0\n : Reflect.get(associated, \"selected\");\n\n const disabled = Reflect.get(associated, \"disabled\");\n const required = Reflect.get(associated, \"required\");\n const validity = Reflect.get(associated, \"validity\");\n const form = Reflect.get(associated, \"form\");\n\n const formMatches =\n form === null || form === undefined ? undefined : Reflect.get(form, \"matches\");\n\n const ariaChecked = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-checked\",\n ]);\n\n const ariaDisabled = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-disabled\",\n ]);\n\n const ariaSelected = Reflect.apply(Reflect.get(element, \"getAttribute\"), element, [\n \"aria-selected\",\n ]);\n\n return {\n matchCount,\n kind,\n ...(typeof checked === \"boolean\"\n ? { checked }\n : ariaChecked === \"true\" || ariaChecked === \"false\"\n ? { checked: ariaChecked === \"true\" }\n : {}),\n ...(typeof selected === \"boolean\"\n ? { selected }\n : ariaSelected === \"true\" || ariaSelected === \"false\"\n ? { selected: ariaSelected === \"true\" }\n : {}),\n disabled: typeof disabled === \"boolean\" ? disabled : ariaDisabled === \"true\",\n ...(typeof required === \"boolean\" ? { required } : {}),\n ...(validity !== undefined && typeof Reflect.get(validity, \"valid\") === \"boolean\"\n ? { valid: Reflect.get(validity, \"valid\") }\n : {}),\n ...(typeof formMatches === \"function\"\n ? { formValid: Reflect.apply(formMatches, form, [\":valid\"]) }\n : {}),\n };\n }, selector);\n\n// SDK promises cannot be cancelled. Clear our timer and observe late rejections;\n// the owning browser Scope is responsible for terminating the remote session.\nconst boundedBestEffort = async <A>(\n promise: Promise<A>,\n millis: number,\n): Promise<A | undefined> => {\n let timer: ReturnType<typeof setTimeout> | number | undefined;\n\n try {\n return await Promise.race([\n promise.catch(() => undefined),\n new Promise<undefined>((resolve) => {\n timer = setTimeout(resolve, millis);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n};\n\nconst readActionTargetAfter = (page: Page, selector: string) =>\n boundedBestEffort(\n readActionTarget(page, selector).then(Schema.decodeUnknownSync(ActionTargetState)),\n ACTION_POST_STATE_MILLIS,\n );\n\nconst makeActionRequestTracker = (page: Page, signal: AbortSignal) => {\n const pending = new Set<HTTPRequest>();\n let total = 0;\n let status2xx = 0;\n let status3xx = 0;\n let status4xx = 0;\n let status5xx = 0;\n let failed = 0;\n let lastChange = performance.now();\n let closed = false;\n let wake: (() => void) | undefined;\n let timer: ReturnType<typeof setTimeout> | number | undefined;\n\n const relevant = (request: HTTPRequest) => {\n const resourceType = request.resourceType();\n\n return resourceType === \"fetch\" || resourceType === \"xhr\";\n };\n\n const onRequest = (request: HTTPRequest) => {\n if (!relevant(request)) return;\n pending.add(request);\n total++;\n lastChange = performance.now();\n };\n\n const onFinished = (request: HTTPRequest) => {\n if (!pending.delete(request)) return;\n let status: number | undefined;\n\n try {\n status = request.response()?.status();\n } catch {\n // Provider response details remain intentionally unavailable to diagnostics.\n }\n if (status !== undefined) {\n if (status >= 200 && status < 300) status2xx++;\n else if (status >= 300 && status < 400) status3xx++;\n else if (status >= 400 && status < 500) status4xx++;\n else if (status >= 500 && status < 600) status5xx++;\n }\n lastChange = performance.now();\n };\n\n const onFailed = (request: HTTPRequest) => {\n if (!pending.delete(request)) return;\n failed++;\n lastChange = performance.now();\n };\n\n const close = () => {\n if (closed) return;\n closed = true;\n page.off(\"request\", onRequest);\n page.off(\"requestfinished\", onFinished);\n page.off(\"requestfailed\", onFailed);\n signal.removeEventListener(\"abort\", close);\n clearTimeout(timer);\n wake?.();\n };\n\n try {\n page.on(\"request\", onRequest);\n page.on(\"requestfinished\", onFinished);\n page.on(\"requestfailed\", onFailed);\n signal.addEventListener(\"abort\", close, { once: true });\n if (signal.aborted) close();\n } catch (cause) {\n close();\n throw cause;\n }\n\n const wait = async () => {\n const startedAt = performance.now();\n let settleTimedOut = false;\n\n while (!closed) {\n const now = performance.now();\n\n if (pending.size === 0 && now - lastChange >= ACTION_NETWORK_QUIET_MILLIS) break;\n if (now - startedAt >= ACTION_NETWORK_SETTLE_MILLIS) {\n settleTimedOut = true;\n break;\n }\n await new Promise<void>((resolve) => {\n wake = resolve;\n timer = setTimeout(() => resolve(), 50);\n });\n wake = undefined;\n }\n\n return {\n total,\n status2xx,\n status3xx,\n status4xx,\n status5xx,\n failed,\n pending: pending.size,\n settleTimedOut,\n };\n };\n\n return {\n wait,\n close,\n markActionSettled: () => {\n lastChange = performance.now();\n },\n };\n};\n\nconst disposeActionHandles = async (handles: ReadonlyArray<{ dispose: () => Promise<void> }>) => {\n await boundedBestEffort(\n Promise.allSettled(handles.map(async (handle) => handle.dispose())),\n ACTION_POST_STATE_MILLIS,\n );\n};\n\nconst runObservedPageAction = async (\n page: Page,\n selector: string,\n signal: AbortSignal,\n onDispatch: () => void,\n action: (element: NonNullable<Awaited<ReturnType<Page[\"$\"]>>>) => Promise<void>,\n): Promise<unknown> => {\n if (signal.aborted) throw new BrowserRunActionUndispatched(0);\n\n const before = Schema.decodeUnknownSync(ActionTargetState)(\n await readActionTarget(page, selector),\n );\n\n if (before.matchCount !== 1 || before.invalidSelector === true) {\n throw new BrowserRunActionUndispatched(before.matchCount);\n }\n const matches = await page.$$(selector);\n\n if (matches.length !== 1 || matches[0] === undefined) {\n await disposeActionHandles(matches);\n throw new BrowserRunActionUndispatched(Math.min(10_000, matches.length));\n }\n if (signal.aborted) {\n await disposeActionHandles(matches);\n throw new BrowserRunActionUndispatched(1);\n }\n\n let tracker: ReturnType<typeof makeActionRequestTracker> | undefined;\n let disposing: Promise<void> | undefined;\n const dispose = () => (disposing ??= disposeActionHandles(matches));\n\n const onAbort = () => {\n void dispose();\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n tracker = makeActionRequestTracker(page, signal);\n // No await between the final cancellation fence and SDK dispatch. Once\n // dispatched, interruption is uncertain, even if the SDK later resolves.\n if (signal.aborted) throw new BrowserRunActionUndispatched(1);\n onDispatch();\n await action(matches[0]);\n tracker.markActionSettled();\n const network = await tracker.wait();\n const after = signal.aborted ? undefined : await readActionTargetAfter(page, selector);\n\n return {\n before,\n ...(after === undefined ? {} : { after }),\n afterUnavailable: after === undefined,\n network,\n };\n } finally {\n tracker?.close();\n signal.removeEventListener(\"abort\", onAbort);\n await dispose();\n }\n};\n\nconst makeProductionPage = (page: Page): BrowserRunInteractivePage => {\n const listeners = new Map<BrowserRunInteractiveRequestListener, (request: HTTPRequest) => void>();\n\n return {\n close: () => page.close(),\n setBypassServiceWorker: (enabled) => page.setBypassServiceWorker(enabled),\n setRequestInterception: (enabled) => page.setRequestInterception(enabled),\n onRequest: (listener) => {\n const sdkListener = (request: HTTPRequest) => listener(makeProductionRequest(request));\n\n listeners.set(listener, sdkListener);\n page.on(\"request\", sdkListener);\n },\n offRequest: (listener) => {\n const sdkListener = listeners.get(listener);\n\n if (sdkListener !== undefined) {\n page.off(\"request\", sdkListener);\n listeners.delete(listener);\n }\n },\n goto: async (url) => {\n await page.goto(url, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n },\n url: () => page.url(),\n readText: async (selector, maximumBytes) => {\n const observation = Schema.decodeUnknownSync(TextObservation)(\n await page.evaluate(\n (requestedSelector, maximum, maximumControls) => {\n const pageDocument = Reflect.get(globalThis, \"document\");\n\n const matches =\n requestedSelector === undefined\n ? undefined\n : Reflect.apply(Reflect.get(pageDocument, \"querySelectorAll\"), pageDocument, [\n requestedSelector,\n ]);\n\n const selectorMatchCount =\n matches === undefined || matches === null\n ? 1\n : Math.min(10_000, Reflect.get(matches, \"length\"));\n\n const element =\n matches === undefined || matches === null\n ? Reflect.get(pageDocument, \"body\")\n : Reflect.get(matches, 0);\n\n if (element === null) return { _tag: \"MissingElement\" };\n if (element === undefined) return { _tag: \"MissingElement\" };\n const innerText = Reflect.get(element, \"innerText\");\n const textContent = Reflect.get(element, \"textContent\");\n\n const pageText =\n typeof innerText === \"string\"\n ? innerText\n : typeof textContent === \"string\"\n ? textContent\n : \"\";\n\n const primaryControlSelector =\n 'input,select,textarea,label,button,[role=\"checkbox\"],[role=\"radio\"],[role=\"option\"],[role=\"switch\"],[role=\"tab\"],[role=\"button\"]';\n\n const optionSelector = \"select option\";\n const secondaryControlSelector = \"a[href]\";\n const controlSelector = `${primaryControlSelector},${optionSelector},${secondaryControlSelector}`;\n\n const selectorFor = (candidate: object) => {\n const parts: Array<string> = [];\n let current: object | null = candidate;\n\n while (current !== null && current !== undefined) {\n const tagName = String(Reflect.get(current, \"tagName\") ?? \"\").toLowerCase();\n\n if (tagName === \"\") break;\n const parent: object | null = Reflect.get(current, \"parentElement\");\n\n if (parent === null) {\n parts.push(tagName);\n break;\n }\n let sibling = Reflect.get(current, \"previousElementSibling\");\n let index = 1;\n\n while (sibling !== null && sibling !== undefined) {\n if (String(Reflect.get(sibling, \"tagName\") ?? \"\").toLowerCase() === tagName)\n index++;\n sibling = Reflect.get(sibling, \"previousElementSibling\");\n }\n parts.push(`${tagName}:nth-of-type(${index})`);\n current = parent;\n }\n\n return parts.reverse().join(\" > \");\n };\n\n const visible = (candidate: object) => {\n const hidden = Reflect.get(candidate, \"hidden\");\n\n const ariaHidden = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-hidden\",\n ]);\n\n const rects = Reflect.apply(Reflect.get(candidate, \"getClientRects\"), candidate, []);\n\n return (\n hidden !== true &&\n ariaHidden !== \"true\" &&\n typeof rects === \"object\" &&\n rects !== null &&\n Reflect.get(rects, \"length\") > 0\n );\n };\n\n const candidates: Array<object> = [];\n let controlsTruncated = false;\n\n const consider = (candidate: object) => {\n const tagName = String(Reflect.get(candidate, \"tagName\") ?? \"\").toLowerCase();\n\n // Collapsed native options have no client rects. Their owning\n // select determines visibility; observe text/selection, never value.\n const visibilityTarget =\n tagName === \"option\"\n ? Reflect.apply(Reflect.get(candidate, \"closest\"), candidate, [\"select\"])\n : candidate;\n\n const actionable = tagName !== \"label\" || Reflect.get(candidate, \"control\") !== null;\n\n if (\n !actionable ||\n typeof visibilityTarget !== \"object\" ||\n visibilityTarget === null ||\n !visible(visibilityTarget)\n )\n return;\n candidates.push(candidate);\n if (candidates.length > maximumControls) controlsTruncated = true;\n };\n\n const elementMatches = Reflect.get(element, \"matches\");\n\n if (\n typeof elementMatches === \"function\" &&\n Reflect.apply(elementMatches, element, [controlSelector])\n ) {\n consider(element);\n }\n\n const considerSelector = (candidateSelector: string) => {\n const descendants = Reflect.apply(Reflect.get(element, \"querySelectorAll\"), element, [\n candidateSelector,\n ]);\n\n if (typeof descendants !== \"object\" || descendants === null) return;\n const descendantCount = Reflect.get(descendants, \"length\");\n\n for (let index = 0; index < descendantCount && !controlsTruncated; index++) {\n consider(Reflect.get(descendants, index));\n }\n };\n\n considerSelector(primaryControlSelector);\n if (!controlsTruncated) considerSelector(optionSelector);\n if (!controlsTruncated) considerSelector(secondaryControlSelector);\n\n const controls = candidates.slice(0, maximumControls).map((candidate) => {\n const associated = Reflect.get(candidate, \"control\") ?? candidate;\n const tagName = String(Reflect.get(candidate, \"tagName\") ?? \"\").toLowerCase();\n const inputType = String(Reflect.get(associated, \"type\") ?? \"\").toLowerCase();\n\n const role = String(\n Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\"role\"]) ?? \"\",\n ).toLowerCase();\n\n const ariaLabel = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-label\",\n ]);\n\n const candidateText =\n tagName === \"textarea\" || tagName === \"input\" || tagName === \"select\"\n ? undefined\n : Reflect.get(candidate, tagName === \"option\" ? \"label\" : \"innerText\");\n\n const associatedLabels = Reflect.get(associated, \"labels\");\n\n const associatedLabel =\n associatedLabels !== undefined &&\n associatedLabels !== null &&\n Reflect.get(associatedLabels, \"length\") > 0\n ? Reflect.get(Reflect.get(associatedLabels, 0), \"innerText\")\n : undefined;\n\n const label = String(\n typeof ariaLabel === \"string\" && ariaLabel !== \"\"\n ? ariaLabel\n : typeof candidateText === \"string\" && candidateText !== \"\"\n ? candidateText\n : (associatedLabel ?? \"\"),\n )\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200);\n\n const checked = Reflect.get(associated, \"checked\");\n\n const selected =\n tagName === \"select\"\n ? Reflect.get(associated, \"selectedIndex\") >= 0\n : Reflect.get(associated, \"selected\");\n\n const disabled = Reflect.get(associated, \"disabled\");\n const required = Reflect.get(associated, \"required\");\n const validity = Reflect.get(associated, \"validity\");\n const form = Reflect.get(associated, \"form\");\n\n const formMatches =\n form === null || form === undefined ? undefined : Reflect.get(form, \"matches\");\n\n const ariaChecked = Reflect.apply(Reflect.get(candidate, \"getAttribute\"), candidate, [\n \"aria-checked\",\n ]);\n\n const ariaSelected = Reflect.apply(\n Reflect.get(candidate, \"getAttribute\"),\n candidate,\n [\"aria-selected\"],\n );\n\n const ariaDisabled = Reflect.apply(\n Reflect.get(candidate, \"getAttribute\"),\n candidate,\n [\"aria-disabled\"],\n );\n\n return {\n selector: selectorFor(candidate),\n kind:\n tagName === \"label\"\n ? `label:${inputType || \"control\"}`\n : tagName === \"input\"\n ? `input:${inputType || \"text\"}`\n : role !== \"\"\n ? `role:${role}`\n : tagName,\n ...(label === \"\" ? {} : { label }),\n ...(typeof checked === \"boolean\"\n ? { checked }\n : ariaChecked === \"true\" || ariaChecked === \"false\"\n ? { checked: ariaChecked === \"true\" }\n : {}),\n ...(typeof selected === \"boolean\"\n ? { selected }\n : ariaSelected === \"true\" || ariaSelected === \"false\"\n ? { selected: ariaSelected === \"true\" }\n : {}),\n ...(typeof disabled === \"boolean\"\n ? { disabled }\n : ariaDisabled === \"true\" || ariaDisabled === \"false\"\n ? { disabled: ariaDisabled === \"true\" }\n : {}),\n ...(typeof required === \"boolean\" ? { required } : {}),\n ...(validity !== undefined && typeof Reflect.get(validity, \"valid\") === \"boolean\"\n ? { valid: Reflect.get(validity, \"valid\") }\n : {}),\n ...(typeof formMatches === \"function\"\n ? { formValid: Reflect.apply(formMatches, form, [\":valid\"]) }\n : {}),\n };\n });\n\n // JSON is the bounded wire representation of this existing text result.\n // eslint-disable-next-line no-restricted-properties\n const text = JSON.stringify({\n pageText,\n selectorMatchCount,\n controls,\n controlsTruncated,\n });\n\n const observed = new TextEncoder().encode(text).byteLength;\n\n return observed > maximum ? { _tag: \"OverLimit\", observed } : { _tag: \"Text\", text };\n },\n selector,\n maximumBytes,\n MAX_OBSERVED_CONTROLS,\n ),\n );\n\n if (observation._tag === \"Text\") Schema.decodeUnknownSync(PageObservation)(observation.text);\n\n return observation;\n },\n fill: (selector, value, signal, onDispatch) =>\n runObservedPageAction(page, selector, signal, onDispatch, (element) =>\n element.evaluate((element, nextValue) => {\n // Bypass instance setters so React can detect the change when events fire.\n let prototype = Reflect.getPrototypeOf(element);\n let setValue: ((value: string) => void) | undefined;\n\n while (prototype !== null) {\n const setter = Reflect.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n\n if (typeof setter === \"function\") {\n setValue = setter;\n break;\n }\n prototype = Reflect.getPrototypeOf(prototype);\n }\n if (setValue === undefined) {\n throw new Error(\"The selector did not resolve to a fillable field\");\n }\n const focus = Reflect.get(element, \"focus\");\n\n if (typeof focus === \"function\") Reflect.apply(focus, element, []);\n Reflect.apply(setValue, element, [nextValue]);\n const dispatchEvent = Reflect.get(element, \"dispatchEvent\");\n\n if (typeof dispatchEvent === \"function\") {\n Reflect.apply(dispatchEvent, element, [new Event(\"input\", { bubbles: true })]);\n Reflect.apply(dispatchEvent, element, [new Event(\"change\", { bubbles: true })]);\n }\n }, value),\n ),\n click: (selector, signal, onDispatch) =>\n runObservedPageAction(page, selector, signal, onDispatch, (element) => element.click()),\n // Puppeteer materializes the complete image before returning. The adapter\n // validates the 8 MiB Schema ceiling and pass limit immediately afterward.\n screenshot: (fullPage) => page.screenshot({ type: \"png\", fullPage }),\n scroll: (deltaX, deltaY) =>\n page.evaluate(\n (x, y) => {\n const scrollBy = Reflect.get(globalThis, \"scrollBy\");\n\n Reflect.apply(scrollBy, globalThis, [{ left: x, top: y, behavior: \"instant\" }]);\n },\n deltaX,\n deltaY,\n ),\n createCdpSession: async () => makeProductionCdpSession(await page.createCDPSession()),\n setViewport: (viewport) => page.setViewport(viewport),\n };\n};\n\nconst makeProductionContext = (context: BrowserContext): BrowserRunInteractiveContext => ({\n newPage: async () => makeProductionPage(await context.newPage()),\n close: () => context.close(),\n});\n\nconst makeProductionBrowser = (browser: Browser): BrowserRunInteractiveBrowser => ({\n createContext: async () => makeProductionContext(await browser.createBrowserContext()),\n close: () => browser.close(),\n sessionId: () => browser.sessionId(),\n isConnected: () => browser.isConnected(),\n onDisconnected: (listener) => {\n browser.on(\"disconnected\", listener);\n },\n offDisconnected: (listener) => {\n browser.off(\"disconnected\", listener);\n },\n});\n\nconst protocolError = (message: string, cause?: unknown): InteractiveBrowserProtocolError =>\n InteractiveBrowserProtocolError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst actionError = (operation: BrowserOperation, cause?: unknown): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation failed`,\n ...(cause === undefined ? {} : { cause }),\n });\n\nconst undispatchedActionError = (operation: BrowserOperation): InteractiveBrowserActionError =>\n InteractiveBrowserActionError.make({\n implementation: browserRunInteractiveImplementation,\n operation,\n message: `The interactive browser ${operation} operation was not dispatched`,\n });\n\n/** Recognizes a local pre-dispatch refusal without exposing selector or page content. */\nexport const isBrowserRunUndispatchedActionError = (error: unknown): boolean =>\n Schema.is(InteractiveBrowserActionError)(error) &&\n error.implementation.identity === browserRunInteractiveImplementation.identity &&\n (error.operation === \"click\" || error.operation === \"fill\") &&\n error.message === `The interactive browser ${error.operation} operation was not dispatched`;\n\nconst policyError = (message: string): InteractiveBrowserPolicyDeniedError =>\n InteractiveBrowserPolicyDeniedError.make({\n implementation: browserRunInteractiveImplementation,\n message,\n });\n\nconst expiredError = (): InteractiveBrowserExpiredError =>\n InteractiveBrowserExpiredError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The remote browser is no longer usable\",\n });\n\nconst causeText = (cause: unknown): string => {\n if (cause instanceof Error) return cause.message.slice(0, 8_000);\n\n return String(cause).slice(0, 8_000);\n};\n\nconst isCapacityRefusal = (cause: unknown): boolean =>\n /(^|\\D)429(\\D|$)|browser time limit|capacity|too many concurrent/i.test(causeText(cause));\n\nconst isRemoteClosure = (cause: unknown): boolean =>\n /target closed|browser.*closed|session.*closed|connection.*closed|not connected|websocket.*closed/i.test(\n causeText(cause),\n );\n\nconst snapshotPolicy = Effect.fn(\"BrowserRunInteractive.snapshotPolicy\")(function* (\n input: InteractiveBrowserPolicy,\n): Effect.fn.Return<\n InteractiveBrowserPolicySnapshot,\n InteractiveBrowserPolicyDeniedError | InteractiveBrowserUnsupportedError\n> {\n const decoded = yield* Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(\n Effect.mapError(() => policyError(\"The interactive browser policy is malformed\")),\n );\n\n if (decoded.network._tag === \"PublicWeb\") {\n return yield* InteractiveBrowserUnsupportedError.make({\n implementation: browserRunInteractiveImplementation,\n feature: \"policy\",\n message:\n \"Cloudflare Browser Run cannot enforce the PublicWeb network policy for all session traffic\",\n });\n }\n\n return Object.freeze({\n network:\n decoded.network._tag === \"ExactHosts\"\n ? Object.freeze({\n _tag: decoded.network._tag,\n allowedHosts: Object.freeze([...decoded.network.allowedHosts]),\n })\n : Object.freeze({ _tag: decoded.network._tag }),\n maxActions: decoded.maxActions,\n maxElapsedMillis: decoded.maxElapsedMillis,\n maxReturnedBytes: decoded.maxReturnedBytes,\n });\n});\n\nconst hostAllowed = (policy: InteractiveBrowserPolicySnapshot, value: string): boolean => {\n if (policy.network._tag === \"Unrestricted\") return true;\n try {\n const url = new URL(value);\n\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n policy.network.allowedHosts.some((host) => host === url.host)\n );\n } catch {\n return false;\n }\n};\n\nconst keepAliveMillis = (policy: InteractiveBrowserPolicySnapshot): number =>\n Math.max(MIN_KEEP_ALIVE_MILLIS, Math.min(MAX_KEEP_ALIVE_MILLIS, policy.maxElapsedMillis));\n\nconst closeLateAcquisition = async <A>(\n signal: AbortSignal,\n acquire: () => Promise<A>,\n close: (acquired: A) => Promise<void>,\n): Promise<A> => {\n const acquired = await acquire();\n\n if (!signal.aborted) return acquired;\n\n // The SDK does not accept AbortSignal. If an acquisition settles after Effect\n // has interrupted it, ownership never reaches Scope, so close it here instead.\n try {\n await close(acquired);\n } catch {\n // No caller remains to observe a late cleanup failure, and provider details\n // must not escape through an unhandled rejection.\n }\n throw new Error(\"The interrupted browser acquisition completed late\");\n};\n\nconst closeWithWarning = (close: () => Promise<void>, warning: string): Effect.Effect<void> =>\n Effect.tryPromise({\n try: close,\n catch: () => protocolError(warning),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(protocolError(warning)),\n }),\n Effect.catchCause(() => Effect.logWarning(warning)),\n );\n\nconst deadlineError = Effect.fn(\"BrowserRunInteractive.deadlineError\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"elapsed\",\n maximum: policy.maxElapsedMillis,\n observed: Math.max(policy.maxElapsedMillis, now - startedAt),\n message: \"The browser elapsed-time limit was reached\",\n });\n});\n\nconst withinDeadline = Effect.fn(\"BrowserRunInteractive.withinDeadline\")(function* <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n onTimeout?: () => void,\n): Effect.fn.Return<A, E | InteractiveBrowserLimitError, R> {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n const elapsed = Math.max(0, now - startedAt);\n const remaining = policy.maxElapsedMillis - elapsed;\n\n if (remaining <= 0) return yield* deadlineError(policy, startedAt);\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remaining),\n orElse: () =>\n Effect.sync(() => onTimeout?.()).pipe(Effect.andThen(deadlineError(policy, startedAt))),\n }),\n );\n});\n\ninterface HandleState {\n readonly closed: { value: boolean };\n readonly disconnected: { value: boolean };\n readonly uncertain: { value: boolean };\n readonly violation: { value: BrowserFailure | undefined };\n readonly pendingRequests: Set<Promise<void>>;\n}\n\nconst stateFailure = (state: HandleState): BrowserFailure | undefined => {\n if (state.violation.value !== undefined) return state.violation.value;\n if (state.closed.value || state.disconnected.value || state.uncertain.value) {\n return expiredError();\n }\n\n return undefined;\n};\n\ninterface CloseFailure {\n readonly error: InteractiveBrowserActionError;\n readonly warning: string;\n}\n\ninterface CloseEntry {\n readonly close: Effect.Effect<void, InteractiveBrowserActionError>;\n readonly warning: string;\n}\n\ninterface HandleRuntime {\n readonly handle: BrowserHandle;\n readonly run: <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight?: Effect.Effect<void, BrowserFailure>,\n consumeAction?: boolean,\n ) => Effect.Effect<A, BrowserFailure>;\n}\n\nclass BrowserRunRemoteFailure {\n readonly cause: unknown;\n\n constructor(cause: unknown) {\n this.cause = cause;\n }\n}\n\nconst awaitPendingRequests = (state: HandleState): Effect.Effect<void> =>\n Effect.suspend(() => {\n const pending = [...state.pendingRequests];\n\n return pending.length === 0\n ? Effect.void\n : Effect.promise(() => Promise.all(pending)).pipe(\n Effect.asVoid,\n Effect.andThen(awaitPendingRequests(state)),\n );\n });\n\nconst decodeNavigationResult = Effect.fn(\"BrowserRunInteractive.decodeNavigationResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser navigation URL failed\", cause),\n });\n\n const result = yield* Schema.decodeUnknownEffect(BrowserNavigationResult)({\n url,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed navigation URL\", cause),\n ),\n );\n\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n\n return result;\n});\n\nconst decodeActionResult = Effect.fn(\"BrowserRunInteractive.decodeActionResult\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n) {\n const url = yield* Effect.try({\n try: page.url,\n catch: (cause) => protocolError(\"Reading the browser page URL failed\", cause),\n });\n\n const result = yield* Schema.decodeUnknownEffect(BrowserActionResult)({ url }).pipe(\n Effect.mapError((cause) => protocolError(\"The browser returned a malformed page URL\", cause)),\n );\n\n if (!hostAllowed(policy, result.url)) {\n return yield* policyError(\"The browser returned an off-policy page URL\");\n }\n\n return result;\n});\n\nconst makeRequestListener =\n (\n policy: InteractiveBrowserPolicySnapshot,\n state: HandleState,\n ): BrowserRunInteractiveRequestListener =>\n (request) => {\n let allowed = false;\n\n try {\n allowed = hostAllowed(policy, request.url());\n } catch {\n allowed = false;\n }\n if (!allowed) {\n state.violation.value = policyError(\"The browser requested an off-policy URL\");\n }\n\n let settlement: Promise<void>;\n\n try {\n settlement = allowed ? request.continue() : request.abort();\n } catch {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n\n return;\n }\n\n const observed = settlement\n .catch(() => {\n state.violation.value = protocolError(\"Resolving an intercepted browser request failed\");\n })\n .finally(() => {\n state.pendingRequests.delete(observed);\n });\n\n state.pendingRequests.add(observed);\n };\n\nconst makeHandle = Effect.fn(\"BrowserRunInteractive.makeHandle\")(function* (\n page: BrowserRunInteractivePage,\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n state: HandleState,\n close: Effect.Effect<void, InteractiveBrowserError>,\n): Effect.fn.Return<HandleRuntime> {\n const permits = yield* Semaphore.make(1);\n const actions = yield* Ref.make(0);\n\n const remote = <A>(operation: BrowserOperation, evaluate: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: evaluate,\n catch: (cause) => new BrowserRunRemoteFailure(cause),\n }).pipe(\n Effect.catch(\n (\n failure,\n ): Effect.Effect<never, InteractiveBrowserActionError | InteractiveBrowserExpiredError> => {\n const cause = failure.cause;\n\n if (cause instanceof BrowserRunActionUndispatched) {\n return Effect.logInfo(\"Browser interactive action was not dispatched\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.selector_match_count\": cause.matchCount,\n }),\n Effect.andThen(Effect.fail(undispatchedActionError(operation))),\n );\n }\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n\n return Effect.fail(expiredError());\n }\n\n return Effect.fail(actionError(operation, cause));\n },\n ),\n );\n\n const observedAction = (\n operation: \"fill\" | \"click\",\n evaluate: (signal: AbortSignal, onDispatch: () => void) => Promise<unknown>,\n ) =>\n Effect.suspend(() => {\n let dispatched = false;\n let pending: Promise<unknown> | undefined;\n\n return remote(operation, (signal) => {\n pending = evaluate(signal, () => {\n dispatched = true;\n });\n\n return pending;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.gen(function* () {\n state.uncertain.value = true;\n // Retain evidence before Scope teardown, without claiming SDK\n // cancellation or success. A late completion never makes this replayable.\n yield* Effect.logWarning(\"Browser interactive action interrupted\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.action_dispatched\": dispatched,\n \"browser.action_outcome_unknown\": dispatched,\n }),\n );\n const completion = pending;\n\n if (completion !== undefined) {\n yield* Effect.promise(() => boundedBestEffort(completion, 500));\n }\n }),\n ),\n );\n });\n\n const decodeActionObservation = Effect.fn(\"BrowserRunInteractive.decodeActionObservation\")(\n function* (raw: unknown) {\n return yield* Schema.decodeUnknownEffect(ActionObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed action observation\", cause),\n ),\n );\n },\n );\n\n const logActionObservation = (\n operation: \"fill\" | \"click\",\n observation: typeof ActionObservation.Type,\n ) =>\n Effect.logInfo(\"Browser interactive action observed\").pipe(\n Effect.annotateLogs({\n \"browser.action\": operation,\n \"browser.selector_match_count\": observation.before.matchCount,\n ...(observation.before.kind === undefined\n ? {}\n : { \"browser.target_kind\": observation.before.kind }),\n ...(observation.before.checked === undefined\n ? {}\n : { \"browser.target_checked_before\": observation.before.checked }),\n ...(observation.after?.checked === undefined\n ? {}\n : { \"browser.target_checked_after\": observation.after.checked }),\n ...(observation.before.selected === undefined\n ? {}\n : { \"browser.target_selected_before\": observation.before.selected }),\n ...(observation.after?.selected === undefined\n ? {}\n : { \"browser.target_selected_after\": observation.after.selected }),\n ...(observation.before.disabled === undefined\n ? {}\n : { \"browser.target_disabled_before\": observation.before.disabled }),\n ...(observation.after?.disabled === undefined\n ? {}\n : { \"browser.target_disabled_after\": observation.after.disabled }),\n ...(observation.before.required === undefined\n ? {}\n : { \"browser.target_required_before\": observation.before.required }),\n ...(observation.after?.required === undefined\n ? {}\n : { \"browser.target_required_after\": observation.after.required }),\n ...(observation.before.valid === undefined\n ? {}\n : { \"browser.target_valid_before\": observation.before.valid }),\n ...(observation.after?.valid === undefined\n ? {}\n : { \"browser.target_valid_after\": observation.after.valid }),\n ...(observation.before.formValid === undefined\n ? {}\n : { \"browser.form_valid_before\": observation.before.formValid }),\n ...(observation.after?.formValid === undefined\n ? {}\n : { \"browser.form_valid_after\": observation.after.formValid }),\n \"browser.target_after_unavailable\": observation.afterUnavailable,\n \"browser.fetch_xhr_total\": observation.network.total,\n \"browser.fetch_xhr_2xx\": observation.network.status2xx,\n \"browser.fetch_xhr_3xx\": observation.network.status3xx,\n \"browser.fetch_xhr_4xx\": observation.network.status4xx,\n \"browser.fetch_xhr_5xx\": observation.network.status5xx,\n \"browser.fetch_xhr_failed\": observation.network.failed,\n \"browser.fetch_xhr_pending\": observation.network.pending,\n \"browser.network_settle_timed_out\": observation.network.settleTimedOut,\n }),\n );\n\n const run = <A>(\n effect: Effect.Effect<A, BrowserFailure>,\n preflight: Effect.Effect<void, BrowserFailure> = Effect.void,\n consumeAction = true,\n ) =>\n permits\n .withPermitsIfAvailable(1)(\n Effect.gen(function* () {\n const unavailable = stateFailure(state);\n\n if (unavailable !== undefined) return yield* unavailable;\n yield* preflight;\n\n if (consumeAction) {\n const admitted = yield* Ref.modify(actions, (count) =>\n count >= policy.maxActions\n ? [{ allowed: false, observed: count + 1 }, count]\n : [{ allowed: true, observed: count + 1 }, count + 1],\n );\n\n if (!admitted.allowed) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"actions\",\n maximum: policy.maxActions,\n observed: admitted.observed,\n message: \"The browser action limit was reached\",\n });\n }\n }\n\n const completed = effect.pipe(\n Effect.catch((error) => {\n const failure = stateFailure(state);\n\n return Effect.fail(failure ?? error);\n }),\n Effect.flatMap((result) =>\n awaitPendingRequests(state).pipe(\n Effect.flatMap(() => {\n const failure = stateFailure(state);\n\n return failure === undefined ? Effect.succeed(result) : Effect.fail(failure);\n }),\n ),\n ),\n );\n\n return yield* withinDeadline(completed, policy, startedAt, () => {\n state.uncertain.value = true;\n }).pipe(\n Effect.onInterrupt(() =>\n Effect.sync(() => {\n state.uncertain.value = true;\n }),\n ),\n Effect.catch((error) => {\n if (Schema.is(InteractiveBrowserLimitError)(error) && error.limit === \"elapsed\") {\n return Effect.fail(error);\n }\n const failure = stateFailure(state);\n\n if (\n Schema.is(InteractiveBrowserActionError)(error) &&\n !isBrowserRunUndispatchedActionError(error)\n ) {\n state.uncertain.value = true;\n }\n\n return Effect.fail(failure ?? error);\n }),\n );\n }),\n )\n .pipe(\n Effect.flatMap((result) =>\n Option.isSome(result)\n ? Effect.succeed(result.value)\n : Effect.fail(\n InteractiveBrowserBusyError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"The browser handle already has an operation in flight\",\n }),\n ),\n ),\n );\n\n const handle: BrowserHandle = {\n navigate: (request) =>\n run(\n Effect.gen(function* () {\n yield* remote(\"navigate\", () => page.goto(request.url));\n\n return yield* decodeNavigationResult(page, policy);\n }),\n Effect.suspend(() =>\n Schema.is(InteractiveBrowserTargetUrl)(request.url) && hostAllowed(policy, request.url)\n ? Effect.void\n : Effect.fail(policyError(\"The navigation URL is outside the browser policy\")),\n ),\n ),\n readText: (request) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"read-text\", () =>\n page.readText(request.selector, policy.maxReturnedBytes),\n );\n\n const observation = yield* Schema.decodeUnknownEffect(TextObservation)(raw).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned a malformed text observation\", cause),\n ),\n );\n\n if (observation._tag === \"MissingElement\") {\n return yield* actionError(\"read-text\");\n }\n if (observation._tag === \"OverLimit\") {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: observation.observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n const observed = new TextEncoder().encode(observation.text).byteLength;\n\n if (observed > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed,\n message: \"The browser returned-text limit was reached\",\n });\n }\n\n return yield* Schema.decodeUnknownEffect(BrowserTextResult)({\n text: observation.text,\n }).pipe(\n Effect.mapError((cause) =>\n protocolError(\"The browser returned malformed page text\", cause),\n ),\n );\n }),\n ),\n fill: (request) =>\n run(\n Effect.gen(function* () {\n const observation = yield* observedAction(\"fill\", (signal, onDispatch) =>\n page.fill(request.selector, request.value, signal, onDispatch),\n ).pipe(Effect.flatMap(decodeActionObservation));\n\n yield* logActionObservation(\"fill\", observation);\n\n return yield* decodeActionResult(page, policy);\n }),\n ),\n click: (request) =>\n run(\n Effect.gen(function* () {\n const observation = yield* observedAction(\"click\", (signal, onDispatch) =>\n page.click(request.selector, signal, onDispatch),\n ).pipe(Effect.flatMap(decodeActionObservation));\n\n yield* logActionObservation(\"click\", observation);\n\n return yield* decodeActionResult(page, policy);\n }),\n ),\n screenshot: (request) =>\n Schema.decodeUnknownEffect(BrowserScreenshotRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser screenshot request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n Effect.gen(function* () {\n const raw = yield* remote(\"screenshot\", () => page.screenshot(decoded.fullPage));\n\n const bytes = yield* Schema.decodeUnknownEffect(PngBytes)(raw).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n\n if (bytes.length > policy.maxReturnedBytes) {\n return yield* InteractiveBrowserLimitError.make({\n implementation: browserRunInteractiveImplementation,\n limit: \"returned-bytes\",\n maximum: policy.maxReturnedBytes,\n observed: bytes.length,\n message: \"The browser screenshot byte limit was reached\",\n });\n }\n\n return yield* Schema.decodeUnknownEffect(PageScreenshotResult)({\n implementation: browserRunInteractiveImplementation,\n mediaType: \"image/png\",\n bytes: new Uint8Array(bytes),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"The browser returned a malformed PNG screenshot\"),\n ),\n );\n }),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n scroll: (request) =>\n Schema.decodeUnknownEffect(BrowserScrollRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser scroll request is malformed\")),\n Effect.flatMap((decoded) =>\n run(\n remote(\"scroll\", () => page.scroll(decoded.deltaX, decoded.deltaY)).pipe(\n Effect.andThen(decodeActionResult(page, policy)),\n ),\n decodeActionResult(page, policy).pipe(Effect.asVoid),\n ),\n ),\n ),\n close,\n };\n\n return { handle, run };\n});\n\nconst remainingMillis = Effect.fn(\"BrowserRunInteractive.remainingMillis\")(function* (\n policy: InteractiveBrowserPolicySnapshot,\n startedAt: number,\n) {\n const now = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n\n return Math.max(0, policy.maxElapsedMillis - Math.max(0, now - startedAt));\n});\n\nconst closeEntry = (close: () => Promise<void>, warning: string): CloseEntry => ({\n close: Effect.tryPromise({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(CLEANUP_STEP_TIMEOUT_MILLIS),\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n ),\n warning,\n});\n\nconst syncCloseEntry = (close: () => void, warning: string): CloseEntry => ({\n close: Effect.try({\n try: close,\n catch: (cause) => actionError(\"close\", cause),\n }),\n warning,\n});\n\nconst runTeardown = (\n entries: ReadonlyArray<CloseEntry>,\n): Effect.Effect<ReadonlyArray<CloseFailure>> =>\n Effect.forEach([...entries].reverse(), (entry) =>\n entry.close.pipe(\n Effect.match({\n onFailure: (error): CloseFailure | undefined => ({ error, warning: entry.warning }),\n onSuccess: (): CloseFailure | undefined => undefined,\n }),\n ),\n ).pipe(Effect.map((failures) => failures.filter((failure) => failure !== undefined)));\n\nconst cdpCommand = <A>(\n page: BrowserRunInteractivePage,\n state: HandleState,\n command: BrowserRunCloudflareCommand,\n parameters: unknown,\n output: Schema.Codec<A>,\n malformedMessage: string,\n): Effect.Effect<A, InteractiveBrowserError> =>\n Effect.scoped(\n Effect.gen(function* () {\n const cdp = yield* Effect.acquireRelease(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, page.createCdpSession, (acquired) => acquired.detach()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the Cloudflare browser control session failed\", cause),\n }),\n (acquired) =>\n closeWithWarning(\n acquired.detach,\n \"Detaching the Cloudflare browser control session failed\",\n ),\n { interruptible: true },\n );\n\n const raw = yield* Effect.tryPromise({\n try: () => cdp.send(command, parameters),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"The Cloudflare browser control command failed\", cause),\n });\n\n return yield* Schema.decodeUnknownEffect(output)(raw).pipe(\n Effect.mapError(() => protocolError(malformedMessage)),\n );\n }),\n );\n\nconst makeHostService = (\n binding: BrowserRunInteractiveBinding[\"Service\"],\n): BrowserRunInteractiveHost[\"Service\"] => {\n const closeSession = binding.closeSession;\n\n const terminate = Effect.fn(\"BrowserRunInteractiveHost.terminate\")(function* (\n sessionId: Redacted.Redacted<string>,\n entries: ReadonlyArray<CloseEntry>,\n ) {\n const deadline = (yield* Clock.currentTimeMillis) + 10_000;\n\n yield* closeSession(sessionId).pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({\n duration: \"10 seconds\",\n orElse: () => Effect.fail(actionError(\"close\")),\n }),\n );\n const remaining = deadline - (yield* Clock.currentTimeMillis);\n\n if (remaining <= 0)\n return yield* Effect.logWarning(\n \"Local browser teardown skipped after confirmed termination deadline\",\n );\n // Remote termination is authoritative. Local cleanup must not veto it or extend the deadline.\n yield* runTeardown(entries).pipe(\n Effect.flatMap((failures) =>\n Effect.forEach(failures, (failure) => Effect.logWarning(failure.warning), {\n discard: true,\n }),\n ),\n Effect.interruptible,\n Effect.timeout(`${remaining} millis`),\n Effect.catchCause(() =>\n Effect.logWarning(\"Local browser teardown incomplete after confirmed termination\"),\n ),\n );\n });\n\n const closeAcquired = Effect.fn(\"BrowserRunInteractiveHost.closeAcquired\")(function* (\n browser: BrowserRunInteractiveBrowser,\n ) {\n const sessionId = yield* Effect.try({\n try: browser.sessionId,\n catch: () => actionError(\"close\"),\n }).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(BrowserRunSessionId)),\n Effect.mapError(() => actionError(\"close\")),\n Effect.onError(() =>\n closeWithWarning(browser.close, \"Closing an unidentified browser failed\"),\n ),\n );\n\n yield* terminate(Redacted.make(sessionId), [\n closeEntry(browser.close, \"Closing the local browser connection failed\"),\n ]);\n });\n\n const open = Effect.fn(\"BrowserRunInteractiveHost.open\")(function* (\n policy: InteractiveBrowserPolicy,\n ): Effect.fn.Return<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope> {\n const fixedPolicy = yield* snapshotPolicy(policy);\n const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);\n // Late SDK replies outlive the opening fiber; cleanup retains this pass's clock.\n const runCleanup = Effect.runPromiseWith(Context.make(Clock.Clock, yield* Clock.Clock));\n\n const state: HandleState = {\n closed: { value: false },\n disconnected: { value: false },\n uncertain: { value: false },\n violation: { value: undefined },\n pendingRequests: new Set(),\n };\n\n const lifecycle = {\n managedTeardownInstalled: false,\n };\n\n const closers: Array<CloseEntry> = [];\n\n const releaseBeforeManaged = (entry: CloseEntry): Effect.Effect<void> =>\n Effect.suspend(() =>\n lifecycle.managedTeardownInstalled\n ? Effect.void\n : entry.close.pipe(Effect.catchCause(() => Effect.logWarning(entry.warning))),\n );\n\n const browser = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(\n signal,\n () => binding.launch(keepAliveMillis(fixedPolicy)),\n (acquired) => runCleanup(closeAcquired(acquired)),\n ),\n catch: (cause) =>\n isCapacityRefusal(cause)\n ? InteractiveBrowserCapacityError.make({\n implementation: browserRunInteractiveImplementation,\n message: \"Browser Run has no capacity for a new browser session\",\n })\n : protocolError(\"Launching the Browser Run session failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) => {\n state.disconnected.value = true;\n\n return lifecycle.managedTeardownInstalled\n ? Effect.void\n : closeAcquired(acquired).pipe(\n Effect.catch(() => Effect.logWarning(\"Whole-browser cleanup remains unconfirmed\")),\n );\n },\n { interruptible: true },\n );\n\n closers.push(closeEntry(browser.close, \"Closing the interactive browser failed\"));\n\n const disconnected = () => {\n state.disconnected.value = true;\n };\n\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => browser.onDisconnected(disconnected),\n catch: (cause) => protocolError(\"Installing the browser disconnect listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => browser.offDisconnected(disconnected),\n \"Removing the browser disconnect listener failed\",\n ),\n );\n\n const connected = yield* Effect.try({\n try: browser.isConnected,\n catch: (cause) => protocolError(\"Reading the Browser Run connection state failed\", cause),\n });\n\n if (!connected) {\n state.disconnected.value = true;\n\n return yield* expiredError();\n }\n\n const sessionIdValue = yield* Effect.try({\n try: browser.sessionId,\n catch: (cause) => protocolError(\"Reading the Browser Run session identity failed\", cause),\n }).pipe(\n Effect.flatMap((value) =>\n Schema.decodeUnknownEffect(BrowserRunSessionId)(value).pipe(\n Effect.mapError(() => protocolError(\"The Browser Run session identity was malformed\")),\n ),\n ),\n );\n\n const context = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, browser.createContext, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser context failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser context failed\"),\n ),\n { interruptible: true },\n );\n\n closers.push(closeEntry(context.close, \"Closing the interactive browser context failed\"));\n\n const page = yield* Effect.acquireRelease(\n withinDeadline(\n Effect.tryPromise({\n try: (signal) =>\n closeLateAcquisition(signal, context.newPage, (acquired) => acquired.close()),\n catch: (cause) =>\n state.disconnected.value || isRemoteClosure(cause)\n ? expiredError()\n : protocolError(\"Creating the browser page failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n ),\n (acquired) =>\n releaseBeforeManaged(\n closeEntry(acquired.close, \"Closing the interactive browser page failed\"),\n ),\n { interruptible: true },\n );\n\n closers.push(closeEntry(page.close, \"Closing the interactive browser page failed\"));\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setBypassServiceWorker(true),\n catch: (cause) => protocolError(\"Bypassing browser service workers failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n const requestListener = makeRequestListener(fixedPolicy, state);\n\n yield* Effect.acquireRelease(\n Effect.try({\n try: () => page.onRequest(requestListener),\n catch: (cause) => protocolError(\"Installing the browser request listener failed\", cause),\n }),\n () =>\n releaseBeforeManaged(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n ),\n );\n closers.push(\n syncCloseEntry(\n () => page.offRequest(requestListener),\n \"Removing the browser request policy failed\",\n ),\n );\n\n yield* withinDeadline(\n Effect.tryPromise({\n try: () => page.setRequestInterception(true),\n catch: (cause) => protocolError(\"Installing the browser request policy failed\", cause),\n }),\n fixedPolicy,\n startedAt,\n );\n\n yield* withinDeadline(awaitPendingRequests(state), fixedPolicy, startedAt);\n const setupFailure = stateFailure(state);\n\n if (setupFailure !== undefined) return yield* setupFailure;\n\n const teardown = yield* Effect.uninterruptible(\n Effect.gen(function* () {\n const cached = yield* Effect.cached(terminate(Redacted.make(sessionIdValue), closers));\n\n lifecycle.managedTeardownInstalled = true;\n yield* Effect.addFinalizer(() =>\n Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(\n Effect.andThen(cached),\n Effect.catch(() => Effect.logWarning(\"Whole-browser cleanup remains unconfirmed\")),\n ),\n ),\n );\n\n return cached;\n }),\n );\n\n const close: Effect.Effect<void, InteractiveBrowserError> = Effect.uninterruptible(\n Effect.sync(() => {\n state.closed.value = true;\n state.disconnected.value = true;\n }).pipe(Effect.andThen(teardown)),\n );\n\n const runtime = yield* makeHandle(page, fixedPolicy, startedAt, state, close);\n const currentPagePreflight = decodeActionResult(page, fixedPolicy).pipe(Effect.asVoid);\n\n const requestFitsSession = (requestedMillis: number): Effect.Effect<void, BrowserFailure> =>\n remainingMillis(fixedPolicy, startedAt).pipe(\n Effect.flatMap((remaining) =>\n remaining > 0 && requestedMillis <= remaining\n ? Effect.void\n : Effect.fail(\n policyError(\"The host browser request exceeds the remaining session time\"),\n ),\n ),\n );\n\n return {\n handle: runtime.handle,\n sessionId: Redacted.make(sessionIdValue),\n resizeViewport: (viewport) =>\n decodeViewport(viewport).pipe(\n Effect.flatMap((decoded) =>\n runtime.run(\n Effect.tryPromise({\n try: () => page.setViewport(decoded),\n catch: (cause) => {\n if (state.disconnected.value || isRemoteClosure(cause)) {\n state.disconnected.value = true;\n\n return expiredError();\n }\n\n return protocolError(\"Resizing the browser viewport failed\", cause);\n },\n }),\n currentPagePreflight,\n false,\n ),\n ),\n ),\n getLiveView: (request) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The Live View request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getLiveView\",\n { mode: decoded.mode, expiresInMs: decoded.expiresInMs },\n LiveViewObservation,\n \"Cloudflare returned a malformed Live View response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunLiveViewResult)({\n devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed Live View response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.expiresInMs))),\n ),\n ),\n ),\n handoff: (request) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffRequest)(request).pipe(\n Effect.mapError(() => policyError(\"The browser handoff request is malformed\")),\n Effect.flatMap((decoded) =>\n runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.handoff\",\n { instructions: decoded.instructions, timeout: decoded.timeout },\n HandoffObservation,\n \"Cloudflare returned a malformed browser handoff response\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffResult)({\n handoffId: Redacted.make(observation.handoffId),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff response\"),\n ),\n ),\n ),\n ),\n currentPagePreflight.pipe(Effect.andThen(requestFitsSession(decoded.timeout))),\n ),\n ),\n ),\n getHandoffState: runtime.run(\n cdpCommand(\n page,\n state,\n \"Cloudflare.getHandoffState\",\n {},\n HandoffStateObservation,\n \"Cloudflare returned a malformed browser handoff state\",\n ).pipe(\n Effect.flatMap((observation) =>\n Schema.decodeUnknownEffect(BrowserRunHandoffState)({\n active: observation.active,\n ...(observation.handoffId === undefined\n ? {}\n : { handoffId: Redacted.make(observation.handoffId) }),\n ...(observation.durationMs === undefined\n ? {}\n : { durationMs: observation.durationMs }),\n }).pipe(\n Effect.mapError(() =>\n protocolError(\"Cloudflare returned a malformed browser handoff state\"),\n ),\n ),\n ),\n ),\n currentPagePreflight,\n ),\n close,\n };\n });\n\n return BrowserRunInteractiveHost.of({\n open,\n closeSession,\n cleanupSemantics: \"confirmed-terminal\",\n });\n};\n\n/** Cloudflare host controls and private session identity for one scoped Browser Run pass. */\nexport const browserRunInteractiveHostLayer = (): Layer.Layer<\n BrowserRunInteractiveHost,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n BrowserRunInteractiveHost,\n Effect.gen(function* () {\n return makeHostService(yield* BrowserRunInteractiveBinding);\n }),\n );\n\n/** Worker-only generic adapter; Cloudflare identity and controls remain host-only. */\nexport const browserRunInteractiveLayer = (): Layer.Layer<\n InteractiveBrowser,\n never,\n BrowserRunInteractiveBinding\n> =>\n Layer.effect(\n InteractiveBrowser,\n Effect.gen(function* () {\n const binding = yield* BrowserRunInteractiveBinding;\n const host = makeHostService(binding);\n\n return InteractiveBrowser.of({\n open: (policy) => host.open(policy).pipe(Effect.map((session) => session.handle)),\n });\n }),\n );\n\n/** Resolved Worker binding, cleanup credentials, and optional initial viewport. */\nexport interface CloudflareInteractiveBrowserOptions extends BrowserRunLifecycleOptions {\n readonly browser: BrowserRun;\n readonly viewport?: BrowserRunViewport;\n}\n\nconst interactiveBindingLayer = (options: CloudflareInteractiveBrowserOptions) =>\n BrowserRunInteractiveBinding.layer(options).pipe(\n Layer.provide(BrowserRunSessionLifecycle.layer(options)),\n );\n\n/** Worker-only assembly; importing ordinary capture never loads Puppeteer. */\nexport const CloudflareInteractiveBrowser = {\n /**\n * Assemble binding, confirmed-session cleanup, and the generic browser service.\n * HttpClient and construction errors remain visible. Opening a pass still requires\n * an explicit policy and Scope; no browser is launched during Layer construction.\n */\n layer: (options: CloudflareInteractiveBrowserOptions) =>\n browserRunInteractiveLayer().pipe(Layer.provide(interactiveBindingLayer(options))),\n /** Opt into private host controls instead of exposing them through the generic service. */\n hostLayer: (options: CloudflareInteractiveBrowserOptions) =>\n browserRunInteractiveHostLayer().pipe(Layer.provide(interactiveBindingLayer(options))),\n};\n"],"mappings":"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"}
|
|
@@ -286,13 +286,13 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
286
286
|
readonly author: string;
|
|
287
287
|
readonly reason: string;
|
|
288
288
|
readonly resolution: {
|
|
289
|
+
readonly _tag: "SafeToRetry";
|
|
290
|
+
} | {
|
|
289
291
|
readonly _tag: "CompletedWithResult";
|
|
290
292
|
readonly result: Schema.Json;
|
|
291
293
|
readonly isFailure: boolean;
|
|
292
294
|
} | {
|
|
293
295
|
readonly _tag: "NeverHappened";
|
|
294
|
-
} | {
|
|
295
|
-
readonly _tag: "SafeToRetry";
|
|
296
296
|
} | {
|
|
297
297
|
readonly _tag: "AbortSubmission";
|
|
298
298
|
};
|
|
@@ -632,18 +632,6 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
632
632
|
} | {
|
|
633
633
|
readonly _tag: "AdminFailed";
|
|
634
634
|
readonly failure: {
|
|
635
|
-
readonly _tag: "DurableAlarmError";
|
|
636
|
-
readonly operation: string;
|
|
637
|
-
readonly message: string;
|
|
638
|
-
readonly cause?: Schema.Json | undefined;
|
|
639
|
-
} | {
|
|
640
|
-
readonly _tag: "HostProtocolError";
|
|
641
|
-
readonly message: string;
|
|
642
|
-
} | {
|
|
643
|
-
readonly _tag: "DigestError";
|
|
644
|
-
readonly message: string;
|
|
645
|
-
readonly cause?: Schema.Json | undefined;
|
|
646
|
-
} | {
|
|
647
635
|
readonly _tag: "SettlementConflict";
|
|
648
636
|
readonly submissionId: string;
|
|
649
637
|
readonly existingOutcome: "aborted" | "completed" | "failed";
|
|
@@ -672,9 +660,6 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
672
660
|
readonly threadId: string;
|
|
673
661
|
readonly actualEpoch: number;
|
|
674
662
|
readonly attemptedEpoch: number;
|
|
675
|
-
} | {
|
|
676
|
-
readonly _tag: "DurableRuntimeFailpointError";
|
|
677
|
-
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "claim:after-claim" | "compaction:after-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" | "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";
|
|
678
663
|
} | {
|
|
679
664
|
readonly _tag: "OperationDenied";
|
|
680
665
|
readonly operation: "abort" | "awaitSettlement" | "explain" | "observe" | "resolveApproval" | "resolveUnknown" | "retry" | "scanObligations" | "verify" | "wake";
|
|
@@ -691,10 +676,25 @@ declare const encodeAdminResponse: (input: AdminFailed | ExplainedRecovery | Obl
|
|
|
691
676
|
readonly _tag: "RunJournalError";
|
|
692
677
|
readonly message: string;
|
|
693
678
|
readonly cause?: Schema.Json | undefined;
|
|
679
|
+
} | {
|
|
680
|
+
readonly _tag: "DigestError";
|
|
681
|
+
readonly message: string;
|
|
682
|
+
readonly cause?: Schema.Json | undefined;
|
|
694
683
|
} | {
|
|
695
684
|
readonly _tag: "OwnershipLost";
|
|
696
685
|
readonly submissionId: string;
|
|
697
686
|
readonly actualEpoch: number;
|
|
687
|
+
} | {
|
|
688
|
+
readonly _tag: "DurableRuntimeFailpointError";
|
|
689
|
+
readonly location: "abort:after-intent" | "approval:after-request-append" | "approval:after-suspend" | "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" | "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";
|
|
690
|
+
} | {
|
|
691
|
+
readonly _tag: "DurableAlarmError";
|
|
692
|
+
readonly operation: string;
|
|
693
|
+
readonly message: string;
|
|
694
|
+
readonly cause?: Schema.Json | undefined;
|
|
695
|
+
} | {
|
|
696
|
+
readonly _tag: "HostProtocolError";
|
|
697
|
+
readonly message: string;
|
|
698
698
|
};
|
|
699
699
|
}, Schema.SchemaError, never>;
|
|
700
700
|
declare const decodeAdminResponse: (input: unknown, options?: import("effect/SchemaAST").ParseOptions) => Effect.Effect<AdminFailed | ExplainedRecovery | ObligationsScanned | RetryExecuted | VerifiedIntegrity, Schema.SchemaError, never>;
|
|
@@ -732,4 +732,4 @@ interface Class<EventServices = never> {
|
|
|
732
732
|
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>;
|
|
733
733
|
//#endregion
|
|
734
734
|
export { CloudflareDurableRuntimeOptions as C, layerConfig as E, CloudflareDurableRuntimeInitializationError as S, layer as T, decodeObligationThresholds as _, AdminVerifyRequest as a, make as b, Instance as c, RetryExecuted as d, ThreadObject_d_exports as f, decodeAdminVerifyRequest as g, decodeAdminResponse as h, AdminResponse as i, ObligationsScanned as l, decodeAdminExplainRequest as m, AdminFailed as n, Class as o, VerifiedIntegrity as p, AdminFailure as r, ExplainedRecovery as s, AdminExplainRequest as t, Options as u, decodeRetryCommand as v, CloudflareDurableRuntimeServices as w, CloudflareBootstrapServices as x, encodeAdminResponse as y };
|
|
735
|
-
//# sourceMappingURL=ThreadObject-
|
|
735
|
+
//# sourceMappingURL=ThreadObject-CmeEjnBK.d.mts.map
|
package/dist/ThreadObject.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as CloudflareDurableRuntimeOptions, E as layerConfig, S as CloudflareDurableRuntimeInitializationError, T as layer, _ as decodeObligationThresholds, a as AdminVerifyRequest, b as make, c as Instance, d as RetryExecuted, g as decodeAdminVerifyRequest, h as decodeAdminResponse, i as AdminResponse, l as ObligationsScanned, m as decodeAdminExplainRequest, n as AdminFailed, o as Class, p as VerifiedIntegrity, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeRetryCommand, w as CloudflareDurableRuntimeServices, x as CloudflareBootstrapServices, y as encodeAdminResponse } from "./ThreadObject-
|
|
1
|
+
import { C as CloudflareDurableRuntimeOptions, E as layerConfig, S as CloudflareDurableRuntimeInitializationError, T as layer, _ as decodeObligationThresholds, a as AdminVerifyRequest, b as make, c as Instance, d as RetryExecuted, g as decodeAdminVerifyRequest, h as decodeAdminResponse, i as AdminResponse, l as ObligationsScanned, m as decodeAdminExplainRequest, n as AdminFailed, o as Class, p as VerifiedIntegrity, r as AdminFailure, s as ExplainedRecovery, t as AdminExplainRequest, u as Options, v as decodeRetryCommand, w as CloudflareDurableRuntimeServices, x as CloudflareBootstrapServices, y as encodeAdminResponse } from "./ThreadObject-CmeEjnBK.mjs";
|
|
2
2
|
export { AdminExplainRequest, AdminFailed, AdminFailure, AdminResponse, AdminVerifyRequest, type CloudflareBootstrapServices as BootstrapServices, Class, ExplainedRecovery, type CloudflareDurableRuntimeInitializationError as InitializationError, Instance, ObligationsScanned, Options, RetryExecuted, type CloudflareDurableRuntimeOptions as RuntimeOptions, type CloudflareDurableRuntimeServices as Services, VerifiedIntegrity, decodeAdminExplainRequest, decodeAdminResponse, decodeAdminVerifyRequest, decodeObligationThresholds, decodeRetryCommand, encodeAdminResponse, layer, layerConfig, make };
|
package/dist/index.d.mts
CHANGED
|
@@ -7,6 +7,6 @@ import { t as CloudflareMemory_d_exports } from "./CloudflareMemory.mjs";
|
|
|
7
7
|
import { t as CloudflareScheduling_d_exports } from "./CloudflareScheduling.mjs";
|
|
8
8
|
import { t as CloudflareSubscriptions_d_exports } from "./CloudflareSubscriptions.mjs";
|
|
9
9
|
import { t as CloudflareThreadClient_d_exports } from "./CloudflareThreadClient.mjs";
|
|
10
|
-
import { f as ThreadObject_d_exports } from "./ThreadObject-
|
|
10
|
+
import { f as ThreadObject_d_exports } from "./ThreadObject-CmeEjnBK.mjs";
|
|
11
11
|
import { t as WakeScheduler_d_exports } from "./WakeScheduler.mjs";
|
|
12
12
|
export { Alarm_d_exports as Alarm, CloudflareBindings_d_exports as CloudflareBindings, CloudflareBrowser_d_exports as CloudflareBrowser, CloudflareCodeMode_d_exports as CloudflareCodeMode, CloudflareConfig_d_exports as CloudflareConfig, CloudflareMemory_d_exports as CloudflareMemory, CloudflareScheduling_d_exports as CloudflareScheduling, CloudflareSubscriptions_d_exports as CloudflareSubscriptions, CloudflareThreadClient_d_exports as CloudflareThreadClient, ThreadObject_d_exports as ThreadObject, WakeScheduler_d_exports as WakeScheduler };
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.
|
|
1
|
+
{"name":"@effect-agent/platform-cloudflare","version":"0.1.0-beta.50","dependencies":{"@effect-agent/core":"0.1.0-beta.50","@effect-agent/engine":"0.1.0-beta.50","@effect-agent/sandbox":"0.1.0-beta.50","@effect-agent/storage-cloudflare":"0.1.0-beta.50","@effect-agent/thread":"0.1.0-beta.50","@effect/platform-browser":"4.0.0-rc.112","@effect/sql-sqlite-do":"4.0.0-rc.112"},"devDependencies":{"@cloudflare/puppeteer":"1.1.0","@cloudflare/vitest-pool-workers":"0.21.3","@cloudflare/workers-types":"5.20260825.1","@effect-agent/capabilities":"0.1.0-beta.50","@effect-agent/testing":"0.1.0-beta.50","@effect/platform-node":"4.0.0-rc.112","@effect/sql-d1":"4.0.0-rc.112","@effect/vitest":"4.0.0-rc.112","effect":"4.0.0-rc.112","effect-cf":"0.40.0","esbuild":"0.28.1","miniflare":"5.20260811.1-alpha","typescript":"7.0.2","vite-plus":"0.3.0","vitest":"4.1.11"},"peerDependencies":{"@cloudflare/puppeteer":"^1.1.0","effect":"^4.0.0-rc.112","effect-cf":"^0.40.0"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"./Alarm":{"types":"./dist/Alarm.d.mts","default":"./dist/Alarm.mjs"},"./BrowserRestCapture":{"types":"./dist/BrowserRestCapture.d.mts","default":"./dist/BrowserRestCapture.mjs"},"./BrowserRestCrawl":{"types":"./dist/BrowserRestCrawl.d.mts","default":"./dist/BrowserRestCrawl.mjs"},"./CloudflareBindings":{"types":"./dist/CloudflareBindings.d.mts","default":"./dist/CloudflareBindings.mjs"},"./CloudflareBrowser":{"types":"./dist/CloudflareBrowser.d.mts","default":"./dist/CloudflareBrowser.mjs"},"./CloudflareCodeMode":{"types":"./dist/CloudflareCodeMode.d.mts","default":"./dist/CloudflareCodeMode.mjs"},"./CloudflareConfig":{"types":"./dist/CloudflareConfig.d.mts","default":"./dist/CloudflareConfig.mjs"},"./CloudflareMemory":{"types":"./dist/CloudflareMemory.d.mts","default":"./dist/CloudflareMemory.mjs"},"./CloudflareScheduling":{"types":"./dist/CloudflareScheduling.d.mts","default":"./dist/CloudflareScheduling.mjs"},"./CloudflareSubscriptions":{"types":"./dist/CloudflareSubscriptions.d.mts","default":"./dist/CloudflareSubscriptions.mjs"},"./CloudflareThreadClient":{"types":"./dist/CloudflareThreadClient.d.mts","default":"./dist/CloudflareThreadClient.mjs"},"./InteractiveBrowser":{"types":"./dist/InteractiveBrowser.d.mts","default":"./dist/InteractiveBrowser.mjs"},"./ProtectedBrowser":{"types":"./dist/ProtectedBrowser.d.mts","default":"./dist/ProtectedBrowser.mjs"},"./ThreadObject":{"types":"./dist/ThreadObject.d.mts","default":"./dist/ThreadObject.mjs"},"./WakeScheduler":{"types":"./dist/WakeScheduler.d.mts","default":"./dist/WakeScheduler.mjs"}},"description":"Cloudflare Layer assembly for Effect Agent: Durable Objects and Browser Run adapters.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/danieljvdm/effect-agent.git","directory":"packages/platform-cloudflare"},"files":["dist","src"],"type":"module","sideEffects":[],"publishConfig":{"access":"public"},"scripts":{"build":"vp pack","check":"tsc --noEmit -p tsconfig.json"},"peerDependenciesMeta":{"@cloudflare/puppeteer":{"optional":true}}}
|
|
@@ -230,10 +230,6 @@ const HarnessCompleted = Schema.TaggedStruct("completed", {
|
|
|
230
230
|
resultBytes: Schema.Natural,
|
|
231
231
|
});
|
|
232
232
|
|
|
233
|
-
const HarnessSourceInvalid = Schema.TaggedStruct("source-invalid", {
|
|
234
|
-
message: Schema.String,
|
|
235
|
-
});
|
|
236
|
-
|
|
237
233
|
const HarnessNotAFunction = Schema.TaggedStruct("source-not-a-function", {
|
|
238
234
|
actual: Schema.String,
|
|
239
235
|
});
|
|
@@ -270,7 +266,6 @@ const HarnessProtocol = Schema.TaggedStruct("protocol", {
|
|
|
270
266
|
|
|
271
267
|
const HarnessOutcome = Schema.Union([
|
|
272
268
|
HarnessCompleted,
|
|
273
|
-
HarnessSourceInvalid,
|
|
274
269
|
HarnessNotAFunction,
|
|
275
270
|
HarnessProgramFailed,
|
|
276
271
|
HarnessLogLimit,
|
|
@@ -735,13 +730,6 @@ const makeExecute = (
|
|
|
735
730
|
}),
|
|
736
731
|
});
|
|
737
732
|
}
|
|
738
|
-
case "source-invalid": {
|
|
739
|
-
return yield* CodeSourceError.make({
|
|
740
|
-
implementation: dynamicWorkerImplementation,
|
|
741
|
-
reason: "invalid",
|
|
742
|
-
message: outcome.value.message.slice(0, 8_000),
|
|
743
|
-
});
|
|
744
|
-
}
|
|
745
733
|
case "source-not-a-function": {
|
|
746
734
|
return yield* CodeSourceError.make({
|
|
747
735
|
implementation: dynamicWorkerImplementation,
|
|
@@ -1949,6 +1949,8 @@ const makeHostService = (
|
|
|
1949
1949
|
): Effect.fn.Return<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope> {
|
|
1950
1950
|
const fixedPolicy = yield* snapshotPolicy(policy);
|
|
1951
1951
|
const startedAt = yield* Effect.clockWith((clock) => clock.currentTimeMillis);
|
|
1952
|
+
// Late SDK replies outlive the opening fiber; cleanup retains this pass's clock.
|
|
1953
|
+
const runCleanup = Effect.runPromiseWith(Context.make(Clock.Clock, yield* Clock.Clock));
|
|
1952
1954
|
|
|
1953
1955
|
const state: HandleState = {
|
|
1954
1956
|
closed: { value: false },
|
|
@@ -1978,7 +1980,7 @@ const makeHostService = (
|
|
|
1978
1980
|
closeLateAcquisition(
|
|
1979
1981
|
signal,
|
|
1980
1982
|
() => binding.launch(keepAliveMillis(fixedPolicy)),
|
|
1981
|
-
(acquired) =>
|
|
1983
|
+
(acquired) => runCleanup(closeAcquired(acquired)),
|
|
1982
1984
|
),
|
|
1983
1985
|
catch: (cause) =>
|
|
1984
1986
|
isCapacityRefusal(cause)
|