@yielded/agent-storage-cloudflare 0.1.0-beta.167 → 0.1.0-beta.168

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 (71) hide show
  1. package/dist/DoMemoryStore.mjs +1 -1
  2. package/dist/DoMessageDeliveryStore.d.mts +1 -1
  3. package/dist/DoMessageDeliveryStore.mjs +3 -2
  4. package/dist/DoMessageDeliveryStore.mjs.map +1 -1
  5. package/dist/DoScheduleStore.mjs +16 -37
  6. package/dist/DoScheduleStore.mjs.map +1 -1
  7. package/dist/DoStorageConfig.d.mts +2 -10
  8. package/dist/DoStorageConfig.mjs +2 -11
  9. package/dist/DoStorageConfig.mjs.map +1 -1
  10. package/dist/{DoStorageError-CGuAfSwF.d.mts → DoStorageError-CxjMnzUA.d.mts} +7 -18
  11. package/dist/DoStorageError.d.mts +2 -2
  12. package/dist/DoStorageError.mjs +14 -30
  13. package/dist/DoStorageError.mjs.map +1 -1
  14. package/dist/DoStorageFailpoint.d.mts +1 -1
  15. package/dist/DoStorageFailpointTesting.d.mts +1 -1
  16. package/dist/{DoStorageVersion-iNSyi3cJ.d.mts → DoStorageVersion-DTFoLglB.d.mts} +3 -4
  17. package/dist/DoStorageVersion.d.mts +1 -1
  18. package/dist/DoStorageVersion.mjs +2 -2
  19. package/dist/DoStorageVersion.mjs.map +1 -1
  20. package/dist/DoSubmissionLedger.d.mts +7 -5
  21. package/dist/DoSubmissionLedger.mjs +378 -528
  22. package/dist/DoSubmissionLedger.mjs.map +1 -1
  23. package/dist/DoSubscriptionStore.mjs +5 -24
  24. package/dist/DoSubscriptionStore.mjs.map +1 -1
  25. package/dist/{DoThreadStore-D_83OjCH.d.mts → DoThreadStore-Bd4fTns3.d.mts} +17 -18
  26. package/dist/DoThreadStore-CwBvTLoq.mjs +468 -0
  27. package/dist/DoThreadStore-CwBvTLoq.mjs.map +1 -0
  28. package/dist/DoThreadStore.d.mts +2 -2
  29. package/dist/DoThreadStore.mjs +4 -529
  30. package/dist/MemoryProtocol.mjs +3 -3
  31. package/dist/MemoryProtocol.mjs.map +1 -1
  32. package/dist/PortProtocol.d.mts +11727 -3410
  33. package/dist/PortProtocol.mjs +103 -15
  34. package/dist/PortProtocol.mjs.map +1 -1
  35. package/dist/PortRouting.d.mts +14 -9
  36. package/dist/PortRouting.mjs +155 -29
  37. package/dist/PortRouting.mjs.map +1 -1
  38. package/dist/do-journal-Cawnsetj.mjs +761 -0
  39. package/dist/do-journal-Cawnsetj.mjs.map +1 -0
  40. package/dist/index.d.mts +3 -3
  41. package/dist/index.mjs +1 -1
  42. package/dist/migrations-D_EP3KYf.mjs +148 -0
  43. package/dist/migrations-D_EP3KYf.mjs.map +1 -0
  44. package/dist/{owned-state-DHm2aRXx.mjs → owned-state-BHzUi0eb.mjs} +50 -19
  45. package/dist/owned-state-BHzUi0eb.mjs.map +1 -0
  46. package/package.json +1 -1
  47. package/src/DoMessageDeliveryStore.ts +2 -1
  48. package/src/DoScheduleStore.ts +19 -59
  49. package/src/DoStorageConfig.ts +2 -11
  50. package/src/DoStorageError.ts +3 -26
  51. package/src/DoStorageVersion.ts +1 -1
  52. package/src/DoSubmissionLedger.ts +1806 -2030
  53. package/src/DoSubscriptionStore.ts +5 -47
  54. package/src/DoThreadStore.ts +276 -622
  55. package/src/MemoryProtocol.ts +3 -3
  56. package/src/PortProtocol.ts +198 -12
  57. package/src/PortRouting.ts +527 -108
  58. package/src/internal/canonical-append.ts +15 -0
  59. package/src/internal/do-journal.ts +548 -1440
  60. package/src/internal/migrations.ts +184 -287
  61. package/src/internal/owned-state.ts +81 -30
  62. package/src/internal/prompt-checkpoint.ts +158 -0
  63. package/src/internal/storage-span.ts +2 -5
  64. package/dist/DoThreadStore.mjs.map +0 -1
  65. package/dist/do-journal-DUhjZkOf.mjs +0 -1352
  66. package/dist/do-journal-DUhjZkOf.mjs.map +0 -1
  67. package/dist/migrations-DtKz_Gxr.mjs +0 -306
  68. package/dist/migrations-DtKz_Gxr.mjs.map +0 -1
  69. package/dist/owned-state-DHm2aRXx.mjs.map +0 -1
  70. package/src/internal/message-delivery-schema.ts +0 -24
  71. package/src/internal/recovery-checkpoint-schema.ts +0 -17
