@yielded/agent 0.1.0-beta.174 → 0.1.0-beta.175
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/{Admin-BHmp2V9p.d.mts → Admin-Qa3I1oA5.d.mts} +38 -7
- package/dist/{AgentRuntime-BD3ZHAMq.d.mts → AgentRuntime-CHDyRbSf.d.mts} +3 -3
- package/dist/{AgentRuntime-B6qZlD3f.mjs → AgentRuntime-DaDKMasp.mjs} +123 -114
- package/dist/AgentRuntime-DaDKMasp.mjs.map +1 -0
- package/dist/{Digest-EpeqWEdv.mjs → Digest-C3EODOee.mjs} +2 -2
- package/dist/{Digest-EpeqWEdv.mjs.map → Digest-C3EODOee.mjs.map} +1 -1
- package/dist/{DurableAgentRuntime-CBBjRNJN.mjs → DurableAgentRuntime-CPlw5_7e.mjs} +161 -85
- package/dist/DurableAgentRuntime-CPlw5_7e.mjs.map +1 -0
- package/dist/{EventSource-C9aaJaXT.d.mts → EventSource-BTu68yDW.d.mts} +2 -2
- package/dist/InMemory.d.mts +2 -2
- package/dist/{MessageDelivery-BGDm-c46.d.mts → MessageDelivery-DjAZJ4Fd.d.mts} +4 -4
- package/dist/{MessagingHost-CRUK4JBi.mjs → MessagingHost-CZCyrnvJ.mjs} +27 -26
- package/dist/MessagingHost-CZCyrnvJ.mjs.map +1 -0
- package/dist/{PreparedInputAdmission-BvDqlgiP.d.mts → PreparedInputAdmission-wgY4JMZY.d.mts} +3 -3
- package/dist/{Records-BiuJDWNe.mjs → Records-DzL4Kbtw.mjs} +2 -2
- package/dist/{Records-BiuJDWNe.mjs.map → Records-DzL4Kbtw.mjs.map} +1 -1
- package/dist/{RunContinuation-CTJ1jGrO.d.mts → RunContinuation-3jB5pULC.d.mts} +10 -4
- package/dist/{RunContinuation-4ZATcVLB.mjs → RunContinuation-BiyKJK32.mjs} +74 -40
- package/dist/RunContinuation-BiyKJK32.mjs.map +1 -0
- package/dist/{RunJournal-CNZqA3Ge.mjs → RunJournal-CPMKcfd0.mjs} +84 -79
- package/dist/RunJournal-CPMKcfd0.mjs.map +1 -0
- package/dist/{RunStorage-BHjuuERI.mjs → RunStorage-CzutHJBE.mjs} +3 -2
- package/dist/RunStorage-CzutHJBE.mjs.map +1 -0
- package/dist/{Scheduling-NG8slKdI.mjs → Scheduling-07_dsGED.mjs} +3 -3
- package/dist/{Scheduling-NG8slKdI.mjs.map → Scheduling-07_dsGED.mjs.map} +1 -1
- package/dist/{Subagent-CTIpnzlB.mjs → Subagent-CexndZSp.mjs} +2 -2
- package/dist/{Subagent-CTIpnzlB.mjs.map → Subagent-CexndZSp.mjs.map} +1 -1
- package/dist/{Subagent-DKhZA72u.d.mts → Subagent-xhN_aD1r.d.mts} +3 -3
- package/dist/{Subscription-BNg9VCRl.d.mts → Subscription-DmIHlOJK.d.mts} +2 -2
- package/dist/{SubscriptionInput-BUoXv-_K.d.mts → SubscriptionInput-DgcQhvbe.d.mts} +2 -2
- package/dist/{Thread-dk-QiNml.d.mts → Thread-DzdJAY4J.d.mts} +4 -3
- package/dist/{ThreadHistory-ByxS8HU1.d.mts → ThreadHistory-KPPBJLJb.d.mts} +12 -2
- package/dist/{ThreadImport-CodYoJoa.mjs → ThreadImport-CjlG57vH.mjs} +8 -8
- package/dist/{ThreadImport-CodYoJoa.mjs.map → ThreadImport-CjlG57vH.mjs.map} +1 -1
- package/dist/{ThreadImport-CMgzttvr.d.mts → ThreadImport-DP-vOk2F.d.mts} +4 -4
- package/dist/{ThreadStore-59uDGXul.mjs → ThreadStore-EuUilthA.mjs} +5 -7
- package/dist/ThreadStore-EuUilthA.mjs.map +1 -0
- package/dist/{ThreadTransfer-3jigUl3g.mjs → ThreadTransfer-DB_zsrtJ.mjs} +4 -4
- package/dist/{ThreadTransfer-3jigUl3g.mjs.map → ThreadTransfer-DB_zsrtJ.mjs.map} +1 -1
- package/dist/{WorkerAdmission-DDYJdOsU.mjs → WorkerAdmission-eBeXt_mu.mjs} +5 -5
- package/dist/{WorkerAdmission-DDYJdOsU.mjs.map → WorkerAdmission-eBeXt_mu.mjs.map} +1 -1
- package/dist/{agent-registration-DRbyhAu-.mjs → agent-registration-a6QYaG3h.mjs} +4 -4
- package/dist/{agent-registration-DRbyhAu-.mjs.map → agent-registration-a6QYaG3h.mjs.map} +1 -1
- package/dist/capabilities/Messaging.mjs +1 -1
- package/dist/capabilities/ModelContext.d.mts +1 -1
- package/dist/capabilities/RunHooks.d.mts +1 -1
- package/dist/capabilities/Subagent.d.mts +1 -1
- package/dist/capabilities/Subagent.mjs +1 -1
- package/dist/core/Thread.d.mts +2 -2
- package/dist/core/Thread.mjs +5 -3
- package/dist/core/Thread.mjs.map +1 -1
- package/dist/durable/ActivityStore.mjs +1 -1
- package/dist/durable/Admin.d.mts +1 -1
- package/dist/durable/Admin.mjs +1 -1
- package/dist/durable/AgentRegistration.d.mts +1 -1
- package/dist/durable/AgentRegistration.mjs +1 -1
- package/dist/durable/Certification.d.mts +1 -1
- package/dist/durable/CommittedActivity.d.mts +1 -1
- package/dist/durable/CommittedActivity.mjs +3 -3
- package/dist/durable/Digest.mjs +1 -1
- package/dist/durable/DurableAgentRuntime.d.mts +1 -1
- package/dist/durable/DurableAgentRuntime.mjs +2 -2
- package/dist/durable/EventSource.d.mts +1 -1
- package/dist/durable/EventSource.mjs +1 -1
- package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
- package/dist/durable/LifecyclePublication.d.mts +1 -1
- package/dist/durable/LifecyclePublication.mjs +2 -2
- package/dist/durable/MessageDelivery.d.mts +1 -1
- package/dist/durable/MessageDelivery.mjs +2 -2
- package/dist/durable/MessageDeliveryStoreConformance.d.mts +40 -40
- package/dist/durable/MessageDeliveryStoreConformance.mjs +2 -2
- package/dist/durable/PersistentHistory.d.mts +2 -2
- package/dist/durable/PersistentHistory.mjs +4 -4
- package/dist/durable/PreparedInputAdmission.d.mts +1 -1
- package/dist/durable/RecordFormat.mjs +1 -1
- package/dist/durable/Records.mjs +1 -1
- package/dist/durable/Recovery.d.mts +1 -1
- package/dist/durable/Recovery.mjs +1 -1
- package/dist/durable/RunContinuation.d.mts +2 -2
- package/dist/durable/RunContinuation.mjs +3 -3
- package/dist/durable/RunJournal.d.mts +2 -2
- package/dist/durable/RunJournal.mjs +2 -2
- package/dist/durable/RunStorage.d.mts +1 -1
- package/dist/durable/RunStorage.mjs +1 -1
- package/dist/durable/Schedule.mjs +1 -1
- package/dist/durable/ScheduleStoreConformance.mjs +1 -1
- package/dist/durable/ScheduleTransition.mjs +1 -1
- package/dist/durable/Scheduling.d.mts +1 -1
- package/dist/durable/Scheduling.mjs +1 -1
- package/dist/durable/SettlementPublisher.d.mts +1 -1
- package/dist/durable/SettlementPublisher.mjs +3 -3
- package/dist/durable/SqlMemoryStore.mjs +5 -3
- package/dist/durable/SqlMemoryStore.mjs.map +1 -1
- package/dist/durable/SubmissionLedger.d.mts +1 -1
- package/dist/durable/SubmissionLedger.mjs +7 -3
- package/dist/durable/SubmissionLedger.mjs.map +1 -1
- package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
- package/dist/durable/SubmissionLedgerConformance.mjs +6 -6
- package/dist/durable/SubmissionStatus.d.mts +1 -1
- package/dist/durable/Subscription.d.mts +1 -1
- package/dist/durable/Subscription.mjs +2 -2
- package/dist/durable/SubscriptionInput.d.mts +1 -1
- package/dist/durable/SubscriptionInput.mjs +2 -2
- package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
- package/dist/durable/SubscriptionStoreConformance.mjs +1 -1
- package/dist/durable/SubscriptionTools.d.mts +2 -2
- package/dist/durable/SubscriptionTransition.d.mts +1 -1
- package/dist/durable/SubscriptionTransition.mjs +1 -1
- package/dist/durable/Subscriptions.d.mts +5 -5
- package/dist/durable/Subscriptions.mjs +2 -2
- package/dist/durable/ThreadArchiveRange.d.mts +1 -1
- package/dist/durable/ThreadArchiveRange.mjs +1 -1
- package/dist/durable/ThreadContextHistory.d.mts +1 -1
- package/dist/durable/ThreadContextHistory.mjs +2 -2
- package/dist/durable/ThreadContextHistoryProjection.mjs +1 -1
- package/dist/durable/ThreadImport.d.mts +1 -1
- package/dist/durable/ThreadImport.mjs +1 -1
- package/dist/durable/ThreadInvariants.d.mts +3 -3
- package/dist/durable/ThreadInvariants.mjs +4 -4
- package/dist/durable/ThreadProjection.mjs +1 -1
- package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
- package/dist/durable/ThreadReader.d.mts +1 -1
- package/dist/durable/ThreadReader.mjs +1 -1
- package/dist/durable/ThreadStore.d.mts +1 -1
- package/dist/durable/ThreadStore.mjs +2 -2
- package/dist/durable/ThreadStoreConformance.d.mts +1 -1
- package/dist/durable/ThreadStoreConformance.mjs +4 -4
- package/dist/durable/ThreadTransfer.d.mts +1 -1
- package/dist/durable/ThreadTransfer.mjs +1 -1
- package/dist/durable/ThreadWork.d.mts +2 -2
- package/dist/durable/ThreadWork.mjs +12 -6
- package/dist/durable/ThreadWork.mjs.map +1 -1
- package/dist/durable/ToolReconciler.mjs +1 -1
- package/dist/durable/WakeScheduler.mjs +23 -39
- package/dist/durable/WakeScheduler.mjs.map +1 -1
- package/dist/durable/WorkerAdmission.d.mts +1 -1
- package/dist/durable/WorkerAdmission.mjs +1 -1
- package/dist/durable/WorkerHost.d.mts +1 -1
- package/dist/engine/AgentRuntime.d.mts +1 -1
- package/dist/engine/AgentRuntime.mjs +1 -1
- package/dist/engine/MessagingHost.mjs +1 -1
- package/dist/engine/Output.mjs +1 -1
- package/dist/engine/ThreadHistory.d.mts +1 -1
- package/dist/engine/ThreadHistory.mjs +3 -2
- package/dist/engine/ThreadHistory.mjs.map +1 -1
- package/dist/index.d.mts +12 -12
- package/dist/index.mjs +13 -13
- package/dist/{output-contract-CMIhu4Cw.mjs → output-contract-DCnLYCdp.mjs} +12 -15
- package/dist/{output-contract-CMIhu4Cw.mjs.map → output-contract-DCnLYCdp.mjs.map} +1 -1
- package/dist/{run-context-reader-CC7ZD95F.d.mts → run-context-reader-DVhJZ1Qe.d.mts} +2 -2
- package/package.json +1 -1
- package/src/core/Thread.ts +143 -146
- package/src/durable/DurableAgentRuntime.ts +381 -206
- package/src/durable/RunContinuation.ts +113 -62
- package/src/durable/RunJournal.ts +99 -108
- package/src/durable/RunStorage.ts +7 -0
- package/src/durable/SqlMemoryStore.ts +8 -6
- package/src/durable/SubmissionLedger.ts +7 -0
- package/src/durable/ThreadStore.ts +9 -7
- package/src/durable/ThreadWork.ts +10 -0
- package/src/durable/WakeScheduler.ts +34 -66
- package/src/durable/internal/usage-totals.ts +28 -31
- package/src/engine/MessagingHost.ts +4 -2
- package/src/engine/ThreadHistory.ts +47 -48
- package/src/engine/internal/agent-runtime.ts +234 -202
- package/src/engine/internal/output-contract.ts +15 -15
- package/src/engine/internal/primitive-delta.ts +2 -3
- package/src/engine/internal/tool-telemetry.ts +3 -5
- package/dist/AgentRuntime-B6qZlD3f.mjs.map +0 -1
- package/dist/DurableAgentRuntime-CBBjRNJN.mjs.map +0 -1
- package/dist/MessagingHost-CRUK4JBi.mjs.map +0 -1
- package/dist/RunContinuation-4ZATcVLB.mjs.map +0 -1
- package/dist/RunJournal-CNZqA3Ge.mjs.map +0 -1
- package/dist/RunStorage-BHjuuERI.mjs.map +0 -1
- package/dist/ThreadStore-59uDGXul.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunStorage-CzutHJBE.mjs","names":[],"sources":["../src/durable/internal/StorageOwner.ts","../src/durable/RunStorage.ts"],"sourcesContent":["import { Context, Effect, Option, Semaphore, type Scope } from \"effect\";\n\nimport type { ThreadId } from \"../../core/Identifiers.ts\";\nimport { type Claim, LedgerError, OwnershipLost } from \"../SubmissionLedger.ts\";\n\nexport type MutationGate = <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;\n\n/** Local capability only. It is never encoded, persisted, or reconstructed from an Attempt ID. */\nexport interface OwnerGeneration {\n readonly claim: Claim;\n readonly identity: object;\n readonly checkActive: Effect.Effect<void, OwnershipLost>;\n readonly release: Effect.Effect<void>;\n readonly use: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | OwnershipLost, R>;\n}\n\nexport interface StorageOwnerService {\n readonly identity: object;\n readonly withMutation: MutationGate;\n readonly withProgress: <A, E, R>(\n threadId: ThreadId,\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E, R>;\n readonly isClosed: () => boolean;\n readonly hasOwner: (threadId: string, submissionId?: string) => boolean;\n /** Trusted administrative retirement, while holding the same mutation gate. */\n readonly closeSubmission: (threadId: string, submissionId: string) => void;\n readonly acquire: <E, R>(\n threadId: ThreadId,\n select: Effect.Effect<Option.Option<Claim>, E, R>,\n ) => Effect.Effect<Option.Option<OwnerGeneration>, E | LedgerError, R | Scope.Scope>;\n}\n\nexport class StorageOwner extends Context.Service<StorageOwner, StorageOwnerService>()(\n \"@effect-agent/durable/StorageOwner\",\n) {}\n\nconst ActiveOwner = Context.Reference<object | undefined>(\n \"@effect-agent/durable/internal/ActiveStorageOwner\",\n { defaultValue: () => undefined },\n);\n\nconst ActiveProgress = Context.Reference<\n { readonly owner: object; readonly threadId: ThreadId } | undefined\n>(\"@effect-agent/durable/internal/ActiveProgress\", { defaultValue: () => undefined });\n\n/** Reuse the physical owner's gate; reentrant calls remain in the same mutation. */\nexport const makeStorageOwner = Effect.fnUntraced(function* (gate: MutationGate) {\n const identity = {};\n let closed = false;\n const progress = new Map<ThreadId, { readonly gate: Semaphore.Semaphore; users: number }>();\n const active = new Map<string, { readonly claim: Claim; closed: boolean }>();\n\n const withMutation: MutationGate = (effect) =>\n Effect.withFiber((fiber) => {\n const current = fiber.getRef(ActiveOwner);\n\n return current === identity\n ? effect\n : gate(Effect.provideService(effect, ActiveOwner, identity));\n });\n\n yield* Effect.addFinalizer(() =>\n withMutation(\n Effect.sync(() => {\n closed = true;\n for (const entry of active.values()) entry.closed = true;\n active.clear();\n }),\n ),\n );\n\n return StorageOwner.of({\n identity,\n withMutation,\n withProgress: (threadId, effect) =>\n Effect.withFiber((fiber) => {\n const current = fiber.getRef(ActiveProgress);\n\n if (current?.owner === identity && current.threadId === threadId) return effect;\n\n return Effect.suspend(() => {\n let entry = progress.get(threadId);\n\n if (entry === undefined) {\n entry = { gate: Semaphore.makeUnsafe(1), users: 0 };\n progress.set(threadId, entry);\n }\n const retained = entry;\n\n retained.users++;\n\n return retained.gate\n .withPermits(1)(\n Effect.provideService(effect, ActiveProgress, { owner: identity, threadId }),\n )\n .pipe(\n Effect.ensuring(\n Effect.sync(() => {\n retained.users--;\n if (retained.users === 0 && progress.get(threadId) === retained)\n progress.delete(threadId);\n }),\n ),\n );\n });\n }),\n isClosed: () => closed,\n hasOwner: (threadId, submissionId) => {\n const entry = active.get(threadId);\n\n return (\n !closed &&\n entry !== undefined &&\n !entry.closed &&\n (submissionId === undefined || entry.claim.submissionId === submissionId)\n );\n },\n closeSubmission: (threadId, submissionId) => {\n const entry = active.get(threadId);\n\n if (entry?.claim.submissionId !== submissionId) return;\n entry.closed = true;\n active.delete(threadId);\n },\n acquire: (threadId, select) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const selected = yield* withMutation(\n Effect.gen(function* () {\n if (closed)\n return yield* LedgerError.make({\n operation: \"claim\",\n message: \"Storage owner is closed\",\n });\n if (active.has(threadId)) return Option.none<OwnerGeneration>();\n const selected = yield* select;\n\n if (Option.isNone(selected)) return Option.none<OwnerGeneration>();\n const entry = { claim: selected.value, closed: false };\n\n active.set(threadId, entry);\n\n const checkActive = Effect.suspend(() =>\n closed || entry.closed || active.get(threadId) !== entry\n ? Effect.fail(OwnershipLost.make({ submissionId: entry.claim.submissionId }))\n : Effect.void,\n );\n\n const release = withMutation(\n Effect.sync(() => {\n entry.closed = true;\n if (active.get(threadId) === entry) active.delete(threadId);\n }),\n );\n\n return Option.some<OwnerGeneration>({\n claim: entry.claim,\n identity: entry,\n checkActive,\n release,\n use: (effect) => withMutation(Effect.andThen(checkActive, effect)),\n });\n }),\n );\n\n if (Option.isNone(selected)) return selected;\n // A closed Scope runs this immediately. Never register while holding a nonlocal gate.\n yield* Effect.addFinalizer(() => selected.value.release);\n\n return yield* restore(Effect.succeed(selected));\n }),\n ),\n });\n});\n","import type { Scope } from \"effect\";\nimport { Cause, Context, Effect, Layer, Option, Schema } from \"effect\";\n\nimport type { SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport { StorageOwner } from \"./internal/StorageOwner.ts\";\nimport type { CanonicalBatch, CanonicalSequence } from \"./Records.ts\";\nimport {\n SettlementPublication,\n type SettlementPublicationFailure,\n type SettlementPublicationResult,\n SettlementPublisher,\n} from \"./SettlementPublisher.ts\";\nimport {\n AttachChildToReservationRequest,\n ChildBudgetReservationRequest,\n ClaimJoiningRequest,\n type Claim,\n type ClaimRequest,\n type InputAppliedMarker,\n LedgerError,\n MarkInputAppliedRequest,\n MarkJoinedRequest,\n OwnershipLost,\n RevertJoiningRequest,\n SettlementConflict,\n SubmissionLedger,\n SuspendRequest,\n type SuspensionReason,\n} from \"./SubmissionLedger.ts\";\nimport {\n type AppendResult,\n AppendConflict,\n AppendRequest,\n type CommitBatch,\n type ExecutionUpdate,\n PreparedAppend,\n ThreadMaterialization,\n ThreadNotMaterialized,\n ThreadStore,\n ThreadStoreError,\n type ThreadStoreFailure,\n ThreadTailRequest,\n} from \"./ThreadStore.ts\";\n\nexport {\n StorageOwner,\n makeStorageOwner,\n type MutationGate,\n type OwnerGeneration,\n type StorageOwnerService,\n} from \"./internal/StorageOwner.ts\";\n\nexport const RunChildBudgetReservation = Schema.Struct({\n reservationId: ChildBudgetReservationRequest.fields.reservationId,\n parentToolCallId: ChildBudgetReservationRequest.fields.parentToolCallId,\n allocation: ChildBudgetReservationRequest.fields.allocation,\n allocationDigest: ChildBudgetReservationRequest.fields.allocationDigest,\n});\n\nexport type RunChildBudgetReservation = typeof RunChildBudgetReservation.Type;\n\nexport const RunChildAttachment = Schema.Struct({\n reservationId: AttachChildToReservationRequest.fields.reservationId,\n childSubmissionId: AttachChildToReservationRequest.fields.childSubmissionId,\n});\n\nexport type RunChildAttachment = typeof RunChildAttachment.Type;\n\n/** Commands bound to one local scoped owner. No authority is transported in their values. */\nexport interface RunOwnership {\n readonly release: Effect.Effect<void>;\n readonly markInputApplied: (\n marker: InputAppliedMarker,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"markInputApplied\"]>;\n readonly claimJoining: (\n maxCount: number,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"claimJoining\"]>;\n readonly markJoined: (\n submissionId: SubmissionId,\n marker: InputAppliedMarker,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"markJoined\"]>;\n readonly revertJoining: (\n submissionId: SubmissionId,\n ) => Effect.Effect<void, LedgerError | OwnershipLost>;\n readonly suspend: (\n reason: SuspensionReason,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"suspend\"]>;\n readonly reserveChildBudget: (\n request: RunChildBudgetReservation,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"reserveChildBudget\"]>;\n readonly attachChildToReservation: (\n request: RunChildAttachment,\n ) => ReturnType<SubmissionLedger[\"Service\"][\"attachChildToReservation\"]>;\n}\n\nexport interface RunWriter {\n readonly threadId: ThreadId;\n /** Opaque cache identity for this local writer lifetime; never portable authority. */\n readonly generation: object;\n readonly refresh: Effect.Effect<void, ThreadStoreFailure>;\n readonly withProgress: <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | ThreadStoreFailure, R>;\n readonly tail: Effect.Effect<{ readonly sequence: CanonicalSequence }>;\n /** Uncertain commit failures close this session before another command may enter. */\n readonly append: (\n batch: CommitBatch,\n executions?: ReadonlyArray<ExecutionUpdate>,\n ) => Effect.Effect<AppendResult, ThreadStoreFailure>;\n /** Recheck the captured local capability after preflight, immediately before effect dispatch. */\n readonly checkActive: Effect.Effect<void, ThreadStoreFailure>;\n}\n\nexport interface RunStorageSession extends RunWriter, RunOwnership {\n readonly claim: Claim;\n /** Library-only initialization, before application/model IO. Hold progress before mutation\n * so the captured controls and this owner's acknowledged input remain one read view. */\n readonly withInitialization?: <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | OwnershipLost, R>;\n readonly refresh: Effect.Effect<void, ThreadStoreFailure>;\n readonly publishSettlement: (\n batch: CanonicalBatch,\n executions?: ReadonlyArray<ExecutionUpdate>,\n ) => Effect.Effect<SettlementPublicationResult, SettlementPublicationFailure>;\n}\n\nexport class RunStorage extends Context.Service<\n RunStorage,\n {\n readonly publishSettlement: SettlementPublisher[\"Service\"][\"publish\"];\n readonly claim: (\n request: ClaimRequest,\n ) => Effect.Effect<\n Option.Option<RunStorageSession>,\n LedgerError | ThreadStoreFailure,\n Scope.Scope\n >;\n }\n>()(\"@effect-agent/thread/RunStorage\") {}\n\n/** One writer's scoped capability, selected at claim or administrative construction. */\nclass WriterOwnership extends Context.Service<\n WriterOwnership,\n {\n readonly identity: object;\n readonly checkActive: Effect.Effect<void, ThreadStoreFailure>;\n readonly release: Effect.Effect<void>;\n }\n>()(\"@effect-agent/durable/internal/WriterOwnership\") {}\n\nconst isDefiniteWriteRefusal = Schema.is(\n Schema.Union([AppendConflict, OwnershipLost, SettlementConflict, ThreadNotMaterialized]),\n);\n\nconst isDefiniteWriteFailure = (cause: Cause.Cause<unknown>) =>\n cause.reasons.length > 0 &&\n cause.reasons.every(\n (reason) => Cause.isFailReason(reason) && isDefiniteWriteRefusal(reason.error),\n );\n\nconst makeWriter = Effect.fnUntraced(function* (threadId: ThreadId) {\n const store = yield* ThreadStore;\n const owner = yield* StorageOwner;\n const ownership = yield* WriterOwnership;\n const checkActive = ownership.checkActive;\n const initial = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));\n let tail = { sequence: initial.tailSequence };\n\n const refresh = owner.withMutation(\n Effect.gen(function* () {\n yield* checkActive;\n const current = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));\n\n tail = { sequence: current.tailSequence };\n }),\n );\n\n const append: RunWriter[\"append\"] = Effect.fnUntraced(function* (batch, executions) {\n const captured = yield* PreparedAppend.capture(\n AppendRequest.make({\n threadId,\n expectedTailSequence: tail.sequence,\n batch,\n ...(executions === undefined ? {} : { executions }),\n }),\n ).pipe(\n Effect.mapError((cause) =>\n ThreadStoreError.make({\n operation: \"capture append\",\n message: cause.message,\n cause,\n }),\n ),\n );\n\n return yield* owner.withProgress(\n threadId,\n owner.withMutation(\n Effect.gen(function* () {\n yield* checkActive;\n for (let retries = 0; ; retries++) {\n const result = yield* store\n .append(\n captured.expectedTailSequence === tail.sequence\n ? captured\n : AppendRequest.make({\n ...captured,\n expectedTailSequence: tail.sequence,\n }),\n )\n .pipe(\n Effect.catchTag(\"AppendConflict\", (conflict) => {\n if (\n conflict.reason !== \"tail\" ||\n conflict.actualTailSequence === undefined ||\n retries >= 8\n )\n return Effect.fail(conflict);\n tail = { sequence: conflict.actualTailSequence };\n if (captured.executions !== undefined) return Effect.fail(conflict);\n\n return Effect.succeed(undefined);\n }),\n );\n\n if (result === undefined) continue;\n // A historical replay returns its original coordinates, not today's canonical tail.\n if (result.replayed) yield* refresh;\n else tail = { sequence: result.lastSequence };\n\n return result;\n }\n }).pipe(\n // Revoke uncertain writes before releasing the writer's mutation gate.\n Effect.onError((cause) =>\n isDefiniteWriteFailure(cause) ? Effect.void : ownership.release,\n ),\n ),\n ),\n );\n });\n\n const writer = {\n threadId,\n generation: ownership.identity,\n withProgress: <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n owner.withProgress(threadId, Effect.andThen(checkActive, effect)),\n tail: Effect.sync(() => tail),\n append,\n checkActive: owner.withMutation(checkActive),\n refresh,\n };\n\n return {\n writer,\n adoptTail: (sequence: CanonicalSequence) => {\n tail = { sequence };\n },\n };\n});\n\n/** Trusted administrative writer sharing the physical owner's gate and lifetime. */\nexport const makeRunWriter = Effect.fnUntraced(function* (threadId: ThreadId) {\n const owner = yield* StorageOwner;\n\n return (yield* makeWriter(threadId).pipe(\n Effect.provideService(WriterOwnership, {\n identity: owner.identity,\n checkActive: Effect.suspend(() =>\n owner.isClosed()\n ? Effect.fail(\n ThreadStoreError.make({\n operation: \"write Thread\",\n message: \"Storage owner is closed\",\n }),\n )\n : Effect.void,\n ),\n release: Effect.void,\n }),\n )).writer;\n});\n\n/** The same scoped single-owner protocol is used by every adapter. */\nexport const make = Effect.gen(function* () {\n const ledger = yield* SubmissionLedger;\n const store = yield* ThreadStore;\n const publisher = yield* SettlementPublisher;\n const owner = yield* StorageOwner;\n\n const claim: RunStorage[\"Service\"][\"claim\"] = (request) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n const granted = yield* owner.acquire(request.threadId, ledger.selectHead(request));\n\n if (Option.isNone(granted)) return Option.none();\n const generation = granted.value;\n const claimed = generation.claim;\n\n return yield* restore(\n Effect.gen(function* () {\n if (\n request.handoff !== undefined &&\n request.handoff.submissionId !== claimed.submissionId\n )\n return yield* LedgerError.make({\n operation: \"claim handoff\",\n message: \"The submission adapter did not honor the requested handoff\",\n });\n yield* store.materialize(ThreadMaterialization.make({ threadId: request.threadId }));\n\n const { writer, adoptTail } = yield* makeWriter(request.threadId).pipe(\n Effect.provideService(WriterOwnership, generation),\n Effect.provideService(ThreadStore, store),\n Effect.provideService(StorageOwner, owner),\n );\n\n const owned = <A, E>(effect: Effect.Effect<A, E>) => generation.use(effect);\n\n const session: RunStorageSession = {\n ...writer,\n claim: claimed,\n withInitialization: (effect) =>\n owner.withProgress(request.threadId, generation.use(effect)),\n release: generation.release,\n refresh: writer.refresh,\n markInputApplied: (marker) =>\n owned(\n ledger.markInputApplied(\n MarkInputAppliedRequest.make({\n ...marker,\n submissionId: claimed.submissionId,\n }),\n ),\n ),\n claimJoining: (maxCount) =>\n owned(\n ledger.claimJoining(\n ClaimJoiningRequest.make({\n threadId: request.threadId,\n hostSubmissionId: claimed.submissionId,\n maxCount,\n }),\n ),\n ),\n markJoined: (submissionId, marker) =>\n owned(\n ledger.markJoined(\n MarkJoinedRequest.make({\n ...marker,\n submissionId,\n }),\n ),\n ),\n revertJoining: (submissionId) =>\n owned(\n ledger.revertJoining(\n RevertJoiningRequest.make({\n submissionId,\n guard: { hostSubmissionId: claimed.submissionId },\n }),\n ),\n ),\n suspend: (reason) =>\n owned(\n ledger\n .suspend(\n SuspendRequest.make({\n submissionId: claimed.submissionId,\n reason,\n }),\n )\n .pipe(\n Effect.tap((outcome) =>\n outcome === \"suspended\" ? generation.release : Effect.void,\n ),\n ),\n ),\n publishSettlement: Effect.fnUntraced(function* (batch, executions) {\n const captured = yield* PreparedAppend.capture(\n AppendRequest.make({\n threadId: request.threadId,\n expectedTailSequence: (yield* writer.tail).sequence,\n batch,\n ...(executions === undefined ? {} : { executions }),\n }),\n ).pipe(\n Effect.mapError((cause) =>\n LedgerError.make({\n operation: \"capture settlement\",\n message: cause.message,\n cause,\n }),\n ),\n );\n\n return yield* owner.withProgress(\n request.threadId,\n owned(\n Effect.gen(function* () {\n for (let retries = 0; ; retries++) {\n const result = yield* publisher\n .publish(\n SettlementPublication.make({\n submissionId: claimed.submissionId,\n authority: { _tag: \"Owned\" },\n append: AppendRequest.make({\n ...captured,\n expectedTailSequence: (yield* writer.tail).sequence,\n }),\n }),\n )\n .pipe(\n Effect.catchTag(\"AppendConflict\", (conflict) => {\n if (\n conflict.reason !== \"tail\" ||\n conflict.actualTailSequence === undefined ||\n retries >= 8\n )\n return Effect.fail(conflict);\n\n return writer.refresh.pipe(\n Effect.andThen(\n captured.executions === undefined\n ? Effect.succeed(undefined)\n : Effect.fail(conflict),\n ),\n );\n }),\n );\n\n if (result === undefined) continue;\n adoptTail(result.tailSequence);\n\n return result;\n }\n }).pipe(\n Effect.onError((cause) =>\n isDefiniteWriteFailure(cause) ? Effect.void : generation.release,\n ),\n ),\n ),\n );\n }),\n reserveChildBudget: (value) =>\n owned(\n ledger.reserveChildBudget(\n ChildBudgetReservationRequest.make({\n ...value,\n parentSubmissionId: claimed.submissionId,\n }),\n ),\n ),\n attachChildToReservation: (value) =>\n owned(ledger.attachChildToReservation(AttachChildToReservationRequest.make(value))),\n };\n\n return Option.some(session);\n }).pipe(Effect.onError(() => generation.release)),\n );\n }),\n );\n\n return RunStorage.of({ claim, publishSettlement: publisher.publish });\n});\n\nexport const layer = () => Layer.effect(RunStorage, make);\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
|
2
2
|
import { ThreadId } from "./core/Identifiers.mjs";
|
|
3
3
|
import { n as utf8ByteLength } from "./utf8-B5pAmhTo.mjs";
|
|
4
4
|
import { IdempotencyKey } from "./core/Receipt.mjs";
|
|
5
|
-
import { U as PersistedJson, v as DefinitionDigests } from "./Records-
|
|
6
|
-
import { s as digestJson } from "./Digest-
|
|
5
|
+
import { U as PersistedJson, v as DefinitionDigests } from "./Records-DzL4Kbtw.mjs";
|
|
6
|
+
import { s as digestJson } from "./Digest-C3EODOee.mjs";
|
|
7
7
|
import { ScheduleAuthorizer, ScheduleConflict, ScheduleDestination, ScheduleFailpoint, ScheduleInstant, ScheduleNotFound, ScheduleStorageError, ScheduleStore, ScheduleTimingRequest, ScheduleValidationError, ScheduleWake, ScheduledInputAdmission, SchedulingLimits, defaultSchedulingLimits } from "./durable/Schedule.mjs";
|
|
8
8
|
import { admitPreparedInput } from "./durable/PreparedInputAdmission.mjs";
|
|
9
9
|
import { Cause, Context, Cron, Crypto, DateTime, Effect, Layer, Option, Result, Schema, Semaphore } from "effect";
|
|
@@ -688,4 +688,4 @@ var ScheduleDriver = class ScheduleDriver extends Context.Service()("@effect-age
|
|
|
688
688
|
//#endregion
|
|
689
689
|
export { Scheduling_exports as i, ScheduleWakeNoop as n, Scheduling as r, ScheduleDriver as t };
|
|
690
690
|
|
|
691
|
-
//# sourceMappingURL=Scheduling-
|
|
691
|
+
//# sourceMappingURL=Scheduling-07_dsGED.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduling-NG8slKdI.mjs","names":["ScheduleTimingRequestSchema","ScheduleDestinationSchema"],"sources":["../src/durable/internal/schedule-time.ts","../src/durable/Scheduling.ts"],"sourcesContent":["import { Cron, DateTime, Option, Result, Schema } from \"effect\";\n\nimport {\n ScheduleValidationError,\n ScheduleInstant,\n type ScheduleSkippedRange,\n type ScheduleTiming,\n type ScheduleTimingRequest,\n} from \"../Schedule.ts\";\n\nconst invalid = (message: string) => Result.fail(ScheduleValidationError.make({ message }));\n\nconst checkedInstant = (millis: number, label: string) =>\n Schema.decodeResult(ScheduleInstant)(millis).pipe(\n Result.mapError(() =>\n ScheduleValidationError.make({\n message: `${label} is outside the supported ScheduleInstant range`,\n }),\n ),\n );\n\nconst values = (set: ReadonlySet<number>, size: number): ReadonlyArray<number> =>\n set.size === 0 ? Array.from({ length: size }, (_, index) => index) : [...set];\n\n/**\n * Cron frequency proof without calendar enumeration. It checks the minimum circular spacing of\n * the allowed hour/minute pairs. Day restrictions may make a rule sparser, so this deliberately\n * rejects some safe rules when a configured minimum exceeds one minute.\n */\nconst validateCronFrequency = (\n cron: Cron.Cron,\n minimumMillis: number,\n): Result.Result<void, ScheduleValidationError> => {\n if (cron.seconds.size !== 1) {\n return invalid(\"Cron must select exactly one seconds value\");\n }\n if (minimumMillis <= 60_000) return Result.succeed(undefined);\n if (\n Option.isSome(cron.tz) &&\n DateTime.isTimeZoneNamed(cron.tz.value) &&\n cron.tz.value.id !== \"UTC\"\n ) {\n return invalid(\"Cron minimums above one minute require UTC or a fixed-offset time zone\");\n }\n\n const minuteOfDay = values(cron.hours, 24).flatMap((hour) =>\n values(cron.minutes, 60).map((minute) => hour * 60 + minute),\n );\n\n minuteOfDay.sort((left, right) => left - right);\n let minimumGap = 24 * 60;\n\n for (let index = 0; index < minuteOfDay.length; index += 1) {\n const current = minuteOfDay[index];\n const next = minuteOfDay[(index + 1) % minuteOfDay.length];\n\n if (current === undefined || next === undefined) continue;\n const gap = next > current ? next - current : 24 * 60 - current + next;\n\n minimumGap = Math.min(minimumGap, gap);\n }\n\n return minimumGap * 60_000 >= minimumMillis\n ? Result.succeed(undefined)\n : invalid(`Cron may fire more often than the configured ${minimumMillis}ms minimum`);\n};\n\nexport const parseScheduleCron = (\n expression: string,\n timeZone: string,\n minimumMillis: number,\n): Result.Result<Cron.Cron, ScheduleValidationError> => {\n const parsed = Cron.parse(expression, timeZone);\n\n if (Result.isFailure(parsed)) return invalid(parsed.failure.message);\n const frequency = validateCronFrequency(parsed.success, minimumMillis);\n\n return Result.isFailure(frequency)\n ? Result.fail(frequency.failure)\n : Result.succeed(parsed.success);\n};\n\nexport const normalizeScheduleTiming = (\n request: ScheduleTimingRequest,\n nowMillis: number,\n minimumMillis: number,\n): Result.Result<ScheduleTiming, ScheduleValidationError> => {\n switch (request._tag) {\n case \"At\":\n return Result.succeed(request);\n case \"After\": {\n const at = checkedInstant(nowMillis + request.delayMillis, \"Relative deadline\");\n\n return Result.map(at, (atMillis) => ({ _tag: \"At\" as const, atMillis }));\n }\n case \"Interval\": {\n if (request.everyMillis < minimumMillis) {\n return invalid(`Interval must be at least ${minimumMillis}ms`);\n }\n\n const anchor = checkedInstant(\n request.anchorMillis ?? nowMillis + request.everyMillis,\n \"Interval anchor\",\n );\n\n return Result.map(anchor, (anchorMillis) => ({\n _tag: \"Interval\" as const,\n everyMillis: request.everyMillis,\n anchorMillis,\n }));\n }\n case \"Cron\": {\n const timeZone = request.timeZone ?? \"UTC\";\n const cron = parseScheduleCron(request.expression, timeZone, minimumMillis);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n return Result.succeed({ _tag: \"Cron\", expression: request.expression, timeZone });\n }\n }\n};\n\nconst parsedStoredCron = (timing: Extract<ScheduleTiming, { _tag: \"Cron\" }>) => {\n const parsed = Cron.parse(timing.expression, timing.timeZone);\n\n return Result.isFailure(parsed)\n ? invalid(`Stored cron is invalid: ${parsed.failure.message}`)\n : Result.succeed(parsed.success);\n};\n\n/** Strictly selects the first occurrence after an instant. */\nexport const scheduleNextAfter = (\n timing: ScheduleTiming,\n afterMillis: number,\n): Result.Result<number | null, ScheduleValidationError> => {\n switch (timing._tag) {\n case \"At\":\n return Result.succeed(timing.atMillis > afterMillis ? timing.atMillis : null);\n case \"Interval\": {\n if (afterMillis < timing.anchorMillis) return Result.succeed(timing.anchorMillis);\n const steps = Math.floor((afterMillis - timing.anchorMillis) / timing.everyMillis) + 1;\n const next = timing.anchorMillis + steps * timing.everyMillis;\n\n return checkedInstant(next, \"Next interval occurrence\");\n }\n case \"Cron\": {\n const cron = parsedStoredCron(timing);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n return Result.try({\n try: () => {\n let next = Cron.next(cron.success, afterMillis).getTime();\n\n // Inside a fall fold Effect may select the first, already elapsed local instant.\n while (next <= afterMillis) {\n const following = Cron.next(cron.success, next).getTime();\n\n if (following <= next) return invalid(\"Cron has no supported next firing\");\n next = following;\n }\n\n return checkedInstant(next, \"Next cron occurrence\");\n },\n catch: () => ScheduleValidationError.make({ message: \"Cron has no supported next firing\" }),\n }).pipe(Result.flatMap((result) => result));\n }\n }\n};\n\n/** Initial cursor. Past one-shots remain due; recurring rules start strictly after registration. */\nexport const scheduleInitialCursor = (\n timing: ScheduleTiming,\n nowMillis: number,\n): Result.Result<number | null, ScheduleValidationError> =>\n timing._tag === \"At\" ? Result.succeed(timing.atMillis) : scheduleNextAfter(timing, nowMillis);\n\nexport interface DueScheduleOccurrence {\n readonly intendedAtMillis: number;\n readonly nextAtMillis: number | null;\n readonly skippedRange: ScheduleSkippedRange | null;\n}\n\n/** Coalesces recurring occurrences using the same forward sequence as registration. */\nexport const scheduleDueOccurrence = (\n timing: ScheduleTiming,\n cursorMillis: number,\n nowMillis: number,\n): Result.Result<DueScheduleOccurrence | null, ScheduleValidationError> => {\n if (cursorMillis > nowMillis) return Result.succeed(null);\n if (timing._tag === \"At\") {\n return Result.succeed({\n intendedAtMillis: cursorMillis,\n nextAtMillis: null,\n skippedRange: null,\n });\n }\n\n let intendedAtMillis: number;\n\n if (timing._tag === \"Interval\") {\n const steps = Math.floor((nowMillis - timing.anchorMillis) / timing.everyMillis);\n\n intendedAtMillis = Math.max(cursorMillis, timing.anchorMillis + steps * timing.everyMillis);\n } else {\n const cron = parsedStoredCron(timing);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n const due = Result.try({\n try: () => {\n let intended = cursorMillis;\n // Reverse traversal is safe only without offset transitions. Named-zone reverse\n // traversal has different gap/fold semantics from the forward occurrence sequence.\n const zone = Option.getOrUndefined(cron.success.tz);\n\n if (zone !== undefined && (DateTime.isTimeZoneOffset(zone) || zone.id === \"UTC\")) {\n intended = Math.max(cursorMillis, Cron.prev(cron.success, nowMillis + 1_000).getTime());\n } else {\n // Seek by calendar date in UTC, where reverse traversal has no DST ambiguity.\n // Include two prior civil days to cover even IANA date-line shifts. There are no\n // matching dates between this seed day and that boundary, so forward traversal\n // visits only the seed day and the recent days, regardless of downtime length.\n const calendar = Cron.make({\n ...cron.success,\n seconds: [0],\n minutes: [0],\n hours: [0],\n tz: DateTime.zoneMakeNamedUnsafe(\"UTC\"),\n });\n\n const localDay = DateTime.makeUnsafe(\n DateTime.toDate(DateTime.makeZonedUnsafe(nowMillis, { timeZone: zone })),\n ).pipe(DateTime.startOf(\"day\"), DateTime.subtract({ days: 2 }));\n\n const seedDay = Cron.prev(calendar, DateTime.toEpochMillis(localDay) + 1_000);\n\n const seed =\n DateTime.makeZonedUnsafe(seedDay, {\n timeZone: zone,\n adjustForTimeZone: true,\n }).pipe(DateTime.toEpochMillis) - 1_000;\n\n if (seed > cursorMillis) {\n const first = Cron.next(cron.success, seed).getTime();\n\n if (first <= nowMillis) intended = Math.max(intended, first);\n }\n }\n let next = Cron.next(cron.success, intended).getTime();\n\n while (next <= nowMillis) {\n if (next <= intended) return invalid(\"Cron has no supported due firing\");\n intended = next;\n next = Cron.next(cron.success, intended).getTime();\n }\n\n return Result.succeed({ intended, next });\n },\n catch: () => ScheduleValidationError.make({ message: \"Cron has no supported due firing\" }),\n }).pipe(Result.flatMap((result) => result));\n\n if (Result.isFailure(due)) return Result.fail(due.failure);\n const next = checkedInstant(due.success.next, \"Next cron occurrence\");\n\n if (Result.isFailure(next)) return Result.fail(next.failure);\n\n return Result.succeed({\n intendedAtMillis: due.success.intended,\n nextAtMillis: next.success,\n skippedRange:\n due.success.intended === cursorMillis\n ? null\n : {\n fromMillis: cursorMillis,\n toMillis: due.success.intended,\n },\n });\n }\n\n const next = scheduleNextAfter(timing, nowMillis);\n\n if (Result.isFailure(next)) return Result.fail(next.failure);\n\n return Result.succeed({\n intendedAtMillis,\n nextAtMillis: next.success,\n skippedRange:\n intendedAtMillis === cursorMillis\n ? null\n : { fromMillis: cursorMillis, toMillis: intendedAtMillis },\n });\n};\n\nexport const scheduleResumeCursor = (\n timing: ScheduleTiming,\n existingCursor: number | null,\n nowMillis: number,\n): Result.Result<number | null, ScheduleValidationError> => {\n if (timing._tag === \"At\") return Result.succeed(existingCursor);\n\n return scheduleNextAfter(timing, nowMillis);\n};\n","import {\n Cause,\n Context,\n Crypto,\n DateTime,\n Effect,\n Layer,\n Option,\n Result,\n Schema,\n Semaphore,\n} from \"effect\";\n\nimport { type AgentId, ThreadId } from \"../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../core/internal/utf8.ts\";\nimport { digestJson } from \"./Digest.ts\";\nimport type { DurableSubmitAgent } from \"./DurableAgentRuntime.ts\";\nimport {\n normalizeScheduleTiming,\n scheduleDueOccurrence,\n scheduleInitialCursor,\n scheduleNextAfter,\n scheduleResumeCursor,\n} from \"./internal/schedule-time.ts\";\nimport { admitPreparedInput } from \"./PreparedInputAdmission.ts\";\nimport { DefinitionDigests, type Digest, PersistedJson } from \"./Records.ts\";\nimport {\n defaultSchedulingLimits,\n type ScheduleAuthorizationError,\n ScheduleAuthorizer,\n ScheduleConflict,\n type ScheduleConfiguration,\n ScheduleDestination as ScheduleDestinationSchema,\n type ScheduleDestination,\n ScheduleFailpoint,\n type ScheduleId,\n type ScheduleDueCursor,\n ScheduleInstant,\n type ScheduleKey,\n SchedulingLimits,\n ScheduleNotFound,\n type ScheduleOwner,\n type ScheduleRecord,\n type ScheduleRefusal,\n type ScheduleRetryReason,\n type ScheduleScope,\n type ScheduleSnapshot,\n type ScheduleSnapshotPage,\n ScheduleStorageError,\n ScheduleStore,\n type ScheduleStoreFailure,\n ScheduleTimingRequest as ScheduleTimingRequestSchema,\n type ScheduleTimingRequest,\n ScheduleValidationError,\n ScheduledInputAdmission,\n ScheduleWake,\n} from \"./Schedule.ts\";\nimport { type AdmissionFence, IdempotencyKey, type Principal } from \"./SubmissionLedger.ts\";\n\nexport interface ScheduleCreateOptions {\n readonly scope: ScheduleScope;\n readonly scheduleId: ScheduleId;\n readonly timing: ScheduleTimingRequest;\n readonly destination: ScheduleDestination;\n readonly deliveryPrincipal: Principal;\n readonly admissionGroup?: string;\n readonly admissionFence?: AdmissionFence;\n readonly definitions: DefinitionDigests;\n}\n\nexport interface ScheduleUpdateOptions extends ScheduleCreateOptions {\n readonly expectedRevision: number;\n}\n\nexport interface ScheduleListOptions {\n readonly after?: ScheduleId | undefined;\n readonly limit?: number | undefined;\n}\n\nexport type ScheduleManagementFailure =\n | ScheduleValidationError\n | ScheduleAuthorizationError\n | ScheduleStoreFailure;\n\nexport type ScheduleProcessFailure =\n | ScheduleValidationError\n | ScheduleStoreFailure\n | ScheduleStorageError;\n\nconst equivalentDefinitions = Schema.toEquivalence(DefinitionDigests);\nconst equivalentInput = Schema.toEquivalence(PersistedJson);\n\nconst keyOf = (scope: ScheduleScope, scheduleId: ScheduleId): ScheduleKey => ({\n owner: scope.owner,\n scheduleId,\n});\n\nconst notFound = (key: ScheduleKey) => ScheduleNotFound.make({ key });\n\nconst asSnapshot = (record: ScheduleRecord, observedAtMillis: number): ScheduleSnapshot => {\n const intendedAtMillis = record.pending?.envelope.intendedAtMillis ?? record.nextAtMillis;\n\n return {\n owner: record.owner,\n scheduleId: record.scheduleId,\n createdAtMillis: record.createdAtMillis,\n updatedAtMillis: record.updatedAtMillis,\n configurationRevision: record.configurationRevision,\n configuration: {\n timing: record.configuration.timing,\n destination: record.configuration.destination,\n deliveryPrincipal: record.configuration.deliveryPrincipal,\n ...(record.configuration.admissionGroup === undefined\n ? {}\n : { admissionGroup: record.configuration.admissionGroup }),\n ...(record.configuration.admissionFence === undefined\n ? {}\n : { admissionFence: record.configuration.admissionFence }),\n agentId: record.configuration.agentId,\n },\n state: record.state,\n nextAtMillis: record.nextAtMillis,\n pending:\n record.pending === null\n ? null\n : {\n intendedAtMillis: record.pending.envelope.intendedAtMillis,\n preparedAtMillis: record.pending.envelope.preparedAtMillis,\n configurationRevision: record.pending.envelope.configurationRevision,\n occurrenceId: record.pending.envelope.occurrenceId,\n retry: record.pending.retry,\n },\n lastReceipt: record.lastReceipt,\n lastRefusal: record.lastRefusal,\n lastSkippedRange: record.lastSkippedRange,\n observedAtMillis,\n pendingAgeMillis:\n record.pending === null\n ? null\n : Math.max(0, observedAtMillis - record.pending.envelope.preparedAtMillis),\n latenessMillis:\n intendedAtMillis === null ? 0 : Math.max(0, observedAtMillis - intendedAtMillis),\n };\n};\n\nconst inputByteLength = (input: PersistedJson): number => utf8ByteLength(JSON.stringify(input));\n\nconst currentMillis = DateTime.now.pipe(Effect.map(DateTime.toEpochMillis));\n\nconst validateRequestedFields = Effect.fnUntraced(function* (options: ScheduleCreateOptions) {\n yield* Schema.encodeEffect(ScheduleTimingRequestSchema)(options.timing).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid timing request\" })),\n );\n yield* Schema.encodeEffect(ScheduleDestinationSchema)(options.destination).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid destination\" })),\n );\n yield* Schema.encodeEffect(DefinitionDigests)(options.definitions).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid definition digests\" })),\n );\n});\n\nconst resolveInput = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n maximumBytes: number,\n): Effect.fn.Return<\n { readonly payload: PersistedJson; readonly digest: Digest },\n ScheduleValidationError,\n InputSchema[\"EncodingServices\"] | Crypto.Crypto\n> {\n const encoded = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to encode Agent input\" }),\n ),\n );\n\n const payload = yield* Schema.decodeUnknownEffect(PersistedJson)(encoded).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Agent input does not satisfy the canonical persistence bounds\",\n }),\n ),\n );\n\n if (inputByteLength(payload) > maximumBytes) {\n return yield* ScheduleValidationError.make({\n message: `Encoded Agent input exceeds the configured ${maximumBytes} byte limit`,\n });\n }\n\n const digest = yield* digestJson(payload).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to digest encoded Agent input\" }),\n ),\n );\n\n return { payload, digest };\n});\n\nconst makeManagement = Effect.fnUntraced(function* (limits: SchedulingLimits) {\n const nowMillis = yield* currentMillis;\n\n yield* Schema.decodeEffect(ScheduleInstant)(nowMillis + limits.recoveryPollMillis).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Scheduling recovery deadline exceeds the supported instant range\",\n }),\n ),\n );\n const store = yield* ScheduleStore;\n const authorizer = yield* ScheduleAuthorizer;\n const wake = yield* ScheduleWake;\n const crypto = yield* Crypto.Crypto;\n\n const withCrypto = <A, E>(effect: Effect.Effect<A, E, Crypto.Crypto>) =>\n Effect.provideService(effect, Crypto.Crypto, crypto);\n\n const fingerprint = Effect.fnUntraced(function* (\n agentId: AgentId,\n inputDigest: Digest,\n options: ScheduleCreateOptions,\n ) {\n const timing = yield* Schema.encodeEffect(ScheduleTimingRequestSchema)(options.timing).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid timing request\" })),\n );\n\n const destination = yield* Schema.encodeEffect(ScheduleDestinationSchema)(\n options.destination,\n ).pipe(Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid destination\" })));\n\n const definitions = yield* Schema.encodeEffect(DefinitionDigests)(options.definitions).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Invalid definition digests\" }),\n ),\n );\n\n return yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: options.scope.owner,\n scheduleId: options.scheduleId,\n registeringPrincipal: options.scope.principal,\n deliveryPrincipal: options.deliveryPrincipal,\n ...(options.admissionGroup === undefined ? {} : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined ? {} : { admissionFence: options.admissionFence }),\n agentId,\n definitions,\n destination,\n timing,\n inputDigest,\n }),\n ).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to digest Schedule registration\" }),\n ),\n );\n });\n\n const configuration = (\n agentId: AgentId,\n payload: PersistedJson,\n inputDigest: Digest,\n options: ScheduleCreateOptions,\n timing: ScheduleConfiguration[\"timing\"],\n ): ScheduleConfiguration => ({\n timing,\n destination: options.destination,\n deliveryPrincipal: options.deliveryPrincipal,\n ...(options.admissionGroup === undefined ? {} : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined ? {} : { admissionFence: options.admissionFence }),\n agentId,\n definitions: options.definitions,\n input: payload,\n inputDigest,\n });\n\n const create = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleCreateOptions,\n ): Effect.fn.Return<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n > {\n const nowMillis = yield* currentMillis;\n\n const resolvedInput = yield* resolveInput(agent, input, limits.maxInputBytes).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const creationFingerprint = yield* fingerprint(\n agent.definition.id,\n resolvedInput.digest,\n options,\n );\n\n const key = keyOf(options.scope, options.scheduleId);\n\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n });\n const existing = yield* store.get(key);\n\n if (existing !== null) {\n if (existing.creationFingerprint !== creationFingerprint) {\n return yield* ScheduleConflict.make({ reason: \"creation\", key });\n }\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: existing.configuration,\n });\n\n return asSnapshot(existing, nowMillis);\n }\n\n const timing = yield* Effect.fromResult(\n normalizeScheduleTiming(options.timing, nowMillis, limits.minIntervalMillis),\n );\n\n const nextAtMillis = yield* Effect.fromResult(scheduleInitialCursor(timing, nowMillis));\n\n if (nextAtMillis === null) {\n return yield* ScheduleValidationError.make({ message: \"Timing has no next occurrence\" });\n }\n\n const nextConfiguration = configuration(\n agent.definition.id,\n resolvedInput.payload,\n resolvedInput.digest,\n options,\n timing,\n );\n\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: nextConfiguration,\n });\n\n const record: ScheduleRecord = {\n schemaVersion: 1,\n owner: options.scope.owner,\n scheduleId: options.scheduleId,\n creationFingerprint,\n createdBy: options.scope.principal,\n createdAtMillis: nowMillis,\n updatedAtMillis: nowMillis,\n configurationRevision: 1,\n version: 1,\n configuration: nextConfiguration,\n state: \"active\",\n nextAtMillis,\n pending: null,\n lastReceipt: null,\n lastRefusal: null,\n lastSkippedRange: null,\n };\n\n const inserted = yield* store.insert(record, limits.maxSchedulesPerOwner);\n\n yield* wake.notify;\n\n return asSnapshot(inserted, nowMillis);\n });\n\n const update = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleUpdateOptions,\n ): Effect.fn.Return<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n > {\n const nowMillis = yield* currentMillis;\n const key = keyOf(options.scope, options.scheduleId);\n\n yield* authorizer.manage({\n operation: \"update\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n });\n yield* validateRequestedFields(options);\n const existing = yield* store.get(key);\n\n if (existing === null) return yield* notFound(key);\n if (existing.configurationRevision !== options.expectedRevision) {\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n }\n\n const resolvedInput = yield* resolveInput(agent, input, limits.maxInputBytes).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const timingRequest =\n options.timing._tag === \"Interval\" &&\n options.timing.anchorMillis === undefined &&\n existing.configuration.timing._tag === \"Interval\" &&\n existing.configuration.timing.everyMillis === options.timing.everyMillis\n ? { ...options.timing, anchorMillis: existing.configuration.timing.anchorMillis }\n : options.timing;\n\n const timing = yield* Effect.fromResult(\n normalizeScheduleTiming(timingRequest, nowMillis, limits.minIntervalMillis),\n );\n\n const nextAtMillis =\n timing._tag === \"At\"\n ? timing.atMillis\n : yield* Effect.fromResult(scheduleNextAfter(timing, nowMillis));\n\n if (nextAtMillis === null) {\n return yield* ScheduleValidationError.make({ message: \"Timing has no next occurrence\" });\n }\n\n const nextConfiguration = configuration(\n agent.definition.id,\n resolvedInput.payload,\n resolvedInput.digest,\n options,\n timing,\n );\n\n yield* authorizer.manage({\n operation: \"update\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: nextConfiguration,\n });\n\n const changed = yield* store.change(\n key,\n {\n _tag: \"Update\",\n expectedRevision: options.expectedRevision,\n configuration: nextConfiguration,\n nextAtMillis,\n nowMillis,\n },\n limits.maxSchedulesPerOwner,\n );\n\n yield* wake.notify;\n\n return asSnapshot(changed, nowMillis);\n });\n\n const get = Effect.fnUntraced(function* (scope: ScheduleScope, scheduleId: ScheduleId) {\n yield* authorizer.manage({ operation: \"get\", scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n\n return asSnapshot(record, yield* currentMillis);\n });\n\n const list = Effect.fnUntraced(function* (\n scope: ScheduleScope,\n options: ScheduleListOptions = {},\n ) {\n yield* authorizer.manage({ operation: \"list\", scope });\n const limit = options.limit ?? 50;\n\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n return yield* ScheduleValidationError.make({\n message: \"Schedule page limit must be an integer from 1 through 100\",\n });\n }\n\n const page = yield* store.list({\n owner: scope.owner,\n ...(options.after === undefined ? {} : { after: options.after }),\n limit,\n });\n\n const nowMillis = yield* currentMillis;\n\n return { items: page.items.map((record) => asSnapshot(record, nowMillis)), next: page.next };\n });\n\n const control = Effect.fnUntraced(function* (\n operation: \"pause\" | \"resume\" | \"cancel\",\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ): Effect.fn.Return<ScheduleSnapshot, ScheduleManagementFailure> {\n yield* authorizer.manage({ operation, scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n\n const attempt = (): Effect.Effect<ScheduleRecord, ScheduleManagementFailure> =>\n Effect.suspend(() =>\n Effect.gen(function* () {\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n if (record.configurationRevision !== expectedRevision) {\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n }\n if (operation === \"resume\" && record.state === \"active\") return record;\n const nowMillis = yield* currentMillis;\n\n const nextAtMillis =\n operation === \"resume\"\n ? yield* Effect.fromResult(\n scheduleResumeCursor(record.configuration.timing, record.nextAtMillis, nowMillis),\n )\n : operation === \"cancel\"\n ? null\n : record.nextAtMillis;\n\n const skippedRange =\n operation === \"resume\" &&\n record.configuration.timing._tag !== \"At\" &&\n record.nextAtMillis !== null &&\n nextAtMillis !== null &&\n nextAtMillis > record.nextAtMillis\n ? { fromMillis: record.nextAtMillis, toMillis: nextAtMillis }\n : null;\n\n return yield* store\n .change(\n key,\n {\n _tag: \"Control\",\n expectedRevision,\n expectedVersion: record.version,\n action: operation,\n nextAtMillis,\n nowMillis,\n skippedRange,\n },\n limits.maxSchedulesPerOwner,\n )\n .pipe(\n Effect.catchTag(\"ScheduleConflict\", (error) =>\n error.reason === \"revision\" ? attempt() : Effect.fail(error),\n ),\n );\n }),\n );\n\n const changed = yield* attempt();\n\n yield* wake.notify;\n\n return asSnapshot(changed, yield* currentMillis);\n });\n\n const recover = Effect.fn(\"Scheduling.recover\")(function* (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n expectedGeneration: number,\n ) {\n yield* authorizer.manage({ operation: \"recover\", scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n if (record.configurationRevision !== expectedRevision)\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n const time = yield* currentMillis;\n\n if (record.pending === null) return asSnapshot(record, time);\n\n const recovered = yield* store.change(key, {\n _tag: \"Recover\",\n expectedGeneration,\n expectedRevision,\n occurrenceId: record.pending.envelope.occurrenceId,\n nowMillis: time,\n });\n\n yield* wake.notify;\n\n return asSnapshot(recovered, time);\n });\n\n return Scheduling.of({\n recover,\n create,\n update,\n get,\n list,\n pause: (scope, id, revision) => control(\"pause\", scope, id, revision),\n resume: (scope, id, revision) => control(\"resume\", scope, id, revision),\n cancel: (scope, id, revision) => control(\"cancel\", scope, id, revision),\n });\n});\n\nconst makeDriver = Effect.fnUntraced(function* (limits: SchedulingLimits) {\n const store = yield* ScheduleStore;\n const authorizer = yield* ScheduleAuthorizer;\n const admission = yield* ScheduledInputAdmission;\n const failpoint = yield* ScheduleFailpoint;\n const crypto = yield* Crypto.Crypto;\n const admissionSemaphore = yield* Semaphore.make(limits.admissionConcurrency);\n\n const withCrypto = <A, E>(effect: Effect.Effect<A, E, Crypto.Crypto>) =>\n Effect.provideService(effect, Crypto.Crypto, crypto);\n\n const retry = Effect.fnUntraced(function* (\n key: ScheduleKey,\n record: ScheduleRecord,\n reason: ScheduleRetryReason,\n nowMillis: number,\n ) {\n if (record.pending === null) return record;\n const current = record.pending.retry;\n\n const delay = Math.min(\n limits.retryBaseMillis * 2 ** Math.min(current.attempts, 52),\n limits.retryMaxMillis,\n );\n\n return yield* store.change(key, {\n _tag: \"Retry\",\n occurrenceId: record.pending.envelope.occurrenceId,\n retry: {\n generation: current.generation,\n attempts: current.attempts + 1,\n automaticAttempts: current.automaticAttempts + 1,\n parked: current.automaticAttempts + 1 >= (limits.maxAutomaticAttempts ?? 8),\n nextAttemptAtMillis: Math.min(nowMillis + delay, 8_640_000_000_000_000),\n lastAttemptAtMillis: nowMillis,\n lastFailure: reason,\n },\n nowMillis,\n });\n });\n\n const verifyPending = Effect.fnUntraced(function* (key: ScheduleKey, record: ScheduleRecord) {\n const pending = record.pending;\n\n if (pending === null) return;\n const envelope = pending.envelope;\n\n const occurrenceId = yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: envelope.owner,\n scheduleId: envelope.scheduleId,\n configurationRevision: envelope.configurationRevision,\n intendedAtMillis: envelope.intendedAtMillis,\n }),\n ).pipe(Effect.mapError(() => corrupt(\"process\")));\n\n const usesCurrentConfiguration =\n envelope.configurationRevision === record.configurationRevision;\n\n const expectedThreadId = usesCurrentConfiguration\n ? record.configuration.destination._tag === \"ExistingThread\"\n ? record.configuration.destination.threadId\n : Schema.decodeSync(ThreadId)(`schedule-thread:${envelope.occurrenceId}`)\n : null;\n\n const expectedAdmissionKey = Schema.decodeSync(IdempotencyKey)(\n `schedule-occurrence:${envelope.occurrenceId}`,\n );\n\n const digest = yield* withCrypto(digestJson(envelope.input)).pipe(\n Effect.mapError(() => corrupt(\"process\")),\n );\n\n if (\n envelope.schemaVersion !== 1 ||\n envelope.owner.tenantId !== key.owner.tenantId ||\n envelope.owner.ownerId !== key.owner.ownerId ||\n envelope.scheduleId !== key.scheduleId ||\n envelope.configurationRevision > record.configurationRevision ||\n envelope.occurrenceId !== occurrenceId ||\n (usesCurrentConfiguration &&\n (envelope.deliveryPrincipal !== record.configuration.deliveryPrincipal ||\n envelope.agentId !== record.configuration.agentId ||\n !equivalentDefinitions(envelope.definitions, record.configuration.definitions) ||\n !equivalentInput(envelope.input, record.configuration.input) ||\n envelope.inputDigest !== record.configuration.inputDigest)) ||\n envelope.inputDigest !== digest ||\n (expectedThreadId !== null && envelope.threadId !== expectedThreadId) ||\n envelope.admissionKey !== expectedAdmissionKey\n ) {\n return yield* corrupt(\"process\");\n }\n });\n\n const deliverPending = Effect.fnUntraced(function* (\n key: ScheduleKey,\n record: ScheduleRecord,\n nowMillis: number,\n ) {\n if (\n record.pending === null ||\n record.pending.retry.parked === true ||\n record.pending.retry.nextAttemptAtMillis > nowMillis\n ) {\n return record;\n }\n yield* verifyPending(key, record);\n const envelope = record.pending.envelope;\n\n const outcome = yield* admissionSemaphore.withPermit(\n admitPreparedInput(admission.submit(envelope), limits.admissionTimeoutMillis).pipe(\n Effect.tap((outcome) =>\n outcome._tag === \"Receipt\" ? failpoint.hit(\"schedule:admission:after\") : Effect.void,\n ),\n ),\n );\n\n const completedAtMillis = yield* currentMillis;\n\n if (outcome._tag === \"Receipt\") {\n if (outcome.receipt.threadId !== envelope.threadId) {\n return yield* corrupt(\"admission\");\n }\n\n return yield* store\n .change(key, {\n _tag: \"Complete\",\n occurrenceId: envelope.occurrenceId,\n receipt: outcome.receipt,\n nowMillis: completedAtMillis,\n })\n .pipe(\n Effect.catchTag(\"ScheduleStorageError\", (error) =>\n error.reason === \"unavailable\"\n ? retry(key, record, \"storage\", completedAtMillis)\n : Effect.fail(error),\n ),\n );\n }\n if (outcome._tag === \"Refused\") {\n const refusal: ScheduleRefusal = {\n atMillis: completedAtMillis,\n intendedAtMillis: envelope.intendedAtMillis,\n occurrenceId: envelope.occurrenceId,\n phase: \"admission\",\n code: outcome.error.code,\n };\n\n return yield* store\n .change(key, {\n _tag: \"Refuse\",\n occurrenceId: envelope.occurrenceId,\n refusal,\n nowMillis: completedAtMillis,\n })\n .pipe(\n Effect.catchTag(\"ScheduleStorageError\", (error) =>\n error.reason === \"unavailable\"\n ? retry(key, record, \"storage\", completedAtMillis)\n : Effect.fail(error),\n ),\n );\n }\n\n return yield* retry(key, record, outcome.reason, completedAtMillis);\n });\n\n const processRecord = Effect.fnUntraced(function* (\n key: ScheduleKey,\n initial: ScheduleRecord,\n nowMillis: number,\n ): Effect.fn.Return<ScheduleRecord, ScheduleProcessFailure> {\n if (initial.pending !== null) return yield* deliverPending(key, initial, nowMillis);\n if (\n initial.state !== \"active\" ||\n initial.nextAtMillis === null ||\n initial.nextAtMillis > nowMillis\n ) {\n return initial;\n }\n\n const currentInputDigest = yield* withCrypto(digestJson(initial.configuration.input)).pipe(\n Effect.mapError(() =>\n ScheduleStorageError.make({ operation: \"prepare\", reason: \"unavailable\" }),\n ),\n );\n\n if (currentInputDigest !== initial.configuration.inputDigest) {\n return yield* corrupt(\"prepare\");\n }\n\n const due = yield* Effect.fromResult(\n scheduleDueOccurrence(initial.configuration.timing, initial.nextAtMillis, nowMillis),\n );\n\n if (due === null) return initial;\n\n const occurrenceId = yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: initial.owner,\n scheduleId: initial.scheduleId,\n configurationRevision: initial.configurationRevision,\n intendedAtMillis: due.intendedAtMillis,\n }),\n ).pipe(Effect.mapError(() => corrupt(\"prepare\")));\n\n const occurrence = {\n key,\n configurationRevision: initial.configurationRevision,\n configuration: initial.configuration,\n intendedAtMillis: due.intendedAtMillis,\n occurrenceId,\n };\n\n const authorization = yield* authorizer.prepare(occurrence).pipe(Effect.result);\n\n if (Result.isFailure(authorization)) {\n if (authorization.failure._tag === \"ScheduleStorageError\") {\n return yield* authorization.failure;\n }\n\n return yield* store.change(key, {\n _tag: \"DenyPreparation\",\n expectedRevision: initial.configurationRevision,\n expectedCursor: initial.nextAtMillis,\n refusal: {\n atMillis: nowMillis,\n intendedAtMillis: due.intendedAtMillis,\n occurrenceId,\n phase: \"preparation\",\n code: authorization.failure.code,\n },\n nowMillis,\n });\n }\n\n const threadId =\n initial.configuration.destination._tag === \"ExistingThread\"\n ? initial.configuration.destination.threadId\n : Schema.decodeSync(ThreadId)(`schedule-thread:${occurrenceId}`);\n\n const admissionKey = Schema.decodeSync(IdempotencyKey)(`schedule-occurrence:${occurrenceId}`);\n\n const prepared = yield* store.change(key, {\n _tag: \"Prepare\",\n expectedRevision: initial.configurationRevision,\n expectedCursor: initial.nextAtMillis,\n envelope: {\n schemaVersion: 1,\n owner: initial.owner,\n scheduleId: initial.scheduleId,\n configurationRevision: initial.configurationRevision,\n intendedAtMillis: due.intendedAtMillis,\n preparedAtMillis: nowMillis,\n occurrenceId,\n threadId,\n deliveryPrincipal: initial.configuration.deliveryPrincipal,\n ...(initial.configuration.admissionGroup === undefined\n ? {}\n : { admissionGroup: initial.configuration.admissionGroup }),\n ...(initial.configuration.admissionFence === undefined\n ? {}\n : { admissionFence: initial.configuration.admissionFence }),\n agentId: initial.configuration.agentId,\n definitions: initial.configuration.definitions,\n input: initial.configuration.input,\n inputDigest: initial.configuration.inputDigest,\n admissionKey,\n authorization: authorization.success,\n },\n nextAtMillis: due.nextAtMillis,\n skippedRange: due.skippedRange,\n nowMillis,\n });\n\n return yield* deliverPending(key, prepared, nowMillis);\n });\n\n const process = Effect.fnUntraced(function* (key: ScheduleKey) {\n const nowMillis = yield* currentMillis;\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n\n const processed = yield* processRecord(key, record, nowMillis).pipe(\n Effect.catchTag(\"ScheduleConflict\", () =>\n store\n .get(key)\n .pipe(\n Effect.flatMap((current) =>\n current === null\n ? Effect.fail(notFound(key))\n : processRecord(key, current, nowMillis),\n ),\n ),\n ),\n );\n\n return processed;\n });\n\n const runDue = Effect.fnUntraced(function* (owner?: ScheduleOwner) {\n const nowMillis = yield* currentMillis;\n let after: ScheduleDueCursor | undefined;\n let processed = 0;\n let failed = 0;\n\n while (true) {\n const due = yield* store.due(nowMillis, limits.dueBatchSize, owner, after);\n\n if (due.length === 0) break;\n yield* Effect.forEach(\n due,\n (key) =>\n process(key).pipe(\n Effect.matchCauseEffect({\n onSuccess: () =>\n Effect.sync(() => {\n processed += 1;\n }),\n onFailure: (cause) =>\n Cause.hasInterrupts(cause)\n ? Effect.interrupt\n : Effect.gen(function* () {\n failed += 1;\n yield* Effect.logWarning(\"Schedule processing failed\").pipe(\n Effect.annotateLogs({\n failureTag: Option.match(Cause.findErrorOption(cause), {\n onNone: () => \"Defect\",\n onSome: (error) => error._tag,\n }),\n }),\n );\n }),\n }),\n ),\n { concurrency: limits.admissionConcurrency },\n );\n after = due.at(-1);\n if (due.length < limits.dueBatchSize) break;\n }\n\n return { processed, failed };\n });\n\n return ScheduleDriver.of({ process, runDue });\n});\n\nconst corrupt = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"corrupt\" });\n\nconst validateLimits = (limits: SchedulingLimits) =>\n Schema.decodeEffect(SchedulingLimits)(limits).pipe(\n Effect.mapError((error) =>\n ScheduleValidationError.make({ message: `Invalid Scheduling limits: ${error.message}` }),\n ),\n Effect.filterOrFail(\n (validated) => validated.retryBaseMillis <= validated.retryMaxMillis,\n () =>\n ScheduleValidationError.make({\n message: \"Scheduling retryBaseMillis must not exceed retryMaxMillis\",\n }),\n ),\n );\n\nexport class Scheduling extends Context.Service<\n Scheduling,\n {\n readonly create: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleCreateOptions,\n ) => Effect.Effect<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n >;\n readonly update: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleUpdateOptions,\n ) => Effect.Effect<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n >;\n readonly get: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly list: (\n scope: ScheduleScope,\n options?: ScheduleListOptions,\n ) => Effect.Effect<ScheduleSnapshotPage, ScheduleManagementFailure>;\n readonly pause: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly resume: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly recover: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n expectedGeneration: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly cancel: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n }\n>()(\"@effect-agent/thread/Scheduling\") {\n static layer(\n limits: SchedulingLimits = defaultSchedulingLimits,\n ): Layer.Layer<\n Scheduling,\n ScheduleValidationError,\n ScheduleStore | ScheduleAuthorizer | ScheduleWake | Crypto.Crypto\n > {\n return Layer.effect(Scheduling, validateLimits(limits).pipe(Effect.flatMap(makeManagement)));\n }\n}\n\nexport const ScheduleWakeNoop: Layer.Layer<ScheduleWake> = Layer.succeed(ScheduleWake, {\n notify: Effect.void,\n await: Effect.never,\n});\n\n/** Privileged host capability. Never provide this service to management callers or model tools. */\nexport class ScheduleDriver extends Context.Service<\n ScheduleDriver,\n {\n readonly process: (key: ScheduleKey) => Effect.Effect<ScheduleRecord, ScheduleProcessFailure>;\n readonly runDue: (\n owner?: ScheduleOwner,\n ) => Effect.Effect<\n { readonly processed: number; readonly failed: number },\n ScheduleStorageError\n >;\n }\n>()(\"@effect-agent/thread/ScheduleDriver\") {\n static layer(\n limits: SchedulingLimits = defaultSchedulingLimits,\n ): Layer.Layer<\n ScheduleDriver,\n ScheduleValidationError,\n ScheduleStore | ScheduleAuthorizer | ScheduledInputAdmission | Crypto.Crypto\n > {\n return Layer.effect(ScheduleDriver, validateLimits(limits).pipe(Effect.flatMap(makeDriver)));\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Scheduling-07_dsGED.mjs","names":["ScheduleTimingRequestSchema","ScheduleDestinationSchema"],"sources":["../src/durable/internal/schedule-time.ts","../src/durable/Scheduling.ts"],"sourcesContent":["import { Cron, DateTime, Option, Result, Schema } from \"effect\";\n\nimport {\n ScheduleValidationError,\n ScheduleInstant,\n type ScheduleSkippedRange,\n type ScheduleTiming,\n type ScheduleTimingRequest,\n} from \"../Schedule.ts\";\n\nconst invalid = (message: string) => Result.fail(ScheduleValidationError.make({ message }));\n\nconst checkedInstant = (millis: number, label: string) =>\n Schema.decodeResult(ScheduleInstant)(millis).pipe(\n Result.mapError(() =>\n ScheduleValidationError.make({\n message: `${label} is outside the supported ScheduleInstant range`,\n }),\n ),\n );\n\nconst values = (set: ReadonlySet<number>, size: number): ReadonlyArray<number> =>\n set.size === 0 ? Array.from({ length: size }, (_, index) => index) : [...set];\n\n/**\n * Cron frequency proof without calendar enumeration. It checks the minimum circular spacing of\n * the allowed hour/minute pairs. Day restrictions may make a rule sparser, so this deliberately\n * rejects some safe rules when a configured minimum exceeds one minute.\n */\nconst validateCronFrequency = (\n cron: Cron.Cron,\n minimumMillis: number,\n): Result.Result<void, ScheduleValidationError> => {\n if (cron.seconds.size !== 1) {\n return invalid(\"Cron must select exactly one seconds value\");\n }\n if (minimumMillis <= 60_000) return Result.succeed(undefined);\n if (\n Option.isSome(cron.tz) &&\n DateTime.isTimeZoneNamed(cron.tz.value) &&\n cron.tz.value.id !== \"UTC\"\n ) {\n return invalid(\"Cron minimums above one minute require UTC or a fixed-offset time zone\");\n }\n\n const minuteOfDay = values(cron.hours, 24).flatMap((hour) =>\n values(cron.minutes, 60).map((minute) => hour * 60 + minute),\n );\n\n minuteOfDay.sort((left, right) => left - right);\n let minimumGap = 24 * 60;\n\n for (let index = 0; index < minuteOfDay.length; index += 1) {\n const current = minuteOfDay[index];\n const next = minuteOfDay[(index + 1) % minuteOfDay.length];\n\n if (current === undefined || next === undefined) continue;\n const gap = next > current ? next - current : 24 * 60 - current + next;\n\n minimumGap = Math.min(minimumGap, gap);\n }\n\n return minimumGap * 60_000 >= minimumMillis\n ? Result.succeed(undefined)\n : invalid(`Cron may fire more often than the configured ${minimumMillis}ms minimum`);\n};\n\nexport const parseScheduleCron = (\n expression: string,\n timeZone: string,\n minimumMillis: number,\n): Result.Result<Cron.Cron, ScheduleValidationError> => {\n const parsed = Cron.parse(expression, timeZone);\n\n if (Result.isFailure(parsed)) return invalid(parsed.failure.message);\n const frequency = validateCronFrequency(parsed.success, minimumMillis);\n\n return Result.isFailure(frequency)\n ? Result.fail(frequency.failure)\n : Result.succeed(parsed.success);\n};\n\nexport const normalizeScheduleTiming = (\n request: ScheduleTimingRequest,\n nowMillis: number,\n minimumMillis: number,\n): Result.Result<ScheduleTiming, ScheduleValidationError> => {\n switch (request._tag) {\n case \"At\":\n return Result.succeed(request);\n case \"After\": {\n const at = checkedInstant(nowMillis + request.delayMillis, \"Relative deadline\");\n\n return Result.map(at, (atMillis) => ({ _tag: \"At\" as const, atMillis }));\n }\n case \"Interval\": {\n if (request.everyMillis < minimumMillis) {\n return invalid(`Interval must be at least ${minimumMillis}ms`);\n }\n\n const anchor = checkedInstant(\n request.anchorMillis ?? nowMillis + request.everyMillis,\n \"Interval anchor\",\n );\n\n return Result.map(anchor, (anchorMillis) => ({\n _tag: \"Interval\" as const,\n everyMillis: request.everyMillis,\n anchorMillis,\n }));\n }\n case \"Cron\": {\n const timeZone = request.timeZone ?? \"UTC\";\n const cron = parseScheduleCron(request.expression, timeZone, minimumMillis);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n return Result.succeed({ _tag: \"Cron\", expression: request.expression, timeZone });\n }\n }\n};\n\nconst parsedStoredCron = (timing: Extract<ScheduleTiming, { _tag: \"Cron\" }>) => {\n const parsed = Cron.parse(timing.expression, timing.timeZone);\n\n return Result.isFailure(parsed)\n ? invalid(`Stored cron is invalid: ${parsed.failure.message}`)\n : Result.succeed(parsed.success);\n};\n\n/** Strictly selects the first occurrence after an instant. */\nexport const scheduleNextAfter = (\n timing: ScheduleTiming,\n afterMillis: number,\n): Result.Result<number | null, ScheduleValidationError> => {\n switch (timing._tag) {\n case \"At\":\n return Result.succeed(timing.atMillis > afterMillis ? timing.atMillis : null);\n case \"Interval\": {\n if (afterMillis < timing.anchorMillis) return Result.succeed(timing.anchorMillis);\n const steps = Math.floor((afterMillis - timing.anchorMillis) / timing.everyMillis) + 1;\n const next = timing.anchorMillis + steps * timing.everyMillis;\n\n return checkedInstant(next, \"Next interval occurrence\");\n }\n case \"Cron\": {\n const cron = parsedStoredCron(timing);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n return Result.try({\n try: () => {\n let next = Cron.next(cron.success, afterMillis).getTime();\n\n // Inside a fall fold Effect may select the first, already elapsed local instant.\n while (next <= afterMillis) {\n const following = Cron.next(cron.success, next).getTime();\n\n if (following <= next) return invalid(\"Cron has no supported next firing\");\n next = following;\n }\n\n return checkedInstant(next, \"Next cron occurrence\");\n },\n catch: () => ScheduleValidationError.make({ message: \"Cron has no supported next firing\" }),\n }).pipe(Result.flatMap((result) => result));\n }\n }\n};\n\n/** Initial cursor. Past one-shots remain due; recurring rules start strictly after registration. */\nexport const scheduleInitialCursor = (\n timing: ScheduleTiming,\n nowMillis: number,\n): Result.Result<number | null, ScheduleValidationError> =>\n timing._tag === \"At\" ? Result.succeed(timing.atMillis) : scheduleNextAfter(timing, nowMillis);\n\nexport interface DueScheduleOccurrence {\n readonly intendedAtMillis: number;\n readonly nextAtMillis: number | null;\n readonly skippedRange: ScheduleSkippedRange | null;\n}\n\n/** Coalesces recurring occurrences using the same forward sequence as registration. */\nexport const scheduleDueOccurrence = (\n timing: ScheduleTiming,\n cursorMillis: number,\n nowMillis: number,\n): Result.Result<DueScheduleOccurrence | null, ScheduleValidationError> => {\n if (cursorMillis > nowMillis) return Result.succeed(null);\n if (timing._tag === \"At\") {\n return Result.succeed({\n intendedAtMillis: cursorMillis,\n nextAtMillis: null,\n skippedRange: null,\n });\n }\n\n let intendedAtMillis: number;\n\n if (timing._tag === \"Interval\") {\n const steps = Math.floor((nowMillis - timing.anchorMillis) / timing.everyMillis);\n\n intendedAtMillis = Math.max(cursorMillis, timing.anchorMillis + steps * timing.everyMillis);\n } else {\n const cron = parsedStoredCron(timing);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n const due = Result.try({\n try: () => {\n let intended = cursorMillis;\n // Reverse traversal is safe only without offset transitions. Named-zone reverse\n // traversal has different gap/fold semantics from the forward occurrence sequence.\n const zone = Option.getOrUndefined(cron.success.tz);\n\n if (zone !== undefined && (DateTime.isTimeZoneOffset(zone) || zone.id === \"UTC\")) {\n intended = Math.max(cursorMillis, Cron.prev(cron.success, nowMillis + 1_000).getTime());\n } else {\n // Seek by calendar date in UTC, where reverse traversal has no DST ambiguity.\n // Include two prior civil days to cover even IANA date-line shifts. There are no\n // matching dates between this seed day and that boundary, so forward traversal\n // visits only the seed day and the recent days, regardless of downtime length.\n const calendar = Cron.make({\n ...cron.success,\n seconds: [0],\n minutes: [0],\n hours: [0],\n tz: DateTime.zoneMakeNamedUnsafe(\"UTC\"),\n });\n\n const localDay = DateTime.makeUnsafe(\n DateTime.toDate(DateTime.makeZonedUnsafe(nowMillis, { timeZone: zone })),\n ).pipe(DateTime.startOf(\"day\"), DateTime.subtract({ days: 2 }));\n\n const seedDay = Cron.prev(calendar, DateTime.toEpochMillis(localDay) + 1_000);\n\n const seed =\n DateTime.makeZonedUnsafe(seedDay, {\n timeZone: zone,\n adjustForTimeZone: true,\n }).pipe(DateTime.toEpochMillis) - 1_000;\n\n if (seed > cursorMillis) {\n const first = Cron.next(cron.success, seed).getTime();\n\n if (first <= nowMillis) intended = Math.max(intended, first);\n }\n }\n let next = Cron.next(cron.success, intended).getTime();\n\n while (next <= nowMillis) {\n if (next <= intended) return invalid(\"Cron has no supported due firing\");\n intended = next;\n next = Cron.next(cron.success, intended).getTime();\n }\n\n return Result.succeed({ intended, next });\n },\n catch: () => ScheduleValidationError.make({ message: \"Cron has no supported due firing\" }),\n }).pipe(Result.flatMap((result) => result));\n\n if (Result.isFailure(due)) return Result.fail(due.failure);\n const next = checkedInstant(due.success.next, \"Next cron occurrence\");\n\n if (Result.isFailure(next)) return Result.fail(next.failure);\n\n return Result.succeed({\n intendedAtMillis: due.success.intended,\n nextAtMillis: next.success,\n skippedRange:\n due.success.intended === cursorMillis\n ? null\n : {\n fromMillis: cursorMillis,\n toMillis: due.success.intended,\n },\n });\n }\n\n const next = scheduleNextAfter(timing, nowMillis);\n\n if (Result.isFailure(next)) return Result.fail(next.failure);\n\n return Result.succeed({\n intendedAtMillis,\n nextAtMillis: next.success,\n skippedRange:\n intendedAtMillis === cursorMillis\n ? null\n : { fromMillis: cursorMillis, toMillis: intendedAtMillis },\n });\n};\n\nexport const scheduleResumeCursor = (\n timing: ScheduleTiming,\n existingCursor: number | null,\n nowMillis: number,\n): Result.Result<number | null, ScheduleValidationError> => {\n if (timing._tag === \"At\") return Result.succeed(existingCursor);\n\n return scheduleNextAfter(timing, nowMillis);\n};\n","import {\n Cause,\n Context,\n Crypto,\n DateTime,\n Effect,\n Layer,\n Option,\n Result,\n Schema,\n Semaphore,\n} from \"effect\";\n\nimport { type AgentId, ThreadId } from \"../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../core/internal/utf8.ts\";\nimport { digestJson } from \"./Digest.ts\";\nimport type { DurableSubmitAgent } from \"./DurableAgentRuntime.ts\";\nimport {\n normalizeScheduleTiming,\n scheduleDueOccurrence,\n scheduleInitialCursor,\n scheduleNextAfter,\n scheduleResumeCursor,\n} from \"./internal/schedule-time.ts\";\nimport { admitPreparedInput } from \"./PreparedInputAdmission.ts\";\nimport { DefinitionDigests, type Digest, PersistedJson } from \"./Records.ts\";\nimport {\n defaultSchedulingLimits,\n type ScheduleAuthorizationError,\n ScheduleAuthorizer,\n ScheduleConflict,\n type ScheduleConfiguration,\n ScheduleDestination as ScheduleDestinationSchema,\n type ScheduleDestination,\n ScheduleFailpoint,\n type ScheduleId,\n type ScheduleDueCursor,\n ScheduleInstant,\n type ScheduleKey,\n SchedulingLimits,\n ScheduleNotFound,\n type ScheduleOwner,\n type ScheduleRecord,\n type ScheduleRefusal,\n type ScheduleRetryReason,\n type ScheduleScope,\n type ScheduleSnapshot,\n type ScheduleSnapshotPage,\n ScheduleStorageError,\n ScheduleStore,\n type ScheduleStoreFailure,\n ScheduleTimingRequest as ScheduleTimingRequestSchema,\n type ScheduleTimingRequest,\n ScheduleValidationError,\n ScheduledInputAdmission,\n ScheduleWake,\n} from \"./Schedule.ts\";\nimport { type AdmissionFence, IdempotencyKey, type Principal } from \"./SubmissionLedger.ts\";\n\nexport interface ScheduleCreateOptions {\n readonly scope: ScheduleScope;\n readonly scheduleId: ScheduleId;\n readonly timing: ScheduleTimingRequest;\n readonly destination: ScheduleDestination;\n readonly deliveryPrincipal: Principal;\n readonly admissionGroup?: string;\n readonly admissionFence?: AdmissionFence;\n readonly definitions: DefinitionDigests;\n}\n\nexport interface ScheduleUpdateOptions extends ScheduleCreateOptions {\n readonly expectedRevision: number;\n}\n\nexport interface ScheduleListOptions {\n readonly after?: ScheduleId | undefined;\n readonly limit?: number | undefined;\n}\n\nexport type ScheduleManagementFailure =\n | ScheduleValidationError\n | ScheduleAuthorizationError\n | ScheduleStoreFailure;\n\nexport type ScheduleProcessFailure =\n | ScheduleValidationError\n | ScheduleStoreFailure\n | ScheduleStorageError;\n\nconst equivalentDefinitions = Schema.toEquivalence(DefinitionDigests);\nconst equivalentInput = Schema.toEquivalence(PersistedJson);\n\nconst keyOf = (scope: ScheduleScope, scheduleId: ScheduleId): ScheduleKey => ({\n owner: scope.owner,\n scheduleId,\n});\n\nconst notFound = (key: ScheduleKey) => ScheduleNotFound.make({ key });\n\nconst asSnapshot = (record: ScheduleRecord, observedAtMillis: number): ScheduleSnapshot => {\n const intendedAtMillis = record.pending?.envelope.intendedAtMillis ?? record.nextAtMillis;\n\n return {\n owner: record.owner,\n scheduleId: record.scheduleId,\n createdAtMillis: record.createdAtMillis,\n updatedAtMillis: record.updatedAtMillis,\n configurationRevision: record.configurationRevision,\n configuration: {\n timing: record.configuration.timing,\n destination: record.configuration.destination,\n deliveryPrincipal: record.configuration.deliveryPrincipal,\n ...(record.configuration.admissionGroup === undefined\n ? {}\n : { admissionGroup: record.configuration.admissionGroup }),\n ...(record.configuration.admissionFence === undefined\n ? {}\n : { admissionFence: record.configuration.admissionFence }),\n agentId: record.configuration.agentId,\n },\n state: record.state,\n nextAtMillis: record.nextAtMillis,\n pending:\n record.pending === null\n ? null\n : {\n intendedAtMillis: record.pending.envelope.intendedAtMillis,\n preparedAtMillis: record.pending.envelope.preparedAtMillis,\n configurationRevision: record.pending.envelope.configurationRevision,\n occurrenceId: record.pending.envelope.occurrenceId,\n retry: record.pending.retry,\n },\n lastReceipt: record.lastReceipt,\n lastRefusal: record.lastRefusal,\n lastSkippedRange: record.lastSkippedRange,\n observedAtMillis,\n pendingAgeMillis:\n record.pending === null\n ? null\n : Math.max(0, observedAtMillis - record.pending.envelope.preparedAtMillis),\n latenessMillis:\n intendedAtMillis === null ? 0 : Math.max(0, observedAtMillis - intendedAtMillis),\n };\n};\n\nconst inputByteLength = (input: PersistedJson): number => utf8ByteLength(JSON.stringify(input));\n\nconst currentMillis = DateTime.now.pipe(Effect.map(DateTime.toEpochMillis));\n\nconst validateRequestedFields = Effect.fnUntraced(function* (options: ScheduleCreateOptions) {\n yield* Schema.encodeEffect(ScheduleTimingRequestSchema)(options.timing).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid timing request\" })),\n );\n yield* Schema.encodeEffect(ScheduleDestinationSchema)(options.destination).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid destination\" })),\n );\n yield* Schema.encodeEffect(DefinitionDigests)(options.definitions).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid definition digests\" })),\n );\n});\n\nconst resolveInput = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n maximumBytes: number,\n): Effect.fn.Return<\n { readonly payload: PersistedJson; readonly digest: Digest },\n ScheduleValidationError,\n InputSchema[\"EncodingServices\"] | Crypto.Crypto\n> {\n const encoded = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to encode Agent input\" }),\n ),\n );\n\n const payload = yield* Schema.decodeUnknownEffect(PersistedJson)(encoded).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Agent input does not satisfy the canonical persistence bounds\",\n }),\n ),\n );\n\n if (inputByteLength(payload) > maximumBytes) {\n return yield* ScheduleValidationError.make({\n message: `Encoded Agent input exceeds the configured ${maximumBytes} byte limit`,\n });\n }\n\n const digest = yield* digestJson(payload).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to digest encoded Agent input\" }),\n ),\n );\n\n return { payload, digest };\n});\n\nconst makeManagement = Effect.fnUntraced(function* (limits: SchedulingLimits) {\n const nowMillis = yield* currentMillis;\n\n yield* Schema.decodeEffect(ScheduleInstant)(nowMillis + limits.recoveryPollMillis).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Scheduling recovery deadline exceeds the supported instant range\",\n }),\n ),\n );\n const store = yield* ScheduleStore;\n const authorizer = yield* ScheduleAuthorizer;\n const wake = yield* ScheduleWake;\n const crypto = yield* Crypto.Crypto;\n\n const withCrypto = <A, E>(effect: Effect.Effect<A, E, Crypto.Crypto>) =>\n Effect.provideService(effect, Crypto.Crypto, crypto);\n\n const fingerprint = Effect.fnUntraced(function* (\n agentId: AgentId,\n inputDigest: Digest,\n options: ScheduleCreateOptions,\n ) {\n const timing = yield* Schema.encodeEffect(ScheduleTimingRequestSchema)(options.timing).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid timing request\" })),\n );\n\n const destination = yield* Schema.encodeEffect(ScheduleDestinationSchema)(\n options.destination,\n ).pipe(Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid destination\" })));\n\n const definitions = yield* Schema.encodeEffect(DefinitionDigests)(options.definitions).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Invalid definition digests\" }),\n ),\n );\n\n return yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: options.scope.owner,\n scheduleId: options.scheduleId,\n registeringPrincipal: options.scope.principal,\n deliveryPrincipal: options.deliveryPrincipal,\n ...(options.admissionGroup === undefined ? {} : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined ? {} : { admissionFence: options.admissionFence }),\n agentId,\n definitions,\n destination,\n timing,\n inputDigest,\n }),\n ).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to digest Schedule registration\" }),\n ),\n );\n });\n\n const configuration = (\n agentId: AgentId,\n payload: PersistedJson,\n inputDigest: Digest,\n options: ScheduleCreateOptions,\n timing: ScheduleConfiguration[\"timing\"],\n ): ScheduleConfiguration => ({\n timing,\n destination: options.destination,\n deliveryPrincipal: options.deliveryPrincipal,\n ...(options.admissionGroup === undefined ? {} : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined ? {} : { admissionFence: options.admissionFence }),\n agentId,\n definitions: options.definitions,\n input: payload,\n inputDigest,\n });\n\n const create = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleCreateOptions,\n ): Effect.fn.Return<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n > {\n const nowMillis = yield* currentMillis;\n\n const resolvedInput = yield* resolveInput(agent, input, limits.maxInputBytes).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const creationFingerprint = yield* fingerprint(\n agent.definition.id,\n resolvedInput.digest,\n options,\n );\n\n const key = keyOf(options.scope, options.scheduleId);\n\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n });\n const existing = yield* store.get(key);\n\n if (existing !== null) {\n if (existing.creationFingerprint !== creationFingerprint) {\n return yield* ScheduleConflict.make({ reason: \"creation\", key });\n }\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: existing.configuration,\n });\n\n return asSnapshot(existing, nowMillis);\n }\n\n const timing = yield* Effect.fromResult(\n normalizeScheduleTiming(options.timing, nowMillis, limits.minIntervalMillis),\n );\n\n const nextAtMillis = yield* Effect.fromResult(scheduleInitialCursor(timing, nowMillis));\n\n if (nextAtMillis === null) {\n return yield* ScheduleValidationError.make({ message: \"Timing has no next occurrence\" });\n }\n\n const nextConfiguration = configuration(\n agent.definition.id,\n resolvedInput.payload,\n resolvedInput.digest,\n options,\n timing,\n );\n\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: nextConfiguration,\n });\n\n const record: ScheduleRecord = {\n schemaVersion: 1,\n owner: options.scope.owner,\n scheduleId: options.scheduleId,\n creationFingerprint,\n createdBy: options.scope.principal,\n createdAtMillis: nowMillis,\n updatedAtMillis: nowMillis,\n configurationRevision: 1,\n version: 1,\n configuration: nextConfiguration,\n state: \"active\",\n nextAtMillis,\n pending: null,\n lastReceipt: null,\n lastRefusal: null,\n lastSkippedRange: null,\n };\n\n const inserted = yield* store.insert(record, limits.maxSchedulesPerOwner);\n\n yield* wake.notify;\n\n return asSnapshot(inserted, nowMillis);\n });\n\n const update = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleUpdateOptions,\n ): Effect.fn.Return<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n > {\n const nowMillis = yield* currentMillis;\n const key = keyOf(options.scope, options.scheduleId);\n\n yield* authorizer.manage({\n operation: \"update\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n });\n yield* validateRequestedFields(options);\n const existing = yield* store.get(key);\n\n if (existing === null) return yield* notFound(key);\n if (existing.configurationRevision !== options.expectedRevision) {\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n }\n\n const resolvedInput = yield* resolveInput(agent, input, limits.maxInputBytes).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const timingRequest =\n options.timing._tag === \"Interval\" &&\n options.timing.anchorMillis === undefined &&\n existing.configuration.timing._tag === \"Interval\" &&\n existing.configuration.timing.everyMillis === options.timing.everyMillis\n ? { ...options.timing, anchorMillis: existing.configuration.timing.anchorMillis }\n : options.timing;\n\n const timing = yield* Effect.fromResult(\n normalizeScheduleTiming(timingRequest, nowMillis, limits.minIntervalMillis),\n );\n\n const nextAtMillis =\n timing._tag === \"At\"\n ? timing.atMillis\n : yield* Effect.fromResult(scheduleNextAfter(timing, nowMillis));\n\n if (nextAtMillis === null) {\n return yield* ScheduleValidationError.make({ message: \"Timing has no next occurrence\" });\n }\n\n const nextConfiguration = configuration(\n agent.definition.id,\n resolvedInput.payload,\n resolvedInput.digest,\n options,\n timing,\n );\n\n yield* authorizer.manage({\n operation: \"update\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: nextConfiguration,\n });\n\n const changed = yield* store.change(\n key,\n {\n _tag: \"Update\",\n expectedRevision: options.expectedRevision,\n configuration: nextConfiguration,\n nextAtMillis,\n nowMillis,\n },\n limits.maxSchedulesPerOwner,\n );\n\n yield* wake.notify;\n\n return asSnapshot(changed, nowMillis);\n });\n\n const get = Effect.fnUntraced(function* (scope: ScheduleScope, scheduleId: ScheduleId) {\n yield* authorizer.manage({ operation: \"get\", scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n\n return asSnapshot(record, yield* currentMillis);\n });\n\n const list = Effect.fnUntraced(function* (\n scope: ScheduleScope,\n options: ScheduleListOptions = {},\n ) {\n yield* authorizer.manage({ operation: \"list\", scope });\n const limit = options.limit ?? 50;\n\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n return yield* ScheduleValidationError.make({\n message: \"Schedule page limit must be an integer from 1 through 100\",\n });\n }\n\n const page = yield* store.list({\n owner: scope.owner,\n ...(options.after === undefined ? {} : { after: options.after }),\n limit,\n });\n\n const nowMillis = yield* currentMillis;\n\n return { items: page.items.map((record) => asSnapshot(record, nowMillis)), next: page.next };\n });\n\n const control = Effect.fnUntraced(function* (\n operation: \"pause\" | \"resume\" | \"cancel\",\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ): Effect.fn.Return<ScheduleSnapshot, ScheduleManagementFailure> {\n yield* authorizer.manage({ operation, scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n\n const attempt = (): Effect.Effect<ScheduleRecord, ScheduleManagementFailure> =>\n Effect.suspend(() =>\n Effect.gen(function* () {\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n if (record.configurationRevision !== expectedRevision) {\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n }\n if (operation === \"resume\" && record.state === \"active\") return record;\n const nowMillis = yield* currentMillis;\n\n const nextAtMillis =\n operation === \"resume\"\n ? yield* Effect.fromResult(\n scheduleResumeCursor(record.configuration.timing, record.nextAtMillis, nowMillis),\n )\n : operation === \"cancel\"\n ? null\n : record.nextAtMillis;\n\n const skippedRange =\n operation === \"resume\" &&\n record.configuration.timing._tag !== \"At\" &&\n record.nextAtMillis !== null &&\n nextAtMillis !== null &&\n nextAtMillis > record.nextAtMillis\n ? { fromMillis: record.nextAtMillis, toMillis: nextAtMillis }\n : null;\n\n return yield* store\n .change(\n key,\n {\n _tag: \"Control\",\n expectedRevision,\n expectedVersion: record.version,\n action: operation,\n nextAtMillis,\n nowMillis,\n skippedRange,\n },\n limits.maxSchedulesPerOwner,\n )\n .pipe(\n Effect.catchTag(\"ScheduleConflict\", (error) =>\n error.reason === \"revision\" ? attempt() : Effect.fail(error),\n ),\n );\n }),\n );\n\n const changed = yield* attempt();\n\n yield* wake.notify;\n\n return asSnapshot(changed, yield* currentMillis);\n });\n\n const recover = Effect.fn(\"Scheduling.recover\")(function* (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n expectedGeneration: number,\n ) {\n yield* authorizer.manage({ operation: \"recover\", scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n if (record.configurationRevision !== expectedRevision)\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n const time = yield* currentMillis;\n\n if (record.pending === null) return asSnapshot(record, time);\n\n const recovered = yield* store.change(key, {\n _tag: \"Recover\",\n expectedGeneration,\n expectedRevision,\n occurrenceId: record.pending.envelope.occurrenceId,\n nowMillis: time,\n });\n\n yield* wake.notify;\n\n return asSnapshot(recovered, time);\n });\n\n return Scheduling.of({\n recover,\n create,\n update,\n get,\n list,\n pause: (scope, id, revision) => control(\"pause\", scope, id, revision),\n resume: (scope, id, revision) => control(\"resume\", scope, id, revision),\n cancel: (scope, id, revision) => control(\"cancel\", scope, id, revision),\n });\n});\n\nconst makeDriver = Effect.fnUntraced(function* (limits: SchedulingLimits) {\n const store = yield* ScheduleStore;\n const authorizer = yield* ScheduleAuthorizer;\n const admission = yield* ScheduledInputAdmission;\n const failpoint = yield* ScheduleFailpoint;\n const crypto = yield* Crypto.Crypto;\n const admissionSemaphore = yield* Semaphore.make(limits.admissionConcurrency);\n\n const withCrypto = <A, E>(effect: Effect.Effect<A, E, Crypto.Crypto>) =>\n Effect.provideService(effect, Crypto.Crypto, crypto);\n\n const retry = Effect.fnUntraced(function* (\n key: ScheduleKey,\n record: ScheduleRecord,\n reason: ScheduleRetryReason,\n nowMillis: number,\n ) {\n if (record.pending === null) return record;\n const current = record.pending.retry;\n\n const delay = Math.min(\n limits.retryBaseMillis * 2 ** Math.min(current.attempts, 52),\n limits.retryMaxMillis,\n );\n\n return yield* store.change(key, {\n _tag: \"Retry\",\n occurrenceId: record.pending.envelope.occurrenceId,\n retry: {\n generation: current.generation,\n attempts: current.attempts + 1,\n automaticAttempts: current.automaticAttempts + 1,\n parked: current.automaticAttempts + 1 >= (limits.maxAutomaticAttempts ?? 8),\n nextAttemptAtMillis: Math.min(nowMillis + delay, 8_640_000_000_000_000),\n lastAttemptAtMillis: nowMillis,\n lastFailure: reason,\n },\n nowMillis,\n });\n });\n\n const verifyPending = Effect.fnUntraced(function* (key: ScheduleKey, record: ScheduleRecord) {\n const pending = record.pending;\n\n if (pending === null) return;\n const envelope = pending.envelope;\n\n const occurrenceId = yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: envelope.owner,\n scheduleId: envelope.scheduleId,\n configurationRevision: envelope.configurationRevision,\n intendedAtMillis: envelope.intendedAtMillis,\n }),\n ).pipe(Effect.mapError(() => corrupt(\"process\")));\n\n const usesCurrentConfiguration =\n envelope.configurationRevision === record.configurationRevision;\n\n const expectedThreadId = usesCurrentConfiguration\n ? record.configuration.destination._tag === \"ExistingThread\"\n ? record.configuration.destination.threadId\n : Schema.decodeSync(ThreadId)(`schedule-thread:${envelope.occurrenceId}`)\n : null;\n\n const expectedAdmissionKey = Schema.decodeSync(IdempotencyKey)(\n `schedule-occurrence:${envelope.occurrenceId}`,\n );\n\n const digest = yield* withCrypto(digestJson(envelope.input)).pipe(\n Effect.mapError(() => corrupt(\"process\")),\n );\n\n if (\n envelope.schemaVersion !== 1 ||\n envelope.owner.tenantId !== key.owner.tenantId ||\n envelope.owner.ownerId !== key.owner.ownerId ||\n envelope.scheduleId !== key.scheduleId ||\n envelope.configurationRevision > record.configurationRevision ||\n envelope.occurrenceId !== occurrenceId ||\n (usesCurrentConfiguration &&\n (envelope.deliveryPrincipal !== record.configuration.deliveryPrincipal ||\n envelope.agentId !== record.configuration.agentId ||\n !equivalentDefinitions(envelope.definitions, record.configuration.definitions) ||\n !equivalentInput(envelope.input, record.configuration.input) ||\n envelope.inputDigest !== record.configuration.inputDigest)) ||\n envelope.inputDigest !== digest ||\n (expectedThreadId !== null && envelope.threadId !== expectedThreadId) ||\n envelope.admissionKey !== expectedAdmissionKey\n ) {\n return yield* corrupt(\"process\");\n }\n });\n\n const deliverPending = Effect.fnUntraced(function* (\n key: ScheduleKey,\n record: ScheduleRecord,\n nowMillis: number,\n ) {\n if (\n record.pending === null ||\n record.pending.retry.parked === true ||\n record.pending.retry.nextAttemptAtMillis > nowMillis\n ) {\n return record;\n }\n yield* verifyPending(key, record);\n const envelope = record.pending.envelope;\n\n const outcome = yield* admissionSemaphore.withPermit(\n admitPreparedInput(admission.submit(envelope), limits.admissionTimeoutMillis).pipe(\n Effect.tap((outcome) =>\n outcome._tag === \"Receipt\" ? failpoint.hit(\"schedule:admission:after\") : Effect.void,\n ),\n ),\n );\n\n const completedAtMillis = yield* currentMillis;\n\n if (outcome._tag === \"Receipt\") {\n if (outcome.receipt.threadId !== envelope.threadId) {\n return yield* corrupt(\"admission\");\n }\n\n return yield* store\n .change(key, {\n _tag: \"Complete\",\n occurrenceId: envelope.occurrenceId,\n receipt: outcome.receipt,\n nowMillis: completedAtMillis,\n })\n .pipe(\n Effect.catchTag(\"ScheduleStorageError\", (error) =>\n error.reason === \"unavailable\"\n ? retry(key, record, \"storage\", completedAtMillis)\n : Effect.fail(error),\n ),\n );\n }\n if (outcome._tag === \"Refused\") {\n const refusal: ScheduleRefusal = {\n atMillis: completedAtMillis,\n intendedAtMillis: envelope.intendedAtMillis,\n occurrenceId: envelope.occurrenceId,\n phase: \"admission\",\n code: outcome.error.code,\n };\n\n return yield* store\n .change(key, {\n _tag: \"Refuse\",\n occurrenceId: envelope.occurrenceId,\n refusal,\n nowMillis: completedAtMillis,\n })\n .pipe(\n Effect.catchTag(\"ScheduleStorageError\", (error) =>\n error.reason === \"unavailable\"\n ? retry(key, record, \"storage\", completedAtMillis)\n : Effect.fail(error),\n ),\n );\n }\n\n return yield* retry(key, record, outcome.reason, completedAtMillis);\n });\n\n const processRecord = Effect.fnUntraced(function* (\n key: ScheduleKey,\n initial: ScheduleRecord,\n nowMillis: number,\n ): Effect.fn.Return<ScheduleRecord, ScheduleProcessFailure> {\n if (initial.pending !== null) return yield* deliverPending(key, initial, nowMillis);\n if (\n initial.state !== \"active\" ||\n initial.nextAtMillis === null ||\n initial.nextAtMillis > nowMillis\n ) {\n return initial;\n }\n\n const currentInputDigest = yield* withCrypto(digestJson(initial.configuration.input)).pipe(\n Effect.mapError(() =>\n ScheduleStorageError.make({ operation: \"prepare\", reason: \"unavailable\" }),\n ),\n );\n\n if (currentInputDigest !== initial.configuration.inputDigest) {\n return yield* corrupt(\"prepare\");\n }\n\n const due = yield* Effect.fromResult(\n scheduleDueOccurrence(initial.configuration.timing, initial.nextAtMillis, nowMillis),\n );\n\n if (due === null) return initial;\n\n const occurrenceId = yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: initial.owner,\n scheduleId: initial.scheduleId,\n configurationRevision: initial.configurationRevision,\n intendedAtMillis: due.intendedAtMillis,\n }),\n ).pipe(Effect.mapError(() => corrupt(\"prepare\")));\n\n const occurrence = {\n key,\n configurationRevision: initial.configurationRevision,\n configuration: initial.configuration,\n intendedAtMillis: due.intendedAtMillis,\n occurrenceId,\n };\n\n const authorization = yield* authorizer.prepare(occurrence).pipe(Effect.result);\n\n if (Result.isFailure(authorization)) {\n if (authorization.failure._tag === \"ScheduleStorageError\") {\n return yield* authorization.failure;\n }\n\n return yield* store.change(key, {\n _tag: \"DenyPreparation\",\n expectedRevision: initial.configurationRevision,\n expectedCursor: initial.nextAtMillis,\n refusal: {\n atMillis: nowMillis,\n intendedAtMillis: due.intendedAtMillis,\n occurrenceId,\n phase: \"preparation\",\n code: authorization.failure.code,\n },\n nowMillis,\n });\n }\n\n const threadId =\n initial.configuration.destination._tag === \"ExistingThread\"\n ? initial.configuration.destination.threadId\n : Schema.decodeSync(ThreadId)(`schedule-thread:${occurrenceId}`);\n\n const admissionKey = Schema.decodeSync(IdempotencyKey)(`schedule-occurrence:${occurrenceId}`);\n\n const prepared = yield* store.change(key, {\n _tag: \"Prepare\",\n expectedRevision: initial.configurationRevision,\n expectedCursor: initial.nextAtMillis,\n envelope: {\n schemaVersion: 1,\n owner: initial.owner,\n scheduleId: initial.scheduleId,\n configurationRevision: initial.configurationRevision,\n intendedAtMillis: due.intendedAtMillis,\n preparedAtMillis: nowMillis,\n occurrenceId,\n threadId,\n deliveryPrincipal: initial.configuration.deliveryPrincipal,\n ...(initial.configuration.admissionGroup === undefined\n ? {}\n : { admissionGroup: initial.configuration.admissionGroup }),\n ...(initial.configuration.admissionFence === undefined\n ? {}\n : { admissionFence: initial.configuration.admissionFence }),\n agentId: initial.configuration.agentId,\n definitions: initial.configuration.definitions,\n input: initial.configuration.input,\n inputDigest: initial.configuration.inputDigest,\n admissionKey,\n authorization: authorization.success,\n },\n nextAtMillis: due.nextAtMillis,\n skippedRange: due.skippedRange,\n nowMillis,\n });\n\n return yield* deliverPending(key, prepared, nowMillis);\n });\n\n const process = Effect.fnUntraced(function* (key: ScheduleKey) {\n const nowMillis = yield* currentMillis;\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n\n const processed = yield* processRecord(key, record, nowMillis).pipe(\n Effect.catchTag(\"ScheduleConflict\", () =>\n store\n .get(key)\n .pipe(\n Effect.flatMap((current) =>\n current === null\n ? Effect.fail(notFound(key))\n : processRecord(key, current, nowMillis),\n ),\n ),\n ),\n );\n\n return processed;\n });\n\n const runDue = Effect.fnUntraced(function* (owner?: ScheduleOwner) {\n const nowMillis = yield* currentMillis;\n let after: ScheduleDueCursor | undefined;\n let processed = 0;\n let failed = 0;\n\n while (true) {\n const due = yield* store.due(nowMillis, limits.dueBatchSize, owner, after);\n\n if (due.length === 0) break;\n yield* Effect.forEach(\n due,\n (key) =>\n process(key).pipe(\n Effect.matchCauseEffect({\n onSuccess: () =>\n Effect.sync(() => {\n processed += 1;\n }),\n onFailure: (cause) =>\n Cause.hasInterrupts(cause)\n ? Effect.interrupt\n : Effect.gen(function* () {\n failed += 1;\n yield* Effect.logWarning(\"Schedule processing failed\").pipe(\n Effect.annotateLogs({\n failureTag: Option.match(Cause.findErrorOption(cause), {\n onNone: () => \"Defect\",\n onSome: (error) => error._tag,\n }),\n }),\n );\n }),\n }),\n ),\n { concurrency: limits.admissionConcurrency },\n );\n after = due.at(-1);\n if (due.length < limits.dueBatchSize) break;\n }\n\n return { processed, failed };\n });\n\n return ScheduleDriver.of({ process, runDue });\n});\n\nconst corrupt = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"corrupt\" });\n\nconst validateLimits = (limits: SchedulingLimits) =>\n Schema.decodeEffect(SchedulingLimits)(limits).pipe(\n Effect.mapError((error) =>\n ScheduleValidationError.make({ message: `Invalid Scheduling limits: ${error.message}` }),\n ),\n Effect.filterOrFail(\n (validated) => validated.retryBaseMillis <= validated.retryMaxMillis,\n () =>\n ScheduleValidationError.make({\n message: \"Scheduling retryBaseMillis must not exceed retryMaxMillis\",\n }),\n ),\n );\n\nexport class Scheduling extends Context.Service<\n Scheduling,\n {\n readonly create: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleCreateOptions,\n ) => Effect.Effect<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n >;\n readonly update: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleUpdateOptions,\n ) => Effect.Effect<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n >;\n readonly get: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly list: (\n scope: ScheduleScope,\n options?: ScheduleListOptions,\n ) => Effect.Effect<ScheduleSnapshotPage, ScheduleManagementFailure>;\n readonly pause: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly resume: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly recover: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n expectedGeneration: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly cancel: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n }\n>()(\"@effect-agent/thread/Scheduling\") {\n static layer(\n limits: SchedulingLimits = defaultSchedulingLimits,\n ): Layer.Layer<\n Scheduling,\n ScheduleValidationError,\n ScheduleStore | ScheduleAuthorizer | ScheduleWake | Crypto.Crypto\n > {\n return Layer.effect(Scheduling, validateLimits(limits).pipe(Effect.flatMap(makeManagement)));\n }\n}\n\nexport const ScheduleWakeNoop: Layer.Layer<ScheduleWake> = Layer.succeed(ScheduleWake, {\n notify: Effect.void,\n await: Effect.never,\n});\n\n/** Privileged host capability. Never provide this service to management callers or model tools. */\nexport class ScheduleDriver extends Context.Service<\n ScheduleDriver,\n {\n readonly process: (key: ScheduleKey) => Effect.Effect<ScheduleRecord, ScheduleProcessFailure>;\n readonly runDue: (\n owner?: ScheduleOwner,\n ) => Effect.Effect<\n { readonly processed: number; readonly failed: number },\n ScheduleStorageError\n >;\n }\n>()(\"@effect-agent/thread/ScheduleDriver\") {\n static layer(\n limits: SchedulingLimits = defaultSchedulingLimits,\n ): Layer.Layer<\n ScheduleDriver,\n ScheduleValidationError,\n ScheduleStore | ScheduleAuthorizer | ScheduledInputAdmission | Crypto.Crypto\n > {\n return Layer.effect(ScheduleDriver, validateLimits(limits).pipe(Effect.flatMap(makeDriver)));\n }\n}\n"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { BackgroundSpawnTool, DelegationTool, SubagentBudgetReservation, Subagen
|
|
|
9
9
|
import { RunUsageReport, unknownRunTotals } from "./core/Usage.mjs";
|
|
10
10
|
import { C as MessageStatus, S as MessageRef, _ as WorkerStop, c as WorkerError, d as WorkerPage, f as WorkerRef, g as WorkerStarted, o as WorkerCompletion, p as WorkerReport, s as WorkerContext, v as WorkerStopped, y as WorkerSummary } from "./Worker-DZjdMjZn.mjs";
|
|
11
11
|
import { BackgroundReporting, SubagentHost, WorkerReportPreparationFailure } from "./engine/SubagentHost.mjs";
|
|
12
|
-
import { a as SubagentDurability, i as AgentSpawner, o as SubagentDurabilityError, s as ToolCallWaiting } from "./AgentRuntime-
|
|
12
|
+
import { a as SubagentDurability, i as AgentSpawner, o as SubagentDurabilityError, s as ToolCallWaiting } from "./AgentRuntime-DaDKMasp.mjs";
|
|
13
13
|
import { RunEventSink } from "./engine/RunEventSink.mjs";
|
|
14
14
|
import { SubagentBudgetExhausted, SubagentObservedUsage, SubagentReservationRequest, SubagentReservations, makeBudgetReservationId } from "./capabilities/SubagentReservations.mjs";
|
|
15
15
|
import { t as utf8Bytes } from "./utf8-B770uxC3.mjs";
|
|
@@ -1510,4 +1510,4 @@ function background(targetOrDeclaration, selected) {
|
|
|
1510
1510
|
//#endregion
|
|
1511
1511
|
export { SubagentPolicy as _, layer as a, delegationAllocationFromPolicy as b, WorkerObservation as c, followUp as d, inspect as f, stop as g, start as h, background as i, awaitWorker as l, observe as m, SubagentResult as n, make as o, list as p, Subagent_exports as r, Worker as s, SubagentDurableAccounting as t, cancel as u, SubagentPrestartDenied as v, delegationCapsFromPolicy as x, SubagentProjectionFailure as y };
|
|
1512
1512
|
|
|
1513
|
-
//# sourceMappingURL=Subagent-
|
|
1513
|
+
//# sourceMappingURL=Subagent-CexndZSp.mjs.map
|