@effect-agent/storage-memory 0.1.0-beta.42 → 0.1.0-beta.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -48
- package/src/memory-ledger.ts +192 -0
- package/src/memory-schedule-store.ts +42 -0
- package/src/memory-storage.ts +48 -0
- package/src/memory-subscription-store.ts +149 -0
- package/src/semantic-memory-index.ts +37 -0
- package/src/testing.ts +1 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["validate","error","sameSource","validate"],"sources":["../src/memory-ledger.ts","../src/memory-schedule-store.ts","../src/memory-subscription-store.ts","../src/memory-storage.ts","../src/semantic-memory-index.ts"],"sourcesContent":["import {\n type ToolCallId,\n AttemptId,\n ReceiptId,\n SubmissionId,\n type AgentId,\n type ThreadId,\n type SettlementId,\n} from \"@effect-agent/core\";\nimport {\n type ParentLinkage,\n AbortCommand,\n AdmissionAdmitted,\n AdmissionConflict,\n AdmissionIndeterminate,\n AdmissionNotAdmitted,\n AdmissionRequest,\n AdmissionResult,\n ApprovalConflict,\n ApprovalDecisionCommand,\n ApprovalDecisionIntent,\n AttachChildToReservationRequest,\n BeginChildBudgetReleaseRequest,\n ChildAttachmentSnapshot,\n ChildBudgetReservationRequest,\n ChildBudgetReservationSnapshot,\n ChildReservationConflict,\n ChildSettledNotification,\n Claim,\n ClaimJoiningRequest,\n ClaimRequest,\n DEFAULT_OWNERSHIP_LEASE_DURATION,\n InputAppliedMarker,\n JoinSnapshot,\n JoinedToHost,\n JoiningClaim,\n LedgerCapabilities,\n LedgerError,\n MarkInputAppliedRequest,\n MarkJoinedRequest,\n MarkReadyRequest,\n MarkUnknownRequest,\n OwnershipLost,\n OwnershipRenewal,\n OwnershipSnapshot,\n OwnershipToken,\n PersistedJson,\n ProducerEpoch,\n QueueSequence,\n RecoverySnapshot,\n RecoverySnapshotRequest,\n ReleaseChildBudgetRequest,\n ReleaseOwnershipRequest,\n RenewOwnershipRequest,\n ReservedChildBudget,\n ReservedSettlement,\n RevertJoiningRequest,\n Settlement,\n SettlementConflict,\n SettlementFinalization,\n SettlementReservation,\n SettlementReservationSnapshot,\n settlementFailureFromRecord,\n AbortIntent,\n SubmissionLedger,\n SubmissionLookup,\n SubmissionLookupByKey,\n SubmissionSnapshot,\n SuspendRequest,\n SuspensionSnapshot,\n UnknownResolution,\n UnknownResolutionCommand,\n UnknownResolutionConflict,\n UnknownResolutionIntent,\n type ChildReservationId,\n type ChildReservationStatus,\n type ChildSettledOutcome,\n type DefinitionDigests,\n type DeploymentId,\n type Digest,\n type IdempotencyKey,\n type Principal,\n type ProducerId,\n type RecordEnvelope,\n type SettlementOutcome,\n type SubmissionState,\n type SuspensionOutcome,\n type SuspensionReason,\n} from \"@effect-agent/thread\";\nimport { Clock, DateTime, Duration, Effect, Layer, Option, Ref, Schema, Stream } from \"effect\";\n\nconst MAX_SUBMISSIONS = 65_536;\n\n/**\n * Lifecycle ordering used to advance-but-never-regress the operational state marker: a reclaimed\n * Attempt must not erase progress markers (input-applied, terminalizing) that an earlier Attempt\n * already committed.\n */\nconst STATE_RANK: Record<SubmissionState, number> = {\n admitted: 0,\n ready: 1,\n joining: 2,\n joined: 3,\n running: 4,\n \"input-applied\": 5,\n suspended: 6,\n unknown: 7,\n terminalizing: 8,\n settled: 9,\n};\n\ninterface SubmissionRow {\n readonly submissionId: SubmissionId;\n readonly threadId: ThreadId;\n readonly queueSequence: QueueSequence;\n readonly principal: Principal;\n readonly idempotencyKey: IdempotencyKey;\n readonly agentId: AgentId;\n readonly agentDigests: DefinitionDigests;\n readonly deploymentId: DeploymentId;\n readonly inputPayload: PersistedJson;\n readonly inputDigest: Digest;\n readonly receiptId: ReceiptId;\n readonly state: SubmissionState;\n readonly settledOutcome: SettlementOutcome | undefined;\n readonly createdAtMillis: number;\n readonly readyAtMillis: number | undefined;\n /** Immutable child-side lineage recorded at admission (spec §12 step 5). */\n readonly parentLinkage: ParentLinkage | undefined;\n}\n\ninterface StoredOwnership {\n readonly attemptId: AttemptId;\n readonly ownershipToken: OwnershipToken;\n readonly producerEpoch: ProducerEpoch;\n readonly ownerProducerId: ProducerId;\n readonly leaseExpiresAtMillis: number;\n}\n\ninterface StoredReservation {\n readonly settlementId: SettlementId;\n readonly outcome: SettlementOutcome;\n readonly record: RecordEnvelope;\n readonly recordDigest: Digest;\n readonly finalizedAtMillis: number | undefined;\n}\n\ninterface StoredSuspension {\n readonly reason: SuspensionReason;\n readonly suspendedAtMillis: number;\n}\n\ninterface StoredUnknownMark {\n readonly reason: MarkUnknownRequest[\"reason\"];\n readonly toolCallIds: ReadonlyArray<ToolCallId>;\n}\n\ninterface StoredUnknownResolution {\n readonly intent: UnknownResolutionIntent;\n}\n\ninterface StoredSubmission {\n readonly row: SubmissionRow;\n readonly ownership: StoredOwnership | undefined;\n readonly inputApplied: InputAppliedMarker | undefined;\n readonly reservation: StoredReservation | undefined;\n readonly abortIntent: AbortIntent | undefined;\n /** Host linkage recorded at `claimJoining` time; cleared by `revertJoining` (DUR-016). */\n readonly joinedHostSubmissionId: SubmissionId | undefined;\n readonly suspension: StoredSuspension | undefined;\n readonly unknownMark: StoredUnknownMark | undefined;\n readonly approvalDecisions: ReadonlyMap<ToolCallId, ApprovalDecisionIntent>;\n readonly unknownResolutions: ReadonlyMap<ToolCallId, StoredUnknownResolution>;\n}\n\n/**\n * States in which `claim` never grants the head: the lane is host-owned (`joining`/`joined`)\n * or durably suspended rather than worker-claimable. Unknown heads are checked against abort\n * intent separately: abort authorizes cleanup and settlement, never ordinary Tool replay.\n */\nconst BLOCKED_HEAD_STATES: ReadonlySet<SubmissionState> = new Set([\n \"joining\",\n \"joined\",\n \"suspended\",\n]);\n\ninterface LaneState {\n readonly nextQueueSequence: number;\n readonly producerEpoch: number;\n}\n\n/** One parent-owned child budget reservation row (spec §12 steps 2 and 6). */\ninterface StoredChildReservation {\n readonly reservationId: ChildReservationId;\n readonly parentSubmissionId: SubmissionId;\n readonly parentToolCallId: ToolCallId;\n readonly childSubmissionId: SubmissionId | undefined;\n readonly status: ChildReservationStatus;\n readonly allocation: PersistedJson;\n readonly allocationDigest: Digest;\n readonly accounting: PersistedJson | undefined;\n readonly reservedAtMillis: number;\n readonly releaseBeganAtMillis: number | undefined;\n readonly releasedAtMillis: number | undefined;\n}\n\ninterface LedgerState {\n readonly submissions: ReadonlyMap<SubmissionId, StoredSubmission>;\n readonly admissionIndex: ReadonlyMap<string, SubmissionId>;\n readonly lanes: ReadonlyMap<ThreadId, LaneState>;\n readonly childReservations: ReadonlyMap<ChildReservationId, StoredChildReservation>;\n readonly mintCounter: number;\n}\n\ntype Decision<A, E> =\n | { readonly _tag: \"failure\"; readonly error: E }\n | { readonly _tag: \"success\"; readonly value: A };\n\nconst failure = <E>(error: E): Decision<never, E> => ({ _tag: \"failure\", error });\nconst success = <A>(value: A): Decision<A, never> => ({ _tag: \"success\", value });\n\nconst ledgerError = (operation: string, message: string, cause?: unknown): LedgerError =>\n cause === undefined\n ? LedgerError.make({ operation, message })\n : LedgerError.make({ operation, message, cause });\n\nconst validate = Effect.fn(\"MemorySubmissionLedger.validate\")(\n <A, I>(\n schema: Schema.Codec<A, I>,\n operation: string,\n value: unknown,\n ): Effect.Effect<A, LedgerError> =>\n Schema.encodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError((error) => ledgerError(operation, `Invalid ${operation} request`, error)),\n ),\n);\n\nconst decodeSubmissionId = Schema.decodeSync(SubmissionId);\nconst decodeReceiptId = Schema.decodeSync(ReceiptId);\nconst decodeAttemptId = Schema.decodeSync(AttemptId);\nconst decodeOwnershipToken = Schema.decodeSync(OwnershipToken);\nconst decodeQueueSequence = Schema.decodeSync(QueueSequence);\nconst decodeProducerEpoch = Schema.decodeSync(ProducerEpoch);\nconst equivalentPersistedJson = Schema.toEquivalence(PersistedJson);\nconst equivalentUnknownResolution = Schema.toEquivalence(UnknownResolution);\n\nconst utc = (millis: number): DateTime.Utc => DateTime.toUtc(DateTime.makeUnsafe(millis));\n\nconst admissionKey = (\n threadId: ThreadId,\n principal: Principal,\n idempotencyKey: IdempotencyKey,\n): string => `${threadId}\\u001f${principal}\\u001f${idempotencyKey}`;\n\nconst toSnapshot = (row: SubmissionRow): SubmissionSnapshot =>\n SubmissionSnapshot.make({\n submissionId: row.submissionId,\n threadId: row.threadId,\n queueSequence: row.queueSequence,\n principal: row.principal,\n idempotencyKey: row.idempotencyKey,\n agentId: row.agentId,\n agentDigests: row.agentDigests,\n deploymentId: row.deploymentId,\n inputPayload: row.inputPayload,\n inputDigest: row.inputDigest,\n receiptId: row.receiptId,\n state: row.state,\n createdAt: utc(row.createdAtMillis),\n ...(row.settledOutcome === undefined ? {} : { settledOutcome: row.settledOutcome }),\n ...(row.readyAtMillis === undefined ? {} : { readyAt: utc(row.readyAtMillis) }),\n ...(row.parentLinkage === undefined ? {} : { parentLinkage: row.parentLinkage }),\n });\n\nconst toReservationSnapshot = (row: StoredChildReservation): ChildBudgetReservationSnapshot =>\n ChildBudgetReservationSnapshot.make({\n reservationId: row.reservationId,\n parentSubmissionId: row.parentSubmissionId,\n parentToolCallId: row.parentToolCallId,\n status: row.status,\n allocation: row.allocation,\n allocationDigest: row.allocationDigest,\n reservedAt: utc(row.reservedAtMillis),\n ...(row.childSubmissionId === undefined ? {} : { childSubmissionId: row.childSubmissionId }),\n ...(row.accounting === undefined ? {} : { accounting: row.accounting }),\n ...(row.releaseBeganAtMillis === undefined\n ? {}\n : { releaseBeganAt: utc(row.releaseBeganAtMillis) }),\n ...(row.releasedAtMillis === undefined ? {} : { releasedAt: utc(row.releasedAtMillis) }),\n });\n\n/** Linkage equality: both absent, or both present naming the same parent Tool Call. */\nconst sameParentLinkage = (\n left: ParentLinkage | undefined,\n right: ParentLinkage | undefined,\n): boolean =>\n left === undefined\n ? right === undefined\n : right !== undefined &&\n left.parentSubmissionId === right.parentSubmissionId &&\n left.parentToolCallId === right.parentToolCallId;\n\nconst laneEpoch = (state: LedgerState, threadId: ThreadId): number =>\n state.lanes.get(threadId)?.producerEpoch ?? 0;\n\nconst ownershipLost = (state: LedgerState, stored: StoredSubmission): OwnershipLost =>\n OwnershipLost.make({\n submissionId: stored.row.submissionId,\n actualEpoch: decodeProducerEpoch(laneEpoch(state, stored.row.threadId)),\n });\n\n/** The presented token owns the lane only while it matches the live ownership record. */\nconst ownsLane = (stored: StoredSubmission, ownershipToken: OwnershipToken): boolean =>\n stored.ownership !== undefined && stored.ownership.ownershipToken === ownershipToken;\n\nconst withSubmission = (state: LedgerState, stored: StoredSubmission): LedgerState => ({\n ...state,\n submissions: new Map(state.submissions).set(stored.row.submissionId, stored),\n});\n\nconst withChildReservation = (\n state: LedgerState,\n reservation: StoredChildReservation,\n): LedgerState => ({\n ...state,\n childReservations: new Map(state.childReservations).set(reservation.reservationId, reservation),\n});\n\nconst findHead = (state: LedgerState, threadId: ThreadId): StoredSubmission | undefined => {\n let head: StoredSubmission | undefined;\n for (const stored of state.submissions.values()) {\n if (stored.row.threadId !== threadId || stored.row.state === \"settled\") continue;\n if (head === undefined || stored.row.queueSequence < head.row.queueSequence) head = stored;\n }\n return head;\n};\n\n/**\n * Reference in-memory SubmissionLedger. It implements the full port contract — atomic idempotent\n * admission, FIFO-head claims, producer-epoch fencing, Clock-driven ownership leases, idempotent\n * settlement reservation/finalization, and durable abort intent — with every transition applied\n * as one atomic `Ref.modify`, but its state does not survive the process (`non-durable`).\n *\n * Adapter-specific semantics within the port's latitude:\n *\n * - Time comes exclusively from the Effect `Clock` service, so `TestClock` drives lease expiry\n * deterministically; no wall clock is consulted.\n * - The ownership lease is pinned to `DEFAULT_OWNERSHIP_LEASE_DURATION` (D5); durable adapters\n * own the configuration seam.\n * - A live lease blocks claims from other producers only: the same `producerId` may reclaim its\n * own live lease (restart recovery), which supersedes and fences the prior Attempt's token.\n * - Claiming advances `ready` to `running` and otherwise preserves the recorded state, so\n * progress markers from an earlier Attempt survive a reclaim.\n * - `renewOwnership` keeps the token stable (the port allows rotation); a replayed admission\n * reports the Submission's current state alongside the original identities.\n * - `claimJoining` walks the strictly-later queue: rows already `joining`/`joined` to the\n * SAME host extend the claimed prefix and are skipped, and an aborted-settled row is a\n * closed obligation that is also skipped (P7 §7(c)); any other non-`ready` row (an\n * `admitted` gap, a non-aborted settled row, foreign-host linkage) breaks the prefix\n * conservatively.\n * - `markJoined` verifies the token against the HOST's live ownership (the lane is\n * host-owned), so a later host Attempt can repair a lost marker from history (DUR-016). The\n * join marker reuses the input-applied marker: the joined input IS `input:{sid}`.\n * - `suspend` and `markUnknown` refuse when an exact settlement is already reserved\n * (`SettlementConflict` with the reserved outcome) — DUR-011's reservation wins.\n * - `resolveAdmission` derives its answer from the single strongly consistent store, so it\n * never answers `Indeterminate` on its own; the test-only `resolveAdmissionFault` option\n * injects the `Indeterminate` classification so SUB-031 callers can be conformance-tested.\n * - `recordChildSettled` and `suspend(WaitingForChild)` observe child settlement directly from\n * the child rows (single-store latitude); no separate notification marker is stored.\n */\nconst makeSubmissionLedger = (options: MemorySubmissionLedgerOptions = {}) =>\n Effect.gen(function* () {\n const state = yield* Ref.make<LedgerState>({\n submissions: new Map(),\n admissionIndex: new Map(),\n lanes: new Map(),\n childReservations: new Map(),\n mintCounter: 0,\n });\n const leaseMillis = Duration.toMillis(DEFAULT_OWNERSHIP_LEASE_DURATION);\n\n const capabilities = Effect.succeed(LedgerCapabilities.make({ durability: \"non-durable\" }));\n\n const admit: SubmissionLedger[\"Service\"][\"admit\"] = Effect.fn(\"MemorySubmissionLedger.admit\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(AdmissionRequest, \"admit\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<AdmissionResult, AdmissionConflict | LedgerError>,\n LedgerState,\n ] => {\n const key = admissionKey(request.threadId, request.principal, request.idempotencyKey);\n const existingId = current.admissionIndex.get(key);\n if (existingId !== undefined) {\n const existing = current.submissions.get(existingId);\n if (existing === undefined) {\n return [\n failure(\n ledgerError(\"admit\", \"Admission index references a missing Submission\"),\n ),\n current,\n ];\n }\n // A replay must repeat the exact canonical input AND the exact parent linkage\n // (or its absence): linkage is immutable lineage (spec §12 step 5, SUB-016).\n if (\n existing.row.inputDigest !== request.inputDigest ||\n !sameParentLinkage(existing.row.parentLinkage, request.parentLinkage)\n ) {\n return [\n failure(\n AdmissionConflict.make({\n threadId: request.threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n existingInputDigest: existing.row.inputDigest,\n attemptedInputDigest: request.inputDigest,\n }),\n ),\n current,\n ];\n }\n return [\n success(\n AdmissionResult.make({\n submissionId: existing.row.submissionId,\n receiptId: existing.row.receiptId,\n queueSequence: existing.row.queueSequence,\n state: existing.row.state,\n replayed: true,\n }),\n ),\n current,\n ];\n }\n if (current.submissions.size >= MAX_SUBMISSIONS) {\n return [\n failure(\n ledgerError(\"admit\", `In-memory submission limit ${MAX_SUBMISSIONS} exceeded`),\n ),\n current,\n ];\n }\n const lane = current.lanes.get(request.threadId) ?? {\n nextQueueSequence: 1,\n producerEpoch: 0,\n };\n const mintCounter = current.mintCounter + 1;\n const row: SubmissionRow = {\n submissionId: decodeSubmissionId(`submission-memory-${mintCounter}`),\n threadId: request.threadId,\n queueSequence: decodeQueueSequence(lane.nextQueueSequence),\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n agentId: request.agentId,\n agentDigests: request.agentDigests,\n deploymentId: request.deploymentId,\n inputPayload: request.inputPayload,\n inputDigest: request.inputDigest,\n receiptId: decodeReceiptId(`receipt-memory-${mintCounter}`),\n state: \"admitted\",\n settledOutcome: undefined,\n createdAtMillis: nowMillis,\n readyAtMillis: undefined,\n parentLinkage: request.parentLinkage,\n };\n const submissions = new Map(current.submissions).set(row.submissionId, {\n row,\n ownership: undefined,\n inputApplied: undefined,\n reservation: undefined,\n abortIntent: undefined,\n joinedHostSubmissionId: undefined,\n suspension: undefined,\n unknownMark: undefined,\n approvalDecisions: new Map<ToolCallId, ApprovalDecisionIntent>(),\n unknownResolutions: new Map<ToolCallId, StoredUnknownResolution>(),\n });\n const admissionIndex = new Map(current.admissionIndex).set(key, row.submissionId);\n const lanes = new Map(current.lanes).set(request.threadId, {\n nextQueueSequence: lane.nextQueueSequence + 1,\n producerEpoch: lane.producerEpoch,\n });\n return [\n success(\n AdmissionResult.make({\n submissionId: row.submissionId,\n receiptId: row.receiptId,\n queueSequence: row.queueSequence,\n state: row.state,\n replayed: false,\n }),\n ),\n { ...current, submissions, admissionIndex, lanes, mintCounter },\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const markReady: SubmissionLedger[\"Service\"][\"markReady\"] = Effect.fn(\n \"MemorySubmissionLedger.markReady\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkReadyRequest, \"markReady\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(ledgerError(\"markReady\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.row.state !== \"admitted\") return [success(undefined), current];\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"ready\", readyAtMillis: nowMillis },\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const lookup: SubmissionLedger[\"Service\"][\"lookup\"] = Effect.fn(\n \"MemorySubmissionLedger.lookup\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SubmissionLookup, \"lookup\", unvalidated);\n const current = yield* Ref.get(state);\n const submissionId =\n request._tag === \"SubmissionLookupById\"\n ? request.submissionId\n : current.admissionIndex.get(\n admissionKey(request.threadId, request.principal, request.idempotencyKey),\n );\n const stored =\n submissionId === undefined ? undefined : current.submissions.get(submissionId);\n return stored === undefined ? Option.none() : Option.some(toSnapshot(stored.row));\n }),\n );\n\n const resolveAdmission: SubmissionLedger[\"Service\"][\"resolveAdmission\"] = Effect.fn(\n \"MemorySubmissionLedger.resolveAdmission\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SubmissionLookupByKey, \"resolveAdmission\", unvalidated);\n // Test-only fault seam: lets suites exercise the Indeterminate classification that a\n // single strongly consistent store never produces on its own (SUB-031, P6 honesty).\n if (options.resolveAdmissionFault !== undefined) {\n const fault = yield* options.resolveAdmissionFault;\n if (Option.isSome(fault)) {\n return AdmissionIndeterminate.make({ reason: fault.value });\n }\n }\n const current = yield* Ref.get(state);\n const submissionId = current.admissionIndex.get(\n admissionKey(request.threadId, request.principal, request.idempotencyKey),\n );\n const stored =\n submissionId === undefined ? undefined : current.submissions.get(submissionId);\n return stored === undefined\n ? AdmissionNotAdmitted.make()\n : AdmissionAdmitted.make({ submission: toSnapshot(stored.row) });\n }),\n );\n\n const claim: SubmissionLedger[\"Service\"][\"claim\"] = Effect.fn(\"MemorySubmissionLedger.claim\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ClaimRequest, \"claim\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<Option.Option<Claim>, LedgerError>, LedgerState] => {\n const head = findHead(current, request.threadId);\n if (head === undefined) return [success(Option.none()), current];\n if (\n BLOCKED_HEAD_STATES.has(head.row.state) ||\n (head.row.state === \"unknown\" && head.abortIntent === undefined)\n )\n return [success(Option.none()), current];\n if (\n head.ownership !== undefined &&\n head.ownership.leaseExpiresAtMillis > nowMillis &&\n head.ownership.ownerProducerId !== request.producerId\n ) {\n return [success(Option.none()), current];\n }\n const lane = current.lanes.get(request.threadId);\n if (lane === undefined) {\n return [\n failure(ledgerError(\"claim\", \"Claimable head without a Thread lane\")),\n current,\n ];\n }\n const producerEpoch = decodeProducerEpoch(lane.producerEpoch + 1);\n const mintCounter = current.mintCounter + 1;\n const ownership: StoredOwnership = {\n attemptId: decodeAttemptId(`attempt-memory-${mintCounter}`),\n ownershipToken: decodeOwnershipToken(`ownership-memory-${mintCounter}`),\n producerEpoch,\n ownerProducerId: request.producerId,\n leaseExpiresAtMillis: nowMillis + leaseMillis,\n };\n const row: SubmissionRow =\n head.row.state === \"ready\" ? { ...head.row, state: \"running\" } : head.row;\n const next = withSubmission(current, { ...head, row, ownership });\n const lanes = new Map(next.lanes).set(request.threadId, {\n nextQueueSequence: lane.nextQueueSequence,\n producerEpoch: lane.producerEpoch + 1,\n });\n return [\n success(\n Option.some(\n Claim.make({\n submissionId: row.submissionId,\n attemptId: ownership.attemptId,\n ownershipToken: ownership.ownershipToken,\n producerEpoch,\n leaseExpiresAt: utc(ownership.leaseExpiresAtMillis),\n inputPayload: row.inputPayload,\n }),\n ),\n ),\n { ...next, lanes, mintCounter },\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const renewOwnership: SubmissionLedger[\"Service\"][\"renewOwnership\"] = Effect.fn(\n \"MemorySubmissionLedger.renewOwnership\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(RenewOwnershipRequest, \"renewOwnership\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [Decision<OwnershipRenewal, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"renewOwnership\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n if (stored.ownership === undefined || !ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n const ownership: StoredOwnership = {\n ...stored.ownership,\n leaseExpiresAtMillis: nowMillis + leaseMillis,\n };\n return [\n success(\n OwnershipRenewal.make({\n ownershipToken: ownership.ownershipToken,\n leaseExpiresAt: utc(ownership.leaseExpiresAtMillis),\n }),\n ),\n withSubmission(current, { ...stored, ownership }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const releaseOwnership: SubmissionLedger[\"Service\"][\"releaseOwnership\"] = Effect.fn(\n \"MemorySubmissionLedger.releaseOwnership\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ReleaseOwnershipRequest, \"releaseOwnership\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"releaseOwnership\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n if (!ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n return [\n success(undefined),\n withSubmission(current, { ...stored, ownership: undefined }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const markInputApplied: SubmissionLedger[\"Service\"][\"markInputApplied\"] = Effect.fn(\n \"MemorySubmissionLedger.markInputApplied\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkInputAppliedRequest, \"markInputApplied\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"markInputApplied\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n if (!ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n const marker = InputAppliedMarker.make({\n recordId: request.recordId,\n sequence: request.sequence,\n });\n const row: SubmissionRow =\n STATE_RANK[stored.row.state] < STATE_RANK[\"input-applied\"]\n ? { ...stored.row, state: \"input-applied\" }\n : stored.row;\n return [\n success(undefined),\n withSubmission(current, { ...stored, row, inputApplied: marker }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const reserveSettlement: SubmissionLedger[\"Service\"][\"reserveSettlement\"] = Effect.fn(\n \"MemorySubmissionLedger.reserveSettlement\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SettlementReservation, \"reserveSettlement\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ReservedSettlement, SettlementConflict | OwnershipLost | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"reserveSettlement\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n // A `joined` Submission settles WITH its host (plan §2.5) and its lane is never\n // worker-claimable, so no ownership token can exist for it: the recorded host\n // linkage authorizes the reservation and the presented token is not consulted.\n const joinedSettlement =\n stored.row.state === \"joined\" && stored.joinedHostSubmissionId !== undefined;\n // P7 §7(c): an aborted, never-claimed, still-queued Submission likewise has no\n // live ownership to fence against — its durable abort intent authorizes exactly\n // its ABORTED settlement (`terminalizing` is the same pass's crash replay). Every\n // other reservation stays fenced by the target lane's live ownership.\n const queuedAbortSettlement =\n request.outcome === \"aborted\" &&\n stored.abortIntent !== undefined &&\n stored.ownership === undefined &&\n (stored.row.state === \"ready\" || stored.row.state === \"terminalizing\");\n if (\n !joinedSettlement &&\n !queuedAbortSettlement &&\n !ownsLane(stored, request.ownershipToken)\n ) {\n return [failure(ownershipLost(current, stored)), current];\n }\n const existing = stored.reservation;\n if (existing !== undefined) {\n if (\n existing.settlementId !== request.settlementId ||\n existing.outcome !== request.outcome ||\n existing.recordDigest !== request.recordDigest\n ) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: existing.outcome,\n }),\n ),\n current,\n ];\n }\n return [\n success(\n ReservedSettlement.make({\n submissionId: request.submissionId,\n settlementId: existing.settlementId,\n outcome: existing.outcome,\n record: existing.record,\n recordDigest: existing.recordDigest,\n replayed: true,\n }),\n ),\n current,\n ];\n }\n const reservation: StoredReservation = {\n settlementId: request.settlementId,\n outcome: request.outcome,\n record: request.record,\n recordDigest: request.recordDigest,\n finalizedAtMillis: undefined,\n };\n const row: SubmissionRow =\n STATE_RANK[stored.row.state] < STATE_RANK.terminalizing\n ? { ...stored.row, state: \"terminalizing\" }\n : stored.row;\n return [\n success(\n ReservedSettlement.make({\n submissionId: request.submissionId,\n settlementId: reservation.settlementId,\n outcome: reservation.outcome,\n record: reservation.record,\n recordDigest: reservation.recordDigest,\n replayed: false,\n }),\n ),\n withSubmission(current, { ...stored, row, reservation }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const finalizeSettlement: SubmissionLedger[\"Service\"][\"finalizeSettlement\"] = Effect.fn(\n \"MemorySubmissionLedger.finalizeSettlement\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SettlementFinalization, \"finalizeSettlement\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [Decision<Settlement, SettlementConflict | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"finalizeSettlement\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n const reservation = stored.reservation;\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"finalizeSettlement\",\n `No settlement reservation for Submission ${request.submissionId}`,\n ),\n ),\n current,\n ];\n }\n const settlementFailure = settlementFailureFromRecord(reservation.record);\n if ((reservation.outcome === \"failed\") !== (settlementFailure !== undefined)) {\n return [\n failure(\n ledgerError(\n \"finalizeSettlement\",\n `Settlement reservation for Submission ${request.submissionId} has contradictory failure evidence`,\n ),\n ),\n current,\n ];\n }\n if (reservation.settlementId !== request.settlementId) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: reservation.outcome,\n }),\n ),\n current,\n ];\n }\n if (reservation.finalizedAtMillis !== undefined) {\n return [\n success(\n Settlement.make({\n submissionId: stored.row.submissionId,\n settlementId: reservation.settlementId,\n receiptId: stored.row.receiptId,\n outcome: reservation.outcome,\n ...(settlementFailure === undefined ? {} : { failure: settlementFailure }),\n settledAt: utc(reservation.finalizedAtMillis),\n }),\n ),\n current,\n ];\n }\n const next = withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"settled\", settledOutcome: reservation.outcome },\n ownership: undefined,\n reservation: { ...reservation, finalizedAtMillis: nowMillis },\n });\n return [\n success(\n Settlement.make({\n submissionId: stored.row.submissionId,\n settlementId: reservation.settlementId,\n receiptId: stored.row.receiptId,\n outcome: reservation.outcome,\n ...(settlementFailure === undefined ? {} : { failure: settlementFailure }),\n settledAt: utc(nowMillis),\n }),\n ),\n next,\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const requestAbort: SubmissionLedger[\"Service\"][\"requestAbort\"] = Effect.fn(\n \"MemorySubmissionLedger.requestAbort\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(AbortCommand, \"requestAbort\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<AbortIntent, SettlementConflict | JoinedToHost | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(ledgerError(\"requestAbort\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n // A joined Submission settles WITH its host; the abort target is the host (plan\n // §2.5). A joining Submission still records the intent: it is honored only if the\n // host has not consumed the input (revert-then-abort).\n if (stored.row.state === \"joined\") {\n if (stored.joinedHostSubmissionId === undefined) {\n return [\n failure(\n ledgerError(\n \"requestAbort\",\n `Joined Submission ${request.submissionId} is missing its host linkage`,\n ),\n ),\n current,\n ];\n }\n return [\n failure(\n JoinedToHost.make({\n submissionId: request.submissionId,\n hostSubmissionId: stored.joinedHostSubmissionId,\n }),\n ),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"requestAbort\",\n `Settled Submission ${request.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n if (stored.abortIntent !== undefined) return [success(stored.abortIntent), current];\n const intent = AbortIntent.make({\n submissionId: request.submissionId,\n author: request.author,\n reason: request.reason,\n requestedAt: utc(nowMillis),\n });\n return [success(intent), withSubmission(current, { ...stored, abortIntent: intent })];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const claimJoining: SubmissionLedger[\"Service\"][\"claimJoining\"] = Effect.fn(\n \"MemorySubmissionLedger.claimJoining\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ClaimJoiningRequest, \"claimJoining\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ReadonlyArray<JoiningClaim>, OwnershipLost | LedgerError>,\n LedgerState,\n ] => {\n const host = current.submissions.get(request.hostSubmissionId);\n if (host === undefined) {\n return [\n failure(\n ledgerError(\"claimJoining\", `Unknown Submission ${request.hostSubmissionId}`),\n ),\n current,\n ];\n }\n if (host.row.threadId !== request.threadId) {\n return [\n failure(\n ledgerError(\n \"claimJoining\",\n `Host Submission ${request.hostSubmissionId} does not belong to Thread ${request.threadId}`,\n ),\n ),\n current,\n ];\n }\n if (!ownsLane(host, request.ownershipToken)) {\n return [failure(ownershipLost(current, host)), current];\n }\n const later = [...current.submissions.values()]\n .filter(\n (stored) =>\n stored.row.threadId === request.threadId &&\n stored.row.queueSequence > host.row.queueSequence,\n )\n .sort((left, right) => left.row.queueSequence - right.row.queueSequence);\n const claims: Array<JoiningClaim> = [];\n const submissions = new Map(current.submissions);\n for (const stored of later) {\n if (claims.length >= request.maxCount) break;\n // Rows already claimed by THIS host extend its contiguous prefix and are skipped;\n // the coordinator re-delivers already-joined input through the coverage rule.\n if (\n (stored.row.state === \"joining\" || stored.row.state === \"joined\") &&\n stored.joinedHostSubmissionId === request.hostSubmissionId\n ) {\n continue;\n }\n // P7 §7(c): an aborted-settled row is a CLOSED obligation, not a gap — recovery\n // settles aborted never-claimed queued work immediately, and settlement order of\n // never-run work is not execution order (DUR-004 bounds execution).\n if (stored.row.state === \"settled\" && stored.row.settledOutcome === \"aborted\") {\n continue;\n }\n // Any other non-ready row — an admitted-not-ready gap in particular — breaks the\n // contiguous ready prefix (plan §2.5); later ready work stays queued (DUR-004).\n if (stored.row.state !== \"ready\") break;\n submissions.set(stored.row.submissionId, {\n ...stored,\n row: { ...stored.row, state: \"joining\" },\n joinedHostSubmissionId: request.hostSubmissionId,\n });\n claims.push(\n JoiningClaim.make({\n submissionId: stored.row.submissionId,\n queueSequence: stored.row.queueSequence,\n inputPayload: stored.row.inputPayload,\n }),\n );\n }\n return [success(claims), { ...current, submissions }];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const markJoined: SubmissionLedger[\"Service\"][\"markJoined\"] = Effect.fn(\n \"MemorySubmissionLedger.markJoined\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkJoinedRequest, \"markJoined\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(ledgerError(\"markJoined\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.joinedHostSubmissionId === undefined) {\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `Submission ${request.submissionId} was never claimed for joining`,\n ),\n ),\n current,\n ];\n }\n const host = current.submissions.get(stored.joinedHostSubmissionId);\n if (host === undefined) {\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `Host Submission ${stored.joinedHostSubmissionId} is missing`,\n ),\n ),\n current,\n ];\n }\n // The lane is host-owned: the presented token must own the HOST's ownership period,\n // which also lets a later host Attempt repair a lost marker from history (DUR-016).\n if (!ownsLane(host, request.ownershipToken)) {\n return [failure(ownershipLost(current, host)), current];\n }\n if (stored.inputApplied !== undefined) {\n if (\n stored.inputApplied.recordId === request.recordId &&\n stored.inputApplied.sequence === request.sequence\n ) {\n return [success(undefined), current];\n }\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `A different join marker is already recorded for Submission ${request.submissionId}`,\n ),\n ),\n current,\n ];\n }\n if (stored.row.state !== \"joining\" && stored.row.state !== \"joined\") {\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `Cannot mark Submission ${request.submissionId} joined from state ${stored.row.state}`,\n ),\n ),\n current,\n ];\n }\n const marker = InputAppliedMarker.make({\n recordId: request.recordId,\n sequence: request.sequence,\n });\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"joined\" },\n inputApplied: marker,\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const revertJoining: SubmissionLedger[\"Service\"][\"revertJoining\"] = Effect.fn(\n \"MemorySubmissionLedger.revertJoining\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(RevertJoiningRequest, \"revertJoining\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(ledgerError(\"revertJoining\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n // Idempotent and recovery-only: only a still-`joining` Submission reverts; an\n // already-joined (or already-reverted) Submission is a no-op (DUR-016).\n if (stored.row.state !== \"joining\") return [success(undefined), current];\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"ready\" },\n joinedHostSubmissionId: undefined,\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const suspend: SubmissionLedger[\"Service\"][\"suspend\"] = Effect.fn(\n \"MemorySubmissionLedger.suspend\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SuspendRequest, \"suspend\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<SuspensionOutcome, OwnershipLost | SettlementConflict | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(ledgerError(\"suspend\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"suspend\",\n `Settled Submission ${request.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n // An exact terminal outcome is already reserved (DUR-011); suspension would\n // contradict it, so the reservation wins.\n if (stored.reservation !== undefined) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.reservation.outcome,\n }),\n ),\n current,\n ];\n }\n if (!ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n // A covering event that raced ahead of the suspend transaction (an approval decision,\n // or a child settlement observed directly from the child's row in this single store)\n // resumes the caller immediately WITHOUT releasing the lane (plan §2.6, spec §12).\n const alreadyCovered =\n request.reason._tag === \"ApprovalPending\"\n ? request.reason.toolCallIds.every((toolCallId) =>\n stored.approvalDecisions.has(toolCallId),\n )\n : request.reason.children.every(\n (child) =>\n current.submissions.get(child.childSubmissionId)?.row.state === \"settled\",\n );\n if (alreadyCovered) {\n return [success(\"resume-immediately\" as const), current];\n }\n return [\n success(\"suspended\" as const),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"suspended\" },\n ownership: undefined,\n suspension: { reason: request.reason, suspendedAtMillis: nowMillis },\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const recordApprovalDecision: SubmissionLedger[\"Service\"][\"recordApprovalDecision\"] = Effect.fn(\n \"MemorySubmissionLedger.recordApprovalDecision\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const command = yield* validate(\n ApprovalDecisionCommand,\n \"recordApprovalDecision\",\n unvalidated,\n );\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ApprovalDecisionIntent, ApprovalConflict | SettlementConflict | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(command.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\n \"recordApprovalDecision\",\n `Unknown Submission ${command.submissionId}`,\n ),\n ),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"recordApprovalDecision\",\n `Settled Submission ${command.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n return [\n failure(\n SettlementConflict.make({\n submissionId: command.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n const existing = stored.approvalDecisions.get(command.toolCallId);\n if (existing !== undefined) {\n if (existing.decision !== command.decision) {\n return [\n failure(\n ApprovalConflict.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n existingDecision: existing.decision,\n }),\n ),\n current,\n ];\n }\n return [success(existing), current];\n }\n const intent = ApprovalDecisionIntent.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n decision: command.decision,\n resolver: command.resolver,\n reason: command.reason,\n decidedAt: utc(nowMillis),\n });\n const approvalDecisions = new Map(stored.approvalDecisions).set(\n command.toolCallId,\n intent,\n );\n // Once every pending call of an ApprovalPending suspension is decided, the lane\n // wakes: suspended → input-applied (plan §2.6). A WaitingForChild suspension wakes\n // only through recordChildSettled.\n const wakes =\n stored.row.state === \"suspended\" &&\n stored.suspension !== undefined &&\n stored.suspension.reason._tag === \"ApprovalPending\" &&\n stored.suspension.reason.toolCallIds.every((toolCallId) =>\n approvalDecisions.has(toolCallId),\n );\n return [\n success(intent),\n withSubmission(current, {\n ...stored,\n row: wakes ? { ...stored.row, state: \"input-applied\" } : stored.row,\n suspension: wakes ? undefined : stored.suspension,\n approvalDecisions,\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const markUnknown: SubmissionLedger[\"Service\"][\"markUnknown\"] = Effect.fn(\n \"MemorySubmissionLedger.markUnknown\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkUnknownRequest, \"markUnknown\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, SettlementConflict | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return [\n failure(ledgerError(\"markUnknown\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"markUnknown\",\n `Settled Submission ${request.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n // A reserved exact outcome wins over a late Unknown marking (DUR-011); the recovery\n // classifier orders reservation ahead of MarkUnknown for the same reason.\n if (stored.reservation !== undefined) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.reservation.outcome,\n }),\n ),\n current,\n ];\n }\n // Idempotent merge: repeating is a no-op; additional open calls extend the marked\n // set while the first recorded reason is kept.\n const existing = stored.unknownMark;\n const known = new Set(existing?.toolCallIds ?? []);\n const merged = [\n ...(existing?.toolCallIds ?? []),\n ...request.toolCallIds.filter((toolCallId) => !known.has(toolCallId)),\n ];\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row:\n stored.row.state === \"unknown\" ? stored.row : { ...stored.row, state: \"unknown\" },\n unknownMark: { reason: existing?.reason ?? request.reason, toolCallIds: merged },\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const recordUnknownResolution: SubmissionLedger[\"Service\"][\"recordUnknownResolution\"] =\n Effect.fn(\"MemorySubmissionLedger.recordUnknownResolution\")((unvalidated) =>\n Effect.gen(function* () {\n const command = yield* validate(\n UnknownResolutionCommand,\n \"recordUnknownResolution\",\n unvalidated,\n );\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<\n UnknownResolutionIntent,\n UnknownResolutionConflict | SettlementConflict | LedgerError\n >,\n LedgerState,\n ] => {\n const stored = current.submissions.get(command.submissionId);\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\n \"recordUnknownResolution\",\n `Unknown Submission ${command.submissionId}`,\n ),\n ),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"recordUnknownResolution\",\n `Settled Submission ${command.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n return [\n failure(\n SettlementConflict.make({\n submissionId: command.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n const existing = stored.unknownResolutions.get(command.toolCallId);\n if (\n existing !== undefined &&\n !equivalentUnknownResolution(existing.intent.resolution, command.resolution)\n ) {\n return [\n failure(\n UnknownResolutionConflict.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n }),\n ),\n current,\n ];\n }\n const intent =\n existing?.intent ??\n UnknownResolutionIntent.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n author: command.author,\n reason: command.reason,\n resolution: command.resolution,\n resolvedAt: utc(nowMillis),\n });\n const unknownResolutions =\n existing !== undefined\n ? stored.unknownResolutions\n : new Map(stored.unknownResolutions).set(command.toolCallId, {\n intent,\n });\n // The lane reopens only when EVERY marked open call has a durable resolution\n // intent: unknown → input-applied (DUR-017). Replays re-run the coverage check so\n // a recovering caller can wake the lane idempotently.\n const wakes =\n stored.row.state === \"unknown\" &&\n stored.unknownMark !== undefined &&\n stored.unknownMark.toolCallIds.every((toolCallId) =>\n unknownResolutions.has(toolCallId),\n );\n return [\n success(intent),\n withSubmission(current, {\n ...stored,\n row: wakes ? { ...stored.row, state: \"input-applied\" } : stored.row,\n unknownMark: wakes ? undefined : stored.unknownMark,\n unknownResolutions,\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const recordChildSettled: SubmissionLedger[\"Service\"][\"recordChildSettled\"] = Effect.fn(\n \"MemorySubmissionLedger.recordChildSettled\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n ChildSettledNotification,\n \"recordChildSettled\",\n unvalidated,\n );\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<ChildSettledOutcome, LedgerError>, LedgerState] => {\n const parent = current.submissions.get(request.parentSubmissionId);\n if (parent === undefined) {\n return [\n failure(\n ledgerError(\n \"recordChildSettled\",\n `Unknown Submission ${request.parentSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n // The caller may notify after the canonical Settlement append but before ledger\n // finalization. In a single store, an exact reservation plus `terminalizing` is the\n // narrow durable prefix that makes that ordering admissible; earlier states remain\n // a caller error.\n const child = current.submissions.get(request.childSubmissionId);\n const announced =\n child !== undefined &&\n (child.row.state === \"settled\" ||\n (child.row.state === \"terminalizing\" && child.reservation !== undefined));\n if (!announced) {\n return [\n failure(\n ledgerError(\n \"recordChildSettled\",\n `Child Submission ${request.childSubmissionId} has no recorded settlement`,\n ),\n ),\n current,\n ];\n }\n if (\n parent.row.state !== \"suspended\" ||\n parent.suspension === undefined ||\n parent.suspension.reason._tag !== \"WaitingForChild\"\n ) {\n return [success(\"not-waiting\" as const), current];\n }\n const children = parent.suspension.reason.children;\n if (!children.some((entry) => entry.childSubmissionId === request.childSubmissionId)) {\n return [success(\"not-waiting\" as const), current];\n }\n // Every listed child must be either finalized or canonically announced from the\n // exact terminalizing reservation. Replays re-run this coverage check idempotently.\n const allSettled = children.every((entry) => {\n const listed = current.submissions.get(entry.childSubmissionId);\n return (\n listed?.row.state === \"settled\" ||\n (listed?.row.state === \"terminalizing\" && listed.reservation !== undefined)\n );\n });\n if (!allSettled) return [success(\"still-waiting\" as const), current];\n return [\n success(\"woken\" as const),\n withSubmission(current, {\n ...parent,\n row: { ...parent.row, state: \"input-applied\" },\n suspension: undefined,\n }),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const reserveChildBudget: SubmissionLedger[\"Service\"][\"reserveChildBudget\"] = Effect.fn(\n \"MemorySubmissionLedger.reserveChildBudget\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n ChildBudgetReservationRequest,\n \"reserveChildBudget\",\n unvalidated,\n );\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ReservedChildBudget, ChildReservationConflict | OwnershipLost | LedgerError>,\n LedgerState,\n ] => {\n const existing = current.childReservations.get(request.reservationId);\n if (existing !== undefined) {\n // Identical replays short-circuit before the fence, mirroring reserveSettlement:\n // a replay creates nothing, so a recovering caller resumes rather than duplicates.\n const identical =\n existing.parentSubmissionId === request.parentSubmissionId &&\n existing.parentToolCallId === request.parentToolCallId &&\n existing.allocationDigest === request.allocationDigest &&\n equivalentPersistedJson(existing.allocation, request.allocation);\n if (!identical) {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: existing.status,\n message:\n \"A reservation with this identity exists with a different parent Tool Call or allocation.\",\n }),\n ),\n current,\n ];\n }\n return [\n success(\n ReservedChildBudget.make({\n reservation: toReservationSnapshot(existing),\n replayed: true,\n }),\n ),\n current,\n ];\n }\n for (const reservation of current.childReservations.values()) {\n if (\n reservation.parentSubmissionId === request.parentSubmissionId &&\n reservation.parentToolCallId === request.parentToolCallId\n ) {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message: `Parent Tool Call ${request.parentToolCallId} already owns reservation ${reservation.reservationId}.`,\n }),\n ),\n current,\n ];\n }\n }\n const parent = current.submissions.get(request.parentSubmissionId);\n if (parent === undefined) {\n return [\n failure(\n ledgerError(\n \"reserveChildBudget\",\n `Unknown Submission ${request.parentSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n // Creation is fenced by the parent lane's live ownership (spec §12 step 2): a stale\n // parent Attempt can never create new reservation state.\n if (!ownsLane(parent, request.ownershipToken)) {\n return [failure(ownershipLost(current, parent)), current];\n }\n const reservation: StoredChildReservation = {\n reservationId: request.reservationId,\n parentSubmissionId: request.parentSubmissionId,\n parentToolCallId: request.parentToolCallId,\n childSubmissionId: undefined,\n status: \"reserved\",\n allocation: request.allocation,\n allocationDigest: request.allocationDigest,\n accounting: undefined,\n reservedAtMillis: nowMillis,\n releaseBeganAtMillis: undefined,\n releasedAtMillis: undefined,\n };\n return [\n success(\n ReservedChildBudget.make({\n reservation: toReservationSnapshot(reservation),\n replayed: false,\n }),\n ),\n withChildReservation(current, reservation),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const attachChildToReservation: SubmissionLedger[\"Service\"][\"attachChildToReservation\"] =\n Effect.fn(\"MemorySubmissionLedger.attachChildToReservation\")((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n AttachChildToReservationRequest,\n \"attachChildToReservation\",\n unvalidated,\n );\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<\n ChildBudgetReservationSnapshot,\n ChildReservationConflict | OwnershipLost | LedgerError\n >,\n LedgerState,\n ] => {\n const reservation = current.childReservations.get(request.reservationId);\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"attachChildToReservation\",\n `Unknown child reservation ${request.reservationId}`,\n ),\n ),\n current,\n ];\n }\n if (reservation.childSubmissionId !== undefined) {\n // Idempotent replay of the recorded attachment (unfenced — it mutates nothing).\n if (reservation.childSubmissionId === request.childSubmissionId) {\n return [success(toReservationSnapshot(reservation)), current];\n }\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message: `Reservation ${request.reservationId} already records child ${reservation.childSubmissionId}.`,\n }),\n ),\n current,\n ];\n }\n const parent = current.submissions.get(reservation.parentSubmissionId);\n if (parent === undefined) {\n return [\n failure(\n ledgerError(\n \"attachChildToReservation\",\n `Unknown Submission ${reservation.parentSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n if (!ownsLane(parent, request.ownershipToken)) {\n return [failure(ownershipLost(current, parent)), current];\n }\n if (reservation.status !== \"reserved\") {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message: `Cannot attach a child to a ${reservation.status} reservation.`,\n }),\n ),\n current,\n ];\n }\n // Single-store latitude: the admitted child must exist here, so a dangling\n // attachment can never enter the recovery view.\n if (!current.submissions.has(request.childSubmissionId)) {\n return [\n failure(\n ledgerError(\n \"attachChildToReservation\",\n `Unknown child Submission ${request.childSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n const attached: StoredChildReservation = {\n ...reservation,\n childSubmissionId: request.childSubmissionId,\n };\n return [\n success(toReservationSnapshot(attached)),\n withChildReservation(current, attached),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const beginChildBudgetRelease: SubmissionLedger[\"Service\"][\"beginChildBudgetRelease\"] =\n Effect.fn(\"MemorySubmissionLedger.beginChildBudgetRelease\")((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n BeginChildBudgetReleaseRequest,\n \"beginChildBudgetRelease\",\n unvalidated,\n );\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ChildBudgetReservationSnapshot, ChildReservationConflict | LedgerError>,\n LedgerState,\n ] => {\n const reservation = current.childReservations.get(request.reservationId);\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"beginChildBudgetRelease\",\n `Unknown child reservation ${request.reservationId}`,\n ),\n ),\n current,\n ];\n }\n if (reservation.status !== \"reserved\") {\n // The accounting decision was already frozen exactly once; an identical replay is\n // a no-op and a divergent decision conflicts (spec §12 join step 6).\n if (\n reservation.accounting !== undefined &&\n equivalentPersistedJson(reservation.accounting, request.accounting)\n ) {\n return [success(toReservationSnapshot(reservation)), current];\n }\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message:\n \"A different accounting decision is already frozen for this reservation.\",\n }),\n ),\n current,\n ];\n }\n const frozen: StoredChildReservation = {\n ...reservation,\n status: \"releasePending\",\n accounting: request.accounting,\n releaseBeganAtMillis: nowMillis,\n };\n return [\n success(toReservationSnapshot(frozen)),\n withChildReservation(current, frozen),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const releaseChildBudget: SubmissionLedger[\"Service\"][\"releaseChildBudget\"] = Effect.fn(\n \"MemorySubmissionLedger.releaseChildBudget\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n ReleaseChildBudgetRequest,\n \"releaseChildBudget\",\n unvalidated,\n );\n const nowMillis = yield* Clock.currentTimeMillis;\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ChildBudgetReservationSnapshot, ChildReservationConflict | LedgerError>,\n LedgerState,\n ] => {\n const reservation = current.childReservations.get(request.reservationId);\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"releaseChildBudget\",\n `Unknown child reservation ${request.reservationId}`,\n ),\n ),\n current,\n ];\n }\n // Applied exactly once: replaying a released reservation returns the stored row\n // unchanged (spec §12: \"never available twice\").\n if (reservation.status === \"released\") {\n return [success(toReservationSnapshot(reservation)), current];\n }\n if (reservation.status !== \"releasePending\") {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message:\n \"Cannot release a reservation whose accounting decision is not frozen.\",\n }),\n ),\n current,\n ];\n }\n const released: StoredChildReservation = {\n ...reservation,\n status: \"released\",\n releasedAtMillis: nowMillis,\n };\n return [\n success(toReservationSnapshot(released)),\n withChildReservation(current, released),\n ];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.value;\n }),\n );\n\n const scanNonterminal: SubmissionLedger[\"Service\"][\"scanNonterminal\"] = Stream.unwrap(\n Ref.get(state).pipe(\n Effect.map((current) => {\n const snapshots = [...current.submissions.values()]\n .filter((stored) => stored.row.state !== \"settled\")\n .sort((left, right) =>\n left.row.threadId < right.row.threadId\n ? -1\n : left.row.threadId > right.row.threadId\n ? 1\n : left.row.queueSequence - right.row.queueSequence,\n )\n .map((stored) => toSnapshot(stored.row));\n return Stream.fromIterable(snapshots);\n }),\n ),\n );\n\n const loadRecoverySnapshot: SubmissionLedger[\"Service\"][\"loadRecoverySnapshot\"] = Effect.fn(\n \"MemorySubmissionLedger.loadRecoverySnapshot\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n RecoverySnapshotRequest,\n \"loadRecoverySnapshot\",\n unvalidated,\n );\n const current = yield* Ref.get(state);\n const stored = current.submissions.get(request.submissionId);\n if (stored === undefined) {\n return yield* ledgerError(\n \"loadRecoverySnapshot\",\n `Unknown Submission ${request.submissionId}`,\n );\n }\n const joins = [...current.submissions.values()]\n .filter((candidate) => candidate.joinedHostSubmissionId === request.submissionId)\n .sort((left, right) => left.row.queueSequence - right.row.queueSequence)\n .map((candidate) =>\n JoinSnapshot.make({\n submissionId: candidate.row.submissionId,\n state: candidate.row.state,\n hostSubmissionId: request.submissionId,\n }),\n );\n const byToolCallId = <A extends { readonly toolCallId: ToolCallId }>(\n left: A,\n right: A,\n ): number =>\n left.toolCallId < right.toolCallId ? -1 : left.toolCallId > right.toolCallId ? 1 : 0;\n // Parent-side subagent view: this Submission's child budget reservations in parent Tool\n // Call order, plus each attached child's current lane state (a disposable derived view;\n // the canonical records stay the recovery truth, DUR-015).\n const childReservations = [...current.childReservations.values()]\n .filter((reservation) => reservation.parentSubmissionId === request.submissionId)\n .sort((left, right) =>\n left.parentToolCallId < right.parentToolCallId\n ? -1\n : left.parentToolCallId > right.parentToolCallId\n ? 1\n : 0,\n );\n const childAttachments: Array<ChildAttachmentSnapshot> = [];\n for (const reservation of childReservations) {\n if (reservation.childSubmissionId === undefined) continue;\n const child = current.submissions.get(reservation.childSubmissionId);\n if (child === undefined) continue;\n childAttachments.push(\n ChildAttachmentSnapshot.make({\n toolCallId: reservation.parentToolCallId,\n childSubmissionId: reservation.childSubmissionId,\n childState: child.row.state,\n ...(child.row.settledOutcome === undefined\n ? {}\n : { childOutcome: child.row.settledOutcome }),\n }),\n );\n }\n return RecoverySnapshot.make({\n submission: toSnapshot(stored.row),\n joins,\n approvalDecisions: [...stored.approvalDecisions.values()].sort(byToolCallId),\n unknownResolutions: [...stored.unknownResolutions.values()]\n .map((resolution) => resolution.intent)\n .sort(byToolCallId),\n childReservations: childReservations.map(toReservationSnapshot),\n childAttachments,\n ...(stored.row.parentLinkage === undefined\n ? {}\n : { parentLinkage: stored.row.parentLinkage }),\n ...(stored.joinedHostSubmissionId === undefined\n ? {}\n : { hostSubmissionId: stored.joinedHostSubmissionId }),\n ...(stored.suspension === undefined\n ? {}\n : {\n suspension: SuspensionSnapshot.make({\n reason: stored.suspension.reason,\n suspendedAt: utc(stored.suspension.suspendedAtMillis),\n }),\n }),\n ...(stored.ownership === undefined\n ? {}\n : {\n ownership: OwnershipSnapshot.make({\n attemptId: stored.ownership.attemptId,\n ownerProducerId: stored.ownership.ownerProducerId,\n producerEpoch: stored.ownership.producerEpoch,\n leaseExpiresAt: utc(stored.ownership.leaseExpiresAtMillis),\n }),\n }),\n ...(stored.inputApplied === undefined ? {} : { inputApplied: stored.inputApplied }),\n ...(stored.reservation === undefined\n ? {}\n : {\n reservation: SettlementReservationSnapshot.make({\n settlementId: stored.reservation.settlementId,\n outcome: stored.reservation.outcome,\n record: stored.reservation.record,\n recordDigest: stored.reservation.recordDigest,\n finalized: stored.reservation.finalizedAtMillis !== undefined,\n }),\n }),\n ...(stored.abortIntent === undefined ? {} : { abortIntent: stored.abortIntent }),\n });\n }),\n );\n\n return SubmissionLedger.of({\n capabilities,\n admit,\n markReady,\n lookup,\n resolveAdmission,\n claim,\n renewOwnership,\n releaseOwnership,\n markInputApplied,\n reserveSettlement,\n finalizeSettlement,\n requestAbort,\n claimJoining,\n markJoined,\n revertJoining,\n suspend,\n recordApprovalDecision,\n markUnknown,\n recordUnknownResolution,\n recordChildSettled,\n reserveChildBudget,\n attachChildToReservation,\n beginChildBudgetRelease,\n releaseChildBudget,\n scanNonterminal,\n loadRecoverySnapshot,\n });\n });\n\n/** Construction options for the in-memory reference SubmissionLedger. */\nexport interface MemorySubmissionLedgerOptions {\n /**\n * Test-only fault seam for `resolveAdmission` (SUB-031): when the effect yields a reason,\n * the resolution answers `Indeterminate` with it instead of consulting the store — modelling\n * an authoritative child owner that is temporarily unreachable. `Option.none()` restores the\n * store-derived answer. Ledger state is never mutated by the fault.\n */\n readonly resolveAdmissionFault?: Effect.Effect<Option.Option<string>>;\n}\n\n/**\n * In-memory reference SubmissionLedger Layer (durability `non-durable`). All state lives in one\n * `Ref` owned by the Layer's Scope; no daemon fibers are spawned and no wall clock is consulted.\n */\nexport const memorySubmissionLedgerLayer = (\n options: MemorySubmissionLedgerOptions = {},\n): Layer.Layer<SubmissionLedger> => Layer.effect(SubmissionLedger, makeSubmissionLedger(options));\n\nexport const MemorySubmissionLedgerLive: Layer.Layer<SubmissionLedger> =\n memorySubmissionLedgerLayer();\n","import {\n ScheduleCapacityError,\n ScheduleDueCursor,\n defaultSchedulingLimits,\n scheduleUsesCapacity,\n ScheduleChange,\n ScheduleConflict,\n ScheduleFailpoint,\n ScheduleKey,\n ScheduleNotFound,\n ScheduleOwner,\n SchedulePageRequest,\n ScheduleRecord,\n ScheduleStorageError,\n ScheduleStore,\n applyScheduleChange,\n compareScheduleKeys,\n compareScheduleNames,\n scheduleDeadline,\n scheduleKeyString,\n scheduleKeyOf,\n scheduleOwnerKey,\n} from \"@effect-agent/thread\";\nimport { Effect, Layer, Ref, Result, Schema } from \"effect\";\n\ninterface MemoryScheduleState {\n readonly records: ReadonlyMap<string, string>;\n}\n\nconst storageError = (operation: string, reason: \"unavailable\" | \"corrupt\") =>\n ScheduleStorageError.make({ operation, reason });\n\nconst encodeRecord = (operation: string, record: ScheduleRecord) =>\n Effect.try({\n try: () => Schema.encodeSync(Schema.fromJsonString(ScheduleRecord))(record),\n catch: () => storageError(operation, \"corrupt\"),\n });\n\nconst decodeRecord = (operation: string, encoded: string) =>\n Effect.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(encoded),\n catch: () => storageError(operation, \"corrupt\"),\n });\n\nconst decodeInput = <A, I>(operation: string, schema: Schema.Codec<A, I>, value: unknown) =>\n Effect.try({\n try: () => Schema.decodeUnknownSync(schema)(value),\n catch: () => storageError(operation, \"corrupt\"),\n });\n\nconst sameOwner = (record: ScheduleRecord, owner: ScheduleOwner): boolean =>\n scheduleOwnerKey(record.owner) === scheduleOwnerKey(owner);\n\nconst makeScheduleStore = Effect.gen(function* () {\n const state = yield* Ref.make<MemoryScheduleState>({ records: new Map() });\n const failpoint = yield* ScheduleFailpoint;\n\n const insert: ScheduleStore[\"Service\"][\"insert\"] = Effect.fn(\"MemoryScheduleStore.insert\")(\n (record, ownerLimit) =>\n Effect.gen(function* () {\n const encoded = yield* encodeRecord(\"insert\", record);\n yield* failpoint.hit(\"schedule:insert:before\");\n const decision = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<\n ScheduleRecord,\n ScheduleConflict | ScheduleCapacityError | ScheduleStorageError\n >,\n MemoryScheduleState,\n ] => {\n const key = scheduleKeyString(record);\n const existingText = current.records.get(key);\n if (existingText !== undefined) {\n const decoded = Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(existingText),\n catch: () => storageError(\"insert\", \"corrupt\"),\n });\n if (Result.isFailure(decoded)) {\n return [Result.fail(decoded.failure), current];\n }\n if (decoded.success.creationFingerprint === record.creationFingerprint) {\n return [Result.succeed(decoded.success), current];\n }\n return [\n Result.fail(\n ScheduleConflict.make({ reason: \"creation\", key: scheduleKeyOf(record) }),\n ),\n current,\n ];\n }\n\n let ownerCount = 0;\n for (const text of current.records.values()) {\n const decoded = Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(text),\n catch: () => storageError(\"insert\", \"corrupt\"),\n });\n if (Result.isFailure(decoded)) {\n return [Result.fail(decoded.failure), current];\n }\n if (\n sameOwner(decoded.success, record.owner) &&\n scheduleUsesCapacity(decoded.success)\n )\n ownerCount += 1;\n }\n if (ownerCount >= ownerLimit) {\n return [Result.fail(ScheduleCapacityError.make({ limit: ownerLimit })), current];\n }\n const records = new Map(current.records);\n records.set(key, encoded);\n const next = { records };\n return [Result.succeed(record), next];\n },\n ),\n );\n const inserted = yield* Effect.fromResult(decision);\n yield* failpoint.hit(\"schedule:insert:after\");\n return yield* decodeRecord(\"insert\", yield* encodeRecord(\"insert\", inserted));\n }),\n );\n\n const get: ScheduleStore[\"Service\"][\"get\"] = Effect.fn(\"MemoryScheduleStore.get\")(\n function* (key) {\n const decodedKey = yield* decodeInput(\"get\", ScheduleKey, key);\n const text = (yield* Ref.get(state)).records.get(scheduleKeyString(decodedKey));\n return text === undefined ? null : yield* decodeRecord(\"get\", text);\n },\n );\n\n const list: ScheduleStore[\"Service\"][\"list\"] = Effect.fn(\"MemoryScheduleStore.list\")(\n function* (request) {\n const decodedRequest = yield* decodeInput(\"list\", SchedulePageRequest, request);\n const records: Array<ScheduleRecord> = [];\n for (const text of (yield* Ref.get(state)).records.values()) {\n const record = yield* decodeRecord(\"list\", text);\n if (\n sameOwner(record, decodedRequest.owner) &&\n (decodedRequest.after === undefined ||\n compareScheduleNames(record.scheduleId, decodedRequest.after) > 0)\n ) {\n records.push(record);\n }\n }\n records.sort((left, right) => compareScheduleNames(left.scheduleId, right.scheduleId));\n const hasNext = records.length > decodedRequest.limit;\n const items = records.slice(0, decodedRequest.limit);\n return {\n items,\n next: hasNext ? (items.at(-1)?.scheduleId ?? null) : null,\n };\n },\n );\n\n const change: ScheduleStore[\"Service\"][\"change\"] = Effect.fn(\"MemoryScheduleStore.change\")(\n (key, command, ownerLimit = defaultSchedulingLimits.maxSchedulesPerOwner) =>\n Effect.gen(function* () {\n const decodedKey = yield* decodeInput(\"change\", ScheduleKey, key);\n const decodedCommand = yield* decodeInput(\"change\", ScheduleChange, command);\n yield* failpoint.hit(`schedule:${decodedCommand._tag.toLowerCase()}:before`);\n const decision = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<\n ScheduleRecord,\n ScheduleConflict | ScheduleStorageError | ScheduleNotFound | ScheduleCapacityError\n >,\n MemoryScheduleState,\n ] => {\n const storageKey = scheduleKeyString(decodedKey);\n const text = current.records.get(storageKey);\n if (text === undefined) {\n return [Result.fail(ScheduleNotFound.make({ key: decodedKey })), current];\n }\n const decoded = Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(text),\n catch: () => storageError(\"change\", \"corrupt\"),\n });\n if (Result.isFailure(decoded)) {\n return [Result.fail(decoded.failure), current];\n }\n const applied = applyScheduleChange(decoded.success, decodedCommand);\n if (Result.isFailure(applied)) {\n return [Result.fail(applied.failure), current];\n }\n if (applied.success === decoded.success) {\n return [Result.succeed(decoded.success), current];\n }\n if (!scheduleUsesCapacity(decoded.success) && scheduleUsesCapacity(applied.success)) {\n let count = 0;\n for (const text of current.records.values()) {\n const candidate = Schema.decodeUnknownResult(\n Schema.fromJsonString(ScheduleRecord),\n )(text);\n if (Result.isFailure(candidate))\n return [Result.fail(storageError(\"change\", \"corrupt\")), current];\n if (\n sameOwner(candidate.success, decodedKey.owner) &&\n scheduleUsesCapacity(candidate.success)\n )\n count += 1;\n }\n if (count >= ownerLimit)\n return [Result.fail(ScheduleCapacityError.make({ limit: ownerLimit })), current];\n }\n const encoded = Result.try({\n try: () =>\n Schema.encodeSync(Schema.fromJsonString(ScheduleRecord))(applied.success),\n catch: () => storageError(\"change\", \"corrupt\"),\n });\n if (Result.isFailure(encoded)) {\n return [Result.fail(encoded.failure), current];\n }\n const records = new Map(current.records);\n records.set(storageKey, encoded.success);\n const next = { records };\n return [Result.succeed(applied.success), next];\n },\n ),\n );\n const changed = yield* Effect.fromResult(decision);\n yield* failpoint.hit(`schedule:${decodedCommand._tag.toLowerCase()}:after`);\n return yield* decodeRecord(\"change\", yield* encodeRecord(\"change\", changed));\n }),\n );\n\n const due: ScheduleStore[\"Service\"][\"due\"] = Effect.fn(\"MemoryScheduleStore.due\")(\n function* (nowMillis, limit, owner, after) {\n const decodedOwner =\n owner === undefined ? undefined : yield* decodeInput(\"due\", ScheduleOwner, owner);\n const cursor =\n after === undefined ? undefined : yield* decodeInput(\"due\", ScheduleDueCursor, after);\n const records: Array<ScheduleDueCursor> = [];\n for (const text of (yield* Ref.get(state)).records.values()) {\n const record = yield* decodeRecord(\"due\", text);\n const deadline = scheduleDeadline(record);\n if (\n deadline !== null &&\n deadline <= nowMillis &&\n (decodedOwner === undefined || sameOwner(record, decodedOwner)) &&\n (cursor === undefined ||\n deadline > cursor.deadlineAtMillis ||\n (deadline === cursor.deadlineAtMillis && compareScheduleKeys(record, cursor) > 0))\n ) {\n records.push({ ...scheduleKeyOf(record), deadlineAtMillis: deadline });\n }\n }\n records.sort((left, right) => {\n const byDeadline = left.deadlineAtMillis - right.deadlineAtMillis;\n return byDeadline !== 0 ? byDeadline : compareScheduleKeys(left, right);\n });\n return records.slice(0, limit);\n },\n );\n\n const nextDeadline: ScheduleStore[\"Service\"][\"nextDeadline\"] = Effect.fn(\n \"MemoryScheduleStore.nextDeadline\",\n )(function* (owner) {\n const decodedOwner =\n owner === undefined ? undefined : yield* decodeInput(\"nextDeadline\", ScheduleOwner, owner);\n let earliest: number | null = null;\n for (const text of (yield* Ref.get(state)).records.values()) {\n const record = yield* decodeRecord(\"nextDeadline\", text);\n if (decodedOwner !== undefined && !sameOwner(record, decodedOwner)) continue;\n const deadline = scheduleDeadline(record);\n if (deadline !== null && (earliest === null || deadline < earliest)) earliest = deadline;\n }\n return earliest;\n });\n\n return ScheduleStore.of({ insert, get, list, change, due, nextDeadline });\n});\n\nexport const memoryScheduleStoreLayer = (): Layer.Layer<ScheduleStore> =>\n Layer.effect(ScheduleStore, makeScheduleStore);\n\nexport const MemoryScheduleStoreLive: Layer.Layer<ScheduleStore> = memoryScheduleStoreLayer();\n","import {\n AcceptedEvent,\n applySubscriptionDeliveryChange,\n compareScheduleNames,\n DeliveryChange,\n Digest,\n SourcePartition,\n SubscriptionDelivery,\n SubscriptionDeliveryKey,\n SubscriptionError,\n SubscriptionFailpoint,\n SubscriptionKey,\n SubscriptionLimits,\n SubscriptionName,\n SubscriptionRecord,\n SubscriptionScanCursors,\n SubscriptionStore,\n subscriptionCanSelect,\n subscriptionDeliveryCanSelect,\n subscriptionDeliveryKeyString,\n subscriptionKeyString,\n} from \"@effect-agent/thread\";\nimport { Clock, Effect, Layer, Ref, Result, Schema } from \"effect\";\n\ninterface MemorySubscriptionState {\n readonly sequence: number;\n readonly registrations: ReadonlyMap<string, string>;\n readonly events: ReadonlyMap<string, string>;\n readonly deliveries: ReadonlyMap<string, string>;\n readonly registrationIndex: ReadonlyMap<string, RegistrationIndex>;\n readonly candidateIndex: ReadonlyMap<string, ReadonlyArray<string>>;\n readonly ownerRegistrationCounts: ReadonlyMap<string, number>;\n readonly eventIndex: ReadonlyMap<string, EventIndex>;\n readonly deliveryIndex: ReadonlyMap<string, DeliveryIndex>;\n readonly ownerDeliveryCounts: ReadonlyMap<string, number>;\n readonly scanCursors: SubscriptionScanCursors;\n}\n\ninterface RegistrationIndex {\n readonly key: SubscriptionKey;\n readonly ordinal: number;\n readonly state: SubscriptionRecord[\"state\"];\n readonly recoveryAt: number | null;\n}\ninterface EventIndex {\n readonly routingComplete: boolean;\n readonly nextAttemptAtMillis: number;\n}\ninterface DeliveryIndex {\n readonly key: SubscriptionDeliveryKey;\n readonly state: SubscriptionDelivery[\"state\"];\n readonly nextAttemptAtMillis: number;\n}\n\nconst error = (reason: SubscriptionError[\"reason\"], code: string) =>\n SubscriptionError.make({ reason, code });\n\nconst samePartition = (left: SourcePartition, right: SourcePartition): boolean =>\n left.tenantId === right.tenantId && left.address === right.address;\n\nconst sameSource = (left: AcceptedEvent[\"source\"], right: AcceptedEvent[\"source\"]): boolean =>\n left.name === right.name && left.version === right.version;\n\nconst encode = <A, I>(\n schema: Schema.Codec<A, I>,\n value: A,\n code: string,\n): Result.Result<string, SubscriptionError> =>\n Result.try({\n try: () => Schema.encodeSync(Schema.fromJsonString(schema))(value),\n catch: () => error(\"corrupt\", code),\n });\n\nconst decode = <A, I>(\n schema: Schema.Codec<A, I>,\n value: string,\n code: string,\n): Result.Result<A, SubscriptionError> =>\n Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(schema))(value),\n catch: () => error(\"corrupt\", code),\n });\n\nconst decodeEffect = <A, I>(schema: Schema.Codec<A, I>, value: string, code: string) =>\n Effect.fromResult(decode(schema, value, code));\n\nconst validate = <A, I>(schema: Schema.Codec<A, I>, value: unknown, code: string) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => error(\"validation\", code)));\n\nconst jsonBytes = (value: unknown): number =>\n new TextEncoder().encode(JSON.stringify(value)).byteLength;\n\nconst sameDeliveryIdentity = (left: SubscriptionDelivery, right: SubscriptionDelivery): boolean =>\n subscriptionDeliveryKeyString(left.key) === subscriptionDeliveryKeyString(right.key) &&\n left.deliveryId === right.deliveryId &&\n left.source.name === right.source.name &&\n left.source.version === right.source.version &&\n left.threadId === right.threadId &&\n left.admissionKey === right.admissionKey &&\n left.subscriptionFingerprint === right.subscriptionFingerprint &&\n left.eventDigest === right.eventDigest;\n\nconst candidateIndexKey = (record: SubscriptionRecord): string =>\n JSON.stringify([\n record.configuration.source.name,\n record.configuration.source.version,\n record.configuration.matchingKey,\n ]);\nconst eventCandidateIndexKey = (event: AcceptedEvent): string =>\n JSON.stringify([event.source.name, event.source.version, event.matchingKey]);\n\nconst sameEventIdentity = (left: AcceptedEvent, right: AcceptedEvent): boolean =>\n samePartition(left.partition, right.partition) &&\n left.eventId === right.eventId &&\n sameSource(left.source, right.source) &&\n left.matchingKey === right.matchingKey &&\n left.payloadDigest === right.payloadDigest;\n\nconst deliveryBelongsTo = (\n delivery: SubscriptionDelivery,\n record: SubscriptionRecord,\n event: AcceptedEvent,\n): boolean =>\n subscriptionKeyString(delivery.key.subscription) === subscriptionKeyString(record.key) &&\n delivery.key.eventId === event.eventId &&\n sameSource(delivery.source, event.source);\n\nconst makeMemorySubscriptionStore = Effect.fn(\"makeMemorySubscriptionStore\")(function* (\n ownedPartition: SourcePartition,\n) {\n const partition = yield* validate(SourcePartition, ownedPartition, \"partition\");\n const state = yield* Ref.make<MemorySubscriptionState>({\n sequence: 0,\n registrations: new Map(),\n events: new Map(),\n deliveries: new Map(),\n registrationIndex: new Map(),\n candidateIndex: new Map(),\n ownerRegistrationCounts: new Map(),\n eventIndex: new Map(),\n deliveryIndex: new Map(),\n ownerDeliveryCounts: new Map(),\n scanCursors: { events: \"\", deliveries: \"\", recovery: 0 },\n });\n const failpoint = yield* SubscriptionFailpoint;\n\n const requirePartition = <A extends { readonly partition: SourcePartition }>(\n value: A,\n code: string,\n ) =>\n samePartition(value.partition, partition)\n ? Effect.succeed(value)\n : Effect.fail(error(\"validation\", code));\n\n const requireKey = (key: SubscriptionKey, code: string) =>\n validate(SubscriptionKey, key, code).pipe(\n Effect.flatMap((decoded) => requirePartition(decoded, code)),\n );\n\n const register: SubscriptionStore[\"Service\"][\"register\"] = Effect.fn(\n \"MemorySubscriptionStore.register\",\n )(function* (input, inputLimits) {\n const record = yield* validate(SubscriptionRecord, input, \"register-record\");\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"register-limits\");\n yield* requirePartition(record.key, \"register-partition\");\n yield* failpoint.hit(\"subscription:register:before\");\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<SubscriptionRecord, SubscriptionError>,\n MemorySubscriptionState,\n ] => {\n const key = subscriptionKeyString(record.key);\n const existingText = current.registrations.get(key);\n if (existingText !== undefined) {\n const existing = decode(SubscriptionRecord, existingText, \"register-existing\");\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n return existing.success.creationFingerprint === record.creationFingerprint\n ? [Result.succeed(existing.success), current]\n : [Result.fail(error(\"conflict\", \"registration-identity\")), current];\n }\n if (jsonBytes(record.configuration.context) > limits.maxContextBytes)\n return [Result.fail(error(\"capacity\", \"context-bytes\")), current];\n if (jsonBytes(record.configuration.parameters) > limits.maxPayloadBytes)\n return [Result.fail(error(\"capacity\", \"parameters-bytes\")), current];\n if (\n record.configuration.expiresAtMillis - record.createdAtMillis >\n limits.maxLifetimeMillis\n )\n return [Result.fail(error(\"capacity\", \"lifetime\")), current];\n if (current.registrations.size >= limits.maxRegistrations)\n return [Result.fail(error(\"capacity\", \"registrations\")), current];\n const ownerCount = current.ownerRegistrationCounts.get(record.key.ownerId) ?? 0;\n if (ownerCount >= limits.maxRegistrationsPerOwner)\n return [Result.fail(error(\"capacity\", \"owner-registrations\")), current];\n const assigned = { ...record, ordinal: current.sequence + 1 };\n const encoded = encode(SubscriptionRecord, assigned, \"register-encode\");\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const registrations = new Map(current.registrations);\n registrations.set(key, encoded.success);\n const registrationIndex = new Map(current.registrationIndex);\n registrationIndex.set(key, {\n key: assigned.key,\n ordinal: assigned.ordinal,\n state: assigned.state,\n recoveryAt: assigned.recovery?.nextAttemptAtMillis ?? null,\n });\n const candidateIndex = new Map(current.candidateIndex);\n const candidateKey = candidateIndexKey(assigned);\n candidateIndex.set(candidateKey, [...(candidateIndex.get(candidateKey) ?? []), key]);\n const ownerRegistrationCounts = new Map(current.ownerRegistrationCounts);\n ownerRegistrationCounts.set(assigned.key.ownerId, ownerCount + 1);\n return [\n Result.succeed(assigned),\n {\n ...current,\n sequence: assigned.ordinal,\n registrations,\n registrationIndex,\n candidateIndex,\n ownerRegistrationCounts,\n },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:register:after\");\n return result;\n });\n\n const get: SubscriptionStore[\"Service\"][\"get\"] = Effect.fn(\"MemorySubscriptionStore.get\")(\n function* (input) {\n const key = yield* requireKey(input, \"get-key\");\n const text = (yield* Ref.get(state)).registrations.get(subscriptionKeyString(key));\n return text === undefined\n ? null\n : yield* decodeEffect(SubscriptionRecord, text, \"get-record\");\n },\n );\n\n const list: SubscriptionStore[\"Service\"][\"list\"] = Effect.fn(\"MemorySubscriptionStore.list\")(\n function* (ownerId, after, limit) {\n if (!Number.isSafeInteger(after) || after < 0 || !Number.isSafeInteger(limit) || limit <= 0)\n return yield* error(\"validation\", \"list-page\");\n const current = yield* Ref.get(state);\n const records: Array<SubscriptionRecord> = [];\n for (const [storageKey, indexed] of current.registrationIndex) {\n if (indexed.key.ownerId !== ownerId || indexed.ordinal <= after) continue;\n const text = current.registrations.get(storageKey);\n if (text === undefined) return yield* error(\"corrupt\", \"list-index\");\n records.push(yield* decodeEffect(SubscriptionRecord, text, \"list-record\"));\n }\n records.sort((a, b) => a.ordinal - b.ordinal);\n return records.slice(0, limit);\n },\n );\n\n const cancel: SubscriptionStore[\"Service\"][\"cancel\"] = Effect.fn(\n \"MemorySubscriptionStore.cancel\",\n )(function* (input) {\n const key = yield* requireKey(input, \"cancel-key\");\n yield* failpoint.hit(\"subscription:cancel:before\");\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<SubscriptionRecord, SubscriptionError>,\n MemorySubscriptionState,\n ] => {\n const storageKey = subscriptionKeyString(key);\n const text = current.registrations.get(storageKey);\n if (text === undefined) return [Result.fail(error(\"not-found\", \"subscription\")), current];\n const decoded = decode(SubscriptionRecord, text, \"cancel-record\");\n if (Result.isFailure(decoded)) return [decoded, current];\n if (decoded.success.state === \"cancelled\")\n return [Result.succeed(decoded.success), current];\n const cancelled = { ...decoded.success, state: \"cancelled\" as const, recovery: null };\n const encoded = encode(SubscriptionRecord, cancelled, \"cancel-encode\");\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const registrations = new Map(current.registrations);\n registrations.set(storageKey, encoded.success);\n const registrationIndex = new Map(current.registrationIndex);\n const indexed = registrationIndex.get(storageKey);\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"cancel-index\")), current];\n registrationIndex.set(storageKey, { ...indexed, state: \"cancelled\", recoveryAt: null });\n return [Result.succeed(cancelled), { ...current, registrations, registrationIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:cancel:after\");\n return result;\n });\n\n const accept: SubscriptionStore[\"Service\"][\"accept\"] = Effect.fn(\n \"MemorySubscriptionStore.accept\",\n )(function* (input, inputLimits) {\n const event = yield* validate(AcceptedEvent, input, \"accept-event\");\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"accept-limits\");\n yield* requirePartition(event, \"accept-partition\");\n yield* failpoint.hit(\"subscription:accept:before\");\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [Result.Result<AcceptedEvent, SubscriptionError>, MemorySubscriptionState] => {\n const existingText = current.events.get(event.eventId);\n if (existingText !== undefined) {\n const existing = decode(AcceptedEvent, existingText, \"accept-existing\");\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n return sameEventIdentity(existing.success, event)\n ? [Result.succeed(existing.success), current]\n : [Result.fail(error(\"conflict\", \"event-identity\")), current];\n }\n if (jsonBytes(event.payload) > limits.maxPayloadBytes)\n return [Result.fail(error(\"capacity\", \"payload-bytes\")), current];\n if (current.events.size >= limits.maxEvents)\n return [Result.fail(error(\"capacity\", \"events\")), current];\n const accepted: AcceptedEvent = {\n ...event,\n cutoff: current.sequence + 1,\n cursor: 0,\n routingComplete: false,\n routingFailure: null,\n };\n const encoded = encode(AcceptedEvent, accepted, \"accept-encode\");\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const events = new Map(current.events);\n events.set(accepted.eventId, encoded.success);\n const eventIndex = new Map(current.eventIndex);\n eventIndex.set(accepted.eventId, {\n routingComplete: false,\n nextAttemptAtMillis: accepted.nextAttemptAtMillis,\n });\n return [\n Result.succeed(accepted),\n { ...current, sequence: accepted.cutoff, events, eventIndex },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:accept:after\");\n return result;\n });\n\n const event: SubscriptionStore[\"Service\"][\"event\"] = Effect.fn(\"MemorySubscriptionStore.event\")(\n function* (eventId) {\n const text = (yield* Ref.get(state)).events.get(eventId);\n return text === undefined ? null : yield* decodeEffect(AcceptedEvent, text, \"event-record\");\n },\n );\n\n const pendingEvents: SubscriptionStore[\"Service\"][\"pendingEvents\"] = Effect.fn(\n \"MemorySubscriptionStore.pendingEvents\",\n )(function* (nowMillis, after, limit) {\n const events: Array<string> = [];\n for (const [eventId, indexed] of (yield* Ref.get(state)).eventIndex) {\n if (\n !indexed.routingComplete &&\n indexed.nextAttemptAtMillis <= nowMillis &&\n compareScheduleNames(eventId, after) > 0\n )\n events.push(eventId);\n }\n events.sort(compareScheduleNames);\n return events.slice(0, limit);\n });\n\n const candidates: SubscriptionStore[\"Service\"][\"candidates\"] = Effect.fn(\n \"MemorySubscriptionStore.candidates\",\n )(function* (input, limit) {\n const accepted = yield* validate(AcceptedEvent, input, \"candidates-event\");\n yield* requirePartition(accepted, \"candidates-partition\");\n const stored = yield* event(accepted.eventId);\n if (stored === null || !sameEventIdentity(stored, accepted))\n return yield* error(stored === null ? \"not-found\" : \"conflict\", \"event\");\n const current = yield* Ref.get(state);\n const records: Array<SubscriptionRecord> = [];\n for (const storageKey of current.candidateIndex.get(eventCandidateIndexKey(stored)) ?? []) {\n const indexed = current.registrationIndex.get(storageKey);\n if (indexed === undefined) return yield* error(\"corrupt\", \"candidate-index\");\n if (indexed.ordinal <= stored.cursor || indexed.ordinal > stored.cutoff) continue;\n const text = current.registrations.get(storageKey);\n if (text === undefined) return yield* error(\"corrupt\", \"candidate-record\");\n records.push(yield* decodeEffect(SubscriptionRecord, text, \"candidate-record\"));\n }\n records.sort((a, b) => a.ordinal - b.ordinal);\n return records.slice(0, limit);\n });\n\n const select: SubscriptionStore[\"Service\"][\"select\"] = Effect.fn(\n \"MemorySubscriptionStore.select\",\n )(function* (inputEvent, inputDeliveries, cursor, complete, nowMillis, inputLimits) {\n const suppliedEvent = yield* validate(AcceptedEvent, inputEvent, \"select-event\");\n const deliveries = yield* validate(\n Schema.Array(SubscriptionDelivery),\n inputDeliveries,\n \"select-deliveries\",\n );\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"select-limits\");\n yield* requirePartition(suppliedEvent, \"select-partition\");\n yield* failpoint.hit(\"subscription:select:before\");\n const effectiveNowMillis = Math.max(nowMillis, yield* Clock.currentTimeMillis);\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const eventText = current.events.get(suppliedEvent.eventId);\n if (eventText === undefined) return [Result.fail(error(\"not-found\", \"event\")), current];\n const decodedEvent = decode(AcceptedEvent, eventText, \"select-event-record\");\n if (Result.isFailure(decodedEvent)) return [Result.fail(decodedEvent.failure), current];\n const accepted = decodedEvent.success;\n if (\n !sameEventIdentity(accepted, suppliedEvent) ||\n suppliedEvent.cursor !== accepted.cursor\n )\n return [Result.fail(error(\"conflict\", \"event-cursor\")), current];\n if (accepted.routingComplete)\n return [\n complete && cursor === accepted.cursor\n ? Result.void\n : Result.fail(error(\"conflict\", \"routing-complete\")),\n current,\n ];\n if (!Number.isSafeInteger(cursor) || cursor < accepted.cursor || cursor > accepted.cutoff)\n return [Result.fail(error(\"validation\", \"cursor\")), current];\n\n const additions: Array<readonly [string, string]> = [];\n const updates: Array<readonly [string, string]> = [];\n const additionIndex: Array<readonly [string, DeliveryIndex, string]> = [];\n const registrationUpdates: Array<readonly [string, RegistrationIndex]> = [];\n const owners = new Map(current.ownerDeliveryCounts);\n for (const delivery of deliveries) {\n const recordText = current.registrations.get(\n subscriptionKeyString(delivery.key.subscription),\n );\n if (recordText === undefined)\n return [Result.fail(error(\"not-found\", \"subscription\")), current];\n const record = decode(SubscriptionRecord, recordText, \"select-registration\");\n if (Result.isFailure(record)) return [Result.fail(record.failure), current];\n if (\n !deliveryBelongsTo(delivery, record.success, accepted) ||\n !subscriptionDeliveryCanSelect(delivery, record.success, accepted) ||\n record.success.ordinal <= accepted.cursor ||\n record.success.ordinal > cursor\n )\n return [Result.fail(error(\"conflict\", \"selection\")), current];\n if (!subscriptionCanSelect(record.success, accepted, effectiveNowMillis, false))\n continue;\n const deliveryKey = subscriptionDeliveryKeyString(delivery.key);\n const existingText = current.deliveries.get(deliveryKey);\n if (existingText !== undefined) {\n const existing = decode(SubscriptionDelivery, existingText, \"select-existing\");\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n if (!sameDeliveryIdentity(existing.success, delivery))\n return [Result.fail(error(\"conflict\", \"delivery-identity\")), current];\n continue;\n }\n const encodedDelivery = encode(\n SubscriptionDelivery,\n delivery,\n \"select-delivery-encode\",\n );\n if (Result.isFailure(encodedDelivery))\n return [Result.fail(encodedDelivery.failure), current];\n additions.push([deliveryKey, encodedDelivery.success]);\n additionIndex.push([\n deliveryKey,\n {\n key: delivery.key,\n state: delivery.state,\n nextAttemptAtMillis: delivery.retry.nextAttemptAtMillis,\n },\n record.success.key.ownerId,\n ]);\n const ownerId = record.success.key.ownerId;\n owners.set(ownerId, (owners.get(ownerId) ?? 0) + 1);\n if ((owners.get(ownerId) ?? 0) > limits.maxDeliveriesPerOwner)\n return [Result.fail(error(\"capacity\", \"owner-deliveries\")), current];\n if (record.success.configuration.mode === \"once\") {\n const consumed = { ...record.success, state: \"consumed\" as const, recovery: null };\n const encodedRecord = encode(\n SubscriptionRecord,\n consumed,\n \"select-registration-encode\",\n );\n if (Result.isFailure(encodedRecord))\n return [Result.fail(encodedRecord.failure), current];\n const consumedKey = subscriptionKeyString(consumed.key);\n updates.push([consumedKey, encodedRecord.success]);\n const indexed = current.registrationIndex.get(consumedKey);\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"selection-index\")), current];\n registrationUpdates.push([\n consumedKey,\n { ...indexed, state: \"consumed\", recoveryAt: null },\n ]);\n }\n }\n if (current.deliveries.size + additions.length > limits.maxDeliveries)\n return [Result.fail(error(\"capacity\", \"deliveries\")), current];\n const registrations = new Map(current.registrations);\n for (const [key, value] of updates) registrations.set(key, value);\n const nextDeliveries = new Map(current.deliveries);\n for (const [key, value] of additions) nextDeliveries.set(key, value);\n const deliveryIndex = new Map(current.deliveryIndex);\n for (const [key, value] of additionIndex) deliveryIndex.set(key, value);\n const registrationIndex = new Map(current.registrationIndex);\n for (const [key, value] of registrationUpdates) registrationIndex.set(key, value);\n const nextEvent: AcceptedEvent = {\n ...accepted,\n cursor,\n routingComplete: complete,\n routingFailure: null,\n };\n const encodedEvent = encode(AcceptedEvent, nextEvent, \"select-event-encode\");\n if (Result.isFailure(encodedEvent)) return [Result.fail(encodedEvent.failure), current];\n const events = new Map(current.events);\n events.set(nextEvent.eventId, encodedEvent.success);\n const eventIndex = new Map(current.eventIndex);\n eventIndex.set(nextEvent.eventId, {\n routingComplete: nextEvent.routingComplete,\n nextAttemptAtMillis: nextEvent.nextAttemptAtMillis,\n });\n return [\n Result.void,\n {\n ...current,\n registrations,\n registrationIndex,\n events,\n eventIndex,\n deliveries: nextDeliveries,\n deliveryIndex,\n ownerDeliveryCounts: owners,\n },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:select:after\");\n });\n\n const catchUp: SubscriptionStore[\"Service\"][\"catchUp\"] = Effect.fn(\n \"MemorySubscriptionStore.catchUp\",\n )(function* (inputEvent, inputDelivery, nowMillis, inputLimits) {\n const suppliedEvent = yield* validate(AcceptedEvent, inputEvent, \"catch-up-event\");\n const delivery = yield* validate(SubscriptionDelivery, inputDelivery, \"catch-up-delivery\");\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"catch-up-limits\");\n yield* requirePartition(suppliedEvent, \"catch-up-partition\");\n yield* failpoint.hit(\"subscription:catch-up:before\");\n const effectiveNowMillis = Math.max(nowMillis, yield* Clock.currentTimeMillis);\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const eventText = current.events.get(suppliedEvent.eventId);\n const recordText = current.registrations.get(\n subscriptionKeyString(delivery.key.subscription),\n );\n if (eventText === undefined || recordText === undefined)\n return [\n Result.fail(error(\"not-found\", eventText === undefined ? \"event\" : \"subscription\")),\n current,\n ];\n const accepted = decode(AcceptedEvent, eventText, \"catch-up-event-record\");\n if (Result.isFailure(accepted)) return [Result.fail(accepted.failure), current];\n const record = decode(SubscriptionRecord, recordText, \"catch-up-registration\");\n if (Result.isFailure(record)) return [Result.fail(record.failure), current];\n if (\n !sameEventIdentity(accepted.success, suppliedEvent) ||\n !deliveryBelongsTo(delivery, record.success, accepted.success) ||\n !subscriptionDeliveryCanSelect(delivery, record.success, accepted.success) ||\n record.success.configuration.mode !== \"once\"\n )\n return [Result.fail(error(\"conflict\", \"catch-up-identity\")), current];\n const key = subscriptionDeliveryKeyString(delivery.key);\n const existingText = current.deliveries.get(key);\n if (existingText !== undefined) {\n const existing = decode(SubscriptionDelivery, existingText, \"catch-up-existing\");\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n return sameDeliveryIdentity(existing.success, delivery)\n ? [Result.void, current]\n : [Result.fail(error(\"conflict\", \"delivery-identity\")), current];\n }\n if (!subscriptionCanSelect(record.success, accepted.success, effectiveNowMillis, true))\n return [Result.fail(error(\"conflict\", \"catch-up-eligibility\")), current];\n if (current.deliveries.size >= limits.maxDeliveries)\n return [Result.fail(error(\"capacity\", \"deliveries\")), current];\n const ownerCount = current.ownerDeliveryCounts.get(record.success.key.ownerId) ?? 0;\n if (ownerCount >= limits.maxDeliveriesPerOwner)\n return [Result.fail(error(\"capacity\", \"owner-deliveries\")), current];\n const encodedDelivery = encode(\n SubscriptionDelivery,\n delivery,\n \"catch-up-delivery-encode\",\n );\n if (Result.isFailure(encodedDelivery))\n return [Result.fail(encodedDelivery.failure), current];\n const consumed = { ...record.success, state: \"consumed\" as const, recovery: null };\n const encodedRecord = encode(\n SubscriptionRecord,\n consumed,\n \"catch-up-registration-encode\",\n );\n if (Result.isFailure(encodedRecord)) return [Result.fail(encodedRecord.failure), current];\n const deliveries = new Map(current.deliveries);\n deliveries.set(key, encodedDelivery.success);\n const registrations = new Map(current.registrations);\n const consumedKey = subscriptionKeyString(consumed.key);\n registrations.set(consumedKey, encodedRecord.success);\n const registrationIndex = new Map(current.registrationIndex);\n const indexed = registrationIndex.get(consumedKey);\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"catch-up-index\")), current];\n registrationIndex.set(consumedKey, { ...indexed, state: \"consumed\", recoveryAt: null });\n const deliveryIndex = new Map(current.deliveryIndex);\n deliveryIndex.set(key, {\n key: delivery.key,\n state: delivery.state,\n nextAttemptAtMillis: delivery.retry.nextAttemptAtMillis,\n });\n const ownerDeliveryCounts = new Map(current.ownerDeliveryCounts);\n ownerDeliveryCounts.set(consumed.key.ownerId, ownerCount + 1);\n return [\n Result.void,\n {\n ...current,\n deliveries,\n deliveryIndex,\n ownerDeliveryCounts,\n registrations,\n registrationIndex,\n },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:catch-up:after\");\n });\n\n const deferEvent: SubscriptionStore[\"Service\"][\"deferEvent\"] = Effect.fn(\n \"MemorySubscriptionStore.deferEvent\",\n )(function* (eventId, nextAttemptAtMillis, code) {\n const routingFailure =\n code === undefined\n ? \"routing-failed\"\n : yield* validate(SubscriptionName, code, \"routing-failure\");\n yield* failpoint.hit(\"subscription:defer-event:before\");\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const text = current.events.get(eventId);\n if (text === undefined) return [Result.fail(error(\"not-found\", \"event\")), current];\n const accepted = decode(AcceptedEvent, text, \"defer-event-record\");\n if (Result.isFailure(accepted)) return [Result.fail(accepted.failure), current];\n const updated = { ...accepted.success, nextAttemptAtMillis, routingFailure };\n const encoded = encode(AcceptedEvent, updated, \"defer-event-encode\");\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const events = new Map(current.events);\n events.set(eventId, encoded.success);\n const eventIndex = new Map(current.eventIndex);\n const indexed = eventIndex.get(eventId);\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"defer-event-index\")), current];\n eventIndex.set(eventId, { ...indexed, nextAttemptAtMillis });\n return [Result.void, { ...current, events, eventIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:defer-event:after\");\n });\n\n const delivery: SubscriptionStore[\"Service\"][\"delivery\"] = Effect.fn(\n \"MemorySubscriptionStore.delivery\",\n )(function* (input) {\n const key = yield* validate(SubscriptionDeliveryKey, input, \"delivery-key\");\n yield* requirePartition(key.subscription, \"delivery-partition\");\n const text = (yield* Ref.get(state)).deliveries.get(subscriptionDeliveryKeyString(key));\n return text === undefined\n ? null\n : yield* decodeEffect(SubscriptionDelivery, text, \"delivery-record\");\n });\n\n const pendingDeliveries: SubscriptionStore[\"Service\"][\"pendingDeliveries\"] = Effect.fn(\n \"MemorySubscriptionStore.pendingDeliveries\",\n )(function* (nowMillis, after, limit) {\n const items: Array<SubscriptionDeliveryKey> = [];\n for (const [storageKey, item] of (yield* Ref.get(state)).deliveryIndex) {\n if (\n item.state !== \"delivered\" &&\n item.state !== \"refused\" &&\n item.nextAttemptAtMillis <= nowMillis &&\n compareScheduleNames(storageKey, after) > 0\n )\n items.push(item.key);\n }\n items.sort((a, b) =>\n compareScheduleNames(subscriptionDeliveryKeyString(a), subscriptionDeliveryKeyString(b)),\n );\n return items.slice(0, limit);\n });\n\n const listDeliveries: SubscriptionStore[\"Service\"][\"listDeliveries\"] = Effect.fn(\n \"MemorySubscriptionStore.listDeliveries\",\n )(function* (input, after, limit) {\n const key = yield* requireKey(input, \"list-deliveries-key\");\n const items: Array<SubscriptionDelivery> = [];\n for (const text of (yield* Ref.get(state)).deliveries.values()) {\n const item = yield* decodeEffect(SubscriptionDelivery, text, \"list-delivery\");\n const itemKey = subscriptionDeliveryKeyString(item.key);\n if (\n subscriptionKeyString(item.key.subscription) === subscriptionKeyString(key) &&\n compareScheduleNames(itemKey, after) > 0\n )\n items.push(item);\n }\n items.sort((a, b) =>\n compareScheduleNames(\n subscriptionDeliveryKeyString(a.key),\n subscriptionDeliveryKeyString(b.key),\n ),\n );\n return items.slice(0, limit);\n });\n\n const changeDelivery: SubscriptionStore[\"Service\"][\"changeDelivery\"] = Effect.fn(\n \"MemorySubscriptionStore.changeDelivery\",\n )(function* (inputKey, inputDeliveryId, inputChange) {\n const key = yield* validate(SubscriptionDeliveryKey, inputKey, \"change-delivery-key\");\n const deliveryId = yield* validate(Digest, inputDeliveryId, \"change-delivery-id\");\n const change = yield* validate(DeliveryChange, inputChange, \"change-delivery-change\");\n yield* requirePartition(key.subscription, \"change-delivery-partition\");\n yield* failpoint.hit(`subscription:delivery-${change._tag.toLowerCase()}:before`);\n const effectiveChange =\n change._tag === \"Prepare\"\n ? { ...change, nowMillis: Math.max(change.nowMillis, yield* Clock.currentTimeMillis) }\n : change;\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<SubscriptionDelivery, SubscriptionError>,\n MemorySubscriptionState,\n ] => {\n const storageKey = subscriptionDeliveryKeyString(key);\n const text = current.deliveries.get(storageKey);\n if (text === undefined) return [Result.fail(error(\"not-found\", \"delivery\")), current];\n const decoded = decode(SubscriptionDelivery, text, \"change-delivery-record\");\n if (Result.isFailure(decoded)) return [decoded, current];\n const registrationText = current.registrations.get(\n subscriptionKeyString(key.subscription),\n );\n if (registrationText === undefined)\n return [Result.fail(error(\"corrupt\", \"delivery-registration\")), current];\n const registration = decode(\n SubscriptionRecord,\n registrationText,\n \"delivery-registration\",\n );\n if (Result.isFailure(registration)) return [Result.fail(registration.failure), current];\n const transition = applySubscriptionDeliveryChange(\n decoded.success,\n registration.success,\n deliveryId,\n effectiveChange,\n );\n if (Result.isFailure(transition)) return [Result.fail(transition.failure), current];\n if (transition.success === decoded.success)\n return [Result.succeed(decoded.success), current];\n const updated = transition.success;\n const encoded = encode(SubscriptionDelivery, updated, \"change-delivery-encode\");\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const deliveries = new Map(current.deliveries);\n deliveries.set(storageKey, encoded.success);\n const deliveryIndex = new Map(current.deliveryIndex);\n const indexed = deliveryIndex.get(storageKey);\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"delivery-index\")), current];\n deliveryIndex.set(storageKey, {\n ...indexed,\n state: updated.state,\n nextAttemptAtMillis: updated.retry.nextAttemptAtMillis,\n });\n return [Result.succeed(updated), { ...current, deliveries, deliveryIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(`subscription:delivery-${change._tag.toLowerCase()}:after`);\n return result;\n });\n\n const recovering: SubscriptionStore[\"Service\"][\"recovering\"] = Effect.fn(\n \"MemorySubscriptionStore.recovering\",\n )(function* (nowMillis, after, limit) {\n const records: Array<{ readonly key: SubscriptionKey; readonly ordinal: number }> = [];\n for (const item of (yield* Ref.get(state)).registrationIndex.values()) {\n if (\n item.ordinal > after &&\n item.state === \"active\" &&\n item.recoveryAt !== null &&\n item.recoveryAt <= nowMillis\n )\n records.push({ key: item.key, ordinal: item.ordinal });\n }\n records.sort((a, b) => a.ordinal - b.ordinal);\n return records.slice(0, limit);\n });\n\n const deferRecovery: SubscriptionStore[\"Service\"][\"deferRecovery\"] = Effect.fn(\n \"MemorySubscriptionStore.deferRecovery\",\n )(function* (input, recovery) {\n const key = yield* requireKey(input, \"defer-recovery-key\");\n yield* failpoint.hit(\"subscription:defer-recovery:before\");\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const storageKey = subscriptionKeyString(key);\n const text = current.registrations.get(storageKey);\n if (text === undefined) return [Result.fail(error(\"not-found\", \"subscription\")), current];\n const record = decode(SubscriptionRecord, text, \"defer-recovery-record\");\n if (Result.isFailure(record)) return [Result.fail(record.failure), current];\n const updated = {\n ...record.success,\n recovery: record.success.state === \"active\" ? recovery : null,\n };\n const encoded = encode(SubscriptionRecord, updated, \"defer-recovery-encode\");\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const registrations = new Map(current.registrations);\n registrations.set(storageKey, encoded.success);\n const registrationIndex = new Map(current.registrationIndex);\n const indexed = registrationIndex.get(storageKey);\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"recovery-index\")), current];\n registrationIndex.set(storageKey, {\n ...indexed,\n recoveryAt: updated.recovery?.nextAttemptAtMillis ?? null,\n });\n return [Result.void, { ...current, registrations, registrationIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:defer-recovery:after\");\n });\n\n const readScanCursors: SubscriptionStore[\"Service\"][\"readScanCursors\"] = Ref.get(state).pipe(\n Effect.map((current) => current.scanCursors),\n );\n\n const advanceScanCursors: SubscriptionStore[\"Service\"][\"advanceScanCursors\"] = Effect.fn(\n \"MemorySubscriptionStore.advanceScanCursors\",\n )(function* (input) {\n const cursors = yield* validate(SubscriptionScanCursors, input, \"scan-cursors\");\n yield* failpoint.hit(\"subscription:advance-scan-cursors:before\");\n yield* Effect.uninterruptible(\n Ref.update(state, (current) => ({ ...current, scanCursors: cursors })),\n );\n yield* failpoint.hit(\"subscription:advance-scan-cursors:after\");\n });\n\n const nextDeadline = Effect.gen(function* () {\n let deadline: number | null = null;\n const current = yield* Ref.get(state);\n if (\n current.scanCursors.events !== \"\" ||\n current.scanCursors.deliveries !== \"\" ||\n current.scanCursors.recovery !== 0\n )\n return 0;\n const consider = (value: number) => {\n if (deadline === null || value < deadline) deadline = value;\n };\n for (const accepted of current.eventIndex.values())\n if (!accepted.routingComplete) consider(accepted.nextAttemptAtMillis);\n for (const item of current.deliveryIndex.values())\n if (item.state !== \"delivered\" && item.state !== \"refused\")\n consider(item.nextAttemptAtMillis);\n for (const record of current.registrationIndex.values())\n if (record.state === \"active\" && record.recoveryAt !== null) consider(record.recoveryAt);\n return deadline;\n }).pipe(Effect.withSpan(\"MemorySubscriptionStore.nextDeadline\"));\n\n return SubscriptionStore.of({\n partition,\n register,\n get,\n list,\n cancel,\n accept,\n event,\n pendingEvents,\n candidates,\n select,\n catchUp,\n deferEvent,\n delivery,\n pendingDeliveries,\n listDeliveries,\n changeDelivery,\n recovering,\n deferRecovery,\n readScanCursors,\n advanceScanCursors,\n nextDeadline,\n });\n});\n\nexport const memorySubscriptionStoreLayer = (\n partition: SourcePartition,\n): Layer.Layer<SubscriptionStore, SubscriptionError> =>\n Layer.effect(SubscriptionStore, makeMemorySubscriptionStore(partition));\n","import { ThreadId } from \"@effect-agent/core\";\nimport {\n type ThreadCheckpoint,\n type ProducerEpoch,\n type RecordId,\n AppendConflict,\n AppendResult,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n CheckpointRejected,\n ThreadExportRequest,\n ThreadExport,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadObservation,\n ThreadRead,\n ThreadStore,\n type ThreadCheckpoints,\n ThreadStoreError,\n ThreadTail,\n ThreadTailRequest,\n digestCanonicalBatch,\n EMPTY_TAIL_DIGEST,\n FenceRejected,\n FencedAppendRequest,\n LoadCheckpointRequest,\n ObservationOffset,\n SaveCheckpointRequest,\n type BatchId,\n type Digest,\n} from \"@effect-agent/thread\";\nimport { Crypto, Effect, Encoding, Layer, Option, PubSub, Ref, Schema, Stream } from \"effect\";\n\nconst MAX_THREADS = 256;\nconst MAX_RECORDS_PER_THREAD = 65_536;\nconst MAX_CHECKPOINTS_PER_THREAD = 1_024;\n\ninterface StoredBatch {\n readonly digest: Digest;\n readonly result: AppendResult;\n}\n\ninterface StoredThread {\n readonly producerEpoch: ProducerEpoch;\n readonly tailSequence: CanonicalSequence;\n readonly tailDigest: Digest;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n readonly recordIds: ReadonlySet<RecordId>;\n readonly batches: ReadonlyMap<BatchId, StoredBatch>;\n readonly tailDigests: ReadonlyMap<CanonicalSequence, Digest>;\n readonly checkpoints: ReadonlyMap<CanonicalSequence, ThreadCheckpoint>;\n}\n\ninterface MemoryState {\n readonly threads: ReadonlyMap<ThreadId, StoredThread>;\n}\n\ntype AppendDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadStoreError | ThreadNotMaterialized | AppendConflict | FenceRejected;\n }\n | {\n readonly _tag: \"success\";\n readonly result: AppendResult;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n };\n\ntype MaterializeDecision =\n | { readonly _tag: \"failure\"; readonly error: ThreadStoreError | FenceRejected }\n | { readonly _tag: \"success\" };\n\ntype CheckpointDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadNotMaterialized | ThreadStoreError | CheckpointRejected;\n }\n | { readonly _tag: \"success\" };\n\nconst storeError = (operation: string, message: string, cause?: unknown): ThreadStoreError =>\n cause === undefined\n ? ThreadStoreError.make({ operation, message })\n : ThreadStoreError.make({ operation, message, cause });\n\nconst validate = Effect.fn(\"MemoryThreadStore.validate\")(\n <A, I>(\n schema: Schema.Codec<A, I>,\n operation: string,\n value: unknown,\n ): Effect.Effect<A, ThreadStoreError> =>\n Schema.encodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError((error) => storeError(operation, `Invalid ${operation} request`, error)),\n ),\n);\n\nconst decodeCanonicalSequence = Schema.decodeSync(CanonicalSequence);\nconst ZERO_CANONICAL_SEQUENCE = decodeCanonicalSequence(0);\n\nconst offsetSequence = Effect.fn(\"MemoryThreadStore.offsetSequence\")((\n threadId: ThreadId,\n offset: ObservationOffset | undefined,\n): Effect.Effect<CanonicalSequence, ThreadStoreError> => {\n if (offset === undefined) return Effect.succeed(ZERO_CANONICAL_SEQUENCE);\n const prefix = `memory:v1:${Encoding.encodeBase64(threadId)}:`;\n const encodedSequence = offset.startsWith(prefix) ? offset.slice(prefix.length) : \"\";\n if (!/^\\d+$/.test(encodedSequence)) {\n return Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n }\n const sequence = Number(encodedSequence);\n return Number.isSafeInteger(sequence)\n ? Schema.decodeUnknownEffect(CanonicalSequence)(sequence).pipe(\n Effect.mapError(() => storeError(\"observe\", \"Malformed observation offset\")),\n )\n : Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n});\n\nconst observationOffset = (threadId: ThreadId, sequence: CanonicalSequence): ObservationOffset =>\n Schema.decodeSync(ObservationOffset)(`memory:v1:${Encoding.encodeBase64(threadId)}:${sequence}`);\n\nconst findThread = Effect.fn(\"MemoryThreadStore.findThread\")((\n state: MemoryState,\n threadId: ThreadId,\n): Effect.Effect<StoredThread, ThreadNotMaterialized> => {\n const thread = state.threads.get(threadId);\n return thread === undefined\n ? Effect.fail(ThreadNotMaterialized.make({ threadId }))\n : Effect.succeed(thread);\n});\n\nconst CheckpointVersionEnvelope = Schema.Struct({\n checkpoint: Schema.Struct({\n threadId: ThreadId,\n schemaVersion: Schema.Natural,\n }),\n});\n\nconst validateCheckpointVersion = Effect.fn(\"MemoryThreadStore.validateCheckpointVersion\")(\n function* (value: unknown): Effect.fn.Return<void, ThreadStoreError | CheckpointRejected> {\n const envelope = yield* Schema.decodeUnknownEffect(CheckpointVersionEnvelope)(value).pipe(\n Effect.mapError(() => storeError(\"saveCheckpoint\", \"Invalid saveCheckpoint request\")),\n );\n if (envelope.checkpoint.schemaVersion !== 1) {\n return yield* CheckpointRejected.make({\n threadId: envelope.checkpoint.threadId,\n reason: \"unsupported-version\",\n });\n }\n },\n);\n\nconst makeThreadStore = Effect.gen(function* () {\n const crypto = yield* Crypto.Crypto;\n const state = yield* Ref.make<MemoryState>({ threads: new Map() });\n const updates = yield* PubSub.sliding<void>(1);\n yield* Effect.addFinalizer(() => PubSub.shutdown(updates));\n\n const materialize: ThreadStore[\"Service\"][\"materialize\"] = Effect.fn(\n \"MemoryThreadStore.materialize\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ThreadMaterialization, \"materialize\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [MaterializeDecision, MemoryState] => {\n const existing = current.threads.get(request.threadId);\n if (existing !== undefined) {\n if (request.producerEpoch < existing.producerEpoch) {\n return [\n {\n _tag: \"failure\",\n error: FenceRejected.make({\n threadId: request.threadId,\n actualEpoch: existing.producerEpoch,\n attemptedEpoch: request.producerEpoch,\n }),\n },\n current,\n ];\n }\n if (request.producerEpoch === existing.producerEpoch) {\n return [{ _tag: \"success\" }, current];\n }\n const threads = new Map(current.threads);\n threads.set(request.threadId, {\n ...existing,\n producerEpoch: request.producerEpoch,\n });\n return [{ _tag: \"success\" }, { threads }];\n }\n if (current.threads.size >= MAX_THREADS) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\"materialize\", `In-memory thread limit ${MAX_THREADS} exceeded`),\n },\n current,\n ];\n }\n const threads = new Map(current.threads);\n threads.set(request.threadId, {\n producerEpoch: request.producerEpoch,\n tailSequence: ZERO_CANONICAL_SEQUENCE,\n tailDigest: EMPTY_TAIL_DIGEST,\n records: [],\n recordIds: new Set(),\n batches: new Map(),\n tailDigests: new Map([[ZERO_CANONICAL_SEQUENCE, EMPTY_TAIL_DIGEST]]),\n checkpoints: new Map(),\n });\n return [{ _tag: \"success\" }, { threads }];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const append: ThreadStore[\"Service\"][\"append\"] = Effect.fn(\"MemoryThreadStore.append\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(FencedAppendRequest, \"append\", unvalidated);\n const digest = yield* digestCanonicalBatch(request.expectedTailDigest, request.batch).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n Effect.mapError((error) => storeError(\"append\", error.message, error)),\n );\n\n const decision = yield* Effect.uninterruptible(\n Ref.modify(state, (current): readonly [AppendDecision, MemoryState] => {\n const thread = current.threads.get(request.threadId);\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: request.threadId,\n }),\n },\n current,\n ];\n }\n if (request.producerEpoch !== thread.producerEpoch) {\n return [\n {\n _tag: \"failure\",\n error: FenceRejected.make({\n threadId: request.threadId,\n actualEpoch: thread.producerEpoch,\n attemptedEpoch: request.producerEpoch,\n }),\n },\n current,\n ];\n }\n const previous = thread.batches.get(request.batch.batchId);\n if (previous !== undefined) {\n if (previous.digest !== digest) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"batch-digest\",\n }),\n },\n current,\n ];\n }\n return [\n {\n _tag: \"success\",\n result: AppendResult.make({\n firstSequence: previous.result.firstSequence,\n lastSequence: previous.result.lastSequence,\n tailDigest: previous.result.tailDigest,\n replayed: true,\n }),\n records: [],\n },\n current,\n ];\n }\n if (\n request.expectedTailSequence !== thread.tailSequence ||\n request.expectedTailDigest !== thread.tailDigest\n ) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"tail\",\n actualTailSequence: thread.tailSequence,\n actualTailDigest: thread.tailDigest,\n }),\n },\n current,\n ];\n }\n if (thread.records.length + request.batch.records.length > MAX_RECORDS_PER_THREAD) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\n \"append\",\n `In-memory record limit ${MAX_RECORDS_PER_THREAD} exceeded`,\n ),\n },\n current,\n ];\n }\n\n const batchRecordIds = new Set<RecordId>();\n for (const record of request.batch.records) {\n if (thread.recordIds.has(record.recordId) || batchRecordIds.has(record.recordId)) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"record-identity\",\n }),\n },\n current,\n ];\n }\n batchRecordIds.add(record.recordId);\n }\n\n const records = request.batch.records.map((record, index) => {\n const sequence = decodeCanonicalSequence(thread.tailSequence + index + 1);\n return CanonicalRecordEnvelope.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n sequence,\n offset: observationOffset(request.threadId, sequence),\n record,\n });\n });\n const lastSequence = decodeCanonicalSequence(thread.tailSequence + records.length);\n const result = AppendResult.make({\n firstSequence: decodeCanonicalSequence(thread.tailSequence + 1),\n lastSequence,\n tailDigest: digest,\n replayed: false,\n });\n const batches = new Map(thread.batches);\n batches.set(request.batch.batchId, { digest, result });\n const recordIds = new Set(thread.recordIds);\n for (const recordId of batchRecordIds) recordIds.add(recordId);\n const tailDigests = new Map(thread.tailDigests);\n tailDigests.set(lastSequence, digest);\n const threads = new Map(current.threads);\n threads.set(request.threadId, {\n ...thread,\n tailSequence: lastSequence,\n tailDigest: digest,\n records: [...thread.records, ...records],\n recordIds,\n batches,\n tailDigests,\n });\n return [{ _tag: \"success\", result, records }, { threads }];\n }).pipe(\n Effect.tap((decision) =>\n decision._tag === \"success\" && decision.records.length > 0\n ? PubSub.publish(updates, undefined)\n : Effect.void,\n ),\n ),\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n return decision.result;\n }),\n );\n\n const readSnapshot = Effect.fn(\"MemoryThreadStore.readSnapshot\")(\n (threadId: ThreadId, afterSequence: CanonicalSequence | undefined, limit: number) =>\n Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, threadId)),\n Effect.map((thread) =>\n thread.records\n .filter((record) => record.sequence > (afterSequence ?? ZERO_CANONICAL_SEQUENCE))\n .slice(0, limit),\n ),\n ),\n );\n\n const read: ThreadStore[\"Service\"][\"read\"] = (unvalidated) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadRead, \"read\", unvalidated);\n const records = yield* readSnapshot(request.threadId, request.afterSequence, request.limit);\n return Stream.fromIterable(records);\n }),\n );\n\n const observe: ThreadStore[\"Service\"][\"observe\"] = (unvalidated) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadObservation, \"observe\", unvalidated);\n const afterSequence = yield* offsetSequence(request.threadId, request.afterOffset);\n return Stream.unwrap(\n Effect.gen(function* () {\n const subscription = yield* PubSub.subscribe(updates);\n const initial = yield* readSnapshot(\n request.threadId,\n afterSequence,\n MAX_RECORDS_PER_THREAD,\n );\n const highWater =\n initial.length === 0 ? afterSequence : (initial.at(-1)?.sequence ?? afterSequence);\n const live = Stream.fromEffectRepeat(PubSub.take(subscription)).pipe(\n Stream.mapAccumEffect(\n () => highWater,\n (lastSequence) =>\n readSnapshot(request.threadId, lastSequence, MAX_RECORDS_PER_THREAD).pipe(\n Effect.map(\n (records) => [records.at(-1)?.sequence ?? lastSequence, records] as const,\n ),\n ),\n ),\n );\n return Stream.fromIterable(initial).pipe(Stream.concat(live));\n }),\n );\n }),\n );\n\n const exportThread: ThreadStore[\"Service\"][\"export\"] = Effect.fn(\"MemoryThreadStore.export\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ThreadExportRequest, \"export\", unvalidated);\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n return ThreadExport.make({\n format: \"effect-agent/thread@1\",\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n tailDigest: thread.tailDigest,\n records: thread.records,\n });\n }),\n );\n\n const inspectTail: ThreadStore[\"Service\"][\"inspectTail\"] = Effect.fn(\n \"MemoryThreadStore.inspectTail\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ThreadTailRequest, \"inspectTail\", unvalidated);\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n return ThreadTail.make({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n tailDigest: thread.tailDigest,\n producerEpoch: thread.producerEpoch,\n });\n }),\n );\n\n const saveCheckpoint: ThreadCheckpoints[\"save\"] = Effect.fn(\"MemoryThreadStore.saveCheckpoint\")(\n (unvalidated) =>\n Effect.gen(function* () {\n yield* validateCheckpointVersion(unvalidated);\n const request = yield* validate(SaveCheckpointRequest, \"saveCheckpoint\", unvalidated);\n const decision = yield* Ref.modify(\n state,\n (current): readonly [CheckpointDecision, MemoryState] => {\n const checkpoint = request.checkpoint;\n const thread = current.threads.get(checkpoint.threadId);\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: checkpoint.threadId,\n }),\n },\n current,\n ];\n }\n if (checkpoint.throughSequence > thread.tailSequence) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"ahead-of-tail\",\n }),\n },\n current,\n ];\n }\n if (thread.tailDigests.get(checkpoint.throughSequence) !== checkpoint.tailDigest) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"digest-mismatch\",\n }),\n },\n current,\n ];\n }\n if (\n !thread.checkpoints.has(checkpoint.throughSequence) &&\n thread.checkpoints.size >= MAX_CHECKPOINTS_PER_THREAD\n ) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\n \"saveCheckpoint\",\n `In-memory checkpoint limit ${MAX_CHECKPOINTS_PER_THREAD} exceeded`,\n ),\n },\n current,\n ];\n }\n const checkpoints = new Map(thread.checkpoints);\n checkpoints.set(checkpoint.throughSequence, checkpoint);\n const threads = new Map(current.threads);\n threads.set(checkpoint.threadId, { ...thread, checkpoints });\n return [{ _tag: \"success\" }, { threads }];\n },\n );\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const loadCheckpoint: ThreadCheckpoints[\"load\"] = Effect.fn(\"MemoryThreadStore.loadCheckpoint\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(LoadCheckpointRequest, \"loadCheckpoint\", unvalidated);\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n const maximum = request.atOrBeforeSequence ?? thread.tailSequence;\n let selected: ThreadCheckpoint | undefined;\n for (const [sequence, checkpoint] of thread.checkpoints) {\n if (\n sequence <= maximum &&\n (selected === undefined || sequence > selected.throughSequence)\n ) {\n selected = checkpoint;\n }\n }\n if (\n selected !== undefined &&\n thread.tailDigests.get(selected.throughSequence) !== selected.tailDigest\n ) {\n return yield* CheckpointRejected.make({\n threadId: request.threadId,\n reason: \"digest-mismatch\",\n });\n }\n return Option.fromNullishOr(selected);\n }),\n );\n\n return ThreadStore.of({\n materialize,\n append,\n read,\n observe,\n export: exportThread,\n inspectTail,\n checkpoints: { save: saveCheckpoint, load: loadCheckpoint },\n });\n});\n\nexport const MemoryThreadStoreLive = Layer.effect(ThreadStore, makeThreadStore);\n\n/**\n * In-memory canonical Thread persistence. Durable accepted work is served by the separate\n * SubmissionLedger port; this Layer deliberately provides only the ThreadStore.\n */\nexport const MemoryStorageLive = MemoryThreadStoreLive;\n","import {\n MemoryIndexCandidate,\n MemoryIndexError,\n MemoryIndexQuery,\n MemoryIndexReplacement,\n MemoryIndexSearch,\n MemoryIndexSource,\n MemoryKey,\n SemanticMemoryChunk,\n SemanticMemoryIndex,\n SemanticMemoryProfile,\n} from \"@effect-agent/core\";\nimport { Clock, Effect, Encoding, Layer, Ref, Schema } from \"effect\";\n\nconst PositiveCapacity = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65_536 }));\nconst MaxStoredVectorComponents = 16_777_216;\n\n/**\n * Hard per-Layer bounds for disposable semantic index state. maxChunks times profile dimensions\n * must not exceed 16,777,216 vector components. maxSourceBytes bounds the aggregate UTF-8 JSON\n * of retained source identities and defaults to 16 MiB; it is not a general heap limit.\n */\nexport class InMemorySemanticIndexCapacity extends Schema.Class<InMemorySemanticIndexCapacity>(\n \"@effect-agent/storage-memory/InMemorySemanticIndexCapacity\",\n)({\n maxSources: PositiveCapacity,\n maxChunks: PositiveCapacity,\n maxSourceBytes: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 67_108_864 })),\n ),\n}) {}\n\ntype StoredEntry = {\n readonly source: MemoryIndexSource;\n readonly sourceBytes: number;\n} & (\n | {\n readonly _tag: \"Indexed\";\n readonly chunks: ReadonlyArray<SemanticMemoryChunk>;\n readonly indexedAt: number;\n }\n | { readonly _tag: \"Withdrawn\" }\n);\n\ninterface IndexData {\n readonly closed: boolean;\n readonly entries: ReadonlyMap<string, StoredEntry>;\n readonly sourceBytes: number;\n}\n\nconst sameProfile = Schema.toEquivalence(SemanticMemoryProfile);\nconst sameSource = Schema.toEquivalence(MemoryIndexSource.Wire);\nconst error = (operation: string, reason: MemoryIndexError[\"reason\"]): MemoryIndexError =>\n MemoryIndexError.make({ operation, reason });\nconst keyString = (key: MemoryKey): string => JSON.stringify([key.namespace.address, key.id]);\nconst sourceIdentityBytes = (source: MemoryIndexSource): number =>\n Encoding.encodeHex(JSON.stringify(source)).length / 2;\n\nconst decodeBoundary = Effect.fn(\"InMemorySemanticIndex.decodeBoundary\")(function* <A, I>(\n schema: Schema.Codec<A, I, never>,\n value: unknown,\n operation: string,\n): Effect.fn.Return<A, MemoryIndexError> {\n return yield* Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap((decoded) => Schema.encodeEffect(schema)(decoded).pipe(Effect.as(decoded))),\n Effect.mapError(() => error(operation, \"invalid-input\")),\n );\n});\n\nconst freezeSource = (source: MemoryIndexSource): MemoryIndexSource =>\n Object.freeze(\n MemoryIndexSource.make({\n key: Object.freeze(\n MemoryKey.make({\n ...source.key,\n namespace: Object.freeze({ address: source.key.namespace.address }),\n }),\n ),\n source: Object.freeze({ ...source.source }),\n sourceGeneration: source.sourceGeneration,\n }),\n );\n\nconst freezeChunk = (chunk: SemanticMemoryChunk): SemanticMemoryChunk =>\n Object.freeze(SemanticMemoryChunk.make({ ...chunk, vector: Object.freeze([...chunk.vector]) }));\n\nconst sourceIsFenced = (source: MemoryIndexSource, existing: StoredEntry): boolean =>\n source.sourceGeneration < existing.source.sourceGeneration ||\n (source.sourceGeneration === existing.source.sourceGeneration &&\n !sameSource(source, existing.source));\n\nconst squaredNorm = (vector: ReadonlyArray<number>): number | null => {\n let sum = 0;\n for (const value of vector) {\n sum += value * value;\n if (!Number.isFinite(sum)) return null;\n }\n return sum > 0 ? sum : null;\n};\n\nconst validVector = (vector: ReadonlyArray<number>, profile: SemanticMemoryProfile): boolean =>\n vector.length === profile.dimensions && squaredNorm(vector) !== null;\n\nconst validateChunks = Effect.fn(\"InMemorySemanticIndex.validateChunks\")(function* (\n chunks: ReadonlyArray<SemanticMemoryChunk>,\n profile: SemanticMemoryProfile,\n operation: string,\n): Effect.fn.Return<void, MemoryIndexError> {\n let nextByte = 0;\n const passageIds = new Set<string>();\n for (let index = 0; index < chunks.length; index++) {\n const chunk = chunks[index];\n const byteLength = Encoding.encodeHex(chunk.text).length / 2;\n if (\n chunk.ordinal !== index ||\n chunk.startByte !== nextByte ||\n chunk.endByte <= chunk.startByte ||\n chunk.endByte - chunk.startByte !== byteLength ||\n byteLength > profile.maxChunkBytes ||\n passageIds.has(chunk.passageId) ||\n !validVector(chunk.vector, profile)\n ) {\n return yield* error(operation, \"invalid-input\");\n }\n passageIds.add(chunk.passageId);\n nextByte = chunk.endByte;\n }\n});\n\nconst cosine = (left: ReadonlyArray<number>, right: ReadonlyArray<number>): number => {\n const leftNorm = Math.sqrt(squaredNorm(left) ?? 1);\n const rightNorm = Math.sqrt(squaredNorm(right) ?? 1);\n let score = 0;\n for (let index = 0; index < left.length; index++) {\n score += (left[index] / leftNorm) * (right[index] / rightNorm);\n }\n const bounded = Math.max(-1, Math.min(1, score));\n return bounded === 0 ? 0 : bounded;\n};\n\nconst compareText = (left: string, right: string): number =>\n left < right ? -1 : left > right ? 1 : 0;\n\nconst makeIndex = Effect.fn(\"InMemorySemanticIndex.make\")(function* (\n rawProfile: SemanticMemoryProfile,\n rawCapacity: InMemorySemanticIndexCapacity,\n) {\n const profile = Object.freeze(\n SemanticMemoryProfile.make({\n ...(yield* decodeBoundary(\n SemanticMemoryProfile,\n rawProfile,\n \"configure semantic memory index\",\n )),\n }),\n );\n const capacity = yield* decodeBoundary(\n InMemorySemanticIndexCapacity,\n rawCapacity,\n \"configure semantic memory index\",\n );\n if (capacity.maxChunks * profile.dimensions > MaxStoredVectorComponents) {\n return yield* error(\"configure semantic memory index\", \"invalid-input\");\n }\n const maxSourceBytes = capacity.maxSourceBytes ?? 16_777_216;\n const data = yield* Ref.make<IndexData>({ closed: false, entries: new Map(), sourceBytes: 0 });\n yield* Effect.addFinalizer(() =>\n Ref.set(data, { closed: true, entries: new Map(), sourceBytes: 0 }),\n );\n\n const ensureOpen = Effect.fn(\"InMemorySemanticIndex.ensureOpen\")(function* (operation: string) {\n if ((yield* Ref.get(data)).closed) return yield* error(operation, \"unavailable\");\n });\n\n const replace: SemanticMemoryIndex[\"Service\"][\"replace\"] = Effect.fn(\n \"InMemorySemanticIndex.replace\",\n )(function* (rawRequest) {\n const operation = \"replace semantic memory source\";\n yield* ensureOpen(operation);\n const request = yield* decodeBoundary(MemoryIndexReplacement.Wire, rawRequest, operation);\n const source = freezeSource(request.source);\n const sourceBytes = sourceIdentityBytes(source);\n const chunks = Object.freeze(request.chunks.map(freezeChunk));\n if (source.source.id !== source.key.id) return yield* error(operation, \"invalid-input\");\n if (!sameProfile(request.profile, profile)) return yield* error(operation, \"incompatible\");\n yield* validateChunks(chunks, profile, operation);\n const indexedAt = yield* Clock.currentTimeMillis;\n const failure = yield* Ref.modify(\n data,\n (current): readonly [MemoryIndexError | undefined, IndexData] => {\n if (current.closed) return [error(operation, \"unavailable\"), current];\n const id = keyString(source.key);\n const existing = current.entries.get(id);\n if (\n existing !== undefined &&\n (existing._tag === \"Withdrawn\" || sourceIsFenced(source, existing))\n ) {\n return [error(operation, \"fenced\"), current];\n }\n if (existing === undefined && current.entries.size >= capacity.maxSources) {\n return [error(operation, \"budget\"), current];\n }\n const nextSourceBytes = current.sourceBytes - (existing?.sourceBytes ?? 0) + sourceBytes;\n if (nextSourceBytes > maxSourceBytes) return [error(operation, \"budget\"), current];\n let count = chunks.length;\n for (const [entryId, entry] of current.entries) {\n if (entryId !== id && entry._tag === \"Indexed\") count += entry.chunks.length;\n }\n if (count > capacity.maxChunks) return [error(operation, \"budget\"), current];\n const entries = new Map(current.entries);\n entries.set(id, { _tag: \"Indexed\", source, sourceBytes, chunks, indexedAt });\n return [undefined, { ...current, entries, sourceBytes: nextSourceBytes }];\n },\n );\n if (failure !== undefined) return yield* failure;\n });\n\n const withdraw: SemanticMemoryIndex[\"Service\"][\"withdraw\"] = Effect.fn(\n \"InMemorySemanticIndex.withdraw\",\n )(function* (rawSource) {\n const operation = \"withdraw semantic memory source\";\n yield* ensureOpen(operation);\n const source = freezeSource(\n yield* decodeBoundary(MemoryIndexSource.Wire, rawSource, operation),\n );\n const sourceBytes = sourceIdentityBytes(source);\n if (source.source.id !== source.key.id) return yield* error(operation, \"invalid-input\");\n const failure = yield* Ref.modify(\n data,\n (current): readonly [MemoryIndexError | undefined, IndexData] => {\n if (current.closed) return [error(operation, \"unavailable\"), current];\n const id = keyString(source.key);\n const existing = current.entries.get(id);\n if (existing !== undefined) {\n if (existing._tag === \"Withdrawn\") {\n return [\n sameSource(source, existing.source) ? undefined : error(operation, \"fenced\"),\n current,\n ];\n }\n if (sourceIsFenced(source, existing)) return [error(operation, \"fenced\"), current];\n } else if (current.entries.size >= capacity.maxSources) {\n return [error(operation, \"budget\"), current];\n }\n const nextSourceBytes = current.sourceBytes - (existing?.sourceBytes ?? 0) + sourceBytes;\n if (nextSourceBytes > maxSourceBytes) return [error(operation, \"budget\"), current];\n const entries = new Map(current.entries);\n entries.set(id, { _tag: \"Withdrawn\", source, sourceBytes });\n return [undefined, { ...current, entries, sourceBytes: nextSourceBytes }];\n },\n );\n if (failure !== undefined) return yield* failure;\n });\n\n const search = Effect.fn(\"InMemorySemanticIndex.search\")(function* (rawQuery: MemoryIndexQuery) {\n const operation = \"search semantic memory index\";\n yield* ensureOpen(operation);\n const query = yield* decodeBoundary(MemoryIndexQuery.Wire, rawQuery, operation);\n const vector = Object.freeze([...query.vector]);\n if (!validVector(vector, profile)) return yield* error(operation, \"invalid-input\");\n const current = yield* Ref.get(data);\n if (current.closed) return yield* error(operation, \"unavailable\");\n let scannedChunks = 0;\n let inspectedSources = 0;\n const candidates: Array<MemoryIndexCandidate> = [];\n for (const entry of current.entries.values()) {\n inspectedSources += 1;\n if (inspectedSources % 128 === 0) yield* Effect.yieldNow;\n if (\n entry.source.key.namespace.address !== query.namespace.address ||\n entry._tag !== \"Indexed\"\n )\n continue;\n scannedChunks += entry.chunks.length;\n if (scannedChunks > query.maxScannedChunks) return yield* error(operation, \"budget\");\n }\n for (const entry of current.entries.values()) {\n if (\n entry.source.key.namespace.address !== query.namespace.address ||\n entry._tag !== \"Indexed\"\n )\n continue;\n yield* Effect.yieldNow;\n for (const chunk of entry.chunks) {\n const score = cosine(vector, chunk.vector);\n if (score < query.minScore) continue;\n candidates.push(\n MemoryIndexCandidate.make({\n ...entry.source,\n passageId: chunk.passageId,\n ordinal: chunk.ordinal,\n startByte: chunk.startByte,\n endByte: chunk.endByte,\n text: chunk.text,\n score,\n indexedAt: entry.indexedAt,\n }),\n );\n }\n }\n candidates.sort(\n (left, right) =>\n right.score - left.score ||\n compareText(left.key.id, right.key.id) ||\n compareText(left.source.revision, right.source.revision) ||\n left.ordinal - right.ordinal,\n );\n yield* ensureOpen(operation);\n return MemoryIndexSearch.make({ candidates: candidates.slice(0, query.limit), scannedChunks });\n });\n\n return SemanticMemoryIndex.fromAdapter({ profile, replace, withdraw, search });\n});\n\n/** Scoped disposable semantic index. No persistent build or recovery state is retained. */\nexport const inMemorySemanticIndexLayer = (\n profile: SemanticMemoryProfile,\n capacity: InMemorySemanticIndexCapacity,\n): Layer.Layer<SemanticMemoryIndex, MemoryIndexError> =>\n Layer.effect(SemanticMemoryIndex, makeIndex(profile, capacity));\n"],"mappings":";;;;AA2FA,MAAM,kBAAkB;;;;;;AAOxB,MAAM,aAA8C;CAClD,UAAU;CACV,OAAO;CACP,SAAS;CACT,QAAQ;CACR,SAAS;CACT,iBAAiB;CACjB,WAAW;CACX,SAAS;CACT,eAAe;CACf,SAAS;AACX;;;;;;AAuEA,MAAM,sCAAoD,IAAI,IAAI;CAChE;CACA;CACA;AACF,CAAC;AAkCD,MAAM,WAAc,WAAkC;CAAE,MAAM;CAAW;AAAM;AAC/E,MAAM,WAAc,WAAkC;CAAE,MAAM;CAAW;AAAM;AAE/E,MAAM,eAAe,WAAmB,SAAiB,UACvD,UAAU,KAAA,IACN,YAAY,KAAK;CAAE;CAAW;AAAQ,CAAC,IACvC,YAAY,KAAK;CAAE;CAAW;CAAS;AAAM,CAAC;AAEpD,MAAMA,aAAW,OAAO,GAAG,iCAAiC,CAAC,EAEzD,QACA,WACA,UAEA,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACxC,OAAO,QAAQ,OAAO,oBAAoB,MAAM,CAAC,GACjD,OAAO,UAAU,UAAU,YAAY,WAAW,WAAW,UAAU,WAAW,KAAK,CAAC,CAC1F,CACJ;AAEA,MAAM,qBAAqB,OAAO,WAAW,YAAY;AACzD,MAAM,kBAAkB,OAAO,WAAW,SAAS;AACnD,MAAM,kBAAkB,OAAO,WAAW,SAAS;AACnD,MAAM,uBAAuB,OAAO,WAAW,cAAc;AAC7D,MAAM,sBAAsB,OAAO,WAAW,aAAa;AAC3D,MAAM,sBAAsB,OAAO,WAAW,aAAa;AAC3D,MAAM,0BAA0B,OAAO,cAAc,aAAa;AAClE,MAAM,8BAA8B,OAAO,cAAc,iBAAiB;AAE1E,MAAM,OAAO,WAAiC,SAAS,MAAM,SAAS,WAAW,MAAM,CAAC;AAExF,MAAM,gBACJ,UACA,WACA,mBACW,GAAG,SAAS,QAAQ,UAAU,QAAQ;AAEnD,MAAM,cAAc,QAClB,mBAAmB,KAAK;CACtB,cAAc,IAAI;CAClB,UAAU,IAAI;CACd,eAAe,IAAI;CACnB,WAAW,IAAI;CACf,gBAAgB,IAAI;CACpB,SAAS,IAAI;CACb,cAAc,IAAI;CAClB,cAAc,IAAI;CAClB,cAAc,IAAI;CAClB,aAAa,IAAI;CACjB,WAAW,IAAI;CACf,OAAO,IAAI;CACX,WAAW,IAAI,IAAI,eAAe;CAClC,GAAI,IAAI,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,IAAI,eAAe;CACjF,GAAI,IAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,aAAa,EAAE;CAC7E,GAAI,IAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,eAAe,IAAI,cAAc;AAChF,CAAC;AAEH,MAAM,yBAAyB,QAC7B,+BAA+B,KAAK;CAClC,eAAe,IAAI;CACnB,oBAAoB,IAAI;CACxB,kBAAkB,IAAI;CACtB,QAAQ,IAAI;CACZ,YAAY,IAAI;CAChB,kBAAkB,IAAI;CACtB,YAAY,IAAI,IAAI,gBAAgB;CACpC,GAAI,IAAI,sBAAsB,KAAA,IAAY,CAAC,IAAI,EAAE,mBAAmB,IAAI,kBAAkB;CAC1F,GAAI,IAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,IAAI,WAAW;CACrE,GAAI,IAAI,yBAAyB,KAAA,IAC7B,CAAC,IACD,EAAE,gBAAgB,IAAI,IAAI,oBAAoB,EAAE;CACpD,GAAI,IAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,IAAI,IAAI,gBAAgB,EAAE;AACxF,CAAC;;AAGH,MAAM,qBACJ,MACA,UAEA,SAAS,KAAA,IACL,UAAU,KAAA,IACV,UAAU,KAAA,KACV,KAAK,uBAAuB,MAAM,sBAClC,KAAK,qBAAqB,MAAM;AAEtC,MAAM,aAAa,OAAoB,aACrC,MAAM,MAAM,IAAI,QAAQ,CAAC,EAAE,iBAAiB;AAE9C,MAAM,iBAAiB,OAAoB,WACzC,cAAc,KAAK;CACjB,cAAc,OAAO,IAAI;CACzB,aAAa,oBAAoB,UAAU,OAAO,OAAO,IAAI,QAAQ,CAAC;AACxE,CAAC;;AAGH,MAAM,YAAY,QAA0B,mBAC1C,OAAO,cAAc,KAAA,KAAa,OAAO,UAAU,mBAAmB;AAExE,MAAM,kBAAkB,OAAoB,YAA2C;CACrF,GAAG;CACH,aAAa,IAAI,IAAI,MAAM,WAAW,CAAC,CAAC,IAAI,OAAO,IAAI,cAAc,MAAM;AAC7E;AAEA,MAAM,wBACJ,OACA,iBACiB;CACjB,GAAG;CACH,mBAAmB,IAAI,IAAI,MAAM,iBAAiB,CAAC,CAAC,IAAI,YAAY,eAAe,WAAW;AAChG;AAEA,MAAM,YAAY,OAAoB,aAAqD;CACzF,IAAI;CACJ,KAAK,MAAM,UAAU,MAAM,YAAY,OAAO,GAAG;EAC/C,IAAI,OAAO,IAAI,aAAa,YAAY,OAAO,IAAI,UAAU,WAAW;EACxE,IAAI,SAAS,KAAA,KAAa,OAAO,IAAI,gBAAgB,KAAK,IAAI,eAAe,OAAO;CACtF;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,wBAAwB,UAAyC,CAAC,MACtE,OAAO,IAAI,aAAa;CACtB,MAAM,QAAQ,OAAO,IAAI,KAAkB;EACzC,6BAAa,IAAI,IAAI;EACrB,gCAAgB,IAAI,IAAI;EACxB,uBAAO,IAAI,IAAI;EACf,mCAAmB,IAAI,IAAI;EAC3B,aAAa;CACf,CAAC;CACD,MAAM,cAAc,SAAS,SAAS,gCAAgC;CAEtE,MAAM,eAAe,OAAO,QAAQ,mBAAmB,KAAK,EAAE,YAAY,cAAc,CAAC,CAAC;CAE1F,MAAM,QAA8C,OAAO,GAAG,8BAA8B,CAAC,EAC1F,gBACC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,kBAAkB,SAAS,WAAW;EACtE,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,MAAM,aAAa,QAAQ,UAAU,QAAQ,WAAW,QAAQ,cAAc;GACpF,MAAM,aAAa,QAAQ,eAAe,IAAI,GAAG;GACjD,IAAI,eAAe,KAAA,GAAW;IAC5B,MAAM,WAAW,QAAQ,YAAY,IAAI,UAAU;IACnD,IAAI,aAAa,KAAA,GACf,OAAO,CACL,QACE,YAAY,SAAS,iDAAiD,CACxE,GACA,OACF;IAIF,IACE,SAAS,IAAI,gBAAgB,QAAQ,eACrC,CAAC,kBAAkB,SAAS,IAAI,eAAe,QAAQ,aAAa,GAEpE,OAAO,CACL,QACE,kBAAkB,KAAK;KACrB,UAAU,QAAQ;KAClB,WAAW,QAAQ;KACnB,gBAAgB,QAAQ;KACxB,qBAAqB,SAAS,IAAI;KAClC,sBAAsB,QAAQ;IAChC,CAAC,CACH,GACA,OACF;IAEF,OAAO,CACL,QACE,gBAAgB,KAAK;KACnB,cAAc,SAAS,IAAI;KAC3B,WAAW,SAAS,IAAI;KACxB,eAAe,SAAS,IAAI;KAC5B,OAAO,SAAS,IAAI;KACpB,UAAU;IACZ,CAAC,CACH,GACA,OACF;GACF;GACA,IAAI,QAAQ,YAAY,QAAQ,iBAC9B,OAAO,CACL,QACE,YAAY,SAAS,8BAA8B,gBAAgB,UAAU,CAC/E,GACA,OACF;GAEF,MAAM,OAAO,QAAQ,MAAM,IAAI,QAAQ,QAAQ,KAAK;IAClD,mBAAmB;IACnB,eAAe;GACjB;GACA,MAAM,cAAc,QAAQ,cAAc;GAC1C,MAAM,MAAqB;IACzB,cAAc,mBAAmB,qBAAqB,aAAa;IACnE,UAAU,QAAQ;IAClB,eAAe,oBAAoB,KAAK,iBAAiB;IACzD,WAAW,QAAQ;IACnB,gBAAgB,QAAQ;IACxB,SAAS,QAAQ;IACjB,cAAc,QAAQ;IACtB,cAAc,QAAQ;IACtB,cAAc,QAAQ;IACtB,aAAa,QAAQ;IACrB,WAAW,gBAAgB,kBAAkB,aAAa;IAC1D,OAAO;IACP,gBAAgB,KAAA;IAChB,iBAAiB;IACjB,eAAe,KAAA;IACf,eAAe,QAAQ;GACzB;GACA,MAAM,cAAc,IAAI,IAAI,QAAQ,WAAW,CAAC,CAAC,IAAI,IAAI,cAAc;IACrE;IACA,WAAW,KAAA;IACX,cAAc,KAAA;IACd,aAAa,KAAA;IACb,aAAa,KAAA;IACb,wBAAwB,KAAA;IACxB,YAAY,KAAA;IACZ,aAAa,KAAA;IACb,mCAAmB,IAAI,IAAwC;IAC/D,oCAAoB,IAAI,IAAyC;GACnE,CAAC;GACD,MAAM,iBAAiB,IAAI,IAAI,QAAQ,cAAc,CAAC,CAAC,IAAI,KAAK,IAAI,YAAY;GAChF,MAAM,QAAQ,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,UAAU;IACzD,mBAAmB,KAAK,oBAAoB;IAC5C,eAAe,KAAK;GACtB,CAAC;GACD,OAAO,CACL,QACE,gBAAgB,KAAK;IACnB,cAAc,IAAI;IAClB,WAAW,IAAI;IACf,eAAe,IAAI;IACnB,OAAO,IAAI;IACX,UAAU;GACZ,CAAC,CACH,GACA;IAAE,GAAG;IAAS;IAAa;IAAgB;IAAO;GAAY,CAChE;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACL;CAEA,MAAM,YAAsD,OAAO,GACjE,kCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,kBAAkB,aAAa,WAAW;EAC1E,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAiE;GAChE,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QAAQ,YAAY,aAAa,sBAAsB,QAAQ,cAAc,CAAC,GAC9E,OACF;GAEF,IAAI,OAAO,IAAI,UAAU,YAAY,OAAO,CAAC,QAAQ,KAAA,CAAS,GAAG,OAAO;GACxE,OAAO,CACL,QAAQ,KAAA,CAAS,GACjB,eAAe,SAAS;IACtB,GAAG;IACH,KAAK;KAAE,GAAG,OAAO;KAAK,OAAO;KAAS,eAAe;IAAU;GACjE,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,SAAgD,OAAO,GAC3D,+BACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,kBAAkB,UAAU,WAAW;EACvE,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,MAAM,eACJ,QAAQ,SAAS,yBACb,QAAQ,eACR,QAAQ,eAAe,IACrB,aAAa,QAAQ,UAAU,QAAQ,WAAW,QAAQ,cAAc,CAC1E;EACN,MAAM,SACJ,iBAAiB,KAAA,IAAY,KAAA,IAAY,QAAQ,YAAY,IAAI,YAAY;EAC/E,OAAO,WAAW,KAAA,IAAY,OAAO,KAAK,IAAI,OAAO,KAAK,WAAW,OAAO,GAAG,CAAC;CAClF,CAAC,CACH;CAEA,MAAM,mBAAoE,OAAO,GAC/E,yCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,uBAAuB,oBAAoB,WAAW;EAGtF,IAAI,QAAQ,0BAA0B,KAAA,GAAW;GAC/C,MAAM,QAAQ,OAAO,QAAQ;GAC7B,IAAI,OAAO,OAAO,KAAK,GACrB,OAAO,uBAAuB,KAAK,EAAE,QAAQ,MAAM,MAAM,CAAC;EAE9D;EACA,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,MAAM,eAAe,QAAQ,eAAe,IAC1C,aAAa,QAAQ,UAAU,QAAQ,WAAW,QAAQ,cAAc,CAC1E;EACA,MAAM,SACJ,iBAAiB,KAAA,IAAY,KAAA,IAAY,QAAQ,YAAY,IAAI,YAAY;EAC/E,OAAO,WAAW,KAAA,IACd,qBAAqB,KAAK,IAC1B,kBAAkB,KAAK,EAAE,YAAY,WAAW,OAAO,GAAG,EAAE,CAAC;CACnE,CAAC,CACH;CAEA,MAAM,QAA8C,OAAO,GAAG,8BAA8B,CAAC,EAC1F,gBACC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,cAAc,SAAS,WAAW;EAClE,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAiF;GAChF,MAAM,OAAO,SAAS,SAAS,QAAQ,QAAQ;GAC/C,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC,QAAQ,OAAO,KAAK,CAAC,GAAG,OAAO;GAC/D,IACE,oBAAoB,IAAI,KAAK,IAAI,KAAK,KACrC,KAAK,IAAI,UAAU,aAAa,KAAK,gBAAgB,KAAA,GAEtD,OAAO,CAAC,QAAQ,OAAO,KAAK,CAAC,GAAG,OAAO;GACzC,IACE,KAAK,cAAc,KAAA,KACnB,KAAK,UAAU,uBAAuB,aACtC,KAAK,UAAU,oBAAoB,QAAQ,YAE3C,OAAO,CAAC,QAAQ,OAAO,KAAK,CAAC,GAAG,OAAO;GAEzC,MAAM,OAAO,QAAQ,MAAM,IAAI,QAAQ,QAAQ;GAC/C,IAAI,SAAS,KAAA,GACX,OAAO,CACL,QAAQ,YAAY,SAAS,sCAAsC,CAAC,GACpE,OACF;GAEF,MAAM,gBAAgB,oBAAoB,KAAK,gBAAgB,CAAC;GAChE,MAAM,cAAc,QAAQ,cAAc;GAC1C,MAAM,YAA6B;IACjC,WAAW,gBAAgB,kBAAkB,aAAa;IAC1D,gBAAgB,qBAAqB,oBAAoB,aAAa;IACtE;IACA,iBAAiB,QAAQ;IACzB,sBAAsB,YAAY;GACpC;GACA,MAAM,MACJ,KAAK,IAAI,UAAU,UAAU;IAAE,GAAG,KAAK;IAAK,OAAO;GAAU,IAAI,KAAK;GACxE,MAAM,OAAO,eAAe,SAAS;IAAE,GAAG;IAAM;IAAK;GAAU,CAAC;GAChE,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,QAAQ,UAAU;IACtD,mBAAmB,KAAK;IACxB,eAAe,KAAK,gBAAgB;GACtC,CAAC;GACD,OAAO,CACL,QACE,OAAO,KACL,MAAM,KAAK;IACT,cAAc,IAAI;IAClB,WAAW,UAAU;IACrB,gBAAgB,UAAU;IAC1B;IACA,gBAAgB,IAAI,UAAU,oBAAoB;IAClD,cAAc,IAAI;GACpB,CAAC,CACH,CACF,GACA;IAAE,GAAG;IAAM;IAAO;GAAY,CAChC;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACL;CAEA,MAAM,iBAAgE,OAAO,GAC3E,uCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,uBAAuB,kBAAkB,WAAW;EACpF,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YACoF;GACpF,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YAAY,kBAAkB,sBAAsB,QAAQ,cAAc,CAC5E,GACA,OACF;GAEF,IAAI,OAAO,cAAc,KAAA,KAAa,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAC5E,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAE1D,MAAM,YAA6B;IACjC,GAAG,OAAO;IACV,sBAAsB,YAAY;GACpC;GACA,OAAO,CACL,QACE,iBAAiB,KAAK;IACpB,gBAAgB,UAAU;IAC1B,gBAAgB,IAAI,UAAU,oBAAoB;GACpD,CAAC,CACH,GACA,eAAe,SAAS;IAAE,GAAG;IAAQ;GAAU,CAAC,CAClD;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,mBAAoE,OAAO,GAC/E,yCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,yBAAyB,oBAAoB,WAAW;EACxF,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAiF;GAChF,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YAAY,oBAAoB,sBAAsB,QAAQ,cAAc,CAC9E,GACA,OACF;GAEF,IAAI,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAC1C,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAE1D,OAAO,CACL,QAAQ,KAAA,CAAS,GACjB,eAAe,SAAS;IAAE,GAAG;IAAQ,WAAW,KAAA;GAAU,CAAC,CAC7D;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,mBAAoE,OAAO,GAC/E,yCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,yBAAyB,oBAAoB,WAAW;EACxF,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAiF;GAChF,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YAAY,oBAAoB,sBAAsB,QAAQ,cAAc,CAC9E,GACA,OACF;GAEF,IAAI,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAC1C,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAE1D,MAAM,SAAS,mBAAmB,KAAK;IACrC,UAAU,QAAQ;IAClB,UAAU,QAAQ;GACpB,CAAC;GACD,MAAM,MACJ,WAAW,OAAO,IAAI,SAAS,WAAW,mBACtC;IAAE,GAAG,OAAO;IAAK,OAAO;GAAgB,IACxC,OAAO;GACb,OAAO,CACL,QAAQ,KAAA,CAAS,GACjB,eAAe,SAAS;IAAE,GAAG;IAAQ;IAAK,cAAc;GAAO,CAAC,CAClE;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,oBAAsE,OAAO,GACjF,0CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,uBAAuB,qBAAqB,WAAW;EACvF,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YAAY,qBAAqB,sBAAsB,QAAQ,cAAc,CAC/E,GACA,OACF;GAKF,MAAM,mBACJ,OAAO,IAAI,UAAU,YAAY,OAAO,2BAA2B,KAAA;GAKrE,MAAM,wBACJ,QAAQ,YAAY,aACpB,OAAO,gBAAgB,KAAA,KACvB,OAAO,cAAc,KAAA,MACpB,OAAO,IAAI,UAAU,WAAW,OAAO,IAAI,UAAU;GACxD,IACE,CAAC,oBACD,CAAC,yBACD,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAExC,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAE1D,MAAM,WAAW,OAAO;GACxB,IAAI,aAAa,KAAA,GAAW;IAC1B,IACE,SAAS,iBAAiB,QAAQ,gBAClC,SAAS,YAAY,QAAQ,WAC7B,SAAS,iBAAiB,QAAQ,cAElC,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,iBAAiB,SAAS;IAC5B,CAAC,CACH,GACA,OACF;IAEF,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,cAAc,SAAS;KACvB,SAAS,SAAS;KAClB,QAAQ,SAAS;KACjB,cAAc,SAAS;KACvB,UAAU;IACZ,CAAC,CACH,GACA,OACF;GACF;GACA,MAAM,cAAiC;IACrC,cAAc,QAAQ;IACtB,SAAS,QAAQ;IACjB,QAAQ,QAAQ;IAChB,cAAc,QAAQ;IACtB,mBAAmB,KAAA;GACrB;GACA,MAAM,MACJ,WAAW,OAAO,IAAI,SAAS,WAAW,gBACtC;IAAE,GAAG,OAAO;IAAK,OAAO;GAAgB,IACxC,OAAO;GACb,OAAO,CACL,QACE,mBAAmB,KAAK;IACtB,cAAc,QAAQ;IACtB,cAAc,YAAY;IAC1B,SAAS,YAAY;IACrB,QAAQ,YAAY;IACpB,cAAc,YAAY;IAC1B,UAAU;GACZ,CAAC,CACH,GACA,eAAe,SAAS;IAAE,GAAG;IAAQ;IAAK;GAAY,CAAC,CACzD;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,qBAAwE,OAAO,GACnF,2CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,wBAAwB,sBAAsB,WAAW;EACzF,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YACmF;GACnF,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YAAY,sBAAsB,sBAAsB,QAAQ,cAAc,CAChF,GACA,OACF;GAEF,MAAM,cAAc,OAAO;GAC3B,IAAI,gBAAgB,KAAA,GAClB,OAAO,CACL,QACE,YACE,sBACA,4CAA4C,QAAQ,cACtD,CACF,GACA,OACF;GAEF,MAAM,oBAAoB,4BAA4B,YAAY,MAAM;GACxE,IAAK,YAAY,YAAY,cAAe,sBAAsB,KAAA,IAChE,OAAO,CACL,QACE,YACE,sBACA,yCAAyC,QAAQ,aAAa,oCAChE,CACF,GACA,OACF;GAEF,IAAI,YAAY,iBAAiB,QAAQ,cACvC,OAAO,CACL,QACE,mBAAmB,KAAK;IACtB,cAAc,QAAQ;IACtB,iBAAiB,YAAY;GAC/B,CAAC,CACH,GACA,OACF;GAEF,IAAI,YAAY,sBAAsB,KAAA,GACpC,OAAO,CACL,QACE,WAAW,KAAK;IACd,cAAc,OAAO,IAAI;IACzB,cAAc,YAAY;IAC1B,WAAW,OAAO,IAAI;IACtB,SAAS,YAAY;IACrB,GAAI,sBAAsB,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,kBAAkB;IACxE,WAAW,IAAI,YAAY,iBAAiB;GAC9C,CAAC,CACH,GACA,OACF;GAEF,MAAM,OAAO,eAAe,SAAS;IACnC,GAAG;IACH,KAAK;KAAE,GAAG,OAAO;KAAK,OAAO;KAAW,gBAAgB,YAAY;IAAQ;IAC5E,WAAW,KAAA;IACX,aAAa;KAAE,GAAG;KAAa,mBAAmB;IAAU;GAC9D,CAAC;GACD,OAAO,CACL,QACE,WAAW,KAAK;IACd,cAAc,OAAO,IAAI;IACzB,cAAc,YAAY;IAC1B,WAAW,OAAO,IAAI;IACtB,SAAS,YAAY;IACrB,GAAI,sBAAsB,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,kBAAkB;IACxE,WAAW,IAAI,SAAS;GAC1B,CAAC,CACH,GACA,IACF;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,eAA4D,OAAO,GACvE,qCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,cAAc,gBAAgB,WAAW;EACzE,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QAAQ,YAAY,gBAAgB,sBAAsB,QAAQ,cAAc,CAAC,GACjF,OACF;GAKF,IAAI,OAAO,IAAI,UAAU,UAAU;IACjC,IAAI,OAAO,2BAA2B,KAAA,GACpC,OAAO,CACL,QACE,YACE,gBACA,qBAAqB,QAAQ,aAAa,6BAC5C,CACF,GACA,OACF;IAEF,OAAO,CACL,QACE,aAAa,KAAK;KAChB,cAAc,QAAQ;KACtB,kBAAkB,OAAO;IAC3B,CAAC,CACH,GACA,OACF;GACF;GACA,IAAI,OAAO,IAAI,UAAU,WAAW;IAClC,IAAI,OAAO,IAAI,mBAAmB,KAAA,GAChC,OAAO,CACL,QACE,YACE,gBACA,sBAAsB,QAAQ,aAAa,wBAC7C,CACF,GACA,OACF;IAEF,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,iBAAiB,OAAO,IAAI;IAC9B,CAAC,CACH,GACA,OACF;GACF;GACA,IAAI,OAAO,gBAAgB,KAAA,GAAW,OAAO,CAAC,QAAQ,OAAO,WAAW,GAAG,OAAO;GAClF,MAAM,SAAS,YAAY,KAAK;IAC9B,cAAc,QAAQ;IACtB,QAAQ,QAAQ;IAChB,QAAQ,QAAQ;IAChB,aAAa,IAAI,SAAS;GAC5B,CAAC;GACD,OAAO,CAAC,QAAQ,MAAM,GAAG,eAAe,SAAS;IAAE,GAAG;IAAQ,aAAa;GAAO,CAAC,CAAC;EACtF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,eAA4D,OAAO,GACvE,qCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,qBAAqB,gBAAgB,WAAW;EAChF,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,OAAO,QAAQ,YAAY,IAAI,QAAQ,gBAAgB;GAC7D,IAAI,SAAS,KAAA,GACX,OAAO,CACL,QACE,YAAY,gBAAgB,sBAAsB,QAAQ,kBAAkB,CAC9E,GACA,OACF;GAEF,IAAI,KAAK,IAAI,aAAa,QAAQ,UAChC,OAAO,CACL,QACE,YACE,gBACA,mBAAmB,QAAQ,iBAAiB,6BAA6B,QAAQ,UACnF,CACF,GACA,OACF;GAEF,IAAI,CAAC,SAAS,MAAM,QAAQ,cAAc,GACxC,OAAO,CAAC,QAAQ,cAAc,SAAS,IAAI,CAAC,GAAG,OAAO;GAExD,MAAM,QAAQ,CAAC,GAAG,QAAQ,YAAY,OAAO,CAAC,CAAC,CAC5C,QACE,WACC,OAAO,IAAI,aAAa,QAAQ,YAChC,OAAO,IAAI,gBAAgB,KAAK,IAAI,aACxC,CAAC,CACA,MAAM,MAAM,UAAU,KAAK,IAAI,gBAAgB,MAAM,IAAI,aAAa;GACzE,MAAM,SAA8B,CAAC;GACrC,MAAM,cAAc,IAAI,IAAI,QAAQ,WAAW;GAC/C,KAAK,MAAM,UAAU,OAAO;IAC1B,IAAI,OAAO,UAAU,QAAQ,UAAU;IAGvC,KACG,OAAO,IAAI,UAAU,aAAa,OAAO,IAAI,UAAU,aACxD,OAAO,2BAA2B,QAAQ,kBAE1C;IAKF,IAAI,OAAO,IAAI,UAAU,aAAa,OAAO,IAAI,mBAAmB,WAClE;IAIF,IAAI,OAAO,IAAI,UAAU,SAAS;IAClC,YAAY,IAAI,OAAO,IAAI,cAAc;KACvC,GAAG;KACH,KAAK;MAAE,GAAG,OAAO;MAAK,OAAO;KAAU;KACvC,wBAAwB,QAAQ;IAClC,CAAC;IACD,OAAO,KACL,aAAa,KAAK;KAChB,cAAc,OAAO,IAAI;KACzB,eAAe,OAAO,IAAI;KAC1B,cAAc,OAAO,IAAI;IAC3B,CAAC,CACH;GACF;GACA,OAAO,CAAC,QAAQ,MAAM,GAAG;IAAE,GAAG;IAAS;GAAY,CAAC;EACtD,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,aAAwD,OAAO,GACnE,mCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,mBAAmB,cAAc,WAAW;EAC5E,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAiF;GAChF,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QAAQ,YAAY,cAAc,sBAAsB,QAAQ,cAAc,CAAC,GAC/E,OACF;GAEF,IAAI,OAAO,2BAA2B,KAAA,GACpC,OAAO,CACL,QACE,YACE,cACA,cAAc,QAAQ,aAAa,+BACrC,CACF,GACA,OACF;GAEF,MAAM,OAAO,QAAQ,YAAY,IAAI,OAAO,sBAAsB;GAClE,IAAI,SAAS,KAAA,GACX,OAAO,CACL,QACE,YACE,cACA,mBAAmB,OAAO,uBAAuB,YACnD,CACF,GACA,OACF;GAIF,IAAI,CAAC,SAAS,MAAM,QAAQ,cAAc,GACxC,OAAO,CAAC,QAAQ,cAAc,SAAS,IAAI,CAAC,GAAG,OAAO;GAExD,IAAI,OAAO,iBAAiB,KAAA,GAAW;IACrC,IACE,OAAO,aAAa,aAAa,QAAQ,YACzC,OAAO,aAAa,aAAa,QAAQ,UAEzC,OAAO,CAAC,QAAQ,KAAA,CAAS,GAAG,OAAO;IAErC,OAAO,CACL,QACE,YACE,cACA,8DAA8D,QAAQ,cACxE,CACF,GACA,OACF;GACF;GACA,IAAI,OAAO,IAAI,UAAU,aAAa,OAAO,IAAI,UAAU,UACzD,OAAO,CACL,QACE,YACE,cACA,0BAA0B,QAAQ,aAAa,qBAAqB,OAAO,IAAI,OACjF,CACF,GACA,OACF;GAEF,MAAM,SAAS,mBAAmB,KAAK;IACrC,UAAU,QAAQ;IAClB,UAAU,QAAQ;GACpB,CAAC;GACD,OAAO,CACL,QAAQ,KAAA,CAAS,GACjB,eAAe,SAAS;IACtB,GAAG;IACH,KAAK;KAAE,GAAG,OAAO;KAAK,OAAO;IAAS;IACtC,cAAc;GAChB,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,gBAA8D,OAAO,GACzE,sCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,sBAAsB,iBAAiB,WAAW;EAClF,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAiE;GAChE,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QAAQ,YAAY,iBAAiB,sBAAsB,QAAQ,cAAc,CAAC,GAClF,OACF;GAIF,IAAI,OAAO,IAAI,UAAU,WAAW,OAAO,CAAC,QAAQ,KAAA,CAAS,GAAG,OAAO;GACvE,OAAO,CACL,QAAQ,KAAA,CAAS,GACjB,eAAe,SAAS;IACtB,GAAG;IACH,KAAK;KAAE,GAAG,OAAO;KAAK,OAAO;IAAQ;IACrC,wBAAwB,KAAA;GAC1B,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,UAAkD,OAAO,GAC7D,gCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,gBAAgB,WAAW,WAAW;EACtE,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QAAQ,YAAY,WAAW,sBAAsB,QAAQ,cAAc,CAAC,GAC5E,OACF;GAEF,IAAI,OAAO,IAAI,UAAU,WAAW;IAClC,IAAI,OAAO,IAAI,mBAAmB,KAAA,GAChC,OAAO,CACL,QACE,YACE,WACA,sBAAsB,QAAQ,aAAa,wBAC7C,CACF,GACA,OACF;IAEF,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,iBAAiB,OAAO,IAAI;IAC9B,CAAC,CACH,GACA,OACF;GACF;GAGA,IAAI,OAAO,gBAAgB,KAAA,GACzB,OAAO,CACL,QACE,mBAAmB,KAAK;IACtB,cAAc,QAAQ;IACtB,iBAAiB,OAAO,YAAY;GACtC,CAAC,CACH,GACA,OACF;GAEF,IAAI,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAC1C,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAc1D,IARE,QAAQ,OAAO,SAAS,oBACpB,QAAQ,OAAO,YAAY,OAAO,eAChC,OAAO,kBAAkB,IAAI,UAAU,CACzC,IACA,QAAQ,OAAO,SAAS,OACrB,UACC,QAAQ,YAAY,IAAI,MAAM,iBAAiB,CAAC,EAAE,IAAI,UAAU,SACpE,GAEJ,OAAO,CAAC,QAAQ,oBAA6B,GAAG,OAAO;GAEzD,OAAO,CACL,QAAQ,WAAoB,GAC5B,eAAe,SAAS;IACtB,GAAG;IACH,KAAK;KAAE,GAAG,OAAO;KAAK,OAAO;IAAY;IACzC,WAAW,KAAA;IACX,YAAY;KAAE,QAAQ,QAAQ;KAAQ,mBAAmB;IAAU;GACrE,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,yBAAgF,OAAO,GAC3F,+CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,yBACA,0BACA,WACF;EACA,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YACE,0BACA,sBAAsB,QAAQ,cAChC,CACF,GACA,OACF;GAEF,IAAI,OAAO,IAAI,UAAU,WAAW;IAClC,IAAI,OAAO,IAAI,mBAAmB,KAAA,GAChC,OAAO,CACL,QACE,YACE,0BACA,sBAAsB,QAAQ,aAAa,wBAC7C,CACF,GACA,OACF;IAEF,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,iBAAiB,OAAO,IAAI;IAC9B,CAAC,CACH,GACA,OACF;GACF;GACA,MAAM,WAAW,OAAO,kBAAkB,IAAI,QAAQ,UAAU;GAChE,IAAI,aAAa,KAAA,GAAW;IAC1B,IAAI,SAAS,aAAa,QAAQ,UAChC,OAAO,CACL,QACE,iBAAiB,KAAK;KACpB,cAAc,QAAQ;KACtB,YAAY,QAAQ;KACpB,kBAAkB,SAAS;IAC7B,CAAC,CACH,GACA,OACF;IAEF,OAAO,CAAC,QAAQ,QAAQ,GAAG,OAAO;GACpC;GACA,MAAM,SAAS,uBAAuB,KAAK;IACzC,cAAc,QAAQ;IACtB,YAAY,QAAQ;IACpB,UAAU,QAAQ;IAClB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IAChB,WAAW,IAAI,SAAS;GAC1B,CAAC;GACD,MAAM,oBAAoB,IAAI,IAAI,OAAO,iBAAiB,CAAC,CAAC,IAC1D,QAAQ,YACR,MACF;GAIA,MAAM,QACJ,OAAO,IAAI,UAAU,eACrB,OAAO,eAAe,KAAA,KACtB,OAAO,WAAW,OAAO,SAAS,qBAClC,OAAO,WAAW,OAAO,YAAY,OAAO,eAC1C,kBAAkB,IAAI,UAAU,CAClC;GACF,OAAO,CACL,QAAQ,MAAM,GACd,eAAe,SAAS;IACtB,GAAG;IACH,KAAK,QAAQ;KAAE,GAAG,OAAO;KAAK,OAAO;IAAgB,IAAI,OAAO;IAChE,YAAY,QAAQ,KAAA,IAAY,OAAO;IACvC;GACF,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,cAA0D,OAAO,GACrE,oCACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WAAS,oBAAoB,eAAe,WAAW;EAC9E,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAsF;GACrF,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QAAQ,YAAY,eAAe,sBAAsB,QAAQ,cAAc,CAAC,GAChF,OACF;GAEF,IAAI,OAAO,IAAI,UAAU,WAAW;IAClC,IAAI,OAAO,IAAI,mBAAmB,KAAA,GAChC,OAAO,CACL,QACE,YACE,eACA,sBAAsB,QAAQ,aAAa,wBAC7C,CACF,GACA,OACF;IAEF,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,iBAAiB,OAAO,IAAI;IAC9B,CAAC,CACH,GACA,OACF;GACF;GAGA,IAAI,OAAO,gBAAgB,KAAA,GACzB,OAAO,CACL,QACE,mBAAmB,KAAK;IACtB,cAAc,QAAQ;IACtB,iBAAiB,OAAO,YAAY;GACtC,CAAC,CACH,GACA,OACF;GAIF,MAAM,WAAW,OAAO;GACxB,MAAM,QAAQ,IAAI,IAAI,UAAU,eAAe,CAAC,CAAC;GACjD,MAAM,SAAS,CACb,GAAI,UAAU,eAAe,CAAC,GAC9B,GAAG,QAAQ,YAAY,QAAQ,eAAe,CAAC,MAAM,IAAI,UAAU,CAAC,CACtE;GACA,OAAO,CACL,QAAQ,KAAA,CAAS,GACjB,eAAe,SAAS;IACtB,GAAG;IACH,KACE,OAAO,IAAI,UAAU,YAAY,OAAO,MAAM;KAAE,GAAG,OAAO;KAAK,OAAO;IAAU;IAClF,aAAa;KAAE,QAAQ,UAAU,UAAU,QAAQ;KAAQ,aAAa;IAAO;GACjF,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,0BACJ,OAAO,GAAG,gDAAgD,CAAC,EAAE,gBAC3D,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,0BACA,2BACA,WACF;EACA,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAOG;GACH,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;GAC3D,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YACE,2BACA,sBAAsB,QAAQ,cAChC,CACF,GACA,OACF;GAEF,IAAI,OAAO,IAAI,UAAU,WAAW;IAClC,IAAI,OAAO,IAAI,mBAAmB,KAAA,GAChC,OAAO,CACL,QACE,YACE,2BACA,sBAAsB,QAAQ,aAAa,wBAC7C,CACF,GACA,OACF;IAEF,OAAO,CACL,QACE,mBAAmB,KAAK;KACtB,cAAc,QAAQ;KACtB,iBAAiB,OAAO,IAAI;IAC9B,CAAC,CACH,GACA,OACF;GACF;GACA,MAAM,WAAW,OAAO,mBAAmB,IAAI,QAAQ,UAAU;GACjE,IACE,aAAa,KAAA,KACb,CAAC,4BAA4B,SAAS,OAAO,YAAY,QAAQ,UAAU,GAE3E,OAAO,CACL,QACE,0BAA0B,KAAK;IAC7B,cAAc,QAAQ;IACtB,YAAY,QAAQ;GACtB,CAAC,CACH,GACA,OACF;GAEF,MAAM,SACJ,UAAU,UACV,wBAAwB,KAAK;IAC3B,cAAc,QAAQ;IACtB,YAAY,QAAQ;IACpB,QAAQ,QAAQ;IAChB,QAAQ,QAAQ;IAChB,YAAY,QAAQ;IACpB,YAAY,IAAI,SAAS;GAC3B,CAAC;GACH,MAAM,qBACJ,aAAa,KAAA,IACT,OAAO,qBACP,IAAI,IAAI,OAAO,kBAAkB,CAAC,CAAC,IAAI,QAAQ,YAAY,EACzD,OACF,CAAC;GAIP,MAAM,QACJ,OAAO,IAAI,UAAU,aACrB,OAAO,gBAAgB,KAAA,KACvB,OAAO,YAAY,YAAY,OAAO,eACpC,mBAAmB,IAAI,UAAU,CACnC;GACF,OAAO,CACL,QAAQ,MAAM,GACd,eAAe,SAAS;IACtB,GAAG;IACH,KAAK,QAAQ;KAAE,GAAG,OAAO;KAAK,OAAO;IAAgB,IAAI,OAAO;IAChE,aAAa,QAAQ,KAAA,IAAY,OAAO;IACxC;GACF,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEF,MAAM,qBAAwE,OAAO,GACnF,2CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,0BACA,sBACA,WACF;EACA,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAgF;GAC/E,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,kBAAkB;GACjE,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YACE,sBACA,sBAAsB,QAAQ,oBAChC,CACF,GACA,OACF;GAMF,MAAM,QAAQ,QAAQ,YAAY,IAAI,QAAQ,iBAAiB;GAK/D,IAAI,EAHF,UAAU,KAAA,MACT,MAAM,IAAI,UAAU,aAClB,MAAM,IAAI,UAAU,mBAAmB,MAAM,gBAAgB,KAAA,KAEhE,OAAO,CACL,QACE,YACE,sBACA,oBAAoB,QAAQ,kBAAkB,4BAChD,CACF,GACA,OACF;GAEF,IACE,OAAO,IAAI,UAAU,eACrB,OAAO,eAAe,KAAA,KACtB,OAAO,WAAW,OAAO,SAAS,mBAElC,OAAO,CAAC,QAAQ,aAAsB,GAAG,OAAO;GAElD,MAAM,WAAW,OAAO,WAAW,OAAO;GAC1C,IAAI,CAAC,SAAS,MAAM,UAAU,MAAM,sBAAsB,QAAQ,iBAAiB,GACjF,OAAO,CAAC,QAAQ,aAAsB,GAAG,OAAO;GAWlD,IAAI,CAPe,SAAS,OAAO,UAAU;IAC3C,MAAM,SAAS,QAAQ,YAAY,IAAI,MAAM,iBAAiB;IAC9D,OACE,QAAQ,IAAI,UAAU,aACrB,QAAQ,IAAI,UAAU,mBAAmB,OAAO,gBAAgB,KAAA;GAErE,CACc,GAAG,OAAO,CAAC,QAAQ,eAAwB,GAAG,OAAO;GACnE,OAAO,CACL,QAAQ,OAAgB,GACxB,eAAe,SAAS;IACtB,GAAG;IACH,KAAK;KAAE,GAAG,OAAO;KAAK,OAAO;IAAgB;IAC7C,YAAY,KAAA;GACd,CAAC,CACH;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,qBAAwE,OAAO,GACnF,2CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,+BACA,sBACA,WACF;EACA,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,WAAW,QAAQ,kBAAkB,IAAI,QAAQ,aAAa;GACpE,IAAI,aAAa,KAAA,GAAW;IAQ1B,IAAI,EAJF,SAAS,uBAAuB,QAAQ,sBACxC,SAAS,qBAAqB,QAAQ,oBACtC,SAAS,qBAAqB,QAAQ,oBACtC,wBAAwB,SAAS,YAAY,QAAQ,UAAU,IAE/D,OAAO,CACL,QACE,yBAAyB,KAAK;KAC5B,eAAe,QAAQ;KACvB,QAAQ,SAAS;KACjB,SACE;IACJ,CAAC,CACH,GACA,OACF;IAEF,OAAO,CACL,QACE,oBAAoB,KAAK;KACvB,aAAa,sBAAsB,QAAQ;KAC3C,UAAU;IACZ,CAAC,CACH,GACA,OACF;GACF;GACA,KAAK,MAAM,eAAe,QAAQ,kBAAkB,OAAO,GACzD,IACE,YAAY,uBAAuB,QAAQ,sBAC3C,YAAY,qBAAqB,QAAQ,kBAEzC,OAAO,CACL,QACE,yBAAyB,KAAK;IAC5B,eAAe,QAAQ;IACvB,QAAQ,YAAY;IACpB,SAAS,oBAAoB,QAAQ,iBAAiB,4BAA4B,YAAY,cAAc;GAC9G,CAAC,CACH,GACA,OACF;GAGJ,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,kBAAkB;GACjE,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YACE,sBACA,sBAAsB,QAAQ,oBAChC,CACF,GACA,OACF;GAIF,IAAI,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAC1C,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAE1D,MAAM,cAAsC;IAC1C,eAAe,QAAQ;IACvB,oBAAoB,QAAQ;IAC5B,kBAAkB,QAAQ;IAC1B,mBAAmB,KAAA;IACnB,QAAQ;IACR,YAAY,QAAQ;IACpB,kBAAkB,QAAQ;IAC1B,YAAY,KAAA;IACZ,kBAAkB;IAClB,sBAAsB,KAAA;IACtB,kBAAkB,KAAA;GACpB;GACA,OAAO,CACL,QACE,oBAAoB,KAAK;IACvB,aAAa,sBAAsB,WAAW;IAC9C,UAAU;GACZ,CAAC,CACH,GACA,qBAAqB,SAAS,WAAW,CAC3C;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,2BACJ,OAAO,GAAG,iDAAiD,CAAC,EAAE,gBAC5D,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,iCACA,4BACA,WACF;EACA,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAOG;GACH,MAAM,cAAc,QAAQ,kBAAkB,IAAI,QAAQ,aAAa;GACvE,IAAI,gBAAgB,KAAA,GAClB,OAAO,CACL,QACE,YACE,4BACA,6BAA6B,QAAQ,eACvC,CACF,GACA,OACF;GAEF,IAAI,YAAY,sBAAsB,KAAA,GAAW;IAE/C,IAAI,YAAY,sBAAsB,QAAQ,mBAC5C,OAAO,CAAC,QAAQ,sBAAsB,WAAW,CAAC,GAAG,OAAO;IAE9D,OAAO,CACL,QACE,yBAAyB,KAAK;KAC5B,eAAe,QAAQ;KACvB,QAAQ,YAAY;KACpB,SAAS,eAAe,QAAQ,cAAc,yBAAyB,YAAY,kBAAkB;IACvG,CAAC,CACH,GACA,OACF;GACF;GACA,MAAM,SAAS,QAAQ,YAAY,IAAI,YAAY,kBAAkB;GACrE,IAAI,WAAW,KAAA,GACb,OAAO,CACL,QACE,YACE,4BACA,sBAAsB,YAAY,oBACpC,CACF,GACA,OACF;GAEF,IAAI,CAAC,SAAS,QAAQ,QAAQ,cAAc,GAC1C,OAAO,CAAC,QAAQ,cAAc,SAAS,MAAM,CAAC,GAAG,OAAO;GAE1D,IAAI,YAAY,WAAW,YACzB,OAAO,CACL,QACE,yBAAyB,KAAK;IAC5B,eAAe,QAAQ;IACvB,QAAQ,YAAY;IACpB,SAAS,8BAA8B,YAAY,OAAO;GAC5D,CAAC,CACH,GACA,OACF;GAIF,IAAI,CAAC,QAAQ,YAAY,IAAI,QAAQ,iBAAiB,GACpD,OAAO,CACL,QACE,YACE,4BACA,4BAA4B,QAAQ,mBACtC,CACF,GACA,OACF;GAEF,MAAM,WAAmC;IACvC,GAAG;IACH,mBAAmB,QAAQ;GAC7B;GACA,OAAO,CACL,QAAQ,sBAAsB,QAAQ,CAAC,GACvC,qBAAqB,SAAS,QAAQ,CACxC;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEF,MAAM,0BACJ,OAAO,GAAG,gDAAgD,CAAC,EAAE,gBAC3D,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,gCACA,2BACA,WACF;EACA,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,cAAc,QAAQ,kBAAkB,IAAI,QAAQ,aAAa;GACvE,IAAI,gBAAgB,KAAA,GAClB,OAAO,CACL,QACE,YACE,2BACA,6BAA6B,QAAQ,eACvC,CACF,GACA,OACF;GAEF,IAAI,YAAY,WAAW,YAAY;IAGrC,IACE,YAAY,eAAe,KAAA,KAC3B,wBAAwB,YAAY,YAAY,QAAQ,UAAU,GAElE,OAAO,CAAC,QAAQ,sBAAsB,WAAW,CAAC,GAAG,OAAO;IAE9D,OAAO,CACL,QACE,yBAAyB,KAAK;KAC5B,eAAe,QAAQ;KACvB,QAAQ,YAAY;KACpB,SACE;IACJ,CAAC,CACH,GACA,OACF;GACF;GACA,MAAM,SAAiC;IACrC,GAAG;IACH,QAAQ;IACR,YAAY,QAAQ;IACpB,sBAAsB;GACxB;GACA,OAAO,CACL,QAAQ,sBAAsB,MAAM,CAAC,GACrC,qBAAqB,SAAS,MAAM,CACtC;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEF,MAAM,qBAAwE,OAAO,GACnF,2CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,2BACA,sBACA,WACF;EACA,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,WAAW,OAAO,IAAI,OAC1B,QAEE,YAIG;GACH,MAAM,cAAc,QAAQ,kBAAkB,IAAI,QAAQ,aAAa;GACvE,IAAI,gBAAgB,KAAA,GAClB,OAAO,CACL,QACE,YACE,sBACA,6BAA6B,QAAQ,eACvC,CACF,GACA,OACF;GAIF,IAAI,YAAY,WAAW,YACzB,OAAO,CAAC,QAAQ,sBAAsB,WAAW,CAAC,GAAG,OAAO;GAE9D,IAAI,YAAY,WAAW,kBACzB,OAAO,CACL,QACE,yBAAyB,KAAK;IAC5B,eAAe,QAAQ;IACvB,QAAQ,YAAY;IACpB,SACE;GACJ,CAAC,CACH,GACA,OACF;GAEF,MAAM,WAAmC;IACvC,GAAG;IACH,QAAQ;IACR,kBAAkB;GACpB;GACA,OAAO,CACL,QAAQ,sBAAsB,QAAQ,CAAC,GACvC,qBAAqB,SAAS,QAAQ,CACxC;EACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACH;CAEA,MAAM,kBAAkE,OAAO,OAC7E,IAAI,IAAI,KAAK,CAAC,CAAC,KACb,OAAO,KAAK,YAAY;EACtB,MAAM,YAAY,CAAC,GAAG,QAAQ,YAAY,OAAO,CAAC,CAAC,CAChD,QAAQ,WAAW,OAAO,IAAI,UAAU,SAAS,CAAC,CAClD,MAAM,MAAM,UACX,KAAK,IAAI,WAAW,MAAM,IAAI,WAC1B,KACA,KAAK,IAAI,WAAW,MAAM,IAAI,WAC5B,IACA,KAAK,IAAI,gBAAgB,MAAM,IAAI,aAC3C,CAAC,CACA,KAAK,WAAW,WAAW,OAAO,GAAG,CAAC;EACzC,OAAO,OAAO,aAAa,SAAS;CACtC,CAAC,CACH,CACF;CAEA,MAAM,uBAA4E,OAAO,GACvF,6CACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAOA,WACrB,yBACA,wBACA,WACF;EACA,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,MAAM,SAAS,QAAQ,YAAY,IAAI,QAAQ,YAAY;EAC3D,IAAI,WAAW,KAAA,GACb,OAAO,OAAO,YACZ,wBACA,sBAAsB,QAAQ,cAChC;EAEF,MAAM,QAAQ,CAAC,GAAG,QAAQ,YAAY,OAAO,CAAC,CAAC,CAC5C,QAAQ,cAAc,UAAU,2BAA2B,QAAQ,YAAY,CAAC,CAChF,MAAM,MAAM,UAAU,KAAK,IAAI,gBAAgB,MAAM,IAAI,aAAa,CAAC,CACvE,KAAK,cACJ,aAAa,KAAK;GAChB,cAAc,UAAU,IAAI;GAC5B,OAAO,UAAU,IAAI;GACrB,kBAAkB,QAAQ;EAC5B,CAAC,CACH;EACF,MAAM,gBACJ,MACA,UAEA,KAAK,aAAa,MAAM,aAAa,KAAK,KAAK,aAAa,MAAM,aAAa,IAAI;EAIrF,MAAM,oBAAoB,CAAC,GAAG,QAAQ,kBAAkB,OAAO,CAAC,CAAC,CAC9D,QAAQ,gBAAgB,YAAY,uBAAuB,QAAQ,YAAY,CAAC,CAChF,MAAM,MAAM,UACX,KAAK,mBAAmB,MAAM,mBAC1B,KACA,KAAK,mBAAmB,MAAM,mBAC5B,IACA,CACR;EACF,MAAM,mBAAmD,CAAC;EAC1D,KAAK,MAAM,eAAe,mBAAmB;GAC3C,IAAI,YAAY,sBAAsB,KAAA,GAAW;GACjD,MAAM,QAAQ,QAAQ,YAAY,IAAI,YAAY,iBAAiB;GACnE,IAAI,UAAU,KAAA,GAAW;GACzB,iBAAiB,KACf,wBAAwB,KAAK;IAC3B,YAAY,YAAY;IACxB,mBAAmB,YAAY;IAC/B,YAAY,MAAM,IAAI;IACtB,GAAI,MAAM,IAAI,mBAAmB,KAAA,IAC7B,CAAC,IACD,EAAE,cAAc,MAAM,IAAI,eAAe;GAC/C,CAAC,CACH;EACF;EACA,OAAO,iBAAiB,KAAK;GAC3B,YAAY,WAAW,OAAO,GAAG;GACjC;GACA,mBAAmB,CAAC,GAAG,OAAO,kBAAkB,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY;GAC3E,oBAAoB,CAAC,GAAG,OAAO,mBAAmB,OAAO,CAAC,CAAC,CACxD,KAAK,eAAe,WAAW,MAAM,CAAC,CACtC,KAAK,YAAY;GACpB,mBAAmB,kBAAkB,IAAI,qBAAqB;GAC9D;GACA,GAAI,OAAO,IAAI,kBAAkB,KAAA,IAC7B,CAAC,IACD,EAAE,eAAe,OAAO,IAAI,cAAc;GAC9C,GAAI,OAAO,2BAA2B,KAAA,IAClC,CAAC,IACD,EAAE,kBAAkB,OAAO,uBAAuB;GACtD,GAAI,OAAO,eAAe,KAAA,IACtB,CAAC,IACD,EACE,YAAY,mBAAmB,KAAK;IAClC,QAAQ,OAAO,WAAW;IAC1B,aAAa,IAAI,OAAO,WAAW,iBAAiB;GACtD,CAAC,EACH;GACJ,GAAI,OAAO,cAAc,KAAA,IACrB,CAAC,IACD,EACE,WAAW,kBAAkB,KAAK;IAChC,WAAW,OAAO,UAAU;IAC5B,iBAAiB,OAAO,UAAU;IAClC,eAAe,OAAO,UAAU;IAChC,gBAAgB,IAAI,OAAO,UAAU,oBAAoB;GAC3D,CAAC,EACH;GACJ,GAAI,OAAO,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,OAAO,aAAa;GACjF,GAAI,OAAO,gBAAgB,KAAA,IACvB,CAAC,IACD,EACE,aAAa,8BAA8B,KAAK;IAC9C,cAAc,OAAO,YAAY;IACjC,SAAS,OAAO,YAAY;IAC5B,QAAQ,OAAO,YAAY;IAC3B,cAAc,OAAO,YAAY;IACjC,WAAW,OAAO,YAAY,sBAAsB,KAAA;GACtD,CAAC,EACH;GACJ,GAAI,OAAO,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,OAAO,YAAY;EAChF,CAAC;CACH,CAAC,CACH;CAEA,OAAO,iBAAiB,GAAG;EACzB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH,CAAC;;;;;AAiBH,MAAa,+BACX,UAAyC,CAAC,MACR,MAAM,OAAO,kBAAkB,qBAAqB,OAAO,CAAC;AAEhG,MAAa,6BACX,4BAA4B;;;AC5pE9B,MAAM,gBAAgB,WAAmB,WACvC,qBAAqB,KAAK;CAAE;CAAW;AAAO,CAAC;AAEjD,MAAM,gBAAgB,WAAmB,WACvC,OAAO,IAAI;CACT,WAAW,OAAO,WAAW,OAAO,eAAe,cAAc,CAAC,CAAC,CAAC,MAAM;CAC1E,aAAa,aAAa,WAAW,SAAS;AAChD,CAAC;AAEH,MAAM,gBAAgB,WAAmB,YACvC,OAAO,IAAI;CACT,WAAW,OAAO,WAAW,OAAO,eAAe,cAAc,CAAC,CAAC,CAAC,OAAO;CAC3E,aAAa,aAAa,WAAW,SAAS;AAChD,CAAC;AAEH,MAAM,eAAqB,WAAmB,QAA4B,UACxE,OAAO,IAAI;CACT,WAAW,OAAO,kBAAkB,MAAM,CAAC,CAAC,KAAK;CACjD,aAAa,aAAa,WAAW,SAAS;AAChD,CAAC;AAEH,MAAM,aAAa,QAAwB,UACzC,iBAAiB,OAAO,KAAK,MAAM,iBAAiB,KAAK;AAE3D,MAAM,oBAAoB,OAAO,IAAI,aAAa;CAChD,MAAM,QAAQ,OAAO,IAAI,KAA0B,EAAE,yBAAS,IAAI,IAAI,EAAE,CAAC;CACzE,MAAM,YAAY,OAAO;CAEzB,MAAM,SAA6C,OAAO,GAAG,4BAA4B,CAAC,EACvF,QAAQ,eACP,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,aAAa,UAAU,MAAM;EACpD,OAAO,UAAU,IAAI,wBAAwB;EAC7C,MAAM,WAAW,OAAO,OAAO,gBAC7B,IAAI,OACF,QAEE,YAOG;GACH,MAAM,MAAM,kBAAkB,MAAM;GACpC,MAAM,eAAe,QAAQ,QAAQ,IAAI,GAAG;GAC5C,IAAI,iBAAiB,KAAA,GAAW;IAC9B,MAAM,UAAU,OAAO,IAAI;KACzB,WAAW,OAAO,WAAW,OAAO,eAAe,cAAc,CAAC,CAAC,CAAC,YAAY;KAChF,aAAa,aAAa,UAAU,SAAS;IAC/C,CAAC;IACD,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;IAE/C,IAAI,QAAQ,QAAQ,wBAAwB,OAAO,qBACjD,OAAO,CAAC,OAAO,QAAQ,QAAQ,OAAO,GAAG,OAAO;IAElD,OAAO,CACL,OAAO,KACL,iBAAiB,KAAK;KAAE,QAAQ;KAAY,KAAK,cAAc,MAAM;IAAE,CAAC,CAC1E,GACA,OACF;GACF;GAEA,IAAI,aAAa;GACjB,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO,GAAG;IAC3C,MAAM,UAAU,OAAO,IAAI;KACzB,WAAW,OAAO,WAAW,OAAO,eAAe,cAAc,CAAC,CAAC,CAAC,IAAI;KACxE,aAAa,aAAa,UAAU,SAAS;IAC/C,CAAC;IACD,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;IAE/C,IACE,UAAU,QAAQ,SAAS,OAAO,KAAK,KACvC,qBAAqB,QAAQ,OAAO,GAEpC,cAAc;GAClB;GACA,IAAI,cAAc,YAChB,OAAO,CAAC,OAAO,KAAK,sBAAsB,KAAK,EAAE,OAAO,WAAW,CAAC,CAAC,GAAG,OAAO;GAEjF,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,KAAK,OAAO;GACxB,MAAM,OAAO,EAAE,QAAQ;GACvB,OAAO,CAAC,OAAO,QAAQ,MAAM,GAAG,IAAI;EACtC,CACF,CACF;EACA,MAAM,WAAW,OAAO,OAAO,WAAW,QAAQ;EAClD,OAAO,UAAU,IAAI,uBAAuB;EAC5C,OAAO,OAAO,aAAa,UAAU,OAAO,aAAa,UAAU,QAAQ,CAAC;CAC9E,CAAC,CACL;CAEA,MAAM,MAAuC,OAAO,GAAG,yBAAyB,CAAC,CAC/E,WAAW,KAAK;EACd,MAAM,aAAa,OAAO,YAAY,OAAO,aAAa,GAAG;EAC7D,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,QAAQ,IAAI,kBAAkB,UAAU,CAAC;EAC9E,OAAO,SAAS,KAAA,IAAY,OAAO,OAAO,aAAa,OAAO,IAAI;CACpE,CACF;CAEA,MAAM,OAAyC,OAAO,GAAG,0BAA0B,CAAC,CAClF,WAAW,SAAS;EAClB,MAAM,iBAAiB,OAAO,YAAY,QAAQ,qBAAqB,OAAO;EAC9E,MAAM,UAAiC,CAAC;EACxC,KAAK,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,QAAQ,OAAO,GAAG;GAC3D,MAAM,SAAS,OAAO,aAAa,QAAQ,IAAI;GAC/C,IACE,UAAU,QAAQ,eAAe,KAAK,MACrC,eAAe,UAAU,KAAA,KACxB,qBAAqB,OAAO,YAAY,eAAe,KAAK,IAAI,IAElE,QAAQ,KAAK,MAAM;EAEvB;EACA,QAAQ,MAAM,MAAM,UAAU,qBAAqB,KAAK,YAAY,MAAM,UAAU,CAAC;EACrF,MAAM,UAAU,QAAQ,SAAS,eAAe;EAChD,MAAM,QAAQ,QAAQ,MAAM,GAAG,eAAe,KAAK;EACnD,OAAO;GACL;GACA,MAAM,UAAW,MAAM,GAAG,EAAE,CAAC,EAAE,cAAc,OAAQ;EACvD;CACF,CACF;CAEA,MAAM,SAA6C,OAAO,GAAG,4BAA4B,CAAC,EACvF,KAAK,SAAS,aAAa,wBAAwB,yBAClD,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,OAAO,YAAY,UAAU,aAAa,GAAG;EAChE,MAAM,iBAAiB,OAAO,YAAY,UAAU,gBAAgB,OAAO;EAC3E,OAAO,UAAU,IAAI,YAAY,eAAe,KAAK,YAAY,EAAE,QAAQ;EAC3E,MAAM,WAAW,OAAO,OAAO,gBAC7B,IAAI,OACF,QAEE,YAOG;GACH,MAAM,aAAa,kBAAkB,UAAU;GAC/C,MAAM,OAAO,QAAQ,QAAQ,IAAI,UAAU;GAC3C,IAAI,SAAS,KAAA,GACX,OAAO,CAAC,OAAO,KAAK,iBAAiB,KAAK,EAAE,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO;GAE1E,MAAM,UAAU,OAAO,IAAI;IACzB,WAAW,OAAO,WAAW,OAAO,eAAe,cAAc,CAAC,CAAC,CAAC,IAAI;IACxE,aAAa,aAAa,UAAU,SAAS;GAC/C,CAAC;GACD,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAE/C,MAAM,UAAU,oBAAoB,QAAQ,SAAS,cAAc;GACnE,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAE/C,IAAI,QAAQ,YAAY,QAAQ,SAC9B,OAAO,CAAC,OAAO,QAAQ,QAAQ,OAAO,GAAG,OAAO;GAElD,IAAI,CAAC,qBAAqB,QAAQ,OAAO,KAAK,qBAAqB,QAAQ,OAAO,GAAG;IACnF,IAAI,QAAQ;IACZ,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO,GAAG;KAC3C,MAAM,YAAY,OAAO,oBACvB,OAAO,eAAe,cAAc,CACtC,CAAC,CAAC,IAAI;KACN,IAAI,OAAO,UAAU,SAAS,GAC5B,OAAO,CAAC,OAAO,KAAK,aAAa,UAAU,SAAS,CAAC,GAAG,OAAO;KACjE,IACE,UAAU,UAAU,SAAS,WAAW,KAAK,KAC7C,qBAAqB,UAAU,OAAO,GAEtC,SAAS;IACb;IACA,IAAI,SAAS,YACX,OAAO,CAAC,OAAO,KAAK,sBAAsB,KAAK,EAAE,OAAO,WAAW,CAAC,CAAC,GAAG,OAAO;GACnF;GACA,MAAM,UAAU,OAAO,IAAI;IACzB,WACE,OAAO,WAAW,OAAO,eAAe,cAAc,CAAC,CAAC,CAAC,QAAQ,OAAO;IAC1E,aAAa,aAAa,UAAU,SAAS;GAC/C,CAAC;GACD,IAAI,OAAO,UAAU,OAAO,GAC1B,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAE/C,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,YAAY,QAAQ,OAAO;GACvC,MAAM,OAAO,EAAE,QAAQ;GACvB,OAAO,CAAC,OAAO,QAAQ,QAAQ,OAAO,GAAG,IAAI;EAC/C,CACF,CACF;EACA,MAAM,UAAU,OAAO,OAAO,WAAW,QAAQ;EACjD,OAAO,UAAU,IAAI,YAAY,eAAe,KAAK,YAAY,EAAE,OAAO;EAC1E,OAAO,OAAO,aAAa,UAAU,OAAO,aAAa,UAAU,OAAO,CAAC;CAC7E,CAAC,CACL;CAEA,MAAM,MAAuC,OAAO,GAAG,yBAAyB,CAAC,CAC/E,WAAW,WAAW,OAAO,OAAO,OAAO;EACzC,MAAM,eACJ,UAAU,KAAA,IAAY,KAAA,IAAY,OAAO,YAAY,OAAO,eAAe,KAAK;EAClF,MAAM,SACJ,UAAU,KAAA,IAAY,KAAA,IAAY,OAAO,YAAY,OAAO,mBAAmB,KAAK;EACtF,MAAM,UAAoC,CAAC;EAC3C,KAAK,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,QAAQ,OAAO,GAAG;GAC3D,MAAM,SAAS,OAAO,aAAa,OAAO,IAAI;GAC9C,MAAM,WAAW,iBAAiB,MAAM;GACxC,IACE,aAAa,QACb,YAAY,cACX,iBAAiB,KAAA,KAAa,UAAU,QAAQ,YAAY,OAC5D,WAAW,KAAA,KACV,WAAW,OAAO,oBACjB,aAAa,OAAO,oBAAoB,oBAAoB,QAAQ,MAAM,IAAI,IAEjF,QAAQ,KAAK;IAAE,GAAG,cAAc,MAAM;IAAG,kBAAkB;GAAS,CAAC;EAEzE;EACA,QAAQ,MAAM,MAAM,UAAU;GAC5B,MAAM,aAAa,KAAK,mBAAmB,MAAM;GACjD,OAAO,eAAe,IAAI,aAAa,oBAAoB,MAAM,KAAK;EACxE,CAAC;EACD,OAAO,QAAQ,MAAM,GAAG,KAAK;CAC/B,CACF;CAEA,MAAM,eAAyD,OAAO,GACpE,kCACF,CAAC,CAAC,WAAW,OAAO;EAClB,MAAM,eACJ,UAAU,KAAA,IAAY,KAAA,IAAY,OAAO,YAAY,gBAAgB,eAAe,KAAK;EAC3F,IAAI,WAA0B;EAC9B,KAAK,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,QAAQ,OAAO,GAAG;GAC3D,MAAM,SAAS,OAAO,aAAa,gBAAgB,IAAI;GACvD,IAAI,iBAAiB,KAAA,KAAa,CAAC,UAAU,QAAQ,YAAY,GAAG;GACpE,MAAM,WAAW,iBAAiB,MAAM;GACxC,IAAI,aAAa,SAAS,aAAa,QAAQ,WAAW,WAAW,WAAW;EAClF;EACA,OAAO;CACT,CAAC;CAED,OAAO,cAAc,GAAG;EAAE;EAAQ;EAAK;EAAM;EAAQ;EAAK;CAAa,CAAC;AAC1E,CAAC;AAED,MAAa,iCACX,MAAM,OAAO,eAAe,iBAAiB;AAE/C,MAAa,0BAAsD,yBAAyB;;;ACrO5F,MAAMC,WAAS,QAAqC,SAClD,kBAAkB,KAAK;CAAE;CAAQ;AAAK,CAAC;AAEzC,MAAM,iBAAiB,MAAuB,UAC5C,KAAK,aAAa,MAAM,YAAY,KAAK,YAAY,MAAM;AAE7D,MAAMC,gBAAc,MAA+B,UACjD,KAAK,SAAS,MAAM,QAAQ,KAAK,YAAY,MAAM;AAErD,MAAM,UACJ,QACA,OACA,SAEA,OAAO,IAAI;CACT,WAAW,OAAO,WAAW,OAAO,eAAe,MAAM,CAAC,CAAC,CAAC,KAAK;CACjE,aAAaD,QAAM,WAAW,IAAI;AACpC,CAAC;AAEH,MAAM,UACJ,QACA,OACA,SAEA,OAAO,IAAI;CACT,WAAW,OAAO,WAAW,OAAO,eAAe,MAAM,CAAC,CAAC,CAAC,KAAK;CACjE,aAAaA,QAAM,WAAW,IAAI;AACpC,CAAC;AAEH,MAAM,gBAAsB,QAA4B,OAAe,SACrE,OAAO,WAAW,OAAO,QAAQ,OAAO,IAAI,CAAC;AAE/C,MAAME,cAAkB,QAA4B,OAAgB,SAClE,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,eAAeF,QAAM,cAAc,IAAI,CAAC,CAAC;AAEjG,MAAM,aAAa,UACjB,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,UAAU,KAAK,CAAC,CAAC,CAAC;AAElD,MAAM,wBAAwB,MAA4B,UACxD,8BAA8B,KAAK,GAAG,MAAM,8BAA8B,MAAM,GAAG,KACnF,KAAK,eAAe,MAAM,cAC1B,KAAK,OAAO,SAAS,MAAM,OAAO,QAClC,KAAK,OAAO,YAAY,MAAM,OAAO,WACrC,KAAK,aAAa,MAAM,YACxB,KAAK,iBAAiB,MAAM,gBAC5B,KAAK,4BAA4B,MAAM,2BACvC,KAAK,gBAAgB,MAAM;AAE7B,MAAM,qBAAqB,WACzB,KAAK,UAAU;CACb,OAAO,cAAc,OAAO;CAC5B,OAAO,cAAc,OAAO;CAC5B,OAAO,cAAc;AACvB,CAAC;AACH,MAAM,0BAA0B,UAC9B,KAAK,UAAU;CAAC,MAAM,OAAO;CAAM,MAAM,OAAO;CAAS,MAAM;AAAW,CAAC;AAE7E,MAAM,qBAAqB,MAAqB,UAC9C,cAAc,KAAK,WAAW,MAAM,SAAS,KAC7C,KAAK,YAAY,MAAM,WACvBC,aAAW,KAAK,QAAQ,MAAM,MAAM,KACpC,KAAK,gBAAgB,MAAM,eAC3B,KAAK,kBAAkB,MAAM;AAE/B,MAAM,qBACJ,UACA,QACA,UAEA,sBAAsB,SAAS,IAAI,YAAY,MAAM,sBAAsB,OAAO,GAAG,KACrF,SAAS,IAAI,YAAY,MAAM,WAC/BA,aAAW,SAAS,QAAQ,MAAM,MAAM;AAE1C,MAAM,8BAA8B,OAAO,GAAG,6BAA6B,CAAC,CAAC,WAC3E,gBACA;CACA,MAAM,YAAY,OAAOC,WAAS,iBAAiB,gBAAgB,WAAW;CAC9E,MAAM,QAAQ,OAAO,IAAI,KAA8B;EACrD,UAAU;EACV,+BAAe,IAAI,IAAI;EACvB,wBAAQ,IAAI,IAAI;EAChB,4BAAY,IAAI,IAAI;EACpB,mCAAmB,IAAI,IAAI;EAC3B,gCAAgB,IAAI,IAAI;EACxB,yCAAyB,IAAI,IAAI;EACjC,4BAAY,IAAI,IAAI;EACpB,+BAAe,IAAI,IAAI;EACvB,qCAAqB,IAAI,IAAI;EAC7B,aAAa;GAAE,QAAQ;GAAI,YAAY;GAAI,UAAU;EAAE;CACzD,CAAC;CACD,MAAM,YAAY,OAAO;CAEzB,MAAM,oBACJ,OACA,SAEA,cAAc,MAAM,WAAW,SAAS,IACpC,OAAO,QAAQ,KAAK,IACpB,OAAO,KAAKF,QAAM,cAAc,IAAI,CAAC;CAE3C,MAAM,cAAc,KAAsB,SACxCE,WAAS,iBAAiB,KAAK,IAAI,CAAC,CAAC,KACnC,OAAO,SAAS,YAAY,iBAAiB,SAAS,IAAI,CAAC,CAC7D;CAEF,MAAM,WAAqD,OAAO,GAChE,kCACF,CAAC,CAAC,WAAW,OAAO,aAAa;EAC/B,MAAM,SAAS,OAAOA,WAAS,oBAAoB,OAAO,iBAAiB;EAC3E,MAAM,SAAS,OAAOA,WAAS,oBAAoB,aAAa,iBAAiB;EACjF,OAAO,iBAAiB,OAAO,KAAK,oBAAoB;EACxD,OAAO,UAAU,IAAI,8BAA8B;EACnD,MAAM,SAAS,OAAO,OAAO,gBAC3B,IAAI,OACF,QAEE,YAIG;GACH,MAAM,MAAM,sBAAsB,OAAO,GAAG;GAC5C,MAAM,eAAe,QAAQ,cAAc,IAAI,GAAG;GAClD,IAAI,iBAAiB,KAAA,GAAW;IAC9B,MAAM,WAAW,OAAO,oBAAoB,cAAc,mBAAmB;IAC7E,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO;IAC9E,OAAO,SAAS,QAAQ,wBAAwB,OAAO,sBACnD,CAAC,OAAO,QAAQ,SAAS,OAAO,GAAG,OAAO,IAC1C,CAAC,OAAO,KAAKF,QAAM,YAAY,uBAAuB,CAAC,GAAG,OAAO;GACvE;GACA,IAAI,UAAU,OAAO,cAAc,OAAO,IAAI,OAAO,iBACnD,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,eAAe,CAAC,GAAG,OAAO;GAClE,IAAI,UAAU,OAAO,cAAc,UAAU,IAAI,OAAO,iBACtD,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,kBAAkB,CAAC,GAAG,OAAO;GACrE,IACE,OAAO,cAAc,kBAAkB,OAAO,kBAC9C,OAAO,mBAEP,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,UAAU,CAAC,GAAG,OAAO;GAC7D,IAAI,QAAQ,cAAc,QAAQ,OAAO,kBACvC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,eAAe,CAAC,GAAG,OAAO;GAClE,MAAM,aAAa,QAAQ,wBAAwB,IAAI,OAAO,IAAI,OAAO,KAAK;GAC9E,IAAI,cAAc,OAAO,0BACvB,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,qBAAqB,CAAC,GAAG,OAAO;GACxE,MAAM,WAAW;IAAE,GAAG;IAAQ,SAAS,QAAQ,WAAW;GAAE;GAC5D,MAAM,UAAU,OAAO,oBAAoB,UAAU,iBAAiB;GACtE,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAC5E,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,cAAc,IAAI,KAAK,QAAQ,OAAO;GACtC,MAAM,oBAAoB,IAAI,IAAI,QAAQ,iBAAiB;GAC3D,kBAAkB,IAAI,KAAK;IACzB,KAAK,SAAS;IACd,SAAS,SAAS;IAClB,OAAO,SAAS;IAChB,YAAY,SAAS,UAAU,uBAAuB;GACxD,CAAC;GACD,MAAM,iBAAiB,IAAI,IAAI,QAAQ,cAAc;GACrD,MAAM,eAAe,kBAAkB,QAAQ;GAC/C,eAAe,IAAI,cAAc,CAAC,GAAI,eAAe,IAAI,YAAY,KAAK,CAAC,GAAI,GAAG,CAAC;GACnF,MAAM,0BAA0B,IAAI,IAAI,QAAQ,uBAAuB;GACvE,wBAAwB,IAAI,SAAS,IAAI,SAAS,aAAa,CAAC;GAChE,OAAO,CACL,OAAO,QAAQ,QAAQ,GACvB;IACE,GAAG;IACH,UAAU,SAAS;IACnB;IACA;IACA;IACA;GACF,CACF;EACF,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,6BAA6B;EAClD,OAAO;CACT,CAAC;CAED,MAAM,MAA2C,OAAO,GAAG,6BAA6B,CAAC,CACvF,WAAW,OAAO;EAChB,MAAM,MAAM,OAAO,WAAW,OAAO,SAAS;EAC9C,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,cAAc,IAAI,sBAAsB,GAAG,CAAC;EACjF,OAAO,SAAS,KAAA,IACZ,OACA,OAAO,aAAa,oBAAoB,MAAM,YAAY;CAChE,CACF;CAEA,MAAM,OAA6C,OAAO,GAAG,8BAA8B,CAAC,CAC1F,WAAW,SAAS,OAAO,OAAO;EAChC,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GACxF,OAAO,OAAOA,QAAM,cAAc,WAAW;EAC/C,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,MAAM,UAAqC,CAAC;EAC5C,KAAK,MAAM,CAAC,YAAY,YAAY,QAAQ,mBAAmB;GAC7D,IAAI,QAAQ,IAAI,YAAY,WAAW,QAAQ,WAAW,OAAO;GACjE,MAAM,OAAO,QAAQ,cAAc,IAAI,UAAU;GACjD,IAAI,SAAS,KAAA,GAAW,OAAO,OAAOA,QAAM,WAAW,YAAY;GACnE,QAAQ,KAAK,OAAO,aAAa,oBAAoB,MAAM,aAAa,CAAC;EAC3E;EACA,QAAQ,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;EAC5C,OAAO,QAAQ,MAAM,GAAG,KAAK;CAC/B,CACF;CAEA,MAAM,SAAiD,OAAO,GAC5D,gCACF,CAAC,CAAC,WAAW,OAAO;EAClB,MAAM,MAAM,OAAO,WAAW,OAAO,YAAY;EACjD,OAAO,UAAU,IAAI,4BAA4B;EACjD,MAAM,SAAS,OAAO,OAAO,gBAC3B,IAAI,OACF,QAEE,YAIG;GACH,MAAM,aAAa,sBAAsB,GAAG;GAC5C,MAAM,OAAO,QAAQ,cAAc,IAAI,UAAU;GACjD,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC,OAAO,KAAKA,QAAM,aAAa,cAAc,CAAC,GAAG,OAAO;GACxF,MAAM,UAAU,OAAO,oBAAoB,MAAM,eAAe;GAChE,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,SAAS,OAAO;GACvD,IAAI,QAAQ,QAAQ,UAAU,aAC5B,OAAO,CAAC,OAAO,QAAQ,QAAQ,OAAO,GAAG,OAAO;GAClD,MAAM,YAAY;IAAE,GAAG,QAAQ;IAAS,OAAO;IAAsB,UAAU;GAAK;GACpF,MAAM,UAAU,OAAO,oBAAoB,WAAW,eAAe;GACrE,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAC5E,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,cAAc,IAAI,YAAY,QAAQ,OAAO;GAC7C,MAAM,oBAAoB,IAAI,IAAI,QAAQ,iBAAiB;GAC3D,MAAM,UAAU,kBAAkB,IAAI,UAAU;GAChD,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,cAAc,CAAC,GAAG,OAAO;GAChE,kBAAkB,IAAI,YAAY;IAAE,GAAG;IAAS,OAAO;IAAa,YAAY;GAAK,CAAC;GACtF,OAAO,CAAC,OAAO,QAAQ,SAAS,GAAG;IAAE,GAAG;IAAS;IAAe;GAAkB,CAAC;EACrF,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,2BAA2B;EAChD,OAAO;CACT,CAAC;CAED,MAAM,SAAiD,OAAO,GAC5D,gCACF,CAAC,CAAC,WAAW,OAAO,aAAa;EAC/B,MAAM,QAAQ,OAAOE,WAAS,eAAe,OAAO,cAAc;EAClE,MAAM,SAAS,OAAOA,WAAS,oBAAoB,aAAa,eAAe;EAC/E,OAAO,iBAAiB,OAAO,kBAAkB;EACjD,OAAO,UAAU,IAAI,4BAA4B;EACjD,MAAM,SAAS,OAAO,OAAO,gBAC3B,IAAI,OACF,QAEE,YACwF;GACxF,MAAM,eAAe,QAAQ,OAAO,IAAI,MAAM,OAAO;GACrD,IAAI,iBAAiB,KAAA,GAAW;IAC9B,MAAM,WAAW,OAAO,eAAe,cAAc,iBAAiB;IACtE,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO;IAC9E,OAAO,kBAAkB,SAAS,SAAS,KAAK,IAC5C,CAAC,OAAO,QAAQ,SAAS,OAAO,GAAG,OAAO,IAC1C,CAAC,OAAO,KAAKF,QAAM,YAAY,gBAAgB,CAAC,GAAG,OAAO;GAChE;GACA,IAAI,UAAU,MAAM,OAAO,IAAI,OAAO,iBACpC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,eAAe,CAAC,GAAG,OAAO;GAClE,IAAI,QAAQ,OAAO,QAAQ,OAAO,WAChC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,QAAQ,CAAC,GAAG,OAAO;GAC3D,MAAM,WAA0B;IAC9B,GAAG;IACH,QAAQ,QAAQ,WAAW;IAC3B,QAAQ;IACR,iBAAiB;IACjB,gBAAgB;GAClB;GACA,MAAM,UAAU,OAAO,eAAe,UAAU,eAAe;GAC/D,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAC5E,MAAM,SAAS,IAAI,IAAI,QAAQ,MAAM;GACrC,OAAO,IAAI,SAAS,SAAS,QAAQ,OAAO;GAC5C,MAAM,aAAa,IAAI,IAAI,QAAQ,UAAU;GAC7C,WAAW,IAAI,SAAS,SAAS;IAC/B,iBAAiB;IACjB,qBAAqB,SAAS;GAChC,CAAC;GACD,OAAO,CACL,OAAO,QAAQ,QAAQ,GACvB;IAAE,GAAG;IAAS,UAAU,SAAS;IAAQ;IAAQ;GAAW,CAC9D;EACF,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,2BAA2B;EAChD,OAAO;CACT,CAAC;CAED,MAAM,QAA+C,OAAO,GAAG,+BAA+B,CAAC,CAC7F,WAAW,SAAS;EAClB,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,OAAO,IAAI,OAAO;EACvD,OAAO,SAAS,KAAA,IAAY,OAAO,OAAO,aAAa,eAAe,MAAM,cAAc;CAC5F,CACF;CAEA,MAAM,gBAA+D,OAAO,GAC1E,uCACF,CAAC,CAAC,WAAW,WAAW,OAAO,OAAO;EACpC,MAAM,SAAwB,CAAC;EAC/B,KAAK,MAAM,CAAC,SAAS,aAAa,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,YACvD,IACE,CAAC,QAAQ,mBACT,QAAQ,uBAAuB,aAC/B,qBAAqB,SAAS,KAAK,IAAI,GAEvC,OAAO,KAAK,OAAO;EAEvB,OAAO,KAAK,oBAAoB;EAChC,OAAO,OAAO,MAAM,GAAG,KAAK;CAC9B,CAAC;CAED,MAAM,aAAyD,OAAO,GACpE,oCACF,CAAC,CAAC,WAAW,OAAO,OAAO;EACzB,MAAM,WAAW,OAAOE,WAAS,eAAe,OAAO,kBAAkB;EACzE,OAAO,iBAAiB,UAAU,sBAAsB;EACxD,MAAM,SAAS,OAAO,MAAM,SAAS,OAAO;EAC5C,IAAI,WAAW,QAAQ,CAAC,kBAAkB,QAAQ,QAAQ,GACxD,OAAO,OAAOF,QAAM,WAAW,OAAO,cAAc,YAAY,OAAO;EACzE,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,MAAM,UAAqC,CAAC;EAC5C,KAAK,MAAM,cAAc,QAAQ,eAAe,IAAI,uBAAuB,MAAM,CAAC,KAAK,CAAC,GAAG;GACzF,MAAM,UAAU,QAAQ,kBAAkB,IAAI,UAAU;GACxD,IAAI,YAAY,KAAA,GAAW,OAAO,OAAOA,QAAM,WAAW,iBAAiB;GAC3E,IAAI,QAAQ,WAAW,OAAO,UAAU,QAAQ,UAAU,OAAO,QAAQ;GACzE,MAAM,OAAO,QAAQ,cAAc,IAAI,UAAU;GACjD,IAAI,SAAS,KAAA,GAAW,OAAO,OAAOA,QAAM,WAAW,kBAAkB;GACzE,QAAQ,KAAK,OAAO,aAAa,oBAAoB,MAAM,kBAAkB,CAAC;EAChF;EACA,QAAQ,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;EAC5C,OAAO,QAAQ,MAAM,GAAG,KAAK;CAC/B,CAAC;CAED,MAAM,SAAiD,OAAO,GAC5D,gCACF,CAAC,CAAC,WAAW,YAAY,iBAAiB,QAAQ,UAAU,WAAW,aAAa;EAClF,MAAM,gBAAgB,OAAOE,WAAS,eAAe,YAAY,cAAc;EAC/E,MAAM,aAAa,OAAOA,WACxB,OAAO,MAAM,oBAAoB,GACjC,iBACA,mBACF;EACA,MAAM,SAAS,OAAOA,WAAS,oBAAoB,aAAa,eAAe;EAC/E,OAAO,iBAAiB,eAAe,kBAAkB;EACzD,OAAO,UAAU,IAAI,4BAA4B;EACjD,MAAM,qBAAqB,KAAK,IAAI,WAAW,OAAO,MAAM,iBAAiB;EAC7E,OAAO,OAAO,gBACZ,IAAI,OACF,QACC,YAAwF;GACvF,MAAM,YAAY,QAAQ,OAAO,IAAI,cAAc,OAAO;GAC1D,IAAI,cAAc,KAAA,GAAW,OAAO,CAAC,OAAO,KAAKF,QAAM,aAAa,OAAO,CAAC,GAAG,OAAO;GACtF,MAAM,eAAe,OAAO,eAAe,WAAW,qBAAqB;GAC3E,IAAI,OAAO,UAAU,YAAY,GAAG,OAAO,CAAC,OAAO,KAAK,aAAa,OAAO,GAAG,OAAO;GACtF,MAAM,WAAW,aAAa;GAC9B,IACE,CAAC,kBAAkB,UAAU,aAAa,KAC1C,cAAc,WAAW,SAAS,QAElC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,cAAc,CAAC,GAAG,OAAO;GACjE,IAAI,SAAS,iBACX,OAAO,CACL,YAAY,WAAW,SAAS,SAC5B,OAAO,OACP,OAAO,KAAKA,QAAM,YAAY,kBAAkB,CAAC,GACrD,OACF;GACF,IAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,SAAS,UAAU,SAAS,SAAS,QACjF,OAAO,CAAC,OAAO,KAAKA,QAAM,cAAc,QAAQ,CAAC,GAAG,OAAO;GAE7D,MAAM,YAA8C,CAAC;GACrD,MAAM,UAA4C,CAAC;GACnD,MAAM,gBAAiE,CAAC;GACxE,MAAM,sBAAmE,CAAC;GAC1E,MAAM,SAAS,IAAI,IAAI,QAAQ,mBAAmB;GAClD,KAAK,MAAM,YAAY,YAAY;IACjC,MAAM,aAAa,QAAQ,cAAc,IACvC,sBAAsB,SAAS,IAAI,YAAY,CACjD;IACA,IAAI,eAAe,KAAA,GACjB,OAAO,CAAC,OAAO,KAAKA,QAAM,aAAa,cAAc,CAAC,GAAG,OAAO;IAClE,MAAM,SAAS,OAAO,oBAAoB,YAAY,qBAAqB;IAC3E,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,OAAO,GAAG,OAAO;IAC1E,IACE,CAAC,kBAAkB,UAAU,OAAO,SAAS,QAAQ,KACrD,CAAC,8BAA8B,UAAU,OAAO,SAAS,QAAQ,KACjE,OAAO,QAAQ,WAAW,SAAS,UACnC,OAAO,QAAQ,UAAU,QAEzB,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,WAAW,CAAC,GAAG,OAAO;IAC9D,IAAI,CAAC,sBAAsB,OAAO,SAAS,UAAU,oBAAoB,KAAK,GAC5E;IACF,MAAM,cAAc,8BAA8B,SAAS,GAAG;IAC9D,MAAM,eAAe,QAAQ,WAAW,IAAI,WAAW;IACvD,IAAI,iBAAiB,KAAA,GAAW;KAC9B,MAAM,WAAW,OAAO,sBAAsB,cAAc,iBAAiB;KAC7E,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO;KAC9E,IAAI,CAAC,qBAAqB,SAAS,SAAS,QAAQ,GAClD,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,mBAAmB,CAAC,GAAG,OAAO;KACtE;IACF;IACA,MAAM,kBAAkB,OACtB,sBACA,UACA,wBACF;IACA,IAAI,OAAO,UAAU,eAAe,GAClC,OAAO,CAAC,OAAO,KAAK,gBAAgB,OAAO,GAAG,OAAO;IACvD,UAAU,KAAK,CAAC,aAAa,gBAAgB,OAAO,CAAC;IACrD,cAAc,KAAK;KACjB;KACA;MACE,KAAK,SAAS;MACd,OAAO,SAAS;MAChB,qBAAqB,SAAS,MAAM;KACtC;KACA,OAAO,QAAQ,IAAI;IACrB,CAAC;IACD,MAAM,UAAU,OAAO,QAAQ,IAAI;IACnC,OAAO,IAAI,UAAU,OAAO,IAAI,OAAO,KAAK,KAAK,CAAC;IAClD,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,OAAO,uBACtC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,kBAAkB,CAAC,GAAG,OAAO;IACrE,IAAI,OAAO,QAAQ,cAAc,SAAS,QAAQ;KAChD,MAAM,WAAW;MAAE,GAAG,OAAO;MAAS,OAAO;MAAqB,UAAU;KAAK;KACjF,MAAM,gBAAgB,OACpB,oBACA,UACA,4BACF;KACA,IAAI,OAAO,UAAU,aAAa,GAChC,OAAO,CAAC,OAAO,KAAK,cAAc,OAAO,GAAG,OAAO;KACrD,MAAM,cAAc,sBAAsB,SAAS,GAAG;KACtD,QAAQ,KAAK,CAAC,aAAa,cAAc,OAAO,CAAC;KACjD,MAAM,UAAU,QAAQ,kBAAkB,IAAI,WAAW;KACzD,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,iBAAiB,CAAC,GAAG,OAAO;KACnE,oBAAoB,KAAK,CACvB,aACA;MAAE,GAAG;MAAS,OAAO;MAAY,YAAY;KAAK,CACpD,CAAC;IACH;GACF;GACA,IAAI,QAAQ,WAAW,OAAO,UAAU,SAAS,OAAO,eACtD,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,YAAY,CAAC,GAAG,OAAO;GAC/D,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,KAAK,MAAM,CAAC,KAAK,UAAU,SAAS,cAAc,IAAI,KAAK,KAAK;GAChE,MAAM,iBAAiB,IAAI,IAAI,QAAQ,UAAU;GACjD,KAAK,MAAM,CAAC,KAAK,UAAU,WAAW,eAAe,IAAI,KAAK,KAAK;GACnE,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,KAAK,MAAM,CAAC,KAAK,UAAU,eAAe,cAAc,IAAI,KAAK,KAAK;GACtE,MAAM,oBAAoB,IAAI,IAAI,QAAQ,iBAAiB;GAC3D,KAAK,MAAM,CAAC,KAAK,UAAU,qBAAqB,kBAAkB,IAAI,KAAK,KAAK;GAChF,MAAM,YAA2B;IAC/B,GAAG;IACH;IACA,iBAAiB;IACjB,gBAAgB;GAClB;GACA,MAAM,eAAe,OAAO,eAAe,WAAW,qBAAqB;GAC3E,IAAI,OAAO,UAAU,YAAY,GAAG,OAAO,CAAC,OAAO,KAAK,aAAa,OAAO,GAAG,OAAO;GACtF,MAAM,SAAS,IAAI,IAAI,QAAQ,MAAM;GACrC,OAAO,IAAI,UAAU,SAAS,aAAa,OAAO;GAClD,MAAM,aAAa,IAAI,IAAI,QAAQ,UAAU;GAC7C,WAAW,IAAI,UAAU,SAAS;IAChC,iBAAiB,UAAU;IAC3B,qBAAqB,UAAU;GACjC,CAAC;GACD,OAAO,CACL,OAAO,MACP;IACE,GAAG;IACH;IACA;IACA;IACA;IACA,YAAY;IACZ;IACA,qBAAqB;GACvB,CACF;EACF,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,2BAA2B;CAClD,CAAC;CAED,MAAM,UAAmD,OAAO,GAC9D,iCACF,CAAC,CAAC,WAAW,YAAY,eAAe,WAAW,aAAa;EAC9D,MAAM,gBAAgB,OAAOE,WAAS,eAAe,YAAY,gBAAgB;EACjF,MAAM,WAAW,OAAOA,WAAS,sBAAsB,eAAe,mBAAmB;EACzF,MAAM,SAAS,OAAOA,WAAS,oBAAoB,aAAa,iBAAiB;EACjF,OAAO,iBAAiB,eAAe,oBAAoB;EAC3D,OAAO,UAAU,IAAI,8BAA8B;EACnD,MAAM,qBAAqB,KAAK,IAAI,WAAW,OAAO,MAAM,iBAAiB;EAC7E,OAAO,OAAO,gBACZ,IAAI,OACF,QACC,YAAwF;GACvF,MAAM,YAAY,QAAQ,OAAO,IAAI,cAAc,OAAO;GAC1D,MAAM,aAAa,QAAQ,cAAc,IACvC,sBAAsB,SAAS,IAAI,YAAY,CACjD;GACA,IAAI,cAAc,KAAA,KAAa,eAAe,KAAA,GAC5C,OAAO,CACL,OAAO,KAAKF,QAAM,aAAa,cAAc,KAAA,IAAY,UAAU,cAAc,CAAC,GAClF,OACF;GACF,MAAM,WAAW,OAAO,eAAe,WAAW,uBAAuB;GACzE,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO;GAC9E,MAAM,SAAS,OAAO,oBAAoB,YAAY,uBAAuB;GAC7E,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,OAAO,GAAG,OAAO;GAC1E,IACE,CAAC,kBAAkB,SAAS,SAAS,aAAa,KAClD,CAAC,kBAAkB,UAAU,OAAO,SAAS,SAAS,OAAO,KAC7D,CAAC,8BAA8B,UAAU,OAAO,SAAS,SAAS,OAAO,KACzE,OAAO,QAAQ,cAAc,SAAS,QAEtC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,mBAAmB,CAAC,GAAG,OAAO;GACtE,MAAM,MAAM,8BAA8B,SAAS,GAAG;GACtD,MAAM,eAAe,QAAQ,WAAW,IAAI,GAAG;GAC/C,IAAI,iBAAiB,KAAA,GAAW;IAC9B,MAAM,WAAW,OAAO,sBAAsB,cAAc,mBAAmB;IAC/E,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO;IAC9E,OAAO,qBAAqB,SAAS,SAAS,QAAQ,IAClD,CAAC,OAAO,MAAM,OAAO,IACrB,CAAC,OAAO,KAAKA,QAAM,YAAY,mBAAmB,CAAC,GAAG,OAAO;GACnE;GACA,IAAI,CAAC,sBAAsB,OAAO,SAAS,SAAS,SAAS,oBAAoB,IAAI,GACnF,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,sBAAsB,CAAC,GAAG,OAAO;GACzE,IAAI,QAAQ,WAAW,QAAQ,OAAO,eACpC,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,YAAY,CAAC,GAAG,OAAO;GAC/D,MAAM,aAAa,QAAQ,oBAAoB,IAAI,OAAO,QAAQ,IAAI,OAAO,KAAK;GAClF,IAAI,cAAc,OAAO,uBACvB,OAAO,CAAC,OAAO,KAAKA,QAAM,YAAY,kBAAkB,CAAC,GAAG,OAAO;GACrE,MAAM,kBAAkB,OACtB,sBACA,UACA,0BACF;GACA,IAAI,OAAO,UAAU,eAAe,GAClC,OAAO,CAAC,OAAO,KAAK,gBAAgB,OAAO,GAAG,OAAO;GACvD,MAAM,WAAW;IAAE,GAAG,OAAO;IAAS,OAAO;IAAqB,UAAU;GAAK;GACjF,MAAM,gBAAgB,OACpB,oBACA,UACA,8BACF;GACA,IAAI,OAAO,UAAU,aAAa,GAAG,OAAO,CAAC,OAAO,KAAK,cAAc,OAAO,GAAG,OAAO;GACxF,MAAM,aAAa,IAAI,IAAI,QAAQ,UAAU;GAC7C,WAAW,IAAI,KAAK,gBAAgB,OAAO;GAC3C,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,MAAM,cAAc,sBAAsB,SAAS,GAAG;GACtD,cAAc,IAAI,aAAa,cAAc,OAAO;GACpD,MAAM,oBAAoB,IAAI,IAAI,QAAQ,iBAAiB;GAC3D,MAAM,UAAU,kBAAkB,IAAI,WAAW;GACjD,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,gBAAgB,CAAC,GAAG,OAAO;GAClE,kBAAkB,IAAI,aAAa;IAAE,GAAG;IAAS,OAAO;IAAY,YAAY;GAAK,CAAC;GACtF,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,cAAc,IAAI,KAAK;IACrB,KAAK,SAAS;IACd,OAAO,SAAS;IAChB,qBAAqB,SAAS,MAAM;GACtC,CAAC;GACD,MAAM,sBAAsB,IAAI,IAAI,QAAQ,mBAAmB;GAC/D,oBAAoB,IAAI,SAAS,IAAI,SAAS,aAAa,CAAC;GAC5D,OAAO,CACL,OAAO,MACP;IACE,GAAG;IACH;IACA;IACA;IACA;IACA;GACF,CACF;EACF,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,6BAA6B;CACpD,CAAC;CAED,MAAM,aAAyD,OAAO,GACpE,oCACF,CAAC,CAAC,WAAW,SAAS,qBAAqB,MAAM;EAC/C,MAAM,iBACJ,SAAS,KAAA,IACL,mBACA,OAAOE,WAAS,kBAAkB,MAAM,iBAAiB;EAC/D,OAAO,UAAU,IAAI,iCAAiC;EACtD,OAAO,OAAO,gBACZ,IAAI,OACF,QACC,YAAwF;GACvF,MAAM,OAAO,QAAQ,OAAO,IAAI,OAAO;GACvC,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC,OAAO,KAAKF,QAAM,aAAa,OAAO,CAAC,GAAG,OAAO;GACjF,MAAM,WAAW,OAAO,eAAe,MAAM,oBAAoB;GACjE,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO;GAC9E,MAAM,UAAU;IAAE,GAAG,SAAS;IAAS;IAAqB;GAAe;GAC3E,MAAM,UAAU,OAAO,eAAe,SAAS,oBAAoB;GACnE,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAC5E,MAAM,SAAS,IAAI,IAAI,QAAQ,MAAM;GACrC,OAAO,IAAI,SAAS,QAAQ,OAAO;GACnC,MAAM,aAAa,IAAI,IAAI,QAAQ,UAAU;GAC7C,MAAM,UAAU,WAAW,IAAI,OAAO;GACtC,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,mBAAmB,CAAC,GAAG,OAAO;GACrE,WAAW,IAAI,SAAS;IAAE,GAAG;IAAS;GAAoB,CAAC;GAC3D,OAAO,CAAC,OAAO,MAAM;IAAE,GAAG;IAAS;IAAQ;GAAW,CAAC;EACzD,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,gCAAgC;CACvD,CAAC;CAED,MAAM,WAAqD,OAAO,GAChE,kCACF,CAAC,CAAC,WAAW,OAAO;EAClB,MAAM,MAAM,OAAOE,WAAS,yBAAyB,OAAO,cAAc;EAC1E,OAAO,iBAAiB,IAAI,cAAc,oBAAoB;EAC9D,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,WAAW,IAAI,8BAA8B,GAAG,CAAC;EACtF,OAAO,SAAS,KAAA,IACZ,OACA,OAAO,aAAa,sBAAsB,MAAM,iBAAiB;CACvE,CAAC;CAED,MAAM,oBAAuE,OAAO,GAClF,2CACF,CAAC,CAAC,WAAW,WAAW,OAAO,OAAO;EACpC,MAAM,QAAwC,CAAC;EAC/C,KAAK,MAAM,CAAC,YAAY,UAAU,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,eACvD,IACE,KAAK,UAAU,eACf,KAAK,UAAU,aACf,KAAK,uBAAuB,aAC5B,qBAAqB,YAAY,KAAK,IAAI,GAE1C,MAAM,KAAK,KAAK,GAAG;EAEvB,MAAM,MAAM,GAAG,MACb,qBAAqB,8BAA8B,CAAC,GAAG,8BAA8B,CAAC,CAAC,CACzF;EACA,OAAO,MAAM,MAAM,GAAG,KAAK;CAC7B,CAAC;CAED,MAAM,iBAAiE,OAAO,GAC5E,wCACF,CAAC,CAAC,WAAW,OAAO,OAAO,OAAO;EAChC,MAAM,MAAM,OAAO,WAAW,OAAO,qBAAqB;EAC1D,MAAM,QAAqC,CAAC;EAC5C,KAAK,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,WAAW,OAAO,GAAG;GAC9D,MAAM,OAAO,OAAO,aAAa,sBAAsB,MAAM,eAAe;GAC5E,MAAM,UAAU,8BAA8B,KAAK,GAAG;GACtD,IACE,sBAAsB,KAAK,IAAI,YAAY,MAAM,sBAAsB,GAAG,KAC1E,qBAAqB,SAAS,KAAK,IAAI,GAEvC,MAAM,KAAK,IAAI;EACnB;EACA,MAAM,MAAM,GAAG,MACb,qBACE,8BAA8B,EAAE,GAAG,GACnC,8BAA8B,EAAE,GAAG,CACrC,CACF;EACA,OAAO,MAAM,MAAM,GAAG,KAAK;CAC7B,CAAC;CAED,MAAM,iBAAiE,OAAO,GAC5E,wCACF,CAAC,CAAC,WAAW,UAAU,iBAAiB,aAAa;EACnD,MAAM,MAAM,OAAOA,WAAS,yBAAyB,UAAU,qBAAqB;EACpF,MAAM,aAAa,OAAOA,WAAS,QAAQ,iBAAiB,oBAAoB;EAChF,MAAM,SAAS,OAAOA,WAAS,gBAAgB,aAAa,wBAAwB;EACpF,OAAO,iBAAiB,IAAI,cAAc,2BAA2B;EACrE,OAAO,UAAU,IAAI,yBAAyB,OAAO,KAAK,YAAY,EAAE,QAAQ;EAChF,MAAM,kBACJ,OAAO,SAAS,YACZ;GAAE,GAAG;GAAQ,WAAW,KAAK,IAAI,OAAO,WAAW,OAAO,MAAM,iBAAiB;EAAE,IACnF;EACN,MAAM,SAAS,OAAO,OAAO,gBAC3B,IAAI,OACF,QAEE,YAIG;GACH,MAAM,aAAa,8BAA8B,GAAG;GACpD,MAAM,OAAO,QAAQ,WAAW,IAAI,UAAU;GAC9C,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC,OAAO,KAAKF,QAAM,aAAa,UAAU,CAAC,GAAG,OAAO;GACpF,MAAM,UAAU,OAAO,sBAAsB,MAAM,wBAAwB;GAC3E,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,SAAS,OAAO;GACvD,MAAM,mBAAmB,QAAQ,cAAc,IAC7C,sBAAsB,IAAI,YAAY,CACxC;GACA,IAAI,qBAAqB,KAAA,GACvB,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,uBAAuB,CAAC,GAAG,OAAO;GACzE,MAAM,eAAe,OACnB,oBACA,kBACA,uBACF;GACA,IAAI,OAAO,UAAU,YAAY,GAAG,OAAO,CAAC,OAAO,KAAK,aAAa,OAAO,GAAG,OAAO;GACtF,MAAM,aAAa,gCACjB,QAAQ,SACR,aAAa,SACb,YACA,eACF;GACA,IAAI,OAAO,UAAU,UAAU,GAAG,OAAO,CAAC,OAAO,KAAK,WAAW,OAAO,GAAG,OAAO;GAClF,IAAI,WAAW,YAAY,QAAQ,SACjC,OAAO,CAAC,OAAO,QAAQ,QAAQ,OAAO,GAAG,OAAO;GAClD,MAAM,UAAU,WAAW;GAC3B,MAAM,UAAU,OAAO,sBAAsB,SAAS,wBAAwB;GAC9E,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAC5E,MAAM,aAAa,IAAI,IAAI,QAAQ,UAAU;GAC7C,WAAW,IAAI,YAAY,QAAQ,OAAO;GAC1C,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,MAAM,UAAU,cAAc,IAAI,UAAU;GAC5C,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,gBAAgB,CAAC,GAAG,OAAO;GAClE,cAAc,IAAI,YAAY;IAC5B,GAAG;IACH,OAAO,QAAQ;IACf,qBAAqB,QAAQ,MAAM;GACrC,CAAC;GACD,OAAO,CAAC,OAAO,QAAQ,OAAO,GAAG;IAAE,GAAG;IAAS;IAAY;GAAc,CAAC;EAC5E,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,yBAAyB,OAAO,KAAK,YAAY,EAAE,OAAO;EAC/E,OAAO;CACT,CAAC;CAED,MAAM,aAAyD,OAAO,GACpE,oCACF,CAAC,CAAC,WAAW,WAAW,OAAO,OAAO;EACpC,MAAM,UAA8E,CAAC;EACrF,KAAK,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,EAAA,CAAG,kBAAkB,OAAO,GAClE,IACE,KAAK,UAAU,SACf,KAAK,UAAU,YACf,KAAK,eAAe,QACpB,KAAK,cAAc,WAEnB,QAAQ,KAAK;GAAE,KAAK,KAAK;GAAK,SAAS,KAAK;EAAQ,CAAC;EAEzD,QAAQ,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;EAC5C,OAAO,QAAQ,MAAM,GAAG,KAAK;CAC/B,CAAC;CAED,MAAM,gBAA+D,OAAO,GAC1E,uCACF,CAAC,CAAC,WAAW,OAAO,UAAU;EAC5B,MAAM,MAAM,OAAO,WAAW,OAAO,oBAAoB;EACzD,OAAO,UAAU,IAAI,oCAAoC;EACzD,OAAO,OAAO,gBACZ,IAAI,OACF,QACC,YAAwF;GACvF,MAAM,aAAa,sBAAsB,GAAG;GAC5C,MAAM,OAAO,QAAQ,cAAc,IAAI,UAAU;GACjD,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC,OAAO,KAAKA,QAAM,aAAa,cAAc,CAAC,GAAG,OAAO;GACxF,MAAM,SAAS,OAAO,oBAAoB,MAAM,uBAAuB;GACvE,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,OAAO,GAAG,OAAO;GAC1E,MAAM,UAAU;IACd,GAAG,OAAO;IACV,UAAU,OAAO,QAAQ,UAAU,WAAW,WAAW;GAC3D;GACA,MAAM,UAAU,OAAO,oBAAoB,SAAS,uBAAuB;GAC3E,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,GAAG,OAAO;GAC5E,MAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa;GACnD,cAAc,IAAI,YAAY,QAAQ,OAAO;GAC7C,MAAM,oBAAoB,IAAI,IAAI,QAAQ,iBAAiB;GAC3D,MAAM,UAAU,kBAAkB,IAAI,UAAU;GAChD,IAAI,YAAY,KAAA,GACd,OAAO,CAAC,OAAO,KAAKA,QAAM,WAAW,gBAAgB,CAAC,GAAG,OAAO;GAClE,kBAAkB,IAAI,YAAY;IAChC,GAAG;IACH,YAAY,QAAQ,UAAU,uBAAuB;GACvD,CAAC;GACD,OAAO,CAAC,OAAO,MAAM;IAAE,GAAG;IAAS;IAAe;GAAkB,CAAC;EACvE,CACF,CACF,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC;EACxC,OAAO,UAAU,IAAI,mCAAmC;CAC1D,CAAC;CAED,MAAM,kBAAmE,IAAI,IAAI,KAAK,CAAC,CAAC,KACtF,OAAO,KAAK,YAAY,QAAQ,WAAW,CAC7C;CAEA,MAAM,qBAAyE,OAAO,GACpF,4CACF,CAAC,CAAC,WAAW,OAAO;EAClB,MAAM,UAAU,OAAOE,WAAS,yBAAyB,OAAO,cAAc;EAC9E,OAAO,UAAU,IAAI,0CAA0C;EAC/D,OAAO,OAAO,gBACZ,IAAI,OAAO,QAAQ,aAAa;GAAE,GAAG;GAAS,aAAa;EAAQ,EAAE,CACvE;EACA,OAAO,UAAU,IAAI,yCAAyC;CAChE,CAAC;CAED,MAAM,eAAe,OAAO,IAAI,aAAa;EAC3C,IAAI,WAA0B;EAC9B,MAAM,UAAU,OAAO,IAAI,IAAI,KAAK;EACpC,IACE,QAAQ,YAAY,WAAW,MAC/B,QAAQ,YAAY,eAAe,MACnC,QAAQ,YAAY,aAAa,GAEjC,OAAO;EACT,MAAM,YAAY,UAAkB;GAClC,IAAI,aAAa,QAAQ,QAAQ,UAAU,WAAW;EACxD;EACA,KAAK,MAAM,YAAY,QAAQ,WAAW,OAAO,GAC/C,IAAI,CAAC,SAAS,iBAAiB,SAAS,SAAS,mBAAmB;EACtE,KAAK,MAAM,QAAQ,QAAQ,cAAc,OAAO,GAC9C,IAAI,KAAK,UAAU,eAAe,KAAK,UAAU,WAC/C,SAAS,KAAK,mBAAmB;EACrC,KAAK,MAAM,UAAU,QAAQ,kBAAkB,OAAO,GACpD,IAAI,OAAO,UAAU,YAAY,OAAO,eAAe,MAAM,SAAS,OAAO,UAAU;EACzF,OAAO;CACT,CAAC,CAAC,CAAC,KAAK,OAAO,SAAS,sCAAsC,CAAC;CAE/D,OAAO,kBAAkB,GAAG;EAC1B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;AACH,CAAC;AAED,MAAa,gCACX,cAEA,MAAM,OAAO,mBAAmB,4BAA4B,SAAS,CAAC;;;ACv3BxE,MAAM,cAAc;AACpB,MAAM,yBAAyB;AAC/B,MAAM,6BAA6B;AA4CnC,MAAM,cAAc,WAAmB,SAAiB,UACtD,UAAU,KAAA,IACN,iBAAiB,KAAK;CAAE;CAAW;AAAQ,CAAC,IAC5C,iBAAiB,KAAK;CAAE;CAAW;CAAS;AAAM,CAAC;AAEzD,MAAM,WAAW,OAAO,GAAG,4BAA4B,CAAC,EAEpD,QACA,WACA,UAEA,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACxC,OAAO,QAAQ,OAAO,oBAAoB,MAAM,CAAC,GACjD,OAAO,UAAU,UAAU,WAAW,WAAW,WAAW,UAAU,WAAW,KAAK,CAAC,CACzF,CACJ;AAEA,MAAM,0BAA0B,OAAO,WAAW,iBAAiB;AACnE,MAAM,0BAA0B,wBAAwB,CAAC;AAEzD,MAAM,iBAAiB,OAAO,GAAG,kCAAkC,CAAC,EAClE,UACA,WACuD;CACvD,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO,QAAQ,uBAAuB;CACvE,MAAM,SAAS,aAAa,SAAS,aAAa,QAAQ,EAAE;CAC5D,MAAM,kBAAkB,OAAO,WAAW,MAAM,IAAI,OAAO,MAAM,OAAO,MAAM,IAAI;CAClF,IAAI,CAAC,QAAQ,KAAK,eAAe,GAC/B,OAAO,OAAO,KAAK,WAAW,WAAW,8BAA8B,CAAC;CAE1E,MAAM,WAAW,OAAO,eAAe;CACvC,OAAO,OAAO,cAAc,QAAQ,IAChC,OAAO,oBAAoB,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,KACtD,OAAO,eAAe,WAAW,WAAW,8BAA8B,CAAC,CAC7E,IACA,OAAO,KAAK,WAAW,WAAW,8BAA8B,CAAC;AACvE,CAAC;AAED,MAAM,qBAAqB,UAAoB,aAC7C,OAAO,WAAW,iBAAiB,CAAC,CAAC,aAAa,SAAS,aAAa,QAAQ,EAAE,GAAG,UAAU;AAEjG,MAAM,aAAa,OAAO,GAAG,8BAA8B,CAAC,EAC1D,OACA,aACuD;CACvD,MAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ;CACzC,OAAO,WAAW,KAAA,IACd,OAAO,KAAK,sBAAsB,KAAK,EAAE,SAAS,CAAC,CAAC,IACpD,OAAO,QAAQ,MAAM;AAC3B,CAAC;AAED,MAAM,4BAA4B,OAAO,OAAO,EAC9C,YAAY,OAAO,OAAO;CACxB,UAAU;CACV,eAAe,OAAO;AACxB,CAAC,EACH,CAAC;AAED,MAAM,4BAA4B,OAAO,GAAG,6CAA6C,CAAC,CACxF,WAAW,OAA+E;CACxF,MAAM,WAAW,OAAO,OAAO,oBAAoB,yBAAyB,CAAC,CAAC,KAAK,CAAC,CAAC,KACnF,OAAO,eAAe,WAAW,kBAAkB,gCAAgC,CAAC,CACtF;CACA,IAAI,SAAS,WAAW,kBAAkB,GACxC,OAAO,OAAO,mBAAmB,KAAK;EACpC,UAAU,SAAS,WAAW;EAC9B,QAAQ;CACV,CAAC;AAEL,CACF;AAEA,MAAM,kBAAkB,OAAO,IAAI,aAAa;CAC9C,MAAM,SAAS,OAAO,OAAO;CAC7B,MAAM,QAAQ,OAAO,IAAI,KAAkB,EAAE,yBAAS,IAAI,IAAI,EAAE,CAAC;CACjE,MAAM,UAAU,OAAO,OAAO,QAAc,CAAC;CAC7C,OAAO,OAAO,mBAAmB,OAAO,SAAS,OAAO,CAAC;CAEzD,MAAM,cAAqD,OAAO,GAChE,+BACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,uBAAuB,eAAe,WAAW;EACjF,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAyD;GACxD,MAAM,WAAW,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;GACrD,IAAI,aAAa,KAAA,GAAW;IAC1B,IAAI,QAAQ,gBAAgB,SAAS,eACnC,OAAO,CACL;KACE,MAAM;KACN,OAAO,cAAc,KAAK;MACxB,UAAU,QAAQ;MAClB,aAAa,SAAS;MACtB,gBAAgB,QAAQ;KAC1B,CAAC;IACH,GACA,OACF;IAEF,IAAI,QAAQ,kBAAkB,SAAS,eACrC,OAAO,CAAC,EAAE,MAAM,UAAU,GAAG,OAAO;IAEtC,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;IACvC,QAAQ,IAAI,QAAQ,UAAU;KAC5B,GAAG;KACH,eAAe,QAAQ;IACzB,CAAC;IACD,OAAO,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,QAAQ,CAAC;GAC1C;GACA,IAAI,QAAQ,QAAQ,QAAQ,aAC1B,OAAO,CACL;IACE,MAAM;IACN,OAAO,WAAW,eAAe,0BAA0B,YAAY,UAAU;GACnF,GACA,OACF;GAEF,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,QAAQ,UAAU;IAC5B,eAAe,QAAQ;IACvB,cAAc;IACd,YAAY;IACZ,SAAS,CAAC;IACV,2BAAW,IAAI,IAAI;IACnB,yBAAS,IAAI,IAAI;IACjB,6BAAa,IAAI,IAAI,CAAC,CAAC,yBAAyB,iBAAiB,CAAC,CAAC;IACnE,6BAAa,IAAI,IAAI;GACvB,CAAC;GACD,OAAO,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,QAAQ,CAAC;EAC1C,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACH;CAEA,MAAM,SAA2C,OAAO,GAAG,0BAA0B,CAAC,EACnF,gBACC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,qBAAqB,UAAU,WAAW;EAC1E,MAAM,SAAS,OAAO,qBAAqB,QAAQ,oBAAoB,QAAQ,KAAK,CAAC,CAAC,KACpF,OAAO,eAAe,OAAO,QAAQ,MAAM,GAC3C,OAAO,UAAU,UAAU,WAAW,UAAU,MAAM,SAAS,KAAK,CAAC,CACvE;EAEA,MAAM,WAAW,OAAO,OAAO,gBAC7B,IAAI,OAAO,QAAQ,YAAoD;GACrE,MAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;GACnD,IAAI,WAAW,KAAA,GACb,OAAO,CACL;IACE,MAAM;IACN,OAAO,sBAAsB,KAAK,EAChC,UAAU,QAAQ,SACpB,CAAC;GACH,GACA,OACF;GAEF,IAAI,QAAQ,kBAAkB,OAAO,eACnC,OAAO,CACL;IACE,MAAM;IACN,OAAO,cAAc,KAAK;KACxB,UAAU,QAAQ;KAClB,aAAa,OAAO;KACpB,gBAAgB,QAAQ;IAC1B,CAAC;GACH,GACA,OACF;GAEF,MAAM,WAAW,OAAO,QAAQ,IAAI,QAAQ,MAAM,OAAO;GACzD,IAAI,aAAa,KAAA,GAAW;IAC1B,IAAI,SAAS,WAAW,QACtB,OAAO,CACL;KACE,MAAM;KACN,OAAO,eAAe,KAAK;MACzB,UAAU,QAAQ;MAClB,SAAS,QAAQ,MAAM;MACvB,QAAQ;KACV,CAAC;IACH,GACA,OACF;IAEF,OAAO,CACL;KACE,MAAM;KACN,QAAQ,aAAa,KAAK;MACxB,eAAe,SAAS,OAAO;MAC/B,cAAc,SAAS,OAAO;MAC9B,YAAY,SAAS,OAAO;MAC5B,UAAU;KACZ,CAAC;KACD,SAAS,CAAC;IACZ,GACA,OACF;GACF;GACA,IACE,QAAQ,yBAAyB,OAAO,gBACxC,QAAQ,uBAAuB,OAAO,YAEtC,OAAO,CACL;IACE,MAAM;IACN,OAAO,eAAe,KAAK;KACzB,UAAU,QAAQ;KAClB,SAAS,QAAQ,MAAM;KACvB,QAAQ;KACR,oBAAoB,OAAO;KAC3B,kBAAkB,OAAO;IAC3B,CAAC;GACH,GACA,OACF;GAEF,IAAI,OAAO,QAAQ,SAAS,QAAQ,MAAM,QAAQ,SAAS,wBACzD,OAAO,CACL;IACE,MAAM;IACN,OAAO,WACL,UACA,0BAA0B,uBAAuB,UACnD;GACF,GACA,OACF;GAGF,MAAM,iCAAiB,IAAI,IAAc;GACzC,KAAK,MAAM,UAAU,QAAQ,MAAM,SAAS;IAC1C,IAAI,OAAO,UAAU,IAAI,OAAO,QAAQ,KAAK,eAAe,IAAI,OAAO,QAAQ,GAC7E,OAAO,CACL;KACE,MAAM;KACN,OAAO,eAAe,KAAK;MACzB,UAAU,QAAQ;MAClB,SAAS,QAAQ,MAAM;MACvB,QAAQ;KACV,CAAC;IACH,GACA,OACF;IAEF,eAAe,IAAI,OAAO,QAAQ;GACpC;GAEA,MAAM,UAAU,QAAQ,MAAM,QAAQ,KAAK,QAAQ,UAAU;IAC3D,MAAM,WAAW,wBAAwB,OAAO,eAAe,QAAQ,CAAC;IACxE,OAAO,wBAAwB,KAAK;KAClC,UAAU,QAAQ;KAClB,SAAS,QAAQ,MAAM;KACvB;KACA,QAAQ,kBAAkB,QAAQ,UAAU,QAAQ;KACpD;IACF,CAAC;GACH,CAAC;GACD,MAAM,eAAe,wBAAwB,OAAO,eAAe,QAAQ,MAAM;GACjF,MAAM,SAAS,aAAa,KAAK;IAC/B,eAAe,wBAAwB,OAAO,eAAe,CAAC;IAC9D;IACA,YAAY;IACZ,UAAU;GACZ,CAAC;GACD,MAAM,UAAU,IAAI,IAAI,OAAO,OAAO;GACtC,QAAQ,IAAI,QAAQ,MAAM,SAAS;IAAE;IAAQ;GAAO,CAAC;GACrD,MAAM,YAAY,IAAI,IAAI,OAAO,SAAS;GAC1C,KAAK,MAAM,YAAY,gBAAgB,UAAU,IAAI,QAAQ;GAC7D,MAAM,cAAc,IAAI,IAAI,OAAO,WAAW;GAC9C,YAAY,IAAI,cAAc,MAAM;GACpC,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,QAAQ,UAAU;IAC5B,GAAG;IACH,cAAc;IACd,YAAY;IACZ,SAAS,CAAC,GAAG,OAAO,SAAS,GAAG,OAAO;IACvC;IACA;IACA;GACF,CAAC;GACD,OAAO,CAAC;IAAE,MAAM;IAAW;IAAQ;GAAQ,GAAG,EAAE,QAAQ,CAAC;EAC3D,CAAC,CAAC,CAAC,KACD,OAAO,KAAK,aACV,SAAS,SAAS,aAAa,SAAS,QAAQ,SAAS,IACrD,OAAO,QAAQ,SAAS,KAAA,CAAS,IACjC,OAAO,IACb,CACF,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;EACxD,OAAO,SAAS;CAClB,CAAC,CACL;CAEA,MAAM,eAAe,OAAO,GAAG,gCAAgC,CAAC,EAC7D,UAAoB,eAA8C,UACjE,IAAI,IAAI,KAAK,CAAC,CAAC,KACb,OAAO,SAAS,YAAY,WAAW,SAAS,QAAQ,CAAC,GACzD,OAAO,KAAK,WACV,OAAO,QACJ,QAAQ,WAAW,OAAO,YAAY,iBAAiB,wBAAwB,CAAC,CAChF,MAAM,GAAG,KAAK,CACnB,CACF,CACJ;CAEA,MAAM,QAAwC,gBAC5C,OAAO,OACL,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,YAAY,QAAQ,WAAW;EAC/D,MAAM,UAAU,OAAO,aAAa,QAAQ,UAAU,QAAQ,eAAe,QAAQ,KAAK;EAC1F,OAAO,OAAO,aAAa,OAAO;CACpC,CAAC,CACH;CAEF,MAAM,WAA8C,gBAClD,OAAO,OACL,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,mBAAmB,WAAW,WAAW;EACzE,MAAM,gBAAgB,OAAO,eAAe,QAAQ,UAAU,QAAQ,WAAW;EACjF,OAAO,OAAO,OACZ,OAAO,IAAI,aAAa;GACtB,MAAM,eAAe,OAAO,OAAO,UAAU,OAAO;GACpD,MAAM,UAAU,OAAO,aACrB,QAAQ,UACR,eACA,sBACF;GACA,MAAM,YACJ,QAAQ,WAAW,IAAI,gBAAiB,QAAQ,GAAG,EAAE,CAAC,EAAE,YAAY;GACtE,MAAM,OAAO,OAAO,iBAAiB,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,KAC9D,OAAO,qBACC,YACL,iBACC,aAAa,QAAQ,UAAU,cAAc,sBAAsB,CAAC,CAAC,KACnE,OAAO,KACJ,YAAY,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,YAAY,cAAc,OAAO,CACjE,CACF,CACJ,CACF;GACA,OAAO,OAAO,aAAa,OAAO,CAAC,CAAC,KAAK,OAAO,OAAO,IAAI,CAAC;EAC9D,CAAC,CACH;CACF,CAAC,CACH;CAEF,MAAM,eAAiD,OAAO,GAAG,0BAA0B,CAAC,EACzF,gBACC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,qBAAqB,UAAU,WAAW;EAC1E,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,KACnC,OAAO,SAAS,YAAY,WAAW,SAAS,QAAQ,QAAQ,CAAC,CACnE;EACA,OAAO,aAAa,KAAK;GACvB,QAAQ;GACR,UAAU,QAAQ;GAClB,cAAc,OAAO;GACrB,YAAY,OAAO;GACnB,SAAS,OAAO;EAClB,CAAC;CACH,CAAC,CACL;CAEA,MAAM,cAAqD,OAAO,GAChE,+BACF,CAAC,EAAE,gBACD,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,mBAAmB,eAAe,WAAW;EAC7E,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,KACnC,OAAO,SAAS,YAAY,WAAW,SAAS,QAAQ,QAAQ,CAAC,CACnE;EACA,OAAO,WAAW,KAAK;GACrB,UAAU,QAAQ;GAClB,cAAc,OAAO;GACrB,YAAY,OAAO;GACnB,eAAe,OAAO;EACxB,CAAC;CACH,CAAC,CACH;CAEA,MAAM,iBAA4C,OAAO,GAAG,kCAAkC,CAAC,EAC5F,gBACC,OAAO,IAAI,aAAa;EACtB,OAAO,0BAA0B,WAAW;EAC5C,MAAM,UAAU,OAAO,SAAS,uBAAuB,kBAAkB,WAAW;EACpF,MAAM,WAAW,OAAO,IAAI,OAC1B,QACC,YAAwD;GACvD,MAAM,aAAa,QAAQ;GAC3B,MAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW,QAAQ;GACtD,IAAI,WAAW,KAAA,GACb,OAAO,CACL;IACE,MAAM;IACN,OAAO,sBAAsB,KAAK,EAChC,UAAU,WAAW,SACvB,CAAC;GACH,GACA,OACF;GAEF,IAAI,WAAW,kBAAkB,OAAO,cACtC,OAAO,CACL;IACE,MAAM;IACN,OAAO,mBAAmB,KAAK;KAC7B,UAAU,WAAW;KACrB,QAAQ;IACV,CAAC;GACH,GACA,OACF;GAEF,IAAI,OAAO,YAAY,IAAI,WAAW,eAAe,MAAM,WAAW,YACpE,OAAO,CACL;IACE,MAAM;IACN,OAAO,mBAAmB,KAAK;KAC7B,UAAU,WAAW;KACrB,QAAQ;IACV,CAAC;GACH,GACA,OACF;GAEF,IACE,CAAC,OAAO,YAAY,IAAI,WAAW,eAAe,KAClD,OAAO,YAAY,QAAQ,4BAE3B,OAAO,CACL;IACE,MAAM;IACN,OAAO,WACL,kBACA,8BAA8B,2BAA2B,UAC3D;GACF,GACA,OACF;GAEF,MAAM,cAAc,IAAI,IAAI,OAAO,WAAW;GAC9C,YAAY,IAAI,WAAW,iBAAiB,UAAU;GACtD,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,WAAW,UAAU;IAAE,GAAG;IAAQ;GAAY,CAAC;GAC3D,OAAO,CAAC,EAAE,MAAM,UAAU,GAAG,EAAE,QAAQ,CAAC;EAC1C,CACF;EACA,IAAI,SAAS,SAAS,WAAW,OAAO,OAAO,SAAS;CAC1D,CAAC,CACL;CAEA,MAAM,iBAA4C,OAAO,GAAG,kCAAkC,CAAC,EAC5F,gBACC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,SAAS,uBAAuB,kBAAkB,WAAW;EACpF,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,CAAC,CAAC,KACnC,OAAO,SAAS,YAAY,WAAW,SAAS,QAAQ,QAAQ,CAAC,CACnE;EACA,MAAM,UAAU,QAAQ,sBAAsB,OAAO;EACrD,IAAI;EACJ,KAAK,MAAM,CAAC,UAAU,eAAe,OAAO,aAC1C,IACE,YAAY,YACX,aAAa,KAAA,KAAa,WAAW,SAAS,kBAE/C,WAAW;EAGf,IACE,aAAa,KAAA,KACb,OAAO,YAAY,IAAI,SAAS,eAAe,MAAM,SAAS,YAE9D,OAAO,OAAO,mBAAmB,KAAK;GACpC,UAAU,QAAQ;GAClB,QAAQ;EACV,CAAC;EAEH,OAAO,OAAO,cAAc,QAAQ;CACtC,CAAC,CACL;CAEA,OAAO,YAAY,GAAG;EACpB;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA,aAAa;GAAE,MAAM;GAAgB,MAAM;EAAe;CAC5D,CAAC;AACH,CAAC;AAED,MAAa,wBAAwB,MAAM,OAAO,aAAa,eAAe;;;;;AAM9E,MAAa,oBAAoB;;;ACzjBjC,MAAM,mBAAmB,OAAO,IAAI,MAAM,OAAO,UAAU;CAAE,SAAS;CAAG,SAAS;AAAO,CAAC,CAAC;AAC3F,MAAM,4BAA4B;;;;;;AAOlC,IAAa,gCAAb,cAAmD,OAAO,MACxD,4DACF,CAAC,CAAC;CACA,YAAY;CACZ,WAAW;CACX,gBAAgB,OAAO,YACrB,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS;CAAW,CAAC,CAAC,CACxE;AACF,CAAC,CAAC,CAAC,CAAC;AAoBJ,MAAM,cAAc,OAAO,cAAc,qBAAqB;AAC9D,MAAM,aAAa,OAAO,cAAc,kBAAkB,IAAI;AAC9D,MAAM,SAAS,WAAmB,WAChC,iBAAiB,KAAK;CAAE;CAAW;AAAO,CAAC;AAC7C,MAAM,aAAa,QAA2B,KAAK,UAAU,CAAC,IAAI,UAAU,SAAS,IAAI,EAAE,CAAC;AAC5F,MAAM,uBAAuB,WAC3B,SAAS,UAAU,KAAK,UAAU,MAAM,CAAC,CAAC,CAAC,SAAS;AAEtD,MAAM,iBAAiB,OAAO,GAAG,sCAAsC,CAAC,CAAC,WACvE,QACA,OACA,WACuC;CACvC,OAAO,OAAO,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACtD,OAAO,SAAS,YAAY,OAAO,aAAa,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,GACzF,OAAO,eAAe,MAAM,WAAW,eAAe,CAAC,CACzD;AACF,CAAC;AAED,MAAM,gBAAgB,WACpB,OAAO,OACL,kBAAkB,KAAK;CACrB,KAAK,OAAO,OACV,UAAU,KAAK;EACb,GAAG,OAAO;EACV,WAAW,OAAO,OAAO,EAAE,SAAS,OAAO,IAAI,UAAU,QAAQ,CAAC;CACpE,CAAC,CACH;CACA,QAAQ,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,CAAC;CAC1C,kBAAkB,OAAO;AAC3B,CAAC,CACH;AAEF,MAAM,eAAe,UACnB,OAAO,OAAO,oBAAoB,KAAK;CAAE,GAAG;CAAO,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;AAAE,CAAC,CAAC;AAEhG,MAAM,kBAAkB,QAA2B,aACjD,OAAO,mBAAmB,SAAS,OAAO,oBACzC,OAAO,qBAAqB,SAAS,OAAO,oBAC3C,CAAC,WAAW,QAAQ,SAAS,MAAM;AAEvC,MAAM,eAAe,WAAiD;CACpE,IAAI,MAAM;CACV,KAAK,MAAM,SAAS,QAAQ;EAC1B,OAAO,QAAQ;EACf,IAAI,CAAC,OAAO,SAAS,GAAG,GAAG,OAAO;CACpC;CACA,OAAO,MAAM,IAAI,MAAM;AACzB;AAEA,MAAM,eAAe,QAA+B,YAClD,OAAO,WAAW,QAAQ,cAAc,YAAY,MAAM,MAAM;AAElE,MAAM,iBAAiB,OAAO,GAAG,sCAAsC,CAAC,CAAC,WACvE,QACA,SACA,WAC0C;CAC1C,IAAI,WAAW;CACf,MAAM,6BAAa,IAAI,IAAY;CACnC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;EAClD,MAAM,QAAQ,OAAO;EACrB,MAAM,aAAa,SAAS,UAAU,MAAM,IAAI,CAAC,CAAC,SAAS;EAC3D,IACE,MAAM,YAAY,SAClB,MAAM,cAAc,YACpB,MAAM,WAAW,MAAM,aACvB,MAAM,UAAU,MAAM,cAAc,cACpC,aAAa,QAAQ,iBACrB,WAAW,IAAI,MAAM,SAAS,KAC9B,CAAC,YAAY,MAAM,QAAQ,OAAO,GAElC,OAAO,OAAO,MAAM,WAAW,eAAe;EAEhD,WAAW,IAAI,MAAM,SAAS;EAC9B,WAAW,MAAM;CACnB;AACF,CAAC;AAED,MAAM,UAAU,MAA6B,UAAyC;CACpF,MAAM,WAAW,KAAK,KAAK,YAAY,IAAI,KAAK,CAAC;CACjD,MAAM,YAAY,KAAK,KAAK,YAAY,KAAK,KAAK,CAAC;CACnD,IAAI,QAAQ;CACZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SACvC,SAAU,KAAK,SAAS,YAAa,MAAM,SAAS;CAEtD,MAAM,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,CAAC;CAC/C,OAAO,YAAY,IAAI,IAAI;AAC7B;AAEA,MAAM,eAAe,MAAc,UACjC,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AAEzC,MAAM,YAAY,OAAO,GAAG,4BAA4B,CAAC,CAAC,WACxD,YACA,aACA;CACA,MAAM,UAAU,OAAO,OACrB,sBAAsB,KAAK,EACzB,GAAI,OAAO,eACT,uBACA,YACA,iCACF,EACF,CAAC,CACH;CACA,MAAM,WAAW,OAAO,eACtB,+BACA,aACA,iCACF;CACA,IAAI,SAAS,YAAY,QAAQ,aAAa,2BAC5C,OAAO,OAAO,MAAM,mCAAmC,eAAe;CAExE,MAAM,iBAAiB,SAAS,kBAAkB;CAClD,MAAM,OAAO,OAAO,IAAI,KAAgB;EAAE,QAAQ;EAAO,yBAAS,IAAI,IAAI;EAAG,aAAa;CAAE,CAAC;CAC7F,OAAO,OAAO,mBACZ,IAAI,IAAI,MAAM;EAAE,QAAQ;EAAM,yBAAS,IAAI,IAAI;EAAG,aAAa;CAAE,CAAC,CACpE;CAEA,MAAM,aAAa,OAAO,GAAG,kCAAkC,CAAC,CAAC,WAAW,WAAmB;EAC7F,KAAK,OAAO,IAAI,IAAI,IAAI,EAAA,CAAG,QAAQ,OAAO,OAAO,MAAM,WAAW,aAAa;CACjF,CAAC;CAED,MAAM,UAAqD,OAAO,GAChE,+BACF,CAAC,CAAC,WAAW,YAAY;EACvB,MAAM,YAAY;EAClB,OAAO,WAAW,SAAS;EAC3B,MAAM,UAAU,OAAO,eAAe,uBAAuB,MAAM,YAAY,SAAS;EACxF,MAAM,SAAS,aAAa,QAAQ,MAAM;EAC1C,MAAM,cAAc,oBAAoB,MAAM;EAC9C,MAAM,SAAS,OAAO,OAAO,QAAQ,OAAO,IAAI,WAAW,CAAC;EAC5D,IAAI,OAAO,OAAO,OAAO,OAAO,IAAI,IAAI,OAAO,OAAO,MAAM,WAAW,eAAe;EACtF,IAAI,CAAC,YAAY,QAAQ,SAAS,OAAO,GAAG,OAAO,OAAO,MAAM,WAAW,cAAc;EACzF,OAAO,eAAe,QAAQ,SAAS,SAAS;EAChD,MAAM,YAAY,OAAO,MAAM;EAC/B,MAAM,UAAU,OAAO,IAAI,OACzB,OACC,YAAgE;GAC/D,IAAI,QAAQ,QAAQ,OAAO,CAAC,MAAM,WAAW,aAAa,GAAG,OAAO;GACpE,MAAM,KAAK,UAAU,OAAO,GAAG;GAC/B,MAAM,WAAW,QAAQ,QAAQ,IAAI,EAAE;GACvC,IACE,aAAa,KAAA,MACZ,SAAS,SAAS,eAAe,eAAe,QAAQ,QAAQ,IAEjE,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GAE7C,IAAI,aAAa,KAAA,KAAa,QAAQ,QAAQ,QAAQ,SAAS,YAC7D,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GAE7C,MAAM,kBAAkB,QAAQ,eAAe,UAAU,eAAe,KAAK;GAC7E,IAAI,kBAAkB,gBAAgB,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GACjF,IAAI,QAAQ,OAAO;GACnB,KAAK,MAAM,CAAC,SAAS,UAAU,QAAQ,SACrC,IAAI,YAAY,MAAM,MAAM,SAAS,WAAW,SAAS,MAAM,OAAO;GAExE,IAAI,QAAQ,SAAS,WAAW,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GAC3E,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,IAAI;IAAE,MAAM;IAAW;IAAQ;IAAa;IAAQ;GAAU,CAAC;GAC3E,OAAO,CAAC,KAAA,GAAW;IAAE,GAAG;IAAS;IAAS,aAAa;GAAgB,CAAC;EAC1E,CACF;EACA,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO;CAC3C,CAAC;CAED,MAAM,WAAuD,OAAO,GAClE,gCACF,CAAC,CAAC,WAAW,WAAW;EACtB,MAAM,YAAY;EAClB,OAAO,WAAW,SAAS;EAC3B,MAAM,SAAS,aACb,OAAO,eAAe,kBAAkB,MAAM,WAAW,SAAS,CACpE;EACA,MAAM,cAAc,oBAAoB,MAAM;EAC9C,IAAI,OAAO,OAAO,OAAO,OAAO,IAAI,IAAI,OAAO,OAAO,MAAM,WAAW,eAAe;EACtF,MAAM,UAAU,OAAO,IAAI,OACzB,OACC,YAAgE;GAC/D,IAAI,QAAQ,QAAQ,OAAO,CAAC,MAAM,WAAW,aAAa,GAAG,OAAO;GACpE,MAAM,KAAK,UAAU,OAAO,GAAG;GAC/B,MAAM,WAAW,QAAQ,QAAQ,IAAI,EAAE;GACvC,IAAI,aAAa,KAAA,GAAW;IAC1B,IAAI,SAAS,SAAS,aACpB,OAAO,CACL,WAAW,QAAQ,SAAS,MAAM,IAAI,KAAA,IAAY,MAAM,WAAW,QAAQ,GAC3E,OACF;IAEF,IAAI,eAAe,QAAQ,QAAQ,GAAG,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GACnF,OAAO,IAAI,QAAQ,QAAQ,QAAQ,SAAS,YAC1C,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GAE7C,MAAM,kBAAkB,QAAQ,eAAe,UAAU,eAAe,KAAK;GAC7E,IAAI,kBAAkB,gBAAgB,OAAO,CAAC,MAAM,WAAW,QAAQ,GAAG,OAAO;GACjF,MAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;GACvC,QAAQ,IAAI,IAAI;IAAE,MAAM;IAAa;IAAQ;GAAY,CAAC;GAC1D,OAAO,CAAC,KAAA,GAAW;IAAE,GAAG;IAAS;IAAS,aAAa;GAAgB,CAAC;EAC1E,CACF;EACA,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO;CAC3C,CAAC;CAED,MAAM,SAAS,OAAO,GAAG,8BAA8B,CAAC,CAAC,WAAW,UAA4B;EAC9F,MAAM,YAAY;EAClB,OAAO,WAAW,SAAS;EAC3B,MAAM,QAAQ,OAAO,eAAe,iBAAiB,MAAM,UAAU,SAAS;EAC9E,MAAM,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;EAC9C,IAAI,CAAC,YAAY,QAAQ,OAAO,GAAG,OAAO,OAAO,MAAM,WAAW,eAAe;EACjF,MAAM,UAAU,OAAO,IAAI,IAAI,IAAI;EACnC,IAAI,QAAQ,QAAQ,OAAO,OAAO,MAAM,WAAW,aAAa;EAChE,IAAI,gBAAgB;EACpB,IAAI,mBAAmB;EACvB,MAAM,aAA0C,CAAC;EACjD,KAAK,MAAM,SAAS,QAAQ,QAAQ,OAAO,GAAG;GAC5C,oBAAoB;GACpB,IAAI,mBAAmB,QAAQ,GAAG,OAAO,OAAO;GAChD,IACE,MAAM,OAAO,IAAI,UAAU,YAAY,MAAM,UAAU,WACvD,MAAM,SAAS,WAEf;GACF,iBAAiB,MAAM,OAAO;GAC9B,IAAI,gBAAgB,MAAM,kBAAkB,OAAO,OAAO,MAAM,WAAW,QAAQ;EACrF;EACA,KAAK,MAAM,SAAS,QAAQ,QAAQ,OAAO,GAAG;GAC5C,IACE,MAAM,OAAO,IAAI,UAAU,YAAY,MAAM,UAAU,WACvD,MAAM,SAAS,WAEf;GACF,OAAO,OAAO;GACd,KAAK,MAAM,SAAS,MAAM,QAAQ;IAChC,MAAM,QAAQ,OAAO,QAAQ,MAAM,MAAM;IACzC,IAAI,QAAQ,MAAM,UAAU;IAC5B,WAAW,KACT,qBAAqB,KAAK;KACxB,GAAG,MAAM;KACT,WAAW,MAAM;KACjB,SAAS,MAAM;KACf,WAAW,MAAM;KACjB,SAAS,MAAM;KACf,MAAM,MAAM;KACZ;KACA,WAAW,MAAM;IACnB,CAAC,CACH;GACF;EACF;EACA,WAAW,MACR,MAAM,UACL,MAAM,QAAQ,KAAK,SACnB,YAAY,KAAK,IAAI,IAAI,MAAM,IAAI,EAAE,KACrC,YAAY,KAAK,OAAO,UAAU,MAAM,OAAO,QAAQ,KACvD,KAAK,UAAU,MAAM,OACzB;EACA,OAAO,WAAW,SAAS;EAC3B,OAAO,kBAAkB,KAAK;GAAE,YAAY,WAAW,MAAM,GAAG,MAAM,KAAK;GAAG;EAAc,CAAC;CAC/F,CAAC;CAED,OAAO,oBAAoB,YAAY;EAAE;EAAS;EAAS;EAAU;CAAO,CAAC;AAC/E,CAAC;;AAGD,MAAa,8BACX,SACA,aAEA,MAAM,OAAO,qBAAqB,UAAU,SAAS,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["validate","error","sameSource","validate"],"sources":["../src/memory-ledger.ts","../src/memory-schedule-store.ts","../src/memory-subscription-store.ts","../src/memory-storage.ts","../src/semantic-memory-index.ts"],"sourcesContent":["import {\n type ToolCallId,\n AttemptId,\n ReceiptId,\n SubmissionId,\n type AgentId,\n type ThreadId,\n type SettlementId,\n} from \"@effect-agent/core\";\nimport {\n type ParentLinkage,\n AbortCommand,\n AdmissionAdmitted,\n AdmissionConflict,\n AdmissionIndeterminate,\n AdmissionNotAdmitted,\n AdmissionRequest,\n AdmissionResult,\n ApprovalConflict,\n ApprovalDecisionCommand,\n ApprovalDecisionIntent,\n AttachChildToReservationRequest,\n BeginChildBudgetReleaseRequest,\n ChildAttachmentSnapshot,\n ChildBudgetReservationRequest,\n ChildBudgetReservationSnapshot,\n ChildReservationConflict,\n ChildSettledNotification,\n Claim,\n ClaimJoiningRequest,\n ClaimRequest,\n DEFAULT_OWNERSHIP_LEASE_DURATION,\n InputAppliedMarker,\n JoinSnapshot,\n JoinedToHost,\n JoiningClaim,\n LedgerCapabilities,\n LedgerError,\n MarkInputAppliedRequest,\n MarkJoinedRequest,\n MarkReadyRequest,\n MarkUnknownRequest,\n OwnershipLost,\n OwnershipRenewal,\n OwnershipSnapshot,\n OwnershipToken,\n PersistedJson,\n ProducerEpoch,\n QueueSequence,\n RecoverySnapshot,\n RecoverySnapshotRequest,\n ReleaseChildBudgetRequest,\n ReleaseOwnershipRequest,\n RenewOwnershipRequest,\n ReservedChildBudget,\n ReservedSettlement,\n RevertJoiningRequest,\n Settlement,\n SettlementConflict,\n SettlementFinalization,\n SettlementReservation,\n SettlementReservationSnapshot,\n settlementFailureFromRecord,\n AbortIntent,\n SubmissionLedger,\n SubmissionLookup,\n SubmissionLookupByKey,\n SubmissionSnapshot,\n SuspendRequest,\n SuspensionSnapshot,\n UnknownResolution,\n UnknownResolutionCommand,\n UnknownResolutionConflict,\n UnknownResolutionIntent,\n type ChildReservationId,\n type ChildReservationStatus,\n type ChildSettledOutcome,\n type DefinitionDigests,\n type DeploymentId,\n type Digest,\n type IdempotencyKey,\n type Principal,\n type ProducerId,\n type RecordEnvelope,\n type SettlementOutcome,\n type SubmissionState,\n type SuspensionOutcome,\n type SuspensionReason,\n} from \"@effect-agent/thread\";\nimport { Clock, DateTime, Duration, Effect, Layer, Option, Ref, Schema, Stream } from \"effect\";\n\nconst MAX_SUBMISSIONS = 65_536;\n\n/**\n * Lifecycle ordering used to advance-but-never-regress the operational state marker: a reclaimed\n * Attempt must not erase progress markers (input-applied, terminalizing) that an earlier Attempt\n * already committed.\n */\nconst STATE_RANK: Record<SubmissionState, number> = {\n admitted: 0,\n ready: 1,\n joining: 2,\n joined: 3,\n running: 4,\n \"input-applied\": 5,\n suspended: 6,\n unknown: 7,\n terminalizing: 8,\n settled: 9,\n};\n\ninterface SubmissionRow {\n readonly submissionId: SubmissionId;\n readonly threadId: ThreadId;\n readonly queueSequence: QueueSequence;\n readonly principal: Principal;\n readonly idempotencyKey: IdempotencyKey;\n readonly agentId: AgentId;\n readonly agentDigests: DefinitionDigests;\n readonly deploymentId: DeploymentId;\n readonly inputPayload: PersistedJson;\n readonly inputDigest: Digest;\n readonly receiptId: ReceiptId;\n readonly state: SubmissionState;\n readonly settledOutcome: SettlementOutcome | undefined;\n readonly createdAtMillis: number;\n readonly readyAtMillis: number | undefined;\n /** Immutable child-side lineage recorded at admission (spec §12 step 5). */\n readonly parentLinkage: ParentLinkage | undefined;\n}\n\ninterface StoredOwnership {\n readonly attemptId: AttemptId;\n readonly ownershipToken: OwnershipToken;\n readonly producerEpoch: ProducerEpoch;\n readonly ownerProducerId: ProducerId;\n readonly leaseExpiresAtMillis: number;\n}\n\ninterface StoredReservation {\n readonly settlementId: SettlementId;\n readonly outcome: SettlementOutcome;\n readonly record: RecordEnvelope;\n readonly recordDigest: Digest;\n readonly finalizedAtMillis: number | undefined;\n}\n\ninterface StoredSuspension {\n readonly reason: SuspensionReason;\n readonly suspendedAtMillis: number;\n}\n\ninterface StoredUnknownMark {\n readonly reason: MarkUnknownRequest[\"reason\"];\n readonly toolCallIds: ReadonlyArray<ToolCallId>;\n}\n\ninterface StoredUnknownResolution {\n readonly intent: UnknownResolutionIntent;\n}\n\ninterface StoredSubmission {\n readonly row: SubmissionRow;\n readonly ownership: StoredOwnership | undefined;\n readonly inputApplied: InputAppliedMarker | undefined;\n readonly reservation: StoredReservation | undefined;\n readonly abortIntent: AbortIntent | undefined;\n /** Host linkage recorded at `claimJoining` time; cleared by `revertJoining` (DUR-016). */\n readonly joinedHostSubmissionId: SubmissionId | undefined;\n readonly suspension: StoredSuspension | undefined;\n readonly unknownMark: StoredUnknownMark | undefined;\n readonly approvalDecisions: ReadonlyMap<ToolCallId, ApprovalDecisionIntent>;\n readonly unknownResolutions: ReadonlyMap<ToolCallId, StoredUnknownResolution>;\n}\n\n/**\n * States in which `claim` never grants the head: the lane is host-owned (`joining`/`joined`)\n * or durably suspended rather than worker-claimable. Unknown heads are checked against abort\n * intent separately: abort authorizes cleanup and settlement, never ordinary Tool replay.\n */\nconst BLOCKED_HEAD_STATES: ReadonlySet<SubmissionState> = new Set([\n \"joining\",\n \"joined\",\n \"suspended\",\n]);\n\ninterface LaneState {\n readonly nextQueueSequence: number;\n readonly producerEpoch: number;\n}\n\n/** One parent-owned child budget reservation row (spec §12 steps 2 and 6). */\ninterface StoredChildReservation {\n readonly reservationId: ChildReservationId;\n readonly parentSubmissionId: SubmissionId;\n readonly parentToolCallId: ToolCallId;\n readonly childSubmissionId: SubmissionId | undefined;\n readonly status: ChildReservationStatus;\n readonly allocation: PersistedJson;\n readonly allocationDigest: Digest;\n readonly accounting: PersistedJson | undefined;\n readonly reservedAtMillis: number;\n readonly releaseBeganAtMillis: number | undefined;\n readonly releasedAtMillis: number | undefined;\n}\n\ninterface LedgerState {\n readonly submissions: ReadonlyMap<SubmissionId, StoredSubmission>;\n readonly admissionIndex: ReadonlyMap<string, SubmissionId>;\n readonly lanes: ReadonlyMap<ThreadId, LaneState>;\n readonly childReservations: ReadonlyMap<ChildReservationId, StoredChildReservation>;\n readonly mintCounter: number;\n}\n\ntype Decision<A, E> =\n | { readonly _tag: \"failure\"; readonly error: E }\n | { readonly _tag: \"success\"; readonly value: A };\n\nconst failure = <E>(error: E): Decision<never, E> => ({ _tag: \"failure\", error });\nconst success = <A>(value: A): Decision<A, never> => ({ _tag: \"success\", value });\n\nconst ledgerError = (operation: string, message: string, cause?: unknown): LedgerError =>\n cause === undefined\n ? LedgerError.make({ operation, message })\n : LedgerError.make({ operation, message, cause });\n\nconst validate = Effect.fn(\"MemorySubmissionLedger.validate\")(\n <A, I>(\n schema: Schema.Codec<A, I>,\n operation: string,\n value: unknown,\n ): Effect.Effect<A, LedgerError> =>\n Schema.encodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError((error) => ledgerError(operation, `Invalid ${operation} request`, error)),\n ),\n);\n\nconst decodeSubmissionId = Schema.decodeSync(SubmissionId);\nconst decodeReceiptId = Schema.decodeSync(ReceiptId);\nconst decodeAttemptId = Schema.decodeSync(AttemptId);\nconst decodeOwnershipToken = Schema.decodeSync(OwnershipToken);\nconst decodeQueueSequence = Schema.decodeSync(QueueSequence);\nconst decodeProducerEpoch = Schema.decodeSync(ProducerEpoch);\nconst equivalentPersistedJson = Schema.toEquivalence(PersistedJson);\nconst equivalentUnknownResolution = Schema.toEquivalence(UnknownResolution);\n\nconst utc = (millis: number): DateTime.Utc => DateTime.toUtc(DateTime.makeUnsafe(millis));\n\nconst admissionKey = (\n threadId: ThreadId,\n principal: Principal,\n idempotencyKey: IdempotencyKey,\n): string => `${threadId}\\u001f${principal}\\u001f${idempotencyKey}`;\n\nconst toSnapshot = (row: SubmissionRow): SubmissionSnapshot =>\n SubmissionSnapshot.make({\n submissionId: row.submissionId,\n threadId: row.threadId,\n queueSequence: row.queueSequence,\n principal: row.principal,\n idempotencyKey: row.idempotencyKey,\n agentId: row.agentId,\n agentDigests: row.agentDigests,\n deploymentId: row.deploymentId,\n inputPayload: row.inputPayload,\n inputDigest: row.inputDigest,\n receiptId: row.receiptId,\n state: row.state,\n createdAt: utc(row.createdAtMillis),\n ...(row.settledOutcome === undefined ? {} : { settledOutcome: row.settledOutcome }),\n ...(row.readyAtMillis === undefined ? {} : { readyAt: utc(row.readyAtMillis) }),\n ...(row.parentLinkage === undefined ? {} : { parentLinkage: row.parentLinkage }),\n });\n\nconst toReservationSnapshot = (row: StoredChildReservation): ChildBudgetReservationSnapshot =>\n ChildBudgetReservationSnapshot.make({\n reservationId: row.reservationId,\n parentSubmissionId: row.parentSubmissionId,\n parentToolCallId: row.parentToolCallId,\n status: row.status,\n allocation: row.allocation,\n allocationDigest: row.allocationDigest,\n reservedAt: utc(row.reservedAtMillis),\n ...(row.childSubmissionId === undefined ? {} : { childSubmissionId: row.childSubmissionId }),\n ...(row.accounting === undefined ? {} : { accounting: row.accounting }),\n ...(row.releaseBeganAtMillis === undefined\n ? {}\n : { releaseBeganAt: utc(row.releaseBeganAtMillis) }),\n ...(row.releasedAtMillis === undefined ? {} : { releasedAt: utc(row.releasedAtMillis) }),\n });\n\n/** Linkage equality: both absent, or both present naming the same parent Tool Call. */\nconst sameParentLinkage = (\n left: ParentLinkage | undefined,\n right: ParentLinkage | undefined,\n): boolean =>\n left === undefined\n ? right === undefined\n : right !== undefined &&\n left.parentSubmissionId === right.parentSubmissionId &&\n left.parentToolCallId === right.parentToolCallId;\n\nconst laneEpoch = (state: LedgerState, threadId: ThreadId): number =>\n state.lanes.get(threadId)?.producerEpoch ?? 0;\n\nconst ownershipLost = (state: LedgerState, stored: StoredSubmission): OwnershipLost =>\n OwnershipLost.make({\n submissionId: stored.row.submissionId,\n actualEpoch: decodeProducerEpoch(laneEpoch(state, stored.row.threadId)),\n });\n\n/** The presented token owns the lane only while it matches the live ownership record. */\nconst ownsLane = (stored: StoredSubmission, ownershipToken: OwnershipToken): boolean =>\n stored.ownership !== undefined && stored.ownership.ownershipToken === ownershipToken;\n\nconst withSubmission = (state: LedgerState, stored: StoredSubmission): LedgerState => ({\n ...state,\n submissions: new Map(state.submissions).set(stored.row.submissionId, stored),\n});\n\nconst withChildReservation = (\n state: LedgerState,\n reservation: StoredChildReservation,\n): LedgerState => ({\n ...state,\n childReservations: new Map(state.childReservations).set(reservation.reservationId, reservation),\n});\n\nconst findHead = (state: LedgerState, threadId: ThreadId): StoredSubmission | undefined => {\n let head: StoredSubmission | undefined;\n\n for (const stored of state.submissions.values()) {\n if (stored.row.threadId !== threadId || stored.row.state === \"settled\") continue;\n if (head === undefined || stored.row.queueSequence < head.row.queueSequence) head = stored;\n }\n\n return head;\n};\n\n/**\n * Reference in-memory SubmissionLedger. It implements the full port contract — atomic idempotent\n * admission, FIFO-head claims, producer-epoch fencing, Clock-driven ownership leases, idempotent\n * settlement reservation/finalization, and durable abort intent — with every transition applied\n * as one atomic `Ref.modify`, but its state does not survive the process (`non-durable`).\n *\n * Adapter-specific semantics within the port's latitude:\n *\n * - Time comes exclusively from the Effect `Clock` service, so `TestClock` drives lease expiry\n * deterministically; no wall clock is consulted.\n * - The ownership lease is pinned to `DEFAULT_OWNERSHIP_LEASE_DURATION` (D5); durable adapters\n * own the configuration seam.\n * - A live lease blocks claims from other producers only: the same `producerId` may reclaim its\n * own live lease (restart recovery), which supersedes and fences the prior Attempt's token.\n * - Claiming advances `ready` to `running` and otherwise preserves the recorded state, so\n * progress markers from an earlier Attempt survive a reclaim.\n * - `renewOwnership` keeps the token stable (the port allows rotation); a replayed admission\n * reports the Submission's current state alongside the original identities.\n * - `claimJoining` walks the strictly-later queue: rows already `joining`/`joined` to the\n * SAME host extend the claimed prefix and are skipped, and an aborted-settled row is a\n * closed obligation that is also skipped (P7 §7(c)); any other non-`ready` row (an\n * `admitted` gap, a non-aborted settled row, foreign-host linkage) breaks the prefix\n * conservatively.\n * - `markJoined` verifies the token against the HOST's live ownership (the lane is\n * host-owned), so a later host Attempt can repair a lost marker from history (DUR-016). The\n * join marker reuses the input-applied marker: the joined input IS `input:{sid}`.\n * - `suspend` and `markUnknown` refuse when an exact settlement is already reserved\n * (`SettlementConflict` with the reserved outcome) — DUR-011's reservation wins.\n * - `resolveAdmission` derives its answer from the single strongly consistent store, so it\n * never answers `Indeterminate` on its own; the test-only `resolveAdmissionFault` option\n * injects the `Indeterminate` classification so SUB-031 callers can be conformance-tested.\n * - `recordChildSettled` and `suspend(WaitingForChild)` observe child settlement directly from\n * the child rows (single-store latitude); no separate notification marker is stored.\n */\nconst makeSubmissionLedger = (options: MemorySubmissionLedgerOptions = {}) =>\n Effect.gen(function* () {\n const state = yield* Ref.make<LedgerState>({\n submissions: new Map(),\n admissionIndex: new Map(),\n lanes: new Map(),\n childReservations: new Map(),\n mintCounter: 0,\n });\n\n const leaseMillis = Duration.toMillis(DEFAULT_OWNERSHIP_LEASE_DURATION);\n\n const capabilities = Effect.succeed(LedgerCapabilities.make({ durability: \"non-durable\" }));\n\n const admit: SubmissionLedger[\"Service\"][\"admit\"] = Effect.fn(\"MemorySubmissionLedger.admit\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(AdmissionRequest, \"admit\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<AdmissionResult, AdmissionConflict | LedgerError>,\n LedgerState,\n ] => {\n const key = admissionKey(request.threadId, request.principal, request.idempotencyKey);\n const existingId = current.admissionIndex.get(key);\n\n if (existingId !== undefined) {\n const existing = current.submissions.get(existingId);\n\n if (existing === undefined) {\n return [\n failure(\n ledgerError(\"admit\", \"Admission index references a missing Submission\"),\n ),\n current,\n ];\n }\n // A replay must repeat the exact canonical input AND the exact parent linkage\n // (or its absence): linkage is immutable lineage (spec §12 step 5, SUB-016).\n if (\n existing.row.inputDigest !== request.inputDigest ||\n !sameParentLinkage(existing.row.parentLinkage, request.parentLinkage)\n ) {\n return [\n failure(\n AdmissionConflict.make({\n threadId: request.threadId,\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n existingInputDigest: existing.row.inputDigest,\n attemptedInputDigest: request.inputDigest,\n }),\n ),\n current,\n ];\n }\n\n return [\n success(\n AdmissionResult.make({\n submissionId: existing.row.submissionId,\n receiptId: existing.row.receiptId,\n queueSequence: existing.row.queueSequence,\n state: existing.row.state,\n replayed: true,\n }),\n ),\n current,\n ];\n }\n if (current.submissions.size >= MAX_SUBMISSIONS) {\n return [\n failure(\n ledgerError(\"admit\", `In-memory submission limit ${MAX_SUBMISSIONS} exceeded`),\n ),\n current,\n ];\n }\n\n const lane = current.lanes.get(request.threadId) ?? {\n nextQueueSequence: 1,\n producerEpoch: 0,\n };\n\n const mintCounter = current.mintCounter + 1;\n\n const row: SubmissionRow = {\n submissionId: decodeSubmissionId(`submission-memory-${mintCounter}`),\n threadId: request.threadId,\n queueSequence: decodeQueueSequence(lane.nextQueueSequence),\n principal: request.principal,\n idempotencyKey: request.idempotencyKey,\n agentId: request.agentId,\n agentDigests: request.agentDigests,\n deploymentId: request.deploymentId,\n inputPayload: request.inputPayload,\n inputDigest: request.inputDigest,\n receiptId: decodeReceiptId(`receipt-memory-${mintCounter}`),\n state: \"admitted\",\n settledOutcome: undefined,\n createdAtMillis: nowMillis,\n readyAtMillis: undefined,\n parentLinkage: request.parentLinkage,\n };\n\n const submissions = new Map(current.submissions).set(row.submissionId, {\n row,\n ownership: undefined,\n inputApplied: undefined,\n reservation: undefined,\n abortIntent: undefined,\n joinedHostSubmissionId: undefined,\n suspension: undefined,\n unknownMark: undefined,\n approvalDecisions: new Map<ToolCallId, ApprovalDecisionIntent>(),\n unknownResolutions: new Map<ToolCallId, StoredUnknownResolution>(),\n });\n\n const admissionIndex = new Map(current.admissionIndex).set(key, row.submissionId);\n\n const lanes = new Map(current.lanes).set(request.threadId, {\n nextQueueSequence: lane.nextQueueSequence + 1,\n producerEpoch: lane.producerEpoch,\n });\n\n return [\n success(\n AdmissionResult.make({\n submissionId: row.submissionId,\n receiptId: row.receiptId,\n queueSequence: row.queueSequence,\n state: row.state,\n replayed: false,\n }),\n ),\n { ...current, submissions, admissionIndex, lanes, mintCounter },\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const markReady: SubmissionLedger[\"Service\"][\"markReady\"] = Effect.fn(\n \"MemorySubmissionLedger.markReady\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkReadyRequest, \"markReady\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(ledgerError(\"markReady\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.row.state !== \"admitted\") return [success(undefined), current];\n\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"ready\", readyAtMillis: nowMillis },\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const lookup: SubmissionLedger[\"Service\"][\"lookup\"] = Effect.fn(\n \"MemorySubmissionLedger.lookup\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SubmissionLookup, \"lookup\", unvalidated);\n const current = yield* Ref.get(state);\n\n const submissionId =\n request._tag === \"SubmissionLookupById\"\n ? request.submissionId\n : current.admissionIndex.get(\n admissionKey(request.threadId, request.principal, request.idempotencyKey),\n );\n\n const stored =\n submissionId === undefined ? undefined : current.submissions.get(submissionId);\n\n return stored === undefined ? Option.none() : Option.some(toSnapshot(stored.row));\n }),\n );\n\n const resolveAdmission: SubmissionLedger[\"Service\"][\"resolveAdmission\"] = Effect.fn(\n \"MemorySubmissionLedger.resolveAdmission\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SubmissionLookupByKey, \"resolveAdmission\", unvalidated);\n\n // Test-only fault seam: lets suites exercise the Indeterminate classification that a\n // single strongly consistent store never produces on its own (SUB-031, P6 honesty).\n if (options.resolveAdmissionFault !== undefined) {\n const fault = yield* options.resolveAdmissionFault;\n\n if (Option.isSome(fault)) {\n return AdmissionIndeterminate.make({ reason: fault.value });\n }\n }\n const current = yield* Ref.get(state);\n\n const submissionId = current.admissionIndex.get(\n admissionKey(request.threadId, request.principal, request.idempotencyKey),\n );\n\n const stored =\n submissionId === undefined ? undefined : current.submissions.get(submissionId);\n\n return stored === undefined\n ? AdmissionNotAdmitted.make()\n : AdmissionAdmitted.make({ submission: toSnapshot(stored.row) });\n }),\n );\n\n const claim: SubmissionLedger[\"Service\"][\"claim\"] = Effect.fn(\"MemorySubmissionLedger.claim\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ClaimRequest, \"claim\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<Option.Option<Claim>, LedgerError>, LedgerState] => {\n const head = findHead(current, request.threadId);\n\n if (head === undefined) return [success(Option.none()), current];\n if (\n BLOCKED_HEAD_STATES.has(head.row.state) ||\n (head.row.state === \"unknown\" && head.abortIntent === undefined)\n )\n return [success(Option.none()), current];\n if (\n head.ownership !== undefined &&\n head.ownership.leaseExpiresAtMillis > nowMillis &&\n head.ownership.ownerProducerId !== request.producerId\n ) {\n return [success(Option.none()), current];\n }\n const lane = current.lanes.get(request.threadId);\n\n if (lane === undefined) {\n return [\n failure(ledgerError(\"claim\", \"Claimable head without a Thread lane\")),\n current,\n ];\n }\n const producerEpoch = decodeProducerEpoch(lane.producerEpoch + 1);\n const mintCounter = current.mintCounter + 1;\n\n const ownership: StoredOwnership = {\n attemptId: decodeAttemptId(`attempt-memory-${mintCounter}`),\n ownershipToken: decodeOwnershipToken(`ownership-memory-${mintCounter}`),\n producerEpoch,\n ownerProducerId: request.producerId,\n leaseExpiresAtMillis: nowMillis + leaseMillis,\n };\n\n const row: SubmissionRow =\n head.row.state === \"ready\" ? { ...head.row, state: \"running\" } : head.row;\n\n const next = withSubmission(current, { ...head, row, ownership });\n\n const lanes = new Map(next.lanes).set(request.threadId, {\n nextQueueSequence: lane.nextQueueSequence,\n producerEpoch: lane.producerEpoch + 1,\n });\n\n return [\n success(\n Option.some(\n Claim.make({\n submissionId: row.submissionId,\n attemptId: ownership.attemptId,\n ownershipToken: ownership.ownershipToken,\n producerEpoch,\n leaseExpiresAt: utc(ownership.leaseExpiresAtMillis),\n inputPayload: row.inputPayload,\n }),\n ),\n ),\n { ...next, lanes, mintCounter },\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const renewOwnership: SubmissionLedger[\"Service\"][\"renewOwnership\"] = Effect.fn(\n \"MemorySubmissionLedger.renewOwnership\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(RenewOwnershipRequest, \"renewOwnership\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [Decision<OwnershipRenewal, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"renewOwnership\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n if (stored.ownership === undefined || !ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n\n const ownership: StoredOwnership = {\n ...stored.ownership,\n leaseExpiresAtMillis: nowMillis + leaseMillis,\n };\n\n return [\n success(\n OwnershipRenewal.make({\n ownershipToken: ownership.ownershipToken,\n leaseExpiresAt: utc(ownership.leaseExpiresAtMillis),\n }),\n ),\n withSubmission(current, { ...stored, ownership }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const releaseOwnership: SubmissionLedger[\"Service\"][\"releaseOwnership\"] = Effect.fn(\n \"MemorySubmissionLedger.releaseOwnership\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ReleaseOwnershipRequest, \"releaseOwnership\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"releaseOwnership\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n if (!ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n\n return [\n success(undefined),\n withSubmission(current, { ...stored, ownership: undefined }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const markInputApplied: SubmissionLedger[\"Service\"][\"markInputApplied\"] = Effect.fn(\n \"MemorySubmissionLedger.markInputApplied\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkInputAppliedRequest, \"markInputApplied\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"markInputApplied\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n if (!ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n\n const marker = InputAppliedMarker.make({\n recordId: request.recordId,\n sequence: request.sequence,\n });\n\n const row: SubmissionRow =\n STATE_RANK[stored.row.state] < STATE_RANK[\"input-applied\"]\n ? { ...stored.row, state: \"input-applied\" }\n : stored.row;\n\n return [\n success(undefined),\n withSubmission(current, { ...stored, row, inputApplied: marker }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const reserveSettlement: SubmissionLedger[\"Service\"][\"reserveSettlement\"] = Effect.fn(\n \"MemorySubmissionLedger.reserveSettlement\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SettlementReservation, \"reserveSettlement\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ReservedSettlement, SettlementConflict | OwnershipLost | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"reserveSettlement\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n\n // A `joined` Submission settles WITH its host (plan §2.5) and its lane is never\n // worker-claimable, so no ownership token can exist for it: the recorded host\n // linkage authorizes the reservation and the presented token is not consulted.\n const joinedSettlement =\n stored.row.state === \"joined\" && stored.joinedHostSubmissionId !== undefined;\n\n // P7 §7(c): an aborted, never-claimed, still-queued Submission likewise has no\n // live ownership to fence against — its durable abort intent authorizes exactly\n // its ABORTED settlement (`terminalizing` is the same pass's crash replay). Every\n // other reservation stays fenced by the target lane's live ownership.\n const queuedAbortSettlement =\n request.outcome === \"aborted\" &&\n stored.abortIntent !== undefined &&\n stored.ownership === undefined &&\n (stored.row.state === \"ready\" || stored.row.state === \"terminalizing\");\n\n if (\n !joinedSettlement &&\n !queuedAbortSettlement &&\n !ownsLane(stored, request.ownershipToken)\n ) {\n return [failure(ownershipLost(current, stored)), current];\n }\n const existing = stored.reservation;\n\n if (existing !== undefined) {\n if (\n existing.settlementId !== request.settlementId ||\n existing.outcome !== request.outcome ||\n existing.recordDigest !== request.recordDigest\n ) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: existing.outcome,\n }),\n ),\n current,\n ];\n }\n\n return [\n success(\n ReservedSettlement.make({\n submissionId: request.submissionId,\n settlementId: existing.settlementId,\n outcome: existing.outcome,\n record: existing.record,\n recordDigest: existing.recordDigest,\n replayed: true,\n }),\n ),\n current,\n ];\n }\n\n const reservation: StoredReservation = {\n settlementId: request.settlementId,\n outcome: request.outcome,\n record: request.record,\n recordDigest: request.recordDigest,\n finalizedAtMillis: undefined,\n };\n\n const row: SubmissionRow =\n STATE_RANK[stored.row.state] < STATE_RANK.terminalizing\n ? { ...stored.row, state: \"terminalizing\" }\n : stored.row;\n\n return [\n success(\n ReservedSettlement.make({\n submissionId: request.submissionId,\n settlementId: reservation.settlementId,\n outcome: reservation.outcome,\n record: reservation.record,\n recordDigest: reservation.recordDigest,\n replayed: false,\n }),\n ),\n withSubmission(current, { ...stored, row, reservation }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const finalizeSettlement: SubmissionLedger[\"Service\"][\"finalizeSettlement\"] = Effect.fn(\n \"MemorySubmissionLedger.finalizeSettlement\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SettlementFinalization, \"finalizeSettlement\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [Decision<Settlement, SettlementConflict | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\"finalizeSettlement\", `Unknown Submission ${request.submissionId}`),\n ),\n current,\n ];\n }\n const reservation = stored.reservation;\n\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"finalizeSettlement\",\n `No settlement reservation for Submission ${request.submissionId}`,\n ),\n ),\n current,\n ];\n }\n const settlementFailure = settlementFailureFromRecord(reservation.record);\n\n if ((reservation.outcome === \"failed\") !== (settlementFailure !== undefined)) {\n return [\n failure(\n ledgerError(\n \"finalizeSettlement\",\n `Settlement reservation for Submission ${request.submissionId} has contradictory failure evidence`,\n ),\n ),\n current,\n ];\n }\n if (reservation.settlementId !== request.settlementId) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: reservation.outcome,\n }),\n ),\n current,\n ];\n }\n if (reservation.finalizedAtMillis !== undefined) {\n return [\n success(\n Settlement.make({\n submissionId: stored.row.submissionId,\n settlementId: reservation.settlementId,\n receiptId: stored.row.receiptId,\n outcome: reservation.outcome,\n ...(settlementFailure === undefined ? {} : { failure: settlementFailure }),\n settledAt: utc(reservation.finalizedAtMillis),\n }),\n ),\n current,\n ];\n }\n\n const next = withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"settled\", settledOutcome: reservation.outcome },\n ownership: undefined,\n reservation: { ...reservation, finalizedAtMillis: nowMillis },\n });\n\n return [\n success(\n Settlement.make({\n submissionId: stored.row.submissionId,\n settlementId: reservation.settlementId,\n receiptId: stored.row.receiptId,\n outcome: reservation.outcome,\n ...(settlementFailure === undefined ? {} : { failure: settlementFailure }),\n settledAt: utc(nowMillis),\n }),\n ),\n next,\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const requestAbort: SubmissionLedger[\"Service\"][\"requestAbort\"] = Effect.fn(\n \"MemorySubmissionLedger.requestAbort\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(AbortCommand, \"requestAbort\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<AbortIntent, SettlementConflict | JoinedToHost | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(ledgerError(\"requestAbort\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n // A joined Submission settles WITH its host; the abort target is the host (plan\n // §2.5). A joining Submission still records the intent: it is honored only if the\n // host has not consumed the input (revert-then-abort).\n if (stored.row.state === \"joined\") {\n if (stored.joinedHostSubmissionId === undefined) {\n return [\n failure(\n ledgerError(\n \"requestAbort\",\n `Joined Submission ${request.submissionId} is missing its host linkage`,\n ),\n ),\n current,\n ];\n }\n\n return [\n failure(\n JoinedToHost.make({\n submissionId: request.submissionId,\n hostSubmissionId: stored.joinedHostSubmissionId,\n }),\n ),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"requestAbort\",\n `Settled Submission ${request.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n if (stored.abortIntent !== undefined) return [success(stored.abortIntent), current];\n\n const intent = AbortIntent.make({\n submissionId: request.submissionId,\n author: request.author,\n reason: request.reason,\n requestedAt: utc(nowMillis),\n });\n\n return [success(intent), withSubmission(current, { ...stored, abortIntent: intent })];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const claimJoining: SubmissionLedger[\"Service\"][\"claimJoining\"] = Effect.fn(\n \"MemorySubmissionLedger.claimJoining\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ClaimJoiningRequest, \"claimJoining\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ReadonlyArray<JoiningClaim>, OwnershipLost | LedgerError>,\n LedgerState,\n ] => {\n const host = current.submissions.get(request.hostSubmissionId);\n\n if (host === undefined) {\n return [\n failure(\n ledgerError(\"claimJoining\", `Unknown Submission ${request.hostSubmissionId}`),\n ),\n current,\n ];\n }\n if (host.row.threadId !== request.threadId) {\n return [\n failure(\n ledgerError(\n \"claimJoining\",\n `Host Submission ${request.hostSubmissionId} does not belong to Thread ${request.threadId}`,\n ),\n ),\n current,\n ];\n }\n if (!ownsLane(host, request.ownershipToken)) {\n return [failure(ownershipLost(current, host)), current];\n }\n\n const later = [...current.submissions.values()]\n .filter(\n (stored) =>\n stored.row.threadId === request.threadId &&\n stored.row.queueSequence > host.row.queueSequence,\n )\n .sort((left, right) => left.row.queueSequence - right.row.queueSequence);\n\n const claims: Array<JoiningClaim> = [];\n const submissions = new Map(current.submissions);\n\n for (const stored of later) {\n if (claims.length >= request.maxCount) break;\n // Rows already claimed by THIS host extend its contiguous prefix and are skipped;\n // the coordinator re-delivers already-joined input through the coverage rule.\n if (\n (stored.row.state === \"joining\" || stored.row.state === \"joined\") &&\n stored.joinedHostSubmissionId === request.hostSubmissionId\n ) {\n continue;\n }\n // P7 §7(c): an aborted-settled row is a CLOSED obligation, not a gap — recovery\n // settles aborted never-claimed queued work immediately, and settlement order of\n // never-run work is not execution order (DUR-004 bounds execution).\n if (stored.row.state === \"settled\" && stored.row.settledOutcome === \"aborted\") {\n continue;\n }\n // Any other non-ready row — an admitted-not-ready gap in particular — breaks the\n // contiguous ready prefix (plan §2.5); later ready work stays queued (DUR-004).\n if (stored.row.state !== \"ready\") break;\n submissions.set(stored.row.submissionId, {\n ...stored,\n row: { ...stored.row, state: \"joining\" },\n joinedHostSubmissionId: request.hostSubmissionId,\n });\n claims.push(\n JoiningClaim.make({\n submissionId: stored.row.submissionId,\n queueSequence: stored.row.queueSequence,\n inputPayload: stored.row.inputPayload,\n }),\n );\n }\n\n return [success(claims), { ...current, submissions }];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const markJoined: SubmissionLedger[\"Service\"][\"markJoined\"] = Effect.fn(\n \"MemorySubmissionLedger.markJoined\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkJoinedRequest, \"markJoined\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, OwnershipLost | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(ledgerError(\"markJoined\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.joinedHostSubmissionId === undefined) {\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `Submission ${request.submissionId} was never claimed for joining`,\n ),\n ),\n current,\n ];\n }\n const host = current.submissions.get(stored.joinedHostSubmissionId);\n\n if (host === undefined) {\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `Host Submission ${stored.joinedHostSubmissionId} is missing`,\n ),\n ),\n current,\n ];\n }\n // The lane is host-owned: the presented token must own the HOST's ownership period,\n // which also lets a later host Attempt repair a lost marker from history (DUR-016).\n if (!ownsLane(host, request.ownershipToken)) {\n return [failure(ownershipLost(current, host)), current];\n }\n if (stored.inputApplied !== undefined) {\n if (\n stored.inputApplied.recordId === request.recordId &&\n stored.inputApplied.sequence === request.sequence\n ) {\n return [success(undefined), current];\n }\n\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `A different join marker is already recorded for Submission ${request.submissionId}`,\n ),\n ),\n current,\n ];\n }\n if (stored.row.state !== \"joining\" && stored.row.state !== \"joined\") {\n return [\n failure(\n ledgerError(\n \"markJoined\",\n `Cannot mark Submission ${request.submissionId} joined from state ${stored.row.state}`,\n ),\n ),\n current,\n ];\n }\n\n const marker = InputAppliedMarker.make({\n recordId: request.recordId,\n sequence: request.sequence,\n });\n\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"joined\" },\n inputApplied: marker,\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const revertJoining: SubmissionLedger[\"Service\"][\"revertJoining\"] = Effect.fn(\n \"MemorySubmissionLedger.revertJoining\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(RevertJoiningRequest, \"revertJoining\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(ledgerError(\"revertJoining\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n // Idempotent and recovery-only: only a still-`joining` Submission reverts; an\n // already-joined (or already-reverted) Submission is a no-op (DUR-016).\n if (stored.row.state !== \"joining\") return [success(undefined), current];\n\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"ready\" },\n joinedHostSubmissionId: undefined,\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const suspend: SubmissionLedger[\"Service\"][\"suspend\"] = Effect.fn(\n \"MemorySubmissionLedger.suspend\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(SuspendRequest, \"suspend\", unvalidated);\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<SuspensionOutcome, OwnershipLost | SettlementConflict | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(ledgerError(\"suspend\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"suspend\",\n `Settled Submission ${request.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n // An exact terminal outcome is already reserved (DUR-011); suspension would\n // contradict it, so the reservation wins.\n if (stored.reservation !== undefined) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.reservation.outcome,\n }),\n ),\n current,\n ];\n }\n if (!ownsLane(stored, request.ownershipToken)) {\n return [failure(ownershipLost(current, stored)), current];\n }\n\n // A covering event that raced ahead of the suspend transaction (an approval decision,\n // or a child settlement observed directly from the child's row in this single store)\n // resumes the caller immediately WITHOUT releasing the lane (plan §2.6, spec §12).\n const alreadyCovered =\n request.reason._tag === \"ApprovalPending\"\n ? request.reason.toolCallIds.every((toolCallId) =>\n stored.approvalDecisions.has(toolCallId),\n )\n : request.reason.children.every(\n (child) =>\n current.submissions.get(child.childSubmissionId)?.row.state === \"settled\",\n );\n\n if (alreadyCovered) {\n return [success(\"resume-immediately\" as const), current];\n }\n\n return [\n success(\"suspended\" as const),\n withSubmission(current, {\n ...stored,\n row: { ...stored.row, state: \"suspended\" },\n ownership: undefined,\n suspension: { reason: request.reason, suspendedAtMillis: nowMillis },\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const recordApprovalDecision: SubmissionLedger[\"Service\"][\"recordApprovalDecision\"] = Effect.fn(\n \"MemorySubmissionLedger.recordApprovalDecision\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const command = yield* validate(\n ApprovalDecisionCommand,\n \"recordApprovalDecision\",\n unvalidated,\n );\n\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ApprovalDecisionIntent, ApprovalConflict | SettlementConflict | LedgerError>,\n LedgerState,\n ] => {\n const stored = current.submissions.get(command.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\n \"recordApprovalDecision\",\n `Unknown Submission ${command.submissionId}`,\n ),\n ),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"recordApprovalDecision\",\n `Settled Submission ${command.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n\n return [\n failure(\n SettlementConflict.make({\n submissionId: command.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n const existing = stored.approvalDecisions.get(command.toolCallId);\n\n if (existing !== undefined) {\n if (existing.decision !== command.decision) {\n return [\n failure(\n ApprovalConflict.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n existingDecision: existing.decision,\n }),\n ),\n current,\n ];\n }\n\n return [success(existing), current];\n }\n\n const intent = ApprovalDecisionIntent.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n decision: command.decision,\n resolver: command.resolver,\n reason: command.reason,\n decidedAt: utc(nowMillis),\n });\n\n const approvalDecisions = new Map(stored.approvalDecisions).set(\n command.toolCallId,\n intent,\n );\n\n // Once every pending call of an ApprovalPending suspension is decided, the lane\n // wakes: suspended → input-applied (plan §2.6). A WaitingForChild suspension wakes\n // only through recordChildSettled.\n const wakes =\n stored.row.state === \"suspended\" &&\n stored.suspension !== undefined &&\n stored.suspension.reason._tag === \"ApprovalPending\" &&\n stored.suspension.reason.toolCallIds.every((toolCallId) =>\n approvalDecisions.has(toolCallId),\n );\n\n return [\n success(intent),\n withSubmission(current, {\n ...stored,\n row: wakes ? { ...stored.row, state: \"input-applied\" } : stored.row,\n suspension: wakes ? undefined : stored.suspension,\n approvalDecisions,\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const markUnknown: SubmissionLedger[\"Service\"][\"markUnknown\"] = Effect.fn(\n \"MemorySubmissionLedger.markUnknown\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(MarkUnknownRequest, \"markUnknown\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<void, SettlementConflict | LedgerError>, LedgerState] => {\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return [\n failure(ledgerError(\"markUnknown\", `Unknown Submission ${request.submissionId}`)),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"markUnknown\",\n `Settled Submission ${request.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n // A reserved exact outcome wins over a late Unknown marking (DUR-011); the recovery\n // classifier orders reservation ahead of MarkUnknown for the same reason.\n if (stored.reservation !== undefined) {\n return [\n failure(\n SettlementConflict.make({\n submissionId: request.submissionId,\n existingOutcome: stored.reservation.outcome,\n }),\n ),\n current,\n ];\n }\n // Idempotent merge: repeating is a no-op; additional open calls extend the marked\n // set while the first recorded reason is kept.\n const existing = stored.unknownMark;\n const known = new Set(existing?.toolCallIds ?? []);\n\n const merged = [\n ...(existing?.toolCallIds ?? []),\n ...request.toolCallIds.filter((toolCallId) => !known.has(toolCallId)),\n ];\n\n return [\n success(undefined),\n withSubmission(current, {\n ...stored,\n row:\n stored.row.state === \"unknown\" ? stored.row : { ...stored.row, state: \"unknown\" },\n unknownMark: { reason: existing?.reason ?? request.reason, toolCallIds: merged },\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const recordUnknownResolution: SubmissionLedger[\"Service\"][\"recordUnknownResolution\"] =\n Effect.fn(\"MemorySubmissionLedger.recordUnknownResolution\")((unvalidated) =>\n Effect.gen(function* () {\n const command = yield* validate(\n UnknownResolutionCommand,\n \"recordUnknownResolution\",\n unvalidated,\n );\n\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<\n UnknownResolutionIntent,\n UnknownResolutionConflict | SettlementConflict | LedgerError\n >,\n LedgerState,\n ] => {\n const stored = current.submissions.get(command.submissionId);\n\n if (stored === undefined) {\n return [\n failure(\n ledgerError(\n \"recordUnknownResolution\",\n `Unknown Submission ${command.submissionId}`,\n ),\n ),\n current,\n ];\n }\n if (stored.row.state === \"settled\") {\n if (stored.row.settledOutcome === undefined) {\n return [\n failure(\n ledgerError(\n \"recordUnknownResolution\",\n `Settled Submission ${command.submissionId} is missing its outcome`,\n ),\n ),\n current,\n ];\n }\n\n return [\n failure(\n SettlementConflict.make({\n submissionId: command.submissionId,\n existingOutcome: stored.row.settledOutcome,\n }),\n ),\n current,\n ];\n }\n const existing = stored.unknownResolutions.get(command.toolCallId);\n\n if (\n existing !== undefined &&\n !equivalentUnknownResolution(existing.intent.resolution, command.resolution)\n ) {\n return [\n failure(\n UnknownResolutionConflict.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n }),\n ),\n current,\n ];\n }\n\n const intent =\n existing?.intent ??\n UnknownResolutionIntent.make({\n submissionId: command.submissionId,\n toolCallId: command.toolCallId,\n author: command.author,\n reason: command.reason,\n resolution: command.resolution,\n resolvedAt: utc(nowMillis),\n });\n\n const unknownResolutions =\n existing !== undefined\n ? stored.unknownResolutions\n : new Map(stored.unknownResolutions).set(command.toolCallId, {\n intent,\n });\n\n // The lane reopens only when EVERY marked open call has a durable resolution\n // intent: unknown → input-applied (DUR-017). Replays re-run the coverage check so\n // a recovering caller can wake the lane idempotently.\n const wakes =\n stored.row.state === \"unknown\" &&\n stored.unknownMark !== undefined &&\n stored.unknownMark.toolCallIds.every((toolCallId) =>\n unknownResolutions.has(toolCallId),\n );\n\n return [\n success(intent),\n withSubmission(current, {\n ...stored,\n row: wakes ? { ...stored.row, state: \"input-applied\" } : stored.row,\n unknownMark: wakes ? undefined : stored.unknownMark,\n unknownResolutions,\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const recordChildSettled: SubmissionLedger[\"Service\"][\"recordChildSettled\"] = Effect.fn(\n \"MemorySubmissionLedger.recordChildSettled\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n ChildSettledNotification,\n \"recordChildSettled\",\n unvalidated,\n );\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [Decision<ChildSettledOutcome, LedgerError>, LedgerState] => {\n const parent = current.submissions.get(request.parentSubmissionId);\n\n if (parent === undefined) {\n return [\n failure(\n ledgerError(\n \"recordChildSettled\",\n `Unknown Submission ${request.parentSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n // The caller may notify after the canonical Settlement append but before ledger\n // finalization. In a single store, an exact reservation plus `terminalizing` is the\n // narrow durable prefix that makes that ordering admissible; earlier states remain\n // a caller error.\n const child = current.submissions.get(request.childSubmissionId);\n\n const announced =\n child !== undefined &&\n (child.row.state === \"settled\" ||\n (child.row.state === \"terminalizing\" && child.reservation !== undefined));\n\n if (!announced) {\n return [\n failure(\n ledgerError(\n \"recordChildSettled\",\n `Child Submission ${request.childSubmissionId} has no recorded settlement`,\n ),\n ),\n current,\n ];\n }\n if (\n parent.row.state !== \"suspended\" ||\n parent.suspension === undefined ||\n parent.suspension.reason._tag !== \"WaitingForChild\"\n ) {\n return [success(\"not-waiting\" as const), current];\n }\n const children = parent.suspension.reason.children;\n\n if (!children.some((entry) => entry.childSubmissionId === request.childSubmissionId)) {\n return [success(\"not-waiting\" as const), current];\n }\n\n // Every listed child must be either finalized or canonically announced from the\n // exact terminalizing reservation. Replays re-run this coverage check idempotently.\n const allSettled = children.every((entry) => {\n const listed = current.submissions.get(entry.childSubmissionId);\n\n return (\n listed?.row.state === \"settled\" ||\n (listed?.row.state === \"terminalizing\" && listed.reservation !== undefined)\n );\n });\n\n if (!allSettled) return [success(\"still-waiting\" as const), current];\n\n return [\n success(\"woken\" as const),\n withSubmission(current, {\n ...parent,\n row: { ...parent.row, state: \"input-applied\" },\n suspension: undefined,\n }),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const reserveChildBudget: SubmissionLedger[\"Service\"][\"reserveChildBudget\"] = Effect.fn(\n \"MemorySubmissionLedger.reserveChildBudget\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n ChildBudgetReservationRequest,\n \"reserveChildBudget\",\n unvalidated,\n );\n\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ReservedChildBudget, ChildReservationConflict | OwnershipLost | LedgerError>,\n LedgerState,\n ] => {\n const existing = current.childReservations.get(request.reservationId);\n\n if (existing !== undefined) {\n // Identical replays short-circuit before the fence, mirroring reserveSettlement:\n // a replay creates nothing, so a recovering caller resumes rather than duplicates.\n const identical =\n existing.parentSubmissionId === request.parentSubmissionId &&\n existing.parentToolCallId === request.parentToolCallId &&\n existing.allocationDigest === request.allocationDigest &&\n equivalentPersistedJson(existing.allocation, request.allocation);\n\n if (!identical) {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: existing.status,\n message:\n \"A reservation with this identity exists with a different parent Tool Call or allocation.\",\n }),\n ),\n current,\n ];\n }\n\n return [\n success(\n ReservedChildBudget.make({\n reservation: toReservationSnapshot(existing),\n replayed: true,\n }),\n ),\n current,\n ];\n }\n for (const reservation of current.childReservations.values()) {\n if (\n reservation.parentSubmissionId === request.parentSubmissionId &&\n reservation.parentToolCallId === request.parentToolCallId\n ) {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message: `Parent Tool Call ${request.parentToolCallId} already owns reservation ${reservation.reservationId}.`,\n }),\n ),\n current,\n ];\n }\n }\n const parent = current.submissions.get(request.parentSubmissionId);\n\n if (parent === undefined) {\n return [\n failure(\n ledgerError(\n \"reserveChildBudget\",\n `Unknown Submission ${request.parentSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n // Creation is fenced by the parent lane's live ownership (spec §12 step 2): a stale\n // parent Attempt can never create new reservation state.\n if (!ownsLane(parent, request.ownershipToken)) {\n return [failure(ownershipLost(current, parent)), current];\n }\n\n const reservation: StoredChildReservation = {\n reservationId: request.reservationId,\n parentSubmissionId: request.parentSubmissionId,\n parentToolCallId: request.parentToolCallId,\n childSubmissionId: undefined,\n status: \"reserved\",\n allocation: request.allocation,\n allocationDigest: request.allocationDigest,\n accounting: undefined,\n reservedAtMillis: nowMillis,\n releaseBeganAtMillis: undefined,\n releasedAtMillis: undefined,\n };\n\n return [\n success(\n ReservedChildBudget.make({\n reservation: toReservationSnapshot(reservation),\n replayed: false,\n }),\n ),\n withChildReservation(current, reservation),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const attachChildToReservation: SubmissionLedger[\"Service\"][\"attachChildToReservation\"] =\n Effect.fn(\"MemorySubmissionLedger.attachChildToReservation\")((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n AttachChildToReservationRequest,\n \"attachChildToReservation\",\n unvalidated,\n );\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<\n ChildBudgetReservationSnapshot,\n ChildReservationConflict | OwnershipLost | LedgerError\n >,\n LedgerState,\n ] => {\n const reservation = current.childReservations.get(request.reservationId);\n\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"attachChildToReservation\",\n `Unknown child reservation ${request.reservationId}`,\n ),\n ),\n current,\n ];\n }\n if (reservation.childSubmissionId !== undefined) {\n // Idempotent replay of the recorded attachment (unfenced — it mutates nothing).\n if (reservation.childSubmissionId === request.childSubmissionId) {\n return [success(toReservationSnapshot(reservation)), current];\n }\n\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message: `Reservation ${request.reservationId} already records child ${reservation.childSubmissionId}.`,\n }),\n ),\n current,\n ];\n }\n const parent = current.submissions.get(reservation.parentSubmissionId);\n\n if (parent === undefined) {\n return [\n failure(\n ledgerError(\n \"attachChildToReservation\",\n `Unknown Submission ${reservation.parentSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n if (!ownsLane(parent, request.ownershipToken)) {\n return [failure(ownershipLost(current, parent)), current];\n }\n if (reservation.status !== \"reserved\") {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message: `Cannot attach a child to a ${reservation.status} reservation.`,\n }),\n ),\n current,\n ];\n }\n // Single-store latitude: the admitted child must exist here, so a dangling\n // attachment can never enter the recovery view.\n if (!current.submissions.has(request.childSubmissionId)) {\n return [\n failure(\n ledgerError(\n \"attachChildToReservation\",\n `Unknown child Submission ${request.childSubmissionId}`,\n ),\n ),\n current,\n ];\n }\n\n const attached: StoredChildReservation = {\n ...reservation,\n childSubmissionId: request.childSubmissionId,\n };\n\n return [\n success(toReservationSnapshot(attached)),\n withChildReservation(current, attached),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const beginChildBudgetRelease: SubmissionLedger[\"Service\"][\"beginChildBudgetRelease\"] =\n Effect.fn(\"MemorySubmissionLedger.beginChildBudgetRelease\")((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n BeginChildBudgetReleaseRequest,\n \"beginChildBudgetRelease\",\n unvalidated,\n );\n\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ChildBudgetReservationSnapshot, ChildReservationConflict | LedgerError>,\n LedgerState,\n ] => {\n const reservation = current.childReservations.get(request.reservationId);\n\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"beginChildBudgetRelease\",\n `Unknown child reservation ${request.reservationId}`,\n ),\n ),\n current,\n ];\n }\n if (reservation.status !== \"reserved\") {\n // The accounting decision was already frozen exactly once; an identical replay is\n // a no-op and a divergent decision conflicts (spec §12 join step 6).\n if (\n reservation.accounting !== undefined &&\n equivalentPersistedJson(reservation.accounting, request.accounting)\n ) {\n return [success(toReservationSnapshot(reservation)), current];\n }\n\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message:\n \"A different accounting decision is already frozen for this reservation.\",\n }),\n ),\n current,\n ];\n }\n\n const frozen: StoredChildReservation = {\n ...reservation,\n status: \"releasePending\",\n accounting: request.accounting,\n releaseBeganAtMillis: nowMillis,\n };\n\n return [\n success(toReservationSnapshot(frozen)),\n withChildReservation(current, frozen),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const releaseChildBudget: SubmissionLedger[\"Service\"][\"releaseChildBudget\"] = Effect.fn(\n \"MemorySubmissionLedger.releaseChildBudget\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n ReleaseChildBudgetRequest,\n \"releaseChildBudget\",\n unvalidated,\n );\n\n const nowMillis = yield* Clock.currentTimeMillis;\n\n const decision = yield* Ref.modify(\n state,\n (\n current,\n ): readonly [\n Decision<ChildBudgetReservationSnapshot, ChildReservationConflict | LedgerError>,\n LedgerState,\n ] => {\n const reservation = current.childReservations.get(request.reservationId);\n\n if (reservation === undefined) {\n return [\n failure(\n ledgerError(\n \"releaseChildBudget\",\n `Unknown child reservation ${request.reservationId}`,\n ),\n ),\n current,\n ];\n }\n // Applied exactly once: replaying a released reservation returns the stored row\n // unchanged (spec §12: \"never available twice\").\n if (reservation.status === \"released\") {\n return [success(toReservationSnapshot(reservation)), current];\n }\n if (reservation.status !== \"releasePending\") {\n return [\n failure(\n ChildReservationConflict.make({\n reservationId: request.reservationId,\n status: reservation.status,\n message:\n \"Cannot release a reservation whose accounting decision is not frozen.\",\n }),\n ),\n current,\n ];\n }\n\n const released: StoredChildReservation = {\n ...reservation,\n status: \"released\",\n releasedAtMillis: nowMillis,\n };\n\n return [\n success(toReservationSnapshot(released)),\n withChildReservation(current, released),\n ];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.value;\n }),\n );\n\n const scanNonterminal: SubmissionLedger[\"Service\"][\"scanNonterminal\"] = Stream.unwrap(\n Ref.get(state).pipe(\n Effect.map((current) => {\n const snapshots = [...current.submissions.values()]\n .filter((stored) => stored.row.state !== \"settled\")\n .sort((left, right) =>\n left.row.threadId < right.row.threadId\n ? -1\n : left.row.threadId > right.row.threadId\n ? 1\n : left.row.queueSequence - right.row.queueSequence,\n )\n .map((stored) => toSnapshot(stored.row));\n\n return Stream.fromIterable(snapshots);\n }),\n ),\n );\n\n const loadRecoverySnapshot: SubmissionLedger[\"Service\"][\"loadRecoverySnapshot\"] = Effect.fn(\n \"MemorySubmissionLedger.loadRecoverySnapshot\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(\n RecoverySnapshotRequest,\n \"loadRecoverySnapshot\",\n unvalidated,\n );\n\n const current = yield* Ref.get(state);\n const stored = current.submissions.get(request.submissionId);\n\n if (stored === undefined) {\n return yield* ledgerError(\n \"loadRecoverySnapshot\",\n `Unknown Submission ${request.submissionId}`,\n );\n }\n\n const joins = [...current.submissions.values()]\n .filter((candidate) => candidate.joinedHostSubmissionId === request.submissionId)\n .sort((left, right) => left.row.queueSequence - right.row.queueSequence)\n .map((candidate) =>\n JoinSnapshot.make({\n submissionId: candidate.row.submissionId,\n state: candidate.row.state,\n hostSubmissionId: request.submissionId,\n }),\n );\n\n const byToolCallId = <A extends { readonly toolCallId: ToolCallId }>(\n left: A,\n right: A,\n ): number =>\n left.toolCallId < right.toolCallId ? -1 : left.toolCallId > right.toolCallId ? 1 : 0;\n\n // Parent-side subagent view: this Submission's child budget reservations in parent Tool\n // Call order, plus each attached child's current lane state (a disposable derived view;\n // the canonical records stay the recovery truth, DUR-015).\n const childReservations = [...current.childReservations.values()]\n .filter((reservation) => reservation.parentSubmissionId === request.submissionId)\n .sort((left, right) =>\n left.parentToolCallId < right.parentToolCallId\n ? -1\n : left.parentToolCallId > right.parentToolCallId\n ? 1\n : 0,\n );\n\n const childAttachments: Array<ChildAttachmentSnapshot> = [];\n\n for (const reservation of childReservations) {\n if (reservation.childSubmissionId === undefined) continue;\n const child = current.submissions.get(reservation.childSubmissionId);\n\n if (child === undefined) continue;\n childAttachments.push(\n ChildAttachmentSnapshot.make({\n toolCallId: reservation.parentToolCallId,\n childSubmissionId: reservation.childSubmissionId,\n childState: child.row.state,\n ...(child.row.settledOutcome === undefined\n ? {}\n : { childOutcome: child.row.settledOutcome }),\n }),\n );\n }\n\n return RecoverySnapshot.make({\n submission: toSnapshot(stored.row),\n joins,\n approvalDecisions: [...stored.approvalDecisions.values()].sort(byToolCallId),\n unknownResolutions: [...stored.unknownResolutions.values()]\n .map((resolution) => resolution.intent)\n .sort(byToolCallId),\n childReservations: childReservations.map(toReservationSnapshot),\n childAttachments,\n ...(stored.row.parentLinkage === undefined\n ? {}\n : { parentLinkage: stored.row.parentLinkage }),\n ...(stored.joinedHostSubmissionId === undefined\n ? {}\n : { hostSubmissionId: stored.joinedHostSubmissionId }),\n ...(stored.suspension === undefined\n ? {}\n : {\n suspension: SuspensionSnapshot.make({\n reason: stored.suspension.reason,\n suspendedAt: utc(stored.suspension.suspendedAtMillis),\n }),\n }),\n ...(stored.ownership === undefined\n ? {}\n : {\n ownership: OwnershipSnapshot.make({\n attemptId: stored.ownership.attemptId,\n ownerProducerId: stored.ownership.ownerProducerId,\n producerEpoch: stored.ownership.producerEpoch,\n leaseExpiresAt: utc(stored.ownership.leaseExpiresAtMillis),\n }),\n }),\n ...(stored.inputApplied === undefined ? {} : { inputApplied: stored.inputApplied }),\n ...(stored.reservation === undefined\n ? {}\n : {\n reservation: SettlementReservationSnapshot.make({\n settlementId: stored.reservation.settlementId,\n outcome: stored.reservation.outcome,\n record: stored.reservation.record,\n recordDigest: stored.reservation.recordDigest,\n finalized: stored.reservation.finalizedAtMillis !== undefined,\n }),\n }),\n ...(stored.abortIntent === undefined ? {} : { abortIntent: stored.abortIntent }),\n });\n }),\n );\n\n return SubmissionLedger.of({\n capabilities,\n admit,\n markReady,\n lookup,\n resolveAdmission,\n claim,\n renewOwnership,\n releaseOwnership,\n markInputApplied,\n reserveSettlement,\n finalizeSettlement,\n requestAbort,\n claimJoining,\n markJoined,\n revertJoining,\n suspend,\n recordApprovalDecision,\n markUnknown,\n recordUnknownResolution,\n recordChildSettled,\n reserveChildBudget,\n attachChildToReservation,\n beginChildBudgetRelease,\n releaseChildBudget,\n scanNonterminal,\n loadRecoverySnapshot,\n });\n });\n\n/** Construction options for the in-memory reference SubmissionLedger. */\nexport interface MemorySubmissionLedgerOptions {\n /**\n * Test-only fault seam for `resolveAdmission` (SUB-031): when the effect yields a reason,\n * the resolution answers `Indeterminate` with it instead of consulting the store — modelling\n * an authoritative child owner that is temporarily unreachable. `Option.none()` restores the\n * store-derived answer. Ledger state is never mutated by the fault.\n */\n readonly resolveAdmissionFault?: Effect.Effect<Option.Option<string>>;\n}\n\n/**\n * In-memory reference SubmissionLedger Layer (durability `non-durable`). All state lives in one\n * `Ref` owned by the Layer's Scope; no daemon fibers are spawned and no wall clock is consulted.\n */\nexport const memorySubmissionLedgerLayer = (\n options: MemorySubmissionLedgerOptions = {},\n): Layer.Layer<SubmissionLedger> => Layer.effect(SubmissionLedger, makeSubmissionLedger(options));\n\nexport const MemorySubmissionLedgerLive: Layer.Layer<SubmissionLedger> =\n memorySubmissionLedgerLayer();\n","import {\n ScheduleCapacityError,\n ScheduleDueCursor,\n defaultSchedulingLimits,\n scheduleUsesCapacity,\n ScheduleChange,\n ScheduleConflict,\n ScheduleFailpoint,\n ScheduleKey,\n ScheduleNotFound,\n ScheduleOwner,\n SchedulePageRequest,\n ScheduleRecord,\n ScheduleStorageError,\n ScheduleStore,\n applyScheduleChange,\n compareScheduleKeys,\n compareScheduleNames,\n scheduleDeadline,\n scheduleKeyString,\n scheduleKeyOf,\n scheduleOwnerKey,\n} from \"@effect-agent/thread\";\nimport { Effect, Layer, Ref, Result, Schema } from \"effect\";\n\ninterface MemoryScheduleState {\n readonly records: ReadonlyMap<string, string>;\n}\n\nconst storageError = (operation: string, reason: \"unavailable\" | \"corrupt\") =>\n ScheduleStorageError.make({ operation, reason });\n\nconst encodeRecord = (operation: string, record: ScheduleRecord) =>\n Effect.try({\n try: () => Schema.encodeSync(Schema.fromJsonString(ScheduleRecord))(record),\n catch: () => storageError(operation, \"corrupt\"),\n });\n\nconst decodeRecord = (operation: string, encoded: string) =>\n Effect.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(encoded),\n catch: () => storageError(operation, \"corrupt\"),\n });\n\nconst decodeInput = <A, I>(operation: string, schema: Schema.Codec<A, I>, value: unknown) =>\n Effect.try({\n try: () => Schema.decodeUnknownSync(schema)(value),\n catch: () => storageError(operation, \"corrupt\"),\n });\n\nconst sameOwner = (record: ScheduleRecord, owner: ScheduleOwner): boolean =>\n scheduleOwnerKey(record.owner) === scheduleOwnerKey(owner);\n\nconst makeScheduleStore = Effect.gen(function* () {\n const state = yield* Ref.make<MemoryScheduleState>({ records: new Map() });\n const failpoint = yield* ScheduleFailpoint;\n\n const insert: ScheduleStore[\"Service\"][\"insert\"] = Effect.fn(\"MemoryScheduleStore.insert\")(\n (record, ownerLimit) =>\n Effect.gen(function* () {\n const encoded = yield* encodeRecord(\"insert\", record);\n\n yield* failpoint.hit(\"schedule:insert:before\");\n\n const decision = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<\n ScheduleRecord,\n ScheduleConflict | ScheduleCapacityError | ScheduleStorageError\n >,\n MemoryScheduleState,\n ] => {\n const key = scheduleKeyString(record);\n const existingText = current.records.get(key);\n\n if (existingText !== undefined) {\n const decoded = Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(existingText),\n catch: () => storageError(\"insert\", \"corrupt\"),\n });\n\n if (Result.isFailure(decoded)) {\n return [Result.fail(decoded.failure), current];\n }\n if (decoded.success.creationFingerprint === record.creationFingerprint) {\n return [Result.succeed(decoded.success), current];\n }\n\n return [\n Result.fail(\n ScheduleConflict.make({ reason: \"creation\", key: scheduleKeyOf(record) }),\n ),\n current,\n ];\n }\n\n let ownerCount = 0;\n\n for (const text of current.records.values()) {\n const decoded = Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(text),\n catch: () => storageError(\"insert\", \"corrupt\"),\n });\n\n if (Result.isFailure(decoded)) {\n return [Result.fail(decoded.failure), current];\n }\n if (\n sameOwner(decoded.success, record.owner) &&\n scheduleUsesCapacity(decoded.success)\n )\n ownerCount += 1;\n }\n if (ownerCount >= ownerLimit) {\n return [Result.fail(ScheduleCapacityError.make({ limit: ownerLimit })), current];\n }\n const records = new Map(current.records);\n\n records.set(key, encoded);\n const next = { records };\n\n return [Result.succeed(record), next];\n },\n ),\n );\n\n const inserted = yield* Effect.fromResult(decision);\n\n yield* failpoint.hit(\"schedule:insert:after\");\n\n return yield* decodeRecord(\"insert\", yield* encodeRecord(\"insert\", inserted));\n }),\n );\n\n const get: ScheduleStore[\"Service\"][\"get\"] = Effect.fn(\"MemoryScheduleStore.get\")(\n function* (key) {\n const decodedKey = yield* decodeInput(\"get\", ScheduleKey, key);\n const text = (yield* Ref.get(state)).records.get(scheduleKeyString(decodedKey));\n\n return text === undefined ? null : yield* decodeRecord(\"get\", text);\n },\n );\n\n const list: ScheduleStore[\"Service\"][\"list\"] = Effect.fn(\"MemoryScheduleStore.list\")(\n function* (request) {\n const decodedRequest = yield* decodeInput(\"list\", SchedulePageRequest, request);\n const records: Array<ScheduleRecord> = [];\n\n for (const text of (yield* Ref.get(state)).records.values()) {\n const record = yield* decodeRecord(\"list\", text);\n\n if (\n sameOwner(record, decodedRequest.owner) &&\n (decodedRequest.after === undefined ||\n compareScheduleNames(record.scheduleId, decodedRequest.after) > 0)\n ) {\n records.push(record);\n }\n }\n records.sort((left, right) => compareScheduleNames(left.scheduleId, right.scheduleId));\n const hasNext = records.length > decodedRequest.limit;\n const items = records.slice(0, decodedRequest.limit);\n\n return {\n items,\n next: hasNext ? (items.at(-1)?.scheduleId ?? null) : null,\n };\n },\n );\n\n const change: ScheduleStore[\"Service\"][\"change\"] = Effect.fn(\"MemoryScheduleStore.change\")(\n (key, command, ownerLimit = defaultSchedulingLimits.maxSchedulesPerOwner) =>\n Effect.gen(function* () {\n const decodedKey = yield* decodeInput(\"change\", ScheduleKey, key);\n const decodedCommand = yield* decodeInput(\"change\", ScheduleChange, command);\n\n yield* failpoint.hit(`schedule:${decodedCommand._tag.toLowerCase()}:before`);\n\n const decision = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<\n ScheduleRecord,\n ScheduleConflict | ScheduleStorageError | ScheduleNotFound | ScheduleCapacityError\n >,\n MemoryScheduleState,\n ] => {\n const storageKey = scheduleKeyString(decodedKey);\n const text = current.records.get(storageKey);\n\n if (text === undefined) {\n return [Result.fail(ScheduleNotFound.make({ key: decodedKey })), current];\n }\n\n const decoded = Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(ScheduleRecord))(text),\n catch: () => storageError(\"change\", \"corrupt\"),\n });\n\n if (Result.isFailure(decoded)) {\n return [Result.fail(decoded.failure), current];\n }\n const applied = applyScheduleChange(decoded.success, decodedCommand);\n\n if (Result.isFailure(applied)) {\n return [Result.fail(applied.failure), current];\n }\n if (applied.success === decoded.success) {\n return [Result.succeed(decoded.success), current];\n }\n if (!scheduleUsesCapacity(decoded.success) && scheduleUsesCapacity(applied.success)) {\n let count = 0;\n\n for (const text of current.records.values()) {\n const candidate = Schema.decodeUnknownResult(\n Schema.fromJsonString(ScheduleRecord),\n )(text);\n\n if (Result.isFailure(candidate))\n return [Result.fail(storageError(\"change\", \"corrupt\")), current];\n if (\n sameOwner(candidate.success, decodedKey.owner) &&\n scheduleUsesCapacity(candidate.success)\n )\n count += 1;\n }\n if (count >= ownerLimit)\n return [Result.fail(ScheduleCapacityError.make({ limit: ownerLimit })), current];\n }\n\n const encoded = Result.try({\n try: () =>\n Schema.encodeSync(Schema.fromJsonString(ScheduleRecord))(applied.success),\n catch: () => storageError(\"change\", \"corrupt\"),\n });\n\n if (Result.isFailure(encoded)) {\n return [Result.fail(encoded.failure), current];\n }\n const records = new Map(current.records);\n\n records.set(storageKey, encoded.success);\n const next = { records };\n\n return [Result.succeed(applied.success), next];\n },\n ),\n );\n\n const changed = yield* Effect.fromResult(decision);\n\n yield* failpoint.hit(`schedule:${decodedCommand._tag.toLowerCase()}:after`);\n\n return yield* decodeRecord(\"change\", yield* encodeRecord(\"change\", changed));\n }),\n );\n\n const due: ScheduleStore[\"Service\"][\"due\"] = Effect.fn(\"MemoryScheduleStore.due\")(\n function* (nowMillis, limit, owner, after) {\n const decodedOwner =\n owner === undefined ? undefined : yield* decodeInput(\"due\", ScheduleOwner, owner);\n\n const cursor =\n after === undefined ? undefined : yield* decodeInput(\"due\", ScheduleDueCursor, after);\n\n const records: Array<ScheduleDueCursor> = [];\n\n for (const text of (yield* Ref.get(state)).records.values()) {\n const record = yield* decodeRecord(\"due\", text);\n const deadline = scheduleDeadline(record);\n\n if (\n deadline !== null &&\n deadline <= nowMillis &&\n (decodedOwner === undefined || sameOwner(record, decodedOwner)) &&\n (cursor === undefined ||\n deadline > cursor.deadlineAtMillis ||\n (deadline === cursor.deadlineAtMillis && compareScheduleKeys(record, cursor) > 0))\n ) {\n records.push({ ...scheduleKeyOf(record), deadlineAtMillis: deadline });\n }\n }\n records.sort((left, right) => {\n const byDeadline = left.deadlineAtMillis - right.deadlineAtMillis;\n\n return byDeadline !== 0 ? byDeadline : compareScheduleKeys(left, right);\n });\n\n return records.slice(0, limit);\n },\n );\n\n const nextDeadline: ScheduleStore[\"Service\"][\"nextDeadline\"] = Effect.fn(\n \"MemoryScheduleStore.nextDeadline\",\n )(function* (owner) {\n const decodedOwner =\n owner === undefined ? undefined : yield* decodeInput(\"nextDeadline\", ScheduleOwner, owner);\n\n let earliest: number | null = null;\n\n for (const text of (yield* Ref.get(state)).records.values()) {\n const record = yield* decodeRecord(\"nextDeadline\", text);\n\n if (decodedOwner !== undefined && !sameOwner(record, decodedOwner)) continue;\n const deadline = scheduleDeadline(record);\n\n if (deadline !== null && (earliest === null || deadline < earliest)) earliest = deadline;\n }\n\n return earliest;\n });\n\n return ScheduleStore.of({ insert, get, list, change, due, nextDeadline });\n});\n\nexport const memoryScheduleStoreLayer = (): Layer.Layer<ScheduleStore> =>\n Layer.effect(ScheduleStore, makeScheduleStore);\n\nexport const MemoryScheduleStoreLive: Layer.Layer<ScheduleStore> = memoryScheduleStoreLayer();\n","import {\n AcceptedEvent,\n applySubscriptionDeliveryChange,\n compareScheduleNames,\n DeliveryChange,\n Digest,\n SourcePartition,\n SubscriptionDelivery,\n SubscriptionDeliveryKey,\n SubscriptionError,\n SubscriptionFailpoint,\n SubscriptionKey,\n SubscriptionLimits,\n SubscriptionName,\n SubscriptionRecord,\n SubscriptionScanCursors,\n SubscriptionStore,\n subscriptionCanSelect,\n subscriptionDeliveryCanSelect,\n subscriptionDeliveryKeyString,\n subscriptionKeyString,\n} from \"@effect-agent/thread\";\nimport { Clock, Effect, Layer, Ref, Result, Schema } from \"effect\";\n\ninterface MemorySubscriptionState {\n readonly sequence: number;\n readonly registrations: ReadonlyMap<string, string>;\n readonly events: ReadonlyMap<string, string>;\n readonly deliveries: ReadonlyMap<string, string>;\n readonly registrationIndex: ReadonlyMap<string, RegistrationIndex>;\n readonly candidateIndex: ReadonlyMap<string, ReadonlyArray<string>>;\n readonly ownerRegistrationCounts: ReadonlyMap<string, number>;\n readonly eventIndex: ReadonlyMap<string, EventIndex>;\n readonly deliveryIndex: ReadonlyMap<string, DeliveryIndex>;\n readonly ownerDeliveryCounts: ReadonlyMap<string, number>;\n readonly scanCursors: SubscriptionScanCursors;\n}\n\ninterface RegistrationIndex {\n readonly key: SubscriptionKey;\n readonly ordinal: number;\n readonly state: SubscriptionRecord[\"state\"];\n readonly recoveryAt: number | null;\n}\ninterface EventIndex {\n readonly routingComplete: boolean;\n readonly nextAttemptAtMillis: number;\n}\ninterface DeliveryIndex {\n readonly key: SubscriptionDeliveryKey;\n readonly state: SubscriptionDelivery[\"state\"];\n readonly nextAttemptAtMillis: number;\n}\n\nconst error = (reason: SubscriptionError[\"reason\"], code: string) =>\n SubscriptionError.make({ reason, code });\n\nconst samePartition = (left: SourcePartition, right: SourcePartition): boolean =>\n left.tenantId === right.tenantId && left.address === right.address;\n\nconst sameSource = (left: AcceptedEvent[\"source\"], right: AcceptedEvent[\"source\"]): boolean =>\n left.name === right.name && left.version === right.version;\n\nconst encode = <A, I>(\n schema: Schema.Codec<A, I>,\n value: A,\n code: string,\n): Result.Result<string, SubscriptionError> =>\n Result.try({\n try: () => Schema.encodeSync(Schema.fromJsonString(schema))(value),\n catch: () => error(\"corrupt\", code),\n });\n\nconst decode = <A, I>(\n schema: Schema.Codec<A, I>,\n value: string,\n code: string,\n): Result.Result<A, SubscriptionError> =>\n Result.try({\n try: () => Schema.decodeSync(Schema.fromJsonString(schema))(value),\n catch: () => error(\"corrupt\", code),\n });\n\nconst decodeEffect = <A, I>(schema: Schema.Codec<A, I>, value: string, code: string) =>\n Effect.fromResult(decode(schema, value, code));\n\nconst validate = <A, I>(schema: Schema.Codec<A, I>, value: unknown, code: string) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(Effect.mapError(() => error(\"validation\", code)));\n\nconst jsonBytes = (value: unknown): number =>\n new TextEncoder().encode(JSON.stringify(value)).byteLength;\n\nconst sameDeliveryIdentity = (left: SubscriptionDelivery, right: SubscriptionDelivery): boolean =>\n subscriptionDeliveryKeyString(left.key) === subscriptionDeliveryKeyString(right.key) &&\n left.deliveryId === right.deliveryId &&\n left.source.name === right.source.name &&\n left.source.version === right.source.version &&\n left.threadId === right.threadId &&\n left.admissionKey === right.admissionKey &&\n left.subscriptionFingerprint === right.subscriptionFingerprint &&\n left.eventDigest === right.eventDigest;\n\nconst candidateIndexKey = (record: SubscriptionRecord): string =>\n JSON.stringify([\n record.configuration.source.name,\n record.configuration.source.version,\n record.configuration.matchingKey,\n ]);\n\nconst eventCandidateIndexKey = (event: AcceptedEvent): string =>\n JSON.stringify([event.source.name, event.source.version, event.matchingKey]);\n\nconst sameEventIdentity = (left: AcceptedEvent, right: AcceptedEvent): boolean =>\n samePartition(left.partition, right.partition) &&\n left.eventId === right.eventId &&\n sameSource(left.source, right.source) &&\n left.matchingKey === right.matchingKey &&\n left.payloadDigest === right.payloadDigest;\n\nconst deliveryBelongsTo = (\n delivery: SubscriptionDelivery,\n record: SubscriptionRecord,\n event: AcceptedEvent,\n): boolean =>\n subscriptionKeyString(delivery.key.subscription) === subscriptionKeyString(record.key) &&\n delivery.key.eventId === event.eventId &&\n sameSource(delivery.source, event.source);\n\nconst makeMemorySubscriptionStore = Effect.fn(\"makeMemorySubscriptionStore\")(function* (\n ownedPartition: SourcePartition,\n) {\n const partition = yield* validate(SourcePartition, ownedPartition, \"partition\");\n\n const state = yield* Ref.make<MemorySubscriptionState>({\n sequence: 0,\n registrations: new Map(),\n events: new Map(),\n deliveries: new Map(),\n registrationIndex: new Map(),\n candidateIndex: new Map(),\n ownerRegistrationCounts: new Map(),\n eventIndex: new Map(),\n deliveryIndex: new Map(),\n ownerDeliveryCounts: new Map(),\n scanCursors: { events: \"\", deliveries: \"\", recovery: 0 },\n });\n\n const failpoint = yield* SubscriptionFailpoint;\n\n const requirePartition = <A extends { readonly partition: SourcePartition }>(\n value: A,\n code: string,\n ) =>\n samePartition(value.partition, partition)\n ? Effect.succeed(value)\n : Effect.fail(error(\"validation\", code));\n\n const requireKey = (key: SubscriptionKey, code: string) =>\n validate(SubscriptionKey, key, code).pipe(\n Effect.flatMap((decoded) => requirePartition(decoded, code)),\n );\n\n const register: SubscriptionStore[\"Service\"][\"register\"] = Effect.fn(\n \"MemorySubscriptionStore.register\",\n )(function* (input, inputLimits) {\n const record = yield* validate(SubscriptionRecord, input, \"register-record\");\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"register-limits\");\n\n yield* requirePartition(record.key, \"register-partition\");\n yield* failpoint.hit(\"subscription:register:before\");\n\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<SubscriptionRecord, SubscriptionError>,\n MemorySubscriptionState,\n ] => {\n const key = subscriptionKeyString(record.key);\n const existingText = current.registrations.get(key);\n\n if (existingText !== undefined) {\n const existing = decode(SubscriptionRecord, existingText, \"register-existing\");\n\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n\n return existing.success.creationFingerprint === record.creationFingerprint\n ? [Result.succeed(existing.success), current]\n : [Result.fail(error(\"conflict\", \"registration-identity\")), current];\n }\n if (jsonBytes(record.configuration.context) > limits.maxContextBytes)\n return [Result.fail(error(\"capacity\", \"context-bytes\")), current];\n if (jsonBytes(record.configuration.parameters) > limits.maxPayloadBytes)\n return [Result.fail(error(\"capacity\", \"parameters-bytes\")), current];\n if (\n record.configuration.expiresAtMillis - record.createdAtMillis >\n limits.maxLifetimeMillis\n )\n return [Result.fail(error(\"capacity\", \"lifetime\")), current];\n if (current.registrations.size >= limits.maxRegistrations)\n return [Result.fail(error(\"capacity\", \"registrations\")), current];\n const ownerCount = current.ownerRegistrationCounts.get(record.key.ownerId) ?? 0;\n\n if (ownerCount >= limits.maxRegistrationsPerOwner)\n return [Result.fail(error(\"capacity\", \"owner-registrations\")), current];\n const assigned = { ...record, ordinal: current.sequence + 1 };\n const encoded = encode(SubscriptionRecord, assigned, \"register-encode\");\n\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const registrations = new Map(current.registrations);\n\n registrations.set(key, encoded.success);\n const registrationIndex = new Map(current.registrationIndex);\n\n registrationIndex.set(key, {\n key: assigned.key,\n ordinal: assigned.ordinal,\n state: assigned.state,\n recoveryAt: assigned.recovery?.nextAttemptAtMillis ?? null,\n });\n const candidateIndex = new Map(current.candidateIndex);\n const candidateKey = candidateIndexKey(assigned);\n\n candidateIndex.set(candidateKey, [...(candidateIndex.get(candidateKey) ?? []), key]);\n const ownerRegistrationCounts = new Map(current.ownerRegistrationCounts);\n\n ownerRegistrationCounts.set(assigned.key.ownerId, ownerCount + 1);\n\n return [\n Result.succeed(assigned),\n {\n ...current,\n sequence: assigned.ordinal,\n registrations,\n registrationIndex,\n candidateIndex,\n ownerRegistrationCounts,\n },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n\n yield* failpoint.hit(\"subscription:register:after\");\n\n return result;\n });\n\n const get: SubscriptionStore[\"Service\"][\"get\"] = Effect.fn(\"MemorySubscriptionStore.get\")(\n function* (input) {\n const key = yield* requireKey(input, \"get-key\");\n const text = (yield* Ref.get(state)).registrations.get(subscriptionKeyString(key));\n\n return text === undefined\n ? null\n : yield* decodeEffect(SubscriptionRecord, text, \"get-record\");\n },\n );\n\n const list: SubscriptionStore[\"Service\"][\"list\"] = Effect.fn(\"MemorySubscriptionStore.list\")(\n function* (ownerId, after, limit) {\n if (!Number.isSafeInteger(after) || after < 0 || !Number.isSafeInteger(limit) || limit <= 0)\n return yield* error(\"validation\", \"list-page\");\n const current = yield* Ref.get(state);\n const records: Array<SubscriptionRecord> = [];\n\n for (const [storageKey, indexed] of current.registrationIndex) {\n if (indexed.key.ownerId !== ownerId || indexed.ordinal <= after) continue;\n const text = current.registrations.get(storageKey);\n\n if (text === undefined) return yield* error(\"corrupt\", \"list-index\");\n records.push(yield* decodeEffect(SubscriptionRecord, text, \"list-record\"));\n }\n records.sort((a, b) => a.ordinal - b.ordinal);\n\n return records.slice(0, limit);\n },\n );\n\n const cancel: SubscriptionStore[\"Service\"][\"cancel\"] = Effect.fn(\n \"MemorySubscriptionStore.cancel\",\n )(function* (input) {\n const key = yield* requireKey(input, \"cancel-key\");\n\n yield* failpoint.hit(\"subscription:cancel:before\");\n\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<SubscriptionRecord, SubscriptionError>,\n MemorySubscriptionState,\n ] => {\n const storageKey = subscriptionKeyString(key);\n const text = current.registrations.get(storageKey);\n\n if (text === undefined) return [Result.fail(error(\"not-found\", \"subscription\")), current];\n const decoded = decode(SubscriptionRecord, text, \"cancel-record\");\n\n if (Result.isFailure(decoded)) return [decoded, current];\n if (decoded.success.state === \"cancelled\")\n return [Result.succeed(decoded.success), current];\n const cancelled = { ...decoded.success, state: \"cancelled\" as const, recovery: null };\n const encoded = encode(SubscriptionRecord, cancelled, \"cancel-encode\");\n\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const registrations = new Map(current.registrations);\n\n registrations.set(storageKey, encoded.success);\n const registrationIndex = new Map(current.registrationIndex);\n const indexed = registrationIndex.get(storageKey);\n\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"cancel-index\")), current];\n registrationIndex.set(storageKey, { ...indexed, state: \"cancelled\", recoveryAt: null });\n\n return [Result.succeed(cancelled), { ...current, registrations, registrationIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n\n yield* failpoint.hit(\"subscription:cancel:after\");\n\n return result;\n });\n\n const accept: SubscriptionStore[\"Service\"][\"accept\"] = Effect.fn(\n \"MemorySubscriptionStore.accept\",\n )(function* (input, inputLimits) {\n const event = yield* validate(AcceptedEvent, input, \"accept-event\");\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"accept-limits\");\n\n yield* requirePartition(event, \"accept-partition\");\n yield* failpoint.hit(\"subscription:accept:before\");\n\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [Result.Result<AcceptedEvent, SubscriptionError>, MemorySubscriptionState] => {\n const existingText = current.events.get(event.eventId);\n\n if (existingText !== undefined) {\n const existing = decode(AcceptedEvent, existingText, \"accept-existing\");\n\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n\n return sameEventIdentity(existing.success, event)\n ? [Result.succeed(existing.success), current]\n : [Result.fail(error(\"conflict\", \"event-identity\")), current];\n }\n if (jsonBytes(event.payload) > limits.maxPayloadBytes)\n return [Result.fail(error(\"capacity\", \"payload-bytes\")), current];\n if (current.events.size >= limits.maxEvents)\n return [Result.fail(error(\"capacity\", \"events\")), current];\n\n const accepted: AcceptedEvent = {\n ...event,\n cutoff: current.sequence + 1,\n cursor: 0,\n routingComplete: false,\n routingFailure: null,\n };\n\n const encoded = encode(AcceptedEvent, accepted, \"accept-encode\");\n\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const events = new Map(current.events);\n\n events.set(accepted.eventId, encoded.success);\n const eventIndex = new Map(current.eventIndex);\n\n eventIndex.set(accepted.eventId, {\n routingComplete: false,\n nextAttemptAtMillis: accepted.nextAttemptAtMillis,\n });\n\n return [\n Result.succeed(accepted),\n { ...current, sequence: accepted.cutoff, events, eventIndex },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n\n yield* failpoint.hit(\"subscription:accept:after\");\n\n return result;\n });\n\n const event: SubscriptionStore[\"Service\"][\"event\"] = Effect.fn(\"MemorySubscriptionStore.event\")(\n function* (eventId) {\n const text = (yield* Ref.get(state)).events.get(eventId);\n\n return text === undefined ? null : yield* decodeEffect(AcceptedEvent, text, \"event-record\");\n },\n );\n\n const pendingEvents: SubscriptionStore[\"Service\"][\"pendingEvents\"] = Effect.fn(\n \"MemorySubscriptionStore.pendingEvents\",\n )(function* (nowMillis, after, limit) {\n const events: Array<string> = [];\n\n for (const [eventId, indexed] of (yield* Ref.get(state)).eventIndex) {\n if (\n !indexed.routingComplete &&\n indexed.nextAttemptAtMillis <= nowMillis &&\n compareScheduleNames(eventId, after) > 0\n )\n events.push(eventId);\n }\n events.sort(compareScheduleNames);\n\n return events.slice(0, limit);\n });\n\n const candidates: SubscriptionStore[\"Service\"][\"candidates\"] = Effect.fn(\n \"MemorySubscriptionStore.candidates\",\n )(function* (input, limit) {\n const accepted = yield* validate(AcceptedEvent, input, \"candidates-event\");\n\n yield* requirePartition(accepted, \"candidates-partition\");\n const stored = yield* event(accepted.eventId);\n\n if (stored === null || !sameEventIdentity(stored, accepted))\n return yield* error(stored === null ? \"not-found\" : \"conflict\", \"event\");\n const current = yield* Ref.get(state);\n const records: Array<SubscriptionRecord> = [];\n\n for (const storageKey of current.candidateIndex.get(eventCandidateIndexKey(stored)) ?? []) {\n const indexed = current.registrationIndex.get(storageKey);\n\n if (indexed === undefined) return yield* error(\"corrupt\", \"candidate-index\");\n if (indexed.ordinal <= stored.cursor || indexed.ordinal > stored.cutoff) continue;\n const text = current.registrations.get(storageKey);\n\n if (text === undefined) return yield* error(\"corrupt\", \"candidate-record\");\n records.push(yield* decodeEffect(SubscriptionRecord, text, \"candidate-record\"));\n }\n records.sort((a, b) => a.ordinal - b.ordinal);\n\n return records.slice(0, limit);\n });\n\n const select: SubscriptionStore[\"Service\"][\"select\"] = Effect.fn(\n \"MemorySubscriptionStore.select\",\n )(function* (inputEvent, inputDeliveries, cursor, complete, nowMillis, inputLimits) {\n const suppliedEvent = yield* validate(AcceptedEvent, inputEvent, \"select-event\");\n\n const deliveries = yield* validate(\n Schema.Array(SubscriptionDelivery),\n inputDeliveries,\n \"select-deliveries\",\n );\n\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"select-limits\");\n\n yield* requirePartition(suppliedEvent, \"select-partition\");\n yield* failpoint.hit(\"subscription:select:before\");\n const effectiveNowMillis = Math.max(nowMillis, yield* Clock.currentTimeMillis);\n\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const eventText = current.events.get(suppliedEvent.eventId);\n\n if (eventText === undefined) return [Result.fail(error(\"not-found\", \"event\")), current];\n const decodedEvent = decode(AcceptedEvent, eventText, \"select-event-record\");\n\n if (Result.isFailure(decodedEvent)) return [Result.fail(decodedEvent.failure), current];\n const accepted = decodedEvent.success;\n\n if (\n !sameEventIdentity(accepted, suppliedEvent) ||\n suppliedEvent.cursor !== accepted.cursor\n )\n return [Result.fail(error(\"conflict\", \"event-cursor\")), current];\n if (accepted.routingComplete)\n return [\n complete && cursor === accepted.cursor\n ? Result.void\n : Result.fail(error(\"conflict\", \"routing-complete\")),\n current,\n ];\n if (!Number.isSafeInteger(cursor) || cursor < accepted.cursor || cursor > accepted.cutoff)\n return [Result.fail(error(\"validation\", \"cursor\")), current];\n\n const additions: Array<readonly [string, string]> = [];\n const updates: Array<readonly [string, string]> = [];\n const additionIndex: Array<readonly [string, DeliveryIndex, string]> = [];\n const registrationUpdates: Array<readonly [string, RegistrationIndex]> = [];\n const owners = new Map(current.ownerDeliveryCounts);\n\n for (const delivery of deliveries) {\n const recordText = current.registrations.get(\n subscriptionKeyString(delivery.key.subscription),\n );\n\n if (recordText === undefined)\n return [Result.fail(error(\"not-found\", \"subscription\")), current];\n const record = decode(SubscriptionRecord, recordText, \"select-registration\");\n\n if (Result.isFailure(record)) return [Result.fail(record.failure), current];\n if (\n !deliveryBelongsTo(delivery, record.success, accepted) ||\n !subscriptionDeliveryCanSelect(delivery, record.success, accepted) ||\n record.success.ordinal <= accepted.cursor ||\n record.success.ordinal > cursor\n )\n return [Result.fail(error(\"conflict\", \"selection\")), current];\n if (!subscriptionCanSelect(record.success, accepted, effectiveNowMillis, false))\n continue;\n const deliveryKey = subscriptionDeliveryKeyString(delivery.key);\n const existingText = current.deliveries.get(deliveryKey);\n\n if (existingText !== undefined) {\n const existing = decode(SubscriptionDelivery, existingText, \"select-existing\");\n\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n if (!sameDeliveryIdentity(existing.success, delivery))\n return [Result.fail(error(\"conflict\", \"delivery-identity\")), current];\n continue;\n }\n\n const encodedDelivery = encode(\n SubscriptionDelivery,\n delivery,\n \"select-delivery-encode\",\n );\n\n if (Result.isFailure(encodedDelivery))\n return [Result.fail(encodedDelivery.failure), current];\n additions.push([deliveryKey, encodedDelivery.success]);\n additionIndex.push([\n deliveryKey,\n {\n key: delivery.key,\n state: delivery.state,\n nextAttemptAtMillis: delivery.retry.nextAttemptAtMillis,\n },\n record.success.key.ownerId,\n ]);\n const ownerId = record.success.key.ownerId;\n\n owners.set(ownerId, (owners.get(ownerId) ?? 0) + 1);\n if ((owners.get(ownerId) ?? 0) > limits.maxDeliveriesPerOwner)\n return [Result.fail(error(\"capacity\", \"owner-deliveries\")), current];\n if (record.success.configuration.mode === \"once\") {\n const consumed = { ...record.success, state: \"consumed\" as const, recovery: null };\n\n const encodedRecord = encode(\n SubscriptionRecord,\n consumed,\n \"select-registration-encode\",\n );\n\n if (Result.isFailure(encodedRecord))\n return [Result.fail(encodedRecord.failure), current];\n const consumedKey = subscriptionKeyString(consumed.key);\n\n updates.push([consumedKey, encodedRecord.success]);\n const indexed = current.registrationIndex.get(consumedKey);\n\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"selection-index\")), current];\n registrationUpdates.push([\n consumedKey,\n { ...indexed, state: \"consumed\", recoveryAt: null },\n ]);\n }\n }\n if (current.deliveries.size + additions.length > limits.maxDeliveries)\n return [Result.fail(error(\"capacity\", \"deliveries\")), current];\n const registrations = new Map(current.registrations);\n\n for (const [key, value] of updates) registrations.set(key, value);\n const nextDeliveries = new Map(current.deliveries);\n\n for (const [key, value] of additions) nextDeliveries.set(key, value);\n const deliveryIndex = new Map(current.deliveryIndex);\n\n for (const [key, value] of additionIndex) deliveryIndex.set(key, value);\n const registrationIndex = new Map(current.registrationIndex);\n\n for (const [key, value] of registrationUpdates) registrationIndex.set(key, value);\n\n const nextEvent: AcceptedEvent = {\n ...accepted,\n cursor,\n routingComplete: complete,\n routingFailure: null,\n };\n\n const encodedEvent = encode(AcceptedEvent, nextEvent, \"select-event-encode\");\n\n if (Result.isFailure(encodedEvent)) return [Result.fail(encodedEvent.failure), current];\n const events = new Map(current.events);\n\n events.set(nextEvent.eventId, encodedEvent.success);\n const eventIndex = new Map(current.eventIndex);\n\n eventIndex.set(nextEvent.eventId, {\n routingComplete: nextEvent.routingComplete,\n nextAttemptAtMillis: nextEvent.nextAttemptAtMillis,\n });\n\n return [\n Result.void,\n {\n ...current,\n registrations,\n registrationIndex,\n events,\n eventIndex,\n deliveries: nextDeliveries,\n deliveryIndex,\n ownerDeliveryCounts: owners,\n },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:select:after\");\n });\n\n const catchUp: SubscriptionStore[\"Service\"][\"catchUp\"] = Effect.fn(\n \"MemorySubscriptionStore.catchUp\",\n )(function* (inputEvent, inputDelivery, nowMillis, inputLimits) {\n const suppliedEvent = yield* validate(AcceptedEvent, inputEvent, \"catch-up-event\");\n const delivery = yield* validate(SubscriptionDelivery, inputDelivery, \"catch-up-delivery\");\n const limits = yield* validate(SubscriptionLimits, inputLimits, \"catch-up-limits\");\n\n yield* requirePartition(suppliedEvent, \"catch-up-partition\");\n yield* failpoint.hit(\"subscription:catch-up:before\");\n const effectiveNowMillis = Math.max(nowMillis, yield* Clock.currentTimeMillis);\n\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const eventText = current.events.get(suppliedEvent.eventId);\n\n const recordText = current.registrations.get(\n subscriptionKeyString(delivery.key.subscription),\n );\n\n if (eventText === undefined || recordText === undefined)\n return [\n Result.fail(error(\"not-found\", eventText === undefined ? \"event\" : \"subscription\")),\n current,\n ];\n const accepted = decode(AcceptedEvent, eventText, \"catch-up-event-record\");\n\n if (Result.isFailure(accepted)) return [Result.fail(accepted.failure), current];\n const record = decode(SubscriptionRecord, recordText, \"catch-up-registration\");\n\n if (Result.isFailure(record)) return [Result.fail(record.failure), current];\n if (\n !sameEventIdentity(accepted.success, suppliedEvent) ||\n !deliveryBelongsTo(delivery, record.success, accepted.success) ||\n !subscriptionDeliveryCanSelect(delivery, record.success, accepted.success) ||\n record.success.configuration.mode !== \"once\"\n )\n return [Result.fail(error(\"conflict\", \"catch-up-identity\")), current];\n const key = subscriptionDeliveryKeyString(delivery.key);\n const existingText = current.deliveries.get(key);\n\n if (existingText !== undefined) {\n const existing = decode(SubscriptionDelivery, existingText, \"catch-up-existing\");\n\n if (Result.isFailure(existing)) return [Result.fail(existing.failure), current];\n\n return sameDeliveryIdentity(existing.success, delivery)\n ? [Result.void, current]\n : [Result.fail(error(\"conflict\", \"delivery-identity\")), current];\n }\n if (!subscriptionCanSelect(record.success, accepted.success, effectiveNowMillis, true))\n return [Result.fail(error(\"conflict\", \"catch-up-eligibility\")), current];\n if (current.deliveries.size >= limits.maxDeliveries)\n return [Result.fail(error(\"capacity\", \"deliveries\")), current];\n const ownerCount = current.ownerDeliveryCounts.get(record.success.key.ownerId) ?? 0;\n\n if (ownerCount >= limits.maxDeliveriesPerOwner)\n return [Result.fail(error(\"capacity\", \"owner-deliveries\")), current];\n\n const encodedDelivery = encode(\n SubscriptionDelivery,\n delivery,\n \"catch-up-delivery-encode\",\n );\n\n if (Result.isFailure(encodedDelivery))\n return [Result.fail(encodedDelivery.failure), current];\n const consumed = { ...record.success, state: \"consumed\" as const, recovery: null };\n\n const encodedRecord = encode(\n SubscriptionRecord,\n consumed,\n \"catch-up-registration-encode\",\n );\n\n if (Result.isFailure(encodedRecord)) return [Result.fail(encodedRecord.failure), current];\n const deliveries = new Map(current.deliveries);\n\n deliveries.set(key, encodedDelivery.success);\n const registrations = new Map(current.registrations);\n const consumedKey = subscriptionKeyString(consumed.key);\n\n registrations.set(consumedKey, encodedRecord.success);\n const registrationIndex = new Map(current.registrationIndex);\n const indexed = registrationIndex.get(consumedKey);\n\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"catch-up-index\")), current];\n registrationIndex.set(consumedKey, { ...indexed, state: \"consumed\", recoveryAt: null });\n const deliveryIndex = new Map(current.deliveryIndex);\n\n deliveryIndex.set(key, {\n key: delivery.key,\n state: delivery.state,\n nextAttemptAtMillis: delivery.retry.nextAttemptAtMillis,\n });\n const ownerDeliveryCounts = new Map(current.ownerDeliveryCounts);\n\n ownerDeliveryCounts.set(consumed.key.ownerId, ownerCount + 1);\n\n return [\n Result.void,\n {\n ...current,\n deliveries,\n deliveryIndex,\n ownerDeliveryCounts,\n registrations,\n registrationIndex,\n },\n ];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:catch-up:after\");\n });\n\n const deferEvent: SubscriptionStore[\"Service\"][\"deferEvent\"] = Effect.fn(\n \"MemorySubscriptionStore.deferEvent\",\n )(function* (eventId, nextAttemptAtMillis, code) {\n const routingFailure =\n code === undefined\n ? \"routing-failed\"\n : yield* validate(SubscriptionName, code, \"routing-failure\");\n\n yield* failpoint.hit(\"subscription:defer-event:before\");\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const text = current.events.get(eventId);\n\n if (text === undefined) return [Result.fail(error(\"not-found\", \"event\")), current];\n const accepted = decode(AcceptedEvent, text, \"defer-event-record\");\n\n if (Result.isFailure(accepted)) return [Result.fail(accepted.failure), current];\n const updated = { ...accepted.success, nextAttemptAtMillis, routingFailure };\n const encoded = encode(AcceptedEvent, updated, \"defer-event-encode\");\n\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const events = new Map(current.events);\n\n events.set(eventId, encoded.success);\n const eventIndex = new Map(current.eventIndex);\n const indexed = eventIndex.get(eventId);\n\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"defer-event-index\")), current];\n eventIndex.set(eventId, { ...indexed, nextAttemptAtMillis });\n\n return [Result.void, { ...current, events, eventIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:defer-event:after\");\n });\n\n const delivery: SubscriptionStore[\"Service\"][\"delivery\"] = Effect.fn(\n \"MemorySubscriptionStore.delivery\",\n )(function* (input) {\n const key = yield* validate(SubscriptionDeliveryKey, input, \"delivery-key\");\n\n yield* requirePartition(key.subscription, \"delivery-partition\");\n const text = (yield* Ref.get(state)).deliveries.get(subscriptionDeliveryKeyString(key));\n\n return text === undefined\n ? null\n : yield* decodeEffect(SubscriptionDelivery, text, \"delivery-record\");\n });\n\n const pendingDeliveries: SubscriptionStore[\"Service\"][\"pendingDeliveries\"] = Effect.fn(\n \"MemorySubscriptionStore.pendingDeliveries\",\n )(function* (nowMillis, after, limit) {\n const items: Array<SubscriptionDeliveryKey> = [];\n\n for (const [storageKey, item] of (yield* Ref.get(state)).deliveryIndex) {\n if (\n item.state !== \"delivered\" &&\n item.state !== \"refused\" &&\n item.nextAttemptAtMillis <= nowMillis &&\n compareScheduleNames(storageKey, after) > 0\n )\n items.push(item.key);\n }\n items.sort((a, b) =>\n compareScheduleNames(subscriptionDeliveryKeyString(a), subscriptionDeliveryKeyString(b)),\n );\n\n return items.slice(0, limit);\n });\n\n const listDeliveries: SubscriptionStore[\"Service\"][\"listDeliveries\"] = Effect.fn(\n \"MemorySubscriptionStore.listDeliveries\",\n )(function* (input, after, limit) {\n const key = yield* requireKey(input, \"list-deliveries-key\");\n const items: Array<SubscriptionDelivery> = [];\n\n for (const text of (yield* Ref.get(state)).deliveries.values()) {\n const item = yield* decodeEffect(SubscriptionDelivery, text, \"list-delivery\");\n const itemKey = subscriptionDeliveryKeyString(item.key);\n\n if (\n subscriptionKeyString(item.key.subscription) === subscriptionKeyString(key) &&\n compareScheduleNames(itemKey, after) > 0\n )\n items.push(item);\n }\n items.sort((a, b) =>\n compareScheduleNames(\n subscriptionDeliveryKeyString(a.key),\n subscriptionDeliveryKeyString(b.key),\n ),\n );\n\n return items.slice(0, limit);\n });\n\n const changeDelivery: SubscriptionStore[\"Service\"][\"changeDelivery\"] = Effect.fn(\n \"MemorySubscriptionStore.changeDelivery\",\n )(function* (inputKey, inputDeliveryId, inputChange) {\n const key = yield* validate(SubscriptionDeliveryKey, inputKey, \"change-delivery-key\");\n const deliveryId = yield* validate(Digest, inputDeliveryId, \"change-delivery-id\");\n const change = yield* validate(DeliveryChange, inputChange, \"change-delivery-change\");\n\n yield* requirePartition(key.subscription, \"change-delivery-partition\");\n yield* failpoint.hit(`subscription:delivery-${change._tag.toLowerCase()}:before`);\n\n const effectiveChange =\n change._tag === \"Prepare\"\n ? { ...change, nowMillis: Math.max(change.nowMillis, yield* Clock.currentTimeMillis) }\n : change;\n\n const result = yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (\n current,\n ): readonly [\n Result.Result<SubscriptionDelivery, SubscriptionError>,\n MemorySubscriptionState,\n ] => {\n const storageKey = subscriptionDeliveryKeyString(key);\n const text = current.deliveries.get(storageKey);\n\n if (text === undefined) return [Result.fail(error(\"not-found\", \"delivery\")), current];\n const decoded = decode(SubscriptionDelivery, text, \"change-delivery-record\");\n\n if (Result.isFailure(decoded)) return [decoded, current];\n\n const registrationText = current.registrations.get(\n subscriptionKeyString(key.subscription),\n );\n\n if (registrationText === undefined)\n return [Result.fail(error(\"corrupt\", \"delivery-registration\")), current];\n\n const registration = decode(\n SubscriptionRecord,\n registrationText,\n \"delivery-registration\",\n );\n\n if (Result.isFailure(registration)) return [Result.fail(registration.failure), current];\n\n const transition = applySubscriptionDeliveryChange(\n decoded.success,\n registration.success,\n deliveryId,\n effectiveChange,\n );\n\n if (Result.isFailure(transition)) return [Result.fail(transition.failure), current];\n if (transition.success === decoded.success)\n return [Result.succeed(decoded.success), current];\n const updated = transition.success;\n const encoded = encode(SubscriptionDelivery, updated, \"change-delivery-encode\");\n\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const deliveries = new Map(current.deliveries);\n\n deliveries.set(storageKey, encoded.success);\n const deliveryIndex = new Map(current.deliveryIndex);\n const indexed = deliveryIndex.get(storageKey);\n\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"delivery-index\")), current];\n deliveryIndex.set(storageKey, {\n ...indexed,\n state: updated.state,\n nextAttemptAtMillis: updated.retry.nextAttemptAtMillis,\n });\n\n return [Result.succeed(updated), { ...current, deliveries, deliveryIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n\n yield* failpoint.hit(`subscription:delivery-${change._tag.toLowerCase()}:after`);\n\n return result;\n });\n\n const recovering: SubscriptionStore[\"Service\"][\"recovering\"] = Effect.fn(\n \"MemorySubscriptionStore.recovering\",\n )(function* (nowMillis, after, limit) {\n const records: Array<{ readonly key: SubscriptionKey; readonly ordinal: number }> = [];\n\n for (const item of (yield* Ref.get(state)).registrationIndex.values()) {\n if (\n item.ordinal > after &&\n item.state === \"active\" &&\n item.recoveryAt !== null &&\n item.recoveryAt <= nowMillis\n )\n records.push({ key: item.key, ordinal: item.ordinal });\n }\n records.sort((a, b) => a.ordinal - b.ordinal);\n\n return records.slice(0, limit);\n });\n\n const deferRecovery: SubscriptionStore[\"Service\"][\"deferRecovery\"] = Effect.fn(\n \"MemorySubscriptionStore.deferRecovery\",\n )(function* (input, recovery) {\n const key = yield* requireKey(input, \"defer-recovery-key\");\n\n yield* failpoint.hit(\"subscription:defer-recovery:before\");\n yield* Effect.uninterruptible(\n Ref.modify(\n state,\n (current): readonly [Result.Result<void, SubscriptionError>, MemorySubscriptionState] => {\n const storageKey = subscriptionKeyString(key);\n const text = current.registrations.get(storageKey);\n\n if (text === undefined) return [Result.fail(error(\"not-found\", \"subscription\")), current];\n const record = decode(SubscriptionRecord, text, \"defer-recovery-record\");\n\n if (Result.isFailure(record)) return [Result.fail(record.failure), current];\n\n const updated = {\n ...record.success,\n recovery: record.success.state === \"active\" ? recovery : null,\n };\n\n const encoded = encode(SubscriptionRecord, updated, \"defer-recovery-encode\");\n\n if (Result.isFailure(encoded)) return [Result.fail(encoded.failure), current];\n const registrations = new Map(current.registrations);\n\n registrations.set(storageKey, encoded.success);\n const registrationIndex = new Map(current.registrationIndex);\n const indexed = registrationIndex.get(storageKey);\n\n if (indexed === undefined)\n return [Result.fail(error(\"corrupt\", \"recovery-index\")), current];\n registrationIndex.set(storageKey, {\n ...indexed,\n recoveryAt: updated.recovery?.nextAttemptAtMillis ?? null,\n });\n\n return [Result.void, { ...current, registrations, registrationIndex }];\n },\n ),\n ).pipe(Effect.flatMap(Effect.fromResult));\n yield* failpoint.hit(\"subscription:defer-recovery:after\");\n });\n\n const readScanCursors: SubscriptionStore[\"Service\"][\"readScanCursors\"] = Ref.get(state).pipe(\n Effect.map((current) => current.scanCursors),\n );\n\n const advanceScanCursors: SubscriptionStore[\"Service\"][\"advanceScanCursors\"] = Effect.fn(\n \"MemorySubscriptionStore.advanceScanCursors\",\n )(function* (input) {\n const cursors = yield* validate(SubscriptionScanCursors, input, \"scan-cursors\");\n\n yield* failpoint.hit(\"subscription:advance-scan-cursors:before\");\n yield* Effect.uninterruptible(\n Ref.update(state, (current) => ({ ...current, scanCursors: cursors })),\n );\n yield* failpoint.hit(\"subscription:advance-scan-cursors:after\");\n });\n\n const nextDeadline = Effect.gen(function* () {\n let deadline: number | null = null;\n const current = yield* Ref.get(state);\n\n if (\n current.scanCursors.events !== \"\" ||\n current.scanCursors.deliveries !== \"\" ||\n current.scanCursors.recovery !== 0\n )\n return 0;\n\n const consider = (value: number) => {\n if (deadline === null || value < deadline) deadline = value;\n };\n\n for (const accepted of current.eventIndex.values())\n if (!accepted.routingComplete) consider(accepted.nextAttemptAtMillis);\n for (const item of current.deliveryIndex.values())\n if (item.state !== \"delivered\" && item.state !== \"refused\")\n consider(item.nextAttemptAtMillis);\n for (const record of current.registrationIndex.values())\n if (record.state === \"active\" && record.recoveryAt !== null) consider(record.recoveryAt);\n\n return deadline;\n }).pipe(Effect.withSpan(\"MemorySubscriptionStore.nextDeadline\"));\n\n return SubscriptionStore.of({\n partition,\n register,\n get,\n list,\n cancel,\n accept,\n event,\n pendingEvents,\n candidates,\n select,\n catchUp,\n deferEvent,\n delivery,\n pendingDeliveries,\n listDeliveries,\n changeDelivery,\n recovering,\n deferRecovery,\n readScanCursors,\n advanceScanCursors,\n nextDeadline,\n });\n});\n\nexport const memorySubscriptionStoreLayer = (\n partition: SourcePartition,\n): Layer.Layer<SubscriptionStore, SubscriptionError> =>\n Layer.effect(SubscriptionStore, makeMemorySubscriptionStore(partition));\n","import { ThreadId } from \"@effect-agent/core\";\nimport {\n type ThreadCheckpoint,\n type ProducerEpoch,\n type RecordId,\n AppendConflict,\n AppendResult,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n CheckpointRejected,\n ThreadExportRequest,\n ThreadExport,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadObservation,\n ThreadRead,\n ThreadStore,\n type ThreadCheckpoints,\n ThreadStoreError,\n ThreadTail,\n ThreadTailRequest,\n digestCanonicalBatch,\n EMPTY_TAIL_DIGEST,\n FenceRejected,\n FencedAppendRequest,\n LoadCheckpointRequest,\n ObservationOffset,\n SaveCheckpointRequest,\n type BatchId,\n type Digest,\n} from \"@effect-agent/thread\";\nimport { Crypto, Effect, Encoding, Layer, Option, PubSub, Ref, Schema, Stream } from \"effect\";\n\nconst MAX_THREADS = 256;\nconst MAX_RECORDS_PER_THREAD = 65_536;\nconst MAX_CHECKPOINTS_PER_THREAD = 1_024;\n\ninterface StoredBatch {\n readonly digest: Digest;\n readonly result: AppendResult;\n}\n\ninterface StoredThread {\n readonly producerEpoch: ProducerEpoch;\n readonly tailSequence: CanonicalSequence;\n readonly tailDigest: Digest;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n readonly recordIds: ReadonlySet<RecordId>;\n readonly batches: ReadonlyMap<BatchId, StoredBatch>;\n readonly tailDigests: ReadonlyMap<CanonicalSequence, Digest>;\n readonly checkpoints: ReadonlyMap<CanonicalSequence, ThreadCheckpoint>;\n}\n\ninterface MemoryState {\n readonly threads: ReadonlyMap<ThreadId, StoredThread>;\n}\n\ntype AppendDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadStoreError | ThreadNotMaterialized | AppendConflict | FenceRejected;\n }\n | {\n readonly _tag: \"success\";\n readonly result: AppendResult;\n readonly records: ReadonlyArray<CanonicalRecordEnvelope>;\n };\n\ntype MaterializeDecision =\n | { readonly _tag: \"failure\"; readonly error: ThreadStoreError | FenceRejected }\n | { readonly _tag: \"success\" };\n\ntype CheckpointDecision =\n | {\n readonly _tag: \"failure\";\n readonly error: ThreadNotMaterialized | ThreadStoreError | CheckpointRejected;\n }\n | { readonly _tag: \"success\" };\n\nconst storeError = (operation: string, message: string, cause?: unknown): ThreadStoreError =>\n cause === undefined\n ? ThreadStoreError.make({ operation, message })\n : ThreadStoreError.make({ operation, message, cause });\n\nconst validate = Effect.fn(\"MemoryThreadStore.validate\")(\n <A, I>(\n schema: Schema.Codec<A, I>,\n operation: string,\n value: unknown,\n ): Effect.Effect<A, ThreadStoreError> =>\n Schema.encodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(schema)),\n Effect.mapError((error) => storeError(operation, `Invalid ${operation} request`, error)),\n ),\n);\n\nconst decodeCanonicalSequence = Schema.decodeSync(CanonicalSequence);\nconst ZERO_CANONICAL_SEQUENCE = decodeCanonicalSequence(0);\n\nconst offsetSequence = Effect.fn(\"MemoryThreadStore.offsetSequence\")((\n threadId: ThreadId,\n offset: ObservationOffset | undefined,\n): Effect.Effect<CanonicalSequence, ThreadStoreError> => {\n if (offset === undefined) return Effect.succeed(ZERO_CANONICAL_SEQUENCE);\n const prefix = `memory:v1:${Encoding.encodeBase64(threadId)}:`;\n const encodedSequence = offset.startsWith(prefix) ? offset.slice(prefix.length) : \"\";\n\n if (!/^\\d+$/.test(encodedSequence)) {\n return Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n }\n const sequence = Number(encodedSequence);\n\n return Number.isSafeInteger(sequence)\n ? Schema.decodeUnknownEffect(CanonicalSequence)(sequence).pipe(\n Effect.mapError(() => storeError(\"observe\", \"Malformed observation offset\")),\n )\n : Effect.fail(storeError(\"observe\", \"Malformed observation offset\"));\n});\n\nconst observationOffset = (threadId: ThreadId, sequence: CanonicalSequence): ObservationOffset =>\n Schema.decodeSync(ObservationOffset)(`memory:v1:${Encoding.encodeBase64(threadId)}:${sequence}`);\n\nconst findThread = Effect.fn(\"MemoryThreadStore.findThread\")((\n state: MemoryState,\n threadId: ThreadId,\n): Effect.Effect<StoredThread, ThreadNotMaterialized> => {\n const thread = state.threads.get(threadId);\n\n return thread === undefined\n ? Effect.fail(ThreadNotMaterialized.make({ threadId }))\n : Effect.succeed(thread);\n});\n\nconst CheckpointVersionEnvelope = Schema.Struct({\n checkpoint: Schema.Struct({\n threadId: ThreadId,\n schemaVersion: Schema.Natural,\n }),\n});\n\nconst validateCheckpointVersion = Effect.fn(\"MemoryThreadStore.validateCheckpointVersion\")(\n function* (value: unknown): Effect.fn.Return<void, ThreadStoreError | CheckpointRejected> {\n const envelope = yield* Schema.decodeUnknownEffect(CheckpointVersionEnvelope)(value).pipe(\n Effect.mapError(() => storeError(\"saveCheckpoint\", \"Invalid saveCheckpoint request\")),\n );\n\n if (envelope.checkpoint.schemaVersion !== 1) {\n return yield* CheckpointRejected.make({\n threadId: envelope.checkpoint.threadId,\n reason: \"unsupported-version\",\n });\n }\n },\n);\n\nconst makeThreadStore = Effect.gen(function* () {\n const crypto = yield* Crypto.Crypto;\n const state = yield* Ref.make<MemoryState>({ threads: new Map() });\n const updates = yield* PubSub.sliding<void>(1);\n\n yield* Effect.addFinalizer(() => PubSub.shutdown(updates));\n\n const materialize: ThreadStore[\"Service\"][\"materialize\"] = Effect.fn(\n \"MemoryThreadStore.materialize\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ThreadMaterialization, \"materialize\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [MaterializeDecision, MemoryState] => {\n const existing = current.threads.get(request.threadId);\n\n if (existing !== undefined) {\n if (request.producerEpoch < existing.producerEpoch) {\n return [\n {\n _tag: \"failure\",\n error: FenceRejected.make({\n threadId: request.threadId,\n actualEpoch: existing.producerEpoch,\n attemptedEpoch: request.producerEpoch,\n }),\n },\n current,\n ];\n }\n if (request.producerEpoch === existing.producerEpoch) {\n return [{ _tag: \"success\" }, current];\n }\n const threads = new Map(current.threads);\n\n threads.set(request.threadId, {\n ...existing,\n producerEpoch: request.producerEpoch,\n });\n\n return [{ _tag: \"success\" }, { threads }];\n }\n if (current.threads.size >= MAX_THREADS) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\"materialize\", `In-memory thread limit ${MAX_THREADS} exceeded`),\n },\n current,\n ];\n }\n const threads = new Map(current.threads);\n\n threads.set(request.threadId, {\n producerEpoch: request.producerEpoch,\n tailSequence: ZERO_CANONICAL_SEQUENCE,\n tailDigest: EMPTY_TAIL_DIGEST,\n records: [],\n recordIds: new Set(),\n batches: new Map(),\n tailDigests: new Map([[ZERO_CANONICAL_SEQUENCE, EMPTY_TAIL_DIGEST]]),\n checkpoints: new Map(),\n });\n\n return [{ _tag: \"success\" }, { threads }];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const append: ThreadStore[\"Service\"][\"append\"] = Effect.fn(\"MemoryThreadStore.append\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(FencedAppendRequest, \"append\", unvalidated);\n\n const digest = yield* digestCanonicalBatch(request.expectedTailDigest, request.batch).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n Effect.mapError((error) => storeError(\"append\", error.message, error)),\n );\n\n const decision = yield* Effect.uninterruptible(\n Ref.modify(state, (current): readonly [AppendDecision, MemoryState] => {\n const thread = current.threads.get(request.threadId);\n\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: request.threadId,\n }),\n },\n current,\n ];\n }\n if (request.producerEpoch !== thread.producerEpoch) {\n return [\n {\n _tag: \"failure\",\n error: FenceRejected.make({\n threadId: request.threadId,\n actualEpoch: thread.producerEpoch,\n attemptedEpoch: request.producerEpoch,\n }),\n },\n current,\n ];\n }\n const previous = thread.batches.get(request.batch.batchId);\n\n if (previous !== undefined) {\n if (previous.digest !== digest) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"batch-digest\",\n }),\n },\n current,\n ];\n }\n\n return [\n {\n _tag: \"success\",\n result: AppendResult.make({\n firstSequence: previous.result.firstSequence,\n lastSequence: previous.result.lastSequence,\n tailDigest: previous.result.tailDigest,\n replayed: true,\n }),\n records: [],\n },\n current,\n ];\n }\n if (\n request.expectedTailSequence !== thread.tailSequence ||\n request.expectedTailDigest !== thread.tailDigest\n ) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"tail\",\n actualTailSequence: thread.tailSequence,\n actualTailDigest: thread.tailDigest,\n }),\n },\n current,\n ];\n }\n if (thread.records.length + request.batch.records.length > MAX_RECORDS_PER_THREAD) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\n \"append\",\n `In-memory record limit ${MAX_RECORDS_PER_THREAD} exceeded`,\n ),\n },\n current,\n ];\n }\n\n const batchRecordIds = new Set<RecordId>();\n\n for (const record of request.batch.records) {\n if (thread.recordIds.has(record.recordId) || batchRecordIds.has(record.recordId)) {\n return [\n {\n _tag: \"failure\",\n error: AppendConflict.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n reason: \"record-identity\",\n }),\n },\n current,\n ];\n }\n batchRecordIds.add(record.recordId);\n }\n\n const records = request.batch.records.map((record, index) => {\n const sequence = decodeCanonicalSequence(thread.tailSequence + index + 1);\n\n return CanonicalRecordEnvelope.make({\n threadId: request.threadId,\n batchId: request.batch.batchId,\n sequence,\n offset: observationOffset(request.threadId, sequence),\n record,\n });\n });\n\n const lastSequence = decodeCanonicalSequence(thread.tailSequence + records.length);\n\n const result = AppendResult.make({\n firstSequence: decodeCanonicalSequence(thread.tailSequence + 1),\n lastSequence,\n tailDigest: digest,\n replayed: false,\n });\n\n const batches = new Map(thread.batches);\n\n batches.set(request.batch.batchId, { digest, result });\n const recordIds = new Set(thread.recordIds);\n\n for (const recordId of batchRecordIds) recordIds.add(recordId);\n const tailDigests = new Map(thread.tailDigests);\n\n tailDigests.set(lastSequence, digest);\n const threads = new Map(current.threads);\n\n threads.set(request.threadId, {\n ...thread,\n tailSequence: lastSequence,\n tailDigest: digest,\n records: [...thread.records, ...records],\n recordIds,\n batches,\n tailDigests,\n });\n\n return [{ _tag: \"success\", result, records }, { threads }];\n }).pipe(\n Effect.tap((decision) =>\n decision._tag === \"success\" && decision.records.length > 0\n ? PubSub.publish(updates, undefined)\n : Effect.void,\n ),\n ),\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n\n return decision.result;\n }),\n );\n\n const readSnapshot = Effect.fn(\"MemoryThreadStore.readSnapshot\")(\n (threadId: ThreadId, afterSequence: CanonicalSequence | undefined, limit: number) =>\n Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, threadId)),\n Effect.map((thread) =>\n thread.records\n .filter((record) => record.sequence > (afterSequence ?? ZERO_CANONICAL_SEQUENCE))\n .slice(0, limit),\n ),\n ),\n );\n\n const read: ThreadStore[\"Service\"][\"read\"] = (unvalidated) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadRead, \"read\", unvalidated);\n const records = yield* readSnapshot(request.threadId, request.afterSequence, request.limit);\n\n return Stream.fromIterable(records);\n }),\n );\n\n const observe: ThreadStore[\"Service\"][\"observe\"] = (unvalidated) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const request = yield* validate(ThreadObservation, \"observe\", unvalidated);\n const afterSequence = yield* offsetSequence(request.threadId, request.afterOffset);\n\n return Stream.unwrap(\n Effect.gen(function* () {\n const subscription = yield* PubSub.subscribe(updates);\n\n const initial = yield* readSnapshot(\n request.threadId,\n afterSequence,\n MAX_RECORDS_PER_THREAD,\n );\n\n const highWater =\n initial.length === 0 ? afterSequence : (initial.at(-1)?.sequence ?? afterSequence);\n\n const live = Stream.fromEffectRepeat(PubSub.take(subscription)).pipe(\n Stream.mapAccumEffect(\n () => highWater,\n (lastSequence) =>\n readSnapshot(request.threadId, lastSequence, MAX_RECORDS_PER_THREAD).pipe(\n Effect.map(\n (records) => [records.at(-1)?.sequence ?? lastSequence, records] as const,\n ),\n ),\n ),\n );\n\n return Stream.fromIterable(initial).pipe(Stream.concat(live));\n }),\n );\n }),\n );\n\n const exportThread: ThreadStore[\"Service\"][\"export\"] = Effect.fn(\"MemoryThreadStore.export\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ThreadExportRequest, \"export\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n return ThreadExport.make({\n format: \"effect-agent/thread@1\",\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n tailDigest: thread.tailDigest,\n records: thread.records,\n });\n }),\n );\n\n const inspectTail: ThreadStore[\"Service\"][\"inspectTail\"] = Effect.fn(\n \"MemoryThreadStore.inspectTail\",\n )((unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(ThreadTailRequest, \"inspectTail\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n return ThreadTail.make({\n threadId: request.threadId,\n tailSequence: thread.tailSequence,\n tailDigest: thread.tailDigest,\n producerEpoch: thread.producerEpoch,\n });\n }),\n );\n\n const saveCheckpoint: ThreadCheckpoints[\"save\"] = Effect.fn(\"MemoryThreadStore.saveCheckpoint\")(\n (unvalidated) =>\n Effect.gen(function* () {\n yield* validateCheckpointVersion(unvalidated);\n const request = yield* validate(SaveCheckpointRequest, \"saveCheckpoint\", unvalidated);\n\n const decision = yield* Ref.modify(\n state,\n (current): readonly [CheckpointDecision, MemoryState] => {\n const checkpoint = request.checkpoint;\n const thread = current.threads.get(checkpoint.threadId);\n\n if (thread === undefined) {\n return [\n {\n _tag: \"failure\",\n error: ThreadNotMaterialized.make({\n threadId: checkpoint.threadId,\n }),\n },\n current,\n ];\n }\n if (checkpoint.throughSequence > thread.tailSequence) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"ahead-of-tail\",\n }),\n },\n current,\n ];\n }\n if (thread.tailDigests.get(checkpoint.throughSequence) !== checkpoint.tailDigest) {\n return [\n {\n _tag: \"failure\",\n error: CheckpointRejected.make({\n threadId: checkpoint.threadId,\n reason: \"digest-mismatch\",\n }),\n },\n current,\n ];\n }\n if (\n !thread.checkpoints.has(checkpoint.throughSequence) &&\n thread.checkpoints.size >= MAX_CHECKPOINTS_PER_THREAD\n ) {\n return [\n {\n _tag: \"failure\",\n error: storeError(\n \"saveCheckpoint\",\n `In-memory checkpoint limit ${MAX_CHECKPOINTS_PER_THREAD} exceeded`,\n ),\n },\n current,\n ];\n }\n const checkpoints = new Map(thread.checkpoints);\n\n checkpoints.set(checkpoint.throughSequence, checkpoint);\n const threads = new Map(current.threads);\n\n threads.set(checkpoint.threadId, { ...thread, checkpoints });\n\n return [{ _tag: \"success\" }, { threads }];\n },\n );\n\n if (decision._tag === \"failure\") return yield* decision.error;\n }),\n );\n\n const loadCheckpoint: ThreadCheckpoints[\"load\"] = Effect.fn(\"MemoryThreadStore.loadCheckpoint\")(\n (unvalidated) =>\n Effect.gen(function* () {\n const request = yield* validate(LoadCheckpointRequest, \"loadCheckpoint\", unvalidated);\n\n const thread = yield* Ref.get(state).pipe(\n Effect.flatMap((current) => findThread(current, request.threadId)),\n );\n\n const maximum = request.atOrBeforeSequence ?? thread.tailSequence;\n let selected: ThreadCheckpoint | undefined;\n\n for (const [sequence, checkpoint] of thread.checkpoints) {\n if (\n sequence <= maximum &&\n (selected === undefined || sequence > selected.throughSequence)\n ) {\n selected = checkpoint;\n }\n }\n if (\n selected !== undefined &&\n thread.tailDigests.get(selected.throughSequence) !== selected.tailDigest\n ) {\n return yield* CheckpointRejected.make({\n threadId: request.threadId,\n reason: \"digest-mismatch\",\n });\n }\n\n return Option.fromNullishOr(selected);\n }),\n );\n\n return ThreadStore.of({\n materialize,\n append,\n read,\n observe,\n export: exportThread,\n inspectTail,\n checkpoints: { save: saveCheckpoint, load: loadCheckpoint },\n });\n});\n\nexport const MemoryThreadStoreLive = Layer.effect(ThreadStore, makeThreadStore);\n\n/**\n * In-memory canonical Thread persistence. Durable accepted work is served by the separate\n * SubmissionLedger port; this Layer deliberately provides only the ThreadStore.\n */\nexport const MemoryStorageLive = MemoryThreadStoreLive;\n","import {\n MemoryIndexCandidate,\n MemoryIndexError,\n MemoryIndexQuery,\n MemoryIndexReplacement,\n MemoryIndexSearch,\n MemoryIndexSource,\n MemoryKey,\n SemanticMemoryChunk,\n SemanticMemoryIndex,\n SemanticMemoryProfile,\n} from \"@effect-agent/core\";\nimport { Clock, Effect, Encoding, Layer, Ref, Schema } from \"effect\";\n\nconst PositiveCapacity = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65_536 }));\nconst MaxStoredVectorComponents = 16_777_216;\n\n/**\n * Hard per-Layer bounds for disposable semantic index state. maxChunks times profile dimensions\n * must not exceed 16,777,216 vector components. maxSourceBytes bounds the aggregate UTF-8 JSON\n * of retained source identities and defaults to 16 MiB; it is not a general heap limit.\n */\nexport class InMemorySemanticIndexCapacity extends Schema.Class<InMemorySemanticIndexCapacity>(\n \"@effect-agent/storage-memory/InMemorySemanticIndexCapacity\",\n)({\n maxSources: PositiveCapacity,\n maxChunks: PositiveCapacity,\n maxSourceBytes: Schema.optionalKey(\n Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 67_108_864 })),\n ),\n}) {}\n\ntype StoredEntry = {\n readonly source: MemoryIndexSource;\n readonly sourceBytes: number;\n} & (\n | {\n readonly _tag: \"Indexed\";\n readonly chunks: ReadonlyArray<SemanticMemoryChunk>;\n readonly indexedAt: number;\n }\n | { readonly _tag: \"Withdrawn\" }\n);\n\ninterface IndexData {\n readonly closed: boolean;\n readonly entries: ReadonlyMap<string, StoredEntry>;\n readonly sourceBytes: number;\n}\n\nconst sameProfile = Schema.toEquivalence(SemanticMemoryProfile);\nconst sameSource = Schema.toEquivalence(MemoryIndexSource.Wire);\n\nconst error = (operation: string, reason: MemoryIndexError[\"reason\"]): MemoryIndexError =>\n MemoryIndexError.make({ operation, reason });\n\nconst keyString = (key: MemoryKey): string => JSON.stringify([key.namespace.address, key.id]);\n\nconst sourceIdentityBytes = (source: MemoryIndexSource): number =>\n Encoding.encodeHex(JSON.stringify(source)).length / 2;\n\nconst decodeBoundary = Effect.fn(\"InMemorySemanticIndex.decodeBoundary\")(function* <A, I>(\n schema: Schema.Codec<A, I, never>,\n value: unknown,\n operation: string,\n): Effect.fn.Return<A, MemoryIndexError> {\n return yield* Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.flatMap((decoded) => Schema.encodeEffect(schema)(decoded).pipe(Effect.as(decoded))),\n Effect.mapError(() => error(operation, \"invalid-input\")),\n );\n});\n\nconst freezeSource = (source: MemoryIndexSource): MemoryIndexSource =>\n Object.freeze(\n MemoryIndexSource.make({\n key: Object.freeze(\n MemoryKey.make({\n ...source.key,\n namespace: Object.freeze({ address: source.key.namespace.address }),\n }),\n ),\n source: Object.freeze({ ...source.source }),\n sourceGeneration: source.sourceGeneration,\n }),\n );\n\nconst freezeChunk = (chunk: SemanticMemoryChunk): SemanticMemoryChunk =>\n Object.freeze(SemanticMemoryChunk.make({ ...chunk, vector: Object.freeze([...chunk.vector]) }));\n\nconst sourceIsFenced = (source: MemoryIndexSource, existing: StoredEntry): boolean =>\n source.sourceGeneration < existing.source.sourceGeneration ||\n (source.sourceGeneration === existing.source.sourceGeneration &&\n !sameSource(source, existing.source));\n\nconst squaredNorm = (vector: ReadonlyArray<number>): number | null => {\n let sum = 0;\n\n for (const value of vector) {\n sum += value * value;\n if (!Number.isFinite(sum)) return null;\n }\n\n return sum > 0 ? sum : null;\n};\n\nconst validVector = (vector: ReadonlyArray<number>, profile: SemanticMemoryProfile): boolean =>\n vector.length === profile.dimensions && squaredNorm(vector) !== null;\n\nconst validateChunks = Effect.fn(\"InMemorySemanticIndex.validateChunks\")(function* (\n chunks: ReadonlyArray<SemanticMemoryChunk>,\n profile: SemanticMemoryProfile,\n operation: string,\n): Effect.fn.Return<void, MemoryIndexError> {\n let nextByte = 0;\n const passageIds = new Set<string>();\n\n for (let index = 0; index < chunks.length; index++) {\n const chunk = chunks[index];\n const byteLength = Encoding.encodeHex(chunk.text).length / 2;\n\n if (\n chunk.ordinal !== index ||\n chunk.startByte !== nextByte ||\n chunk.endByte <= chunk.startByte ||\n chunk.endByte - chunk.startByte !== byteLength ||\n byteLength > profile.maxChunkBytes ||\n passageIds.has(chunk.passageId) ||\n !validVector(chunk.vector, profile)\n ) {\n return yield* error(operation, \"invalid-input\");\n }\n passageIds.add(chunk.passageId);\n nextByte = chunk.endByte;\n }\n});\n\nconst cosine = (left: ReadonlyArray<number>, right: ReadonlyArray<number>): number => {\n const leftNorm = Math.sqrt(squaredNorm(left) ?? 1);\n const rightNorm = Math.sqrt(squaredNorm(right) ?? 1);\n let score = 0;\n\n for (let index = 0; index < left.length; index++) {\n score += (left[index] / leftNorm) * (right[index] / rightNorm);\n }\n const bounded = Math.max(-1, Math.min(1, score));\n\n return bounded === 0 ? 0 : bounded;\n};\n\nconst compareText = (left: string, right: string): number =>\n left < right ? -1 : left > right ? 1 : 0;\n\nconst makeIndex = Effect.fn(\"InMemorySemanticIndex.make\")(function* (\n rawProfile: SemanticMemoryProfile,\n rawCapacity: InMemorySemanticIndexCapacity,\n) {\n const profile = Object.freeze(\n SemanticMemoryProfile.make({\n ...(yield* decodeBoundary(\n SemanticMemoryProfile,\n rawProfile,\n \"configure semantic memory index\",\n )),\n }),\n );\n\n const capacity = yield* decodeBoundary(\n InMemorySemanticIndexCapacity,\n rawCapacity,\n \"configure semantic memory index\",\n );\n\n if (capacity.maxChunks * profile.dimensions > MaxStoredVectorComponents) {\n return yield* error(\"configure semantic memory index\", \"invalid-input\");\n }\n const maxSourceBytes = capacity.maxSourceBytes ?? 16_777_216;\n const data = yield* Ref.make<IndexData>({ closed: false, entries: new Map(), sourceBytes: 0 });\n\n yield* Effect.addFinalizer(() =>\n Ref.set(data, { closed: true, entries: new Map(), sourceBytes: 0 }),\n );\n\n const ensureOpen = Effect.fn(\"InMemorySemanticIndex.ensureOpen\")(function* (operation: string) {\n if ((yield* Ref.get(data)).closed) return yield* error(operation, \"unavailable\");\n });\n\n const replace: SemanticMemoryIndex[\"Service\"][\"replace\"] = Effect.fn(\n \"InMemorySemanticIndex.replace\",\n )(function* (rawRequest) {\n const operation = \"replace semantic memory source\";\n\n yield* ensureOpen(operation);\n const request = yield* decodeBoundary(MemoryIndexReplacement.Wire, rawRequest, operation);\n const source = freezeSource(request.source);\n const sourceBytes = sourceIdentityBytes(source);\n const chunks = Object.freeze(request.chunks.map(freezeChunk));\n\n if (source.source.id !== source.key.id) return yield* error(operation, \"invalid-input\");\n if (!sameProfile(request.profile, profile)) return yield* error(operation, \"incompatible\");\n yield* validateChunks(chunks, profile, operation);\n const indexedAt = yield* Clock.currentTimeMillis;\n\n const failure = yield* Ref.modify(\n data,\n (current): readonly [MemoryIndexError | undefined, IndexData] => {\n if (current.closed) return [error(operation, \"unavailable\"), current];\n const id = keyString(source.key);\n const existing = current.entries.get(id);\n\n if (\n existing !== undefined &&\n (existing._tag === \"Withdrawn\" || sourceIsFenced(source, existing))\n ) {\n return [error(operation, \"fenced\"), current];\n }\n if (existing === undefined && current.entries.size >= capacity.maxSources) {\n return [error(operation, \"budget\"), current];\n }\n const nextSourceBytes = current.sourceBytes - (existing?.sourceBytes ?? 0) + sourceBytes;\n\n if (nextSourceBytes > maxSourceBytes) return [error(operation, \"budget\"), current];\n let count = chunks.length;\n\n for (const [entryId, entry] of current.entries) {\n if (entryId !== id && entry._tag === \"Indexed\") count += entry.chunks.length;\n }\n if (count > capacity.maxChunks) return [error(operation, \"budget\"), current];\n const entries = new Map(current.entries);\n\n entries.set(id, { _tag: \"Indexed\", source, sourceBytes, chunks, indexedAt });\n\n return [undefined, { ...current, entries, sourceBytes: nextSourceBytes }];\n },\n );\n\n if (failure !== undefined) return yield* failure;\n });\n\n const withdraw: SemanticMemoryIndex[\"Service\"][\"withdraw\"] = Effect.fn(\n \"InMemorySemanticIndex.withdraw\",\n )(function* (rawSource) {\n const operation = \"withdraw semantic memory source\";\n\n yield* ensureOpen(operation);\n\n const source = freezeSource(\n yield* decodeBoundary(MemoryIndexSource.Wire, rawSource, operation),\n );\n\n const sourceBytes = sourceIdentityBytes(source);\n\n if (source.source.id !== source.key.id) return yield* error(operation, \"invalid-input\");\n\n const failure = yield* Ref.modify(\n data,\n (current): readonly [MemoryIndexError | undefined, IndexData] => {\n if (current.closed) return [error(operation, \"unavailable\"), current];\n const id = keyString(source.key);\n const existing = current.entries.get(id);\n\n if (existing !== undefined) {\n if (existing._tag === \"Withdrawn\") {\n return [\n sameSource(source, existing.source) ? undefined : error(operation, \"fenced\"),\n current,\n ];\n }\n if (sourceIsFenced(source, existing)) return [error(operation, \"fenced\"), current];\n } else if (current.entries.size >= capacity.maxSources) {\n return [error(operation, \"budget\"), current];\n }\n const nextSourceBytes = current.sourceBytes - (existing?.sourceBytes ?? 0) + sourceBytes;\n\n if (nextSourceBytes > maxSourceBytes) return [error(operation, \"budget\"), current];\n const entries = new Map(current.entries);\n\n entries.set(id, { _tag: \"Withdrawn\", source, sourceBytes });\n\n return [undefined, { ...current, entries, sourceBytes: nextSourceBytes }];\n },\n );\n\n if (failure !== undefined) return yield* failure;\n });\n\n const search = Effect.fn(\"InMemorySemanticIndex.search\")(function* (rawQuery: MemoryIndexQuery) {\n const operation = \"search semantic memory index\";\n\n yield* ensureOpen(operation);\n const query = yield* decodeBoundary(MemoryIndexQuery.Wire, rawQuery, operation);\n const vector = Object.freeze([...query.vector]);\n\n if (!validVector(vector, profile)) return yield* error(operation, \"invalid-input\");\n const current = yield* Ref.get(data);\n\n if (current.closed) return yield* error(operation, \"unavailable\");\n let scannedChunks = 0;\n let inspectedSources = 0;\n const candidates: Array<MemoryIndexCandidate> = [];\n\n for (const entry of current.entries.values()) {\n inspectedSources += 1;\n if (inspectedSources % 128 === 0) yield* Effect.yieldNow;\n if (\n entry.source.key.namespace.address !== query.namespace.address ||\n entry._tag !== \"Indexed\"\n )\n continue;\n scannedChunks += entry.chunks.length;\n if (scannedChunks > query.maxScannedChunks) return yield* error(operation, \"budget\");\n }\n for (const entry of current.entries.values()) {\n if (\n entry.source.key.namespace.address !== query.namespace.address ||\n entry._tag !== \"Indexed\"\n )\n continue;\n yield* Effect.yieldNow;\n for (const chunk of entry.chunks) {\n const score = cosine(vector, chunk.vector);\n\n if (score < query.minScore) continue;\n candidates.push(\n MemoryIndexCandidate.make({\n ...entry.source,\n passageId: chunk.passageId,\n ordinal: chunk.ordinal,\n startByte: chunk.startByte,\n endByte: chunk.endByte,\n text: chunk.text,\n score,\n indexedAt: entry.indexedAt,\n }),\n );\n }\n }\n candidates.sort(\n (left, right) =>\n right.score - left.score ||\n compareText(left.key.id, right.key.id) ||\n compareText(left.source.revision, right.source.revision) ||\n left.ordinal - right.ordinal,\n );\n yield* ensureOpen(operation);\n\n return MemoryIndexSearch.make({ candidates: candidates.slice(0, query.limit), scannedChunks });\n });\n\n return SemanticMemoryIndex.fromAdapter({ profile, replace, withdraw, search });\n});\n\n/** Scoped disposable semantic index. No persistent build or recovery state is retained. */\nexport const inMemorySemanticIndexLayer = (\n profile: SemanticMemoryProfile,\n capacity: InMemorySemanticIndexCapacity,\n): Layer.Layer<SemanticMemoryIndex, MemoryIndexError> =>\n Layer.effect(SemanticMemoryIndex, makeIndex(profile, capacity));\n"],"mappings":"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"}
|