@effect-agent/storage-cloudflare 0.1.0-beta.113 → 0.1.0-beta.115

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.
@@ -3,11 +3,14 @@ import { Schema } from "effect";
3
3
  import { MessageDeliveryError, MessageDeliveryPage, MessageDeliveryPageRequest } from "effect-agent/message-delivery";
4
4
  import { CanonicalRecordEnvelope } from "effect-agent/records";
5
5
  import { AppendConflict, AppendResult, FenceRejected, FencedAppendRequest, ThreadExport, ThreadExportRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadPeerCountRequest, ThreadReadRequest, ThreadStoreError, ThreadTail, ThreadTailRequest } from "effect-agent/thread-store";
6
- import { AbortCommand, AbortIntent, AdmissionConflict, AdmissionPolicyError, AdmissionRequest, AdmissionResolution, AdmissionResult, ChildSettledNotification, ChildSettledOutcome, JoinedToHost, LedgerError, MarkReadyRequest, SettlementConflict, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot } from "effect-agent/submission-ledger";
6
+ import { AbortCommand, AbortIntent, AdmissionConflict, AdmissionPolicyError, AdmissionRequest, AdmissionResolution, AdmissionResult, ChildSettledNotification, ChildSettledOutcome, JoinedToHost, LedgerError, MarkReadyRequest, SettlementConflict, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, WorkerLedgerState, WorkerStopCommand } from "effect-agent/submission-ledger";
7
+ import { ThreadId } from "effect-agent/identifiers";
7
8
  //#region src/PortProtocol.ts