@@ -1,13 +1,17 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { LedgerAdmitCall, LedgerAdmitResult, LedgerInspectWorkerCall, LedgerInspectWorkerResult, LedgerLookupCall, LedgerLookupResult, LedgerMarkReadyCall, LedgerMarkReadyResult, LedgerRecordChildSettledCall, LedgerRecordChildSettledResult, LedgerRequestAbortCall, LedgerRequestAbortResult, LedgerResolveAdmissionCall, LedgerResolveAdmissionResult, LedgerStopWorkerCall, LedgerStopWorkerResult, MessageDeliveryCompleteCall, MessageDeliveryCompleteResult, MessageDeliveryListCall, MessageDeliveryListResult, PortFailed, PortProtocolError, PortSucceeded, StoreAppendCall, StoreAppendResult, StoreCountPeerMessagesCall, StoreCountPeerMessagesResult, StoreExportCall, StoreExportResult, StoreInspectTailCall, StoreInspectTailResult, StoreMaterializeCall, StoreMaterializeResult, StoreReadIdentityCall, StoreReadIdentityResult, StoreReadPageCall, StoreReadPageResult, WorkerAdmitCall, WorkerAdmitResult, boundPortDiagnostic, decodePortRequest, decodePortResponse, encodePortRequest, encodePortResponse } from "./PortProtocol.mjs";
2
+ import { LedgerAdmitCall, LedgerAdmitResult, LedgerFundingOwnerCall, LedgerFundingOwnerResult, LedgerInspectWorkerCall, LedgerInspectWorkerResult, LedgerLookupCall, LedgerLookupResult, LedgerMarkReadyCall, LedgerMarkReadyResult, LedgerRecordChildSettledCall, LedgerRecordChildSettledResult, LedgerRequestAbortCall, LedgerRequestAbortResult, LedgerResolveAdmissionCall, LedgerResolveAdmissionResult, LedgerStopWorkerCall, LedgerStopWorkerResult, MessageDeliveryCompleteCall, MessageDeliveryCompleteResult, MessageDeliveryListCall, MessageDeliveryListResult, PortFailed, PortProtocolError, PortSucceeded, SettlementPublishCall, SettlementPublishResult, StoreAppendCall, StoreAppendResult, StoreCountPeerMessagesCall, StoreCountPeerMessagesResult, StoreExportCall, StoreExportResult, StoreInspectTailCall, StoreInspectTailResult, StoreMaterializeCall, StoreMaterializeResult, StoreRangeArchiveCall, StoreRangeArchiveResult, StoreRangePageCall, StoreRangePageResult, StoreRangeSealCall, StoreRangeSealResult, StoreRangeVerifyCall, StoreRangeVerifyResult, StoreReadExecutionCall, StoreReadExecutionResult, StoreReadIdentityCall, StoreReadIdentityResult, StoreReadPageCall, StoreReadPageResult, StoreReadPromptCall, StoreReadPromptResult, StoreVerificationCall, StoreVerificationResult, StoreWorkPageCall, StoreWorkPageResult, StoreWorkRebuildCall, StoreWorkRebuildResult, StoreWorkerCapacityCall, StoreWorkerCapacityResult, WorkerAdmitCall, WorkerAdmitResult, boundPortDiagnostic, decodePortRequest, decodePortResponse, encodePortRequest, encodePortResponse } from "./PortProtocol.mjs";
3
3
  import { MessageDeliveryError, MessageDeliveryStore } from "@yielded/agent/message-delivery";
4
4
  import { Cause, Clock, Context, Effect, Layer, Option, Predicate, Schema, Stream } from "effect";
5
5
  import { LifecyclePublicationError } from "@yielded/agent/lifecycle-publication";
6
- import { AppendConflict, FenceRejected, ThreadMaterialization, ThreadNotMaterialized, ThreadStore, ThreadStoreError } from "@yielded/agent/thread-store";
7
- import { AdmissionConflict, AdmissionIndeterminate, AdmissionPolicyError, ChildAttachmentSnapshot, JoinedToHost, LedgerError, RecoverySnapshot, SettlementConflict, SubmissionLedger, SubmissionLookupById } from "@yielded/agent/submission-ledger";
6
+ import { AppendConflict, ThreadExportRejected, ThreadMaterialization, ThreadNotMaterialized, ThreadReader, ThreadStore, ThreadStoreError } from "@yielded/agent/thread-store";
7
+ import { SettlementPublisher } from "@yielded/agent/settlement-publisher";
8
+ import { AdmissionConflict, AdmissionIndeterminate, AdmissionPolicyError, ChildAttachmentSnapshot, JoinedToHost, LedgerError, OwnershipLost, RecoverySnapshot, SettlementConflict, SubmissionLedger, SubmissionLookupById } from "@yielded/agent/submission-ledger";
9
+ import { checkExportSource } from "@yielded/agent/thread-transfer";
10
+ import { WorkDiscoveryUnavailable } from "@yielded/agent/thread-work";
8
11
  import { WorkerAdmissionFailure, WorkerAdmissionPort, admitWorker } from "@yielded/agent/worker-admission";
9
12
  //#region src/PortRouting.ts
