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

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 +184 -0
  2. package/dist/Alarm.mjs +451 -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-BpwkEc5E.mjs +836 -0
  47. package/dist/ThreadObject-BpwkEc5E.mjs.map +1 -0
  48. package/dist/ThreadObject-NbFOWK1I.d.mts +816 -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 +967 -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,389 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
+ import { CloudflareThreadClient } from "./CloudflareThreadClient.mjs";
3
+ import { n as cloudflareScheduledInputAdmissionLayer, t as cloudflarePreparedInputAdmissionLayer } from "./prepared-admission-DSi55W-7.mjs";
4
+ import { AgentId } from "@effect-agent/core/Identifiers";
5
+ import "@effect-agent/thread/DurableAgentRuntime";
6
+ import { AdmissionFence } from "@effect-agent/thread/SubmissionLedger";
7
+ import { Clock, Context, DateTime, Effect, Layer, Schema } from "effect";
8
+ import { DefinitionDigests, PersistedJson } from "@effect-agent/thread/Records";
9
+ import { DurableObject, DurableObjectAlarm, DurableObjectState } from "effect-cf";
10
+ import { DoScheduleAlarmControl, DoScheduleTransaction, scheduleStoreLayer } from "@effect-agent/storage-cloudflare/DoScheduleStore";
11
+ import { ScheduleAuthorizationError, ScheduleCapacityError, ScheduleConflict, ScheduleDestination, ScheduleFailpointError, ScheduleId, ScheduleNotFound, ScheduleOwner, ScheduleScope, ScheduleSnapshot, ScheduleSnapshotPage, ScheduleStorageError, ScheduleTimingRequest, ScheduleValidationError, defaultSchedulingLimits } from "@effect-agent/thread/Schedule";
12
+ import { scheduleOwnerKey } from "@effect-agent/thread/ScheduleTransition";
13
+ import { ScheduleDriver, ScheduleWakeNoop, Scheduling } from "@effect-agent/thread/Scheduling";
14
+ import { BrowserCrypto } from "@effect/platform-browser";
15
+ import { SqliteClient } from "@effect/sql-sqlite-do";
16
+ //#region src/CloudflareScheduling.ts
17
+ var CloudflareScheduling_exports = /* @__PURE__ */ __exportAll({
18
+ CloudflareSchedulingClient: () => CloudflareSchedulingClient,
19
+ ScheduleAlarmProtocolError: () => ScheduleAlarmProtocolError,
20
+ ScheduleOwnerIdentity: () => ScheduleOwnerIdentity,
21
+ ScheduleOwnerNamespace: () => ScheduleOwnerNamespace,
22
+ ScheduleOwnerProtocolError: () => ScheduleOwnerProtocolError,
23
+ makeScheduleOwnerObjectClass: () => makeScheduleOwnerObjectClass,
24
+ scheduleAlarmHandler: () => scheduleAlarmHandler
25
+ });
26
+ const SCHEDULE_ALARM_TAG = "effect-agent/ScheduleOwnerWake";
27
+ const SCHEDULE_ALARM_ID = "driver";
28
+ const ScheduleAlarmPayload = Schema.Struct({
29
+ schemaVersion: Schema.Literal(1),
30
+ generation: Schema.Int.check(Schema.isGreaterThan(0))
31
+ });
32
+ var ScheduleAlarmProtocolError = class extends Schema.TaggedError()("ScheduleAlarmProtocolError", { message: Schema.String }) {};
33
+ const boundedProtocolMessage = (message) => message.length <= 4096 ? message : `${message.slice(0, 4093)}...`;
34
+ var ScheduleOwnerProtocolError = class extends Schema.TaggedError()("ScheduleOwnerProtocolError", { message: Schema.String.check(Schema.isMaxLength(4096)) }) {};
35
+ const ScheduleMutationRequestFields = {
36
+ schemaVersion: Schema.Literal(1),
37
+ agentId: AgentId,
38
+ input: PersistedJson,
39
+ scope: ScheduleScope,
40
+ scheduleId: ScheduleId,
41
+ timing: ScheduleTimingRequest,
42
+ destination: ScheduleDestination,
43
+ deliveryPrincipal: ScheduleScope.fields.principal,
44
+ definitions: DefinitionDigests,
45
+ admissionGroup: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(256))),
46
+ admissionFence: Schema.optionalKey(AdmissionFence)
47
+ };
48
+ const ScheduleCreateRequest = Schema.TaggedStruct("Create", ScheduleMutationRequestFields);
49
+ const ScheduleUpdateRequest = Schema.TaggedStruct("Update", {
50
+ ...ScheduleMutationRequestFields,
51
+ expectedRevision: Schema.Int.check(Schema.isGreaterThan(0))
52
+ });
53
+ const ScheduleGetRequest = Schema.TaggedStruct("Get", {
54
+ schemaVersion: Schema.Literal(1),
55
+ scope: ScheduleScope,
56
+ scheduleId: ScheduleId
57
+ });
58
+ const ScheduleListRequest = Schema.TaggedStruct("List", {
59
+ schemaVersion: Schema.Literal(1),
60
+ scope: ScheduleScope,
61
+ after: Schema.optionalKey(ScheduleId),
62
+ limit: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(100)))
63
+ });
64
+ const ScheduleControlRequest = Schema.TaggedStruct("Control", {
65
+ schemaVersion: Schema.Literal(1),
66
+ operation: Schema.Literals([
67
+ "pause",
68
+ "resume",
69
+ "cancel"
70
+ ]),
71
+ scope: ScheduleScope,
72
+ scheduleId: ScheduleId,
73
+ expectedRevision: Schema.Int.check(Schema.isGreaterThan(0))
74
+ });
75
+ const ScheduleRecoverRequest = Schema.TaggedStruct("Recover", {
76
+ schemaVersion: Schema.Literal(1),
77
+ scope: ScheduleScope,
78
+ scheduleId: ScheduleId,
79
+ expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),
80
+ expectedGeneration: Schema.Natural
81
+ });
82
+ const ScheduleOwnerRequest = Schema.Union([
83
+ ScheduleRecoverRequest,
84
+ ScheduleCreateRequest,
85
+ ScheduleUpdateRequest,
86
+ ScheduleGetRequest,
87
+ ScheduleListRequest,
88
+ ScheduleControlRequest
89
+ ]);
90
+ const ScheduleOwnerFailure = Schema.Union([
91
+ ScheduleValidationError,
92
+ ScheduleAuthorizationError,
93
+ ScheduleConflict,
94
+ ScheduleNotFound,
95
+ ScheduleCapacityError,
96
+ ScheduleStorageError,
97
+ ScheduleFailpointError,
98
+ ScheduleOwnerProtocolError
99
+ ]);
100
+ const ScheduleOwnerResponse = Schema.Union([
101
+ Schema.TaggedStruct("Snapshot", { value: ScheduleSnapshot }),
102
+ Schema.TaggedStruct("Page", { value: ScheduleSnapshotPage }),
103
+ Schema.TaggedStruct("Failed", { failure: ScheduleOwnerFailure })
104
+ ]);
105
+ const decodeScheduleOwnerRequest = Schema.decodeUnknownEffect(ScheduleOwnerRequest);
106
+ const encodeScheduleOwnerRequest = Schema.encodeEffect(ScheduleOwnerRequest);
107
+ const decodeScheduleOwnerResponse = Schema.decodeUnknownEffect(ScheduleOwnerResponse);
108
+ const encodeScheduleOwnerResponse = Schema.encodeEffect(ScheduleOwnerResponse);
109
+ const scheduleProtocolFailure = (message) => ({
110
+ _tag: "Failed",
111
+ failure: ScheduleOwnerProtocolError.make({ message: boundedProtocolMessage(message) })
112
+ });
113
+ var ScheduleOwnerNamespace = class extends Context.Service()("@effect-agent/platform-cloudflare/ScheduleOwnerNamespace") {};
114
+ const passthroughAgent = (agentId) => ({ definition: {
115
+ id: agentId,
116
+ input: PersistedJson
117
+ } });
118
+ const requestOwner = (request) => request.scope.owner;
119
+ /** Provides the same authorized management service as NodeScheduling.layer. */
120
+ var CloudflareSchedulingClient = class {
121
+ static layer = Layer.effect(Scheduling, Effect.gen(function* () {
122
+ const { namespace } = yield* ScheduleOwnerNamespace;
123
+ const call = Effect.fn("CloudflareSchedulingClient.call")(function* (owner, request) {
124
+ const encoded = yield* encodeScheduleOwnerRequest(request).pipe(Effect.mapError(() => ScheduleStorageError.make({
125
+ operation: "Schedule Owner protocol",
126
+ reason: "corrupt"
127
+ })));
128
+ const raw = yield* Effect.tryPromise({
129
+ try: () => namespace.get(namespace.idFromName(scheduleOwnerKey(owner))).schedule(encoded),
130
+ catch: () => ScheduleStorageError.make({
131
+ operation: "call Schedule Owner",
132
+ reason: "unavailable"
133
+ })
134
+ });
135
+ const response = yield* decodeScheduleOwnerResponse(raw).pipe(Effect.mapError(() => ScheduleStorageError.make({
136
+ operation: "Schedule Owner protocol",
137
+ reason: "corrupt"
138
+ })));
139
+ if (response._tag !== "Failed") return response;
140
+ return yield* response.failure._tag === "ScheduleOwnerProtocolError" ? ScheduleStorageError.make({
141
+ operation: "Schedule Owner protocol",
142
+ reason: "corrupt"
143
+ }) : response.failure;
144
+ });
145
+ const encodeInput = Effect.fn("CloudflareSchedulingClient.encodeInput")(function* (agent, input) {
146
+ const encoded = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(Effect.mapError(() => ScheduleValidationError.make({ message: "Unable to encode Agent input" })));
147
+ return yield* Schema.decodeUnknownEffect(PersistedJson)(encoded).pipe(Effect.mapError(() => ScheduleValidationError.make({ message: "Agent input does not satisfy the canonical persistence bounds" })));
148
+ });
149
+ const create = (agent, input, options) => Effect.gen(function* () {
150
+ const payload = yield* encodeInput(agent, input);
151
+ const response = yield* call(options.scope.owner, {
152
+ _tag: "Create",
153
+ schemaVersion: 1,
154
+ agentId: agent.definition.id,
155
+ input: payload,
156
+ ...options
157
+ });
158
+ return response._tag === "Snapshot" ? response.value : yield* ScheduleStorageError.make({
159
+ operation: "Schedule Owner protocol",
160
+ reason: "corrupt"
161
+ });
162
+ });
163
+ const update = (agent, input, options) => Effect.gen(function* () {
164
+ const payload = yield* encodeInput(agent, input);
165
+ const response = yield* call(options.scope.owner, {
166
+ _tag: "Update",
167
+ schemaVersion: 1,
168
+ agentId: agent.definition.id,
169
+ input: payload,
170
+ ...options
171
+ });
172
+ return response._tag === "Snapshot" ? response.value : yield* ScheduleStorageError.make({
173
+ operation: "Schedule Owner protocol",
174
+ reason: "corrupt"
175
+ });
176
+ });
177
+ const get = (scope, scheduleId) => Effect.gen(function* () {
178
+ const response = yield* call(scope.owner, {
179
+ _tag: "Get",
180
+ schemaVersion: 1,
181
+ scope,
182
+ scheduleId
183
+ });
184
+ return response._tag === "Snapshot" ? response.value : yield* ScheduleStorageError.make({
185
+ operation: "Schedule Owner protocol",
186
+ reason: "corrupt"
187
+ });
188
+ });
189
+ const list = (scope, options = {}) => Effect.gen(function* () {
190
+ const response = yield* call(scope.owner, {
191
+ _tag: "List",
192
+ schemaVersion: 1,
193
+ scope,
194
+ ...options.after === void 0 ? {} : { after: options.after },
195
+ ...options.limit === void 0 ? {} : { limit: options.limit }
196
+ });
197
+ return response._tag === "Page" ? response.value : yield* ScheduleStorageError.make({
198
+ operation: "Schedule Owner protocol",
199
+ reason: "corrupt"
200
+ });
201
+ });
202
+ const control = (operation, scope, scheduleId, expectedRevision) => Effect.gen(function* () {
203
+ const response = yield* call(scope.owner, {
204
+ _tag: "Control",
205
+ schemaVersion: 1,
206
+ operation,
207
+ scope,
208
+ scheduleId,
209
+ expectedRevision
210
+ });
211
+ return response._tag === "Snapshot" ? response.value : yield* ScheduleStorageError.make({
212
+ operation: "Schedule Owner protocol",
213
+ reason: "corrupt"
214
+ });
215
+ });
216
+ return Scheduling.of({
217
+ create,
218
+ update,
219
+ get,
220
+ list,
221
+ pause: (scope, id, revision) => control("pause", scope, id, revision),
222
+ resume: (scope, id, revision) => control("resume", scope, id, revision),
223
+ recover: (scope, scheduleId, expectedRevision, expectedGeneration) => Effect.gen(function* () {
224
+ const response = yield* call(scope.owner, {
225
+ _tag: "Recover",
226
+ schemaVersion: 1,
227
+ scope,
228
+ scheduleId,
229
+ expectedRevision,
230
+ expectedGeneration
231
+ });
232
+ return response._tag === "Snapshot" ? response.value : yield* ScheduleStorageError.make({
233
+ operation: "Schedule Owner protocol",
234
+ reason: "corrupt"
235
+ });
236
+ }),
237
+ cancel: (scope, id, revision) => control("cancel", scope, id, revision)
238
+ });
239
+ }));
240
+ };
241
+ var ScheduleOwnerIdentity = class extends Context.Service()("@effect-agent/platform-cloudflare/ScheduleOwnerIdentity") {};
242
+ const decodeOwnerName = Effect.fn("decodeScheduleOwnerName")(function* (name) {
243
+ if (name === null || name === void 0) return yield* ScheduleOwnerProtocolError.make({ message: "Schedule Owner objects require an idFromName identity" });
244
+ const tuple = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Tuple([Schema.String, Schema.String])))(name).pipe(Effect.mapError(() => ScheduleOwnerProtocolError.make({ message: "Schedule Owner object name is malformed" })));
245
+ return yield* Schema.decodeUnknownEffect(ScheduleOwner)({
246
+ tenantId: tuple[0],
247
+ ownerId: tuple[1]
248
+ }).pipe(Effect.mapError(() => ScheduleOwnerProtocolError.make({ message: "Schedule Owner object identity is invalid" })));
249
+ });
250
+ const alarmStorageError = (operation) => (error) => ScheduleStorageError.make({
251
+ operation,
252
+ reason: error._tag === "StorageOperationError" ? "unavailable" : "corrupt"
253
+ });
254
+ const transactionLayer = Layer.effect(DoScheduleTransaction, Effect.gen(function* () {
255
+ const alarms = yield* DurableObjectAlarm.DurableObjectAlarm;
256
+ return DoScheduleTransaction.of({ run: (body) => Effect.gen(function* () {
257
+ const nowMillis = yield* Clock.currentTimeMillis;
258
+ return yield* alarms.transaction((transaction) => body((replacement) => replacement.deadlineAtMillis === null ? transaction.cancelAlarm({
259
+ id: SCHEDULE_ALARM_ID,
260
+ tag: SCHEDULE_ALARM_TAG
261
+ }).pipe(Effect.mapError(alarmStorageError("cancel Schedule Owner alarm"))) : Effect.fromOption(DateTime.make(Math.max(replacement.deadlineAtMillis, nowMillis + 1))).pipe(Effect.mapError(() => ScheduleStorageError.make({
262
+ operation: "validate Schedule Owner alarm deadline",
263
+ reason: "corrupt"
264
+ })), Effect.flatMap((runAt) => transaction.scheduleAlarm({
265
+ id: SCHEDULE_ALARM_ID,
266
+ tag: SCHEDULE_ALARM_TAG,
267
+ runAt,
268
+ payload: {
269
+ schemaVersion: 1,
270
+ generation: replacement.generation
271
+ }
272
+ }).pipe(Effect.mapError(alarmStorageError("schedule Schedule Owner alarm"))))))).pipe(Effect.catchTag("StorageOperationError", () => ScheduleStorageError.make({
273
+ operation: "commit Schedule Owner transaction",
274
+ reason: "unavailable"
275
+ })));
276
+ }) });
277
+ }));
278
+ const ensureOwner = (expected, request) => {
279
+ const observed = requestOwner(request);
280
+ return observed.tenantId === expected.tenantId && observed.ownerId === expected.ownerId ? Effect.void : Effect.fail(ScheduleOwnerProtocolError.make({ message: "The request owner does not match the addressed Schedule Owner object" }));
281
+ };
282
+ const handleScheduleRequest = Effect.fn("ScheduleOwner.handleRequest")(function* (encoded) {
283
+ const decoded = yield* decodeScheduleOwnerRequest(encoded).pipe(Effect.result);
284
+ if (decoded._tag === "Failure") return yield* encodeScheduleOwnerResponse(scheduleProtocolFailure("The Schedule request could not be decoded")).pipe(Effect.orDie);
285
+ const request = decoded.success;
286
+ const { owner } = yield* ScheduleOwnerIdentity;
287
+ const scheduling = yield* Scheduling;
288
+ const response = yield* Effect.gen(function* () {
289
+ yield* ensureOwner(owner, request);
290
+ switch (request._tag) {
291
+ case "Create": return {
292
+ _tag: "Snapshot",
293
+ value: yield* scheduling.create(passthroughAgent(request.agentId), request.input, {
294
+ scope: request.scope,
295
+ scheduleId: request.scheduleId,
296
+ timing: request.timing,
297
+ destination: request.destination,
298
+ deliveryPrincipal: request.deliveryPrincipal,
299
+ definitions: request.definitions,
300
+ ...request.admissionGroup === void 0 ? {} : { admissionGroup: request.admissionGroup },
301
+ ...request.admissionFence === void 0 ? {} : { admissionFence: request.admissionFence }
302
+ })
303
+ };
304
+ case "Update": return {
305
+ _tag: "Snapshot",
306
+ value: yield* scheduling.update(passthroughAgent(request.agentId), request.input, {
307
+ scope: request.scope,
308
+ scheduleId: request.scheduleId,
309
+ timing: request.timing,
310
+ destination: request.destination,
311
+ deliveryPrincipal: request.deliveryPrincipal,
312
+ definitions: request.definitions,
313
+ ...request.admissionGroup === void 0 ? {} : { admissionGroup: request.admissionGroup },
314
+ ...request.admissionFence === void 0 ? {} : { admissionFence: request.admissionFence },
315
+ expectedRevision: request.expectedRevision
316
+ })
317
+ };
318
+ case "Get": return {
319
+ _tag: "Snapshot",
320
+ value: yield* scheduling.get(request.scope, request.scheduleId)
321
+ };
322
+ case "List": return {
323
+ _tag: "Page",
324
+ value: yield* scheduling.list(request.scope, {
325
+ ...request.after === void 0 ? {} : { after: request.after },
326
+ ...request.limit === void 0 ? {} : { limit: request.limit }
327
+ })
328
+ };
329
+ case "Recover": return {
330
+ _tag: "Snapshot",
331
+ value: yield* scheduling.recover(request.scope, request.scheduleId, request.expectedRevision, request.expectedGeneration)
332
+ };
333
+ case "Control": return {
334
+ _tag: "Snapshot",
335
+ value: request.operation === "pause" ? yield* scheduling.pause(request.scope, request.scheduleId, request.expectedRevision) : request.operation === "resume" ? yield* scheduling.resume(request.scope, request.scheduleId, request.expectedRevision) : yield* scheduling.cancel(request.scope, request.scheduleId, request.expectedRevision)
336
+ };
337
+ }
338
+ }).pipe(Effect.map((value) => value), Effect.catch((failure) => Schema.is(ScheduleOwnerFailure)(failure) ? Effect.succeed({
339
+ _tag: "Failed",
340
+ failure
341
+ }) : Effect.succeed(scheduleProtocolFailure("The Schedule operation failed outside its public contract"))));
342
+ return yield* encodeScheduleOwnerResponse(response).pipe(Effect.orDie);
343
+ });
344
+ /** @internal The complete native alarm operation, including its event deadline. */
345
+ const scheduleAlarmHandler = (limits) => DurableObjectAlarm.processDue((event) => Effect.gen(function* () {
346
+ if (event.tag !== SCHEDULE_ALARM_TAG || event.id !== SCHEDULE_ALARM_ID) return yield* ScheduleAlarmProtocolError.make({ message: `Unsupported Schedule Owner alarm ${event.tag}/${event.id}` });
347
+ yield* Schema.decodeUnknownEffect(ScheduleAlarmPayload)(event.payload).pipe(Effect.mapError(() => ScheduleAlarmProtocolError.make({ message: "Unsupported Schedule Owner alarm payload version" })));
348
+ const scheduling = yield* ScheduleDriver;
349
+ const alarmControl = yield* DoScheduleAlarmControl;
350
+ const { owner } = yield* ScheduleOwnerIdentity;
351
+ const nowMillis = yield* Clock.currentTimeMillis;
352
+ yield* alarmControl.prearm(nowMillis + limits.recoveryPollMillis);
353
+ if ((yield* scheduling.runDue(owner)).failed > 0) yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.recoveryPollMillis);
354
+ else yield* alarmControl.reconcile;
355
+ }), { mode: "ordered" }).pipe(Effect.timeout("14 minutes"), Effect.asVoid);
356
+ /**
357
+ * The host Layer supplies authorization and routing and is cached for the object incarnation.
358
+ * Cloudflare eviction does not guarantee its finalizers run. Do not acquire resources requiring
359
+ * cleanup in this Layer; acquire them inside scoped `manage` / `prepare` operations instead.
360
+ * Native services belong to effect-cf; the database and alarm runtime remain instance-owned.
361
+ */
362
+ const makeScheduleOwnerObjectClass = (host, limits = defaultSchedulingLimits) => {
363
+ const ownerLayer = Layer.effect(ScheduleOwnerIdentity, Effect.gen(function* () {
364
+ const state = yield* DurableObjectState.DurableObjectState;
365
+ return ScheduleOwnerIdentity.of({ owner: yield* decodeOwnerName(state.raw.id.name) });
366
+ }));
367
+ const sqlLayer = Layer.unwrap(Effect.map(DurableObjectState.DurableObjectState, (state) => SqliteClient.layer({ storage: state.raw.storage })));
368
+ const application = Layer.merge(Scheduling.layer(limits), ScheduleDriver.layer(limits)).pipe(Layer.provideMerge(scheduleStoreLayer.pipe(Layer.provide(transactionLayer), Layer.provide(sqlLayer))), Layer.provide(cloudflareScheduledInputAdmissionLayer.pipe(Layer.provide(cloudflarePreparedInputAdmissionLayer), Layer.provide(CloudflareThreadClient.layer))), Layer.provide(ScheduleWakeNoop), Layer.provide(BrowserCrypto.layer), Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer), Layer.provide(host), Layer.provideMerge(ownerLayer));
369
+ const runtime = Layer.effectContext(Effect.gen(function* () {
370
+ const state = yield* DurableObjectState.DurableObjectState;
371
+ const scope = yield* Effect.scope;
372
+ return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));
373
+ }));
374
+ const Base = DurableObject.make(runtime, {
375
+ initialize: Effect.void,
376
+ rpc: { schedule: (encoded) => handleScheduleRequest(encoded) },
377
+ alarms: scheduleAlarmHandler(limits)
378
+ });
379
+ class ScheduleOwnerObject extends Base {
380
+ alarm(alarmInfo) {
381
+ return super.alarm?.(alarmInfo);
382
+ }
383
+ }
384
+ return ScheduleOwnerObject;
385
+ };
386
+ //#endregion
387
+ export { CloudflareSchedulingClient, ScheduleAlarmProtocolError, ScheduleOwnerIdentity, ScheduleOwnerNamespace, ScheduleOwnerProtocolError, makeScheduleOwnerObjectClass, scheduleAlarmHandler, CloudflareScheduling_exports as t };
388
+
389
+ //# sourceMappingURL=CloudflareScheduling.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareScheduling.mjs","names":["ScheduleScopeSchema","ScheduleSnapshotPageSchema","EffectCfDurableObjectState","EffectCfDurableObject"],"sources":["../src/CloudflareScheduling.ts"],"sourcesContent":["import { AgentId } from \"@effect-agent/core/Identifiers\";\nimport {\n DoScheduleAlarmControl,\n DoScheduleTransaction,\n scheduleStoreLayer,\n} from \"@effect-agent/storage-cloudflare/DoScheduleStore\";\nimport { type DurableSubmitAgent } from \"@effect-agent/thread/DurableAgentRuntime\";\nimport { DefinitionDigests, PersistedJson } from \"@effect-agent/thread/Records\";\nimport {\n ScheduleAuthorizationError,\n type ScheduleAuthorizer,\n ScheduleCapacityError,\n ScheduleConflict,\n ScheduleDestination,\n ScheduleFailpointError,\n ScheduleId,\n type SchedulingLimits,\n ScheduleNotFound,\n ScheduleOwner,\n type ScheduleScope,\n ScheduleScope as ScheduleScopeSchema,\n ScheduleSnapshot,\n ScheduleSnapshotPage as ScheduleSnapshotPageSchema,\n ScheduleStorageError,\n ScheduleTimingRequest,\n ScheduleValidationError,\n defaultSchedulingLimits,\n} from \"@effect-agent/thread/Schedule\";\nimport { scheduleOwnerKey } from \"@effect-agent/thread/ScheduleTransition\";\nimport {\n Scheduling,\n ScheduleDriver,\n type ScheduleManagementFailure,\n ScheduleWakeNoop,\n} from \"@effect-agent/thread/Scheduling\";\nimport { AdmissionFence } from \"@effect-agent/thread/SubmissionLedger\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport { Clock, Context, DateTime, Effect, Layer, Schema } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectAlarm,\n DurableObjectState as EffectCfDurableObjectState,\n type WorkerEnvironment,\n} from \"effect-cf\";\n\nimport type { ThreadObjectNamespace } from \"./CloudflareBindings.ts\";\nimport { CloudflareThreadClient } from \"./CloudflareThreadClient.ts\";\nimport {\n cloudflarePreparedInputAdmissionLayer,\n cloudflareScheduledInputAdmissionLayer,\n} from \"./internal/prepared-admission.ts\";\n\nconst SCHEDULE_ALARM_TAG = \"effect-agent/ScheduleOwnerWake\";\nconst SCHEDULE_ALARM_ID = \"driver\";\n\nconst ScheduleAlarmPayload = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n generation: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nexport class ScheduleAlarmProtocolError extends Schema.TaggedError<ScheduleAlarmProtocolError>()(\n \"ScheduleAlarmProtocolError\",\n { message: Schema.String },\n) {}\n\nconst boundedProtocolMessage = (message: string): string =>\n message.length <= 4_096 ? message : `${message.slice(0, 4_093)}...`;\n\nexport class ScheduleOwnerProtocolError extends Schema.TaggedError<ScheduleOwnerProtocolError>()(\n \"ScheduleOwnerProtocolError\",\n { message: Schema.String.check(Schema.isMaxLength(4_096)) },\n) {}\n\nconst ScheduleMutationRequestFields = {\n schemaVersion: Schema.Literal(1),\n agentId: AgentId,\n input: PersistedJson,\n scope: ScheduleScopeSchema,\n scheduleId: ScheduleId,\n timing: ScheduleTimingRequest,\n destination: ScheduleDestination,\n deliveryPrincipal: ScheduleScopeSchema.fields.principal,\n definitions: DefinitionDigests,\n admissionGroup: Schema.optionalKey(Schema.NonEmptyString.check(Schema.isMaxLength(256))),\n admissionFence: Schema.optionalKey(AdmissionFence),\n};\n\nconst ScheduleCreateRequest = Schema.TaggedStruct(\"Create\", ScheduleMutationRequestFields);\n\nconst ScheduleUpdateRequest = Schema.TaggedStruct(\"Update\", {\n ...ScheduleMutationRequestFields,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nconst ScheduleGetRequest = Schema.TaggedStruct(\"Get\", {\n schemaVersion: Schema.Literal(1),\n scope: ScheduleScopeSchema,\n scheduleId: ScheduleId,\n});\n\nconst ScheduleListRequest = Schema.TaggedStruct(\"List\", {\n schemaVersion: Schema.Literal(1),\n scope: ScheduleScopeSchema,\n after: Schema.optionalKey(ScheduleId),\n limit: Schema.optionalKey(\n Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(100)),\n ),\n});\n\nconst ScheduleControlRequest = Schema.TaggedStruct(\"Control\", {\n schemaVersion: Schema.Literal(1),\n operation: Schema.Literals([\"pause\", \"resume\", \"cancel\"]),\n scope: ScheduleScopeSchema,\n scheduleId: ScheduleId,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n});\n\nconst ScheduleRecoverRequest = Schema.TaggedStruct(\"Recover\", {\n schemaVersion: Schema.Literal(1),\n scope: ScheduleScopeSchema,\n scheduleId: ScheduleId,\n expectedRevision: Schema.Int.check(Schema.isGreaterThan(0)),\n expectedGeneration: Schema.Natural,\n});\n\nconst ScheduleOwnerRequest = Schema.Union([\n ScheduleRecoverRequest,\n ScheduleCreateRequest,\n ScheduleUpdateRequest,\n ScheduleGetRequest,\n ScheduleListRequest,\n ScheduleControlRequest,\n]);\n\ntype ScheduleOwnerRequest = typeof ScheduleOwnerRequest.Type;\n\nconst ScheduleOwnerFailure = Schema.Union([\n ScheduleValidationError,\n ScheduleAuthorizationError,\n ScheduleConflict,\n ScheduleNotFound,\n ScheduleCapacityError,\n ScheduleStorageError,\n ScheduleFailpointError,\n ScheduleOwnerProtocolError,\n]);\n\ntype ScheduleOwnerFailure = typeof ScheduleOwnerFailure.Type;\n\nconst ScheduleOwnerResponse = Schema.Union([\n Schema.TaggedStruct(\"Snapshot\", { value: ScheduleSnapshot }),\n Schema.TaggedStruct(\"Page\", { value: ScheduleSnapshotPageSchema }),\n Schema.TaggedStruct(\"Failed\", { failure: ScheduleOwnerFailure }),\n]);\n\ntype ScheduleOwnerResponse = typeof ScheduleOwnerResponse.Type;\n\nconst decodeScheduleOwnerRequest = Schema.decodeUnknownEffect(ScheduleOwnerRequest);\nconst encodeScheduleOwnerRequest = Schema.encodeEffect(ScheduleOwnerRequest);\nconst decodeScheduleOwnerResponse = Schema.decodeUnknownEffect(ScheduleOwnerResponse);\nconst encodeScheduleOwnerResponse = Schema.encodeEffect(ScheduleOwnerResponse);\n\nconst scheduleProtocolFailure = (message: string): ScheduleOwnerResponse => ({\n _tag: \"Failed\",\n failure: ScheduleOwnerProtocolError.make({ message: boundedProtocolMessage(message) }),\n});\n\nexport interface ScheduleOwnerObjectRpc extends Rpc.DurableObjectBranded {\n schedule(encoded: unknown): Promise<unknown>;\n}\n\nexport class ScheduleOwnerNamespace extends Context.Service<\n ScheduleOwnerNamespace,\n { readonly namespace: DurableObjectNamespace<ScheduleOwnerObjectRpc> }\n>()(\"@effect-agent/platform-cloudflare/ScheduleOwnerNamespace\") {}\n\nconst passthroughAgent = (agentId: AgentId): DurableSubmitAgent<typeof PersistedJson> => ({\n definition: { id: agentId, input: PersistedJson },\n});\n\nconst requestOwner = (request: ScheduleOwnerRequest): ScheduleOwner => request.scope.owner;\n\n/** Provides the same authorized management service as NodeScheduling.layer. */\nexport class CloudflareSchedulingClient {\n static readonly layer: Layer.Layer<Scheduling, never, ScheduleOwnerNamespace> = Layer.effect(\n Scheduling,\n Effect.gen(function* () {\n const { namespace } = yield* ScheduleOwnerNamespace;\n\n const call = Effect.fn(\"CloudflareSchedulingClient.call\")(function* (\n owner: ScheduleOwner,\n request: ScheduleOwnerRequest,\n ): Effect.fn.Return<ScheduleOwnerResponse, ScheduleManagementFailure> {\n const encoded = yield* encodeScheduleOwnerRequest(request).pipe(\n Effect.mapError(() =>\n ScheduleStorageError.make({ operation: \"Schedule Owner protocol\", reason: \"corrupt\" }),\n ),\n );\n\n const raw = yield* Effect.tryPromise({\n try: () => namespace.get(namespace.idFromName(scheduleOwnerKey(owner))).schedule(encoded),\n catch: () =>\n ScheduleStorageError.make({\n operation: \"call Schedule Owner\",\n reason: \"unavailable\",\n }),\n });\n\n const response = yield* decodeScheduleOwnerResponse(raw).pipe(\n Effect.mapError(() =>\n ScheduleStorageError.make({ operation: \"Schedule Owner protocol\", reason: \"corrupt\" }),\n ),\n );\n\n if (response._tag !== \"Failed\") return response;\n\n return yield* response.failure._tag === \"ScheduleOwnerProtocolError\"\n ? ScheduleStorageError.make({ operation: \"Schedule Owner protocol\", reason: \"corrupt\" })\n : response.failure;\n });\n\n const encodeInput = Effect.fn(\"CloudflareSchedulingClient.encodeInput\")(function* <\n InputSchema extends Schema.Top,\n >(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n ): Effect.fn.Return<PersistedJson, ScheduleValidationError, InputSchema[\"EncodingServices\"]> {\n const encoded = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Unable to encode Agent input\",\n }),\n ),\n );\n\n return yield* Schema.decodeUnknownEffect(PersistedJson)(encoded).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Agent input does not satisfy the canonical persistence bounds\",\n }),\n ),\n );\n });\n\n const create: Scheduling[\"Service\"][\"create\"] = (agent, input, options) =>\n Effect.gen(function* () {\n const payload = yield* encodeInput(agent, input);\n\n const response = yield* call(options.scope.owner, {\n _tag: \"Create\",\n schemaVersion: 1,\n agentId: agent.definition.id,\n input: payload,\n ...options,\n });\n\n return response._tag === \"Snapshot\"\n ? response.value\n : yield* ScheduleStorageError.make({\n operation: \"Schedule Owner protocol\",\n reason: \"corrupt\",\n });\n });\n\n const update: Scheduling[\"Service\"][\"update\"] = (agent, input, options) =>\n Effect.gen(function* () {\n const payload = yield* encodeInput(agent, input);\n\n const response = yield* call(options.scope.owner, {\n _tag: \"Update\",\n schemaVersion: 1,\n agentId: agent.definition.id,\n input: payload,\n ...options,\n });\n\n return response._tag === \"Snapshot\"\n ? response.value\n : yield* ScheduleStorageError.make({\n operation: \"Schedule Owner protocol\",\n reason: \"corrupt\",\n });\n });\n\n const get: Scheduling[\"Service\"][\"get\"] = (scope, scheduleId) =>\n Effect.gen(function* () {\n const response = yield* call(scope.owner, {\n _tag: \"Get\",\n schemaVersion: 1,\n scope,\n scheduleId,\n });\n\n return response._tag === \"Snapshot\"\n ? response.value\n : yield* ScheduleStorageError.make({\n operation: \"Schedule Owner protocol\",\n reason: \"corrupt\",\n });\n });\n\n const list: Scheduling[\"Service\"][\"list\"] = (scope, options = {}) =>\n Effect.gen(function* () {\n const response = yield* call(scope.owner, {\n _tag: \"List\",\n schemaVersion: 1,\n scope,\n ...(options.after === undefined ? {} : { after: options.after }),\n ...(options.limit === undefined ? {} : { limit: options.limit }),\n });\n\n return response._tag === \"Page\"\n ? response.value\n : yield* ScheduleStorageError.make({\n operation: \"Schedule Owner protocol\",\n reason: \"corrupt\",\n });\n });\n\n const control = (\n operation: \"pause\" | \"resume\" | \"cancel\",\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) =>\n Effect.gen(function* () {\n const response = yield* call(scope.owner, {\n _tag: \"Control\",\n schemaVersion: 1,\n operation,\n scope,\n scheduleId,\n expectedRevision,\n });\n\n return response._tag === \"Snapshot\"\n ? response.value\n : yield* ScheduleStorageError.make({\n operation: \"Schedule Owner protocol\",\n reason: \"corrupt\",\n });\n });\n\n return Scheduling.of({\n create,\n update,\n get,\n list,\n pause: (scope, id, revision) => control(\"pause\", scope, id, revision),\n resume: (scope, id, revision) => control(\"resume\", scope, id, revision),\n recover: (scope, scheduleId, expectedRevision, expectedGeneration) =>\n Effect.gen(function* () {\n const response = yield* call(scope.owner, {\n _tag: \"Recover\",\n schemaVersion: 1,\n scope,\n scheduleId,\n expectedRevision,\n expectedGeneration,\n });\n\n return response._tag === \"Snapshot\"\n ? response.value\n : yield* ScheduleStorageError.make({\n operation: \"Schedule Owner protocol\",\n reason: \"corrupt\",\n });\n }),\n cancel: (scope, id, revision) => control(\"cancel\", scope, id, revision),\n });\n }),\n );\n}\n\nexport class ScheduleOwnerIdentity extends Context.Service<\n ScheduleOwnerIdentity,\n { readonly owner: ScheduleOwner }\n>()(\"@effect-agent/platform-cloudflare/ScheduleOwnerIdentity\") {}\n\nconst decodeOwnerName = Effect.fn(\"decodeScheduleOwnerName\")(function* (\n name: string | null | undefined,\n): Effect.fn.Return<ScheduleOwner, ScheduleOwnerProtocolError> {\n if (name === null || name === undefined) {\n return yield* ScheduleOwnerProtocolError.make({\n message: \"Schedule Owner objects require an idFromName identity\",\n });\n }\n\n const tuple = yield* Schema.decodeUnknownEffect(\n Schema.fromJsonString(Schema.Tuple([Schema.String, Schema.String])),\n )(name).pipe(\n Effect.mapError(() =>\n ScheduleOwnerProtocolError.make({ message: \"Schedule Owner object name is malformed\" }),\n ),\n );\n\n return yield* Schema.decodeUnknownEffect(ScheduleOwner)({\n tenantId: tuple[0],\n ownerId: tuple[1],\n }).pipe(\n Effect.mapError(() =>\n ScheduleOwnerProtocolError.make({ message: \"Schedule Owner object identity is invalid\" }),\n ),\n );\n});\n\nconst alarmStorageError = (operation: string) => (error: { readonly _tag: string }) =>\n ScheduleStorageError.make({\n operation,\n reason: error._tag === \"StorageOperationError\" ? \"unavailable\" : \"corrupt\",\n });\n\nconst transactionLayer: Layer.Layer<\n DoScheduleTransaction,\n never,\n DurableObjectAlarm.DurableObjectAlarm\n> = Layer.effect(\n DoScheduleTransaction,\n Effect.gen(function* () {\n const alarms = yield* DurableObjectAlarm.DurableObjectAlarm;\n\n return DoScheduleTransaction.of({\n run: (body) =>\n Effect.gen(function* () {\n const nowMillis = yield* Clock.currentTimeMillis;\n\n return yield* alarms\n .transaction((transaction) =>\n body((replacement) =>\n replacement.deadlineAtMillis === null\n ? transaction\n .cancelAlarm({ id: SCHEDULE_ALARM_ID, tag: SCHEDULE_ALARM_TAG })\n .pipe(Effect.mapError(alarmStorageError(\"cancel Schedule Owner alarm\")))\n : Effect.fromOption(\n DateTime.make(Math.max(replacement.deadlineAtMillis, nowMillis + 1)),\n ).pipe(\n Effect.mapError(() =>\n ScheduleStorageError.make({\n operation: \"validate Schedule Owner alarm deadline\",\n reason: \"corrupt\",\n }),\n ),\n Effect.flatMap((runAt) =>\n transaction\n .scheduleAlarm({\n id: SCHEDULE_ALARM_ID,\n tag: SCHEDULE_ALARM_TAG,\n runAt,\n payload: {\n schemaVersion: 1,\n generation: replacement.generation,\n },\n })\n .pipe(\n Effect.mapError(alarmStorageError(\"schedule Schedule Owner alarm\")),\n ),\n ),\n ),\n ),\n )\n .pipe(\n Effect.catchTag(\"StorageOperationError\", () =>\n ScheduleStorageError.make({\n operation: \"commit Schedule Owner transaction\",\n reason: \"unavailable\",\n }),\n ),\n );\n }),\n });\n }),\n);\n\ntype ScheduleRuntimeServices =\n | Scheduling\n | ScheduleDriver\n | DoScheduleAlarmControl\n | ScheduleOwnerIdentity\n | DurableObjectAlarm.DurableObjectAlarm;\n\nconst ensureOwner = (\n expected: ScheduleOwner,\n request: ScheduleOwnerRequest,\n): Effect.Effect<void, ScheduleOwnerProtocolError> => {\n const observed = requestOwner(request);\n\n return observed.tenantId === expected.tenantId && observed.ownerId === expected.ownerId\n ? Effect.void\n : Effect.fail(\n ScheduleOwnerProtocolError.make({\n message: \"The request owner does not match the addressed Schedule Owner object\",\n }),\n );\n};\n\nconst handleScheduleRequest = Effect.fn(\"ScheduleOwner.handleRequest\")(function* (\n encoded: unknown,\n): Effect.fn.Return<unknown, never, Scheduling | ScheduleOwnerIdentity> {\n const decoded = yield* decodeScheduleOwnerRequest(encoded).pipe(Effect.result);\n\n if (decoded._tag === \"Failure\") {\n return yield* encodeScheduleOwnerResponse(\n scheduleProtocolFailure(\"The Schedule request could not be decoded\"),\n ).pipe(Effect.orDie);\n }\n const request = decoded.success;\n const { owner } = yield* ScheduleOwnerIdentity;\n const scheduling = yield* Scheduling;\n\n const response = yield* Effect.gen(function* () {\n yield* ensureOwner(owner, request);\n switch (request._tag) {\n case \"Create\": {\n const value = yield* scheduling.create(passthroughAgent(request.agentId), request.input, {\n scope: request.scope,\n scheduleId: request.scheduleId,\n timing: request.timing,\n destination: request.destination,\n deliveryPrincipal: request.deliveryPrincipal,\n definitions: request.definitions,\n ...(request.admissionGroup === undefined\n ? {}\n : { admissionGroup: request.admissionGroup }),\n ...(request.admissionFence === undefined\n ? {}\n : { admissionFence: request.admissionFence }),\n });\n\n return { _tag: \"Snapshot\" as const, value };\n }\n case \"Update\": {\n const value = yield* scheduling.update(passthroughAgent(request.agentId), request.input, {\n scope: request.scope,\n scheduleId: request.scheduleId,\n timing: request.timing,\n destination: request.destination,\n deliveryPrincipal: request.deliveryPrincipal,\n definitions: request.definitions,\n ...(request.admissionGroup === undefined\n ? {}\n : { admissionGroup: request.admissionGroup }),\n ...(request.admissionFence === undefined\n ? {}\n : { admissionFence: request.admissionFence }),\n expectedRevision: request.expectedRevision,\n });\n\n return { _tag: \"Snapshot\" as const, value };\n }\n case \"Get\":\n return {\n _tag: \"Snapshot\" as const,\n value: yield* scheduling.get(request.scope, request.scheduleId),\n };\n case \"List\":\n return {\n _tag: \"Page\" as const,\n value: yield* scheduling.list(request.scope, {\n ...(request.after === undefined ? {} : { after: request.after }),\n ...(request.limit === undefined ? {} : { limit: request.limit }),\n }),\n };\n case \"Recover\":\n return {\n _tag: \"Snapshot\" as const,\n value: yield* scheduling.recover(\n request.scope,\n request.scheduleId,\n request.expectedRevision,\n request.expectedGeneration,\n ),\n };\n case \"Control\": {\n const value =\n request.operation === \"pause\"\n ? yield* scheduling.pause(request.scope, request.scheduleId, request.expectedRevision)\n : request.operation === \"resume\"\n ? yield* scheduling.resume(\n request.scope,\n request.scheduleId,\n request.expectedRevision,\n )\n : yield* scheduling.cancel(\n request.scope,\n request.scheduleId,\n request.expectedRevision,\n );\n\n return { _tag: \"Snapshot\" as const, value };\n }\n }\n }).pipe(\n Effect.map((value): ScheduleOwnerResponse => value),\n Effect.catch((failure) =>\n Schema.is(ScheduleOwnerFailure)(failure)\n ? Effect.succeed({ _tag: \"Failed\" as const, failure })\n : Effect.succeed(\n scheduleProtocolFailure(\"The Schedule operation failed outside its public contract\"),\n ),\n ),\n );\n\n return yield* encodeScheduleOwnerResponse(response).pipe(Effect.orDie);\n});\n\n/** @internal The complete native alarm operation, including its event deadline. */\nexport const scheduleAlarmHandler = (limits: SchedulingLimits) =>\n DurableObjectAlarm.processDue(\n (event) =>\n Effect.gen(function* () {\n if (event.tag !== SCHEDULE_ALARM_TAG || event.id !== SCHEDULE_ALARM_ID) {\n return yield* ScheduleAlarmProtocolError.make({\n message: `Unsupported Schedule Owner alarm ${event.tag}/${event.id}`,\n });\n }\n yield* Schema.decodeUnknownEffect(ScheduleAlarmPayload)(event.payload).pipe(\n Effect.mapError(() =>\n ScheduleAlarmProtocolError.make({\n message: \"Unsupported Schedule Owner alarm payload version\",\n }),\n ),\n );\n const scheduling = yield* ScheduleDriver;\n const alarmControl = yield* DoScheduleAlarmControl;\n const { owner } = yield* ScheduleOwnerIdentity;\n const nowMillis = yield* Clock.currentTimeMillis;\n\n yield* alarmControl.prearm(nowMillis + limits.recoveryPollMillis);\n const pass = yield* scheduling.runDue(owner);\n\n if (pass.failed > 0) {\n yield* alarmControl.prearm((yield* Clock.currentTimeMillis) + limits.recoveryPollMillis);\n } else {\n yield* alarmControl.reconcile;\n }\n }),\n { mode: \"ordered\" },\n ).pipe(\n // Bound due acquisition and acknowledgement as well as admission. Prepared occurrences\n // and their replacement alarm survive interruption and retain their idempotency keys.\n Effect.timeout(\"14 minutes\"),\n Effect.asVoid,\n );\n\nexport interface ScheduleOwnerObjectInstance extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, ScheduleRuntimeServices>\n> {\n schedule(encoded: unknown): Promise<unknown>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\nexport interface ScheduleOwnerObjectClass {\n new (ctx: DurableObjectState, env: Cloudflare.Env): ScheduleOwnerObjectInstance;\n}\n\n/**\n * The host Layer supplies authorization and routing and is cached for the object incarnation.\n * Cloudflare eviction does not guarantee its finalizers run. Do not acquire resources requiring\n * cleanup in this Layer; acquire them inside scoped `manage` / `prepare` operations instead.\n * Native services belong to effect-cf; the database and alarm runtime remain instance-owned.\n */\nexport const makeScheduleOwnerObjectClass = <E>(\n host: Layer.Layer<\n ScheduleAuthorizer | ThreadObjectNamespace,\n E,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment | ScheduleOwnerIdentity\n >,\n limits: SchedulingLimits = defaultSchedulingLimits,\n): ScheduleOwnerObjectClass => {\n const ownerLayer = Layer.effect(\n ScheduleOwnerIdentity,\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n\n return ScheduleOwnerIdentity.of({ owner: yield* decodeOwnerName(state.raw.id.name) });\n }),\n );\n\n const sqlLayer = Layer.unwrap(\n Effect.map(EffectCfDurableObjectState.DurableObjectState, (state) =>\n SqliteClient.layer({ storage: state.raw.storage }),\n ),\n );\n\n const application = Layer.merge(Scheduling.layer(limits), ScheduleDriver.layer(limits)).pipe(\n Layer.provideMerge(\n scheduleStoreLayer.pipe(Layer.provide(transactionLayer), Layer.provide(sqlLayer)),\n ),\n Layer.provide(\n cloudflareScheduledInputAdmissionLayer.pipe(\n Layer.provide(cloudflarePreparedInputAdmissionLayer),\n Layer.provide(CloudflareThreadClient.layer),\n ),\n ),\n Layer.provide(ScheduleWakeNoop),\n Layer.provide(BrowserCrypto.layer),\n Layer.provideMerge(DurableObjectAlarm.DurableObjectAlarm.layer),\n Layer.provide(host),\n Layer.provideMerge(ownerLayer),\n );\n\n const runtime: Layer.Layer<\n ScheduleRuntimeServices,\n E | ScheduleStorageError | ScheduleOwnerProtocolError | ScheduleValidationError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n > = Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const scope = yield* Effect.scope;\n\n return yield* state.blockConcurrencyWhile(Layer.buildWithScope(application, scope));\n }),\n );\n\n const rpc = {\n schedule: (encoded: unknown) => handleScheduleRequest(encoded),\n } satisfies EffectCfDurableObject.DurableObjectRpc<ScheduleRuntimeServices>;\n\n const Base = EffectCfDurableObject.make(runtime, {\n initialize: Effect.void,\n rpc,\n alarms: scheduleAlarmHandler(limits),\n });\n\n class ScheduleOwnerObject extends Base {\n override alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void {\n return super.alarm?.(alarmInfo);\n }\n }\n\n return ScheduleOwnerObject;\n};\n"],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { ThreadObjectNamespace } from "./CloudflareBindings.mjs";
2
+ import { Cause, Context, Effect, Layer, Schema, Scope } from "effect";
3
+ import { DurableObject, DurableObjectAlarm, DurableObjectState as DurableObjectState$1, WorkerEnvironment } from "effect-cf";
4
+ import { SourcePartition, SubscriptionAuthorizer, SubscriptionLimits } from "@effect-agent/thread/Subscription";
5
+ import { DoSubscriptionAlarmControl } from "@effect-agent/storage-cloudflare/DoSubscriptionStore";
6
+ import { EventSources } from "@effect-agent/thread/EventSource";
7
+ import { SubscriptionInputBindings } from "@effect-agent/thread/SubscriptionInput";
8
+ import { SubscriptionDriver, SubscriptionIntake, Subscriptions } from "@effect-agent/thread/Subscriptions";
9
+ declare namespace CloudflareSubscriptions_d_exports {
10
+ export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmExtensionError, SubscriptionAlarmProtocolError, SubscriptionPartitionAlarmExtension, SubscriptionPartitionAlarmHandler, SubscriptionPartitionAlarmServices, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionObjectClass, SubscriptionPartitionObjectInstance, SubscriptionPartitionObjectRpc, SubscriptionPartitionProtocolError, makeSubscriptionPartitionAlarmHandler, makeSubscriptionPartitionObjectClass, sourcePartitionName, validateCloudflareSubscriptionLimits };
11
+ }
12
+ declare const SubscriptionAlarmProtocolError_base: Schema.Class<SubscriptionAlarmProtocolError, Schema.TaggedStruct<"SubscriptionAlarmProtocolError", {
13
+ readonly message: Schema.String;
14
+ }>, Cause.YieldableError>;
15
+ declare class SubscriptionAlarmProtocolError extends SubscriptionAlarmProtocolError_base {}
16
+ declare const SubscriptionAlarmExtensionError_base: Schema.Class<SubscriptionAlarmExtensionError, Schema.TaggedStruct<"SubscriptionAlarmExtensionError", {
17
+ readonly code: Schema.NonEmptyString;
18
+ }>, Cause.YieldableError>;
19
+ /** Bounded host diagnostic; credentials and provider responses do not belong in alarm failures. */
20
+ declare class SubscriptionAlarmExtensionError extends SubscriptionAlarmExtensionError_base {}
21
+ /** Native partition services supplied at alarm invocation, after the host Layer is built. */
22
+ type SubscriptionPartitionAlarmServices = Subscriptions | SubscriptionIntake | SubscriptionDriver;
23
+ interface SubscriptionPartitionAlarmHandler<R = SubscriptionPartitionAlarmServices> {
24
+ readonly tag: string;
25
+ readonly handle: (event: DurableObjectAlarm.DurableObjectAlarmEvent) => Effect.Effect<void, SubscriptionAlarmProtocolError | SubscriptionAlarmExtensionError, R>;
26
+ }
27
+ /** Host-only handlers; the framework reserves its namespace and rejects every unknown tag. */
28
+ declare const SubscriptionPartitionAlarmExtension: Context.Reference<{
29
+ readonly handlers: ReadonlyArray<SubscriptionPartitionAlarmHandler>;
30
+ }>;
31
+ /** Capture host services once, deferring native partition services to invocation.
32
+ * Each invocation owns its codec/handler Scope and timeout.
33
+ * Callback failures stay typed. Defects and interruption reach the native alarm multiplexer.
34
+ * The host owns durable idempotency, prearming and external-effect uncertainty.
35
+ */
36
+ declare const makeSubscriptionPartitionAlarmHandler: <Payload extends Schema.Top, R>(options: {
37
+ readonly tag: string;
38
+ readonly payload: Payload;
39
+ readonly timeoutMillis: number;
40
+ readonly handle: (event: Omit<DurableObjectAlarm.DurableObjectAlarmEvent, "payload"> & {
41
+ readonly payload: Payload["Type"];
42
+ }) => Effect.Effect<void, SubscriptionAlarmExtensionError, R>;
43
+ }) => Effect.Effect<SubscriptionPartitionAlarmHandler<Exclude<Exclude<R, Scope.Scope>, Exclude<Exclude<R, Scope.Scope | SubscriptionPartitionAlarmServices>, SubscriptionPartitionAlarmServices> | Exclude<Exclude<Payload["DecodingServices"], Scope.Scope | SubscriptionPartitionAlarmServices>, SubscriptionPartitionAlarmServices>> | Exclude<Exclude<Payload["DecodingServices"], Scope.Scope>, Exclude<Exclude<R, Scope.Scope | SubscriptionPartitionAlarmServices>, SubscriptionPartitionAlarmServices> | Exclude<Exclude<Payload["DecodingServices"], Scope.Scope | SubscriptionPartitionAlarmServices>, SubscriptionPartitionAlarmServices>>>, SubscriptionAlarmProtocolError, Exclude<R, Scope.Scope | SubscriptionPartitionAlarmServices> | Exclude<Payload["DecodingServices"], Scope.Scope | SubscriptionPartitionAlarmServices>>;
44
+ declare const SubscriptionPartitionProtocolError_base: Schema.Class<SubscriptionPartitionProtocolError, Schema.TaggedStruct<"SubscriptionPartitionProtocolError", {
45
+ readonly message: Schema.String;
46
+ }>, Cause.YieldableError>;
47
+ declare class SubscriptionPartitionProtocolError extends SubscriptionPartitionProtocolError_base {}
48
+ declare const CloudflareSubscriptionConfigError_base: Schema.Class<CloudflareSubscriptionConfigError, Schema.TaggedStruct<"CloudflareSubscriptionConfigError", {
49
+ readonly message: Schema.String;
50
+ }>, Cause.YieldableError>;
51
+ declare class CloudflareSubscriptionConfigError extends CloudflareSubscriptionConfigError_base {}
52
+ /** Reject limits whose four bounded phases could exceed the safe Durable Object alarm budget. */
53
+ declare const validateCloudflareSubscriptionLimits: (limits: SubscriptionLimits, options?: {
54
+ readonly ancillaryAlarms?: boolean;
55
+ }) => Effect.Effect<void, CloudflareSubscriptionConfigError>;
56
+ declare const sourcePartitionName: (partition: SourcePartition) => string;
57
+ interface SubscriptionPartitionObjectRpc extends Rpc.DurableObjectBranded {
58
+ subscription(encoded: unknown): Promise<unknown>;
59
+ }
60
+ declare const SubscriptionPartitionNamespace_base: Context.ServiceClass<SubscriptionPartitionNamespace, "@effect-agent/platform-cloudflare/SubscriptionPartitionNamespace", {
61
+ readonly namespace: DurableObjectNamespace<SubscriptionPartitionObjectRpc>;
62
+ }>;
63
+ declare class SubscriptionPartitionNamespace extends SubscriptionPartitionNamespace_base {}
64
+ /** Worker-side management and trusted intake, routed to one fresh partition stub per call. */
65
+ declare class CloudflareSubscriptionsClient {
66
+ static layer(partition: SourcePartition): Layer.Layer<Subscriptions | SubscriptionIntake, never, SubscriptionPartitionNamespace>;
67
+ }
68
+ declare const SubscriptionPartitionIdentity_base: Context.ServiceClass<SubscriptionPartitionIdentity, "@effect-agent/platform-cloudflare/SubscriptionPartitionIdentity", {
69
+ readonly partition: SourcePartition;
70
+ }>;
71
+ declare class SubscriptionPartitionIdentity extends SubscriptionPartitionIdentity_base {}
72
+ type SubscriptionRuntimeServices = Subscriptions | SubscriptionIntake | SubscriptionDriver | DoSubscriptionAlarmControl | SubscriptionPartitionIdentity | DurableObjectAlarm.DurableObjectAlarm;
73
+ interface SubscriptionPartitionObjectInstance extends InstanceType<DurableObject.DurableObjectClass<Record<never, never>, SubscriptionRuntimeServices>> {
74
+ subscription(encoded: unknown): Promise<unknown>;
75
+ alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;
76
+ }
77
+ interface SubscriptionPartitionObjectClass {
78
+ new (ctx: DurableObjectState, env: Cloudflare.Env): SubscriptionPartitionObjectInstance;
79
+ }
80
+ /**
81
+ * Build one source-addressed SQLite Durable Object. The host Layer binds the permitted source
82
+ * catalog and authority. It must not retain cleanup-scoped resources across RPC events.
83
+ */
84
+ declare const makeSubscriptionPartitionObjectClass: <E>(host: Layer.Layer<SubscriptionAuthorizer | EventSources | SubscriptionInputBindings | ThreadObjectNamespace, E, DurableObjectState$1.DurableObjectState | WorkerEnvironment | SubscriptionPartitionIdentity>, limits?: SubscriptionLimits) => SubscriptionPartitionObjectClass;
85
+ //#endregion
86
+ export { CloudflareSubscriptionConfigError, CloudflareSubscriptionsClient, SubscriptionAlarmExtensionError, SubscriptionAlarmProtocolError, SubscriptionPartitionAlarmExtension, SubscriptionPartitionAlarmHandler, SubscriptionPartitionAlarmServices, SubscriptionPartitionIdentity, SubscriptionPartitionNamespace, SubscriptionPartitionObjectClass, SubscriptionPartitionObjectInstance, SubscriptionPartitionObjectRpc, SubscriptionPartitionProtocolError, makeSubscriptionPartitionAlarmHandler, makeSubscriptionPartitionObjectClass, sourcePartitionName, CloudflareSubscriptions_d_exports as t, validateCloudflareSubscriptionLimits };
87
+ //# sourceMappingURL=CloudflareSubscriptions.d.mts.map