@effect-agent/platform-cloudflare 0.1.0-beta.8 → 0.1.0-beta.80

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.
Files changed (100) hide show
  1. package/dist/Alarm.d.mts +183 -0
  2. package/dist/Alarm.mjs +454 -0
  3. package/dist/Alarm.mjs.map +1 -0
  4. package/dist/BrowserRestCapture.d.mts +35 -0
  5. package/dist/BrowserRestCapture.mjs +238 -0
  6. package/dist/BrowserRestCapture.mjs.map +1 -0
  7. package/dist/BrowserRestCrawl.d.mts +17 -0
  8. package/dist/BrowserRestCrawl.mjs +244 -0
  9. package/dist/BrowserRestCrawl.mjs.map +1 -0
  10. package/dist/CloudflareAiGateway.d.mts +64 -0
  11. package/dist/CloudflareAiGateway.mjs +70 -0
  12. package/dist/CloudflareAiGateway.mjs.map +1 -0
  13. package/dist/CloudflareBindings.d.mts +112 -0
  14. package/dist/CloudflareBindings.mjs +101 -0
  15. package/dist/CloudflareBindings.mjs.map +1 -0
  16. package/dist/CloudflareBrowser-D4YqaTAl.mjs +495 -0
  17. package/dist/CloudflareBrowser-D4YqaTAl.mjs.map +1 -0
  18. package/dist/CloudflareBrowser-DJq53niJ.d.mts +80 -0
  19. package/dist/CloudflareBrowser.d.mts +2 -0
  20. package/dist/CloudflareBrowser.mjs +2 -0
  21. package/dist/CloudflareCodeMode.d.mts +44 -0
  22. package/dist/CloudflareCodeMode.mjs +616 -0
  23. package/dist/CloudflareCodeMode.mjs.map +1 -0
  24. package/dist/CloudflareConfig-f3CqTel1.d.mts +101 -0
  25. package/dist/CloudflareConfig.d.mts +2 -0
  26. package/dist/CloudflareConfig.mjs +122 -0
  27. package/dist/CloudflareConfig.mjs.map +1 -0
  28. package/dist/CloudflareMemory.d.mts +142 -0
  29. package/dist/CloudflareMemory.mjs +195 -0
  30. package/dist/CloudflareMemory.mjs.map +1 -0
  31. package/dist/CloudflareScheduling.d.mts +52 -0
  32. package/dist/CloudflareScheduling.mjs +389 -0
  33. package/dist/CloudflareScheduling.mjs.map +1 -0
  34. package/dist/CloudflareSubscriptions.d.mts +87 -0
  35. package/dist/CloudflareSubscriptions.mjs +524 -0
  36. package/dist/CloudflareSubscriptions.mjs.map +1 -0
  37. package/dist/CloudflareThreadClient.d.mts +1286 -0
  38. package/dist/CloudflareThreadClient.mjs +386 -0
  39. package/dist/CloudflareThreadClient.mjs.map +1 -0
  40. package/dist/InteractiveBrowser.d.mts +144 -0
  41. package/dist/InteractiveBrowser.mjs +1090 -0
  42. package/dist/InteractiveBrowser.mjs.map +1 -0
  43. package/dist/ProtectedBrowser.d.mts +65 -0
  44. package/dist/ProtectedBrowser.mjs +859 -0
  45. package/dist/ProtectedBrowser.mjs.map +1 -0
  46. package/dist/ThreadObject-3uDpKfB3.d.mts +816 -0
  47. package/dist/ThreadObject-DGkXv41C.mjs +836 -0
  48. package/dist/ThreadObject-DGkXv41C.mjs.map +1 -0
  49. package/dist/ThreadObject.d.mts +2 -0
  50. package/dist/ThreadObject.mjs +3 -0
  51. package/dist/WakeScheduler.d.mts +23 -0
  52. package/dist/WakeScheduler.mjs +60 -0
  53. package/dist/WakeScheduler.mjs.map +1 -0
  54. package/dist/boundary-BguazVkh.mjs +42 -0
  55. package/dist/boundary-BguazVkh.mjs.map +1 -0
  56. package/dist/browser-session-lifecycle-CUbVfEgP.mjs +84 -0
  57. package/dist/browser-session-lifecycle-CUbVfEgP.mjs.map +1 -0
  58. package/dist/browser-session-lifecycle-DJpqLXy_.d.mts +21 -0
  59. package/dist/index.d.mts +13 -1547
  60. package/dist/index.mjs +13 -1636
  61. package/dist/prepared-admission-DSi55W-7.mjs +73 -0
  62. package/dist/prepared-admission-DSi55W-7.mjs.map +1 -0
  63. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  64. package/package.json +1 -53
  65. package/src/Alarm.ts +953 -0
  66. package/src/BrowserRestCapture.ts +477 -0
  67. package/src/BrowserRestCrawl.ts +540 -0
  68. package/src/CloudflareAiGateway.ts +170 -0
  69. package/src/CloudflareBindings.ts +180 -0
  70. package/src/CloudflareBrowser.ts +15 -0
  71. package/src/{code-mode-executor.ts → CloudflareCodeMode.ts} +372 -204
  72. package/src/{config.ts → CloudflareConfig.ts} +9 -8
  73. package/src/CloudflareMemory.ts +406 -0
  74. package/src/CloudflareScheduling.ts +733 -0
  75. package/src/CloudflareSubscriptions.ts +1045 -0
  76. package/src/CloudflareThreadClient.ts +807 -0
  77. package/src/InteractiveBrowser.ts +2357 -0
  78. package/src/ProtectedBrowser.ts +2 -0
  79. package/src/ThreadObject.ts +1179 -0
  80. package/src/{wake-scheduler.ts → WakeScheduler.ts} +23 -23
  81. package/src/index.ts +12 -23
  82. package/src/internal/boundary.ts +55 -0
  83. package/src/internal/browser-quick-action.ts +857 -0
  84. package/src/internal/browser-session-lifecycle.ts +160 -0
  85. package/src/internal/layers.ts +751 -0
  86. package/src/internal/message-delivery.ts +148 -0
  87. package/src/internal/prepared-admission.ts +116 -0
  88. package/src/internal/progress-wait.ts +121 -0
  89. package/src/internal/transport.ts +42 -0
  90. package/src/protected-browser/binding.ts +187 -0
  91. package/src/protected-browser/inspect-frame.ts +125 -0
  92. package/src/protected-browser/native.ts +429 -0
  93. package/src/protected-browser/policy.ts +719 -0
  94. package/dist/index.mjs.map +0 -1
  95. package/src/alarm.ts +0 -334
  96. package/src/bindings.ts +0 -145
  97. package/src/client.ts +0 -646
  98. package/src/conversation-object.ts +0 -768
  99. package/src/layers.ts +0 -376
  100. package/src/transport.ts +0 -38