10
13
  var PortRouting_exports = /* @__PURE__ */ __exportAll({
14
+ CurrentNativeSource: () => CurrentNativeSource,
11
15
  PortTransportError: () => PortTransportError,
12
16
  ThreadPortTransport: () => ThreadPortTransport,
13
17
  executePortRequest: () => executePortRequest,
@@ -15,12 +19,15 @@ var PortRouting_exports = /* @__PURE__ */ __exportAll({
15
19
  makeLocalSubmissionLookup: () => makeLocalSubmissionLookup,
16
20
  portTransportFailure: () => portTransportFailure,
17
21
  routedMessageDeliveryStoreLayer: () => routedMessageDeliveryStoreLayer,
22
+ routedSettlementPublisherLayer: () => routedSettlementPublisherLayer,
18
23
  routedSubmissionLedgerLayer: () => routedSubmissionLedgerLayer,
19
24
  routedThreadStoreLayer: () => routedThreadStoreLayer,
20
25
  routedWorkerAdmissionLayer: () => routedWorkerAdmissionLayer
21
26
  });
22
27
  const ThreadIdSchema = ThreadMaterialization.fields.threadId;
23
28
  const decodeThreadId = Schema.decodeUnknownEffect(ThreadIdSchema);
29
+ /** Owner-local maintenance scope; permits local inventory without global Object enumeration. */
30
+ const CurrentNativeSource = Context.Reference("@effect-agent/storage-cloudflare/CurrentNativeSource", { defaultValue: () => false });
24
31
  /**
25
32
  * The ledger row bound routable Submission identities must respect (mirrors the local
26
33
  * facet's `MAX_IDENTIFIER_LENGTH`; the minting side already refuses longer identities typed
@@ -91,7 +98,7 @@ const LOCAL = { _tag: "local" };
91
98
  * Identities beyond the ledger's 1,024-character row bound fail typed: the minting side
92
99
  * refused them at admission, so they cannot name any stored row anywhere.
93
100
  */
94
- const routableSubmissionTarget = (ownsThread) => Effect.fn("DoPortRouting.routableSubmissionTarget")(function* (operation, submissionId) {
101
+ const routableSubmissionTarget = (ownsThread) => Effect.fnUntraced(function* (operation, submissionId) {
95
102
  if (submissionId.length > MAX_ROUTABLE_SUBMISSION_ID_LENGTH) return yield* LedgerError.make({
96
103
  operation,
97
104
  message: `A Submission identity of ${submissionId.length} characters exceeds the ${MAX_ROUTABLE_SUBMISSION_ID_LENGTH}-character routable identity bound; admission refuses such identities, so it cannot name any stored row.`
@@ -112,7 +119,7 @@ const routableSubmissionTarget = (ownsThread) => Effect.fn("DoPortRouting.routab
112
119
  */
113
120
  const makeLocalSubmissionLookup = (options) => {
114
121
  const submissionTarget = routableSubmissionTarget(options.ownsThread);
115
- return Effect.fn("DoPortRouting.lookupLocalSubmission")(function* (submissionId) {
122
+ return Effect.fnUntraced(function* (submissionId) {
116
123
  const operation = "local Submission lookup";
117
124
  if ((yield* submissionTarget(operation, submissionId))._tag === "foreign") return yield* LedgerError.make({
118
125
  operation,
@@ -131,7 +138,7 @@ const AbortPortFailure = Schema.Union([SettlementConflict, JoinedToHost]);
131
138
  const AppendPortFailure = Schema.Union([
132
139
  ThreadNotMaterialized,
133
140
  AppendConflict,
134
- FenceRejected
141
+ OwnershipLost
135
142
  ]);
136
143
  /**
137
144
  * The fail-fast refusal for any foreign operation OUTSIDE the closed route-capable subset
@@ -143,14 +150,14 @@ const crossThreadLedgerError = (operation, target) => LedgerError.make({
143
150
  });
144
151
  const crossThreadStoreError = (operation, target) => ThreadStoreError.make({
145
152
  operation,
146
- message: `${operation} addressed to foreign Thread ${target} is not route-capable; the closed cross-Object subset is materialize, append, read (paged), inspectTail, and export. Observation and checkpoints are lane-local by construction and must execute inside the owning Thread's Durable Object.`
153
+ message: `${operation} addressed to foreign Thread ${target} is not route-capable; the closed cross-Object subset is materialize, append, read and readPrompt (paged), inspectTail, and export. Observation and checkpoints are lane-local by construction and must execute inside the owning Thread's Durable Object.`
147
154
  });
148
- const makeTransportCall = (transport) => Effect.fn("DoPortRouting.transportCall")(function* (target, call) {
155
+ const makeTransportCall = (transport) => Effect.fnUntraced(function* (target, call) {
149
156
  const encoded = yield* encodePortRequest(call).pipe(Effect.mapError((error) => PortProtocolError.make({ message: boundPortDiagnostic(`The port request could not be encoded: ${error.message}`) })));
150
157
  const raw = yield* transport.call(target, encoded);
151
158
  return yield* decodePortResponse(raw).pipe(Effect.mapError((error) => PortProtocolError.make({ message: boundPortDiagnostic(`The port response could not be decoded: ${error.message}`) })));
152
159
  });
153
- const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServices")(function* (options) {
160
+ const makeRoutedLedgerServices = Effect.fnUntraced(function* (options) {
154
161
  const local = yield* SubmissionLedger;
155
162
  const transport = yield* ThreadPortTransport;
156
163
  const transportCall = makeTransportCall(transport);
@@ -218,7 +225,7 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
218
225
  * local nor marker-settled. A transport failure surfaces as `LedgerError` so the alarm
219
226
  * pass retries; the child's canonical Settlement remains the only authority (DUR-015).
220
227
  */
221
- const enrichChildAttachments = Effect.fn("DoPortRouting.enrichChildAttachments")(function* (snapshot) {
228
+ const enrichChildAttachments = Effect.fnUntraced(function* (snapshot) {
222
229
  const operation = "ledger load recovery snapshot";
223
230
  const attachments = new Map(snapshot.childAttachments.map((attachment) => [attachment.childSubmissionId, attachment]));
224
231
  let enriched = false;
@@ -254,6 +261,13 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
254
261
  admit: (request) => options.ownsThread(request.threadId) ? local.admit(request) : foreignLedgerCall("ledger admit", request.threadId, LedgerAdmitCall.make({ request }), LedgerAdmitResult, Schema.Union([AdmissionConflict, AdmissionPolicyError])).pipe(Effect.map((reply) => reply.result)),
255
262
  markReady: (request) => submissionTarget("ledger mark ready", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.markReady(request) : foreignLedgerCall("ledger mark ready", target.threadId, LedgerMarkReadyCall.make({ request }), LedgerMarkReadyResult, NoAdditionalPortFailure).pipe(Effect.asVoid))),
256
263
  lookup: (request) => request._tag === "SubmissionLookupById" ? submissionTarget("ledger lookup", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.lookup(request) : foreignLookupById("ledger lookup", target.threadId, request.submissionId))) : options.ownsThread(request.threadId) ? local.lookup(request) : foreignLedgerCall("ledger lookup", request.threadId, LedgerLookupCall.make({ request }), LedgerLookupResult, NoAdditionalPortFailure).pipe(Effect.map((result) => result.submission === void 0 ? Option.none() : Option.some(result.submission))),
264
+ resolveFundingOwner: (request) => (options.ownsThread(request.threadId) ? local.resolveFundingOwner === void 0 ? Effect.fail(LedgerError.make({
265
+ operation: "resolve funding owner",
266
+ message: "Native funding-owner lookup unavailable."
267
+ })) : local.resolveFundingOwner(request) : foreignLedgerCall("resolve funding owner", request.threadId, LedgerFundingOwnerCall.make({ request }), LedgerFundingOwnerResult, NoAdditionalPortFailure).pipe(Effect.map((reply) => reply.funding))).pipe(Effect.filterOrFail((funding) => funding.selected.submissionId === request.submissionId && funding.selected.threadId === request.threadId && funding.owner.threadId === request.threadId, () => LedgerError.make({
268
+ operation: "resolve funding owner",
269
+ message: "Funding-owner response belongs to another input or Thread."
270
+ }))),
257
271
  resolveAdmission: (request) => options.ownsThread(request.threadId) ? local.resolveAdmission(request) : resolveForeignAdmission(request.threadId, request),
258
272
  inspectWorker: (threadId) => options.ownsThread(threadId) ? local.inspectWorker === void 0 ? Effect.fail(LedgerError.make({
259
273
  operation: "inspectWorker",
@@ -265,12 +279,9 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
265
279
  })) : local.stopWorker(request) : foreignLedgerCall("ledger stop worker", request.threadId, LedgerStopWorkerCall.make({ request }), LedgerStopWorkerResult, NoAdditionalPortFailure).pipe(Effect.map((reply) => reply.owned)),
266
280
  requestAbort: (request) => submissionTarget("ledger request abort", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.requestAbort(request) : foreignLedgerCall("ledger request abort", target.threadId, LedgerRequestAbortCall.make({ request }), LedgerRequestAbortResult, AbortPortFailure).pipe(Effect.map((reply) => reply.intent)))),
267
281
  recordChildSettled: (request) => submissionTarget("ledger record child settled", request.parentSubmissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.recordChildSettled(request) : foreignLedgerCall("ledger record child settled", target.threadId, LedgerRecordChildSettledCall.make({ request }), LedgerRecordChildSettledResult, NoAdditionalPortFailure).pipe(Effect.map((reply) => reply.outcome)))),
268
- claim: (request) => options.ownsThread(request.threadId) ? local.claim(request) : Effect.fail(crossThreadLedgerError("ledger claim", request.threadId)),
282
+ selectHead: (request) => options.ownsThread(request.threadId) ? local.selectHead(request) : Effect.fail(crossThreadLedgerError("ledger claim", request.threadId)),
269
283
  claimJoining: (request) => options.ownsThread(request.threadId) ? local.claimJoining(request) : Effect.fail(crossThreadLedgerError("ledger claim joining", request.threadId)),
270
- renewOwnership: (request) => submissionTarget("ledger renew ownership", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.renewOwnership(request) : Effect.fail(crossThreadLedgerError("ledger renew ownership", target.threadId)))),
271
- releaseOwnership: (request) => submissionTarget("ledger release ownership", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.releaseOwnership(request) : Effect.fail(crossThreadLedgerError("ledger release ownership", target.threadId)))),
272
284
  markInputApplied: (request) => submissionTarget("ledger mark input applied", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.markInputApplied(request) : Effect.fail(crossThreadLedgerError("ledger mark input applied", target.threadId)))),
273
- reserveSettlement: (request) => submissionTarget("ledger reserve settlement", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.reserveSettlement(request) : Effect.fail(crossThreadLedgerError("ledger reserve settlement", target.threadId)))),
274
285
  finalizeSettlement: (request) => submissionTarget("ledger finalize settlement", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.finalizeSettlement(request) : Effect.fail(crossThreadLedgerError("ledger finalize settlement", target.threadId)))),
275
286
  markJoined: (request) => submissionTarget("ledger mark joined", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.markJoined(request) : Effect.fail(crossThreadLedgerError("ledger mark joined", target.threadId)))),
276
287
  revertJoining: (request) => submissionTarget("ledger revert joining", request.submissionId).pipe(Effect.flatMap((target) => target._tag === "local" ? local.revertJoining(request) : Effect.fail(crossThreadLedgerError("ledger revert joining", target.threadId)))),
@@ -288,10 +299,41 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
288
299
  });
289
300
  return Context.make(SubmissionLedger, routed);
290
301
  });
291
- const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices")(function* (options) {
302
+ /** Route the data-only atomic publication to the same owner as its canonical Thread. */
303
+ const routedSettlementPublisherLayer = (options) => Layer.effect(SettlementPublisher)(Effect.gen(function* () {
304
+ const local = yield* SettlementPublisher;
305
+ const call = makeTransportCall(yield* ThreadPortTransport);
306
+ const isFailure = Schema.is(Schema.Union([
307
+ LedgerError,
308
+ OwnershipLost,
309
+ SettlementConflict,
310
+ ThreadStoreError,
311
+ ThreadNotMaterialized,
312
+ AppendConflict
313
+ ]));
314
+ return SettlementPublisher.of({ publish: (request) => {
315
+ if (options.ownsThread(request.append.threadId)) return local.publish(request);
316
+ return call(request.append.threadId, SettlementPublishCall.make({ request })).pipe(Effect.mapError((cause) => LedgerError.make({
317
+ operation: "route settlement publication",
318
+ message: cause.message,
319
+ cause
320
+ })), Effect.flatMap((response) => {
321
+ if (response._tag === "PortFailed") return isFailure(response.failure) ? Effect.fail(response.failure) : Effect.fail(LedgerError.make({
322
+ operation: "route settlement publication",
323
+ message: "Unexpected publication failure",
324
+ cause: response.failure
325
+ }));
326
+ return response.result._tag === "SettlementPublishResult" ? Effect.succeed(response.result.result) : Effect.fail(LedgerError.make({
327
+ operation: "route settlement publication",
328
+ message: "Mismatched publication result"
329
+ }));
330
+ }));
331
+ } });
332
+ }));
333
+ const makeRoutedStoreServices = Effect.fnUntraced(function* (options) {
292
334
  const local = yield* ThreadStore;
293
335
  const checkpoints = local.checkpoints;
294
- const recoveryCheckpoints = local.recoveryCheckpoints;
336
+ const promptCheckpoints = local.promptCheckpoints;
295
337
  const lifecyclePublications = local.lifecyclePublications;
296
338
  const acknowledgeMany = lifecyclePublications?.acknowledgeMany;
297
339
  const transport = yield* ThreadPortTransport;
@@ -328,16 +370,43 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
328
370
  } }));
329
371
  };
330
372
  const routed = ThreadStore.of({
373
+ readExecution: (request) => options.ownsThread(request.threadId) ? local.readExecution(request) : foreignStoreCall("read execution", request.threadId, StoreReadExecutionCall.make({ request }), StoreReadExecutionResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.checkpoint)),
374
+ archives: {
375
+ page: (request) => options.ownsThread(request.threadId) ? local.archives === void 0 ? Effect.fail(crossThreadStoreError("archive unavailable", request.threadId)) : local.archives.page(request) : foreignStoreCall("archive page", request.threadId, StoreRangePageCall.make({ request }), StoreRangePageResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.page)),
376
+ seal: (request) => options.ownsThread(request.threadId) ? local.archives === void 0 ? Effect.fail(crossThreadStoreError("archive unavailable", request.threadId)) : local.archives.seal(request) : foreignStoreCall("archive seal", request.threadId, StoreRangeSealCall.make({ request }), StoreRangeSealResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.range)),
377
+ archive: (request) => options.ownsThread(request.threadId) ? local.archives === void 0 ? Effect.fail(crossThreadStoreError("archive unavailable", request.threadId)) : local.archives.archive(request) : foreignStoreCall("archive archive", request.threadId, StoreRangeArchiveCall.make({ request }), StoreRangeArchiveResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.range)),
378
+ verify: (request) => options.ownsThread(request.threadId) ? local.archives === void 0 ? Effect.fail(crossThreadStoreError("archive unavailable", request.threadId)) : local.archives.verify(request) : foreignStoreCall("archive verify", request.threadId, StoreRangeVerifyCall.make({ request }), StoreRangeVerifyResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.range))
379
+ },
380
+ work: {
381
+ threads: (request) => Effect.flatMap(CurrentNativeSource, (nativeSource) => nativeSource && local.work !== void 0 ? local.work.threads(request) : Effect.fail(ThreadStoreError.make({
382
+ operation: "work threads",
383
+ message: nativeSource ? "The local Thread owner does not provide work inventory." : "Global Thread enumeration is unsupported by the owner-local Durable Object namespace. Use the local owner's work storage."
384
+ }))),
385
+ page: (request) => options.ownsThread(request.threadId) ? local.work === void 0 ? Effect.fail(WorkDiscoveryUnavailable.make({
386
+ threadId: request.threadId,
387
+ reason: "unsupported"
388
+ })) : local.work.page(request) : foreignStoreCall("work page", request.threadId, StoreWorkPageCall.make({ request }), StoreWorkPageResult, WorkDiscoveryUnavailable).pipe(Effect.map((reply) => reply.page)),
389
+ rebuild: (request) => options.ownsThread(request.threadId) ? local.work === void 0 ? Effect.fail(WorkDiscoveryUnavailable.make({
390
+ threadId: request.threadId,
391
+ reason: "unsupported"
392
+ })) : local.work.rebuild(request) : foreignStoreCall("rebuild work", request.threadId, StoreWorkRebuildCall.make({ request }), StoreWorkRebuildResult, WorkDiscoveryUnavailable).pipe(Effect.flatMap((reply) => reply.progress.threadId === request.threadId ? Effect.succeed(reply.progress) : Effect.fail(ThreadStoreError.make({
393
+ operation: "rebuild work",
394
+ message: "The rebuild progress belongs to another Thread."
395
+ }))))
396
+ },
397
+ readWorkerCapacity: (request) => (options.ownsThread(request.threadId) ? local.readWorkerCapacity === void 0 ? Effect.fail(crossThreadStoreError("worker capacity unavailable", request.threadId)) : local.readWorkerCapacity(request) : foreignStoreCall("worker capacity", request.threadId, StoreWorkerCapacityCall.make({ request }), StoreWorkerCapacityResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.capacity))).pipe(Effect.filterOrFail((capacity) => capacity.threadId === request.threadId && capacity.tailSequence === request.expectedTailSequence, () => crossThreadStoreError("worker capacity response mismatch", request.threadId))),
398
+ verification: { verify: (request) => options.ownsThread(request.threadId) ? local.verification === void 0 ? Effect.fail(crossThreadStoreError("verification unavailable", request.threadId)) : local.verification.verify(request) : foreignStoreCall("thread verification", request.threadId, StoreVerificationCall.make({ request }), StoreVerificationResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.report)) },
331
399
  countPeerMessages: (request) => options.ownsThread(request.threadId) ? local.countPeerMessages === void 0 ? Effect.fail(crossThreadStoreError("peer count unavailable", request.threadId)) : local.countPeerMessages(request) : foreignStoreCall("thread countPeerMessages", request.threadId, StoreCountPeerMessagesCall.make({ request }), StoreCountPeerMessagesResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.count)),
