@effect-agent/platform-cloudflare 0.1.0-beta.84 → 0.1.0-beta.85

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/Alarm.mjs +1 -1
  2. package/dist/Alarm.mjs.map +1 -1
  3. package/dist/BrowserRestCrawl.mjs +1 -1
  4. package/dist/BrowserRestCrawl.mjs.map +1 -1
  5. package/dist/CloudflareMemory.mjs +5 -5
  6. package/dist/CloudflareMemory.mjs.map +1 -1
  7. package/dist/CloudflareScheduling.mjs +2 -2
  8. package/dist/CloudflareScheduling.mjs.map +1 -1
  9. package/dist/CloudflareSubscriptions.mjs +12 -6
  10. package/dist/CloudflareSubscriptions.mjs.map +1 -1
  11. package/dist/CloudflareThreadClient.d.mts +216 -6
  12. package/dist/CloudflareThreadClient.mjs +2 -2
  13. package/dist/CloudflareThreadClient.mjs.map +1 -1
  14. package/dist/InteractiveBrowser.mjs +15 -15
  15. package/dist/InteractiveBrowser.mjs.map +1 -1
  16. package/dist/ProtectedBrowser.mjs +12 -12
  17. package/dist/ProtectedBrowser.mjs.map +1 -1
  18. package/dist/{ThreadObject-BS1gRV0V.d.mts → ThreadObject-DZMkwIBh.d.mts} +8 -12
  19. package/dist/{ThreadObject-mmWMMWdY.mjs → ThreadObject-gyx8Qq03.mjs} +5 -3
  20. package/dist/ThreadObject-gyx8Qq03.mjs.map +1 -0
  21. package/dist/ThreadObject.d.mts +1 -1
  22. package/dist/ThreadObject.mjs +1 -1
  23. package/dist/{browser-session-lifecycle-CUbVfEgP.mjs → browser-session-lifecycle-CmbQABHC.mjs} +5 -5
  24. package/dist/browser-session-lifecycle-CmbQABHC.mjs.map +1 -0
  25. package/dist/index.d.mts +1 -1
  26. package/dist/index.mjs +1 -1
  27. package/package.json +1 -1
  28. package/src/Alarm.ts +6 -6
  29. package/src/BrowserRestCrawl.ts +1 -1
  30. package/src/CloudflareMemory.ts +7 -7
  31. package/src/CloudflareScheduling.ts +2 -2
  32. package/src/CloudflareSubscriptions.ts +18 -18
  33. package/src/CloudflareThreadClient.ts +2 -2
  34. package/src/InteractiveBrowser.ts +19 -22
  35. package/src/internal/browser-session-lifecycle.ts +8 -8
  36. package/src/internal/message-delivery.ts +5 -6
  37. package/src/protected-browser/binding.ts +1 -1
  38. package/src/protected-browser/policy.ts +29 -31
  39. package/dist/ThreadObject-mmWMMWdY.mjs.map +0 -1
  40. package/dist/browser-session-lifecycle-CUbVfEgP.mjs.map +0 -1