@@ -0,0 +1,386 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
+ import { ThreadObjectNamespace } from "./CloudflareBindings.mjs";
3
+ import { AdmissionLimitExceeded } from "./CloudflareConfig.mjs";
4
+ import { r as safeCauseMessage, t as cloudflareFailureSignals } from "./boundary-BguazVkh.mjs";
5
+ import { DurableAlarmError } from "./Alarm.mjs";
6
+ import { AgentId } from "@effect-agent/core/Identifiers";
7
+ import { Receipt } from "@effect-agent/thread/DurableAgentRuntime";
8
+ import { AbortCommand, AbortIntent, AdmissionConflict, AdmissionFence, AdmissionGroup, AdmissionPolicyError, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, IdempotencyKey, JoinedToHost, LedgerError, Principal, Settlement, SettlementConflict, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent } from "@effect-agent/thread/SubmissionLedger";
9
+ import { Context, Crypto, Duration, Effect, Layer, Schema } from "effect";
10
+ import { CanonicalRecordEnvelope, CanonicalSequence, DefinitionDigests, PersistedJson, WorkerAdmission } from "@effect-agent/thread/Records";
11
+ import { RpcTracing } from "effect-cf";
12
+ import { BrowserCrypto } from "@effect/platform-browser";
13
+ import { AgentInputError } from "@effect-agent/core/AgentError";
14
+ import { MessageAdmission } from "@effect-agent/core/Messaging";
15
+ import { DigestError } from "@effect-agent/thread/Digest";
16
+ import { DurableRuntimeFailpointError } from "@effect-agent/thread/DurableFailpoint";
17
+ import { OperationDenied } from "@effect-agent/thread/OperationAuthorizer";
18
+ import { SubmissionStatus } from "@effect-agent/thread/SubmissionStatus";
19
+ import { AppendConflict, FenceRejected, ThreadNotMaterialized, ThreadStoreError } from "@effect-agent/thread/ThreadStore";
20
+ //#region src/CloudflareThreadClient.ts
21
+ var CloudflareThreadClient_exports = /* @__PURE__ */ __exportAll({
22
+ AbortRecorded: () => AbortRecorded,
23
+ ApprovalRecorded: () => ApprovalRecorded,
24
+ AwaitProgressRequest: () => AwaitProgressRequest,
25
+ CancelProgressRequest: () => CancelProgressRequest,
26
+ CloudflareThreadClient: () => CloudflareThreadClient,
27
+ HostFailed: () => HostFailed,
28
+ HostFailure: () => HostFailure,
29
+ HostProtocolError: () => HostProtocolError,
30
+ HostResponse: () => HostResponse,
31
+ ObservePageRequest: () => ObservePageRequest,
32
+ ObservedPage: () => ObservedPage,
33
+ ProgressCancelled: () => ProgressCancelled,
34
+ ProgressObserved: () => ProgressObserved,
35
+ SettlementReached: () => SettlementReached,
36
+ SubmissionStatusResponse: () => SubmissionStatusResponse,
37
+ SubmitRequest: () => SubmitRequest,
38
+ SubmitSucceeded: () => SubmitSucceeded,
39
+ ThreadClientError: () => ThreadClientError,
40
+ UnknownResolutionRecorded: () => UnknownResolutionRecorded,
41
+ boundHostDiagnostic: () => boundHostDiagnostic,
42
+ decodeAbortCommand: () => decodeAbortCommand,
43
+ decodeApprovalDecisionCommand: () => decodeApprovalDecisionCommand,
44
+ decodeAwaitProgressRequest: () => decodeAwaitProgressRequest,
45
+ decodeCancelProgressRequest: () => decodeCancelProgressRequest,
46
+ decodeHostResponse: () => decodeHostResponse,
47
+ decodeObservePageRequest: () => decodeObservePageRequest,
48
+ decodeReceipt: () => decodeReceipt,
49
+ decodeSubmitRequest: () => decodeSubmitRequest,
50
+ decodeUnknownResolutionCommand: () => decodeUnknownResolutionCommand,
51
+ encodeAbortCommand: () => encodeAbortCommand,
52
+ encodeApprovalDecisionCommand: () => encodeApprovalDecisionCommand,
53
+ encodeAwaitProgressRequest: () => encodeAwaitProgressRequest,
54
+ encodeCancelProgressRequest: () => encodeCancelProgressRequest,
55
+ encodeHostResponse: () => encodeHostResponse,
56
+ encodeObservePageRequest: () => encodeObservePageRequest,
57
+ encodeReceipt: () => encodeReceipt,
58
+ encodeSubmitRequest: () => encodeSubmitRequest,
59
+ encodeUnknownResolutionCommand: () => encodeUnknownResolutionCommand
60
+ });
61
+ /**
62
+ * The Worker↔Thread-Object host protocol (plan §1.4): Schema envelopes for the host
63
+ * entry points (`submitEncoded`, `awaitSettlementEncoded`, `observePage`, `abortEncoded`,
64
+ * `resolveApprovalEncoded`, `resolveUnknownEncoded`) plus the Worker-side client that speaks
65
+ * it. Mirrors the WP2 port protocol: requests and responses are closed Schema unions, typed
66
+ * failures travel as their own tagged classes and RE-DECODE to identical tags on the caller
67
+ * (error-tag fidelity), and protocol anomalies are answered typed instead of thrown.
68
+ */
69
+ /** Ceiling for host protocol diagnostic strings. */
70
+ const MAX_HOST_DIAGNOSTIC_LENGTH = 4096;
71
+ const PROGRESS_CANCELLATION_TIMEOUT = "1 second";
72
+ const BoundedDiagnostic = Schema.String.check(Schema.isMaxLength(MAX_HOST_DIAGNOSTIC_LENGTH));
73
+ /** Truncate a diagnostic string to the host protocol's bounded length. */
74
+ const boundHostDiagnostic = (value) => value.length > MAX_HOST_DIAGNOSTIC_LENGTH ? `${value.slice(0, 4093)}...` : value;
75
+ /**
76
+ * The envelope itself could not be honored: the Object could not decode the request, or a
77
+ * response could not be encoded/decoded. Never carries operation semantics.
78
+ */
79
+ var HostProtocolError = class extends Schema.TaggedError()("HostProtocolError", { message: BoundedDiagnostic }) {};
80
+ /** The Worker-side stub call itself failed (RPC rejection, overload, eviction mid-call). */
81
+ var ThreadClientError = class extends Schema.TaggedError()("ThreadClientError", {
82
+ threadId: Schema.String,
83
+ message: Schema.String,
84
+ cause: Schema.optionalKey(Schema.Defect()),
85
+ /** Cloudflare's own classification for a failure safe to retry with a fresh stub. */
86
+ retryable: Schema.optionalKey(Schema.Boolean),
87
+ /** Cloudflare overloads are surfaced immediately instead of adding retry pressure. */
88
+ overloaded: Schema.optionalKey(Schema.Boolean)
89
+ }) {};
90
+ /**
91
+ * One durable submission, input ALREADY encoded by the caller through the Agent Binding's
92
+ * input schema (the Worker bundles the same Agent definitions as the Object, so schema
93
+ * validation happens client-side; the resolved Binding re-validates at claim time). The
94
+ * Thread identity is deliberately absent — the addressed Object IS the lane.
95
+ */
96
+ var SubmitRequest = class extends Schema.Class("@effect-agent/platform-cloudflare/SubmitRequest")({
97
+ agentId: AgentId,
98
+ principal: Principal,
99
+ idempotencyKey: IdempotencyKey,
100
+ admissionGroup: Schema.optionalKey(AdmissionGroup),
101
+ admissionFence: Schema.optionalKey(AdmissionFence),
102
+ workerAdmission: Schema.optionalKey(WorkerAdmission),
103
+ messageAdmission: Schema.optionalKey(MessageAdmission),
104
+ definitions: DefinitionDigests,
105
+ inputPayload: PersistedJson
106
+ }) {};
107
+ /** One bounded page of canonical records after an optional sequence. */
108
+ var ObservePageRequest = class extends Schema.Class("@effect-agent/platform-cloudflare/ObservePageRequest")({
109
+ afterSequence: Schema.optionalKey(CanonicalSequence),
110
+ limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1024))
111
+ }) {};
112
+ /** One event-driven wait for canonical progress strictly after this sequence. */
113
+ var AwaitProgressRequest = class extends Schema.Class("@effect-agent/platform-cloudflare/AwaitProgressRequest")({
114
+ afterSequence: CanonicalSequence,
115
+ waiterId: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256))
116
+ }) {};
117
+ /** Best-effort cancellation of one in-flight progress RPC. */
118
+ var CancelProgressRequest = class extends Schema.Class("@effect-agent/platform-cloudflare/CancelProgressRequest")({ waiterId: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)) }) {};
119
+ /**
120
+ * Every typed failure a host entry point can produce, plus the protocol's own errors. Same
121
+ * closed-union discipline as the WP2 `PortFailure`: members re-decode to the SAME tagged
122
+ * classes on the Worker side; `cause` chains travel as Schema defects without instance
123
+ * fidelity (plan §2.8).
124
+ */
125
+ const HostFailure = Schema.Union([
126
+ AgentInputError,
127
+ DigestError,
128
+ AdmissionConflict,
129
+ AdmissionPolicyError,
130
+ SettlementConflict,
131
+ ApprovalConflict,
132
+ UnknownResolutionConflict,
133
+ JoinedToHost,
134
+ LedgerError,
135
+ ThreadStoreError,
136
+ ThreadNotMaterialized,
137
+ AppendConflict,
138
+ FenceRejected,
139
+ DurableRuntimeFailpointError,
140
+ AdmissionLimitExceeded,
141
+ DurableAlarmError,
142
+ OperationDenied,
143
+ HostProtocolError
144
+ ]);
145
+ var SubmitSucceeded = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/SubmitSucceeded")("SubmitSucceeded", { receipt: Receipt }) {};
146
+ var SubmissionStatusResponse = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/SubmissionStatusResponse")("SubmissionStatusResponse", { status: SubmissionStatus }) {};
147
+ var SettlementReached = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/SettlementReached")("SettlementReached", { settlement: Settlement }) {};
148
+ var ObservedPage = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/ObservedPage")("ObservedPage", { records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(1024)) }) {};
149
+ /** A record was already committed or an incarnation-local hint says the caller should re-read. */
150
+ var ProgressObserved = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/ProgressObserved")("ProgressObserved", {}) {};
151
+ var ProgressCancelled = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/ProgressCancelled")("ProgressCancelled", {}) {};
152
+ var AbortRecorded = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/AbortRecorded")("AbortRecorded", { intent: AbortIntent }) {};
153
+ var ApprovalRecorded = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/ApprovalRecorded")("ApprovalRecorded", { intent: ApprovalDecisionIntent }) {};
154
+ var UnknownResolutionRecorded = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/UnknownResolutionRecorded")("UnknownResolutionRecorded", { intent: UnknownResolutionIntent }) {};
155
+ /** The entry point failed TYPED on the Object; the failure re-decodes verbatim. */
156
+ var HostFailed = class extends Schema.TaggedClass("@effect-agent/platform-cloudflare/HostFailed")("HostFailed", { failure: HostFailure }) {};
157
+ /** The uniform answer of one host entry point. Callers narrow by the tag their call implies. */
158
+ const HostResponse = Schema.Union([
159
+ SubmitSucceeded,
160
+ SettlementReached,
161
+ SubmissionStatusResponse,
162
+ ObservedPage,
163
+ ProgressObserved,
164
+ ProgressCancelled,
165
+ AbortRecorded,
166
+ ApprovalRecorded,
167
+ UnknownResolutionRecorded,
168
+ HostFailed
169
+ ]);
170
+ const decodeSubmitRequest = Schema.decodeUnknownEffect(SubmitRequest);
171
+ const encodeSubmitRequest = Schema.encodeEffect(SubmitRequest);
172
+ const decodeReceipt = Schema.decodeUnknownEffect(Receipt);
173
+ const encodeReceipt = Schema.encodeEffect(Receipt);
174
+ const decodeObservePageRequest = Schema.decodeUnknownEffect(ObservePageRequest);
175
+ const encodeObservePageRequest = Schema.encodeEffect(ObservePageRequest);
176
+ const decodeAwaitProgressRequest = Schema.decodeUnknownEffect(AwaitProgressRequest);
177
+ const encodeAwaitProgressRequest = Schema.encodeEffect(AwaitProgressRequest);
178
+ const decodeCancelProgressRequest = Schema.decodeUnknownEffect(CancelProgressRequest);
179
+ const encodeCancelProgressRequest = Schema.encodeEffect(CancelProgressRequest);
180
+ const decodeAbortCommand = Schema.decodeUnknownEffect(AbortCommand);
181
+ const encodeAbortCommand = Schema.encodeEffect(AbortCommand);
182
+ const decodeApprovalDecisionCommand = Schema.decodeUnknownEffect(ApprovalDecisionCommand);
183
+ const encodeApprovalDecisionCommand = Schema.encodeEffect(ApprovalDecisionCommand);
184
+ const decodeUnknownResolutionCommand = Schema.decodeUnknownEffect(UnknownResolutionCommand);
185
+ const encodeUnknownResolutionCommand = Schema.encodeEffect(UnknownResolutionCommand);
186
+ const encodeHostResponse = Schema.encodeEffect(HostResponse);
187
+ const decodeHostResponse = Schema.decodeUnknownEffect(HostResponse);
188
+ /** Failure surface of `CloudflareThreadClient.submit`. */
189
+ const ClientSubmitHostFailure = Schema.Union([
190
+ AgentInputError,
191
+ DigestError,
192
+ AdmissionConflict,
193
+ AdmissionPolicyError,
194
+ LedgerError,
195
+ ThreadStoreError,
196
+ ThreadNotMaterialized,
197
+ AppendConflict,
198
+ FenceRejected,
199
+ DurableRuntimeFailpointError,
200
+ AdmissionLimitExceeded,
201
+ DurableAlarmError,
202
+ HostProtocolError
203
+ ]);
204
+ const ClientAwaitHostFailure = Schema.Union([
205
+ LedgerError,
206
+ SettlementConflict,
207
+ OperationDenied,
208
+ HostProtocolError
209
+ ]);
210
+ const ClientObserveHostFailure = Schema.Union([
211
+ ThreadStoreError,
212
+ ThreadNotMaterialized,
213
+ OperationDenied,
214
+ HostProtocolError
215
+ ]);
216
+ const ClientAbortHostFailure = Schema.Union([
217
+ OperationDenied,
218
+ LedgerError,
219
+ SettlementConflict,
220
+ JoinedToHost,
221
+ DurableRuntimeFailpointError,
222
+ DurableAlarmError,
223
+ HostProtocolError
224
+ ]);
225
+ const ClientApprovalHostFailure = Schema.Union([
226
+ LedgerError,
227
+ SettlementConflict,
228
+ ApprovalConflict,
229
+ OperationDenied,
230
+ DurableAlarmError,
231
+ HostProtocolError
232
+ ]);
233
+ const ClientUnknownHostFailure = Schema.Union([
234
+ LedgerError,
235
+ SettlementConflict,
236
+ UnknownResolutionConflict,
237
+ JoinedToHost,
238
+ DurableRuntimeFailpointError,
239
+ OperationDenied,
240
+ DurableAlarmError,
241
+ HostProtocolError
242
+ ]);
243
+ const outOfContract = (threadId, operation, observed) => ThreadClientError.make({
244
+ threadId,
245
+ message: boundHostDiagnostic(`The Thread Object answered ${operation} with the out-of-contract ${observed}.`)
246
+ });
247
+ const hostRpcMethods = {
248
+ submit: "submitEncoded",
249
+ awaitSettlement: "awaitSettlementEncoded",
250
+ submissionStatus: "submissionStatusEncoded",
251
+ awaitProgress: "awaitProgressEncoded",
252
+ cancelProgress: "cancelProgressEncoded",
253
+ observePage: "observePage",
254
+ abort: "abortEncoded",
255
+ resolveApproval: "resolveApprovalEncoded",
256
+ resolveUnknown: "resolveUnknownEncoded"
257
+ };
258
+ /** Worker-side client over the Thread Object namespace (DEPLOY-010). */
259
+ var CloudflareThreadClient = class CloudflareThreadClient extends Context.Service()("@effect-agent/platform-cloudflare/CloudflareThreadClient") {
260
+ /**
261
+ * Assemble the client from a resolved namespace and the platform Crypto implementation.
262
+ * rpcTracing is the binding name and remains opt-in. Caller authentication, principals,
263
+ * idempotency keys, and definition digests are still explicit submission inputs.
264
+ */
265
+ static layerFromBinding(options) {
266
+ return CloudflareThreadClient.layer.pipe(Layer.provide([ThreadObjectNamespace.layer(options.namespace, options), BrowserCrypto.layer]));
267
+ }
268
+ static layer = Layer.effect(CloudflareThreadClient)(Effect.gen(function* () {
269
+ const { get, rpcTracing } = yield* ThreadObjectNamespace;
270
+ const crypto = yield* Crypto.Crypto;
271
+ const call = Effect.fn(function* (threadId, operation, encoded) {
272
+ const traceArgs = rpcTracing === void 0 ? [] : yield* RpcTracing.withRpcTraceContext([]);
273
+ const raw = yield* Effect.tryPromise({
274
+ try: () => {
275
+ return get(threadId)[hostRpcMethods[operation]](encoded, ...traceArgs);
276
+ },
277
+ catch: (cause) => ThreadClientError.make({
278
+ threadId,
279
+ message: boundHostDiagnostic(`${operation} did not reach the Thread Object: ${safeCauseMessage(cause, "the RPC failed without a diagnostic")}`),
280
+ cause,
281
+ ...cloudflareFailureSignals(cause)
282
+ })
283
+ });
284
+ return yield* decodeHostResponse(raw).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`The ${operation} answer could not be decoded: ${error.message}`) })));
285
+ }, (effect, threadId, operation) => rpcTracing === void 0 ? Effect.withSpan(effect, "CloudflareThreadClient.call", { attributes: {
286
+ threadId,
287
+ operation
288
+ } }) : RpcTracing.withRpcClientSpan(effect, rpcTracing, hostRpcMethods[operation]));
289
+ const expect = (threadId, operation, resultSchema, failureSchema) => {
290
+ const isExpectedResult = Schema.is(resultSchema);
291
+ const isExpectedFailure = Schema.is(failureSchema);
292
+ return (response) => {
293
+ if (response._tag === "HostFailed") {
294
+ const failure = response.failure;
295
+ return isExpectedFailure(failure) ? Effect.fail(failure) : Effect.fail(outOfContract(threadId, operation, `failure ${failure._tag}`));
296
+ }
297
+ if (!isExpectedResult(response)) return Effect.fail(outOfContract(threadId, operation, `result ${response._tag}`));
298
+ return Effect.succeed(response);
299
+ };
300
+ };
301
+ const readPage = (threadId, options) => Effect.gen(function* () {
302
+ const request = ObservePageRequest.make({
303
+ ...options?.afterSequence === void 0 ? {} : { afterSequence: options.afterSequence },
304
+ limit: options?.limit ?? 256
305
+ });
306
+ const encoded = yield* encodeObservePageRequest(request).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`observePage request encode failed: ${error.message}`) })));
307
+ const response = yield* call(threadId, "observePage", encoded);
308
+ return (yield* expect(threadId, "observePage", ObservedPage, ClientObserveHostFailure)(response)).records;
309
+ });
310
+ const cancelProgress = (threadId, waiterId) => encodeCancelProgressRequest(CancelProgressRequest.make({ waiterId })).pipe(Effect.mapError(() => void 0), Effect.flatMap((encoded) => call(threadId, "cancelProgress", encoded)), Effect.interruptible, Effect.timeout(PROGRESS_CANCELLATION_TIMEOUT), Effect.asVoid, Effect.ignore);
311
+ return CloudflareThreadClient.of({
312
+ submit: (agent, input, options) => Effect.gen(function* () {
313
+ const encodedInput = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(Effect.mapError((cause) => AgentInputError.make({ message: `Unable to encode Agent input: ${cause.message}` })));
314
+ const inputPayload = yield* Schema.decodeUnknownEffect(PersistedJson)(encodedInput).pipe(Effect.mapError(() => AgentInputError.make({ message: "Agent input does not satisfy the canonical persistence bounds" })));
315
+ const request = SubmitRequest.make({
316
+ agentId: agent.definition.id,
317
+ principal: options.principal,
318
+ idempotencyKey: options.idempotencyKey,
319
+ ...options.admissionGroup === void 0 ? {} : { admissionGroup: options.admissionGroup },
320
+ ...options.admissionFence === void 0 ? {} : { admissionFence: options.admissionFence },
321
+ ...options.workerAdmission === void 0 ? {} : { workerAdmission: options.workerAdmission },
322
+ ...options.messageAdmission === void 0 ? {} : { messageAdmission: options.messageAdmission },
323
+ definitions: options.definitions,
324
+ inputPayload
325
+ });
326
+ const encoded = yield* encodeSubmitRequest(request).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`submit request encode failed: ${error.message}`) })));
327
+ const response = yield* call(options.threadId, "submit", encoded);
328
+ return (yield* expect(options.threadId, "submit", SubmitSucceeded, ClientSubmitHostFailure)(response)).receipt;
329
+ }),
330
+ submissionStatus: (receipt) => Effect.gen(function* () {
331
+ const encoded = yield* encodeReceipt(receipt).pipe(Effect.mapError(() => HostProtocolError.make({ message: "Invalid receipt" })));
332
+ const response = yield* call(receipt.threadId, "submissionStatus", encoded);
333
+ return (yield* expect(receipt.threadId, "submissionStatus", SubmissionStatusResponse, ClientAwaitHostFailure)(response)).status;
334
+ }),
335
+ awaitSettlement: (receipt) => Effect.gen(function* () {
336
+ const encoded = yield* encodeReceipt(receipt).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`receipt encode failed: ${error.message}`) })));
337
+ const response = yield* call(receipt.threadId, "awaitSettlement", encoded);
338
+ return (yield* expect(receipt.threadId, "awaitSettlement", SettlementReached, ClientAwaitHostFailure)(response)).settlement;
339
+ }),
340
+ awaitProgress: (threadId, afterSequence) => Effect.gen(function* () {
341
+ const waiterId = yield* crypto.randomUUIDv4.pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`awaitProgress cancellation identity generation failed: ${error.message}`) })));
342
+ const request = AwaitProgressRequest.make({
343
+ afterSequence,
344
+ waiterId
345
+ });
346
+ const encoded = yield* encodeAwaitProgressRequest(request).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`awaitProgress request encode failed: ${error.message}`) })));
347
+ const attempt = (retry) => call(threadId, "awaitProgress", encoded).pipe(Effect.flatMap(expect(threadId, "awaitProgress", ProgressObserved, ClientObserveHostFailure)), Effect.asVoid, Effect.catchTag("ThreadClientError", (error) => error.retryable === true && error.overloaded !== true && retry < 5 ? Effect.sleep(Duration.millis(10 * 2 ** retry)).pipe(Effect.andThen(attempt(retry + 1))) : Effect.fail(error)));
348
+ yield* attempt(0).pipe(Effect.onInterrupt(() => cancelProgress(threadId, waiterId)));
349
+ }),
350
+ readPage,
351
+ readAll: (threadId) => Effect.gen(function* () {
352
+ const all = [];
353
+ let after;
354
+ for (;;) {
355
+ const page = yield* readPage(threadId, {
356
+ afterSequence: after,
357
+ limit: 1024
358
+ });
359
+ all.push(...page);
360
+ const last = page.at(-1);
361
+ if (page.length < 1024 || last === void 0) return all;
362
+ after = last.sequence;
363
+ }
364
+ }),
365
+ abort: (threadId, command) => Effect.gen(function* () {
366
+ const encoded = yield* encodeAbortCommand(command).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`abort command encode failed: ${error.message}`) })));
367
+ const response = yield* call(threadId, "abort", encoded);
368
+ return (yield* expect(threadId, "abort", AbortRecorded, ClientAbortHostFailure)(response)).intent;
369
+ }),
370
+ resolveApproval: (threadId, command) => Effect.gen(function* () {
371
+ const encoded = yield* encodeApprovalDecisionCommand(command).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`approval command encode failed: ${error.message}`) })));
372
+ const response = yield* call(threadId, "resolveApproval", encoded);
373
+ return (yield* expect(threadId, "resolveApproval", ApprovalRecorded, ClientApprovalHostFailure)(response)).intent;
374
+ }),
375
+ resolveUnknown: (threadId, command) => Effect.gen(function* () {
376
+ const encoded = yield* encodeUnknownResolutionCommand(command).pipe(Effect.mapError((error) => HostProtocolError.make({ message: boundHostDiagnostic(`resolution command encode failed: ${error.message}`) })));
377
+ const response = yield* call(threadId, "resolveUnknown", encoded);
378
+ return (yield* expect(threadId, "resolveUnknown", UnknownResolutionRecorded, ClientUnknownHostFailure)(response)).intent;
379
+ })
380
+ });
381
+ }));
382
+ };
383
+ //#endregion
384
+ export { AbortRecorded, ApprovalRecorded, AwaitProgressRequest, CancelProgressRequest, CloudflareThreadClient, HostFailed, HostFailure, HostProtocolError, HostResponse, ObservePageRequest, ObservedPage, ProgressCancelled, ProgressObserved, SettlementReached, SubmissionStatusResponse, SubmitRequest, SubmitSucceeded, ThreadClientError, UnknownResolutionRecorded, boundHostDiagnostic, decodeAbortCommand, decodeApprovalDecisionCommand, decodeAwaitProgressRequest, decodeCancelProgressRequest, decodeHostResponse, decodeObservePageRequest, decodeReceipt, decodeSubmitRequest, decodeUnknownResolutionCommand, encodeAbortCommand, encodeApprovalDecisionCommand, encodeAwaitProgressRequest, encodeCancelProgressRequest, encodeHostResponse, encodeObservePageRequest, encodeReceipt, encodeSubmitRequest, encodeUnknownResolutionCommand, CloudflareThreadClient_exports as t };
385
+
386
+ //# sourceMappingURL=CloudflareThreadClient.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareThreadClient.mjs","names":[],"sources":["../src/CloudflareThreadClient.ts"],"sourcesContent":["import { AgentInputError } from \"@effect-agent/core/AgentError\";\nimport { AgentId, type ThreadId } from \"@effect-agent/core/Identifiers\";\nimport { MessageAdmission } from \"@effect-agent/core/Messaging\";\nimport { DigestError } from \"@effect-agent/thread/Digest\";\nimport {\n Receipt,\n type DurableSubmitAgent,\n type DurableSubmitOptions,\n} from \"@effect-agent/thread/DurableAgentRuntime\";\nimport { DurableRuntimeFailpointError } from \"@effect-agent/thread/DurableFailpoint\";\nimport { OperationDenied } from \"@effect-agent/thread/OperationAuthorizer\";\nimport {\n CanonicalRecordEnvelope,\n CanonicalSequence,\n DefinitionDigests,\n PersistedJson,\n WorkerAdmission,\n} from \"@effect-agent/thread/Records\";\nimport {\n AdmissionFence,\n AdmissionGroup,\n AbortCommand,\n AbortIntent,\n AdmissionConflict,\n AdmissionPolicyError,\n ApprovalConflict,\n ApprovalDecisionCommand,\n ApprovalDecisionIntent,\n IdempotencyKey,\n JoinedToHost,\n LedgerError,\n Principal,\n Settlement,\n SettlementConflict,\n UnknownResolutionCommand,\n UnknownResolutionConflict,\n UnknownResolutionIntent,\n} from \"@effect-agent/thread/SubmissionLedger\";\nimport { SubmissionStatus } from \"@effect-agent/thread/SubmissionStatus\";\nimport {\n AppendConflict,\n ThreadNotMaterialized,\n ThreadStoreError,\n FenceRejected,\n} from \"@effect-agent/thread/ThreadStore\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { Context, Crypto, Duration, Effect, Layer, Schema } from \"effect\";\nimport { RpcTracing } from \"effect-cf\";\n\nimport { DurableAlarmError } from \"./Alarm.ts\";\nimport { ThreadObjectNamespace, type ThreadObjectRpc } from \"./CloudflareBindings.ts\";\nimport { AdmissionLimitExceeded } from \"./CloudflareConfig.ts\";\nimport { cloudflareFailureSignals, safeCauseMessage } from \"./internal/boundary.ts\";\n\n/**\n * The Worker↔Thread-Object host protocol (plan §1.4): Schema envelopes for the host\n * entry points (`submitEncoded`, `awaitSettlementEncoded`, `observePage`, `abortEncoded`,\n * `resolveApprovalEncoded`, `resolveUnknownEncoded`) plus the Worker-side client that speaks\n * it. Mirrors the WP2 port protocol: requests and responses are closed Schema unions, typed\n * failures travel as their own tagged classes and RE-DECODE to identical tags on the caller\n * (error-tag fidelity), and protocol anomalies are answered typed instead of thrown.\n */\n\n/** Ceiling for host protocol diagnostic strings. */\nconst MAX_HOST_DIAGNOSTIC_LENGTH = 4_096;\nconst PROGRESS_CANCELLATION_TIMEOUT = \"1 second\";\n\nconst BoundedDiagnostic = Schema.String.check(Schema.isMaxLength(MAX_HOST_DIAGNOSTIC_LENGTH));\n\n/** Truncate a diagnostic string to the host protocol's bounded length. */\nexport const boundHostDiagnostic = (value: string): string =>\n value.length > MAX_HOST_DIAGNOSTIC_LENGTH\n ? `${value.slice(0, MAX_HOST_DIAGNOSTIC_LENGTH - 3)}...`\n : value;\n\n/**\n * The envelope itself could not be honored: the Object could not decode the request, or a\n * response could not be encoded/decoded. Never carries operation semantics.\n */\nexport class HostProtocolError extends Schema.TaggedError<HostProtocolError>()(\n \"HostProtocolError\",\n {\n message: BoundedDiagnostic,\n },\n) {}\n\n/** The Worker-side stub call itself failed (RPC rejection, overload, eviction mid-call). */\nexport class ThreadClientError extends Schema.TaggedError<ThreadClientError>()(\n \"ThreadClientError\",\n {\n threadId: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n /** Cloudflare's own classification for a failure safe to retry with a fresh stub. */\n retryable: Schema.optionalKey(Schema.Boolean),\n /** Cloudflare overloads are surfaced immediately instead of adding retry pressure. */\n overloaded: Schema.optionalKey(Schema.Boolean),\n },\n) {}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\n/**\n * One durable submission, input ALREADY encoded by the caller through the Agent Binding's\n * input schema (the Worker bundles the same Agent definitions as the Object, so schema\n * validation happens client-side; the resolved Binding re-validates at claim time). The\n * Thread identity is deliberately absent — the addressed Object IS the lane.\n */\nexport class SubmitRequest extends Schema.Class<SubmitRequest>(\n \"@effect-agent/platform-cloudflare/SubmitRequest\",\n)({\n agentId: AgentId,\n principal: Principal,\n idempotencyKey: IdempotencyKey,\n admissionGroup: Schema.optionalKey(AdmissionGroup),\n admissionFence: Schema.optionalKey(AdmissionFence),\n workerAdmission: Schema.optionalKey(WorkerAdmission),\n messageAdmission: Schema.optionalKey(MessageAdmission),\n definitions: DefinitionDigests,\n inputPayload: PersistedJson,\n}) {}\n\n/** One bounded page of canonical records after an optional sequence. */\nexport class ObservePageRequest extends Schema.Class<ObservePageRequest>(\n \"@effect-agent/platform-cloudflare/ObservePageRequest\",\n)({\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1_024)),\n}) {}\n\n/** One event-driven wait for canonical progress strictly after this sequence. */\nexport class AwaitProgressRequest extends Schema.Class<AwaitProgressRequest>(\n \"@effect-agent/platform-cloudflare/AwaitProgressRequest\",\n)({\n afterSequence: CanonicalSequence,\n waiterId: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)),\n}) {}\n\n/** Best-effort cancellation of one in-flight progress RPC. */\nexport class CancelProgressRequest extends Schema.Class<CancelProgressRequest>(\n \"@effect-agent/platform-cloudflare/CancelProgressRequest\",\n)({\n waiterId: Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)),\n}) {}\n\n// ---------------------------------------------------------------------------\n// Responses\n// ---------------------------------------------------------------------------\n\n/**\n * Every typed failure a host entry point can produce, plus the protocol's own errors. Same\n * closed-union discipline as the WP2 `PortFailure`: members re-decode to the SAME tagged\n * classes on the Worker side; `cause` chains travel as Schema defects without instance\n * fidelity (plan §2.8).\n */\nexport const HostFailure = Schema.Union([\n AgentInputError,\n DigestError,\n AdmissionConflict,\n AdmissionPolicyError,\n SettlementConflict,\n ApprovalConflict,\n UnknownResolutionConflict,\n JoinedToHost,\n LedgerError,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n DurableRuntimeFailpointError,\n AdmissionLimitExceeded,\n DurableAlarmError,\n OperationDenied,\n HostProtocolError,\n]);\n\nexport type HostFailure = typeof HostFailure.Type;\n\nexport class SubmitSucceeded extends Schema.TaggedClass<SubmitSucceeded>(\n \"@effect-agent/platform-cloudflare/SubmitSucceeded\",\n)(\"SubmitSucceeded\", {\n receipt: Receipt,\n}) {}\n\nexport class SubmissionStatusResponse extends Schema.TaggedClass<SubmissionStatusResponse>(\n \"@effect-agent/platform-cloudflare/SubmissionStatusResponse\",\n)(\"SubmissionStatusResponse\", { status: SubmissionStatus }) {}\n\nexport class SettlementReached extends Schema.TaggedClass<SettlementReached>(\n \"@effect-agent/platform-cloudflare/SettlementReached\",\n)(\"SettlementReached\", {\n settlement: Settlement,\n}) {}\n\nexport class ObservedPage extends Schema.TaggedClass<ObservedPage>(\n \"@effect-agent/platform-cloudflare/ObservedPage\",\n)(\"ObservedPage\", {\n records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(1_024)),\n}) {}\n\n/** A record was already committed or an incarnation-local hint says the caller should re-read. */\nexport class ProgressObserved extends Schema.TaggedClass<ProgressObserved>(\n \"@effect-agent/platform-cloudflare/ProgressObserved\",\n)(\"ProgressObserved\", {}) {}\n\nexport class ProgressCancelled extends Schema.TaggedClass<ProgressCancelled>(\n \"@effect-agent/platform-cloudflare/ProgressCancelled\",\n)(\"ProgressCancelled\", {}) {}\n\nexport class AbortRecorded extends Schema.TaggedClass<AbortRecorded>(\n \"@effect-agent/platform-cloudflare/AbortRecorded\",\n)(\"AbortRecorded\", {\n intent: AbortIntent,\n}) {}\n\nexport class ApprovalRecorded extends Schema.TaggedClass<ApprovalRecorded>(\n \"@effect-agent/platform-cloudflare/ApprovalRecorded\",\n)(\"ApprovalRecorded\", {\n intent: ApprovalDecisionIntent,\n}) {}\n\nexport class UnknownResolutionRecorded extends Schema.TaggedClass<UnknownResolutionRecorded>(\n \"@effect-agent/platform-cloudflare/UnknownResolutionRecorded\",\n)(\"UnknownResolutionRecorded\", {\n intent: UnknownResolutionIntent,\n}) {}\n\n/** The entry point failed TYPED on the Object; the failure re-decodes verbatim. */\nexport class HostFailed extends Schema.TaggedClass<HostFailed>(\n \"@effect-agent/platform-cloudflare/HostFailed\",\n)(\"HostFailed\", {\n failure: HostFailure,\n}) {}\n\n/** The uniform answer of one host entry point. Callers narrow by the tag their call implies. */\nexport const HostResponse = Schema.Union([\n SubmitSucceeded,\n SettlementReached,\n SubmissionStatusResponse,\n ObservedPage,\n ProgressObserved,\n ProgressCancelled,\n AbortRecorded,\n ApprovalRecorded,\n UnknownResolutionRecorded,\n HostFailed,\n]);\n\nexport type HostResponse = typeof HostResponse.Type;\n\n// ---------------------------------------------------------------------------\n// Codecs (shared by the Object endpoints and the Worker client)\n// ---------------------------------------------------------------------------\n\nexport const decodeSubmitRequest = Schema.decodeUnknownEffect(SubmitRequest);\nexport const encodeSubmitRequest = Schema.encodeEffect(SubmitRequest);\nexport const decodeReceipt = Schema.decodeUnknownEffect(Receipt);\nexport const encodeReceipt = Schema.encodeEffect(Receipt);\nexport const decodeObservePageRequest = Schema.decodeUnknownEffect(ObservePageRequest);\nexport const encodeObservePageRequest = Schema.encodeEffect(ObservePageRequest);\nexport const decodeAwaitProgressRequest = Schema.decodeUnknownEffect(AwaitProgressRequest);\nexport const encodeAwaitProgressRequest = Schema.encodeEffect(AwaitProgressRequest);\nexport const decodeCancelProgressRequest = Schema.decodeUnknownEffect(CancelProgressRequest);\nexport const encodeCancelProgressRequest = Schema.encodeEffect(CancelProgressRequest);\nexport const decodeAbortCommand = Schema.decodeUnknownEffect(AbortCommand);\nexport const encodeAbortCommand = Schema.encodeEffect(AbortCommand);\nexport const decodeApprovalDecisionCommand = Schema.decodeUnknownEffect(ApprovalDecisionCommand);\nexport const encodeApprovalDecisionCommand = Schema.encodeEffect(ApprovalDecisionCommand);\nexport const decodeUnknownResolutionCommand = Schema.decodeUnknownEffect(UnknownResolutionCommand);\nexport const encodeUnknownResolutionCommand = Schema.encodeEffect(UnknownResolutionCommand);\nexport const encodeHostResponse = Schema.encodeEffect(HostResponse);\nexport const decodeHostResponse = Schema.decodeUnknownEffect(HostResponse);\n\n// ---------------------------------------------------------------------------\n// Worker-side client\n// ---------------------------------------------------------------------------\n\n/** Failure surface of `CloudflareThreadClient.submit`. */\nconst ClientSubmitHostFailure = Schema.Union([\n AgentInputError,\n DigestError,\n AdmissionConflict,\n AdmissionPolicyError,\n LedgerError,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n DurableRuntimeFailpointError,\n AdmissionLimitExceeded,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nconst ClientAwaitHostFailure = Schema.Union([\n LedgerError,\n SettlementConflict,\n OperationDenied,\n HostProtocolError,\n]);\n\nconst ClientObserveHostFailure = Schema.Union([\n ThreadStoreError,\n ThreadNotMaterialized,\n OperationDenied,\n HostProtocolError,\n]);\n\nconst ClientAbortHostFailure = Schema.Union([\n OperationDenied,\n LedgerError,\n SettlementConflict,\n JoinedToHost,\n DurableRuntimeFailpointError,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nconst ClientApprovalHostFailure = Schema.Union([\n LedgerError,\n SettlementConflict,\n ApprovalConflict,\n OperationDenied,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nconst ClientUnknownHostFailure = Schema.Union([\n LedgerError,\n SettlementConflict,\n UnknownResolutionConflict,\n JoinedToHost,\n DurableRuntimeFailpointError,\n OperationDenied,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nexport type ClientSubmitFailure = typeof ClientSubmitHostFailure.Type | ThreadClientError;\nexport type ClientAwaitFailure = typeof ClientAwaitHostFailure.Type | ThreadClientError;\nexport type ClientObserveFailure = typeof ClientObserveHostFailure.Type | ThreadClientError;\nexport type ClientProgressFailure = ClientObserveFailure;\nexport type ClientAbortFailure = typeof ClientAbortHostFailure.Type | ThreadClientError;\nexport type ClientApprovalFailure = typeof ClientApprovalHostFailure.Type | ThreadClientError;\nexport type ClientUnknownFailure = typeof ClientUnknownHostFailure.Type | ThreadClientError;\n\nconst outOfContract = (threadId: string, operation: string, observed: string): ThreadClientError =>\n ThreadClientError.make({\n threadId,\n message: boundHostDiagnostic(\n `The Thread Object answered ${operation} with the out-of-contract ${observed}.`,\n ),\n });\n\nconst hostRpcMethods = {\n submit: \"submitEncoded\",\n awaitSettlement: \"awaitSettlementEncoded\",\n submissionStatus: \"submissionStatusEncoded\",\n awaitProgress: \"awaitProgressEncoded\",\n cancelProgress: \"cancelProgressEncoded\",\n observePage: \"observePage\",\n abort: \"abortEncoded\",\n resolveApproval: \"resolveApprovalEncoded\",\n resolveUnknown: \"resolveUnknownEncoded\",\n} as const satisfies Record<string, keyof ThreadObjectRpc>;\n\n/** Worker-side client over the Thread Object namespace (DEPLOY-010). */\nexport class CloudflareThreadClient extends Context.Service<\n CloudflareThreadClient,\n {\n /** Encode the input client-side, then durably submit to the owning Object. */\n readonly submit: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: DurableSubmitOptions,\n ) => Effect.Effect<Receipt, ClientSubmitFailure, InputSchema[\"EncodingServices\"]>;\n /** Wake-hinted, poll-guaranteed settlement wait executed inside the owning Object. */\n readonly submissionStatus: (\n receipt: Receipt,\n ) => Effect.Effect<SubmissionStatus, ClientAwaitFailure>;\n readonly awaitSettlement: (receipt: Receipt) => Effect.Effect<Settlement, ClientAwaitFailure>;\n /**\n * Wait without polling until progress after `afterSequence` is already durable or hinted.\n * The result is deliberately void: canonical records remain authoritative and must be read.\n * Interruption waits at most one second for best-effort remote cancellation.\n */\n readonly awaitProgress: (\n threadId: ThreadId,\n afterSequence: CanonicalSequence,\n ) => Effect.Effect<void, ClientProgressFailure>;\n /** One bounded page of canonical records. */\n readonly readPage: (\n threadId: ThreadId,\n options?: {\n readonly afterSequence?: CanonicalSequence | undefined;\n readonly limit?: number | undefined;\n },\n ) => Effect.Effect<ReadonlyArray<CanonicalRecordEnvelope>, ClientObserveFailure>;\n /**\n * Every canonical record up to the CURRENT committed tail, via repeated pages. A\n * snapshot read, not a live observation — callers wanting liveness re-read after\n * `awaitSettlement`.\n */\n readonly readAll: (\n threadId: ThreadId,\n ) => Effect.Effect<ReadonlyArray<CanonicalRecordEnvelope>, ClientObserveFailure>;\n /**\n * Submission-addressed operations take the owning Thread explicitly (from the\n * Receipt): minted Submission identities stay OPAQUE outside the storage adapter that\n * minted them (D-P6-5), so the client never parses one to find the lane.\n */\n readonly abort: (\n threadId: ThreadId,\n command: AbortCommand,\n ) => Effect.Effect<AbortIntent, ClientAbortFailure>;\n readonly resolveApproval: (\n threadId: ThreadId,\n command: ApprovalDecisionCommand,\n ) => Effect.Effect<ApprovalDecisionIntent, ClientApprovalFailure>;\n readonly resolveUnknown: (\n threadId: ThreadId,\n command: UnknownResolutionCommand,\n ) => Effect.Effect<UnknownResolutionIntent, ClientUnknownFailure>;\n }\n>()(\"@effect-agent/platform-cloudflare/CloudflareThreadClient\") {\n /**\n * Assemble the client from a resolved namespace and the platform Crypto implementation.\n * rpcTracing is the binding name and remains opt-in. Caller authentication, principals,\n * idempotency keys, and definition digests are still explicit submission inputs.\n */\n static layerFromBinding(options: {\n readonly namespace: DurableObjectNamespace<ThreadObjectRpc>;\n readonly rpcTracing?: string;\n }): Layer.Layer<CloudflareThreadClient> {\n return CloudflareThreadClient.layer.pipe(\n Layer.provide([ThreadObjectNamespace.layer(options.namespace, options), BrowserCrypto.layer]),\n );\n }\n\n static readonly layer: Layer.Layer<\n CloudflareThreadClient,\n never,\n ThreadObjectNamespace | Crypto.Crypto\n > = Layer.effect(CloudflareThreadClient)(\n Effect.gen(function* () {\n const { get, rpcTracing } = yield* ThreadObjectNamespace;\n const crypto = yield* Crypto.Crypto;\n\n const call = Effect.fn(\n function* (\n threadId: ThreadId,\n operation: keyof typeof hostRpcMethods,\n encoded: unknown,\n ): Effect.fn.Return<HostResponse, ThreadClientError | HostProtocolError> {\n // Empty arguments preserve native arity. Passing `undefined` still adds an argument.\n const traceArgs =\n rpcTracing === undefined ? [] : yield* RpcTracing.withRpcTraceContext([]);\n\n const raw = yield* Effect.tryPromise({\n try: () => {\n const stub = get(threadId);\n\n return stub[hostRpcMethods[operation]](encoded, ...traceArgs);\n },\n catch: (cause) =>\n ThreadClientError.make({\n threadId,\n message: boundHostDiagnostic(\n `${operation} did not reach the Thread Object: ${safeCauseMessage(\n cause,\n \"the RPC failed without a diagnostic\",\n )}`,\n ),\n cause,\n ...cloudflareFailureSignals(cause),\n }),\n });\n\n return yield* decodeHostResponse(raw).pipe(\n Effect.mapError((error): HostProtocolError =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `The ${operation} answer could not be decoded: ${error.message}`,\n ),\n }),\n ),\n );\n },\n (effect, threadId, operation) =>\n rpcTracing === undefined\n ? Effect.withSpan(effect, \"CloudflareThreadClient.call\", {\n attributes: { threadId, operation },\n })\n : RpcTracing.withRpcClientSpan(effect, rpcTracing, hostRpcMethods[operation]),\n );\n\n const expect = <ResultSchema extends Schema.Top, FailureSchema extends Schema.Top>(\n threadId: string,\n operation: string,\n resultSchema: ResultSchema,\n failureSchema: FailureSchema,\n ) => {\n const isExpectedResult = Schema.is(resultSchema);\n const isExpectedFailure = Schema.is(failureSchema);\n\n return (\n response: HostResponse,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | ThreadClientError> => {\n if (response._tag === \"HostFailed\") {\n const failure = response.failure;\n\n return isExpectedFailure(failure)\n ? Effect.fail(failure)\n : Effect.fail(outOfContract(threadId, operation, `failure ${failure._tag}`));\n }\n if (!isExpectedResult(response)) {\n return Effect.fail(outOfContract(threadId, operation, `result ${response._tag}`));\n }\n\n return Effect.succeed(response);\n };\n };\n\n const readPage = (\n threadId: ThreadId,\n options?: {\n readonly afterSequence?: CanonicalSequence | undefined;\n readonly limit?: number | undefined;\n },\n ) =>\n Effect.gen(function* () {\n const request = ObservePageRequest.make({\n ...(options?.afterSequence === undefined\n ? {}\n : { afterSequence: options.afterSequence }),\n limit: options?.limit ?? 256,\n });\n\n const encoded = yield* encodeObservePageRequest(request).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`observePage request encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"observePage\", encoded);\n\n const page = yield* expect(\n threadId,\n \"observePage\",\n ObservedPage,\n ClientObserveHostFailure,\n )(response);\n\n return page.records;\n });\n\n const cancelProgress = (threadId: ThreadId, waiterId: string): Effect.Effect<void> =>\n encodeCancelProgressRequest(CancelProgressRequest.make({ waiterId })).pipe(\n Effect.mapError(() => undefined),\n Effect.flatMap((encoded) => call(threadId, \"cancelProgress\", encoded)),\n // Finalizers are uninterruptible; only the foreign RPC branch must remain\n // interruptible so a lost cancellation reply cannot prevent local shutdown.\n Effect.interruptible,\n Effect.timeout(PROGRESS_CANCELLATION_TIMEOUT),\n Effect.asVoid,\n Effect.ignore,\n );\n\n return CloudflareThreadClient.of({\n submit: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: DurableSubmitOptions,\n ) =>\n Effect.gen(function* () {\n // Client-side half of `DurableAgentRuntime.submit`'s input boundary: encode\n // through the Agent's input schema and prove the canonical persistence bounds.\n const encodedInput = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(\n Effect.mapError((cause) =>\n AgentInputError.make({ message: `Unable to encode Agent input: ${cause.message}` }),\n ),\n );\n\n const inputPayload = yield* Schema.decodeUnknownEffect(PersistedJson)(\n encodedInput,\n ).pipe(\n Effect.mapError(() =>\n AgentInputError.make({\n message: \"Agent input does not satisfy the canonical persistence bounds\",\n }),\n ),\n );\n\n const request = SubmitRequest.make({\n agentId: agent.definition.id,\n principal: options.principal,\n idempotencyKey: options.idempotencyKey,\n ...(options.admissionGroup === undefined\n ? {}\n : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined\n ? {}\n : { admissionFence: options.admissionFence }),\n ...(options.workerAdmission === undefined\n ? {}\n : { workerAdmission: options.workerAdmission }),\n ...(options.messageAdmission === undefined\n ? {}\n : { messageAdmission: options.messageAdmission }),\n definitions: options.definitions,\n inputPayload,\n });\n\n const encoded = yield* encodeSubmitRequest(request).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`submit request encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(options.threadId, \"submit\", encoded);\n\n const succeeded = yield* expect(\n options.threadId,\n \"submit\",\n SubmitSucceeded,\n ClientSubmitHostFailure,\n )(response);\n\n return succeeded.receipt;\n }),\n\n submissionStatus: (receipt) =>\n Effect.gen(function* () {\n const encoded = yield* encodeReceipt(receipt).pipe(\n Effect.mapError(() => HostProtocolError.make({ message: \"Invalid receipt\" })),\n );\n\n const response = yield* call(receipt.threadId, \"submissionStatus\", encoded);\n\n const result = yield* expect(\n receipt.threadId,\n \"submissionStatus\",\n SubmissionStatusResponse,\n ClientAwaitHostFailure,\n )(response);\n\n return result.status;\n }),\n awaitSettlement: (receipt) =>\n Effect.gen(function* () {\n const encoded = yield* encodeReceipt(receipt).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`receipt encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(receipt.threadId, \"awaitSettlement\", encoded);\n\n const settled = yield* expect(\n receipt.threadId,\n \"awaitSettlement\",\n SettlementReached,\n ClientAwaitHostFailure,\n )(response);\n\n return settled.settlement;\n }),\n\n awaitProgress: (threadId, afterSequence) =>\n Effect.gen(function* () {\n const waiterId = yield* crypto.randomUUIDv4.pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `awaitProgress cancellation identity generation failed: ${error.message}`,\n ),\n }),\n ),\n );\n\n const request = AwaitProgressRequest.make({ afterSequence, waiterId });\n\n const encoded = yield* encodeAwaitProgressRequest(request).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `awaitProgress request encode failed: ${error.message}`,\n ),\n }),\n ),\n );\n\n const attempt = (retry: number): Effect.Effect<void, ClientProgressFailure> =>\n call(threadId, \"awaitProgress\", encoded).pipe(\n Effect.flatMap(\n expect(threadId, \"awaitProgress\", ProgressObserved, ClientObserveHostFailure),\n ),\n Effect.asVoid,\n Effect.catchTag(\"ThreadClientError\", (error) =>\n error.retryable === true && error.overloaded !== true && retry < 5\n ? Effect.sleep(Duration.millis(10 * 2 ** retry)).pipe(\n Effect.andThen(attempt(retry + 1)),\n )\n : Effect.fail(error),\n ),\n );\n\n yield* attempt(0).pipe(Effect.onInterrupt(() => cancelProgress(threadId, waiterId)));\n }),\n\n readPage,\n\n readAll: (threadId) =>\n Effect.gen(function* () {\n const all: Array<CanonicalRecordEnvelope> = [];\n let after: CanonicalSequence | undefined;\n\n for (;;) {\n const page = yield* readPage(threadId, { afterSequence: after, limit: 1_024 });\n\n all.push(...page);\n const last = page.at(-1);\n\n if (page.length < 1_024 || last === undefined) return all;\n after = last.sequence;\n }\n }),\n\n abort: (threadId, command) =>\n Effect.gen(function* () {\n const encoded = yield* encodeAbortCommand(command).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`abort command encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"abort\", encoded);\n\n const recorded = yield* expect(\n threadId,\n \"abort\",\n AbortRecorded,\n ClientAbortHostFailure,\n )(response);\n\n return recorded.intent;\n }),\n\n resolveApproval: (threadId, command) =>\n Effect.gen(function* () {\n const encoded = yield* encodeApprovalDecisionCommand(command).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`approval command encode failed: ${error.message}`),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"resolveApproval\", encoded);\n\n const recorded = yield* expect(\n threadId,\n \"resolveApproval\",\n ApprovalRecorded,\n ClientApprovalHostFailure,\n )(response);\n\n return recorded.intent;\n }),\n\n resolveUnknown: (threadId, command) =>\n Effect.gen(function* () {\n const encoded = yield* encodeUnknownResolutionCommand(command).pipe(\n Effect.mapError((error) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(\n `resolution command encode failed: ${error.message}`,\n ),\n }),\n ),\n );\n\n const response = yield* call(threadId, \"resolveUnknown\", encoded);\n\n const recorded = yield* expect(\n threadId,\n \"resolveUnknown\",\n UnknownResolutionRecorded,\n ClientUnknownHostFailure,\n )(response);\n\n return recorded.intent;\n }),\n });\n }),\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { n as BrowserRunLifecycleOptions, r as BrowserRunSessionLifecycle, t as BrowserRunCleanupError } from "./browser-session-lifecycle-DJpqLXy_.mjs";
2
+ import { Context, Effect, Layer, Redacted, Schema, Scope } from "effect";
3
+ import { SandboxImplementation } from "@effect-agent/sandbox/Sandbox";
4
+ import { BrowserHandle, InteractiveBrowser, InteractiveBrowserError, InteractiveBrowserPolicy, InteractiveBrowserPolicyDeniedError } from "@effect-agent/sandbox/InteractiveBrowser";
5
+ //#region src/InteractiveBrowser.d.ts
6
+ declare const browserRunInteractiveImplementation: SandboxImplementation;
7
+ declare const BrowserRunViewport_base: Schema.Class<BrowserRunViewport, Schema.Struct<{
8
+ readonly width: Schema.Int;
9
+ readonly height: Schema.Int;
10
+ readonly deviceScaleFactor: Schema.optionalKey<Schema.Finite>;
11
+ }>, {}>;
12
+ /**
13
+ * Host presentation state in CSS pixels. Dimensions are integers in 1..2048,
14
+ * density is finite in 1..2 (default 1), and neither scaled dimension may exceed
15
+ * 2048 pixels. Mobile, touch, and orientation emulation are not supported.
16
+ */
17
+ declare class BrowserRunViewport extends BrowserRunViewport_base {}
18
+ declare const BrowserRunLiveViewRequest_base: Schema.Class<BrowserRunLiveViewRequest, Schema.Struct<{
19
+ readonly mode: Schema.Literal<"tab">;
20
+ readonly expiresInMs: Schema.Int;
21
+ }>, {}>;
22
+ /** Host-only request for a redacted Cloudflare Live View URL. */
23
+ declare class BrowserRunLiveViewRequest extends BrowserRunLiveViewRequest_base {}
24
+ declare const BrowserRunLiveViewResult_base: Schema.Class<BrowserRunLiveViewResult, Schema.Struct<{
25
+ readonly devtoolsFrontendUrl: Schema.Redacted<Schema.String>;
26
+ }>, {}>;
27
+ declare class BrowserRunLiveViewResult extends BrowserRunLiveViewResult_base {}
28
+ declare const BrowserRunHandoffRequest_base: Schema.Class<BrowserRunHandoffRequest, Schema.Struct<{
29
+ readonly instructions: Schema.String;
30
+ readonly timeout: Schema.Int;
31
+ }>, {}>;
32
+ /** Start one bounded handoff; controller ownership remains a consumer concern. */
33
+ declare class BrowserRunHandoffRequest extends BrowserRunHandoffRequest_base {}
34
+ declare const BrowserRunHandoffResult_base: Schema.Class<BrowserRunHandoffResult, Schema.Struct<{
35
+ readonly handoffId: Schema.Redacted<Schema.String>;
36
+ }>, {}>;
37
+ declare class BrowserRunHandoffResult extends BrowserRunHandoffResult_base {}
38
+ declare const BrowserRunHandoffState_base: Schema.Class<BrowserRunHandoffState, Schema.Struct<{
39
+ readonly active: Schema.Boolean;
40
+ readonly handoffId: Schema.optionalKey<Schema.Redacted<Schema.String>>;
41
+ readonly durationMs: Schema.optionalKey<Schema.Natural>;
42
+ }>, {}>;
43
+ declare class BrowserRunHandoffState extends BrowserRunHandoffState_base {}
44
+ /** One intercepted Puppeteer request, narrowed to the policy-relevant surface. */
45
+ interface BrowserRunInteractiveRequest {
46
+ readonly url: () => string;
47
+ readonly abort: () => Promise<void>;
48
+ readonly continue: () => Promise<void>;
49
+ }
50
+ type BrowserRunInteractiveRequestListener = (request: BrowserRunInteractiveRequest) => void;
51
+ type BrowserRunCloudflareCommand = "Cloudflare.getLiveView" | "Cloudflare.handoff" | "Cloudflare.getHandoffState";
52
+ /** Narrow CDP boundary for Cloudflare commands absent from the pinned protocol types. */
53
+ interface BrowserRunInteractiveCdpSession {
54
+ readonly send: (command: BrowserRunCloudflareCommand, parameters: unknown) => Promise<unknown>;
55
+ readonly detach: () => Promise<void>;
56
+ }
57
+ /** Narrow page boundary used by deterministic tests; SDK values remain in this package. */
58
+ interface BrowserRunInteractivePage {
59
+ readonly close: () => Promise<void>;
60
+ readonly setBypassServiceWorker: (enabled: boolean) => Promise<void>;
61
+ readonly setRequestInterception: (enabled: boolean) => Promise<void>;
62
+ readonly onRequest: (listener: BrowserRunInteractiveRequestListener) => void;
63
+ readonly offRequest: (listener: BrowserRunInteractiveRequestListener) => void;
64
+ readonly goto: (url: string) => Promise<void>;
65
+ readonly url: () => unknown;
66
+ readonly readText: (selector: string | undefined, maximumBytes: number) => Promise<unknown>;
67
+ readonly fill: (selector: string, value: string, signal: AbortSignal, onDispatch: () => void) => Promise<unknown>;
68
+ readonly click: (selector: string, signal: AbortSignal, onDispatch: () => void) => Promise<unknown>;
69
+ readonly screenshot: (fullPage: boolean) => Promise<unknown>;
70
+ readonly scroll: (deltaX: number, deltaY: number) => Promise<void>;
71
+ readonly setViewport: (viewport: BrowserRunViewport) => Promise<void>;
72
+ readonly createCdpSession: () => Promise<BrowserRunInteractiveCdpSession>;
73
+ }
74
+ interface BrowserRunInteractiveContext {
75
+ readonly newPage: () => Promise<BrowserRunInteractivePage>;
76
+ readonly close: () => Promise<void>;
77
+ }
78
+ interface BrowserRunInteractiveBrowser {
79
+ readonly createContext: () => Promise<BrowserRunInteractiveContext>;
80
+ readonly close: () => Promise<void>;
81
+ readonly sessionId: () => unknown;
82
+ readonly isConnected: () => boolean;
83
+ readonly onDisconnected: (listener: () => void) => void;
84
+ readonly offDisconnected: (listener: () => void) => void;
85
+ }
86
+ declare const BrowserRunInteractiveBinding_base: Context.ServiceClass<BrowserRunInteractiveBinding, "@effect-agent/platform-cloudflare/BrowserRunInteractiveBinding", {
87
+ readonly launch: (keepAliveMillis: number) => Promise<BrowserRunInteractiveBrowser>;
88
+ /** Success proves whole-browser termination or exact-session absence. */
89
+ readonly closeSession: (sessionId: Redacted.Redacted<string>) => Effect.Effect<void, InteractiveBrowserError>;
90
+ }>;
91
+ /** Host-supplied Browser Run binding projected into one fakeable launch operation. */
92
+ declare class BrowserRunInteractiveBinding extends BrowserRunInteractiveBinding_base {
93
+ static layer(options: {
94
+ readonly browser: BrowserRun;
95
+ readonly viewport?: BrowserRunViewport;
96
+ }): Layer.Layer<BrowserRunInteractiveBinding, InteractiveBrowserPolicyDeniedError, BrowserRunSessionLifecycle>;
97
+ }
98
+ interface BrowserRunInteractiveSession {
99
+ readonly handle: BrowserHandle;
100
+ readonly sessionId: Redacted.Redacted<string>;
101
+ /**
102
+ * Resize without charging an agent action or changing emulation modes. Shares
103
+ * the handle's fail-fast lock, page-policy preflight, and elapsed deadline.
104
+ * A timeout or interruption leaves the session unusable; no resize is retried.
105
+ * The host must authorize callers. No viewer ownership or durable state is added.
106
+ */
107
+ readonly resizeViewport: (viewport: BrowserRunViewport) => Effect.Effect<void, InteractiveBrowserError>;
108
+ readonly getLiveView: (request: BrowserRunLiveViewRequest) => Effect.Effect<BrowserRunLiveViewResult, InteractiveBrowserError>;
109
+ readonly handoff: (request: BrowserRunHandoffRequest) => Effect.Effect<BrowserRunHandoffResult, InteractiveBrowserError>;
110
+ readonly getHandoffState: Effect.Effect<BrowserRunHandoffState, InteractiveBrowserError>;
111
+ readonly close: Effect.Effect<void, InteractiveBrowserError>;
112
+ }
113
+ declare const BrowserRunInteractiveHost_base: Context.ServiceClass<BrowserRunInteractiveHost, "@effect-agent/platform-cloudflare/BrowserRunInteractiveHost", {
114
+ readonly cleanupSemantics?: "confirmed-terminal";
115
+ readonly open: (policy: InteractiveBrowserPolicy) => Effect.Effect<BrowserRunInteractiveSession, InteractiveBrowserError, Scope.Scope>;
116
+ readonly closeSession: (sessionId: Redacted.Redacted<string>) => Effect.Effect<void, InteractiveBrowserError>;
117
+ }>;
118
+ /** Cloudflare host authority kept separate from the provider-neutral browser handle. */
119
+ declare class BrowserRunInteractiveHost extends BrowserRunInteractiveHost_base {}
120
+ /** Recognizes a local pre-dispatch refusal without exposing selector or page content. */
121
+ declare const isBrowserRunUndispatchedActionError: (error: unknown) => boolean;
122
+ /** Cloudflare host controls and private session identity for one scoped Browser Run pass. */
123
+ declare const browserRunInteractiveHostLayer: () => Layer.Layer<BrowserRunInteractiveHost, never, BrowserRunInteractiveBinding>;
124
+ /** Worker-only generic adapter; Cloudflare identity and controls remain host-only. */
125
+ declare const browserRunInteractiveLayer: () => Layer.Layer<InteractiveBrowser, never, BrowserRunInteractiveBinding>;
126
+ /** Resolved Worker binding, cleanup credentials, and optional initial viewport. */
127
+ interface CloudflareInteractiveBrowserOptions extends BrowserRunLifecycleOptions {
128
+ readonly browser: BrowserRun;
129
+ readonly viewport?: BrowserRunViewport;
130
+ }
131
+ /** Worker-only assembly; importing ordinary capture never loads Puppeteer. */
132
+ declare const CloudflareInteractiveBrowser: {
133
+ /**
134
+ * Assemble binding, confirmed-session cleanup, and the generic browser service.
135
+ * HttpClient and construction errors remain visible. Opening a pass still requires
136
+ * an explicit policy and Scope; no browser is launched during Layer construction.
137
+ */
138
+ layer: (options: CloudflareInteractiveBrowserOptions) => Layer.Layer<InteractiveBrowser, BrowserRunCleanupError | InteractiveBrowserPolicyDeniedError, import("effect/unstable/http/HttpClient").HttpClient>;
139
+ /** Opt into private host controls instead of exposing them through the generic service. */
140
+ hostLayer: (options: CloudflareInteractiveBrowserOptions) => Layer.Layer<BrowserRunInteractiveHost, BrowserRunCleanupError | InteractiveBrowserPolicyDeniedError, import("effect/unstable/http/HttpClient").HttpClient>;
141
+ };
142
+ //#endregion
143
+ export { BrowserRunCleanupError, BrowserRunCloudflareCommand, BrowserRunHandoffRequest, BrowserRunHandoffResult, BrowserRunHandoffState, BrowserRunInteractiveBinding, BrowserRunInteractiveBrowser, BrowserRunInteractiveCdpSession, BrowserRunInteractiveContext, BrowserRunInteractiveHost, BrowserRunInteractivePage, BrowserRunInteractiveRequest, BrowserRunInteractiveRequestListener, BrowserRunInteractiveSession, BrowserRunLiveViewRequest, BrowserRunLiveViewResult, BrowserRunSessionLifecycle, BrowserRunViewport, CloudflareInteractiveBrowser, CloudflareInteractiveBrowserOptions, browserRunInteractiveHostLayer, browserRunInteractiveImplementation, browserRunInteractiveLayer, isBrowserRunUndispatchedActionError };
144
+ //# sourceMappingURL=InteractiveBrowser.d.mts.map