332
- materialize: (request) => options.ownsThread(request.threadId) ? local.materialize(request) : foreignStoreCall("thread materialize", request.threadId, StoreMaterializeCall.make({ request }), StoreMaterializeResult, FenceRejected).pipe(Effect.asVoid),
400
+ materialize: (request) => options.ownsThread(request.threadId) ? local.materialize(request) : foreignStoreCall("thread materialize", request.threadId, StoreMaterializeCall.make({ request }), StoreMaterializeResult, NoAdditionalPortFailure).pipe(Effect.asVoid),
333
401
  append: (request) => options.ownsThread(request.threadId) ? local.append(request) : foreignStoreCall("thread append", request.threadId, StoreAppendCall.make({ request }), StoreAppendResult, AppendPortFailure).pipe(Effect.map((reply) => reply.result)),
334
402
  read: (request) => options.ownsThread(request.threadId) ? local.read(request) : Stream.unwrap(foreignStoreCall("thread read", request.threadId, StoreReadPageCall.make({ request }), StoreReadPageResult, ThreadNotMaterialized).pipe(Effect.map((reply) => Stream.fromIterable(reply.records)))),
403
+ readPrompt: (request) => options.ownsThread(request.threadId) ? local.readPrompt(request) : Stream.unwrap(foreignStoreCall("thread read prompt", request.threadId, StoreReadPromptCall.make({ request }), StoreReadPromptResult, ThreadNotMaterialized).pipe(Effect.map((reply) => Stream.fromIterable(reply.records)))),
335
404
  inspectTail: (request) => options.ownsThread(request.threadId) ? local.inspectTail(request) : foreignStoreCall("thread inspect tail", request.threadId, StoreInspectTailCall.make({ request }), StoreInspectTailResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.tail)),
