@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.
- package/dist/DoMemoryStore.mjs +1 -1
- package/dist/DoMessageDeliveryStore.d.mts +1 -1
- package/dist/DoMessageDeliveryStore.mjs +3 -2
- package/dist/DoMessageDeliveryStore.mjs.map +1 -1
- package/dist/DoScheduleStore.mjs +16 -37
- package/dist/DoScheduleStore.mjs.map +1 -1
- package/dist/DoStorageConfig.d.mts +2 -10
- package/dist/DoStorageConfig.mjs +2 -11
- package/dist/DoStorageConfig.mjs.map +1 -1
- package/dist/{DoStorageError-CGuAfSwF.d.mts → DoStorageError-CxjMnzUA.d.mts} +7 -18
- package/dist/DoStorageError.d.mts +2 -2
- package/dist/DoStorageError.mjs +14 -30
- package/dist/DoStorageError.mjs.map +1 -1
- package/dist/DoStorageFailpoint.d.mts +1 -1
- package/dist/DoStorageFailpointTesting.d.mts +1 -1
- package/dist/{DoStorageVersion-iNSyi3cJ.d.mts → DoStorageVersion-DTFoLglB.d.mts} +3 -4
- package/dist/DoStorageVersion.d.mts +1 -1
- package/dist/DoStorageVersion.mjs +2 -2
- package/dist/DoStorageVersion.mjs.map +1 -1
- package/dist/DoSubmissionLedger.d.mts +7 -5
- package/dist/DoSubmissionLedger.mjs +378 -528
- package/dist/DoSubmissionLedger.mjs.map +1 -1
- package/dist/DoSubscriptionStore.mjs +5 -24
- package/dist/DoSubscriptionStore.mjs.map +1 -1
- package/dist/{DoThreadStore-D_83OjCH.d.mts → DoThreadStore-Bd4fTns3.d.mts} +17 -18
- package/dist/DoThreadStore-CwBvTLoq.mjs +468 -0
- package/dist/DoThreadStore-CwBvTLoq.mjs.map +1 -0
- package/dist/DoThreadStore.d.mts +2 -2
- package/dist/DoThreadStore.mjs +4 -529
- package/dist/MemoryProtocol.mjs +3 -3
- package/dist/MemoryProtocol.mjs.map +1 -1
- package/dist/PortProtocol.d.mts +11727 -3410
- package/dist/PortProtocol.mjs +103 -15
- package/dist/PortProtocol.mjs.map +1 -1
- package/dist/PortRouting.d.mts +14 -9
- package/dist/PortRouting.mjs +155 -29
- package/dist/PortRouting.mjs.map +1 -1
- package/dist/do-journal-Cawnsetj.mjs +761 -0
- package/dist/do-journal-Cawnsetj.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/migrations-D_EP3KYf.mjs +148 -0
- package/dist/migrations-D_EP3KYf.mjs.map +1 -0
- package/dist/{owned-state-DHm2aRXx.mjs → owned-state-BHzUi0eb.mjs} +50 -19
- package/dist/owned-state-BHzUi0eb.mjs.map +1 -0
- package/package.json +1 -1
- package/src/DoMessageDeliveryStore.ts +2 -1
- package/src/DoScheduleStore.ts +19 -59
- package/src/DoStorageConfig.ts +2 -11
- package/src/DoStorageError.ts +3 -26
- package/src/DoStorageVersion.ts +1 -1
- package/src/DoSubmissionLedger.ts +1806 -2030
- package/src/DoSubscriptionStore.ts +5 -47
- package/src/DoThreadStore.ts +276 -622
- package/src/MemoryProtocol.ts +3 -3
- package/src/PortProtocol.ts +198 -12
- package/src/PortRouting.ts +527 -108
- package/src/internal/canonical-append.ts +15 -0
- package/src/internal/do-journal.ts +548 -1440
- package/src/internal/migrations.ts +184 -287
- package/src/internal/owned-state.ts +81 -30
- package/src/internal/prompt-checkpoint.ts +158 -0
- package/src/internal/storage-span.ts +2 -5
- package/dist/DoThreadStore.mjs.map +0 -1
- package/dist/do-journal-DUhjZkOf.mjs +0 -1352
- package/dist/do-journal-DUhjZkOf.mjs.map +0 -1
- package/dist/migrations-DtKz_Gxr.mjs +0 -306
- package/dist/migrations-DtKz_Gxr.mjs.map +0 -1
- package/dist/owned-state-DHm2aRXx.mjs.map +0 -1
- package/src/internal/message-delivery-schema.ts +0 -24
- package/src/internal/recovery-checkpoint-schema.ts +0 -17
package/dist/PortRouting.mjs
CHANGED
|
@@ -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,
|
|
7
|
-
import {
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
371
|
-
* transport.
|
|
372
|
-
*
|
|
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.
|
|
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.
|
|
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
|