@@ -36,7 +36,6 @@ import {
36
36
  Duration,
37
37
  Effect,
38
38
  Layer,
39
- Option,
40
39
  Redacted,
41
40
  Ref,
42
41
  Schema,
@@ -231,7 +230,7 @@ export class BrowserRunViewport extends Schema.Class<BrowserRunViewport>("Browse
231
230
  ) {}
232
231
 
233
232
  const decodeViewport = (input: BrowserRunViewport) =>
234
- Schema.decodeUnknownEffect(BrowserRunViewport)(input, { onExcessProperty: "error" }).pipe(
233
+ Schema.decodeEffect(BrowserRunViewport)(input, { onExcessProperty: "error" }).pipe(
235
234
  Effect.mapError(() => policyError("The browser viewport is malformed")),
236
235
  // Copy only presentation fields, including for Schema class instances.
237
236
  Effect.map((viewport) => ({
@@ -1043,7 +1042,7 @@ const makeProductionPage = (page: Page): BrowserRunInteractivePage => {
1043
1042
  ),
1044
1043
  );
1045
1044
 
1046
- if (observation._tag === "Text") Schema.decodeUnknownSync(PageObservation)(observation.text);
1045
+ if (observation._tag === "Text") Schema.decodeSync(PageObservation)(observation.text);
1047
1046
 
1048
1047
  return observation;
1049
1048
  },
@@ -1177,7 +1176,7 @@ const snapshotPolicy = Effect.fn("BrowserRunInteractive.snapshotPolicy")(functio
1177
1176
  InteractiveBrowserPolicySnapshot,
1178
1177
  InteractiveBrowserPolicyDeniedError | InteractiveBrowserUnsupportedError
1179
1178
  > {
1180
- const decoded = yield* Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(input).pipe(
1179
+ const decoded = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(
1181
1180
  Effect.mapError(() => policyError("The interactive browser policy is malformed")),
1182
1181
  );
1183
1182
 
@@ -1651,15 +1650,13 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (
1651
1650
  }),
1652
1651
  )
1653
1652
  .pipe(
1654
- Effect.flatMap((result) =>
1655
- Option.isSome(result)
1656
- ? Effect.succeed(result.value)
1657
- : Effect.fail(
1658
- InteractiveBrowserBusyError.make({
1659
- implementation: browserRunInteractiveImplementation,
1660
- message: "The browser handle already has an operation in flight",
1661
- }),
1662
- ),
1653
+ Effect.flatMap(
1654
+ Effect.fromOption(() =>
1655
+ InteractiveBrowserBusyError.make({
1656
+ implementation: browserRunInteractiveImplementation,
1657
+ message: "The browser handle already has an operation in flight",
1658
+ }),
1659
+ ),
1663
1660
  ),
1664
1661
  );
1665
1662
 
@@ -1714,7 +1711,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (
1714
1711
  });
1715
1712
  }
1716
1713
 
1717
- return yield* Schema.decodeUnknownEffect(BrowserTextResult)({
1714
+ return yield* Schema.decodeEffect(BrowserTextResult)({
1718
1715
  text: observation.text,
1719
1716
  }).pipe(
1720
1717
  Effect.mapError((cause) =>
@@ -1748,7 +1745,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (
1748
1745
  }),
1749
1746
  ),
1750
1747
  screenshot: (request) =>
1751
- Schema.decodeUnknownEffect(BrowserScreenshotRequest)(request).pipe(
1748
+ Schema.decodeEffect(BrowserScreenshotRequest)(request).pipe(
1752
1749
  Effect.mapError(() => policyError("The browser screenshot request is malformed")),
1753
1750
  Effect.flatMap((decoded) =>
1754
1751
  run(
@@ -1771,7 +1768,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (
1771
1768
  });
1772
1769
  }
1773
1770
 
1774
- return yield* Schema.decodeUnknownEffect(PageScreenshotResult)({
1771
+ return yield* Schema.decodeEffect(PageScreenshotResult)({
1775
1772
  implementation: browserRunInteractiveImplementation,
1776
1773
  mediaType: "image/png",
1777
1774
  bytes: new Uint8Array(bytes),
@@ -1786,7 +1783,7 @@ const makeHandle = Effect.fn("BrowserRunInteractive.makeHandle")(function* (
1786
1783
  ),
1787
1784
  ),
1788
1785
  scroll: (request) =>
1789
- Schema.decodeUnknownEffect(BrowserScrollRequest)(request).pipe(
1786
+ Schema.decodeEffect(BrowserScrollRequest)(request).pipe(
1790
1787
  Effect.mapError(() => policyError("The browser scroll request is malformed")),
1791
1788
  Effect.flatMap((decoded) =>
1792
1789
  run(
@@ -2209,7 +2206,7 @@ const makeHostService = (
2209
2206
  ),
2210
2207
  ),
2211
2208
  getLiveView: (request) =>
2212
- Schema.decodeUnknownEffect(BrowserRunLiveViewRequest)(request).pipe(
2209
+ Schema.decodeEffect(BrowserRunLiveViewRequest)(request).pipe(
2213
2210
  Effect.mapError(() => policyError("The Live View request is malformed")),
2214
2211
  Effect.flatMap((decoded) =>
2215
2212
  runtime.run(
@@ -2222,7 +2219,7 @@ const makeHostService = (
2222
2219
  "Cloudflare returned a malformed Live View response",
2223
2220
  ).pipe(
2224
2221
  Effect.flatMap((observation) =>
2225
- Schema.decodeUnknownEffect(BrowserRunLiveViewResult)({
2222
+ Schema.decodeEffect(BrowserRunLiveViewResult)({
2226
2223
  devtoolsFrontendUrl: Redacted.make(observation.devtoolsFrontendUrl),
2227
2224
  }).pipe(
2228
2225
  Effect.mapError(() =>
@@ -2236,7 +2233,7 @@ const makeHostService = (
2236
2233
  ),
2237
2234
  ),
2238
2235
  handoff: (request) =>
2239
- Schema.decodeUnknownEffect(BrowserRunHandoffRequest)(request).pipe(
2236
+ Schema.decodeEffect(BrowserRunHandoffRequest)(request).pipe(
2240
2237
  Effect.mapError(() => policyError("The browser handoff request is malformed")),
2241
2238
  Effect.flatMap((decoded) =>
2242
2239
  runtime.run(
@@ -2249,7 +2246,7 @@ const makeHostService = (
2249
2246
  "Cloudflare returned a malformed browser handoff response",
2250
2247
  ).pipe(
2251
2248
  Effect.flatMap((observation) =>
2252
- Schema.decodeUnknownEffect(BrowserRunHandoffResult)({
2249
+ Schema.decodeEffect(BrowserRunHandoffResult)({
2253
2250
  handoffId: Redacted.make(observation.handoffId),
2254
2251
  }).pipe(
2255
2252
  Effect.mapError(() =>
@@ -2272,7 +2269,7 @@ const makeHostService = (
2272
2269
  "Cloudflare returned a malformed browser handoff state",
2273
2270
  ).pipe(
2274
2271
  Effect.flatMap((observation) =>
2275
- Schema.decodeUnknownEffect(BrowserRunHandoffState)({
2272
+ Schema.decodeEffect(BrowserRunHandoffState)({
2276
2273
  active: observation.active,
2277
2274
  ...(observation.handoffId === undefined
2278
2275
  ? {}
@@ -107,7 +107,7 @@ export class BrowserRunSessionLifecycle extends Context.Service<
107
107
  });
108
108
 
109
109
  if (response.status === 404) {
110
- const absent = Schema.decodeUnknownOption(Schema.fromJsonString(Absent))(body, {
110
+ const absent = Schema.decodeOption(Schema.fromJsonString(Absent))(body, {
111
111
  onExcessProperty: "error",
112
112
  });
113
113
 
@@ -116,16 +116,16 @@ export class BrowserRunSessionLifecycle extends Context.Service<
116
116
  return yield* new BrowserRunCleanupError({ reason: "malformed" });
117
117
  }
118
118
  if (method === "DELETE") {
119
- const result = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Closed))(
120
- body,
121
- ).pipe(Effect.mapError(() => new BrowserRunCleanupError({ reason: "malformed" })));
119
+ const result = yield* Schema.decodeEffect(Schema.fromJsonString(Closed))(body).pipe(
120
+ Effect.mapError(() => new BrowserRunCleanupError({ reason: "malformed" })),
121
+ );
122
122
 
123
123
  return result.status === "closed";
124
124
  }
125
125
 
126
- const result = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Metadata))(
127
- body,
128
- ).pipe(Effect.mapError(() => new BrowserRunCleanupError({ reason: "malformed" })));
126
+ const result = yield* Schema.decodeEffect(Schema.fromJsonString(Metadata))(body).pipe(
127
+ Effect.mapError(() => new BrowserRunCleanupError({ reason: "malformed" })),
128
+ );
129
129
 
130
130
  if (result.sessionId !== sessionId)
131
131
  return yield* new BrowserRunCleanupError({ reason: "malformed" });
@@ -135,7 +135,7 @@ export class BrowserRunSessionLifecycle extends Context.Service<
135
135
 
136
136
  const close = Effect.fn("BrowserRunSessionLifecycle.close")(
137
137
  function* (sessionId: Redacted.Redacted<string>) {
138
- const id = yield* Schema.decodeUnknownEffect(Identity)(Redacted.value(sessionId)).pipe(
138
+ const id = yield* Schema.decodeEffect(Identity)(Redacted.value(sessionId)).pipe(
139
139
  Effect.mapError(() => new BrowserRunCleanupError({ reason: "configuration" })),
140
140
  );
141
141
 
@@ -57,6 +57,8 @@ export const guardedMessageDeliveryStoreLayer = Layer.effect(
57
57
  );
58
58
 
59
59
  return MessageDeliveryStore.of({
60
+ limits: store.limits,
61
+ maxStoredValueBytes: store.maxStoredValueBytes,
60
62
  insert: (record) =>
61
63
  local(
62
64
  record.key.ownerThreadId,
@@ -71,12 +73,9 @@ export const guardedMessageDeliveryStoreLayer = Layer.effect(
71
73
  // pass placement validation before the driver may dispatch any of the wave.
72
74
  due: (nowMillis, limit, owner) =>
73
75
  local(owner, store.due(nowMillis, limit, owner)).pipe(
74
- Effect.flatMap((keys) =>
75
- keys.every((key) => ownsThread(key.ownerThreadId))
76
- ? Effect.succeed(keys)
77
- : Effect.fail(
78
- MessageDeliveryError.make({ reason: "validation", operation: "message owner" }),
79
- ),
76
+ Effect.filterOrFail(
77
+ (keys) => keys.every((key) => ownsThread(key.ownerThreadId)),
78
+ () => MessageDeliveryError.make({ reason: "validation", operation: "message owner" }),
80
79
  ),
81
80
  ),
82
81
  nextDeadline: (owner) =>
@@ -112,7 +112,7 @@ export const browserRunProtectedBindingLayer = (options: {
112
112
  });
113
113
 
114
114
  sessionId = Redacted.make(
115
- Schema.decodeUnknownSync(Schema.String.check(Schema.isUUID()))(acquired.sessionId),
115
+ Schema.decodeSync(Schema.String.check(Schema.isUUID()))(acquired.sessionId),
116
116
  );
117
117
  if (!recordingDisabled || signal.aborted || invalid) {
118
118
  await runCleanup(terminate);
@@ -34,7 +34,6 @@ import {
34
34
  Crypto,
35
35
  Effect,
36
36
  Layer,
37
- Option,
38
37
  Redacted,
39
38
  Schema,
40
39
  Semaphore,
@@ -165,9 +164,9 @@ export const browserRunProtectedLayer = () =>
165
164
  cleanup: "not-requested",
166
165
  });
167
166
 
168
- const decodedPolicy = yield* Schema.decodeUnknownEffect(InteractiveBrowserPolicy)(
169
- input,
170
- ).pipe(Effect.mapError(() => initialError("denied")));
167
+ const decodedPolicy = yield* Schema.decodeEffect(InteractiveBrowserPolicy)(input).pipe(
168
+ Effect.mapError(() => initialError("denied")),
169
+ );
171
170
 
172
171
  if (decodedPolicy.network._tag === "PublicWeb") return yield* initialError("unsupported");
173
172
 
@@ -260,7 +259,7 @@ export const browserRunProtectedLayer = () =>
260
259
  if (Redacted.value(yield* caller) !== Redacted.value(principal))
261
260
  return yield* fail("denied");
262
261
 
263
- const decision = yield* Schema.decodeUnknownEffect(CredentialObservationDecision)(
262
+ const decision = yield* Schema.decodeEffect(CredentialObservationDecision)(
264
263
  rawDecision,
265
264
  ).pipe(Effect.mapError(() => fail("observation-blocked")));
266
265
 
@@ -378,18 +377,17 @@ export const browserRunProtectedLayer = () =>
378
377
  }),
379
378
  )
380
379
  .pipe(
381
- Effect.flatMap((result) =>
382
- Option.isSome(result)
383
- ? Effect.succeed(result.value)
384
- : Effect.fail(
385
- new ProtectedBrowserError({
386
- reason: "busy",
387
- dispatch: "not-dispatched",
388
- milestone: "none",
389
- observation,
390
- cleanup,
391
- }),
392
- ),
380
+ Effect.flatMap(
381
+ Effect.fromOption(
382
+ () =>
383
+ new ProtectedBrowserError({
384
+ reason: "busy",
385
+ dispatch: "not-dispatched",
386
+ milestone: "none",
387
+ observation,
388
+ cleanup,
389
+ }),
390
+ ),
393
391
  ),
394
392
  );
395
393
 
@@ -398,9 +396,9 @@ export const browserRunProtectedLayer = () =>
398
396
  navigate: (request) =>
399
397
  run(
400
398
  Effect.gen(function* () {
401
- const decoded = yield* Schema.decodeUnknownEffect(ProtectedBrowserNavigate)(
402
- request,
403
- ).pipe(Effect.mapError(() => fail("denied")));
399
+ const decoded = yield* Schema.decodeEffect(ProtectedBrowserNavigate)(request).pipe(
400
+ Effect.mapError(() => fail("denied")),
401
+ );
404
402
 
405
403
  let url: URL;
406
404
 
@@ -452,9 +450,9 @@ export const browserRunProtectedLayer = () =>
452
450
  click: (request) =>
453
451
  run(
454
452
  Effect.gen(function* () {
455
- const decoded = yield* Schema.decodeUnknownEffect(ProtectedBrowserClick)(
456
- request,
457
- ).pipe(Effect.mapError(() => fail("denied")));
453
+ const decoded = yield* Schema.decodeEffect(ProtectedBrowserClick)(request).pipe(
454
+ Effect.mapError(() => fail("denied")),
455
+ );
458
456
 
459
457
  yield* permitObservation;
460
458
  const control = yield* target(decoded.ref);
@@ -505,9 +503,9 @@ export const browserRunProtectedLayer = () =>
505
503
  fill: (request) =>
506
504
  run(
507
505
  Effect.gen(function* () {
508
- const decoded = yield* Schema.decodeUnknownEffect(ProtectedBrowserFill)(
509
- request,
510
- ).pipe(Effect.mapError(() => fail("denied")));
506
+ const decoded = yield* Schema.decodeEffect(ProtectedBrowserFill)(request).pipe(
507
+ Effect.mapError(() => fail("denied")),
508
+ );
511
509
 
512
510
  yield* permitObservation;
513
511
  const control = yield* target(decoded.ref);
@@ -537,9 +535,9 @@ export const browserRunProtectedLayer = () =>
537
535
  listCredentialOffers: (request) =>
538
536
  run(
539
537
  Effect.gen(function* () {
540
- const decoded = yield* Schema.decodeUnknownEffect(ListCredentialOffers)(
541
- request,
542
- ).pipe(Effect.mapError(() => fail("denied")));
538
+ const decoded = yield* Schema.decodeEffect(ListCredentialOffers)(request).pipe(
539
+ Effect.mapError(() => fail("denied")),
540
+ );
543
541
 
544
542
  yield* permitObservation;
545
543
  const control = yield* target(decoded.target);
@@ -588,7 +586,7 @@ export const browserRunProtectedLayer = () =>
588
586
  useCredential: (request) =>
589
587
  run(
590
588
  Effect.gen(function* () {
591
- const decoded = yield* Schema.decodeUnknownEffect(UseCredential)(request).pipe(
589
+ const decoded = yield* Schema.decodeEffect(UseCredential)(request).pipe(
592
590
  Effect.mapError(() => fail("denied")),
593
591
  );
594
592
 
@@ -656,7 +654,7 @@ export const browserRunProtectedLayer = () =>
656
654
  .resolve(authorization)
657
655
  .pipe(Effect.mapError((error) => fail(error.reason)));
658
656
 
659
- const material = yield* Schema.decodeUnknownEffect(
657
+ const material = yield* Schema.decodeEffect(
660
658
  offer.kind === "login" ? LoginCredential : CardCredential,
661
659
  )(raw).pipe(Effect.mapError(() => fail("resolver")));
662
660
 
@@ -1 +0,0 @@
1
- {"version":3,"file":"ThreadObject-mmWMMWdY.mjs","names":["EffectCfDurableObjectState","EffectCfDurableObject"],"sources":["../src/internal/message-delivery.ts","../src/internal/progress-wait.ts","../src/internal/transport.ts","../src/internal/layers.ts","../src/ThreadObject.ts"],"sourcesContent":["import { type ThreadId } from \"@effect-agent/core/Identifiers\";\nimport {\n MessageDeliveryDriver,\n MessageDeliveryError,\n MessageDeliveryStore,\n} from \"@effect-agent/thread/MessageDelivery\";\nimport { WakeScheduler } from \"@effect-agent/thread/WakeScheduler\";\nimport { Clock, Context, Deferred, Effect, Layer, Option, Ref, Semaphore, Stream } from \"effect\";\n\nimport { DurableAlarmError, ThreadMessageDelivery, ThreadMutationGate } from \"../Alarm.ts\";\nimport { ThreadObjectPlacement } from \"../CloudflareBindings.ts\";\nimport { CloudflareDurableRuntimeConfig } from \"../CloudflareConfig.ts\";\n\n/** Every externally requested write prearms the owning Object's maintenance generation. */\nexport const guardedMessageDeliveryStoreLayer = Layer.effect(\n MessageDeliveryStore,\n Effect.gen(function* () {\n const store = yield* MessageDeliveryStore;\n const mutations = yield* ThreadMutationGate;\n const wakes = yield* WakeScheduler;\n const { ownsThread } = yield* ThreadObjectPlacement;\n // Reconstructed as unknown on every incarnation. The gate prevents a racing read from\n // caching an empty deadline across a write; SQL remains the recovery authority.\n const deadline = yield* Ref.make<number | null | undefined>(undefined);\n const cacheGate = yield* Semaphore.make(1);\n\n const local = <A, E>(\n owner: ThreadId | undefined,\n body: Effect.Effect<A, E>,\n ): Effect.Effect<A, E | MessageDeliveryError> =>\n owner === undefined || ownsThread(owner)\n ? body\n : Effect.fail(\n MessageDeliveryError.make({ reason: \"validation\", operation: \"message owner\" }),\n );\n\n const mutate = <A, E>(body: Effect.Effect<A, E>) =>\n mutations\n .withMutation(cacheGate.withPermit(Ref.set(deadline, undefined).pipe(Effect.andThen(body))))\n .pipe(\n Effect.catchTag(\"DurableAlarmError\", () =>\n MessageDeliveryError.make({ reason: \"storage\", operation: \"prearm message delivery\" }),\n ),\n );\n\n const nextDeadline = cacheGate.withPermit(\n Effect.gen(function* () {\n const cached = yield* Ref.get(deadline);\n\n if (cached !== undefined) return cached;\n const current = yield* store.nextDeadline();\n\n yield* Ref.set(deadline, current);\n\n return current;\n }),\n );\n\n return MessageDeliveryStore.of({\n insert: (record) =>\n local(\n record.key.ownerThreadId,\n mutate(store.insert(record)).pipe(\n Effect.tap(() => wakes.notify(record.key.ownerThreadId)),\n ),\n ),\n get: (key) => local(key.ownerThreadId, store.get(key)),\n list: (request) => local(request.ownerThreadId, store.list(request)),\n change: (key, change) => local(key.ownerThreadId, mutate(store.change(key, change))),\n // Only the trusted physical-owner pump omits an owner. All returned keys still\n // pass placement validation before the driver may dispatch any of the wave.\n due: (nowMillis, limit, owner) =>\n local(owner, store.due(nowMillis, limit, owner)).pipe(\n Effect.flatMap((keys) =>\n keys.every((key) => ownsThread(key.ownerThreadId))\n ? Effect.succeed(keys)\n : Effect.fail(\n MessageDeliveryError.make({ reason: \"validation\", operation: \"message owner\" }),\n ),\n ),\n ),\n nextDeadline: (owner) =>\n local(owner, owner === undefined ? nextDeadline : store.nextDeadline(owner)),\n });\n }),\n);\n\n/** Message progress shares the native alarm slot without blocking source runtime work. */\nexport const threadMessageDeliveryLayer = Layer.effectContext(\n Effect.gen(function* () {\n const driver = yield* MessageDeliveryDriver;\n const store = yield* MessageDeliveryStore;\n const wakes = yield* WakeScheduler;\n const config = yield* CloudflareDurableRuntimeConfig;\n\n const failure = (operation: string) => () =>\n DurableAlarmError.make({\n operation,\n message: \"Durable message recovery remains pending\",\n });\n\n const drain = Effect.gen(function* () {\n const deadline = yield* store.nextDeadline();\n\n if (deadline !== null && deadline <= (yield* Clock.currentTimeMillis)) {\n yield* driver.runDue();\n }\n }).pipe(Effect.mapError(failure(\"drain message delivery\")));\n\n return Context.make(ThreadMessageDelivery, {\n drain,\n drainUntil: Effect.fn(\"ThreadMessageDelivery.drainUntil\")(function* (\n finished: Deferred.Deferred<void>,\n ) {\n // One scoped subscription covers every logical lane in this physical owner.\n // Acquire it before reading durable deadlines; hints remain droppable.\n const notified = (yield* Stream.toPull(wakes.wakes)).pipe(Effect.catch(() => Effect.never));\n\n // Always finish one wave; source completion prevents starting subsequent waves.\n yield* Effect.gen(function* () {\n yield* drain;\n\n const deadline = yield* store\n .nextDeadline()\n .pipe(Effect.mapError(failure(\"read message deadline\")));\n\n // The index includes unfinished waves, lease expiry, retry and settlement polls.\n // Yield at least one millisecond for an already-due deadline instead of spinning.\n const delay =\n deadline === null\n ? config.wakeScanInterval\n : Math.min(\n config.wakeScanInterval,\n Math.max(1, deadline - (yield* Clock.currentTimeMillis)),\n );\n\n yield* Effect.raceFirst(\n Deferred.await(finished),\n Effect.raceFirst(notified, Effect.sleep(delay)),\n );\n }).pipe(Effect.repeat({ until: () => Deferred.isDone(finished) }));\n }, Effect.scoped),\n pendingDeadline: store\n .nextDeadline()\n .pipe(Effect.map(Option.fromNullishOr), Effect.mapError(failure(\"read message deadline\"))),\n });\n }),\n);\n","import { Context, Deferred, Effect, Layer, Ref, type Scope } from \"effect\";\n\n/** Cancellation tombstones are bounded hints, never durable authority. */\nconst MAX_CANCELLATION_TOMBSTONES = 1_024;\n\ntype ActiveRegistration = ReadonlySet<Deferred.Deferred<void>>;\ntype Registration = ActiveRegistration | \"cancelled\";\ntype Registrations = ReadonlyMap<string, Registration>;\n\n/**\n * Per-incarnation cancellation registry for long-lived progress RPCs. The public runtime owns\n * the actual wake registration; this host-only registry lets an interrupted Worker Effect ask\n * the Object to interrupt its scoped wait before the Worker execution context itself ends.\n */\nexport class ProgressWaitRegistry extends Context.Service<\n ProgressWaitRegistry,\n {\n /** Register a Scope-owned cancellation signal, observing any early cancel tombstone. */\n readonly subscribe: (\n waiterId: string,\n ) => Effect.Effect<Effect.Effect<void>, never, Scope.Scope>;\n /** Cancel every attempt and retain a bounded tombstone for later transport attempts. */\n readonly cancel: (waiterId: string) => Effect.Effect<void>;\n }\n>()(\"@effect-agent/platform-cloudflare/ProgressWaitRegistry\") {\n static readonly layer: Layer.Layer<ProgressWaitRegistry> = Layer.effect(\n ProgressWaitRegistry,\n Effect.gen(function* () {\n const registrations = yield* Ref.make<Registrations>(new Map());\n\n const remove = (waiterId: string, deferred: Deferred.Deferred<void>) =>\n Ref.update(registrations, (current) => {\n const existing = current.get(waiterId);\n\n if (existing === undefined || existing === \"cancelled\" || !existing.has(deferred)) {\n return current;\n }\n const next = new Map(current);\n const active = new Set(existing);\n\n active.delete(deferred);\n if (active.size === 0) {\n next.delete(waiterId);\n } else {\n next.set(waiterId, active);\n }\n\n return next;\n });\n\n const subscribe = Effect.fn(\"ProgressWaitRegistry.subscribe\")(\n (waiterId: string): Effect.Effect<Effect.Effect<void>, never, Scope.Scope> =>\n Effect.gen(function* () {\n const deferred = yield* Deferred.make<void>();\n\n yield* Effect.addFinalizer(() => remove(waiterId, deferred));\n\n const cancelled = yield* Ref.modify(registrations, (current) => {\n const existing = current.get(waiterId);\n const next = new Map(current);\n\n if (existing === \"cancelled\") {\n return [true, current] as const;\n }\n const active = new Set(existing ?? []);\n\n active.add(deferred);\n next.set(waiterId, active);\n\n return [false, next] as const;\n });\n\n return { cancelled, deferred };\n }).pipe(\n Effect.map(({ cancelled, deferred }) =>\n cancelled ? Effect.void : Deferred.await(deferred),\n ),\n ),\n );\n\n // Updating the registry and completing captured signals form one nonblocking operation;\n // interruption between them must not strand attempts removed from the active registry.\n const cancel = Effect.fn(\"ProgressWaitRegistry.cancel\")(function* (waiterId: string) {\n const waiters = yield* Ref.modify(\n registrations,\n (current): readonly [ReadonlyArray<Deferred.Deferred<void>>, Registrations] => {\n const existing = current.get(waiterId);\n\n if (existing === \"cancelled\") return [[], current] as const;\n const next = new Map(current);\n\n // A retry may arrive after an active attempt was cancelled. Retain the same\n // tombstone used for early cancellation, ordered by cancellation time.\n next.delete(waiterId);\n next.set(waiterId, \"cancelled\");\n let tombstones = 0;\n\n for (const registration of next.values()) {\n if (registration === \"cancelled\") tombstones += 1;\n }\n if (tombstones > MAX_CANCELLATION_TOMBSTONES) {\n for (const [id, registration] of next) {\n if (registration !== \"cancelled\") continue;\n next.delete(id);\n break;\n }\n }\n\n return [existing === undefined ? [] : [...existing], next] as const;\n },\n );\n\n yield* Effect.forEach(waiters, (waiter) => Deferred.succeed(waiter, undefined), {\n discard: true,\n });\n }, Effect.uninterruptible);\n\n return ProgressWaitRegistry.of({ subscribe, cancel });\n }),\n );\n}\n","import {\n ThreadPortTransport,\n portTransportFailure,\n} from \"@effect-agent/storage-cloudflare/PortRouting\";\nimport { Effect, Layer } from \"effect\";\n\nimport { callThreadObject, ThreadObjectNamespace } from \"../CloudflareBindings.ts\";\n\n/**\n * `ThreadPortTransport` over native Durable Object JS RPC (decision D-P6-3): one\n * `portCall(envelope)` on the stub of the Object that owns the addressed Thread\n * (`namespace.idFromName(threadId)` — the identity rule, plan §1.2). The envelopes are\n * already Schema-encoded JSON, so the RPC boundary carries only structured-cloneable values;\n * the protocol module stays transport-agnostic and fetch-with-JSON remains the documented\n * fallback carrier.\n *\n * Every delivery problem — stub construction, RPC rejection, overload, deploy-in-progress —\n * surfaces as `PortTransportError` (preserving the platform stub's own `retryable` signal\n * when present) and NEVER as a fabricated answer: on `resolveAdmission` the routing layer\n * turns exactly this error into `AdmissionIndeterminate` (SUB-031).\n */\nexport const threadPortTransportLayer: Layer.Layer<\n ThreadPortTransport,\n never,\n ThreadObjectNamespace\n> = Layer.effect(ThreadPortTransport)(\n Effect.gen(function* () {\n const namespace = yield* ThreadObjectNamespace;\n\n return ThreadPortTransport.of({\n call: (threadId, request) =>\n callThreadObject(\n threadId,\n (target) => target.portCall(request),\n (cause) => portTransportFailure(threadId, cause),\n ).pipe(\n Effect.provideService(ThreadObjectNamespace, namespace),\n Effect.withSpan(\"CloudflarePortTransport.call\", {\n attributes: { threadId },\n }),\n ),\n });\n }),\n);\n","import { ThreadId, type SubmissionId } from \"@effect-agent/core/Identifiers\";\nimport {\n type RunContextPreparation,\n type RunCostEstimator,\n type RunToolFailureObserver,\n} from \"@effect-agent/engine/RunOptions\";\nimport {\n CurrentToolFailureObserver,\n RunContextPreparationPassthrough,\n RunToolAuthorization,\n toolFailureObserverLayer,\n} from \"@effect-agent/engine/RunOptions\";\nimport { doMessageDeliveryStoreLayer } from \"@effect-agent/storage-cloudflare/DoMessageDeliveryStore\";\nimport {\n type DoStorageFailpointHandler,\n type DoStorageFailpoint,\n} from \"@effect-agent/storage-cloudflare/DoStorageFailpoint\";\nimport { submissionLedgerLayer } from \"@effect-agent/storage-cloudflare/DoSubmissionLedger\";\nimport {\n threadStoreLayer,\n storageConfigLayer,\n storageFailpointLayer,\n type DoStorageInitializationError,\n type DoStorageOptions,\n} from \"@effect-agent/storage-cloudflare/DoThreadStore\";\nimport { type PortRequest, type PortResponse } from \"@effect-agent/storage-cloudflare/PortProtocol\";\nimport {\n executePortRequest,\n routedThreadStoreLayer,\n routedSubmissionLedgerLayer,\n} from \"@effect-agent/storage-cloudflare/PortRouting\";\nimport {\n compileRegistrations,\n type AgentRegistration,\n type ResolvedBinding,\n} from \"@effect-agent/thread/AgentRegistration\";\nimport { type DigestError } from \"@effect-agent/thread/Digest\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n} from \"@effect-agent/thread/DurableAgentRuntime\";\nimport {\n DurableRuntimeFailpoint,\n type DurableRuntimeFailpointHandler,\n} from \"@effect-agent/thread/DurableFailpoint\";\nimport {\n type MessageDeliveryStore,\n MessageDeliveryDriver,\n type MessageDeliveryError,\n} from \"@effect-agent/thread/MessageDelivery\";\nimport {\n operationAuthorizerLayer,\n type OperationAuthorizerService,\n} from \"@effect-agent/thread/OperationAuthorizer\";\nimport { type PreparedInputAdmission } from \"@effect-agent/thread/PreparedInputAdmission\";\nimport { ProducerId } from \"@effect-agent/thread/Records\";\nimport {\n LedgerError,\n SubmissionLedger,\n SubmissionLookupById,\n type SubmissionSnapshot,\n} from \"@effect-agent/thread/SubmissionLedger\";\nimport { ThreadProjectionMaintenance } from \"@effect-agent/thread/ThreadProjectionMaintenance\";\nimport { ThreadStoreError, ThreadStore } from \"@effect-agent/thread/ThreadStore\";\nimport { ToolReconciler } from \"@effect-agent/thread/ToolReconciler\";\nimport { type WakeScheduler } from \"@effect-agent/thread/WakeScheduler\";\nimport { BrowserCrypto } from \"@effect/platform-browser\";\nimport { SqliteClient } from \"@effect/sql-sqlite-do\";\nimport {\n type Crypto,\n Cause,\n Context,\n Duration,\n Effect,\n Layer,\n Schema,\n Semaphore,\n type Option,\n} from \"effect\";\nimport { SqlClient } from \"effect/unstable/sql/SqlClient\";\n\nimport {\n ThreadMaintenance,\n ThreadMutationGate,\n ThreadPublication,\n publishCommitted,\n ThreadMaintenanceFailpoint,\n DurableAlarmService,\n type ThreadMaintenanceFailpointHandler,\n} from \"../Alarm.ts\";\nimport {\n ThreadObjectIdentity,\n ThreadObjectPlacement,\n DurableObjectContext,\n type ThreadObjectNamespace,\n} from \"../CloudflareBindings.ts\";\nimport {\n CLOUDFLARE_RUNTIME_DEFAULTS,\n CloudflareDurableRuntimeConfig,\n CloudflareDurableRuntimeConfigValue,\n CloudflarePlatformConfigError,\n} from \"../CloudflareConfig.ts\";\nimport { CloudflareThreadClient } from \"../CloudflareThreadClient.ts\";\nimport { cloudflareWakeSchedulerLayer } from \"../WakeScheduler.ts\";\nimport {\n guardedMessageDeliveryStoreLayer,\n threadMessageDeliveryLayer,\n} from \"./message-delivery.ts\";\nimport { cloudflarePreparedInputAdmissionLayer } from \"./prepared-admission.ts\";\nimport { ProgressWaitRegistry } from \"./progress-wait.ts\";\nimport { threadPortTransportLayer } from \"./transport.ts\";\n\n/**\n * Raw (unvalidated) construction options for `ThreadObject.make`, mirroring\n * `NodeDurableAgentRuntimeOptions`. Optional fields default to the documented production values\n * (`CLOUDFLARE_RUNTIME_DEFAULTS`); everything is schema-decoded into\n * `CloudflareDurableRuntimeConfigValue` before any resource opens (deployment §5 gate 1).\n */\nexport interface CloudflareDurableRuntimeOptions {\n readonly deploymentId: string;\n /** Head of the minted producer identity `{producerPrefix}:{threadId}`. */\n readonly producerPrefix: string;\n /** Milliseconds; default 30s (D5). */\n readonly ownershipLeaseDuration?: number | undefined;\n /** Milliseconds; default 100. */\n readonly alarmBackoffBase?: number | undefined;\n /** Milliseconds; default 5000. */\n readonly alarmBackoffCap?: number | undefined;\n /** Milliseconds; default 1000. Bounds every alarm re-arm delay. */\n readonly wakeScanInterval?: number | undefined;\n /** Milliseconds; default 500. */\n readonly settlementPollInterval?: number | undefined;\n /** Milliseconds; default 10000. */\n readonly leaseRenewalInterval?: number | undefined;\n /** Milliseconds; default 500. */\n readonly abortPollInterval?: number | undefined;\n /** Deployment-owned pricing authority used by durable cost budgets and settlements. */\n readonly estimateCostMicrousd?: RunCostEstimator | undefined;\n /** Closed trusted Tool failure reporting. Omission masks ambient observers at construction. */\n readonly toolFailureObserver?: RunToolFailureObserver | undefined;\n /** Milliseconds; default 25. */\n readonly observationPollInterval?: number | undefined;\n /** Bytes; default just under the 2 MB platform value limit. */\n readonly maxStoredValueBytes?: number | undefined;\n /** Default false. */\n readonly verifyOnOpen?: boolean | undefined;\n /** Nonterminal Submissions per lane before admission refuses; default 256. */\n readonly maxQueueDepthPerLane?: number | undefined;\n /** Encoded input bytes per Submission; default = the stored-value bound. */\n readonly maxInputBytes?: number | undefined;\n /** `ctx.storage.sql.databaseSize` ceiling at admission; default 9 GB (10 GB platform cap). */\n readonly maxDatabaseBytes?: number | undefined;\n /**\n * Durable Object storage fault injection (`ledger:*` / `append:*` locations). Handlers are\n * constructed per incarnation WITH the live `DurableObjectState`, so eviction harnesses can\n * map an armed hit to `ctx.abort()` — the platform's real failure mode. Default none.\n */\n readonly storageFailpoint?: ((ctx: DurableObjectState) => DoStorageFailpointHandler) | undefined;\n /** Coordinator fault injection (`submit:*` / `terminalize:*` locations); default none. */\n readonly runtimeFailpoint?:\n | ((ctx: DurableObjectState) => DurableRuntimeFailpointHandler)\n | undefined;\n /** Thread-maintenance generation/alarm fault injection; default none. */\n readonly maintenanceFailpoint?:\n | ((ctx: DurableObjectState) => ThreadMaintenanceFailpointHandler)\n | undefined;\n /** Host-supplied fail-closed authorization policy; defaults to service possession. */\n readonly operationAuthorizer?: OperationAuthorizerService | undefined;\n /**\n * Reconciliation policy consulted for open ordinary Tool Calls before an Unknown Outcome\n * is recorded (durability §10, DUR-009). Defaults to the fail-closed\n * `ToolReconciler.uncertain`.\n */\n readonly toolReconciler?: Layer.Layer<ToolReconciler> | undefined;\n}\n\n/** Services supplied before the application graph is built, including its dependencies. */\nexport type CloudflareBootstrapServices =\n | CloudflareDurableRuntimeConfig\n | ThreadObjectIdentity\n | ThreadObjectPlacement\n | DurableRuntimeConfig\n | Crypto.Crypto\n | DoStorageFailpoint\n | DurableRuntimeFailpoint\n | ThreadMaintenanceFailpoint\n | RunContextPreparation\n | RunToolAuthorization\n | ToolReconciler;\n\n/** Every construction failure of the assembled Cloudflare durable runtime stack. */\nexport type CloudflareDurableRuntimeInitializationError =\n | CloudflarePlatformConfigError\n | DigestError\n | MessageDeliveryError\n | DoStorageInitializationError;\n\n/**\n * The services `ThreadObject.layer` provides, including its single owner SQL client.\n * Its Context also supplies ThreadMessageDelivery (a defaulted Reference, with no required R)\n * so application-composed maintenance retains the same native message recovery capability.\n */\nexport type CloudflareDurableRuntimeServices =\n | DurableAgentRuntime\n | SubmissionLedger\n | ThreadStore\n | MessageDeliveryStore\n | WakeScheduler\n | DurableAlarmService\n | ThreadMaintenance\n | ThreadMutationGate\n | ThreadPublication\n | ThreadProjectionMaintenance\n | ThreadObjectPorts\n | ProgressWaitRegistry\n | SqlClient;\n\n/**\n * Owner-side execution port for a `portCall` request the wire endpoint has already decoded.\n * It executes against THIS Object's LOCAL port facets — never the routed decorators, so a\n * request cannot bounce between Objects — and returns the typed response for the endpoint to\n * encode.\n */\nexport class ThreadObjectPorts extends Context.Service<\n ThreadObjectPorts,\n {\n readonly handle: (request: PortRequest) => Effect.Effect<PortResponse>;\n /** Local-only identity check before a bound RPC can read or mutate a Submission. */\n readonly lookupSubmission: (\n submissionId: SubmissionId,\n ) => Effect.Effect<Option.Option<SubmissionSnapshot>, LedgerError>;\n }\n>()(\"@effect-agent/platform-cloudflare/ThreadObjectPorts\") {}\n\nconst decodeConfigValue = Schema.decodeUnknownEffect(CloudflareDurableRuntimeConfigValue);\nconst decodeThreadId = Schema.decodeUnknownEffect(ThreadId);\nconst decodeProducerId = Schema.decodeUnknownEffect(ProducerId);\n\nconst configFromOptions = (\n options: CloudflareDurableRuntimeOptions,\n): Effect.Effect<CloudflareDurableRuntimeConfigValue, CloudflarePlatformConfigError> =>\n decodeConfigValue({\n deploymentId: options.deploymentId,\n producerPrefix: options.producerPrefix,\n ownershipLeaseDuration:\n options.ownershipLeaseDuration ?? CLOUDFLARE_RUNTIME_DEFAULTS.ownershipLeaseDuration,\n alarmBackoffBase: options.alarmBackoffBase ?? CLOUDFLARE_RUNTIME_DEFAULTS.alarmBackoffBase,\n alarmBackoffCap: options.alarmBackoffCap ?? CLOUDFLARE_RUNTIME_DEFAULTS.alarmBackoffCap,\n wakeScanInterval: options.wakeScanInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.wakeScanInterval,\n settlementPollInterval:\n options.settlementPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.settlementPollInterval,\n leaseRenewalInterval:\n options.leaseRenewalInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.leaseRenewalInterval,\n abortPollInterval: options.abortPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.abortPollInterval,\n observationPollInterval:\n options.observationPollInterval ?? CLOUDFLARE_RUNTIME_DEFAULTS.observationPollInterval,\n maxStoredValueBytes:\n options.maxStoredValueBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxStoredValueBytes,\n verifyOnOpen: options.verifyOnOpen ?? CLOUDFLARE_RUNTIME_DEFAULTS.verifyOnOpen,\n limits: {\n maxQueueDepthPerLane:\n options.maxQueueDepthPerLane ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxQueueDepthPerLane,\n maxInputBytes: Math.min(\n options.maxInputBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxInputBytes,\n options.maxStoredValueBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxStoredValueBytes,\n ),\n maxDatabaseBytes: options.maxDatabaseBytes ?? CLOUDFLARE_RUNTIME_DEFAULTS.maxDatabaseBytes,\n },\n }).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `Invalid Cloudflare durable runtime configuration: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/**\n * The Thread this Object owns, from the Object identity rule (plan §1.2): Thread\n * Objects are addressed exclusively by `idFromName(threadId)`, so `ctx.id.name` IS the\n * Thread ID. An unnamed Object (from `newUniqueId`) is a deployment error, not a lane.\n */\nconst threadIdFromState = (\n ctx: DurableObjectState,\n): Effect.Effect<ThreadId, CloudflarePlatformConfigError> =>\n ctx.id.name === undefined\n ? Effect.fail(\n CloudflarePlatformConfigError.make({\n message:\n \"This Durable Object was not created via idFromName(threadId); Thread \" +\n \"Objects must be addressed by their Thread identity (plan §1.2).\",\n }),\n )\n : decodeThreadId(ctx.id.name).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `The Durable Object name is not a valid ThreadId: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/**\n * Validate deployment settings and derive services before building application dependencies.\n * The native class factory builds this Layer inside its constructor gate. Custom Effect hosts\n * can provide it around the complete application Layer with the native context already supplied.\n */\nconst runtimeConfigLayer = (\n options: CloudflareDurableRuntimeOptions,\n producerId: ProducerId,\n): Layer.Layer<\n Exclude<CloudflareBootstrapServices, ThreadObjectIdentity | ThreadObjectPlacement>,\n CloudflarePlatformConfigError,\n DurableObjectContext\n> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const config = yield* configFromOptions(options);\n\n return Layer.mergeAll(\n Layer.succeed(CloudflareDurableRuntimeConfig, config),\n DurableRuntimeConfig.layer({\n deploymentId: config.deploymentId,\n producerId,\n settlementPollInterval: Duration.millis(config.settlementPollInterval),\n leaseRenewalInterval: Duration.millis(config.leaseRenewalInterval),\n abortPollInterval: Duration.millis(config.abortPollInterval),\n ...(options.estimateCostMicrousd === undefined\n ? {}\n : { estimateCostMicrousd: options.estimateCostMicrousd }),\n }),\n BrowserCrypto.layer,\n storageFailpointLayer({ storage: ctx.storage, failpoint: options.storageFailpoint?.(ctx) }),\n options.runtimeFailpoint === undefined\n ? DurableRuntimeFailpoint.layer\n : Layer.succeed(DurableRuntimeFailpoint, { hit: options.runtimeFailpoint(ctx) }),\n options.maintenanceFailpoint === undefined\n ? ThreadMaintenanceFailpoint.layer\n : Layer.succeed(ThreadMaintenanceFailpoint, {\n hit: options.maintenanceFailpoint(ctx),\n }),\n options.toolReconciler ?? ToolReconciler.uncertain,\n options.operationAuthorizer === undefined\n ? Layer.empty\n : operationAuthorizerLayer(options.operationAuthorizer),\n options.toolFailureObserver === undefined\n ? Layer.succeed(CurrentToolFailureObserver, undefined)\n : toolFailureObserverLayer(options.toolFailureObserver),\n RunContextPreparationPassthrough,\n RunToolAuthorization.allowAll,\n );\n }),\n );\n\nconst producerIdentity = (prefix: string, owner: string) =>\n decodeProducerId(`${prefix}:${owner}`).pipe(\n Effect.mapError((error) =>\n CloudflarePlatformConfigError.make({\n message: `The minted producer identity is invalid: ${error.message}`,\n cause: error,\n }),\n ),\n );\n\n/** Native one-Thread configuration; retains its existing producer and logical identities. */\nexport const layerConfig = (\n options: CloudflareDurableRuntimeOptions,\n): Layer.Layer<CloudflareBootstrapServices, CloudflarePlatformConfigError, DurableObjectContext> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const threadId = yield* threadIdFromState(ctx);\n const producerId = yield* producerIdentity(options.producerPrefix, threadId);\n\n return Layer.mergeAll(\n runtimeConfigLayer(options, producerId),\n Layer.succeed(ThreadObjectIdentity, { threadId, producerId }),\n Layer.succeed(ThreadObjectPlacement, { ownsThread: (target) => target === threadId }),\n );\n }),\n );\n\n/**\n * Configuration for an application Object owning several logical Threads. The producer is\n * the stable physical Object. No logical identity is installed globally: handleRpc binds and\n * validates it per request using the placement guard and this actual runtime producer.\n */\nexport const layerHostConfig = (\n options: CloudflareDurableRuntimeOptions,\n ownsThread: (threadId: ThreadId) => boolean,\n): Layer.Layer<\n Exclude<CloudflareBootstrapServices, ThreadObjectIdentity>,\n CloudflarePlatformConfigError,\n DurableObjectContext\n> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const producerId = yield* producerIdentity(options.producerPrefix, ctx.id.toString());\n\n return Layer.merge(\n runtimeConfigLayer(options, producerId),\n Layer.succeed(ThreadObjectPlacement, { ownsThread }),\n );\n }),\n );\n\nexport interface ThreadPublicationOptions<E = never, R = never, P = never> {\n /**\n * Optional host outbox consumer, built once per incarnation with RAW LOCAL ThreadStore and\n * SubmissionLedger services. Yield DurableObjectContext and ThreadObjectIdentity for native\n * bindings and identity. Initialization is local-only, inside the constructor gate; setup\n * errors and additional requirements remain in the returned Layer. Layer.effect owns Scope.\n * Canonical appends and durable approval, abort and unknown-resolution intents invalidate\n * publication after commit. Custom host facts must use ThreadMaintenance.withMutation.\n */\n readonly publication?: Layer.Layer<ThreadPublication, E, R>;\n /**\n * Disposable index maintenance, built once with the raw local ThreadStore and owner\n * SqlClient. Additional services P are exposed by the returned Layer, allowing Tool\n * handlers and maintenance to share one index instance. Construction is local-only.\n * Live committed batches run before append returns; bounded backfill uses the native\n * alarm without delaying execution behind projection backlog.\n */\n readonly projection?: Layer.Layer<ThreadProjectionMaintenance | P, E, R>;\n}\n\n/**\n * Register typed Agents and version declarations. Hashing and dependency capture happen in\n * this Layer's Scope, after application Layers have been provided. Every Agent's instruction,\n * Tool, Schema, and model requirements remain visible until satisfied by Layer composition.\n * Use Layer.unwrap for registration values that need effectful application setup.\n */\nconst registeredLayer = <\n const Entries extends ReadonlyArray<AgentRegistration>,\n E = never,\n R = never,\n>(\n registrations: Entries,\n options: ThreadPublicationOptions<E, R> = {},\n) =>\n Layer.unwrap(\n Effect.map(compileRegistrations(registrations), (bindings) => boundLayer(bindings, options)),\n );\n\n/** Preserve additional index services only when a projection Layer is actually supplied. */\nexport function layer<\n const Entries extends ReadonlyArray<AgentRegistration>,\n E = never,\n R = never,\n P = never,\n PE = never,\n PR = never,\n>(\n registrations: Entries,\n options: Omit<ThreadPublicationOptions<E, R>, \"projection\"> & {\n readonly projection: Layer.Layer<ThreadProjectionMaintenance | P, PE, PR>;\n },\n): Layer.Layer<\n Layer.Success<ReturnType<typeof registeredLayer<Entries, E | PE, R | PR>>> | P,\n Layer.Error<ReturnType<typeof registeredLayer<Entries, E | PE, R | PR>>>,\n Layer.Services<ReturnType<typeof registeredLayer<Entries, E | PE, R | PR>>>\n>;\n\nexport function layer<const Entries extends ReadonlyArray<AgentRegistration>, E = never, R = never>(\n registrations: Entries,\n options?: ThreadPublicationOptions<E, R>,\n): ReturnType<typeof registeredLayer<Entries, E, R>>;\n\nexport function layer<const Entries extends ReadonlyArray<AgentRegistration>, E = never, R = never>(\n registrations: Entries,\n options: ThreadPublicationOptions<E, R> = {},\n) {\n return registeredLayer(registrations, options);\n}\n\nexport function layerFromBindings<E = never, R = never, P = never, PE = never, PR = never>(\n bindings: ReadonlyArray<ResolvedBinding>,\n options: Omit<ThreadPublicationOptions<E, R>, \"projection\"> & {\n readonly projection: Layer.Layer<ThreadProjectionMaintenance | P, PE, PR>;\n },\n): Layer.Layer<\n CloudflareDurableRuntimeServices | P,\n Layer.Error<ReturnType<typeof boundLayer<E | PE, R | PR>>>,\n Layer.Services<ReturnType<typeof boundLayer<E | PE, R | PR>>>\n>;\n\nexport function layerFromBindings<E = never, R = never>(\n bindings: ReadonlyArray<ResolvedBinding>,\n options?: ThreadPublicationOptions<E, R>,\n): ReturnType<typeof boundLayer<E, R>>;\n\nexport function layerFromBindings(\n bindings: ReadonlyArray<ResolvedBinding>,\n): ReturnType<typeof boundLayer<never, never>>;\n\nexport function layerFromBindings<E = never, R = never>(\n bindings: ReadonlyArray<ResolvedBinding>,\n options: ThreadPublicationOptions<E, R> = {},\n) {\n return boundLayer(bindings, options);\n}\n\n/**\n * Assemble the durable runtime from already-resolved Agent Bindings.\n * Use `ThreadObject.layer` to compile typed Agent registrations instead.\n * Supply host services through `ThreadObject.make` or `ThreadObject.layerConfig` and\n * the Durable Object context and namespace Layers when composing a custom host.\n */\nconst boundLayer = <E = never, R = never>(\n bindings: ReadonlyArray<ResolvedBinding>,\n options: ThreadPublicationOptions<E, R> = {},\n): Layer.Layer<\n CloudflareDurableRuntimeServices,\n DoStorageInitializationError | MessageDeliveryError | E,\n | DurableObjectContext\n | ThreadObjectNamespace\n | CloudflareBootstrapServices\n | Exclude<R, ThreadStore | SubmissionLedger | SqlClient>\n> =>\n Layer.unwrap(\n Effect.map(DurableObjectContext, ({ ctx }) =>\n sharedLayer(DurableAgentRuntime.layerWithBindings(bindings), options).pipe(\n Layer.provideMerge(SqliteClient.layer({ storage: ctx.storage })),\n ),\n ),\n );\n\n/**\n * Build the application runtime over the existing owner SqlClient and native ports, then\n * assemble its one maintenance coordinator. The application may acquire its Bindings from\n * those ports and expose extra services, including ThreadHostMaintenance. It must not acquire\n * another runtime stack or require ThreadMaintenance while constructing this Layer.\n * Supply layerHostConfig and deterministic placement; dispatch addressed ingress with handleRpc.\n */\nexport function layerInHost<A, E, R, P = never, PE = never, PR = never>(\n application: Layer.Layer<DurableAgentRuntime | A, E, R>,\n options: Omit<ThreadPublicationOptions<PE, PR>, \"projection\"> & {\n readonly projection: Layer.Layer<ThreadProjectionMaintenance | P, PE, PR>;\n },\n): Layer.Layer<\n CloudflareDurableRuntimeServices | A | P,\n Layer.Error<ReturnType<typeof sharedLayer<A, E, R, PE, PR>>>,\n Layer.Services<ReturnType<typeof sharedLayer<A, E, Exclude<R, P>, PE, PR>>>\n>;\n\nexport function layerInHost<A, E, R, PE = never, PR = never>(\n application: Layer.Layer<DurableAgentRuntime | A, E, R>,\n options?: ThreadPublicationOptions<PE, PR>,\n): ReturnType<typeof sharedLayer<A, E, R, PE, PR>>;\n\nexport function layerInHost<A, E, R, PE = never, PR = never>(\n application: Layer.Layer<DurableAgentRuntime | A, E, R>,\n options: ThreadPublicationOptions<PE, PR> = {},\n) {\n return sharedLayer(application, options);\n}\n\ntype HostRuntimeServices = Exclude<\n CloudflareDurableRuntimeServices,\n DurableAgentRuntime | ThreadMaintenance\n>;\n\nconst sharedLayer = <A, E, R, PE = never, PR = never>(\n application: Layer.Layer<DurableAgentRuntime | A, E, R>,\n options: ThreadPublicationOptions<PE, PR> = {},\n): Layer.Layer<\n CloudflareDurableRuntimeServices | A,\n DoStorageInitializationError | MessageDeliveryError | E | PE,\n | DurableObjectContext\n | ThreadObjectNamespace\n | Exclude<CloudflareBootstrapServices, ThreadObjectIdentity>\n | SqlClient\n | Exclude<R, HostRuntimeServices | PreparedInputAdmission>\n | Exclude<PR, ThreadStore | SubmissionLedger | SqlClient>\n> =>\n Layer.unwrap(\n Effect.gen(function* () {\n const { ctx } = yield* DurableObjectContext;\n const config = yield* CloudflareDurableRuntimeConfig;\n const { ownsThread } = yield* ThreadObjectPlacement;\n\n const storageOptions: DoStorageOptions = {\n storage: ctx.storage,\n observationPollInterval: config.observationPollInterval,\n ownershipLeaseDuration: config.ownershipLeaseDuration,\n maxStoredValueBytes: config.maxStoredValueBytes,\n verifyOnOpen: config.verifyOnOpen,\n };\n\n const infrastructure = Layer.mergeAll(\n storageConfigLayer(storageOptions),\n Layer.effect(SqlClient)(SqlClient),\n );\n\n // The same local ports serve routed decorators and owner-side RPC execution.\n // The RPC executor must never receive routed ports and bounce requests between Objects.\n const rawLocalPorts = Layer.mergeAll(threadStoreLayer, submissionLedgerLayer).pipe(\n Layer.provide(infrastructure),\n );\n\n const base = Layer.mergeAll(DurableAlarmService.layer, ProgressWaitRegistry.layer);\n const wakes = cloudflareWakeSchedulerLayer.pipe(Layer.provide(base));\n\n const messageStore = guardedMessageDeliveryStoreLayer.pipe(\n Layer.provide(doMessageDeliveryStoreLayer().pipe(Layer.provide(infrastructure))),\n Layer.provide(wakes),\n );\n\n const messageRecovery = threadMessageDeliveryLayer.pipe(\n // Each wave is bounded even at the policy's five-minute attempt ceiling. Source\n // completion stops new waves; remaining rows retain their indexed alarm deadline.\n Layer.provide(MessageDeliveryDriver.layer({ batchSize: 4, concurrency: 4 })),\n Layer.provide(cloudflarePreparedInputAdmissionLayer),\n Layer.provide(CloudflareThreadClient.layer),\n Layer.provide(messageStore),\n Layer.provide(wakes),\n );\n\n const publication = (options.publication ?? ThreadPublication.layer).pipe(\n Layer.provide(Layer.mergeAll(rawLocalPorts, Layer.effect(SqlClient)(SqlClient))),\n );\n\n const projection = (options.projection ?? ThreadProjectionMaintenance.layer).pipe(\n Layer.provide(Layer.mergeAll(rawLocalPorts, Layer.effect(SqlClient)(SqlClient))),\n );\n\n const localPorts =\n options.publication === undefined && options.projection === undefined\n ? rawLocalPorts\n : Layer.effectContext(\n Effect.gen(function* () {\n const store = yield* ThreadStore;\n const ledger = yield* SubmissionLedger;\n const mutations = yield* ThreadMutationGate;\n const index = yield* ThreadProjectionMaintenance;\n const publish = yield* Effect.context<ThreadPublication>();\n const afterCommit = publishCommitted.pipe(Effect.provide(publish));\n // A later append cannot mistake its still-projecting predecessor for old backlog.\n // Publication remains outside this local source/index critical section.\n const sourceCommits = yield* Semaphore.make(1);\n\n // Every runtime-owned producer prearms too: a crash between commit and invalidation\n // leaves a NEW, uncertified generation. Source errors keep their native port types.\n const observedStore = ThreadStore.of({\n ...store,\n append: (request) =>\n mutations\n .withMutation(\n sourceCommits\n .withPermit(\n store\n .append(request)\n .pipe(\n Effect.tap((result) =>\n index\n .applyCommitted(request, result)\n .pipe(\n Effect.catchCause((cause) =>\n Cause.hasInterrupts(cause)\n ? Effect.interrupt\n : Effect.logError(\n \"Thread projection deferred after source commit\",\n cause,\n ),\n ),\n ),\n ),\n ),\n )\n .pipe(Effect.tap(() => afterCommit)),\n )\n .pipe(\n Effect.catchTag(\"DurableAlarmError\", (cause) =>\n ThreadStoreError.make({\n operation: \"prearm publication append\",\n message: cause.message,\n cause,\n }),\n ),\n ),\n });\n\n const observeIntent = <A, Failure>(body: Effect.Effect<A, Failure>) =>\n mutations.withMutation(body.pipe(Effect.tap(() => afterCommit))).pipe(\n Effect.catchTag(\"DurableAlarmError\", (cause) =>\n LedgerError.make({\n operation: \"prearm publication intent\",\n message: \"The publication generation could not be armed\",\n cause,\n }),\n ),\n );\n\n return Context.make(ThreadStore, observedStore).pipe(\n Context.add(SubmissionLedger, {\n ...ledger,\n recordApprovalDecision: (request) =>\n observeIntent(ledger.recordApprovalDecision(request)),\n requestAbort: (request) => observeIntent(ledger.requestAbort(request)),\n recordUnknownResolution: (request) =>\n observeIntent(ledger.recordUnknownResolution(request)),\n }),\n );\n }),\n ).pipe(Layer.provide(rawLocalPorts));\n\n const portsEndpointLayer = Layer.effect(ThreadObjectPorts)(\n Effect.gen(function* () {\n const local = yield* Effect.context<SubmissionLedger | ThreadStore>();\n const ledger = Context.get(local, SubmissionLedger);\n\n return ThreadObjectPorts.of({\n handle: (request) => executePortRequest(request).pipe(Effect.provide(local)),\n lookupSubmission: (submissionId) =>\n ledger.lookup(SubmissionLookupById.make({ submissionId })),\n });\n }),\n ).pipe(Layer.provide(localPorts));\n\n const routedPorts = Layer.mergeAll(\n routedSubmissionLedgerLayer({ ownsThread }),\n routedThreadStoreLayer({ ownsThread }),\n ).pipe(Layer.provide(localPorts), Layer.provide(threadPortTransportLayer));\n\n const runtimeStack = application.pipe(\n Layer.provide(\n cloudflarePreparedInputAdmissionLayer.pipe(Layer.provide(CloudflareThreadClient.layer)),\n ),\n Layer.provideMerge(messageStore),\n Layer.provideMerge(routedPorts),\n Layer.provideMerge(wakes),\n Layer.provideMerge(base),\n Layer.provideMerge(portsEndpointLayer),\n );\n\n return Layer.mergeAll(\n runtimeStack,\n ThreadMaintenance.layer.pipe(Layer.provide(runtimeStack), Layer.provide(messageRecovery)),\n portsEndpointLayer,\n messageStore,\n messageRecovery,\n ).pipe(\n Layer.provideMerge(publication),\n Layer.provideMerge(projection),\n Layer.provideMerge(ThreadMutationGate.layer),\n Layer.provideMerge(infrastructure),\n );\n }),\n );\n","import { type AgentId, type ThreadId } from \"@effect-agent/core/Identifiers\";\nimport { SubmissionId } from \"@effect-agent/core/Identifiers\";\nimport {\n decodePortRequest,\n encodePortResponse,\n LedgerLookupResult,\n PortFailed,\n PortProtocolError,\n PortSucceeded,\n type PortRequest,\n type PortResponse,\n} from \"@effect-agent/storage-cloudflare/PortProtocol\";\nimport {\n IntegrityReport,\n ObligationReport,\n ObligationThresholds,\n RecoveryExplanation,\n RetryCommand,\n RetryRefused,\n} from \"@effect-agent/thread/Admin\";\nimport { DigestError } from \"@effect-agent/thread/Digest\";\nimport {\n DurableAgentRuntime,\n DurableRuntimeConfig,\n RecoveryReport,\n type DurableSubmitAgent,\n} from \"@effect-agent/thread/DurableAgentRuntime\";\nimport { DurableRuntimeFailpointError } from \"@effect-agent/thread/DurableFailpoint\";\nimport {\n OperationAuthorizationRequest,\n OperationAuthorizer,\n OperationDenied,\n} from \"@effect-agent/thread/OperationAuthorizer\";\nimport { PersistedJson } from \"@effect-agent/thread/Records\";\nimport { RunJournalError } from \"@effect-agent/thread/RunJournal\";\nimport {\n AdmissionPolicyError,\n LedgerError,\n OwnershipLost,\n SettlementConflict,\n SubmissionLedger,\n SubmissionLookupByKey,\n} from \"@effect-agent/thread/SubmissionLedger\";\nimport {\n AppendConflict,\n ThreadNotMaterialized,\n ThreadRead,\n ThreadStore,\n ThreadStoreError,\n FenceRejected,\n} from \"@effect-agent/thread/ThreadStore\";\nimport { WakeScheduler } from \"@effect-agent/thread/WakeScheduler\";\nimport { Effect, Layer, Option, Schema, Stream } from \"effect\";\nimport {\n DurableObject as EffectCfDurableObject,\n DurableObjectState as EffectCfDurableObjectState,\n WorkerEnvironment,\n} from \"effect-cf\";\n\nimport {\n ThreadMaintenance,\n DurableAlarmError,\n DurableAlarmService,\n ThreadMutationGate,\n publishCommitted,\n type MaintenancePassFailure,\n} from \"./Alarm.ts\";\nimport {\n ThreadObjectIdentity,\n ThreadObjectPlacement,\n DurableObjectContext,\n ThreadObjectNamespace,\n threadNamespaceFromEnv,\n type CloudflareBindingError,\n} from \"./CloudflareBindings.ts\";\nimport { AdmissionLimitExceeded, CloudflareDurableRuntimeConfig } from \"./CloudflareConfig.ts\";\nimport {\n AbortRecorded,\n ApprovalRecorded,\n HostFailed,\n HostProtocolError,\n ObservedPage,\n ProgressObserved,\n ProgressCancelled,\n SettlementReached,\n SubmissionStatusResponse,\n SubmitSucceeded,\n UnknownResolutionRecorded,\n boundHostDiagnostic,\n decodeAbortCommand,\n decodeAwaitProgressRequest,\n decodeCancelProgressRequest,\n decodeApprovalDecisionCommand,\n decodeObservePageRequest,\n decodeReceipt,\n decodeSubmitRequest,\n decodeUnknownResolutionCommand,\n encodeHostResponse,\n type HostFailure,\n type HostResponse,\n type SubmitRequest,\n} from \"./CloudflareThreadClient.ts\";\nimport {\n layerConfig,\n ThreadObjectPorts,\n type CloudflareDurableRuntimeInitializationError,\n type CloudflareDurableRuntimeOptions,\n type CloudflareDurableRuntimeServices,\n type CloudflareBootstrapServices,\n} from \"./internal/layers.ts\";\nimport { ProgressWaitRegistry } from \"./internal/progress-wait.ts\";\n\nexport {\n layer,\n layerConfig,\n layerHostConfig,\n layerInHost,\n ThreadObjectPorts,\n type ThreadPublicationOptions as PublicationOptions,\n type CloudflareDurableRuntimeOptions as RuntimeOptions,\n type CloudflareDurableRuntimeServices as Services,\n type CloudflareDurableRuntimeInitializationError as InitializationError,\n type CloudflareBootstrapServices as BootstrapServices,\n} from \"./internal/layers.ts\";\n\n/**\n * `ThreadObject.make(application, options)` — the Thread Durable Object\n * (plan §1.4,\n * D-P6-1): a factory returning a class that applications export from their Worker entry.\n * One SQLite-backed Object per Thread is the serialized owner (durability §6); the\n * Object never runs `runResolvedWorker`'s infinite loop — each ingress event or alarm runs\n * ONE bounded `runRecovery` + `processThreadHead` pass, and the persisted alarm\n * (the single multiplexed slot, D-P6-2) finishes accepted work across evictions WITHOUT any\n * incoming request.\n * `Services` exposes the same owner `SqlClient` used by the Thread stores. Compose optional\n * local repositories after `ThreadObject.layer`; never acquire another independently locked\n * SQL client for the same Object. Exposing the client installs no additional storage schemas.\n *\n * Constructor gate (`blockConcurrencyWhile`) is LOCAL-ONLY: schema migration and the\n * exact-version check, configuration decode, and the defensive ensure-alarm half of the\n * alarm invariant. It deliberately does NOT run the recovery pass: parent recovery can\n * require child-Object reads and vice versa, and two Objects blocked in constructor gates\n * awaiting each other's RPC would deadlock (plan §1.4). Instead every pass runs\n * `runRecovery` BEFORE any claim, so reconciliation still strictly precedes new work.\n */\n\n/** Construction options for one deployed Thread Object class. */\nexport interface Options<\n ApplicationServices = never,\n EventServices = never,\n EventLayerError = never,\n> extends CloudflareDurableRuntimeOptions {\n /** Accept transient native RPC tracing through effect-cf; disabled by default. */\n readonly rpcTracing?: boolean;\n /**\n * Name of the Worker `env` binding carrying THIS class's `DurableObjectNamespace` — the\n * Object's route back to sibling Thread Objects for the WP2 cross-Object port calls\n * and remote wakes (DEPLOY-010: the binding enters through a Layer, never ambiently).\n */\n readonly namespaceBinding: string;\n /** Acquired and finalized per native event, with access to the complete application runtime. */\n readonly eventLayer?: Layer.Layer<\n EventServices,\n EventLayerError,\n | RuntimeServices\n | ApplicationServices\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n >;\n}\n\ntype EndpointServices =\n | CloudflareDurableRuntimeServices\n | CloudflareBootstrapServices\n | DurableObjectContext;\ntype RuntimeServices = EndpointServices | ThreadObjectNamespace;\ntype ThreadObjectInitializationError =\n | CloudflareDurableRuntimeInitializationError\n | CloudflareBindingError\n | MaintenancePassFailure;\n\n/** Classify only a decoded port request so new protocol members cannot bypass pre-arming. */\nconst isMutatingPortRequest = (request: PortRequest): boolean => {\n switch (request._tag) {\n case \"LedgerAdmit\":\n case \"LedgerMarkReady\":\n case \"LedgerRequestAbort\":\n case \"LedgerRecordChildSettled\":\n case \"StoreMaterialize\":\n case \"StoreAppend\":\n return true;\n case \"LedgerLookup\":\n case \"LedgerResolveAdmission\":\n case \"StoreReadPage\":\n case \"StoreInspectTail\":\n case \"StoreExport\":\n return false;\n }\n request satisfies never;\n\n return false;\n};\n\n/** The literal encoded `PortFailed(PortProtocolError)` fallback (same shape as WP2's). */\nconst encodedPortProtocolFailure = (message: string): unknown => ({\n _tag: \"PortFailed\",\n failure: { _tag: \"PortProtocolError\", message: boundHostDiagnostic(message) },\n});\n\nconst protocolFailure = (context: string) => (error: { readonly message: string }) =>\n HostProtocolError.make({\n message: boundHostDiagnostic(`${context}: ${error.message}`),\n });\n\n/** Fold one endpoint's typed failures into the uniform `HostResponse` envelope. */\nconst respond = <Result extends HostResponse, Failure extends HostFailure>(\n effect: Effect.Effect<Result, Failure, EndpointServices>,\n): Effect.Effect<HostResponse, never, EndpointServices> =>\n effect.pipe(\n Effect.map((result): HostResponse => result),\n Effect.catch((failure) => Effect.succeed<HostResponse>(HostFailed.make({ failure }))),\n );\n\n/** Encode the response envelope; an unencodable response degrades to a protocol failure. */\nconst encodeResponse = (response: HostResponse): Effect.Effect<unknown> =>\n encodeHostResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed<unknown>({\n _tag: \"HostFailed\",\n failure: {\n _tag: \"HostProtocolError\",\n message: boundHostDiagnostic(`The host response could not be encoded: ${error.message}`),\n },\n }),\n ),\n );\n\nconst utf8Bytes = (value: PersistedJson): number =>\n new TextEncoder().encode(JSON.stringify(value)).length;\n\n/**\n * The admission-limits gate, BEFORE `runtime.submit` touches the ledger (exit gate\n * \"resource limits are checked before admission\"; DEPLOY-007). A replayed idempotency key is\n * exempt: its accepted-work obligation already exists, and returning the original Receipt\n * consumes no new quota. Refusals are typed `AdmissionLimitExceeded` and nothing is written.\n */\nconst gateAdmissionLimits = Effect.fn(\"ThreadObject.gateAdmissionLimits\")(function* (\n threadId: ThreadId,\n request: {\n readonly principal: SubmissionLookupByKey[\"principal\"];\n readonly idempotencyKey: SubmissionLookupByKey[\"idempotencyKey\"];\n readonly inputPayload: PersistedJson;\n },\n) {\n const config = yield* CloudflareDurableRuntimeConfig;\n const ledger = yield* SubmissionLedger;\n const { ctx } = yield* DurableObjectContext;\n\n const existing = yield* ledger.lookup(\n SubmissionLookupByKey.make({\n threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n }),\n );\n\n if (Option.isSome(existing)) return;\n\n const inputBytes = utf8Bytes(request.inputPayload);\n\n if (inputBytes > config.limits.maxInputBytes) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"input-bytes\",\n actual: inputBytes,\n maximum: config.limits.maxInputBytes,\n });\n }\n\n const nonterminal = yield* ledger.scanNonterminal.pipe(\n Stream.filter((submission) => submission.threadId === threadId),\n Stream.runCollect,\n );\n\n if (nonterminal.length >= config.limits.maxQueueDepthPerLane) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"queue-depth\",\n actual: nonterminal.length,\n maximum: config.limits.maxQueueDepthPerLane,\n });\n }\n\n const databaseBytes = yield* Effect.sync(() => ctx.storage.sql.databaseSize);\n\n if (databaseBytes > config.limits.maxDatabaseBytes) {\n return yield* AdmissionLimitExceeded.make({\n limit: \"database-bytes\",\n actual: databaseBytes,\n maximum: config.limits.maxDatabaseBytes,\n });\n }\n});\n\n/**\n * The submit-capable projection of an Agent Binding on the OBJECT side: the input arrived\n * already encoded through the real input schema on the Worker side (`client.ts`), so the\n * Object admits the canonical `PersistedJson` payload as-is; the resolved Binding re-derives\n * everything else from the stored `(agentId, agentDigests)` at claim time (SUB-023).\n */\nconst passthroughSubmitAgent = (agentId: AgentId): DurableSubmitAgent<typeof PersistedJson> => ({\n definition: {\n id: agentId,\n input: PersistedJson,\n },\n});\n\n/** A physical owner may hold other Threads; an addressed request cannot act on their IDs. */\nconst lookupAddressedSubmission = Effect.fn(\"ThreadObject.lookupAddressedSubmission\")(function* (\n submissionId: SubmissionId,\n) {\n const { threadId } = yield* ThreadObjectIdentity;\n const ports = yield* ThreadObjectPorts;\n const submission = yield* ports.lookupSubmission(submissionId);\n\n if (Option.isSome(submission) && submission.value.threadId !== threadId)\n return yield* HostProtocolError.make({ message: \"The Submission belongs to another Thread\" });\n\n return submission;\n});\n\nconst requireSubmissionThread = Effect.fn(\"ThreadObject.requireSubmissionThread\")(function* (\n submissionId: SubmissionId,\n) {\n const submission = yield* lookupAddressedSubmission(submissionId);\n\n if (Option.isNone(submission))\n return yield* LedgerError.make({\n operation: \"addressed Submission lookup\",\n message: \"The addressed Thread has no such Submission\",\n });\n});\n\nconst requireReceiptThread = Effect.fn(\"ThreadObject.requireReceiptThread\")(function* (\n threadId: ThreadId,\n) {\n const identity = yield* ThreadObjectIdentity;\n\n if (threadId !== identity.threadId)\n return yield* HostProtocolError.make({ message: \"The Receipt belongs to another Thread\" });\n});\n\nconst requirePortThread = (request: PortRequest) => {\n switch (request._tag) {\n case \"LedgerLookup\":\n return request.request._tag === \"SubmissionLookupById\"\n ? lookupAddressedSubmission(request.request.submissionId).pipe(Effect.asVoid)\n : requireReceiptThread(request.request.threadId);\n case \"LedgerMarkReady\":\n case \"LedgerRequestAbort\":\n return requireSubmissionThread(request.request.submissionId);\n case \"LedgerRecordChildSettled\":\n return requireSubmissionThread(request.request.parentSubmissionId);\n case \"LedgerAdmit\":\n case \"LedgerResolveAdmission\":\n case \"StoreMaterialize\":\n case \"StoreAppend\":\n case \"StoreReadPage\":\n case \"StoreInspectTail\":\n case \"StoreExport\":\n return requireReceiptThread(request.request.threadId);\n }\n request satisfies never;\n};\n\n/**\n * Admit an already Schema-decoded request to a logical Thread in this physical owner.\n * Custom hosts validate local placement before calling this Effect and provide their same\n * runtime/maintenance instances. The native endpoint uses this path too: queue limits,\n * idempotent receipts and the pre-admission generation/alarm commit have one owner.\n */\nexport const submit = Effect.fn(\"ThreadObject.submit\")(function* (\n threadId: ThreadId,\n request: SubmitRequest,\n) {\n const placement = yield* ThreadObjectPlacement;\n\n if (!placement.ownsThread(threadId))\n return yield* HostProtocolError.make({ message: \"The Thread belongs to another Object\" });\n const mutations = yield* ThreadMutationGate;\n const runtime = yield* DurableAgentRuntime;\n\n yield* gateAdmissionLimits(threadId, request);\n\n return yield* mutations.withMutation(\n runtime\n .submit(passthroughSubmitAgent(request.agentId), request.inputPayload, {\n threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n ...(request.admissionGroup === undefined ? {} : { admissionGroup: request.admissionGroup }),\n ...(request.admissionFence === undefined ? {} : { admissionFence: request.admissionFence }),\n ...(request.workerAdmission === undefined\n ? {}\n : { workerAdmission: request.workerAdmission }),\n ...(request.messageAdmission === undefined\n ? {}\n : { messageAdmission: request.messageAdmission }),\n definitions: request.definitions,\n })\n .pipe(Effect.tap(() => publishCommitted)),\n );\n});\n\nconst submitEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeSubmitRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The submit request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const receipt = yield* submit(identity.threadId, request);\n\n return SubmitSucceeded.make({ receipt });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst submissionStatusEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeReceipt(encoded).pipe(\n Effect.mapError(protocolFailure(\"The receipt could not be decoded\")),\n Effect.flatMap((receipt) =>\n Effect.gen(function* () {\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"awaitSettlement\",\n threadId: receipt.threadId,\n submissionId: receipt.submissionId,\n }),\n );\n yield* requireReceiptThread(receipt.threadId);\n yield* requireSubmissionThread(receipt.submissionId);\n const runtime = yield* DurableAgentRuntime;\n\n return SubmissionStatusResponse.make({ status: yield* runtime.submissionStatus(receipt) });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst awaitSettlementEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeReceipt(encoded).pipe(\n Effect.mapError(protocolFailure(\"The receipt could not be decoded\")),\n Effect.flatMap((receipt) =>\n Effect.gen(function* () {\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"awaitSettlement\",\n threadId: receipt.threadId,\n submissionId: receipt.submissionId,\n }),\n );\n yield* requireReceiptThread(receipt.threadId);\n yield* requireSubmissionThread(receipt.submissionId);\n const runtime = yield* DurableAgentRuntime;\n const settlement = yield* runtime.awaitSettlement(receipt);\n\n return SettlementReached.make({ settlement });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst awaitProgressEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAwaitProgressRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The progress request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n const registry = yield* ProgressWaitRegistry;\n\n yield* Effect.scoped(\n Effect.gen(function* () {\n const cancelled = yield* registry.subscribe(\n JSON.stringify([identity.threadId, request.waiterId]),\n );\n\n yield* Effect.raceFirst(\n runtime.awaitProgress(identity.threadId, request.afterSequence),\n cancelled,\n );\n }),\n );\n\n return ProgressObserved.make();\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst cancelProgressEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeCancelProgressRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The progress cancellation could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const registry = yield* ProgressWaitRegistry;\n\n yield* registry.cancel(JSON.stringify([identity.threadId, request.waiterId]));\n\n return ProgressCancelled.make();\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst observePageEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeObservePageRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The observe request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const store = yield* ThreadStore;\n // The same fail-closed authorization seam the runtime's `observe` consults (P7 WP1);\n // the default reference preserves the possession behavior.\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"observe\",\n threadId: identity.threadId,\n }),\n );\n\n const records = yield* Stream.runCollect(\n store.read(\n ThreadRead.make({\n threadId: identity.threadId,\n ...(request.afterSequence === undefined\n ? {}\n : { afterSequence: request.afterSequence }),\n limit: request.limit,\n }),\n ),\n );\n\n return ObservedPage.make({ records: [...records] });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst abortEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAbortCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The abort command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"abort\",\n submissionId: command.submissionId,\n }),\n );\n yield* requireSubmissionThread(command.submissionId);\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.abort(command));\n\n return AbortRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst resolveApprovalEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeApprovalDecisionCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The approval command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"resolveApproval\",\n submissionId: command.submissionId,\n }),\n );\n yield* requireSubmissionThread(command.submissionId);\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.resolveApproval(command));\n\n return ApprovalRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\nconst resolveUnknownEndpoint = (\n encoded: unknown,\n): Effect.Effect<unknown, never, EndpointServices> =>\n decodeUnknownResolutionCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The resolution command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const authorizer = yield* OperationAuthorizer;\n\n yield* authorizer.authorize(\n OperationAuthorizationRequest.make({\n operation: \"resolveUnknown\",\n submissionId: command.submissionId,\n }),\n );\n yield* requireSubmissionThread(command.submissionId);\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n const intent = yield* maintenance.withMutation(runtime.resolveUnknown(command));\n\n return UnknownResolutionRecorded.make({ intent });\n }),\n ),\n respond,\n Effect.flatMap(encodeResponse),\n );\n\n// ---------------------------------------------------------------------------\n// P7 administrative entry points (plan §3): explain/verify/retry/obligations over the SAME\n// envelope discipline as the host protocol — closed request/response Schema unions, typed\n// failures that re-decode to identical tags, protocol anomalies answered typed. The envelopes\n// live here (not `client.ts`) because no Worker-side client consumption exists yet; `wake`\n// already exists as the `wake()` entry point.\n// ---------------------------------------------------------------------------\n\n/** Explain one Submission (`submissionId` present) or every nonterminal lane member. */\nexport class AdminExplainRequest extends Schema.Class<AdminExplainRequest>(\n \"@effect-agent/platform-cloudflare/AdminExplainRequest\",\n)({\n submissionId: Schema.optionalKey(SubmissionId),\n}) {}\n\n/** Verify carries no parameters — the addressed Object IS the lane. */\nexport class AdminVerifyRequest extends Schema.Class<AdminVerifyRequest>(\n \"@effect-agent/platform-cloudflare/AdminVerifyRequest\",\n)({}) {}\n\n/** Every typed failure of the four admin entry points, plus the protocol's own errors. */\nexport const AdminFailure = Schema.Union([\n AdmissionPolicyError,\n OperationDenied,\n RetryRefused,\n LedgerError,\n RunJournalError,\n DigestError,\n OwnershipLost,\n SettlementConflict,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n DurableRuntimeFailpointError,\n DurableAlarmError,\n HostProtocolError,\n]);\n\nexport type AdminFailure = typeof AdminFailure.Type;\n\nexport class ExplainedRecovery extends Schema.TaggedClass<ExplainedRecovery>(\n \"@effect-agent/platform-cloudflare/ExplainedRecovery\",\n)(\"ExplainedRecovery\", {\n explanations: Schema.Array(RecoveryExplanation).check(Schema.isMaxLength(1_024)),\n}) {}\n\nexport class VerifiedIntegrity extends Schema.TaggedClass<VerifiedIntegrity>(\n \"@effect-agent/platform-cloudflare/VerifiedIntegrity\",\n)(\"VerifiedIntegrity\", {\n report: IntegrityReport,\n}) {}\n\nexport class RetryExecuted extends Schema.TaggedClass<RetryExecuted>(\n \"@effect-agent/platform-cloudflare/RetryExecuted\",\n)(\"RetryExecuted\", {\n report: RecoveryReport,\n}) {}\n\nexport class ObligationsScanned extends Schema.TaggedClass<ObligationsScanned>(\n \"@effect-agent/platform-cloudflare/ObligationsScanned\",\n)(\"ObligationsScanned\", {\n report: ObligationReport,\n}) {}\n\n/** The admin entry point failed TYPED on the Object; the failure re-decodes verbatim. */\nexport class AdminFailed extends Schema.TaggedClass<AdminFailed>(\n \"@effect-agent/platform-cloudflare/AdminFailed\",\n)(\"AdminFailed\", {\n failure: AdminFailure,\n}) {}\n\n/** The uniform answer of one admin entry point. Callers narrow by the tag their call implies. */\nexport const AdminResponse = Schema.Union([\n ExplainedRecovery,\n VerifiedIntegrity,\n RetryExecuted,\n ObligationsScanned,\n AdminFailed,\n]);\n\nexport type AdminResponse = typeof AdminResponse.Type;\n\nexport const decodeAdminExplainRequest = Schema.decodeUnknownEffect(AdminExplainRequest);\nexport const decodeAdminVerifyRequest = Schema.decodeUnknownEffect(AdminVerifyRequest);\nexport const decodeRetryCommand = Schema.decodeUnknownEffect(RetryCommand);\nexport const decodeObligationThresholds = Schema.decodeUnknownEffect(ObligationThresholds);\nexport const encodeAdminResponse = Schema.encodeEffect(AdminResponse);\nexport const decodeAdminResponse = Schema.decodeUnknownEffect(AdminResponse);\n\n/** Fold one admin endpoint's typed failures into the uniform `AdminResponse` envelope. */\nconst respondAdmin = <Result extends AdminResponse, Failure extends AdminFailure>(\n effect: Effect.Effect<Result, Failure, EndpointServices>,\n): Effect.Effect<AdminResponse, never, EndpointServices> =>\n effect.pipe(\n Effect.map((result): AdminResponse => result),\n Effect.catch((failure) => Effect.succeed<AdminResponse>(AdminFailed.make({ failure }))),\n );\n\n/** Encode the admin response envelope; an unencodable response degrades to a protocol failure. */\nconst encodeAdminResponseTotal = (response: AdminResponse): Effect.Effect<unknown> =>\n encodeAdminResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed<unknown>({\n _tag: \"AdminFailed\",\n failure: {\n _tag: \"HostProtocolError\",\n message: boundHostDiagnostic(`The admin response could not be encoded: ${error.message}`),\n },\n }),\n ),\n );\n\nconst explainEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAdminExplainRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The explain request could not be decoded\")),\n Effect.flatMap((request) =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n\n const explanations =\n request.submissionId === undefined\n ? yield* runtime.explainThread(identity.threadId)\n : [yield* runtime.explain(request.submissionId)];\n\n return ExplainedRecovery.make({ explanations });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst verifyEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeAdminVerifyRequest(encoded).pipe(\n Effect.mapError(protocolFailure(\"The verify request could not be decoded\")),\n Effect.flatMap(() =>\n Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const runtime = yield* DurableAgentRuntime;\n const report = yield* runtime.verify(identity.threadId);\n\n return VerifiedIntegrity.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst retryEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeRetryCommand(encoded).pipe(\n Effect.mapError(protocolFailure(\"The retry command could not be decoded\")),\n Effect.flatMap((command) =>\n Effect.gen(function* () {\n const maintenance = yield* ThreadMaintenance;\n const runtime = yield* DurableAgentRuntime;\n // Retry may repair durable state, so its generation + alarm commit before the mutation.\n const report = yield* maintenance.withMutation(runtime.retry(command));\n\n return RetryExecuted.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\nconst obligationsEndpoint = (encoded: unknown): Effect.Effect<unknown, never, EndpointServices> =>\n decodeObligationThresholds(encoded).pipe(\n Effect.mapError(protocolFailure(\"The obligation thresholds could not be decoded\")),\n Effect.flatMap((thresholds) =>\n Effect.gen(function* () {\n const runtime = yield* DurableAgentRuntime;\n const report = yield* runtime.scanObligations(thresholds);\n\n return ObligationsScanned.make({ report });\n }),\n ),\n respondAdmin,\n Effect.flatMap(encodeAdminResponseTotal),\n );\n\n/**\n * Owner-side `portCall`: wrap a mutating envelope in the same pre-armed generation protocol as\n * public RPC (a routed mutation committed by THIS Object must already carry the alarm that will\n * finish it), execute on the LOCAL facets (never the routed decorators), then arm an immediate\n * alarm so the mutated lane is processed promptly. Protocol anomalies answer\n * `PortFailed(PortProtocolError)`.\n */\nconst encodePortResponseTotal = (response: PortResponse) =>\n encodePortResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed(\n encodedPortProtocolFailure(`The port response could not be encoded: ${error.message}`),\n ),\n ),\n );\n\nconst portGuardFailure = (failure: LedgerError | HostProtocolError): PortFailed =>\n PortFailed.make({\n failure:\n failure._tag === \"LedgerError\"\n ? failure\n : PortProtocolError.make({ message: \"The port request is not for the addressed Thread\" }),\n });\n\nexport const portCall = (\n encoded: unknown,\n): Effect.Effect<\n unknown,\n never,\n ThreadObjectPorts | ThreadMaintenance | DurableAlarmService | ThreadObjectIdentity\n> =>\n Effect.gen(function* () {\n const ports = yield* ThreadObjectPorts;\n const maintenance = yield* ThreadMaintenance;\n const alarm = yield* DurableAlarmService;\n\n const decoded = yield* decodePortRequest(encoded).pipe(\n Effect.map((request) => ({ _tag: \"success\" as const, request })),\n Effect.catch((error) => Effect.succeed({ _tag: \"failure\" as const, message: error.message })),\n );\n\n if (decoded._tag === \"failure\") {\n return encodedPortProtocolFailure(\n `The port request could not be decoded: ${decoded.message}`,\n );\n }\n if (\n decoded.request._tag === \"LedgerLookup\" &&\n decoded.request.request._tag === \"SubmissionLookupById\"\n ) {\n const response = yield* lookupAddressedSubmission(decoded.request.request.submissionId).pipe(\n Effect.map((submission) =>\n PortSucceeded.make({\n result: LedgerLookupResult.make(\n Option.isSome(submission) ? { submission: submission.value } : {},\n ),\n }),\n ),\n Effect.catch((failure) => Effect.succeed(portGuardFailure(failure))),\n );\n\n return yield* encodePortResponseTotal(response);\n }\n const identityCheck = yield* requirePortThread(decoded.request).pipe(Effect.result);\n\n if (identityCheck._tag === \"Failure\")\n return yield* encodePortResponseTotal(portGuardFailure(identityCheck.failure));\n const mutating = isMutatingPortRequest(decoded.request);\n\n const handled = yield* (\n mutating\n ? maintenance.withMutation(ports.handle(decoded.request))\n : ports.handle(decoded.request)\n ).pipe(Effect.exit);\n\n if (handled._tag === \"Failure\") {\n // Without the committed generation/alarm the invariant cannot be promised; refuse before\n // the port mutation runs. `ports.handle` itself is total, so this is the maintenance error.\n return encodedPortProtocolFailure(\n \"The owner Object could not arm its maintenance alarm before the mutation.\",\n );\n }\n\n const response = yield* encodePortResponseTotal(handled.value);\n\n if (mutating) {\n // Prompt processing hint; the pre-armed alarm already guarantees convergence.\n yield* alarm.scheduleNow.pipe(\n Effect.catch((error) =>\n Effect.logWarning(\"ThreadObject.portCall: immediate re-arm failed\", error),\n ),\n );\n }\n\n return response;\n });\n\nconst wakeEndpoint: Effect.Effect<void, never, EndpointServices> = Effect.gen(function* () {\n const identity = yield* ThreadObjectIdentity;\n const wake = yield* WakeScheduler;\n\n // Route the remote hint through this incarnation's scheduler so scoped progress waiters and\n // the alarm receive the same hint. Delivery remains droppable; canonical storage is authority.\n yield* wake.notify(identity.threadId);\n});\n\n/** The per-Thread wire operations supported by native and application-owned endpoints. */\nexport const ThreadRpcOperation = Schema.Literals([\n \"submitEncoded\",\n \"submissionStatusEncoded\",\n \"awaitSettlementEncoded\",\n \"awaitProgressEncoded\",\n \"cancelProgressEncoded\",\n \"observePage\",\n \"abortEncoded\",\n \"resolveApprovalEncoded\",\n \"resolveUnknownEncoded\",\n \"portCall\",\n \"wake\",\n]);\n\nexport type ThreadRpcOperation = typeof ThreadRpcOperation.Type;\n\nconst threadRpc = {\n submitEncoded: submitEndpoint,\n submissionStatusEncoded: submissionStatusEndpoint,\n awaitSettlementEncoded: awaitSettlementEndpoint,\n awaitProgressEncoded: awaitProgressEndpoint,\n cancelProgressEncoded: cancelProgressEndpoint,\n observePage: observePageEndpoint,\n abortEncoded: abortEndpoint,\n resolveApprovalEncoded: resolveApprovalEndpoint,\n resolveUnknownEncoded: resolveUnknownEndpoint,\n portCall,\n wake: () => wakeEndpoint,\n} satisfies Record<\n ThreadRpcOperation,\n (encoded: unknown) => Effect.Effect<unknown, never, EndpointServices>\n>;\n\n/**\n * Bind an addressed request to its logical Thread while sharing one physical runtime. This\n * validates local placement before invoking the same native handlers. Receipts, Submission\n * commands and port envelopes must match this identity; progress cancellation is Thread-scoped.\n * The producer comes from the actual runtime configuration, never from caller input. These\n * guards supplement the existing current model/Tool and operation authorization policies.\n */\nexport const handleRpc = Effect.fn(\"ThreadObject.handleRpc\")(function* (\n threadId: ThreadId,\n operation: ThreadRpcOperation,\n encoded: unknown,\n) {\n const placement = yield* ThreadObjectPlacement;\n\n if (!placement.ownsThread(threadId))\n return yield* HostProtocolError.make({ message: \"The Thread belongs to another Object\" });\n const { producerId } = yield* DurableRuntimeConfig;\n\n return yield* threadRpc[operation](encoded).pipe(\n Effect.provideService(ThreadObjectIdentity, { threadId, producerId }),\n );\n});\n\nconst alarmEndpoint: Effect.Effect<void, MaintenancePassFailure, EndpointServices> = Effect.gen(\n function* () {\n const maintenance = yield* ThreadMaintenance;\n\n // Typed pass failures propagate: the rejected promise makes workerd retry the alarm\n // (at-least-once delivery), and the dirty generation retains a committed slot meanwhile.\n yield* maintenance.pass;\n },\n);\n\nconst gateEndpoint: Effect.Effect<void, MaintenancePassFailure, EndpointServices> = Effect.gen(\n function* () {\n // Forcing ThreadMaintenance forces the whole Layer stack: migration + exact-version\n // check + configuration decode (DEPLOY-008 fails typed here, before any mutation), then\n // the defensive local ensure-alarm half of the invariant. LOCAL-ONLY by construction.\n const maintenance = yield* ThreadMaintenance;\n\n yield* maintenance.ensureAlarm;\n },\n);\n\n/**\n * Adapter from effect-cf's native Durable Object services to Effect Agent's existing platform\n * ports. effect-cf owns the cached ManagedRuntime and supplies these values once per Object\n * incarnation; the durable runtime continues to depend only on the narrow services below.\n */\nconst effectCfPlatformLayer = (\n namespaceBinding: string,\n rpcTracing = false,\n): Layer.Layer<\n DurableObjectContext | ThreadObjectNamespace,\n CloudflareBindingError,\n EffectCfDurableObjectState.DurableObjectState | WorkerEnvironment\n> => {\n const context = Layer.effect(DurableObjectContext)(\n Effect.gen(function* () {\n const state = yield* EffectCfDurableObjectState.DurableObjectState;\n const env = yield* WorkerEnvironment;\n\n return DurableObjectContext.of({ ctx: state.raw, env });\n }),\n );\n\n const namespace = Layer.effect(ThreadObjectNamespace)(\n Effect.gen(function* () {\n const env = yield* WorkerEnvironment;\n const binding = yield* threadNamespaceFromEnv(env, namespaceBinding);\n\n return ThreadObjectNamespace.of({\n get: (threadId) => binding.get(binding.idFromName(threadId)),\n ...(rpcTracing === true ? { rpcTracing: namespaceBinding } : {}),\n });\n }),\n );\n\n return Layer.merge(context, namespace);\n};\n\n/** The public endpoints and effect-cf invocation hook of one Thread Object instance. */\nexport interface Instance<EventServices = never> extends InstanceType<\n EffectCfDurableObject.DurableObjectClass<Record<never, never>, RuntimeServices | EventServices>\n> {\n submitEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n submissionStatusEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n awaitSettlementEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n awaitProgressEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n cancelProgressEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n observePage(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n abortEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n resolveApprovalEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n resolveUnknownEncoded(encoded: unknown, traceContext?: unknown): Promise<unknown>;\n explainEncoded(encoded: unknown): Promise<unknown>;\n verifyEncoded(encoded: unknown): Promise<unknown>;\n retryEncoded(encoded: unknown): Promise<unknown>;\n obligationsEncoded(encoded: unknown): Promise<unknown>;\n portCall(encoded: unknown): Promise<unknown>;\n wake(): Promise<void>;\n alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void;\n}\n\n/** The constructor shape workerd instantiates for each Thread Object. */\nexport interface Class<EventServices = never> {\n new (ctx: DurableObjectState, env: Cloudflare.Env): Instance<EventServices>;\n}\n\n/**\n * Export a composed application Layer as a native Durable Object class.\n * Bootstrap services are provided to the whole graph before it acquires, so application Layers\n * can yield effect-cf's WorkerEnvironment and DurableObjectState, derived identity, and Crypto.\n * Effect Config reads scalar Worker vars and secrets through effect-cf's environment provider;\n * WorkerEnvironment exposes resource bindings without a separate config Layer.\n * Application dependencies remain visible until Layer.provide satisfies them. effect-cf owns the\n * cached ManagedRuntime, native RPC methods, event scopes, and telemetry flushing.\n * Initialization is local and bounded inside the constructor gate. Cloudflare eviction does not\n * guarantee finalizers; put resources requiring timely release in scoped operations or eventLayer.\n */\nexport const make = <\n ApplicationServices,\n ApplicationError,\n EventServices = never,\n EventLayerError = never,\n>(\n applicationLayer: Layer.Layer<\n CloudflareDurableRuntimeServices | ApplicationServices,\n ApplicationError,\n | CloudflareBootstrapServices\n | EffectCfDurableObjectState.DurableObjectState\n | WorkerEnvironment\n | DurableObjectContext\n | ThreadObjectNamespace\n >,\n options: Options<ApplicationServices, EventServices, EventLayerError>,\n): Class<ApplicationServices | EventServices> => {\n const application = applicationLayer.pipe(\n Layer.provideMerge(layerConfig(options)),\n Layer.provideMerge(effectCfPlatformLayer(options.namespaceBinding, options.rpcTracing)),\n );\n\n // The storage/config Layer must acquire inside Cloudflare's constructor gate. effect-cf owns\n // the ManagedRuntime, while this effectContext ensures its first Layer build enters the gate\n // before migration, compatibility checks, or alarm inspection touch Object storage.\n const runtime: Layer.Layer<\n RuntimeServices | ApplicationServices,\n ThreadObjectInitializationError | ApplicationError,\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(\n Effect.gen(function* () {\n const services = yield* Layer.buildWithScope(application, scope);\n\n yield* gateEndpoint.pipe(Effect.provide(services));\n\n return services;\n }),\n );\n }),\n );\n\n const rpc = {\n ...threadRpc,\n explainEncoded: (encoded: unknown) => explainEndpoint(encoded),\n verifyEncoded: (encoded: unknown) => verifyEndpoint(encoded),\n retryEncoded: (encoded: unknown) => retryEndpoint(encoded),\n obligationsEncoded: (encoded: unknown) => obligationsEndpoint(encoded),\n } satisfies EffectCfDurableObject.DurableObjectRpc<\n RuntimeServices | ApplicationServices | EventServices\n >;\n\n type NativeOptions = EffectCfDurableObject.DurableObjectOptions<\n RuntimeServices | ApplicationServices,\n EventServices,\n EventLayerError,\n typeof rpc\n >;\n\n const EffectCfThreadObject = EffectCfDurableObject.make<\n RuntimeServices | ApplicationServices,\n ThreadObjectInitializationError | ApplicationError,\n EventServices,\n EventLayerError,\n typeof rpc\n >(runtime, {\n ...(options.rpcTracing === true ? { rpcTracing: { service: options.namespaceBinding } } : {}),\n ...(options.eventLayer === undefined ? {} : { eventLayer: options.eventLayer }),\n // Force the gated runtime Layer when Cloudflare loads this Object incarnation. Recovery stays\n // in each bounded pass so cross-Object initialization cannot deadlock.\n initialize: Effect.void,\n rpc,\n alarm: () => alarmEndpoint,\n // This host owns the raw alarm and supplies event services through options.eventLayer.\n // Upstream's conditional alarm-registration check cannot reduce over generic application\n // services. Options and the rpc satisfies check above retain their Effect requirements.\n } as NativeOptions);\n\n // effect-cf's class type keeps `alarm` optional even when the handler option is present. This\n // concrete override reflects this factory's stronger contract while delegating execution to\n // the effect-cf runtime unchanged.\n class ThreadObject extends EffectCfThreadObject {\n override alarm(alarmInfo?: AlarmInvocationInfo): Promise<void> | void {\n return super.alarm?.(alarmInfo);\n }\n }\n\n return ThreadObject;\n};\n"],"mappings":"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"}