336
405
  readIdentity: (request) => options.ownsThread(request.threadId) ? local.readIdentity(request) : foreignStoreCall("thread read identity", request.threadId, StoreReadIdentityCall.make({ request }), StoreReadIdentityResult, ThreadNotMaterialized).pipe(Effect.flatMap((reply) => reply.identity.threadId === request.threadId ? Effect.succeed(reply.identity) : Effect.fail(ThreadStoreError.make({
337
406
  operation: "thread read identity",
338
407
  message: "The identity snapshot belongs to another Thread."
339
408
  })))),
340
- export: (request) => options.ownsThread(request.threadId) ? local.export(request) : foreignStoreCall("thread export", request.threadId, StoreExportCall.make({ request }), StoreExportResult, ThreadNotMaterialized).pipe(Effect.map((reply) => reply.export)),
409
+ export: (request) => checkExportSource(request.threadId).pipe(Effect.andThen(options.ownsThread(request.threadId) ? local.export(request) : foreignStoreCall("thread export", request.threadId, StoreExportCall.make({ request }), StoreExportResult, Schema.Union([ThreadNotMaterialized, ThreadExportRejected])).pipe(Effect.map((reply) => reply.export)))),
341
410
  observe: (request) => options.ownsThread(request.threadId) ? local.observe(request) : Stream.unwrap(Effect.fail(crossThreadStoreError("thread observe", request.threadId))),