8
9
  var PortProtocol_exports = /* @__PURE__ */ __exportAll({
9
10
  LedgerAdmitCall: () => LedgerAdmitCall,
10
11
  LedgerAdmitResult: () => LedgerAdmitResult,
12
+ LedgerInspectWorkerCall: () => LedgerInspectWorkerCall,
13
+ LedgerInspectWorkerResult: () => LedgerInspectWorkerResult,
11
14
  LedgerLookupCall: () => LedgerLookupCall,
12
15
  LedgerLookupResult: () => LedgerLookupResult,
13
16
  LedgerMarkReadyCall: () => LedgerMarkReadyCall,
@@ -18,6 +21,8 @@ var PortProtocol_exports = /* @__PURE__ */ __exportAll({
18
21
  LedgerRequestAbortResult: () => LedgerRequestAbortResult,
19
22
  LedgerResolveAdmissionCall: () => LedgerResolveAdmissionCall,
20
23
  LedgerResolveAdmissionResult: () => LedgerResolveAdmissionResult,
24
+ LedgerStopWorkerCall: () => LedgerStopWorkerCall,
25
+ LedgerStopWorkerResult: () => LedgerStopWorkerResult,
21
26
  MAX_PORT_DIAGNOSTIC_LENGTH: () => MAX_PORT_DIAGNOSTIC_LENGTH,
22
27
  MessageDeliveryListCall: () => MessageDeliveryListCall,
23
28
  MessageDeliveryListResult: () => MessageDeliveryListResult,
@@ -93,6 +98,10 @@ var LedgerMarkReadyCall = class extends Schema.TaggedClass("@effect-agent/storag
93
98
  var LedgerLookupCall = class extends Schema.TaggedClass("@effect-agent/storage-cloudflare/LedgerLookupCall")("LedgerLookup", { request: SubmissionLookup }) {};
94
99
  /** Routed `SubmissionLedger.resolveAdmission` — the SUB-031 tri-state authority call. */
95
100
  var LedgerResolveAdmissionCall = class extends Schema.TaggedClass("@effect-agent/storage-cloudflare/LedgerResolveAdmissionCall")("LedgerResolveAdmission", { request: SubmissionLookupByKey }) {};
101
+ var LedgerInspectWorkerCall = class extends Schema.TaggedClass()("LedgerInspectWorker", { request: Schema.Struct({ threadId: ThreadId }) }) {};
102
+ var LedgerInspectWorkerResult = class extends Schema.TaggedClass()("LedgerInspectWorkerResult", { state: WorkerLedgerState }) {};
103
+ var LedgerStopWorkerCall = class extends Schema.TaggedClass()("LedgerStopWorker", { request: WorkerStopCommand }) {};
104
+ var LedgerStopWorkerResult = class extends Schema.TaggedClass()("LedgerStopWorkerResult", { owned: Schema.Natural }) {};
96
105
  /** Routed `SubmissionLedger.requestAbort` — abort propagation across Objects. */
97
106
  var LedgerRequestAbortCall = class extends Schema.TaggedClass("@effect-agent/storage-cloudflare/LedgerRequestAbortCall")("LedgerRequestAbort", { request: AbortCommand }) {};
98
107
  /** Routed `SubmissionLedger.recordChildSettled` — the child→parent durable notification. */
@@ -117,6 +126,8 @@ const PortRequest = Schema.Union([
117
126
  LedgerLookupCall,
118
127
  LedgerResolveAdmissionCall,
119
128
  LedgerRequestAbortCall,
129
+ LedgerStopWorkerCall,
130
+ LedgerInspectWorkerCall,
120
131
  LedgerRecordChildSettledCall,
121
132
  StoreMaterializeCall,
122
133
  StoreAppendCall,
@@ -151,6 +162,8 @@ const PortResult = Schema.Union([
151
162
  LedgerLookupResult,
152
163
  LedgerResolveAdmissionResult,
153
164
  LedgerRequestAbortResult,
165
+ LedgerStopWorkerResult,
166
+ LedgerInspectWorkerResult,
154
167
  LedgerRecordChildSettledResult,
155
168
  StoreMaterializeResult,
156
169
  StoreAppendResult,
@@ -188,6 +201,6 @@ const decodePortRequest = Schema.decodeUnknownEffect(PortRequest);
188
201
  const encodePortResponse = Schema.encodeEffect(PortResponse);
189
202
  const decodePortResponse = Schema.decodeUnknownEffect(PortResponse);
190
203
  //#endregion
191
- export { LedgerAdmitCall, LedgerAdmitResult, LedgerLookupCall, LedgerLookupResult, LedgerMarkReadyCall, LedgerMarkReadyResult, LedgerRecordChildSettledCall, LedgerRecordChildSettledResult, LedgerRequestAbortCall, LedgerRequestAbortResult, LedgerResolveAdmissionCall, LedgerResolveAdmissionResult, MAX_PORT_DIAGNOSTIC_LENGTH, MessageDeliveryListCall, MessageDeliveryListResult, PortFailed, PortFailure, PortProtocolError, PortRequest, PortResponse, PortResult, PortSucceeded, StoreAppendCall, StoreAppendResult, StoreCountPeerMessagesCall, StoreCountPeerMessagesResult, StoreExportCall, StoreExportResult, StoreInspectTailCall, StoreInspectTailResult, StoreMaterializeCall, StoreMaterializeResult, StoreReadPageCall, StoreReadPageResult, boundPortDiagnostic, decodePortRequest, decodePortResponse, encodePortRequest, encodePortResponse, PortProtocol_exports as t };
204
+ export { LedgerAdmitCall, LedgerAdmitResult, LedgerInspectWorkerCall, LedgerInspectWorkerResult, LedgerLookupCall, LedgerLookupResult, LedgerMarkReadyCall, LedgerMarkReadyResult, LedgerRecordChildSettledCall, LedgerRecordChildSettledResult, LedgerRequestAbortCall, LedgerRequestAbortResult, LedgerResolveAdmissionCall, LedgerResolveAdmissionResult, LedgerStopWorkerCall, LedgerStopWorkerResult, MAX_PORT_DIAGNOSTIC_LENGTH, MessageDeliveryListCall, MessageDeliveryListResult, PortFailed, PortFailure, PortProtocolError, PortRequest, PortResponse, PortResult, PortSucceeded, StoreAppendCall, StoreAppendResult, StoreCountPeerMessagesCall, StoreCountPeerMessagesResult, StoreExportCall, StoreExportResult, StoreInspectTailCall, StoreInspectTailResult, StoreMaterializeCall, StoreMaterializeResult, StoreReadPageCall, StoreReadPageResult, boundPortDiagnostic, decodePortRequest, decodePortResponse, encodePortRequest, encodePortResponse, PortProtocol_exports as t };
192
205
 
193
206
  //# sourceMappingURL=PortProtocol.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortProtocol.mjs","names":[],"sources":["../src/PortProtocol.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport {\n MessageDeliveryError,\n MessageDeliveryPageRequest,\n MessageDeliveryPage,\n} from \"effect-agent/message-delivery\";\nimport { CanonicalRecordEnvelope } from \"effect-agent/records\";\nimport {\n AbortCommand,\n AbortIntent,\n AdmissionConflict,\n AdmissionPolicyError,\n AdmissionRequest,\n AdmissionResolution,\n AdmissionResult,\n ChildSettledNotification,\n ChildSettledOutcome,\n JoinedToHost,\n LedgerError,\n MarkReadyRequest,\n SettlementConflict,\n SubmissionLookup,\n SubmissionLookupByKey,\n SubmissionSnapshot,\n} from \"effect-agent/submission-ledger\";\nimport {\n AppendConflict,\n AppendResult,\n ThreadExport,\n ThreadPeerCountRequest,\n ThreadExportRequest,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadReadRequest,\n ThreadStoreError,\n ThreadTail,\n ThreadTailRequest,\n FenceRejected,\n FencedAppendRequest,\n} from \"effect-agent/thread-store\";\n\n/**\n * The cross-Durable-Object port protocol (plan §1.3, D-P6-3): Schema request/response/error\n * envelopes for the CLOSED route-capable subset of the thread ports. One Thread's\n * Durable Object executes another Thread's request against its OWN local facets; the\n * envelopes here are the only values that cross the Object boundary, and they are\n * transport-agnostic — native Durable Object JS RPC is the shipped carrier, fetch-with-JSON\n * the documented fallback, and both move the same Schema-encoded JSON.\n *\n * The closed subset is exactly the set of operations the durable coordinator performs against\n * a FOREIGN Thread (parent/child establishment, status checks, abort propagation,\n * child-settlement notification, and the child-thread store operations used by\n * establishment, `verifySettledChild`, and result projection):\n *\n * - ledger: `admit`, `markReady`, `lookup`, `resolveAdmission`, `requestAbort`,\n * `recordChildSettled`;\n * - store: `materialize`, `append`, `read` (one page), `inspectTail`, `export`.\n *\n * Every other port operation is lane-local and has no envelope. A foreign disposable\n * recovery-cache load returns a miss so the caller can replay canonical history. Other\n * foreign operations fail fast and typed instead of widening the distributed surface.\n *\n * Failures cross the boundary as the `PortFailure` union and re-decode on the caller side to\n * the SAME tagged error types the local facet would have produced, so routed calls keep\n * error-tag fidelity. `cause` chains inside `LedgerError`/`ThreadStoreError` travel as\n * Schema defects and do not claim instance fidelity across Objects (plan §2.8).\n */\n\n/** Ceiling for protocol diagnostic strings; matches `AdmissionIndeterminate.reason`. */\nexport const MAX_PORT_DIAGNOSTIC_LENGTH = 4_096;\n\nconst BoundedDiagnostic = Schema.String.check(Schema.isMaxLength(MAX_PORT_DIAGNOSTIC_LENGTH));\n\n/** Truncate a diagnostic string to the protocol's bounded diagnostic length. */\nexport const boundPortDiagnostic = (value: string): string =>\n value.length > MAX_PORT_DIAGNOSTIC_LENGTH\n ? `${value.slice(0, MAX_PORT_DIAGNOSTIC_LENGTH - 3)}...`\n : value;\n\n/**\n * The envelope itself could not be honored: the receiving Object could not decode the\n * request, or a response could not be encoded/decoded. It never carries port semantics —\n * callers fold it into the operation's base error (`LedgerError`/`ThreadStoreError`),\n * except `resolveAdmission`, which folds it into `AdmissionIndeterminate` because a\n * non-answer is never proof of absence (SUB-031).\n */\nexport class PortProtocolError extends Schema.TaggedError<PortProtocolError>()(\n \"PortProtocolError\",\n {\n message: BoundedDiagnostic,\n },\n) {}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\n/** Routed `SubmissionLedger.admit` — child establishment admits INTO the owning Object. */\nexport class LedgerAdmitCall extends Schema.TaggedClass<LedgerAdmitCall>(\n \"@effect-agent/storage-cloudflare/LedgerAdmitCall\",\n)(\"LedgerAdmit\", {\n request: AdmissionRequest,\n}) {}\n\n/** Routed `SubmissionLedger.markReady` for a Submission owned by another Object. */\nexport class LedgerMarkReadyCall extends Schema.TaggedClass<LedgerMarkReadyCall>(\n \"@effect-agent/storage-cloudflare/LedgerMarkReadyCall\",\n)(\"LedgerMarkReady\", {\n request: MarkReadyRequest,\n}) {}\n\n/** Routed `SubmissionLedger.lookup` (by identity or scoped idempotency key). */\nexport class LedgerLookupCall extends Schema.TaggedClass<LedgerLookupCall>(\n \"@effect-agent/storage-cloudflare/LedgerLookupCall\",\n)(\"LedgerLookup\", {\n request: SubmissionLookup,\n}) {}\n\n/** Routed `SubmissionLedger.resolveAdmission` — the SUB-031 tri-state authority call. */\nexport class LedgerResolveAdmissionCall extends Schema.TaggedClass<LedgerResolveAdmissionCall>(\n \"@effect-agent/storage-cloudflare/LedgerResolveAdmissionCall\",\n)(\"LedgerResolveAdmission\", {\n request: SubmissionLookupByKey,\n}) {}\n\n/** Routed `SubmissionLedger.requestAbort` — abort propagation across Objects. */\nexport class LedgerRequestAbortCall extends Schema.TaggedClass<LedgerRequestAbortCall>(\n \"@effect-agent/storage-cloudflare/LedgerRequestAbortCall\",\n)(\"LedgerRequestAbort\", {\n request: AbortCommand,\n}) {}\n\n/** Routed `SubmissionLedger.recordChildSettled` — the child→parent durable notification. */\nexport class LedgerRecordChildSettledCall extends Schema.TaggedClass<LedgerRecordChildSettledCall>(\n \"@effect-agent/storage-cloudflare/LedgerRecordChildSettledCall\",\n)(\"LedgerRecordChildSettled\", {\n request: ChildSettledNotification,\n}) {}\n\n/** Routed `ThreadStore.materialize` against the owning Object. */\nexport class StoreMaterializeCall extends Schema.TaggedClass<StoreMaterializeCall>(\n \"@effect-agent/storage-cloudflare/StoreMaterializeCall\",\n)(\"StoreMaterialize\", {\n request: ThreadMaterialization,\n}) {}\n\n/** Routed `ThreadStore.append` against the owning Object. */\nexport class StoreAppendCall extends Schema.TaggedClass<StoreAppendCall>(\n \"@effect-agent/storage-cloudflare/StoreAppendCall\",\n)(\"StoreAppend\", {\n request: FencedAppendRequest,\n}) {}\n\n/** Routed one-page `ThreadStore.read`; the page bound is the request's own `limit`. */\nexport class StoreReadPageCall extends Schema.TaggedClass<StoreReadPageCall>(\n \"@effect-agent/storage-cloudflare/StoreReadPageCall\",\n)(\"StoreReadPage\", {\n request: ThreadReadRequest,\n}) {}\n\n/** Routed `ThreadStore.inspectTail` against the owning Object. */\nexport class StoreInspectTailCall extends Schema.TaggedClass<StoreInspectTailCall>(\n \"@effect-agent/storage-cloudflare/StoreInspectTailCall\",\n)(\"StoreInspectTail\", {\n request: ThreadTailRequest,\n}) {}\n\n/** Routed `ThreadStore.export` against the owning Object. */\nexport class StoreExportCall extends Schema.TaggedClass<StoreExportCall>(\n \"@effect-agent/storage-cloudflare/StoreExportCall\",\n)(\"StoreExport\", {\n request: ThreadExportRequest,\n}) {}\n\nexport class StoreCountPeerMessagesCall extends Schema.TaggedClass<StoreCountPeerMessagesCall>()(\n \"StoreCountPeerMessages\",\n { request: ThreadPeerCountRequest },\n) {}\n\nexport class MessageDeliveryListCall extends Schema.TaggedClass<MessageDeliveryListCall>()(\n \"MessageDeliveryList\",\n { request: MessageDeliveryPageRequest },\n) {}\n\n/** Every request that may cross a Durable Object boundary — the CLOSED route-capable subset. */\nexport const PortRequest = Schema.Union([\n MessageDeliveryListCall,\n LedgerAdmitCall,\n LedgerMarkReadyCall,\n LedgerLookupCall,\n LedgerResolveAdmissionCall,\n LedgerRequestAbortCall,\n LedgerRecordChildSettledCall,\n StoreMaterializeCall,\n StoreAppendCall,\n StoreReadPageCall,\n StoreInspectTailCall,\n StoreExportCall,\n StoreCountPeerMessagesCall,\n]);\n\nexport type PortRequest = typeof PortRequest.Type;\n\n/** The wire form of one port request (what a transport actually carries). */\nexport type PortRequestEnvelope = typeof PortRequest.Encoded;\n\n// ---------------------------------------------------------------------------\n// Results\n// ---------------------------------------------------------------------------\n\nexport class LedgerAdmitResult extends Schema.TaggedClass<LedgerAdmitResult>(\n \"@effect-agent/storage-cloudflare/LedgerAdmitResult\",\n)(\"LedgerAdmitResult\", {\n result: AdmissionResult,\n}) {}\n\nexport class LedgerMarkReadyResult extends Schema.TaggedClass<LedgerMarkReadyResult>(\n \"@effect-agent/storage-cloudflare/LedgerMarkReadyResult\",\n)(\"LedgerMarkReadyResult\", {}) {}\n\n/** `submission` is absent exactly when the lookup answered `Option.none`. */\nexport class LedgerLookupResult extends Schema.TaggedClass<LedgerLookupResult>(\n \"@effect-agent/storage-cloudflare/LedgerLookupResult\",\n)(\"LedgerLookupResult\", {\n submission: Schema.optionalKey(SubmissionSnapshot),\n}) {}\n\nexport class LedgerResolveAdmissionResult extends Schema.TaggedClass<LedgerResolveAdmissionResult>(\n \"@effect-agent/storage-cloudflare/LedgerResolveAdmissionResult\",\n)(\"LedgerResolveAdmissionResult\", {\n resolution: AdmissionResolution,\n}) {}\n\nexport class LedgerRequestAbortResult extends Schema.TaggedClass<LedgerRequestAbortResult>(\n \"@effect-agent/storage-cloudflare/LedgerRequestAbortResult\",\n)(\"LedgerRequestAbortResult\", {\n intent: AbortIntent,\n}) {}\n\nexport class LedgerRecordChildSettledResult extends Schema.TaggedClass<LedgerRecordChildSettledResult>(\n \"@effect-agent/storage-cloudflare/LedgerRecordChildSettledResult\",\n)(\"LedgerRecordChildSettledResult\", {\n outcome: ChildSettledOutcome,\n}) {}\n\nexport class StoreMaterializeResult extends Schema.TaggedClass<StoreMaterializeResult>(\n \"@effect-agent/storage-cloudflare/StoreMaterializeResult\",\n)(\"StoreMaterializeResult\", {}) {}\n\nexport class StoreAppendResult extends Schema.TaggedClass<StoreAppendResult>(\n \"@effect-agent/storage-cloudflare/StoreAppendResult\",\n)(\"StoreAppendResult\", {\n result: AppendResult,\n}) {}\n\n/** One page of canonical records, bounded by the request's `limit` (≤ 1,024). */\nexport class StoreReadPageResult extends Schema.TaggedClass<StoreReadPageResult>(\n \"@effect-agent/storage-cloudflare/StoreReadPageResult\",\n)(\"StoreReadPageResult\", {\n records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(1_024)),\n}) {}\n\nexport class StoreInspectTailResult extends Schema.TaggedClass<StoreInspectTailResult>(\n \"@effect-agent/storage-cloudflare/StoreInspectTailResult\",\n)(\"StoreInspectTailResult\", {\n tail: ThreadTail,\n}) {}\n\nexport class StoreExportResult extends Schema.TaggedClass<StoreExportResult>(\n \"@effect-agent/storage-cloudflare/StoreExportResult\",\n)(\"StoreExportResult\", {\n export: ThreadExport,\n}) {}\n\nexport class StoreCountPeerMessagesResult extends Schema.TaggedClass<StoreCountPeerMessagesResult>()(\n \"StoreCountPeerMessagesResult\",\n { count: Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 1000 })) },\n) {}\n\nexport class MessageDeliveryListResult extends Schema.TaggedClass<MessageDeliveryListResult>()(\n \"MessageDeliveryListResult\",\n { page: MessageDeliveryPage },\n) {}\n\n/** Every successful routed result. Callers narrow by the tag their request implies. */\nexport const PortResult = Schema.Union([\n MessageDeliveryListResult,\n LedgerAdmitResult,\n LedgerMarkReadyResult,\n LedgerLookupResult,\n LedgerResolveAdmissionResult,\n LedgerRequestAbortResult,\n LedgerRecordChildSettledResult,\n StoreMaterializeResult,\n StoreAppendResult,\n StoreReadPageResult,\n StoreInspectTailResult,\n StoreExportResult,\n StoreCountPeerMessagesResult,\n]);\n\nexport type PortResult = typeof PortResult.Type;\n\n// ---------------------------------------------------------------------------\n// Failures and the response envelope\n// ---------------------------------------------------------------------------\n\n/**\n * Every typed failure a route-capable operation can produce on its owning Object, plus the\n * protocol's own `PortProtocolError`. Members re-decode to the SAME tagged classes the\n * thread ports declare, so a routed caller observes identical error tags and fields.\n */\nexport const PortFailure = Schema.Union([\n MessageDeliveryError,\n AdmissionConflict,\n AdmissionPolicyError,\n SettlementConflict,\n JoinedToHost,\n LedgerError,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n PortProtocolError,\n]);\n\nexport type PortFailure = typeof PortFailure.Type;\n\n/** The routed operation succeeded on its owning Object. */\nexport class PortSucceeded extends Schema.TaggedClass<PortSucceeded>(\n \"@effect-agent/storage-cloudflare/PortSucceeded\",\n)(\"PortSucceeded\", {\n result: PortResult,\n}) {}\n\n/** The routed operation failed TYPED on its owning Object; the failure re-decodes verbatim. */\nexport class PortFailed extends Schema.TaggedClass<PortFailed>(\n \"@effect-agent/storage-cloudflare/PortFailed\",\n)(\"PortFailed\", {\n failure: PortFailure,\n}) {}\n\n/** The uniform answer of one `portCall`: op-specific success or a re-decodable typed failure. */\nexport const PortResponse = Schema.Union([PortSucceeded, PortFailed]);\nexport type PortResponse = typeof PortResponse.Type;\n\n/** The wire form of one port response (what a transport actually carries). */\nexport type PortResponseEnvelope = typeof PortResponse.Encoded;\n\n// ---------------------------------------------------------------------------\n// Codecs\n// ---------------------------------------------------------------------------\n\nexport const encodePortRequest = Schema.encodeEffect(PortRequest);\nexport const decodePortRequest = Schema.decodeUnknownEffect(PortRequest);\nexport const encodePortResponse = Schema.encodeEffect(PortResponse);\nexport const decodePortResponse = Schema.decodeUnknownEffect(PortResponse);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqEA,MAAa,6BAA6B;AAE1C,MAAM,oBAAoB,OAAO,OAAO,MAAM,OAAO,YAAY,0BAA0B,CAAC;;AAG5F,MAAa,uBAAuB,UAClC,MAAM,SAAA,OACF,GAAG,MAAM,MAAM,GAAG,IAA8B,EAAE,OAClD;;;;;;;;AASN,IAAa,oBAAb,cAAuC,OAAO,YAA+B,CAAC,CAC5E,qBACA,EACE,SAAS,kBACX,CACF,CAAC,CAAC,CAAC;;AAOH,IAAa,kBAAb,cAAqC,OAAO,YAC1C,kDACF,CAAC,CAAC,eAAe,EACf,SAAS,iBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,sBAAb,cAAyC,OAAO,YAC9C,sDACF,CAAC,CAAC,mBAAmB,EACnB,SAAS,iBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,mBAAb,cAAsC,OAAO,YAC3C,mDACF,CAAC,CAAC,gBAAgB,EAChB,SAAS,iBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,6BAAb,cAAgD,OAAO,YACrD,6DACF,CAAC,CAAC,0BAA0B,EAC1B,SAAS,sBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,yBAAb,cAA4C,OAAO,YACjD,yDACF,CAAC,CAAC,sBAAsB,EACtB,SAAS,aACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,+BAAb,cAAkD,OAAO,YACvD,+DACF,CAAC,CAAC,4BAA4B,EAC5B,SAAS,yBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,uBAAb,cAA0C,OAAO,YAC/C,uDACF,CAAC,CAAC,oBAAoB,EACpB,SAAS,sBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,kBAAb,cAAqC,OAAO,YAC1C,kDACF,CAAC,CAAC,eAAe,EACf,SAAS,oBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,oBAAb,cAAuC,OAAO,YAC5C,oDACF,CAAC,CAAC,iBAAiB,EACjB,SAAS,kBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,uBAAb,cAA0C,OAAO,YAC/C,uDACF,CAAC,CAAC,oBAAoB,EACpB,SAAS,kBACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,kBAAb,cAAqC,OAAO,YAC1C,kDACF,CAAC,CAAC,eAAe,EACf,SAAS,oBACX,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,6BAAb,cAAgD,OAAO,YAAwC,CAAC,CAC9F,0BACA,EAAE,SAAS,uBAAuB,CACpC,CAAC,CAAC,CAAC;AAEH,IAAa,0BAAb,cAA6C,OAAO,YAAqC,CAAC,CACxF,uBACA,EAAE,SAAS,2BAA2B,CACxC,CAAC,CAAC,CAAC;;AAGH,MAAa,cAAc,OAAO,MAAM;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAWD,IAAa,oBAAb,cAAuC,OAAO,YAC5C,oDACF,CAAC,CAAC,qBAAqB,EACrB,QAAQ,gBACV,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,wBAAb,cAA2C,OAAO,YAChD,wDACF,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGhC,IAAa,qBAAb,cAAwC,OAAO,YAC7C,qDACF,CAAC,CAAC,sBAAsB,EACtB,YAAY,OAAO,YAAY,kBAAkB,EACnD,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,+BAAb,cAAkD,OAAO,YACvD,+DACF,CAAC,CAAC,gCAAgC,EAChC,YAAY,oBACd,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,2BAAb,cAA8C,OAAO,YACnD,2DACF,CAAC,CAAC,4BAA4B,EAC5B,QAAQ,YACV,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,iCAAb,cAAoD,OAAO,YACzD,iEACF,CAAC,CAAC,kCAAkC,EAClC,SAAS,oBACX,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,yBAAb,cAA4C,OAAO,YACjD,yDACF,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjC,IAAa,oBAAb,cAAuC,OAAO,YAC5C,oDACF,CAAC,CAAC,qBAAqB,EACrB,QAAQ,aACV,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,sBAAb,cAAyC,OAAO,YAC9C,sDACF,CAAC,CAAC,uBAAuB,EACvB,SAAS,OAAO,MAAM,uBAAuB,CAAC,CAAC,MAAM,OAAO,YAAY,IAAK,CAAC,EAChF,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,yBAAb,cAA4C,OAAO,YACjD,yDACF,CAAC,CAAC,0BAA0B,EAC1B,MAAM,WACR,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,oBAAb,cAAuC,OAAO,YAC5C,oDACF,CAAC,CAAC,qBAAqB,EACrB,QAAQ,aACV,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,+BAAb,cAAkD,OAAO,YAA0C,CAAC,CAClG,gCACA,EAAE,OAAO,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAK,CAAC,CAAC,EAAE,CAC7E,CAAC,CAAC,CAAC;AAEH,IAAa,4BAAb,cAA+C,OAAO,YAAuC,CAAC,CAC5F,6BACA,EAAE,MAAM,oBAAoB,CAC9B,CAAC,CAAC,CAAC;;AAGH,MAAa,aAAa,OAAO,MAAM;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;AAaD,MAAa,cAAc,OAAO,MAAM;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAKD,IAAa,gBAAb,cAAmC,OAAO,YACxC,gDACF,CAAC,CAAC,iBAAiB,EACjB,QAAQ,WACV,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,aAAb,cAAgC,OAAO,YACrC,6CACF,CAAC,CAAC,cAAc,EACd,SAAS,YACX,CAAC,CAAC,CAAC,CAAC;;AAGJ,MAAa,eAAe,OAAO,MAAM,CAAC,eAAe,UAAU,CAAC;AAUpE,MAAa,oBAAoB,OAAO,aAAa,WAAW;AAChE,MAAa,oBAAoB,OAAO,oBAAoB,WAAW;AACvE,MAAa,qBAAqB,OAAO,aAAa,YAAY;AAClE,MAAa,qBAAqB,OAAO,oBAAoB,YAAY"}
1
+ {"version":3,"file":"PortProtocol.mjs","names":[],"sources":["../src/PortProtocol.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport { ThreadId } from \"effect-agent/identifiers\";\nimport {\n MessageDeliveryError,\n MessageDeliveryPageRequest,\n MessageDeliveryPage,\n} from \"effect-agent/message-delivery\";\nimport { CanonicalRecordEnvelope } from \"effect-agent/records\";\nimport {\n AbortCommand,\n WorkerStopCommand,\n WorkerLedgerState,\n AbortIntent,\n AdmissionConflict,\n AdmissionPolicyError,\n AdmissionRequest,\n AdmissionResolution,\n AdmissionResult,\n ChildSettledNotification,\n ChildSettledOutcome,\n JoinedToHost,\n LedgerError,\n MarkReadyRequest,\n SettlementConflict,\n SubmissionLookup,\n SubmissionLookupByKey,\n SubmissionSnapshot,\n} from \"effect-agent/submission-ledger\";\nimport {\n AppendConflict,\n AppendResult,\n ThreadExport,\n ThreadPeerCountRequest,\n ThreadExportRequest,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadReadRequest,\n ThreadStoreError,\n ThreadTail,\n ThreadTailRequest,\n FenceRejected,\n FencedAppendRequest,\n} from \"effect-agent/thread-store\";\n\n/**\n * The cross-Durable-Object port protocol (plan §1.3, D-P6-3): Schema request/response/error\n * envelopes for the CLOSED route-capable subset of the thread ports. One Thread's\n * Durable Object executes another Thread's request against its OWN local facets; the\n * envelopes here are the only values that cross the Object boundary, and they are\n * transport-agnostic — native Durable Object JS RPC is the shipped carrier, fetch-with-JSON\n * the documented fallback, and both move the same Schema-encoded JSON.\n *\n * The closed subset is exactly the set of operations the durable coordinator performs against\n * a FOREIGN Thread (parent/child establishment, status checks, abort propagation,\n * child-settlement notification, and the child-thread store operations used by\n * establishment, `verifySettledChild`, and result projection):\n *\n * - ledger: `admit`, `markReady`, `lookup`, `resolveAdmission`, `requestAbort`,\n * `recordChildSettled`;\n * - store: `materialize`, `append`, `read` (one page), `inspectTail`, `export`.\n *\n * Every other port operation is lane-local and has no envelope. A foreign disposable\n * recovery-cache load returns a miss so the caller can replay canonical history. Other\n * foreign operations fail fast and typed instead of widening the distributed surface.\n *\n * Failures cross the boundary as the `PortFailure` union and re-decode on the caller side to\n * the SAME tagged error types the local facet would have produced, so routed calls keep\n * error-tag fidelity. `cause` chains inside `LedgerError`/`ThreadStoreError` travel as\n * Schema defects and do not claim instance fidelity across Objects (plan §2.8).\n */\n\n/** Ceiling for protocol diagnostic strings; matches `AdmissionIndeterminate.reason`. */\nexport const MAX_PORT_DIAGNOSTIC_LENGTH = 4_096;\n\nconst BoundedDiagnostic = Schema.String.check(Schema.isMaxLength(MAX_PORT_DIAGNOSTIC_LENGTH));\n\n/** Truncate a diagnostic string to the protocol's bounded diagnostic length. */\nexport const boundPortDiagnostic = (value: string): string =>\n value.length > MAX_PORT_DIAGNOSTIC_LENGTH\n ? `${value.slice(0, MAX_PORT_DIAGNOSTIC_LENGTH - 3)}...`\n : value;\n\n/**\n * The envelope itself could not be honored: the receiving Object could not decode the\n * request, or a response could not be encoded/decoded. It never carries port semantics —\n * callers fold it into the operation's base error (`LedgerError`/`ThreadStoreError`),\n * except `resolveAdmission`, which folds it into `AdmissionIndeterminate` because a\n * non-answer is never proof of absence (SUB-031).\n */\nexport class PortProtocolError extends Schema.TaggedError<PortProtocolError>()(\n \"PortProtocolError\",\n {\n message: BoundedDiagnostic,\n },\n) {}\n\n// ---------------------------------------------------------------------------\n// Requests\n// ---------------------------------------------------------------------------\n\n/** Routed `SubmissionLedger.admit` — child establishment admits INTO the owning Object. */\nexport class LedgerAdmitCall extends Schema.TaggedClass<LedgerAdmitCall>(\n \"@effect-agent/storage-cloudflare/LedgerAdmitCall\",\n)(\"LedgerAdmit\", {\n request: AdmissionRequest,\n}) {}\n\n/** Routed `SubmissionLedger.markReady` for a Submission owned by another Object. */\nexport class LedgerMarkReadyCall extends Schema.TaggedClass<LedgerMarkReadyCall>(\n \"@effect-agent/storage-cloudflare/LedgerMarkReadyCall\",\n)(\"LedgerMarkReady\", {\n request: MarkReadyRequest,\n}) {}\n\n/** Routed `SubmissionLedger.lookup` (by identity or scoped idempotency key). */\nexport class LedgerLookupCall extends Schema.TaggedClass<LedgerLookupCall>(\n \"@effect-agent/storage-cloudflare/LedgerLookupCall\",\n)(\"LedgerLookup\", {\n request: SubmissionLookup,\n}) {}\n\n/** Routed `SubmissionLedger.resolveAdmission` — the SUB-031 tri-state authority call. */\nexport class LedgerResolveAdmissionCall extends Schema.TaggedClass<LedgerResolveAdmissionCall>(\n \"@effect-agent/storage-cloudflare/LedgerResolveAdmissionCall\",\n)(\"LedgerResolveAdmission\", {\n request: SubmissionLookupByKey,\n}) {}\n\nexport class LedgerInspectWorkerCall extends Schema.TaggedClass<LedgerInspectWorkerCall>()(\n \"LedgerInspectWorker\",\n { request: Schema.Struct({ threadId: ThreadId }) },\n) {}\n\nexport class LedgerInspectWorkerResult extends Schema.TaggedClass<LedgerInspectWorkerResult>()(\n \"LedgerInspectWorkerResult\",\n { state: WorkerLedgerState },\n) {}\n\nexport class LedgerStopWorkerCall extends Schema.TaggedClass<LedgerStopWorkerCall>()(\n \"LedgerStopWorker\",\n { request: WorkerStopCommand },\n) {}\n\nexport class LedgerStopWorkerResult extends Schema.TaggedClass<LedgerStopWorkerResult>()(\n \"LedgerStopWorkerResult\",\n { owned: Schema.Natural },\n) {}\n\n/** Routed `SubmissionLedger.requestAbort` — abort propagation across Objects. */\nexport class LedgerRequestAbortCall extends Schema.TaggedClass<LedgerRequestAbortCall>(\n \"@effect-agent/storage-cloudflare/LedgerRequestAbortCall\",\n)(\"LedgerRequestAbort\", {\n request: AbortCommand,\n}) {}\n\n/** Routed `SubmissionLedger.recordChildSettled` — the child→parent durable notification. */\nexport class LedgerRecordChildSettledCall extends Schema.TaggedClass<LedgerRecordChildSettledCall>(\n \"@effect-agent/storage-cloudflare/LedgerRecordChildSettledCall\",\n)(\"LedgerRecordChildSettled\", {\n request: ChildSettledNotification,\n}) {}\n\n/** Routed `ThreadStore.materialize` against the owning Object. */\nexport class StoreMaterializeCall extends Schema.TaggedClass<StoreMaterializeCall>(\n \"@effect-agent/storage-cloudflare/StoreMaterializeCall\",\n)(\"StoreMaterialize\", {\n request: ThreadMaterialization,\n}) {}\n\n/** Routed `ThreadStore.append` against the owning Object. */\nexport class StoreAppendCall extends Schema.TaggedClass<StoreAppendCall>(\n \"@effect-agent/storage-cloudflare/StoreAppendCall\",\n)(\"StoreAppend\", {\n request: FencedAppendRequest,\n}) {}\n\n/** Routed one-page `ThreadStore.read`; the page bound is the request's own `limit`. */\nexport class StoreReadPageCall extends Schema.TaggedClass<StoreReadPageCall>(\n \"@effect-agent/storage-cloudflare/StoreReadPageCall\",\n)(\"StoreReadPage\", {\n request: ThreadReadRequest,\n}) {}\n\n/** Routed `ThreadStore.inspectTail` against the owning Object. */\nexport class StoreInspectTailCall extends Schema.TaggedClass<StoreInspectTailCall>(\n \"@effect-agent/storage-cloudflare/StoreInspectTailCall\",\n)(\"StoreInspectTail\", {\n request: ThreadTailRequest,\n}) {}\n\n/** Routed `ThreadStore.export` against the owning Object. */\nexport class StoreExportCall extends Schema.TaggedClass<StoreExportCall>(\n \"@effect-agent/storage-cloudflare/StoreExportCall\",\n)(\"StoreExport\", {\n request: ThreadExportRequest,\n}) {}\n\nexport class StoreCountPeerMessagesCall extends Schema.TaggedClass<StoreCountPeerMessagesCall>()(\n \"StoreCountPeerMessages\",\n { request: ThreadPeerCountRequest },\n) {}\n\nexport class MessageDeliveryListCall extends Schema.TaggedClass<MessageDeliveryListCall>()(\n \"MessageDeliveryList\",\n { request: MessageDeliveryPageRequest },\n) {}\n\n/** Every request that may cross a Durable Object boundary — the CLOSED route-capable subset. */\nexport const PortRequest = Schema.Union([\n MessageDeliveryListCall,\n LedgerAdmitCall,\n LedgerMarkReadyCall,\n LedgerLookupCall,\n LedgerResolveAdmissionCall,\n LedgerRequestAbortCall,\n LedgerStopWorkerCall,\n LedgerInspectWorkerCall,\n LedgerRecordChildSettledCall,\n StoreMaterializeCall,\n StoreAppendCall,\n StoreReadPageCall,\n StoreInspectTailCall,\n StoreExportCall,\n StoreCountPeerMessagesCall,\n]);\n\nexport type PortRequest = typeof PortRequest.Type;\n\n/** The wire form of one port request (what a transport actually carries). */\nexport type PortRequestEnvelope = typeof PortRequest.Encoded;\n\n// ---------------------------------------------------------------------------\n// Results\n// ---------------------------------------------------------------------------\n\nexport class LedgerAdmitResult extends Schema.TaggedClass<LedgerAdmitResult>(\n \"@effect-agent/storage-cloudflare/LedgerAdmitResult\",\n)(\"LedgerAdmitResult\", {\n result: AdmissionResult,\n}) {}\n\nexport class LedgerMarkReadyResult extends Schema.TaggedClass<LedgerMarkReadyResult>(\n \"@effect-agent/storage-cloudflare/LedgerMarkReadyResult\",\n)(\"LedgerMarkReadyResult\", {}) {}\n\n/** `submission` is absent exactly when the lookup answered `Option.none`. */\nexport class LedgerLookupResult extends Schema.TaggedClass<LedgerLookupResult>(\n \"@effect-agent/storage-cloudflare/LedgerLookupResult\",\n)(\"LedgerLookupResult\", {\n submission: Schema.optionalKey(SubmissionSnapshot),\n}) {}\n\nexport class LedgerResolveAdmissionResult extends Schema.TaggedClass<LedgerResolveAdmissionResult>(\n \"@effect-agent/storage-cloudflare/LedgerResolveAdmissionResult\",\n)(\"LedgerResolveAdmissionResult\", {\n resolution: AdmissionResolution,\n}) {}\n\nexport class LedgerRequestAbortResult extends Schema.TaggedClass<LedgerRequestAbortResult>(\n \"@effect-agent/storage-cloudflare/LedgerRequestAbortResult\",\n)(\"LedgerRequestAbortResult\", {\n intent: AbortIntent,\n}) {}\n\nexport class LedgerRecordChildSettledResult extends Schema.TaggedClass<LedgerRecordChildSettledResult>(\n \"@effect-agent/storage-cloudflare/LedgerRecordChildSettledResult\",\n)(\"LedgerRecordChildSettledResult\", {\n outcome: ChildSettledOutcome,\n}) {}\n\nexport class StoreMaterializeResult extends Schema.TaggedClass<StoreMaterializeResult>(\n \"@effect-agent/storage-cloudflare/StoreMaterializeResult\",\n)(\"StoreMaterializeResult\", {}) {}\n\nexport class StoreAppendResult extends Schema.TaggedClass<StoreAppendResult>(\n \"@effect-agent/storage-cloudflare/StoreAppendResult\",\n)(\"StoreAppendResult\", {\n result: AppendResult,\n}) {}\n\n/** One page of canonical records, bounded by the request's `limit` (≤ 1,024). */\nexport class StoreReadPageResult extends Schema.TaggedClass<StoreReadPageResult>(\n \"@effect-agent/storage-cloudflare/StoreReadPageResult\",\n)(\"StoreReadPageResult\", {\n records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(1_024)),\n}) {}\n\nexport class StoreInspectTailResult extends Schema.TaggedClass<StoreInspectTailResult>(\n \"@effect-agent/storage-cloudflare/StoreInspectTailResult\",\n)(\"StoreInspectTailResult\", {\n tail: ThreadTail,\n}) {}\n\nexport class StoreExportResult extends Schema.TaggedClass<StoreExportResult>(\n \"@effect-agent/storage-cloudflare/StoreExportResult\",\n)(\"StoreExportResult\", {\n export: ThreadExport,\n}) {}\n\nexport class StoreCountPeerMessagesResult extends Schema.TaggedClass<StoreCountPeerMessagesResult>()(\n \"StoreCountPeerMessagesResult\",\n { count: Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 1000 })) },\n) {}\n\nexport class MessageDeliveryListResult extends Schema.TaggedClass<MessageDeliveryListResult>()(\n \"MessageDeliveryListResult\",\n { page: MessageDeliveryPage },\n) {}\n\n/** Every successful routed result. Callers narrow by the tag their request implies. */\nexport const PortResult = Schema.Union([\n MessageDeliveryListResult,\n LedgerAdmitResult,\n LedgerMarkReadyResult,\n LedgerLookupResult,\n LedgerResolveAdmissionResult,\n LedgerRequestAbortResult,\n LedgerStopWorkerResult,\n LedgerInspectWorkerResult,\n LedgerRecordChildSettledResult,\n StoreMaterializeResult,\n StoreAppendResult,\n StoreReadPageResult,\n StoreInspectTailResult,\n StoreExportResult,\n StoreCountPeerMessagesResult,\n]);\n\nexport type PortResult = typeof PortResult.Type;\n\n// ---------------------------------------------------------------------------\n// Failures and the response envelope\n// ---------------------------------------------------------------------------\n\n/**\n * Every typed failure a route-capable operation can produce on its owning Object, plus the\n * protocol's own `PortProtocolError`. Members re-decode to the SAME tagged classes the\n * thread ports declare, so a routed caller observes identical error tags and fields.\n */\nexport const PortFailure = Schema.Union([\n MessageDeliveryError,\n AdmissionConflict,\n AdmissionPolicyError,\n SettlementConflict,\n JoinedToHost,\n LedgerError,\n ThreadStoreError,\n ThreadNotMaterialized,\n AppendConflict,\n FenceRejected,\n PortProtocolError,\n]);\n\nexport type PortFailure = typeof PortFailure.Type;\n\n/** The routed operation succeeded on its owning Object. */\nexport class PortSucceeded extends Schema.TaggedClass<PortSucceeded>(\n \"@effect-agent/storage-cloudflare/PortSucceeded\",\n)(\"PortSucceeded\", {\n result: PortResult,\n}) {}\n\n/** The routed operation failed TYPED on its owning Object; the failure re-decodes verbatim. */\nexport class PortFailed extends Schema.TaggedClass<PortFailed>(\n \"@effect-agent/storage-cloudflare/PortFailed\",\n)(\"PortFailed\", {\n failure: PortFailure,\n}) {}\n\n/** The uniform answer of one `portCall`: op-specific success or a re-decodable typed failure. */\nexport const PortResponse = Schema.Union([PortSucceeded, PortFailed]);\nexport type PortResponse = typeof PortResponse.Type;\n\n/** The wire form of one port response (what a transport actually carries). */\nexport type PortResponseEnvelope = typeof PortResponse.Encoded;\n\n// ---------------------------------------------------------------------------\n// Codecs\n// ---------------------------------------------------------------------------\n\nexport const encodePortRequest = Schema.encodeEffect(PortRequest);\nexport const decodePortRequest = Schema.decodeUnknownEffect(PortRequest);\nexport const encodePortResponse = Schema.encodeEffect(PortResponse);\nexport const decodePortResponse = Schema.decodeUnknownEffect(PortResponse);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { LedgerAdmitCall, LedgerLookupCall, LedgerMarkReadyCall, LedgerRecordChildSettledCall, LedgerRequestAbortCall, LedgerResolveAdmissionCall, MessageDeliveryListCall, PortFailed, PortRequestEnvelope, PortSucceeded, StoreAppendCall, StoreCountPeerMessagesCall, StoreExportCall, StoreInspectTailCall, StoreMaterializeCall, StoreReadPageCall } from "./PortProtocol.mjs";
1
+ import { LedgerAdmitCall, LedgerInspectWorkerCall, LedgerLookupCall, LedgerMarkReadyCall, LedgerRecordChildSettledCall, LedgerRequestAbortCall, LedgerResolveAdmissionCall, LedgerStopWorkerCall, MessageDeliveryListCall, PortFailed, PortRequestEnvelope, PortSucceeded, StoreAppendCall, StoreCountPeerMessagesCall, StoreExportCall, StoreInspectTailCall, StoreMaterializeCall, StoreReadPageCall } from "./PortProtocol.mjs";
2
2
  import { Context, Effect, Layer, Schema } from "effect";
3
3
  import { MessageDeliveryStore } from "effect-agent/message-delivery";
4
4
  import { ThreadMaterialization, ThreadStore } from "effect-agent/thread-store";
@@ -72,7 +72,7 @@ export declare const routedMessageDeliveryStoreLayer: (options: RoutedPortOption
72
72
  * Failures never escape — every typed port failure becomes a `PortFailed` envelope that
73
73
  * re-decodes on the caller side.
74
74
  */
75
- export declare const executePortRequest: (request: LedgerAdmitCall | LedgerLookupCall | LedgerMarkReadyCall | LedgerRecordChildSettledCall | LedgerRequestAbortCall | LedgerResolveAdmissionCall | MessageDeliveryListCall | StoreAppendCall | StoreCountPeerMessagesCall | StoreExportCall | StoreInspectTailCall | StoreMaterializeCall | StoreReadPageCall) => Effect.Effect<PortFailed | PortSucceeded, never, MessageDeliveryStore | SubmissionLedger | ThreadStore>;
75
+ export declare const executePortRequest: (request: LedgerAdmitCall | LedgerInspectWorkerCall | LedgerLookupCall | LedgerMarkReadyCall | LedgerRecordChildSettledCall | LedgerRequestAbortCall | LedgerResolveAdmissionCall | LedgerStopWorkerCall | MessageDeliveryListCall | StoreAppendCall | StoreCountPeerMessagesCall | StoreExportCall | StoreInspectTailCall | StoreMaterializeCall | StoreReadPageCall) => Effect.Effect<PortFailed | PortSucceeded, never, MessageDeliveryStore | SubmissionLedger | ThreadStore>;
76
76
  /**
77
77
  * The complete owner-side endpoint body for `portCall` (D-P6-3): decode the wire request,
78
78
  * execute it against this Object's LOCAL facets, and answer with the encoded response
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
- import { LedgerAdmitCall, LedgerAdmitResult, LedgerLookupCall, LedgerLookupResult, LedgerMarkReadyCall, LedgerMarkReadyResult, LedgerRecordChildSettledCall, LedgerRecordChildSettledResult, LedgerRequestAbortCall, LedgerRequestAbortResult, LedgerResolveAdmissionCall, LedgerResolveAdmissionResult, MessageDeliveryListCall, MessageDeliveryListResult, PortFailed, PortProtocolError, PortSucceeded, StoreAppendCall, StoreAppendResult, StoreCountPeerMessagesCall, StoreCountPeerMessagesResult, StoreExportCall, StoreExportResult, StoreInspectTailCall, StoreInspectTailResult, StoreMaterializeCall, StoreMaterializeResult, StoreReadPageCall, StoreReadPageResult, boundPortDiagnostic, decodePortRequest, decodePortResponse, encodePortRequest, encodePortResponse } from "./PortProtocol.mjs";
2
+ import { LedgerAdmitCall, LedgerAdmitResult, LedgerInspectWorkerCall, LedgerInspectWorkerResult, LedgerLookupCall, LedgerLookupResult, LedgerMarkReadyCall, LedgerMarkReadyResult, LedgerRecordChildSettledCall, LedgerRecordChildSettledResult, LedgerRequestAbortCall, LedgerRequestAbortResult, LedgerResolveAdmissionCall, LedgerResolveAdmissionResult, LedgerStopWorkerCall, LedgerStopWorkerResult, MessageDeliveryListCall, MessageDeliveryListResult, PortFailed, PortProtocolError, PortSucceeded, StoreAppendCall, StoreAppendResult, StoreCountPeerMessagesCall, StoreCountPeerMessagesResult, StoreExportCall, StoreExportResult, StoreInspectTailCall, StoreInspectTailResult, StoreMaterializeCall, StoreMaterializeResult, StoreReadPageCall, StoreReadPageResult, boundPortDiagnostic, decodePortRequest, decodePortResponse, encodePortRequest, encodePortResponse } from "./PortProtocol.mjs";
3
3
  import { Context, Effect, Layer, Option, Predicate, Schema, Stream } from "effect";
4
4
  import { MessageDeliveryError, MessageDeliveryStore } from "effect-agent/message-delivery";
5
5
  import { AppendConflict, FenceRejected, ThreadMaterialization, ThreadNotMaterialized, ThreadStore, ThreadStoreError } from "effect-agent/thread-store";
@@ -230,6 +230,14 @@ const makeRoutedLedgerServices = Effect.fn("DoPortRouting.makeRoutedLedgerServic
230
230
  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))),
231
231
  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))),
232
232
  resolveAdmission: (request) => options.ownsThread(request.threadId) ? local.resolveAdmission(request) : resolveForeignAdmission(request.threadId, request),
233
+ inspectWorker: (threadId) => options.ownsThread(threadId) ? local.inspectWorker === void 0 ? Effect.fail(LedgerError.make({
234
+ operation: "inspectWorker",
235
+ message: "Worker inspection unavailable"
236
+ })) : local.inspectWorker(threadId) : foreignLedgerCall("inspect worker", threadId, LedgerInspectWorkerCall.make({ request: { threadId } }), LedgerInspectWorkerResult, NoAdditionalPortFailure).pipe(Effect.map((reply) => reply.state)),
237
+ stopWorker: (request) => options.ownsThread(request.threadId) ? local.stopWorker === void 0 ? Effect.fail(LedgerError.make({
238
+ operation: "stopWorker",
239
+ message: "Worker stop unavailable"
240
+ })) : local.stopWorker(request) : foreignLedgerCall("ledger stop worker", request.threadId, LedgerStopWorkerCall.make({ request }), LedgerStopWorkerResult, NoAdditionalPortFailure).pipe(Effect.map((reply) => reply.owned)),
233
241
  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)))),
234
242
  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)))),
235
243
  claim: (request) => options.ownsThread(request.threadId) ? local.claim(request) : Effect.fail(crossThreadLedgerError("ledger claim", request.threadId)),
@@ -380,6 +388,20 @@ const executePortRequest = Effect.fn("DoPortRouting.executePortRequest")(functio
380
388
  const ledger = yield* SubmissionLedger;
381
389
  return yield* capture(ledger.resolveAdmission(request.request).pipe(Effect.map((resolution) => LedgerResolveAdmissionResult.make({ resolution }))));
382
390
  }
391
+ case "LedgerInspectWorker": {
392
+ const ledger = yield* SubmissionLedger;
393
+ return yield* capture(ledger.inspectWorker === void 0 ? Effect.fail(LedgerError.make({
394
+ operation: "inspectWorker",
395
+ message: "Worker inspection unavailable"
396
+ })) : ledger.inspectWorker(request.request.threadId).pipe(Effect.map((state) => LedgerInspectWorkerResult.make({ state }))));
397
+ }
398
+ case "LedgerStopWorker": {
399
+ const ledger = yield* SubmissionLedger;
400
+ return yield* capture(ledger.stopWorker === void 0 ? Effect.fail(LedgerError.make({
401
+ operation: "stopWorker",
402
+ message: "Worker stop unavailable"
403
+ })) : ledger.stopWorker(request.request).pipe(Effect.map((owned) => LedgerStopWorkerResult.make({ owned }))));
404
+ }
383
405
  case "LedgerRequestAbort": {
384
406
  const ledger = yield* SubmissionLedger;
385
407
  return yield* capture(ledger.requestAbort(request.request).pipe(Effect.map((intent) => LedgerRequestAbortResult.make({ intent }))));
@@ -1 +1 @@
1
- {"version":3,"file":"PortRouting.mjs","names":[],"sources":["../src/PortRouting.ts"],"sourcesContent":["import { Context, Effect, Layer, Option, Predicate, Schema, Stream } from \"effect\";\nimport { MessageDeliveryStore, MessageDeliveryError } from \"effect-agent/message-delivery\";\nimport {\n AdmissionIndeterminate,\n AdmissionConflict,\n AdmissionPolicyError,\n ChildAttachmentSnapshot,\n JoinedToHost,\n LedgerError,\n RecoverySnapshot,\n SettlementConflict,\n SubmissionLedger,\n SubmissionLookupById,\n type SubmissionLookupByKey,\n type SubmissionSnapshot,\n} from \"effect-agent/submission-ledger\";\nimport {\n AppendConflict,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadStore,\n ThreadStoreError,\n FenceRejected,\n} from \"effect-agent/thread-store\";\n\nimport {\n MessageDeliveryListCall,\n MessageDeliveryListResult,\n boundPortDiagnostic,\n decodePortRequest,\n decodePortResponse,\n encodePortRequest,\n encodePortResponse,\n LedgerAdmitCall,\n LedgerAdmitResult,\n LedgerLookupCall,\n LedgerLookupResult,\n LedgerMarkReadyCall,\n LedgerMarkReadyResult,\n LedgerRecordChildSettledCall,\n LedgerRecordChildSettledResult,\n LedgerRequestAbortCall,\n LedgerRequestAbortResult,\n LedgerResolveAdmissionCall,\n LedgerResolveAdmissionResult,\n PortFailed,\n PortProtocolError,\n PortSucceeded,\n StoreAppendCall,\n StoreAppendResult,\n StoreCountPeerMessagesCall,\n StoreCountPeerMessagesResult,\n StoreExportCall,\n StoreExportResult,\n StoreInspectTailCall,\n StoreInspectTailResult,\n StoreMaterializeCall,\n StoreMaterializeResult,\n StoreReadPageCall,\n StoreReadPageResult,\n type PortFailure,\n type PortRequest,\n type PortRequestEnvelope,\n type PortResponse,\n type PortResult,\n} from \"./PortProtocol.ts\";\n\ntype ThreadId = ThreadMaterialization[\"threadId\"];\ntype SubmissionId = SubmissionSnapshot[\"submissionId\"];\n\nconst ThreadIdSchema = ThreadMaterialization.fields.threadId;\nconst decodeThreadId = Schema.decodeUnknownEffect(ThreadIdSchema);\n\n/**\n * The ledger row bound routable Submission identities must respect (mirrors the local\n * facet's `MAX_IDENTIFIER_LENGTH`; the minting side already refuses longer identities typed\n * at admission, so a longer identity presented here cannot name any stored row).\n */\nconst MAX_ROUTABLE_SUBMISSION_ID_LENGTH = 1_024;\n\n/** The `{uuidv7}` head of a DC-minted routable Submission identity. */\nconst UUID_HEAD_PATTERN =\n /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\n\n/**\n * A transport could not deliver a port request to (or an answer from) the owning\n * Thread's Durable Object. `retryable` carries the platform's own stub signal when one\n * exists. This error never crosses the wire — it is the CALLER-side evidence that the\n * authority was unreachable, which is exactly the case `AdmissionIndeterminate` was\n * specified for (SUB-031).\n */\nexport class PortTransportError extends Schema.TaggedError<PortTransportError>()(\n \"PortTransportError\",\n {\n target: Schema.String,\n message: Schema.String,\n retryable: Schema.optionalKey(Schema.Boolean),\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\nconst safeTransportDiagnostic = (cause: unknown): string => {\n try {\n const message = cause instanceof Error ? cause.message : cause;\n\n return boundPortDiagnostic(typeof message === \"string\" ? message : String(message));\n } catch {\n return \"[unavailable transport diagnostic]\";\n }\n};\n\nconst transportRetryableSignal = (cause: unknown): boolean | undefined => {\n if (!Predicate.isObjectKeyword(cause)) return undefined;\n try {\n const signal = Reflect.get(cause, \"retryable\");\n\n return typeof signal === \"boolean\" ? signal : undefined;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Build a `PortTransportError` from an arbitrary thrown transport cause, preserving the\n * platform stub's own `retryable` signal when present.\n */\nexport const portTransportFailure = (target: string, cause: unknown): PortTransportError => {\n const retryable = transportRetryableSignal(cause);\n\n return PortTransportError.make({\n target,\n message: safeTransportDiagnostic(cause),\n ...(retryable === undefined ? {} : { retryable }),\n cause,\n });\n};\n\n/**\n * Delivery of Schema-encoded port envelopes to the Durable Object that owns a FOREIGN\n * Thread (plan §1.3, D-P6-3). The shipped implementation (platform-cloudflare, WP3)\n * calls the owner's `portCall` over native Durable Object JS RPC via\n * `namespace.idFromName(threadId)`; the protocol is transport-agnostic and any carrier\n * that moves the encoded envelopes verbatim satisfies this service. Implementations MUST\n * surface every delivery problem as `PortTransportError` and must never fabricate an answer.\n */\nexport class ThreadPortTransport extends Context.Service<\n ThreadPortTransport,\n {\n readonly call: (\n threadId: ThreadId,\n request: PortRequestEnvelope,\n ) => Effect.Effect<unknown, PortTransportError>;\n }\n>()(\"@effect-agent/storage-cloudflare/ThreadPortTransport\") {}\n\n/** Construction options shared by both routed port Layers. */\nexport interface RoutedPortOptions {\n /**\n * Decide whether this physical owner stores the addressed logical Thread. Local\n * requests use the same SQLite facets; foreign requests use the transport or fail\n * fast typed. The predicate determines placement, never caller authorization.\n */\n readonly ownsThread: (threadId: ThreadId) => boolean;\n}\n\n/** Where one port request must execute. */\ntype RouteTarget =\n | { readonly _tag: \"local\" }\n | { readonly _tag: \"foreign\"; readonly threadId: ThreadId };\n\nconst LOCAL: RouteTarget = { _tag: \"local\" };\n\n/**\n * Parse a DC-minted routable Submission identity — `{uuidv7}:{threadId}`, split at the\n * FIRST `:` because the Thread tail may itself contain colons (D-P6-5). This adapter\n * minted the format at admission and is the ONLY component that parses it; identities that do\n * not carry the minted shape (no separator, non-UUID head, empty tail) fall back to the local\n * facet, which is the only authority this Object can consult without inventing an owner.\n * Identities beyond the ledger's 1,024-character row bound fail typed: the minting side\n * refused them at admission, so they cannot name any stored row anywhere.\n */\nconst routableSubmissionTarget = (\n ownsThread: RoutedPortOptions[\"ownsThread\"],\n): ((operation: string, submissionId: string) => Effect.Effect<RouteTarget, LedgerError>) =>\n Effect.fn(\"DoPortRouting.routableSubmissionTarget\")(function* (\n operation: string,\n submissionId: string,\n ): Effect.fn.Return<RouteTarget, LedgerError> {\n if (submissionId.length > MAX_ROUTABLE_SUBMISSION_ID_LENGTH) {\n return yield* LedgerError.make({\n operation,\n message:\n `A Submission identity of ${submissionId.length} characters exceeds the ` +\n `${MAX_ROUTABLE_SUBMISSION_ID_LENGTH}-character routable identity bound; admission ` +\n \"refuses such identities, so it cannot name any stored row.\",\n });\n }\n const separator = submissionId.indexOf(\":\");\n\n if (separator === -1) return LOCAL;\n if (!UUID_HEAD_PATTERN.test(submissionId.slice(0, separator))) return LOCAL;\n const tail = submissionId.slice(separator + 1);\n\n return yield* decodeThreadId(tail).pipe(\n Effect.map((threadId): RouteTarget =>\n ownsThread(threadId) ? LOCAL : { _tag: \"foreign\", threadId },\n ),\n Effect.orElseSucceed(() => LOCAL),\n );\n });\n\nconst NoAdditionalPortFailure = Schema.Never;\nconst AbortPortFailure = Schema.Union([SettlementConflict, JoinedToHost]);\nconst AppendPortFailure = Schema.Union([ThreadNotMaterialized, AppendConflict, FenceRejected]);\n\n/**\n * The fail-fast refusal for any foreign operation OUTSIDE the closed route-capable subset\n * (plan §1.3): honesty over accidental distribution.\n */\nconst crossThreadLedgerError = (operation: string, target: string): LedgerError =>\n LedgerError.make({\n operation,\n message:\n `${operation} addressed to foreign Thread ${target} is not route-capable; the ` +\n \"closed cross-Object subset is admit, markReady, lookup, resolveAdmission, \" +\n \"requestAbort, and recordChildSettled. Every other ledger operation is lane-local by \" +\n \"construction and must execute inside the owning Thread's Durable Object.\",\n });\n\nconst crossThreadStoreError = (operation: string, target: string): ThreadStoreError =>\n ThreadStoreError.make({\n operation,\n message:\n `${operation} addressed to foreign Thread ${target} is not route-capable; the ` +\n \"closed cross-Object subset is materialize, append, read (paged), inspectTail, and \" +\n \"export. Observation and checkpoints are lane-local by construction and must execute \" +\n \"inside the owning Thread's Durable Object.\",\n });\n\nconst makeTransportCall = (transport: ThreadPortTransport[\"Service\"]) =>\n Effect.fn(\"DoPortRouting.transportCall\")(function* (target: ThreadId, call: PortRequest) {\n const encoded = yield* encodePortRequest(call).pipe(\n Effect.mapError((error) =>\n PortProtocolError.make({\n message: boundPortDiagnostic(`The port request could not be encoded: ${error.message}`),\n }),\n ),\n );\n\n const raw = yield* transport.call(target, encoded);\n\n return yield* decodePortResponse(raw).pipe(\n Effect.mapError((error) =>\n PortProtocolError.make({\n message: boundPortDiagnostic(`The port response could not be decoded: ${error.message}`),\n }),\n ),\n );\n });\n\ntype TransportCall = ReturnType<typeof makeTransportCall>;\n\nconst makeRoutedLedgerServices = Effect.fn(\"DoPortRouting.makeRoutedLedgerServices\")(function* (\n options: RoutedPortOptions,\n) {\n const local = yield* SubmissionLedger;\n const transport = yield* ThreadPortTransport;\n const transportCall: TransportCall = makeTransportCall(transport);\n const submissionTarget = routableSubmissionTarget(options.ownsThread);\n\n const routeFailure =\n (operation: string, target: string) =>\n (error: PortTransportError | PortProtocolError): LedgerError =>\n LedgerError.make({\n operation,\n message: boundPortDiagnostic(\n `Routed ${operation} to the Thread Object owning ${target} failed: ${error.message}`,\n ),\n cause: error,\n });\n\n /**\n * One routed ledger call: encode, deliver, decode, then narrow the uniform envelope to the\n * operation's own result and failure surface. A foreign `LedgerError` is always in-channel;\n * any failure outside the operation's declared surface — including protocol anomalies — is\n * folded into a `LedgerError` naming the anomaly instead of being erased or re-thrown raw.\n */\n const foreignLedgerCall = <ResultSchema extends Schema.Top, FailureSchema extends Schema.Top>(\n operation: string,\n target: ThreadId,\n call: PortRequest,\n resultSchema: ResultSchema,\n failureSchema: FailureSchema,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | LedgerError> => {\n const isExpectedResult = Schema.is(resultSchema);\n const isExpectedFailure = Schema.is(failureSchema);\n\n return transportCall(target, call).pipe(\n Effect.mapError(routeFailure(operation, target)),\n Effect.flatMap(\n (response): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | LedgerError> => {\n if (response._tag === \"PortFailed\") {\n const failure = response.failure;\n\n if (isExpectedFailure(failure)) return Effect.fail(failure);\n if (failure._tag === \"LedgerError\") return Effect.fail(failure);\n\n return Effect.fail(\n LedgerError.make({\n operation,\n message: boundPortDiagnostic(\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `out-of-contract failure ${failure._tag}`,\n ),\n cause: failure,\n }),\n );\n }\n const result = response.result;\n\n if (!isExpectedResult(result)) {\n return Effect.fail(\n LedgerError.make({\n operation,\n message:\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `mismatched result ${result._tag}.`,\n }),\n );\n }\n\n return Effect.succeed(result);\n },\n ),\n Effect.withSpan(\"DoPortRouting.foreignLedgerCall\", {\n attributes: { operation, target },\n }),\n );\n };\n\n /**\n * Routed `resolveAdmission` — where the S2 tri-state becomes real (plan §1.3): when the\n * owning Object cannot be reached, or its answer cannot be understood, the routed adapter\n * answers `AdmissionIndeterminate{reason}` and NEVER `NotAdmitted` — an unreachable\n * authority proves nothing, and only `NotAdmitted` permits an admission attempt (SUB-031).\n * A typed `LedgerError` answered BY the authority still fails typed: the authority was\n * reached and reported its own storage failure.\n */\n const resolveForeignAdmission = (\n target: ThreadId,\n request: SubmissionLookupByKey,\n ): Effect.Effect<\n | AdmissionIndeterminate\n | Extract<PortResult, { readonly _tag: \"LedgerResolveAdmissionResult\" }>[\"resolution\"],\n LedgerError\n > =>\n transportCall(target, LedgerResolveAdmissionCall.make({ request })).pipe(\n Effect.flatMap((response) => {\n if (response._tag === \"PortFailed\") {\n if (response.failure._tag === \"LedgerError\") return Effect.fail(response.failure);\n\n return Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The Thread Object owning ${target} answered resolveAdmission with the ` +\n `out-of-contract failure ${response.failure._tag}: ${response.failure.message}`,\n ),\n }),\n );\n }\n if (response.result._tag !== \"LedgerResolveAdmissionResult\") {\n return Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The Thread Object owning ${target} answered resolveAdmission with the ` +\n `mismatched result ${response.result._tag}.`,\n ),\n }),\n );\n }\n\n return Effect.succeed(response.result.resolution);\n }),\n Effect.catchTags({\n PortTransportError: (error) =>\n Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The Thread Object owning ${target} is unreachable: ${error.message}`,\n ),\n }),\n ),\n PortProtocolError: (error) =>\n Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The answer of the Thread Object owning ${target} could not be ` +\n `understood: ${error.message}`,\n ),\n }),\n ),\n }),\n Effect.withSpan(\"DoPortRouting.resolveForeignAdmission\", { attributes: { target } }),\n );\n\n const foreignLookupById = (\n operation: string,\n target: ThreadId,\n submissionId: SubmissionId,\n ): Effect.Effect<Option.Option<SubmissionSnapshot>, LedgerError> =>\n foreignLedgerCall(\n operation,\n target,\n LedgerLookupCall.make({ request: SubmissionLookupById.make({ submissionId }) }),\n LedgerLookupResult,\n NoAdditionalPortFailure,\n ).pipe(\n Effect.map((result) =>\n result.submission === undefined ? Option.none() : Option.some(result.submission),\n ),\n );\n\n /**\n * Enrich a LOCAL parent's recovery snapshot with the lane state of attached children whose\n * rows live in other Durable Objects (plan §1.3): markers first (the local facet already\n * consulted them), then a routed per-child `lookup` for any attached child that is neither\n * local nor marker-settled. A transport failure surfaces as `LedgerError` so the alarm\n * pass retries; the child's canonical Settlement remains the only authority (DUR-015).\n */\n const enrichChildAttachments = Effect.fn(\"DoPortRouting.enrichChildAttachments\")(function* (\n snapshot: RecoverySnapshot,\n ): Effect.fn.Return<RecoverySnapshot, LedgerError> {\n const operation = \"ledger load recovery snapshot\";\n\n const attachments = new Map(\n snapshot.childAttachments.map((attachment) => [attachment.childSubmissionId, attachment]),\n );\n\n let enriched = false;\n\n for (const reservation of snapshot.childReservations) {\n const childSubmissionId = reservation.childSubmissionId;\n\n if (childSubmissionId === undefined || attachments.has(childSubmissionId)) continue;\n const target = yield* submissionTarget(operation, childSubmissionId);\n\n // A local or opaque child identity was already answered authoritatively by the local\n // facet; absence there means the child admission never committed.\n if (target._tag !== \"foreign\") continue;\n const child = yield* foreignLookupById(operation, target.threadId, childSubmissionId);\n\n if (Option.isNone(child)) continue;\n attachments.set(\n childSubmissionId,\n ChildAttachmentSnapshot.make({\n toolCallId: reservation.parentToolCallId,\n childSubmissionId,\n childState: child.value.state,\n ...(child.value.settledOutcome === undefined\n ? {}\n : { childOutcome: child.value.settledOutcome }),\n }),\n );\n enriched = true;\n }\n if (!enriched) return snapshot;\n // Rebuild in reservation (parent Tool Call) order, the order the local facet documents.\n const ordered: Array<ChildAttachmentSnapshot> = [];\n\n for (const reservation of snapshot.childReservations) {\n if (reservation.childSubmissionId === undefined) continue;\n const attachment = attachments.get(reservation.childSubmissionId);\n\n if (attachment !== undefined) ordered.push(attachment);\n }\n\n return RecoverySnapshot.make({ ...snapshot, childAttachments: ordered });\n });\n\n const routed = SubmissionLedger.of({\n capabilities: local.capabilities,\n\n admit: (request) =>\n options.ownsThread(request.threadId)\n ? local.admit(request)\n : foreignLedgerCall(\n \"ledger admit\",\n request.threadId,\n LedgerAdmitCall.make({ request }),\n LedgerAdmitResult,\n Schema.Union([AdmissionConflict, AdmissionPolicyError]),\n ).pipe(Effect.map((reply) => reply.result)),\n\n markReady: (request) =>\n submissionTarget(\"ledger mark ready\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markReady(request)\n : foreignLedgerCall(\n \"ledger mark ready\",\n target.threadId,\n LedgerMarkReadyCall.make({ request }),\n LedgerMarkReadyResult,\n NoAdditionalPortFailure,\n ).pipe(Effect.asVoid),\n ),\n ),\n\n lookup: (request) =>\n request._tag === \"SubmissionLookupById\"\n ? submissionTarget(\"ledger lookup\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.lookup(request)\n : foreignLookupById(\"ledger lookup\", target.threadId, request.submissionId),\n ),\n )\n : options.ownsThread(request.threadId)\n ? local.lookup(request)\n : foreignLedgerCall(\n \"ledger lookup\",\n request.threadId,\n LedgerLookupCall.make({ request }),\n LedgerLookupResult,\n NoAdditionalPortFailure,\n ).pipe(\n Effect.map((result) =>\n result.submission === undefined ? Option.none() : Option.some(result.submission),\n ),\n ),\n\n resolveAdmission: (request) =>\n options.ownsThread(request.threadId)\n ? local.resolveAdmission(request)\n : resolveForeignAdmission(request.threadId, request),\n\n requestAbort: (request) =>\n submissionTarget(\"ledger request abort\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.requestAbort(request)\n : foreignLedgerCall(\n \"ledger request abort\",\n target.threadId,\n LedgerRequestAbortCall.make({ request }),\n LedgerRequestAbortResult,\n AbortPortFailure,\n ).pipe(Effect.map((reply) => reply.intent)),\n ),\n ),\n\n recordChildSettled: (request) =>\n submissionTarget(\"ledger record child settled\", request.parentSubmissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.recordChildSettled(request)\n : foreignLedgerCall(\n \"ledger record child settled\",\n target.threadId,\n LedgerRecordChildSettledCall.make({ request }),\n LedgerRecordChildSettledResult,\n NoAdditionalPortFailure,\n ).pipe(Effect.map((reply) => reply.outcome)),\n ),\n ),\n\n // Every operation below is lane-local by construction (plan §1.3): a foreign address is\n // an out-of-contract call and fails fast typed instead of being quietly distributed.\n claim: (request) =>\n options.ownsThread(request.threadId)\n ? local.claim(request)\n : Effect.fail(crossThreadLedgerError(\"ledger claim\", request.threadId)),\n\n claimJoining: (request) =>\n options.ownsThread(request.threadId)\n ? local.claimJoining(request)\n : Effect.fail(crossThreadLedgerError(\"ledger claim joining\", request.threadId)),\n\n renewOwnership: (request) =>\n submissionTarget(\"ledger renew ownership\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.renewOwnership(request)\n : Effect.fail(crossThreadLedgerError(\"ledger renew ownership\", target.threadId)),\n ),\n ),\n\n releaseOwnership: (request) =>\n submissionTarget(\"ledger release ownership\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.releaseOwnership(request)\n : Effect.fail(crossThreadLedgerError(\"ledger release ownership\", target.threadId)),\n ),\n ),\n\n markInputApplied: (request) =>\n submissionTarget(\"ledger mark input applied\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markInputApplied(request)\n : Effect.fail(crossThreadLedgerError(\"ledger mark input applied\", target.threadId)),\n ),\n ),\n\n reserveSettlement: (request) =>\n submissionTarget(\"ledger reserve settlement\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.reserveSettlement(request)\n : Effect.fail(crossThreadLedgerError(\"ledger reserve settlement\", target.threadId)),\n ),\n ),\n\n finalizeSettlement: (request) =>\n submissionTarget(\"ledger finalize settlement\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.finalizeSettlement(request)\n : Effect.fail(crossThreadLedgerError(\"ledger finalize settlement\", target.threadId)),\n ),\n ),\n\n markJoined: (request) =>\n submissionTarget(\"ledger mark joined\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markJoined(request)\n : Effect.fail(crossThreadLedgerError(\"ledger mark joined\", target.threadId)),\n ),\n ),\n\n revertJoining: (request) =>\n submissionTarget(\"ledger revert joining\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.revertJoining(request)\n : Effect.fail(crossThreadLedgerError(\"ledger revert joining\", target.threadId)),\n ),\n ),\n\n suspend: (request) =>\n submissionTarget(\"ledger suspend\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.suspend(request)\n : Effect.fail(crossThreadLedgerError(\"ledger suspend\", target.threadId)),\n ),\n ),\n\n recordApprovalDecision: (command) =>\n submissionTarget(\"ledger record approval decision\", command.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.recordApprovalDecision(command)\n : Effect.fail(\n crossThreadLedgerError(\"ledger record approval decision\", target.threadId),\n ),\n ),\n ),\n\n markUnknown: (request) =>\n submissionTarget(\"ledger mark unknown\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markUnknown(request)\n : Effect.fail(crossThreadLedgerError(\"ledger mark unknown\", target.threadId)),\n ),\n ),\n\n recordUnknownResolution: (command) =>\n submissionTarget(\"ledger record unknown resolution\", command.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.recordUnknownResolution(command)\n : Effect.fail(\n crossThreadLedgerError(\"ledger record unknown resolution\", target.threadId),\n ),\n ),\n ),\n\n reserveChildBudget: (request) =>\n submissionTarget(\"ledger reserve child budget\", request.parentSubmissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.reserveChildBudget(request)\n : Effect.fail(crossThreadLedgerError(\"ledger reserve child budget\", target.threadId)),\n ),\n ),\n\n // Reservation identities carry no Thread address; the reservation row lives in the\n // parent's own Object and these transitions are parent-lane-local by construction, so\n // they always execute on the local facet (which fails typed for an unknown row).\n attachChildToReservation: local.attachChildToReservation,\n beginChildBudgetRelease: local.beginChildBudgetRelease,\n releaseChildBudget: local.releaseChildBudget,\n\n // The local scan IS the whole worklist: one Thread per Object (durability §5).\n scanNonterminal: local.scanNonterminal,\n\n readAbortIntent: (request) =>\n submissionTarget(\"ledger read abort intent\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.readAbortIntent(request)\n : Effect.fail(crossThreadLedgerError(\"ledger read abort intent\", target.threadId)),\n ),\n ),\n\n loadRecoverySnapshot: (request) =>\n submissionTarget(\"ledger load recovery snapshot\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.loadRecoverySnapshot(request).pipe(Effect.flatMap(enrichChildAttachments))\n : Effect.fail(crossThreadLedgerError(\"ledger load recovery snapshot\", target.threadId)),\n ),\n ),\n });\n\n return Context.make(SubmissionLedger, routed);\n});\n\nconst makeRoutedStoreServices = Effect.fn(\"DoPortRouting.makeRoutedStoreServices\")(function* (\n options: RoutedPortOptions,\n) {\n const local = yield* ThreadStore;\n const checkpoints = local.checkpoints;\n const recoveryCheckpoints = local.recoveryCheckpoints;\n const transport = yield* ThreadPortTransport;\n const transportCall: TransportCall = makeTransportCall(transport);\n\n const routeFailure =\n (operation: string, target: string) =>\n (error: PortTransportError | PortProtocolError): ThreadStoreError =>\n ThreadStoreError.make({\n operation,\n message: boundPortDiagnostic(\n `Routed ${operation} to the Thread Object owning ${target} failed: ${error.message}`,\n ),\n cause: error,\n });\n\n /** The store twin of `foreignLedgerCall` with `ThreadStoreError` as the base error. */\n const foreignStoreCall = <ResultSchema extends Schema.Top, FailureSchema extends Schema.Top>(\n operation: string,\n target: ThreadId,\n call: PortRequest,\n resultSchema: ResultSchema,\n failureSchema: FailureSchema,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | ThreadStoreError> => {\n const isExpectedResult = Schema.is(resultSchema);\n const isExpectedFailure = Schema.is(failureSchema);\n\n return transportCall(target, call).pipe(\n Effect.mapError(routeFailure(operation, target)),\n Effect.flatMap(\n (\n response,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | ThreadStoreError> => {\n if (response._tag === \"PortFailed\") {\n const failure = response.failure;\n\n if (isExpectedFailure(failure)) return Effect.fail(failure);\n if (failure._tag === \"ThreadStoreError\") return Effect.fail(failure);\n\n return Effect.fail(\n ThreadStoreError.make({\n operation,\n message: boundPortDiagnostic(\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `out-of-contract failure ${failure._tag}`,\n ),\n cause: failure,\n }),\n );\n }\n const result = response.result;\n\n if (!isExpectedResult(result)) {\n return Effect.fail(\n ThreadStoreError.make({\n operation,\n message:\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `mismatched result ${result._tag}.`,\n }),\n );\n }\n\n return Effect.succeed(result);\n },\n ),\n Effect.withSpan(\"DoPortRouting.foreignStoreCall\", {\n attributes: { operation, target },\n }),\n );\n };\n\n const routed = ThreadStore.of({\n countPeerMessages: (request) =>\n options.ownsThread(request.threadId)\n ? local.countPeerMessages === undefined\n ? Effect.fail(crossThreadStoreError(\"peer count unavailable\", request.threadId))\n : local.countPeerMessages(request)\n : foreignStoreCall(\n \"thread countPeerMessages\",\n request.threadId,\n StoreCountPeerMessagesCall.make({ request }),\n StoreCountPeerMessagesResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => reply.count)),\n\n materialize: (request) =>\n options.ownsThread(request.threadId)\n ? local.materialize(request)\n : foreignStoreCall(\n \"thread materialize\",\n request.threadId,\n StoreMaterializeCall.make({ request }),\n StoreMaterializeResult,\n FenceRejected,\n ).pipe(Effect.asVoid),\n\n append: (request) =>\n options.ownsThread(request.threadId)\n ? local.append(request)\n : foreignStoreCall(\n \"thread append\",\n request.threadId,\n StoreAppendCall.make({ request }),\n StoreAppendResult,\n AppendPortFailure,\n ).pipe(Effect.map((reply) => reply.result)),\n\n read: (request) =>\n options.ownsThread(request.threadId)\n ? local.read(request)\n : Stream.unwrap(\n foreignStoreCall(\n \"thread read\",\n request.threadId,\n StoreReadPageCall.make({ request }),\n StoreReadPageResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => Stream.fromIterable(reply.records))),\n ),\n\n inspectTail: (request) =>\n options.ownsThread(request.threadId)\n ? local.inspectTail(request)\n : foreignStoreCall(\n \"thread inspect tail\",\n request.threadId,\n StoreInspectTailCall.make({ request }),\n StoreInspectTailResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => reply.tail)),\n\n export: (request) =>\n options.ownsThread(request.threadId)\n ? local.export(request)\n : foreignStoreCall(\n \"thread export\",\n request.threadId,\n StoreExportCall.make({ request }),\n StoreExportResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => reply.export)),\n\n // Observation and checkpoints are lane-local: the closed route-capable store subset\n // is materialize/append/read/inspectTail/export. Recovery cache misses can fall back\n // to those canonical reads, including when the cache belongs to a foreign Object.\n observe: (request) =>\n options.ownsThread(request.threadId)\n ? local.observe(request)\n : Stream.unwrap(Effect.fail(crossThreadStoreError(\"thread observe\", request.threadId))),\n\n ...(recoveryCheckpoints === undefined\n ? {}\n : {\n recoveryCheckpoints: {\n save: (request) =>\n options.ownsThread(request.checkpoint.threadId)\n ? recoveryCheckpoints.save(request)\n : Effect.fail(\n crossThreadStoreError(\n \"thread save recovery checkpoint\",\n request.checkpoint.threadId,\n ),\n ),\n load: (request) =>\n options.ownsThread(request.threadId)\n ? recoveryCheckpoints.load(request)\n : Effect.succeed(Option.none()),\n },\n }),\n ...(checkpoints === undefined\n ? {}\n : {\n checkpoints: {\n save: (request) =>\n options.ownsThread(request.checkpoint.threadId)\n ? checkpoints.save(request)\n : Effect.fail(\n crossThreadStoreError(\"thread save checkpoint\", request.checkpoint.threadId),\n ),\n load: (request) =>\n options.ownsThread(request.threadId)\n ? checkpoints.load(request)\n : Effect.fail(crossThreadStoreError(\"thread load checkpoint\", request.threadId)),\n },\n }),\n });\n\n return Context.make(ThreadStore, routed);\n});\n\n/**\n * Routing decorator over the LOCAL `SubmissionLedger` facet (plan §1.3): a request addressing\n * this Object's Thread executes locally; a route-capable request addressing another\n * Thread is Schema-encoded onto the `ThreadPortTransport` and executed by the\n * owning Object's local facet; any other foreign request fails fast typed. Provide the WP1\n * local facet (`submissionLedgerLayer`/`ledgerLayer`) and a transport to close it.\n */\nexport const routedSubmissionLedgerLayer = (\n options: RoutedPortOptions,\n): Layer.Layer<SubmissionLedger, never, SubmissionLedger | ThreadPortTransport> =>\n Layer.effectContext(makeRoutedLedgerServices(options));\n\n/**\n * Routing decorator over the LOCAL `ThreadStore` facet (plan §1.3): this-thread\n * requests execute locally; foreign materialize/append/read/inspectTail/export travel the\n * transport. Foreign recovery-cache loads return none for canonical replay; other foreign\n * checkpoint operations and observation fail fast typed.\n */\nexport const routedThreadStoreLayer = (\n options: RoutedPortOptions,\n): Layer.Layer<ThreadStore, never, ThreadStore | ThreadPortTransport> =>\n Layer.effectContext(makeRoutedStoreServices(options));\n\n/** Route the existing owner-scoped list; delivery mutations remain source local. */\nexport const routedMessageDeliveryStoreLayer = (options: RoutedPortOptions) =>\n Layer.effect(\n MessageDeliveryStore,\n Effect.gen(function* () {\n const local = yield* MessageDeliveryStore;\n const call = makeTransportCall(yield* ThreadPortTransport);\n\n return MessageDeliveryStore.of({\n ...local,\n list: (request) =>\n options.ownsThread(request.ownerThreadId)\n ? local.list(request)\n : call(request.ownerThreadId, MessageDeliveryListCall.make({ request })).pipe(\n Effect.mapError(() =>\n MessageDeliveryError.make({\n reason: \"storage\",\n operation: \"route delivery list\",\n }),\n ),\n Effect.flatMap((response) => {\n if (\n response._tag === \"PortSucceeded\" &&\n response.result._tag === \"MessageDeliveryListResult\"\n )\n return Effect.succeed(response.result.page);\n\n return Effect.fail(\n response._tag === \"PortFailed\" &&\n response.failure._tag === \"MessageDeliveryError\"\n ? response.failure\n : MessageDeliveryError.make({\n reason: \"storage\",\n operation: \"route delivery list\",\n }),\n );\n }),\n ),\n });\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Owner-side execution\n// ---------------------------------------------------------------------------\n\n/** Fold one port operation's typed failures into the uniform response envelope. */\nconst capture = <Failure extends PortFailure>(\n effect: Effect.Effect<PortResult, Failure>,\n): Effect.Effect<PortResponse> =>\n effect.pipe(\n Effect.map((result): PortResponse => PortSucceeded.make({ result })),\n Effect.catch((failure) => Effect.succeed<PortResponse>(PortFailed.make({ failure }))),\n );\n\n/**\n * Execute one decoded port request against THIS Object's LOCAL facets — the owner-side half\n * of the routed ports (plan §1.3). Callers must provide the WP1 local facets, never the\n * routed decorators: the routing layer already established that this Object owns the\n * addressed Thread, and re-routing here could bounce a request between Objects.\n * Failures never escape — every typed port failure becomes a `PortFailed` envelope that\n * re-decodes on the caller side.\n */\nexport const executePortRequest = Effect.fn(\"DoPortRouting.executePortRequest\")(function* (\n request: PortRequest,\n): Effect.fn.Return<PortResponse, never, SubmissionLedger | ThreadStore | MessageDeliveryStore> {\n switch (request._tag) {\n case \"MessageDeliveryList\": {\n const store = yield* MessageDeliveryStore;\n\n return yield* capture(\n store\n .list(request.request)\n .pipe(Effect.map((page) => MessageDeliveryListResult.make({ page }))),\n );\n }\n case \"StoreCountPeerMessages\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store.countPeerMessages === undefined\n ? Effect.fail(crossThreadStoreError(\"native read unavailable\", request.request.threadId))\n : store\n .countPeerMessages(request.request)\n .pipe(Effect.map((count) => StoreCountPeerMessagesResult.make({ count }))),\n );\n }\n case \"LedgerAdmit\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .admit(request.request)\n .pipe(Effect.map((result) => LedgerAdmitResult.make({ result }))),\n );\n }\n case \"LedgerMarkReady\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger.markReady(request.request).pipe(Effect.map(() => LedgerMarkReadyResult.make({}))),\n );\n }\n case \"LedgerLookup\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .lookup(request.request)\n .pipe(\n Effect.map((submission) =>\n Option.isSome(submission)\n ? LedgerLookupResult.make({ submission: submission.value })\n : LedgerLookupResult.make({}),\n ),\n ),\n );\n }\n case \"LedgerResolveAdmission\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .resolveAdmission(request.request)\n .pipe(Effect.map((resolution) => LedgerResolveAdmissionResult.make({ resolution }))),\n );\n }\n case \"LedgerRequestAbort\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .requestAbort(request.request)\n .pipe(Effect.map((intent) => LedgerRequestAbortResult.make({ intent }))),\n );\n }\n case \"LedgerRecordChildSettled\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .recordChildSettled(request.request)\n .pipe(Effect.map((outcome) => LedgerRecordChildSettledResult.make({ outcome }))),\n );\n }\n case \"StoreMaterialize\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store.materialize(request.request).pipe(Effect.map(() => StoreMaterializeResult.make({}))),\n );\n }\n case \"StoreAppend\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store\n .append(request.request)\n .pipe(Effect.map((result) => StoreAppendResult.make({ result }))),\n );\n }\n case \"StoreReadPage\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store.read(request.request).pipe(\n Stream.runCollect,\n Effect.map((records) => StoreReadPageResult.make({ records: [...records] })),\n ),\n );\n }\n case \"StoreInspectTail\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store\n .inspectTail(request.request)\n .pipe(Effect.map((tail) => StoreInspectTailResult.make({ tail }))),\n );\n }\n case \"StoreExport\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store\n .export(request.request)\n .pipe(Effect.map((threadExport) => StoreExportResult.make({ export: threadExport }))),\n );\n }\n }\n});\n\n/**\n * The last-resort wire fallback when even encoding a response fails: the literal encoded\n * form of `PortFailed(PortProtocolError)` — tagged classes of bounded strings encode to\n * exactly this shape, so no Schema round trip is needed to produce it.\n */\nconst encodedProtocolFailure = (message: string): unknown => ({\n _tag: \"PortFailed\",\n failure: { _tag: \"PortProtocolError\", message: boundPortDiagnostic(message) },\n});\n\n/**\n * The complete owner-side endpoint body for `portCall` (D-P6-3): decode the wire request,\n * execute it against this Object's LOCAL facets, and answer with the encoded response\n * envelope. Total by construction — a request that cannot be decoded, or a response that\n * cannot be encoded, answers `PortFailed(PortProtocolError)` instead of throwing, so the\n * transport never has to interpret exceptions as protocol answers.\n */\nexport const handleEncodedPortRequest = Effect.fn(\"DoPortRouting.handleEncodedPortRequest\")(\n function* (\n encoded: unknown,\n ): Effect.fn.Return<unknown, never, SubmissionLedger | ThreadStore | MessageDeliveryStore> {\n const response = yield* decodePortRequest(encoded).pipe(\n Effect.flatMap(executePortRequest),\n Effect.catch((error) =>\n Effect.succeed<PortResponse>(\n PortFailed.make({\n failure: PortProtocolError.make({\n message: boundPortDiagnostic(\n `The port request could not be decoded: ${error.message}`,\n ),\n }),\n }),\n ),\n ),\n );\n\n return yield* encodePortResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed(\n encodedProtocolFailure(`The port response could not be encoded: ${error.message}`),\n ),\n ),\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"PortRouting.mjs","names":[],"sources":["../src/PortRouting.ts"],"sourcesContent":["import { Context, Effect, Layer, Option, Predicate, Schema, Stream } from \"effect\";\nimport { MessageDeliveryStore, MessageDeliveryError } from \"effect-agent/message-delivery\";\nimport {\n AdmissionIndeterminate,\n AdmissionConflict,\n AdmissionPolicyError,\n ChildAttachmentSnapshot,\n JoinedToHost,\n LedgerError,\n RecoverySnapshot,\n SettlementConflict,\n SubmissionLedger,\n SubmissionLookupById,\n type SubmissionLookupByKey,\n type SubmissionSnapshot,\n} from \"effect-agent/submission-ledger\";\nimport {\n AppendConflict,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadStore,\n ThreadStoreError,\n FenceRejected,\n} from \"effect-agent/thread-store\";\n\nimport {\n MessageDeliveryListCall,\n MessageDeliveryListResult,\n boundPortDiagnostic,\n decodePortRequest,\n decodePortResponse,\n encodePortRequest,\n encodePortResponse,\n LedgerAdmitCall,\n LedgerAdmitResult,\n LedgerLookupCall,\n LedgerLookupResult,\n LedgerMarkReadyCall,\n LedgerMarkReadyResult,\n LedgerRecordChildSettledCall,\n LedgerRecordChildSettledResult,\n LedgerRequestAbortCall,\n LedgerStopWorkerCall,\n LedgerInspectWorkerCall,\n LedgerInspectWorkerResult,\n LedgerStopWorkerResult,\n LedgerRequestAbortResult,\n LedgerResolveAdmissionCall,\n LedgerResolveAdmissionResult,\n PortFailed,\n PortProtocolError,\n PortSucceeded,\n StoreAppendCall,\n StoreAppendResult,\n StoreCountPeerMessagesCall,\n StoreCountPeerMessagesResult,\n StoreExportCall,\n StoreExportResult,\n StoreInspectTailCall,\n StoreInspectTailResult,\n StoreMaterializeCall,\n StoreMaterializeResult,\n StoreReadPageCall,\n StoreReadPageResult,\n type PortFailure,\n type PortRequest,\n type PortRequestEnvelope,\n type PortResponse,\n type PortResult,\n} from \"./PortProtocol.ts\";\n\ntype ThreadId = ThreadMaterialization[\"threadId\"];\ntype SubmissionId = SubmissionSnapshot[\"submissionId\"];\n\nconst ThreadIdSchema = ThreadMaterialization.fields.threadId;\nconst decodeThreadId = Schema.decodeUnknownEffect(ThreadIdSchema);\n\n/**\n * The ledger row bound routable Submission identities must respect (mirrors the local\n * facet's `MAX_IDENTIFIER_LENGTH`; the minting side already refuses longer identities typed\n * at admission, so a longer identity presented here cannot name any stored row).\n */\nconst MAX_ROUTABLE_SUBMISSION_ID_LENGTH = 1_024;\n\n/** The `{uuidv7}` head of a DC-minted routable Submission identity. */\nconst UUID_HEAD_PATTERN =\n /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\n\n/**\n * A transport could not deliver a port request to (or an answer from) the owning\n * Thread's Durable Object. `retryable` carries the platform's own stub signal when one\n * exists. This error never crosses the wire — it is the CALLER-side evidence that the\n * authority was unreachable, which is exactly the case `AdmissionIndeterminate` was\n * specified for (SUB-031).\n */\nexport class PortTransportError extends Schema.TaggedError<PortTransportError>()(\n \"PortTransportError\",\n {\n target: Schema.String,\n message: Schema.String,\n retryable: Schema.optionalKey(Schema.Boolean),\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\nconst safeTransportDiagnostic = (cause: unknown): string => {\n try {\n const message = cause instanceof Error ? cause.message : cause;\n\n return boundPortDiagnostic(typeof message === \"string\" ? message : String(message));\n } catch {\n return \"[unavailable transport diagnostic]\";\n }\n};\n\nconst transportRetryableSignal = (cause: unknown): boolean | undefined => {\n if (!Predicate.isObjectKeyword(cause)) return undefined;\n try {\n const signal = Reflect.get(cause, \"retryable\");\n\n return typeof signal === \"boolean\" ? signal : undefined;\n } catch {\n return undefined;\n }\n};\n\n/**\n * Build a `PortTransportError` from an arbitrary thrown transport cause, preserving the\n * platform stub's own `retryable` signal when present.\n */\nexport const portTransportFailure = (target: string, cause: unknown): PortTransportError => {\n const retryable = transportRetryableSignal(cause);\n\n return PortTransportError.make({\n target,\n message: safeTransportDiagnostic(cause),\n ...(retryable === undefined ? {} : { retryable }),\n cause,\n });\n};\n\n/**\n * Delivery of Schema-encoded port envelopes to the Durable Object that owns a FOREIGN\n * Thread (plan §1.3, D-P6-3). The shipped implementation (platform-cloudflare, WP3)\n * calls the owner's `portCall` over native Durable Object JS RPC via\n * `namespace.idFromName(threadId)`; the protocol is transport-agnostic and any carrier\n * that moves the encoded envelopes verbatim satisfies this service. Implementations MUST\n * surface every delivery problem as `PortTransportError` and must never fabricate an answer.\n */\nexport class ThreadPortTransport extends Context.Service<\n ThreadPortTransport,\n {\n readonly call: (\n threadId: ThreadId,\n request: PortRequestEnvelope,\n ) => Effect.Effect<unknown, PortTransportError>;\n }\n>()(\"@effect-agent/storage-cloudflare/ThreadPortTransport\") {}\n\n/** Construction options shared by both routed port Layers. */\nexport interface RoutedPortOptions {\n /**\n * Decide whether this physical owner stores the addressed logical Thread. Local\n * requests use the same SQLite facets; foreign requests use the transport or fail\n * fast typed. The predicate determines placement, never caller authorization.\n */\n readonly ownsThread: (threadId: ThreadId) => boolean;\n}\n\n/** Where one port request must execute. */\ntype RouteTarget =\n | { readonly _tag: \"local\" }\n | { readonly _tag: \"foreign\"; readonly threadId: ThreadId };\n\nconst LOCAL: RouteTarget = { _tag: \"local\" };\n\n/**\n * Parse a DC-minted routable Submission identity — `{uuidv7}:{threadId}`, split at the\n * FIRST `:` because the Thread tail may itself contain colons (D-P6-5). This adapter\n * minted the format at admission and is the ONLY component that parses it; identities that do\n * not carry the minted shape (no separator, non-UUID head, empty tail) fall back to the local\n * facet, which is the only authority this Object can consult without inventing an owner.\n * Identities beyond the ledger's 1,024-character row bound fail typed: the minting side\n * refused them at admission, so they cannot name any stored row anywhere.\n */\nconst routableSubmissionTarget = (\n ownsThread: RoutedPortOptions[\"ownsThread\"],\n): ((operation: string, submissionId: string) => Effect.Effect<RouteTarget, LedgerError>) =>\n Effect.fn(\"DoPortRouting.routableSubmissionTarget\")(function* (\n operation: string,\n submissionId: string,\n ): Effect.fn.Return<RouteTarget, LedgerError> {\n if (submissionId.length > MAX_ROUTABLE_SUBMISSION_ID_LENGTH) {\n return yield* LedgerError.make({\n operation,\n message:\n `A Submission identity of ${submissionId.length} characters exceeds the ` +\n `${MAX_ROUTABLE_SUBMISSION_ID_LENGTH}-character routable identity bound; admission ` +\n \"refuses such identities, so it cannot name any stored row.\",\n });\n }\n const separator = submissionId.indexOf(\":\");\n\n if (separator === -1) return LOCAL;\n if (!UUID_HEAD_PATTERN.test(submissionId.slice(0, separator))) return LOCAL;\n const tail = submissionId.slice(separator + 1);\n\n return yield* decodeThreadId(tail).pipe(\n Effect.map((threadId): RouteTarget =>\n ownsThread(threadId) ? LOCAL : { _tag: \"foreign\", threadId },\n ),\n Effect.orElseSucceed(() => LOCAL),\n );\n });\n\nconst NoAdditionalPortFailure = Schema.Never;\nconst AbortPortFailure = Schema.Union([SettlementConflict, JoinedToHost]);\nconst AppendPortFailure = Schema.Union([ThreadNotMaterialized, AppendConflict, FenceRejected]);\n\n/**\n * The fail-fast refusal for any foreign operation OUTSIDE the closed route-capable subset\n * (plan §1.3): honesty over accidental distribution.\n */\nconst crossThreadLedgerError = (operation: string, target: string): LedgerError =>\n LedgerError.make({\n operation,\n message:\n `${operation} addressed to foreign Thread ${target} is not route-capable; the ` +\n \"closed cross-Object subset is admit, markReady, lookup, resolveAdmission, \" +\n \"requestAbort, and recordChildSettled. Every other ledger operation is lane-local by \" +\n \"construction and must execute inside the owning Thread's Durable Object.\",\n });\n\nconst crossThreadStoreError = (operation: string, target: string): ThreadStoreError =>\n ThreadStoreError.make({\n operation,\n message:\n `${operation} addressed to foreign Thread ${target} is not route-capable; the ` +\n \"closed cross-Object subset is materialize, append, read (paged), inspectTail, and \" +\n \"export. Observation and checkpoints are lane-local by construction and must execute \" +\n \"inside the owning Thread's Durable Object.\",\n });\n\nconst makeTransportCall = (transport: ThreadPortTransport[\"Service\"]) =>\n Effect.fn(\"DoPortRouting.transportCall\")(function* (target: ThreadId, call: PortRequest) {\n const encoded = yield* encodePortRequest(call).pipe(\n Effect.mapError((error) =>\n PortProtocolError.make({\n message: boundPortDiagnostic(`The port request could not be encoded: ${error.message}`),\n }),\n ),\n );\n\n const raw = yield* transport.call(target, encoded);\n\n return yield* decodePortResponse(raw).pipe(\n Effect.mapError((error) =>\n PortProtocolError.make({\n message: boundPortDiagnostic(`The port response could not be decoded: ${error.message}`),\n }),\n ),\n );\n });\n\ntype TransportCall = ReturnType<typeof makeTransportCall>;\n\nconst makeRoutedLedgerServices = Effect.fn(\"DoPortRouting.makeRoutedLedgerServices\")(function* (\n options: RoutedPortOptions,\n) {\n const local = yield* SubmissionLedger;\n const transport = yield* ThreadPortTransport;\n const transportCall: TransportCall = makeTransportCall(transport);\n const submissionTarget = routableSubmissionTarget(options.ownsThread);\n\n const routeFailure =\n (operation: string, target: string) =>\n (error: PortTransportError | PortProtocolError): LedgerError =>\n LedgerError.make({\n operation,\n message: boundPortDiagnostic(\n `Routed ${operation} to the Thread Object owning ${target} failed: ${error.message}`,\n ),\n cause: error,\n });\n\n /**\n * One routed ledger call: encode, deliver, decode, then narrow the uniform envelope to the\n * operation's own result and failure surface. A foreign `LedgerError` is always in-channel;\n * any failure outside the operation's declared surface — including protocol anomalies — is\n * folded into a `LedgerError` naming the anomaly instead of being erased or re-thrown raw.\n */\n const foreignLedgerCall = <ResultSchema extends Schema.Top, FailureSchema extends Schema.Top>(\n operation: string,\n target: ThreadId,\n call: PortRequest,\n resultSchema: ResultSchema,\n failureSchema: FailureSchema,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | LedgerError> => {\n const isExpectedResult = Schema.is(resultSchema);\n const isExpectedFailure = Schema.is(failureSchema);\n\n return transportCall(target, call).pipe(\n Effect.mapError(routeFailure(operation, target)),\n Effect.flatMap(\n (response): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | LedgerError> => {\n if (response._tag === \"PortFailed\") {\n const failure = response.failure;\n\n if (isExpectedFailure(failure)) return Effect.fail(failure);\n if (failure._tag === \"LedgerError\") return Effect.fail(failure);\n\n return Effect.fail(\n LedgerError.make({\n operation,\n message: boundPortDiagnostic(\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `out-of-contract failure ${failure._tag}`,\n ),\n cause: failure,\n }),\n );\n }\n const result = response.result;\n\n if (!isExpectedResult(result)) {\n return Effect.fail(\n LedgerError.make({\n operation,\n message:\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `mismatched result ${result._tag}.`,\n }),\n );\n }\n\n return Effect.succeed(result);\n },\n ),\n Effect.withSpan(\"DoPortRouting.foreignLedgerCall\", {\n attributes: { operation, target },\n }),\n );\n };\n\n /**\n * Routed `resolveAdmission` — where the S2 tri-state becomes real (plan §1.3): when the\n * owning Object cannot be reached, or its answer cannot be understood, the routed adapter\n * answers `AdmissionIndeterminate{reason}` and NEVER `NotAdmitted` — an unreachable\n * authority proves nothing, and only `NotAdmitted` permits an admission attempt (SUB-031).\n * A typed `LedgerError` answered BY the authority still fails typed: the authority was\n * reached and reported its own storage failure.\n */\n const resolveForeignAdmission = (\n target: ThreadId,\n request: SubmissionLookupByKey,\n ): Effect.Effect<\n | AdmissionIndeterminate\n | Extract<PortResult, { readonly _tag: \"LedgerResolveAdmissionResult\" }>[\"resolution\"],\n LedgerError\n > =>\n transportCall(target, LedgerResolveAdmissionCall.make({ request })).pipe(\n Effect.flatMap((response) => {\n if (response._tag === \"PortFailed\") {\n if (response.failure._tag === \"LedgerError\") return Effect.fail(response.failure);\n\n return Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The Thread Object owning ${target} answered resolveAdmission with the ` +\n `out-of-contract failure ${response.failure._tag}: ${response.failure.message}`,\n ),\n }),\n );\n }\n if (response.result._tag !== \"LedgerResolveAdmissionResult\") {\n return Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The Thread Object owning ${target} answered resolveAdmission with the ` +\n `mismatched result ${response.result._tag}.`,\n ),\n }),\n );\n }\n\n return Effect.succeed(response.result.resolution);\n }),\n Effect.catchTags({\n PortTransportError: (error) =>\n Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The Thread Object owning ${target} is unreachable: ${error.message}`,\n ),\n }),\n ),\n PortProtocolError: (error) =>\n Effect.succeed(\n AdmissionIndeterminate.make({\n reason: boundPortDiagnostic(\n `The answer of the Thread Object owning ${target} could not be ` +\n `understood: ${error.message}`,\n ),\n }),\n ),\n }),\n Effect.withSpan(\"DoPortRouting.resolveForeignAdmission\", { attributes: { target } }),\n );\n\n const foreignLookupById = (\n operation: string,\n target: ThreadId,\n submissionId: SubmissionId,\n ): Effect.Effect<Option.Option<SubmissionSnapshot>, LedgerError> =>\n foreignLedgerCall(\n operation,\n target,\n LedgerLookupCall.make({ request: SubmissionLookupById.make({ submissionId }) }),\n LedgerLookupResult,\n NoAdditionalPortFailure,\n ).pipe(\n Effect.map((result) =>\n result.submission === undefined ? Option.none() : Option.some(result.submission),\n ),\n );\n\n /**\n * Enrich a LOCAL parent's recovery snapshot with the lane state of attached children whose\n * rows live in other Durable Objects (plan §1.3): markers first (the local facet already\n * consulted them), then a routed per-child `lookup` for any attached child that is neither\n * local nor marker-settled. A transport failure surfaces as `LedgerError` so the alarm\n * pass retries; the child's canonical Settlement remains the only authority (DUR-015).\n */\n const enrichChildAttachments = Effect.fn(\"DoPortRouting.enrichChildAttachments\")(function* (\n snapshot: RecoverySnapshot,\n ): Effect.fn.Return<RecoverySnapshot, LedgerError> {\n const operation = \"ledger load recovery snapshot\";\n\n const attachments = new Map(\n snapshot.childAttachments.map((attachment) => [attachment.childSubmissionId, attachment]),\n );\n\n let enriched = false;\n\n for (const reservation of snapshot.childReservations) {\n const childSubmissionId = reservation.childSubmissionId;\n\n if (childSubmissionId === undefined || attachments.has(childSubmissionId)) continue;\n const target = yield* submissionTarget(operation, childSubmissionId);\n\n // A local or opaque child identity was already answered authoritatively by the local\n // facet; absence there means the child admission never committed.\n if (target._tag !== \"foreign\") continue;\n const child = yield* foreignLookupById(operation, target.threadId, childSubmissionId);\n\n if (Option.isNone(child)) continue;\n attachments.set(\n childSubmissionId,\n ChildAttachmentSnapshot.make({\n toolCallId: reservation.parentToolCallId,\n childSubmissionId,\n childState: child.value.state,\n ...(child.value.settledOutcome === undefined\n ? {}\n : { childOutcome: child.value.settledOutcome }),\n }),\n );\n enriched = true;\n }\n if (!enriched) return snapshot;\n // Rebuild in reservation (parent Tool Call) order, the order the local facet documents.\n const ordered: Array<ChildAttachmentSnapshot> = [];\n\n for (const reservation of snapshot.childReservations) {\n if (reservation.childSubmissionId === undefined) continue;\n const attachment = attachments.get(reservation.childSubmissionId);\n\n if (attachment !== undefined) ordered.push(attachment);\n }\n\n return RecoverySnapshot.make({ ...snapshot, childAttachments: ordered });\n });\n\n const routed = SubmissionLedger.of({\n capabilities: local.capabilities,\n\n admit: (request) =>\n options.ownsThread(request.threadId)\n ? local.admit(request)\n : foreignLedgerCall(\n \"ledger admit\",\n request.threadId,\n LedgerAdmitCall.make({ request }),\n LedgerAdmitResult,\n Schema.Union([AdmissionConflict, AdmissionPolicyError]),\n ).pipe(Effect.map((reply) => reply.result)),\n\n markReady: (request) =>\n submissionTarget(\"ledger mark ready\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markReady(request)\n : foreignLedgerCall(\n \"ledger mark ready\",\n target.threadId,\n LedgerMarkReadyCall.make({ request }),\n LedgerMarkReadyResult,\n NoAdditionalPortFailure,\n ).pipe(Effect.asVoid),\n ),\n ),\n\n lookup: (request) =>\n request._tag === \"SubmissionLookupById\"\n ? submissionTarget(\"ledger lookup\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.lookup(request)\n : foreignLookupById(\"ledger lookup\", target.threadId, request.submissionId),\n ),\n )\n : options.ownsThread(request.threadId)\n ? local.lookup(request)\n : foreignLedgerCall(\n \"ledger lookup\",\n request.threadId,\n LedgerLookupCall.make({ request }),\n LedgerLookupResult,\n NoAdditionalPortFailure,\n ).pipe(\n Effect.map((result) =>\n result.submission === undefined ? Option.none() : Option.some(result.submission),\n ),\n ),\n\n resolveAdmission: (request) =>\n options.ownsThread(request.threadId)\n ? local.resolveAdmission(request)\n : resolveForeignAdmission(request.threadId, request),\n\n inspectWorker: (threadId) =>\n options.ownsThread(threadId)\n ? local.inspectWorker === undefined\n ? Effect.fail(\n LedgerError.make({\n operation: \"inspectWorker\",\n message: \"Worker inspection unavailable\",\n }),\n )\n : local.inspectWorker(threadId)\n : foreignLedgerCall(\n \"inspect worker\",\n threadId,\n LedgerInspectWorkerCall.make({ request: { threadId } }),\n LedgerInspectWorkerResult,\n NoAdditionalPortFailure,\n ).pipe(Effect.map((reply) => reply.state)),\n\n stopWorker: (request) =>\n options.ownsThread(request.threadId)\n ? local.stopWorker === undefined\n ? Effect.fail(\n LedgerError.make({ operation: \"stopWorker\", message: \"Worker stop unavailable\" }),\n )\n : local.stopWorker(request)\n : foreignLedgerCall(\n \"ledger stop worker\",\n request.threadId,\n LedgerStopWorkerCall.make({ request }),\n LedgerStopWorkerResult,\n NoAdditionalPortFailure,\n ).pipe(Effect.map((reply) => reply.owned)),\n\n requestAbort: (request) =>\n submissionTarget(\"ledger request abort\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.requestAbort(request)\n : foreignLedgerCall(\n \"ledger request abort\",\n target.threadId,\n LedgerRequestAbortCall.make({ request }),\n LedgerRequestAbortResult,\n AbortPortFailure,\n ).pipe(Effect.map((reply) => reply.intent)),\n ),\n ),\n\n recordChildSettled: (request) =>\n submissionTarget(\"ledger record child settled\", request.parentSubmissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.recordChildSettled(request)\n : foreignLedgerCall(\n \"ledger record child settled\",\n target.threadId,\n LedgerRecordChildSettledCall.make({ request }),\n LedgerRecordChildSettledResult,\n NoAdditionalPortFailure,\n ).pipe(Effect.map((reply) => reply.outcome)),\n ),\n ),\n\n // Every operation below is lane-local by construction (plan §1.3): a foreign address is\n // an out-of-contract call and fails fast typed instead of being quietly distributed.\n claim: (request) =>\n options.ownsThread(request.threadId)\n ? local.claim(request)\n : Effect.fail(crossThreadLedgerError(\"ledger claim\", request.threadId)),\n\n claimJoining: (request) =>\n options.ownsThread(request.threadId)\n ? local.claimJoining(request)\n : Effect.fail(crossThreadLedgerError(\"ledger claim joining\", request.threadId)),\n\n renewOwnership: (request) =>\n submissionTarget(\"ledger renew ownership\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.renewOwnership(request)\n : Effect.fail(crossThreadLedgerError(\"ledger renew ownership\", target.threadId)),\n ),\n ),\n\n releaseOwnership: (request) =>\n submissionTarget(\"ledger release ownership\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.releaseOwnership(request)\n : Effect.fail(crossThreadLedgerError(\"ledger release ownership\", target.threadId)),\n ),\n ),\n\n markInputApplied: (request) =>\n submissionTarget(\"ledger mark input applied\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markInputApplied(request)\n : Effect.fail(crossThreadLedgerError(\"ledger mark input applied\", target.threadId)),\n ),\n ),\n\n reserveSettlement: (request) =>\n submissionTarget(\"ledger reserve settlement\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.reserveSettlement(request)\n : Effect.fail(crossThreadLedgerError(\"ledger reserve settlement\", target.threadId)),\n ),\n ),\n\n finalizeSettlement: (request) =>\n submissionTarget(\"ledger finalize settlement\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.finalizeSettlement(request)\n : Effect.fail(crossThreadLedgerError(\"ledger finalize settlement\", target.threadId)),\n ),\n ),\n\n markJoined: (request) =>\n submissionTarget(\"ledger mark joined\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markJoined(request)\n : Effect.fail(crossThreadLedgerError(\"ledger mark joined\", target.threadId)),\n ),\n ),\n\n revertJoining: (request) =>\n submissionTarget(\"ledger revert joining\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.revertJoining(request)\n : Effect.fail(crossThreadLedgerError(\"ledger revert joining\", target.threadId)),\n ),\n ),\n\n suspend: (request) =>\n submissionTarget(\"ledger suspend\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.suspend(request)\n : Effect.fail(crossThreadLedgerError(\"ledger suspend\", target.threadId)),\n ),\n ),\n\n recordApprovalDecision: (command) =>\n submissionTarget(\"ledger record approval decision\", command.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.recordApprovalDecision(command)\n : Effect.fail(\n crossThreadLedgerError(\"ledger record approval decision\", target.threadId),\n ),\n ),\n ),\n\n markUnknown: (request) =>\n submissionTarget(\"ledger mark unknown\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.markUnknown(request)\n : Effect.fail(crossThreadLedgerError(\"ledger mark unknown\", target.threadId)),\n ),\n ),\n\n recordUnknownResolution: (command) =>\n submissionTarget(\"ledger record unknown resolution\", command.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.recordUnknownResolution(command)\n : Effect.fail(\n crossThreadLedgerError(\"ledger record unknown resolution\", target.threadId),\n ),\n ),\n ),\n\n reserveChildBudget: (request) =>\n submissionTarget(\"ledger reserve child budget\", request.parentSubmissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.reserveChildBudget(request)\n : Effect.fail(crossThreadLedgerError(\"ledger reserve child budget\", target.threadId)),\n ),\n ),\n\n // Reservation identities carry no Thread address; the reservation row lives in the\n // parent's own Object and these transitions are parent-lane-local by construction, so\n // they always execute on the local facet (which fails typed for an unknown row).\n attachChildToReservation: local.attachChildToReservation,\n beginChildBudgetRelease: local.beginChildBudgetRelease,\n releaseChildBudget: local.releaseChildBudget,\n\n // The local scan IS the whole worklist: one Thread per Object (durability §5).\n scanNonterminal: local.scanNonterminal,\n\n readAbortIntent: (request) =>\n submissionTarget(\"ledger read abort intent\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.readAbortIntent(request)\n : Effect.fail(crossThreadLedgerError(\"ledger read abort intent\", target.threadId)),\n ),\n ),\n\n loadRecoverySnapshot: (request) =>\n submissionTarget(\"ledger load recovery snapshot\", request.submissionId).pipe(\n Effect.flatMap((target) =>\n target._tag === \"local\"\n ? local.loadRecoverySnapshot(request).pipe(Effect.flatMap(enrichChildAttachments))\n : Effect.fail(crossThreadLedgerError(\"ledger load recovery snapshot\", target.threadId)),\n ),\n ),\n });\n\n return Context.make(SubmissionLedger, routed);\n});\n\nconst makeRoutedStoreServices = Effect.fn(\"DoPortRouting.makeRoutedStoreServices\")(function* (\n options: RoutedPortOptions,\n) {\n const local = yield* ThreadStore;\n const checkpoints = local.checkpoints;\n const recoveryCheckpoints = local.recoveryCheckpoints;\n const transport = yield* ThreadPortTransport;\n const transportCall: TransportCall = makeTransportCall(transport);\n\n const routeFailure =\n (operation: string, target: string) =>\n (error: PortTransportError | PortProtocolError): ThreadStoreError =>\n ThreadStoreError.make({\n operation,\n message: boundPortDiagnostic(\n `Routed ${operation} to the Thread Object owning ${target} failed: ${error.message}`,\n ),\n cause: error,\n });\n\n /** The store twin of `foreignLedgerCall` with `ThreadStoreError` as the base error. */\n const foreignStoreCall = <ResultSchema extends Schema.Top, FailureSchema extends Schema.Top>(\n operation: string,\n target: ThreadId,\n call: PortRequest,\n resultSchema: ResultSchema,\n failureSchema: FailureSchema,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | ThreadStoreError> => {\n const isExpectedResult = Schema.is(resultSchema);\n const isExpectedFailure = Schema.is(failureSchema);\n\n return transportCall(target, call).pipe(\n Effect.mapError(routeFailure(operation, target)),\n Effect.flatMap(\n (\n response,\n ): Effect.Effect<ResultSchema[\"Type\"], FailureSchema[\"Type\"] | ThreadStoreError> => {\n if (response._tag === \"PortFailed\") {\n const failure = response.failure;\n\n if (isExpectedFailure(failure)) return Effect.fail(failure);\n if (failure._tag === \"ThreadStoreError\") return Effect.fail(failure);\n\n return Effect.fail(\n ThreadStoreError.make({\n operation,\n message: boundPortDiagnostic(\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `out-of-contract failure ${failure._tag}`,\n ),\n cause: failure,\n }),\n );\n }\n const result = response.result;\n\n if (!isExpectedResult(result)) {\n return Effect.fail(\n ThreadStoreError.make({\n operation,\n message:\n `The Thread Object owning ${target} answered ${operation} with the ` +\n `mismatched result ${result._tag}.`,\n }),\n );\n }\n\n return Effect.succeed(result);\n },\n ),\n Effect.withSpan(\"DoPortRouting.foreignStoreCall\", {\n attributes: { operation, target },\n }),\n );\n };\n\n const routed = ThreadStore.of({\n countPeerMessages: (request) =>\n options.ownsThread(request.threadId)\n ? local.countPeerMessages === undefined\n ? Effect.fail(crossThreadStoreError(\"peer count unavailable\", request.threadId))\n : local.countPeerMessages(request)\n : foreignStoreCall(\n \"thread countPeerMessages\",\n request.threadId,\n StoreCountPeerMessagesCall.make({ request }),\n StoreCountPeerMessagesResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => reply.count)),\n\n materialize: (request) =>\n options.ownsThread(request.threadId)\n ? local.materialize(request)\n : foreignStoreCall(\n \"thread materialize\",\n request.threadId,\n StoreMaterializeCall.make({ request }),\n StoreMaterializeResult,\n FenceRejected,\n ).pipe(Effect.asVoid),\n\n append: (request) =>\n options.ownsThread(request.threadId)\n ? local.append(request)\n : foreignStoreCall(\n \"thread append\",\n request.threadId,\n StoreAppendCall.make({ request }),\n StoreAppendResult,\n AppendPortFailure,\n ).pipe(Effect.map((reply) => reply.result)),\n\n read: (request) =>\n options.ownsThread(request.threadId)\n ? local.read(request)\n : Stream.unwrap(\n foreignStoreCall(\n \"thread read\",\n request.threadId,\n StoreReadPageCall.make({ request }),\n StoreReadPageResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => Stream.fromIterable(reply.records))),\n ),\n\n inspectTail: (request) =>\n options.ownsThread(request.threadId)\n ? local.inspectTail(request)\n : foreignStoreCall(\n \"thread inspect tail\",\n request.threadId,\n StoreInspectTailCall.make({ request }),\n StoreInspectTailResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => reply.tail)),\n\n export: (request) =>\n options.ownsThread(request.threadId)\n ? local.export(request)\n : foreignStoreCall(\n \"thread export\",\n request.threadId,\n StoreExportCall.make({ request }),\n StoreExportResult,\n ThreadNotMaterialized,\n ).pipe(Effect.map((reply) => reply.export)),\n\n // Observation and checkpoints are lane-local: the closed route-capable store subset\n // is materialize/append/read/inspectTail/export. Recovery cache misses can fall back\n // to those canonical reads, including when the cache belongs to a foreign Object.\n observe: (request) =>\n options.ownsThread(request.threadId)\n ? local.observe(request)\n : Stream.unwrap(Effect.fail(crossThreadStoreError(\"thread observe\", request.threadId))),\n\n ...(recoveryCheckpoints === undefined\n ? {}\n : {\n recoveryCheckpoints: {\n save: (request) =>\n options.ownsThread(request.checkpoint.threadId)\n ? recoveryCheckpoints.save(request)\n : Effect.fail(\n crossThreadStoreError(\n \"thread save recovery checkpoint\",\n request.checkpoint.threadId,\n ),\n ),\n load: (request) =>\n options.ownsThread(request.threadId)\n ? recoveryCheckpoints.load(request)\n : Effect.succeed(Option.none()),\n },\n }),\n ...(checkpoints === undefined\n ? {}\n : {\n checkpoints: {\n save: (request) =>\n options.ownsThread(request.checkpoint.threadId)\n ? checkpoints.save(request)\n : Effect.fail(\n crossThreadStoreError(\"thread save checkpoint\", request.checkpoint.threadId),\n ),\n load: (request) =>\n options.ownsThread(request.threadId)\n ? checkpoints.load(request)\n : Effect.fail(crossThreadStoreError(\"thread load checkpoint\", request.threadId)),\n },\n }),\n });\n\n return Context.make(ThreadStore, routed);\n});\n\n/**\n * Routing decorator over the LOCAL `SubmissionLedger` facet (plan §1.3): a request addressing\n * this Object's Thread executes locally; a route-capable request addressing another\n * Thread is Schema-encoded onto the `ThreadPortTransport` and executed by the\n * owning Object's local facet; any other foreign request fails fast typed. Provide the WP1\n * local facet (`submissionLedgerLayer`/`ledgerLayer`) and a transport to close it.\n */\nexport const routedSubmissionLedgerLayer = (\n options: RoutedPortOptions,\n): Layer.Layer<SubmissionLedger, never, SubmissionLedger | ThreadPortTransport> =>\n Layer.effectContext(makeRoutedLedgerServices(options));\n\n/**\n * Routing decorator over the LOCAL `ThreadStore` facet (plan §1.3): this-thread\n * requests execute locally; foreign materialize/append/read/inspectTail/export travel the\n * transport. Foreign recovery-cache loads return none for canonical replay; other foreign\n * checkpoint operations and observation fail fast typed.\n */\nexport const routedThreadStoreLayer = (\n options: RoutedPortOptions,\n): Layer.Layer<ThreadStore, never, ThreadStore | ThreadPortTransport> =>\n Layer.effectContext(makeRoutedStoreServices(options));\n\n/** Route the existing owner-scoped list; delivery mutations remain source local. */\nexport const routedMessageDeliveryStoreLayer = (options: RoutedPortOptions) =>\n Layer.effect(\n MessageDeliveryStore,\n Effect.gen(function* () {\n const local = yield* MessageDeliveryStore;\n const call = makeTransportCall(yield* ThreadPortTransport);\n\n return MessageDeliveryStore.of({\n ...local,\n list: (request) =>\n options.ownsThread(request.ownerThreadId)\n ? local.list(request)\n : call(request.ownerThreadId, MessageDeliveryListCall.make({ request })).pipe(\n Effect.mapError(() =>\n MessageDeliveryError.make({\n reason: \"storage\",\n operation: \"route delivery list\",\n }),\n ),\n Effect.flatMap((response) => {\n if (\n response._tag === \"PortSucceeded\" &&\n response.result._tag === \"MessageDeliveryListResult\"\n )\n return Effect.succeed(response.result.page);\n\n return Effect.fail(\n response._tag === \"PortFailed\" &&\n response.failure._tag === \"MessageDeliveryError\"\n ? response.failure\n : MessageDeliveryError.make({\n reason: \"storage\",\n operation: \"route delivery list\",\n }),\n );\n }),\n ),\n });\n }),\n );\n\n// ---------------------------------------------------------------------------\n// Owner-side execution\n// ---------------------------------------------------------------------------\n\n/** Fold one port operation's typed failures into the uniform response envelope. */\nconst capture = <Failure extends PortFailure>(\n effect: Effect.Effect<PortResult, Failure>,\n): Effect.Effect<PortResponse> =>\n effect.pipe(\n Effect.map((result): PortResponse => PortSucceeded.make({ result })),\n Effect.catch((failure) => Effect.succeed<PortResponse>(PortFailed.make({ failure }))),\n );\n\n/**\n * Execute one decoded port request against THIS Object's LOCAL facets — the owner-side half\n * of the routed ports (plan §1.3). Callers must provide the WP1 local facets, never the\n * routed decorators: the routing layer already established that this Object owns the\n * addressed Thread, and re-routing here could bounce a request between Objects.\n * Failures never escape — every typed port failure becomes a `PortFailed` envelope that\n * re-decodes on the caller side.\n */\nexport const executePortRequest = Effect.fn(\"DoPortRouting.executePortRequest\")(function* (\n request: PortRequest,\n): Effect.fn.Return<PortResponse, never, SubmissionLedger | ThreadStore | MessageDeliveryStore> {\n switch (request._tag) {\n case \"MessageDeliveryList\": {\n const store = yield* MessageDeliveryStore;\n\n return yield* capture(\n store\n .list(request.request)\n .pipe(Effect.map((page) => MessageDeliveryListResult.make({ page }))),\n );\n }\n case \"StoreCountPeerMessages\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store.countPeerMessages === undefined\n ? Effect.fail(crossThreadStoreError(\"native read unavailable\", request.request.threadId))\n : store\n .countPeerMessages(request.request)\n .pipe(Effect.map((count) => StoreCountPeerMessagesResult.make({ count }))),\n );\n }\n case \"LedgerAdmit\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .admit(request.request)\n .pipe(Effect.map((result) => LedgerAdmitResult.make({ result }))),\n );\n }\n case \"LedgerMarkReady\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger.markReady(request.request).pipe(Effect.map(() => LedgerMarkReadyResult.make({}))),\n );\n }\n case \"LedgerLookup\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .lookup(request.request)\n .pipe(\n Effect.map((submission) =>\n Option.isSome(submission)\n ? LedgerLookupResult.make({ submission: submission.value })\n : LedgerLookupResult.make({}),\n ),\n ),\n );\n }\n case \"LedgerResolveAdmission\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .resolveAdmission(request.request)\n .pipe(Effect.map((resolution) => LedgerResolveAdmissionResult.make({ resolution }))),\n );\n }\n case \"LedgerInspectWorker\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger.inspectWorker === undefined\n ? Effect.fail(\n LedgerError.make({\n operation: \"inspectWorker\",\n message: \"Worker inspection unavailable\",\n }),\n )\n : ledger\n .inspectWorker(request.request.threadId)\n .pipe(Effect.map((state) => LedgerInspectWorkerResult.make({ state }))),\n );\n }\n case \"LedgerStopWorker\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger.stopWorker === undefined\n ? Effect.fail(\n LedgerError.make({ operation: \"stopWorker\", message: \"Worker stop unavailable\" }),\n )\n : ledger\n .stopWorker(request.request)\n .pipe(Effect.map((owned) => LedgerStopWorkerResult.make({ owned }))),\n );\n }\n case \"LedgerRequestAbort\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .requestAbort(request.request)\n .pipe(Effect.map((intent) => LedgerRequestAbortResult.make({ intent }))),\n );\n }\n case \"LedgerRecordChildSettled\": {\n const ledger = yield* SubmissionLedger;\n\n return yield* capture(\n ledger\n .recordChildSettled(request.request)\n .pipe(Effect.map((outcome) => LedgerRecordChildSettledResult.make({ outcome }))),\n );\n }\n case \"StoreMaterialize\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store.materialize(request.request).pipe(Effect.map(() => StoreMaterializeResult.make({}))),\n );\n }\n case \"StoreAppend\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store\n .append(request.request)\n .pipe(Effect.map((result) => StoreAppendResult.make({ result }))),\n );\n }\n case \"StoreReadPage\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store.read(request.request).pipe(\n Stream.runCollect,\n Effect.map((records) => StoreReadPageResult.make({ records: [...records] })),\n ),\n );\n }\n case \"StoreInspectTail\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store\n .inspectTail(request.request)\n .pipe(Effect.map((tail) => StoreInspectTailResult.make({ tail }))),\n );\n }\n case \"StoreExport\": {\n const store = yield* ThreadStore;\n\n return yield* capture(\n store\n .export(request.request)\n .pipe(Effect.map((threadExport) => StoreExportResult.make({ export: threadExport }))),\n );\n }\n }\n});\n\n/**\n * The last-resort wire fallback when even encoding a response fails: the literal encoded\n * form of `PortFailed(PortProtocolError)` — tagged classes of bounded strings encode to\n * exactly this shape, so no Schema round trip is needed to produce it.\n */\nconst encodedProtocolFailure = (message: string): unknown => ({\n _tag: \"PortFailed\",\n failure: { _tag: \"PortProtocolError\", message: boundPortDiagnostic(message) },\n});\n\n/**\n * The complete owner-side endpoint body for `portCall` (D-P6-3): decode the wire request,\n * execute it against this Object's LOCAL facets, and answer with the encoded response\n * envelope. Total by construction — a request that cannot be decoded, or a response that\n * cannot be encoded, answers `PortFailed(PortProtocolError)` instead of throwing, so the\n * transport never has to interpret exceptions as protocol answers.\n */\nexport const handleEncodedPortRequest = Effect.fn(\"DoPortRouting.handleEncodedPortRequest\")(\n function* (\n encoded: unknown,\n ): Effect.fn.Return<unknown, never, SubmissionLedger | ThreadStore | MessageDeliveryStore> {\n const response = yield* decodePortRequest(encoded).pipe(\n Effect.flatMap(executePortRequest),\n Effect.catch((error) =>\n Effect.succeed<PortResponse>(\n PortFailed.make({\n failure: PortProtocolError.make({\n message: boundPortDiagnostic(\n `The port request could not be decoded: ${error.message}`,\n ),\n }),\n }),\n ),\n ),\n );\n\n return yield* encodePortResponse(response).pipe(\n Effect.catch((error) =>\n Effect.succeed(\n encodedProtocolFailure(`The port response could not be encoded: ${error.message}`),\n ),\n ),\n );\n },\n);\n"],"mappings":"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"}