342
411
  ...lifecyclePublications === void 0 ? {} : { lifecyclePublications: {
343
412
  ...lifecyclePublications,
@@ -346,13 +415,13 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
346
415
  claim: (batch, nowMillis, timeoutMillis) => batch.every((publication) => options.ownsThread(publication.ownerThreadId)) ? lifecyclePublications.claim(batch, nowMillis, timeoutMillis) : Effect.fail(LifecyclePublicationError.make({ reason: "unavailable" })),
347
416
  retryParked: (ownerThreadId, nowMillis) => options.ownsThread(ownerThreadId) ? lifecyclePublications.retryParked(ownerThreadId, nowMillis) : Effect.fail(LifecyclePublicationError.make({ reason: "unavailable" }))
348
417
  } },
349
- ...recoveryCheckpoints === void 0 ? {} : { recoveryCheckpoints: {
350
- save: (request) => options.ownsThread(request.checkpoint.threadId) ? recoveryCheckpoints.save(request) : Effect.fail(crossThreadStoreError("thread save recovery checkpoint", request.checkpoint.threadId)),
351
- load: (request) => options.ownsThread(request.threadId) ? recoveryCheckpoints.load(request) : Effect.succeed(Option.none())
352
- } },
353
418
  ...checkpoints === void 0 ? {} : { checkpoints: {
354
419
  save: (request) => options.ownsThread(request.checkpoint.threadId) ? checkpoints.save(request) : Effect.fail(crossThreadStoreError("thread save checkpoint", request.checkpoint.threadId)),
355
420
  load: (request) => options.ownsThread(request.threadId) ? checkpoints.load(request) : Effect.fail(crossThreadStoreError("thread load checkpoint", request.threadId))
421
+ } },
422
+ ...promptCheckpoints === void 0 ? {} : { promptCheckpoints: {
423
+ save: (request) => options.ownsThread(request.threadId) ? promptCheckpoints.save(request) : Effect.fail(crossThreadStoreError("save prompt checkpoint", request.threadId)),
424
+ load: (request) => options.ownsThread(request.threadId) ? promptCheckpoints.load(request) : Effect.fail(crossThreadStoreError("load prompt checkpoint", request.threadId))
356
425
  } }
357
426
  });
358
427
  return Context.make(ThreadStore, routed);
@@ -367,11 +436,11 @@ const makeRoutedStoreServices = Effect.fn("DoPortRouting.makeRoutedStoreServices
367
436
  const routedSubmissionLedgerLayer = (options) => Layer.effectContext(makeRoutedLedgerServices(options));
368
437
  /**
369
438
  * Routing decorator over the LOCAL `ThreadStore` facet (plan §1.3): this-thread
370
- * requests execute locally; foreign materialize/append/read/inspectTail/export travel the
371
- * transport. Foreign recovery-cache loads return none for canonical replay; other foreign
372
- * checkpoint operations and observation fail fast typed.
439
+ * requests execute locally; foreign store reads, writes, and exact-Thread work pages/rebuild
440
+ * travel the transport. Work enumeration stays local under CurrentNativeSource; global
441
+ * enumeration, foreign checkpoints, and observation fail typed.
373
442
  */
374
- const routedThreadStoreLayer = (options) => Layer.effectContext(makeRoutedStoreServices(options));
443
+ const routedThreadStoreLayer = (options) => ThreadReader.layer().pipe(Layer.provideMerge(Layer.effectContext(makeRoutedStoreServices(options))));
375
444
  /** Route validated worker admission as one operation; source policy hooks stay at the caller. */
376
445
  const routedWorkerAdmissionLayer = (options) => Layer.effect(WorkerAdmissionPort, Effect.gen(function* () {
377
446
  const call = makeTransportCall(yield* ThreadPortTransport);
@@ -432,8 +501,42 @@ const capture = (effect) => effect.pipe(Effect.map((result) => PortSucceeded.mak
432
501
  * Failures never escape — every typed port failure becomes a `PortFailed` envelope that
433
502
  * re-decodes on the caller side.
434
503
  */
435
- const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(function* (request) {
504
+ const executePortRequest = Effect.fnUntraced(function* (request) {
436
505
  switch (request._tag) {
506
+ case "StoreRangePage": {
507
+ const store = yield* ThreadStore;
508
+ return yield* capture(store.archives === void 0 ? crossThreadStoreError("archive unavailable", request.request.threadId) : store.archives.page(request.request).pipe(Effect.map((page) => StoreRangePageResult.make({ page }))));
509
+ }
510
+ case "StoreRangeSeal": {
511
+ const store = yield* ThreadStore;
512
+ return yield* capture(store.archives === void 0 ? crossThreadStoreError("archive unavailable", request.request.threadId) : store.archives.seal(request.request).pipe(Effect.map((range) => StoreRangeSealResult.make({ range }))));
513
+ }
514
+ case "StoreRangeArchive": {
515
+ const store = yield* ThreadStore;
516
+ return yield* capture(store.archives === void 0 ? crossThreadStoreError("archive unavailable", request.request.threadId) : store.archives.archive(request.request).pipe(Effect.map((range) => StoreRangeArchiveResult.make({ range }))));
517
+ }
518
+ case "StoreRangeVerify": {
519
+ const store = yield* ThreadStore;
520
+ return yield* capture(store.archives === void 0 ? crossThreadStoreError("archive unavailable", request.request.threadId) : store.archives.verify(request.request).pipe(Effect.map((range) => StoreRangeVerifyResult.make({ range }))));
521
+ }
522
+ case "StoreWorkPage": {
523
+ const store = yield* ThreadStore;
524
+ return yield* capture(store.work === void 0 ? Effect.fail(WorkDiscoveryUnavailable.make({
525
+ threadId: request.request.threadId,
526
+ reason: "unsupported"
527
+ })) : store.work.page(request.request).pipe(Effect.map((page) => StoreWorkPageResult.make({ page }))));
528
+ }
529
+ case "StoreWorkRebuild": {
530
+ const store = yield* ThreadStore;
531
+ return yield* capture(store.work === void 0 ? Effect.fail(WorkDiscoveryUnavailable.make({
532
+ threadId: request.request.threadId,
533
+ reason: "unsupported"
534
+ })) : store.work.rebuild(request.request).pipe(Effect.map((progress) => StoreWorkRebuildResult.make({ progress }))));
535
+ }
536
+ case "SettlementPublish": {
537
+ const publisher = yield* SettlementPublisher;
538
+ return yield* capture(publisher.publish(request.request).pipe(Effect.map((result) => SettlementPublishResult.make({ result }))));
539
+ }
437
540
  case "MessageDeliveryComplete": {
438
541
  const store = yield* MessageDeliveryStore;
439
542
  return yield* capture(store.change(request.key, {
@@ -463,6 +566,13 @@ const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(functio
463
566
  const ledger = yield* SubmissionLedger;
464
567
  return yield* capture(ledger.lookup(request.request).pipe(Effect.map((submission) => Option.isSome(submission) ? LedgerLookupResult.make({ submission: submission.value }) : LedgerLookupResult.make({}))));
465
568
  }
569
+ case "LedgerFundingOwner": {
570
+ const ledger = yield* SubmissionLedger;
571
+ return yield* capture(ledger.resolveFundingOwner === void 0 ? Effect.fail(LedgerError.make({
572
+ operation: "resolve funding owner",
573
+ message: "Native funding-owner lookup unavailable."
574
+ })) : ledger.resolveFundingOwner(request.request).pipe(Effect.map((funding) => LedgerFundingOwnerResult.make({ funding }))));
575
+ }
466
576
  case "LedgerResolveAdmission": {
467
577
  const ledger = yield* SubmissionLedger;
468
578
  return yield* capture(ledger.resolveAdmission(request.request).pipe(Effect.map((resolution) => LedgerResolveAdmissionResult.make({ resolution }))));
@@ -501,14 +611,30 @@ const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(functio
501
611
  const store = yield* ThreadStore;
502
612
  return yield* capture(store.read(request.request).pipe(Stream.runCollect, Effect.map((records) => StoreReadPageResult.make({ records: [...records] }))));
503
613
  }
614
+ case "StoreReadPrompt": {
615
+ const store = yield* ThreadStore;
616
+ return yield* capture(store.readPrompt(request.request).pipe(Stream.runCollect, Effect.map((records) => StoreReadPromptResult.make({ records }))));
617
+ }
504
618
  case "StoreInspectTail": {
505
619
  const store = yield* ThreadStore;
506
620
  return yield* capture(store.inspectTail(request.request).pipe(Effect.map((tail) => StoreInspectTailResult.make({ tail }))));
507
621
  }
622
+ case "StoreReadExecution": {
623
+ const store = yield* ThreadStore;
624
+ return yield* capture(store.readExecution(request.request).pipe(Effect.map((checkpoint) => StoreReadExecutionResult.make({ checkpoint }))));
625
+ }
508
626
  case "StoreReadIdentity": {
509
627
  const store = yield* ThreadStore;
510
628
  return yield* capture(store.readIdentity(request.request).pipe(Effect.map((identity) => StoreReadIdentityResult.make({ identity }))));
511
629
  }
630
+ case "StoreWorkerCapacity": {
631
+ const store = yield* ThreadStore;
632
+ return yield* capture(store.readWorkerCapacity === void 0 ? Effect.fail(crossThreadStoreError("worker capacity unavailable", request.request.threadId)) : store.readWorkerCapacity(request.request).pipe(Effect.map((capacity) => StoreWorkerCapacityResult.make({ capacity }))));
633
+ }
634
+ case "StoreVerification": {
635
+ const store = yield* ThreadStore;
636
+ return yield* capture(store.verification === void 0 ? Effect.fail(crossThreadStoreError("verification unavailable", request.request.threadId)) : store.verification.verify(request.request).pipe(Effect.map((report) => StoreVerificationResult.make({ report }))));
637
+ }
512
638
  case "StoreExport": {
513
639
  const store = yield* ThreadStore;
514
640
  return yield* capture(store.export(request.request).pipe(Effect.map((threadExport) => StoreExportResult.make({ export: threadExport }))));
@@ -534,11 +660,11 @@ const encodedProtocolFailure = (message) => ({
534
660
  * cannot be encoded, answers `PortFailed(PortProtocolError)` instead of throwing, so the
535
661
  * transport never has to interpret exceptions as protocol answers.
536
662
  */
537
- const handleEncodedPortRequest = Effect.fn("DoPortRouting.handleEncodedPortRequest")(function* (encoded) {
663
+ const handleEncodedPortRequest = Effect.fnUntraced(function* (encoded) {
538
664
  const response = yield* decodePortRequest(encoded).pipe(Effect.flatMap(executePortRequest), Effect.catch((error) => Effect.succeed(PortFailed.make({ failure: PortProtocolError.make({ message: boundPortDiagnostic(`The port request could not be decoded: ${error.message}`) }) }))));
539
665
  return yield* encodePortResponse(response).pipe(Effect.catch((error) => Effect.succeed(encodedProtocolFailure(`The port response could not be encoded: ${error.message}`))));
540
666
  });
541
667
  //#endregion
542
- export { PortTransportError, ThreadPortTransport, executePortRequest, handleEncodedPortRequest, makeLocalSubmissionLookup, portTransportFailure, routedMessageDeliveryStoreLayer, routedSubmissionLedgerLayer, routedThreadStoreLayer, routedWorkerAdmissionLayer, PortRouting_exports as t };
668
+ export { CurrentNativeSource, PortTransportError, ThreadPortTransport, executePortRequest, handleEncodedPortRequest, makeLocalSubmissionLookup, portTransportFailure, routedMessageDeliveryStoreLayer, routedSettlementPublisherLayer, routedSubmissionLedgerLayer, routedThreadStoreLayer, routedWorkerAdmissionLayer, PortRouting_exports as t };
543
669
 
544
670
  //# sourceMappingURL=PortRouting.mjs.map