effect-agent 0.1.0-beta.12 → 0.1.0-beta.121
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/Agent-1DMSO_Fl.mjs +86 -0
- package/dist/Agent-1DMSO_Fl.mjs.map +1 -0
- package/dist/Agent-D9cXqfF3.d.mts +252 -0
- package/dist/AgentError-Bn1ytXRD.d.mts +117 -0
- package/dist/AgentPolicy-BqDoSXO6.d.mts +96 -0
- package/dist/AgentRuntime-BUxDdLpw.d.mts +346 -0
- package/dist/AgentRuntime-Cp1hAb-W.mjs +4739 -0
- package/dist/AgentRuntime-Cp1hAb-W.mjs.map +1 -0
- package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
- package/dist/ContextCompactor-WwSIG_Z2.d.mts +161 -0
- package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
- package/dist/DurableAgentRuntime-B-9w7jDt.mjs +7061 -0
- package/dist/DurableAgentRuntime-B-9w7jDt.mjs.map +1 -0
- package/dist/DurableFailpoint-Cnr3wx1L.d.mts +41 -0
- package/dist/DurableStep-Cry_iol4.d.mts +103 -0
- package/dist/EventSource-CnlZ3Kma.d.mts +51 -0
- package/dist/FailureDiagnostic-BElLOoED.mjs +274 -0
- package/dist/FailureDiagnostic-BElLOoED.mjs.map +1 -0
- package/dist/FailureDiagnostic-CaAkzGHL.d.mts +223 -0
- package/dist/Identifiers-CN2s30fF.d.mts +40 -0
- package/dist/InMemory.d.mts +24 -0
- package/dist/InMemory.mjs +24 -0
- package/dist/InMemory.mjs.map +1 -0
- package/dist/MemoryNamespace-BbRW5p71.d.mts +36 -0
- package/dist/MemoryReference-B8Q3UJoJ.d.mts +79 -0
- package/dist/Messaging-Dkg87ebg.d.mts +221 -0
- package/dist/Messaging-JYYN3oYS.d.mts +1067 -0
- package/dist/MessagingHost-CqzpxbGz.d.mts +74 -0
- package/dist/MessagingHost-DfsbMPvq.mjs +110 -0
- package/dist/MessagingHost-DfsbMPvq.mjs.map +1 -0
- package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
- package/dist/Output-V-6YL1_Z.d.mts +25 -0
- package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
- package/dist/PageScreenshot-BpgZKAxl.d.mts +48 -0
- package/dist/PreparedInputAdmission-BQLGldl-.d.mts +42 -0
- package/dist/Receipt-BAHyigAF.d.mts +33 -0
- package/dist/Records-D88mgvyS.d.mts +4214 -0
- package/dist/RunEvent-DIrzkjLr.d.mts +460 -0
- package/dist/RunEventSink-D5aVhISG.d.mts +108 -0
- package/dist/RunJournal-BXrq0VIK.mjs +931 -0
- package/dist/RunJournal-BXrq0VIK.mjs.map +1 -0
- package/dist/RunOptions-CSBsSj0X.d.mts +935 -0
- package/dist/RunPolicyUsage-ClZxyR46.d.mts +21 -0
- package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
- package/dist/Schedule-BIOHA6RR.d.mts +847 -0
- package/dist/Scheduling-DPb2QyAK.mjs +691 -0
- package/dist/Scheduling-DPb2QyAK.mjs.map +1 -0
- package/dist/Subagent-CNik9RiA.d.mts +1635 -0
- package/dist/Subagent-DCrB7an7.mjs +1498 -0
- package/dist/Subagent-DCrB7an7.mjs.map +1 -0
- package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
- package/dist/SubagentHost-4WB8Hj0C.d.mts +164 -0
- package/dist/Subscription-CRteOKRf.d.mts +948 -0
- package/dist/SubscriptionInput-oNcwTPti.d.mts +41 -0
- package/dist/Thread-DOBQ0QUY.d.mts +96 -0
- package/dist/ThreadHistory-tS1KwxHR.d.mts +60 -0
- package/dist/ToolBroker-DWs4tZra.d.mts +133 -0
- package/dist/ToolExposure-9uF_Yo0T.mjs +10 -0
- package/dist/ToolExposure-9uF_Yo0T.mjs.map +1 -0
- package/dist/ToolExposure-C93U1sPu.mjs +30 -0
- package/dist/ToolExposure-C93U1sPu.mjs.map +1 -0
- package/dist/ToolExposure-UCN12eCd.d.mts +39 -0
- package/dist/ToolExposure-r2eOWk4F.d.mts +46 -0
- package/dist/ToolExposure.d.mts +8 -0
- package/dist/ToolExposure.mjs +21 -0
- package/dist/ToolExposure.mjs.map +1 -0
- package/dist/ToolReconciler-BmVRAHKs.d.mts +80 -0
- package/dist/ToolResult-BKdqWRff.d.mts +78 -0
- package/dist/Usage-Dx0aknfk.d.mts +121 -0
- package/dist/WakeScheduler-EjUF-GhC.d.mts +56 -0
- package/dist/Worker-CfwzMZEK.mjs +271 -0
- package/dist/Worker-CfwzMZEK.mjs.map +1 -0
- package/dist/Worker-fwWkBg12.d.mts +472 -0
- package/dist/agent-registration-CKNsrpwo.mjs +201 -0
- package/dist/agent-registration-CKNsrpwo.mjs.map +1 -0
- package/dist/capabilities/Approval.d.mts +114 -0
- package/dist/capabilities/Approval.mjs +226 -0
- package/dist/capabilities/Approval.mjs.map +1 -0
- package/dist/capabilities/Budget.d.mts +112 -0
- package/dist/capabilities/Budget.mjs +346 -0
- package/dist/capabilities/Budget.mjs.map +1 -0
- package/dist/capabilities/CodeMode.d.mts +157 -0
- package/dist/capabilities/CodeMode.mjs +522 -0
- package/dist/capabilities/CodeMode.mjs.map +1 -0
- package/dist/capabilities/Commands.d.mts +55 -0
- package/dist/capabilities/Commands.mjs +57 -0
- package/dist/capabilities/Commands.mjs.map +1 -0
- package/dist/capabilities/ContextTools.d.mts +321 -0
- package/dist/capabilities/ContextTools.mjs +126 -0
- package/dist/capabilities/ContextTools.mjs.map +1 -0
- package/dist/capabilities/Mcp.d.mts +108 -0
- package/dist/capabilities/Mcp.mjs +259 -0
- package/dist/capabilities/Mcp.mjs.map +1 -0
- package/dist/capabilities/McpClient.d.mts +115 -0
- package/dist/capabilities/McpClient.mjs +506 -0
- package/dist/capabilities/McpClient.mjs.map +1 -0
- package/dist/capabilities/MemoryNotes.d.mts +424 -0
- package/dist/capabilities/MemoryNotes.mjs +128 -0
- package/dist/capabilities/MemoryNotes.mjs.map +1 -0
- package/dist/capabilities/Messaging.d.mts +3 -0
- package/dist/capabilities/Messaging.mjs +152 -0
- package/dist/capabilities/Messaging.mjs.map +1 -0
- package/dist/capabilities/ModelContext.d.mts +89 -0
- package/dist/capabilities/ModelContext.mjs +168 -0
- package/dist/capabilities/ModelContext.mjs.map +1 -0
- package/dist/capabilities/Redaction.d.mts +37 -0
- package/dist/capabilities/Redaction.mjs +104 -0
- package/dist/capabilities/Redaction.mjs.map +1 -0
- package/dist/capabilities/Remembering.d.mts +434 -0
- package/dist/capabilities/Remembering.mjs +290 -0
- package/dist/capabilities/Remembering.mjs.map +1 -0
- package/dist/capabilities/RunHooks.d.mts +82 -0
- package/dist/capabilities/RunHooks.mjs +144 -0
- package/dist/capabilities/RunHooks.mjs.map +1 -0
- package/dist/capabilities/SemanticMemory.d.mts +431 -0
- package/dist/capabilities/SemanticMemory.mjs +315 -0
- package/dist/capabilities/SemanticMemory.mjs.map +1 -0
- package/dist/capabilities/Subagent.d.mts +4 -0
- package/dist/capabilities/Subagent.mjs +5 -0
- package/dist/capabilities/SubagentReservations.d.mts +186 -0
- package/dist/capabilities/SubagentReservations.mjs +479 -0
- package/dist/capabilities/SubagentReservations.mjs.map +1 -0
- package/dist/capabilities/ToolDiscovery.d.mts +124 -0
- package/dist/capabilities/ToolDiscovery.mjs +230 -0
- package/dist/capabilities/ToolDiscovery.mjs.map +1 -0
- package/dist/capabilities/WebCapture.d.mts +163 -0
- package/dist/capabilities/WebCapture.mjs +335 -0
- package/dist/capabilities/WebCapture.mjs.map +1 -0
- package/dist/capabilities/WebSearch.d.mts +71 -0
- package/dist/capabilities/WebSearch.mjs +115 -0
- package/dist/capabilities/WebSearch.mjs.map +1 -0
- package/dist/compaction-C2OTceKw.mjs +505 -0
- package/dist/compaction-C2OTceKw.mjs.map +1 -0
- package/dist/core/Agent.d.mts +2 -0
- package/dist/core/Agent.mjs +2 -0
- package/dist/core/AgentError.d.mts +2 -0
- package/dist/core/AgentError.mjs +134 -0
- package/dist/core/AgentError.mjs.map +1 -0
- package/dist/core/AgentPolicy.d.mts +2 -0
- package/dist/core/AgentPolicy.mjs +94 -0
- package/dist/core/AgentPolicy.mjs.map +1 -0
- package/dist/core/AgentUpdates.d.mts +2 -0
- package/dist/core/AgentUpdates.mjs +63 -0
- package/dist/core/AgentUpdates.mjs.map +1 -0
- package/dist/core/FailureDiagnostic.d.mts +2 -0
- package/dist/core/FailureDiagnostic.mjs +2 -0
- package/dist/core/IdGenerator.d.mts +26 -0
- package/dist/core/IdGenerator.mjs +27 -0
- package/dist/core/IdGenerator.mjs.map +1 -0
- package/dist/core/Identifiers.d.mts +2 -0
- package/dist/core/Identifiers.mjs +43 -0
- package/dist/core/Identifiers.mjs.map +1 -0
- package/dist/core/Memory.d.mts +57 -0
- package/dist/core/Memory.mjs +203 -0
- package/dist/core/Memory.mjs.map +1 -0
- package/dist/core/MemoryNamespace.d.mts +2 -0
- package/dist/core/MemoryNamespace.mjs +116 -0
- package/dist/core/MemoryNamespace.mjs.map +1 -0
- package/dist/core/MemoryReference.d.mts +2 -0
- package/dist/core/MemoryReference.mjs +109 -0
- package/dist/core/MemoryReference.mjs.map +1 -0
- package/dist/core/MemoryRevalidation.d.mts +65 -0
- package/dist/core/MemoryRevalidation.mjs +126 -0
- package/dist/core/MemoryRevalidation.mjs.map +1 -0
- package/dist/core/MemoryStore.d.mts +186 -0
- package/dist/core/MemoryStore.mjs +243 -0
- package/dist/core/MemoryStore.mjs.map +1 -0
- package/dist/core/Receipt.d.mts +2 -0
- package/dist/core/Receipt.mjs +36 -0
- package/dist/core/Receipt.mjs.map +1 -0
- package/dist/core/RememberingStore.d.mts +1562 -0
- package/dist/core/RememberingStore.mjs +190 -0
- package/dist/core/RememberingStore.mjs.map +1 -0
- package/dist/core/RunEvent.d.mts +2 -0
- package/dist/core/RunEvent.mjs +337 -0
- package/dist/core/RunEvent.mjs.map +1 -0
- package/dist/core/RunPolicyUsage.d.mts +2 -0
- package/dist/core/RunPolicyUsage.mjs +21 -0
- package/dist/core/RunPolicyUsage.mjs.map +1 -0
- package/dist/core/SemanticMemoryIndex.d.mts +826 -0
- package/dist/core/SemanticMemoryIndex.mjs +185 -0
- package/dist/core/SemanticMemoryIndex.mjs.map +1 -0
- package/dist/core/SemanticMemoryRevalidation.d.mts +45 -0
- package/dist/core/SemanticMemoryRevalidation.mjs +191 -0
- package/dist/core/SemanticMemoryRevalidation.mjs.map +1 -0
- package/dist/core/SubagentContract.d.mts +2 -0
- package/dist/core/SubagentContract.mjs +148 -0
- package/dist/core/SubagentContract.mjs.map +1 -0
- package/dist/core/Thread.d.mts +2 -0
- package/dist/core/Thread.mjs +250 -0
- package/dist/core/Thread.mjs.map +1 -0
- package/dist/core/ToolResult.d.mts +2 -0
- package/dist/core/ToolResult.mjs +156 -0
- package/dist/core/ToolResult.mjs.map +1 -0
- package/dist/core/Usage.d.mts +2 -0
- package/dist/core/Usage.mjs +319 -0
- package/dist/core/Usage.mjs.map +1 -0
- package/dist/core/Worker.d.mts +3 -0
- package/dist/core/Worker.mjs +3 -0
- package/dist/durable/ActivityStore.d.mts +116 -0
- package/dist/durable/ActivityStore.mjs +131 -0
- package/dist/durable/ActivityStore.mjs.map +1 -0
- package/dist/durable/Admin.d.mts +2 -0
- package/dist/durable/Admin.mjs +330 -0
- package/dist/durable/Admin.mjs.map +1 -0
- package/dist/durable/AgentRegistration.d.mts +2 -0
- package/dist/durable/AgentRegistration.mjs +14 -0
- package/dist/durable/AgentRegistration.mjs.map +1 -0
- package/dist/durable/Certification.d.mts +110 -0
- package/dist/durable/Certification.mjs +159 -0
- package/dist/durable/Certification.mjs.map +1 -0
- package/dist/durable/CommittedActivity.d.mts +62 -0
- package/dist/durable/CommittedActivity.mjs +159 -0
- package/dist/durable/CommittedActivity.mjs.map +1 -0
- package/dist/durable/Digest.d.mts +2 -0
- package/dist/durable/Digest.mjs +50 -0
- package/dist/durable/Digest.mjs.map +1 -0
- package/dist/durable/DurableAgentRuntime.d.mts +3 -0
- package/dist/durable/DurableAgentRuntime.mjs +3 -0
- package/dist/durable/DurableFailpoint.d.mts +2 -0
- package/dist/durable/DurableFailpoint.mjs +102 -0
- package/dist/durable/DurableFailpoint.mjs.map +1 -0
- package/dist/durable/DurableFailpointTestControl.d.mts +14 -0
- package/dist/durable/DurableFailpointTestControl.mjs +19 -0
- package/dist/durable/DurableFailpointTestControl.mjs.map +1 -0
- package/dist/durable/EventSource.d.mts +2 -0
- package/dist/durable/EventSource.mjs +65 -0
- package/dist/durable/EventSource.mjs.map +1 -0
- package/dist/durable/GitHubWorkflowSource.d.mts +185 -0
- package/dist/durable/GitHubWorkflowSource.mjs +209 -0
- package/dist/durable/GitHubWorkflowSource.mjs.map +1 -0
- package/dist/durable/MessageDelivery.d.mts +893 -0
- package/dist/durable/MessageDelivery.mjs +557 -0
- package/dist/durable/MessageDelivery.mjs.map +1 -0
- package/dist/durable/MessageDeliveryStoreConformance.d.mts +378 -0
- package/dist/durable/MessageDeliveryStoreConformance.mjs +270 -0
- package/dist/durable/MessageDeliveryStoreConformance.mjs.map +1 -0
- package/dist/durable/OperationAuthorizer.d.mts +2 -0
- package/dist/durable/OperationAuthorizer.mjs +70 -0
- package/dist/durable/OperationAuthorizer.mjs.map +1 -0
- package/dist/durable/PersistentHistory.d.mts +16 -0
- package/dist/durable/PersistentHistory.mjs +125 -0
- package/dist/durable/PersistentHistory.mjs.map +1 -0
- package/dist/durable/PreparedInputAdmission.d.mts +2 -0
- package/dist/durable/PreparedInputAdmission.mjs +38 -0
- package/dist/durable/PreparedInputAdmission.mjs.map +1 -0
- package/dist/durable/Records.d.mts +2 -0
- package/dist/durable/Records.mjs +848 -0
- package/dist/durable/Records.mjs.map +1 -0
- package/dist/durable/Recovery.d.mts +2 -0
- package/dist/durable/Recovery.mjs +739 -0
- package/dist/durable/Recovery.mjs.map +1 -0
- package/dist/durable/RunJournal.d.mts +2 -0
- package/dist/durable/RunJournal.mjs +2 -0
- package/dist/durable/Schedule.d.mts +2 -0
- package/dist/durable/Schedule.mjs +391 -0
- package/dist/durable/Schedule.mjs.map +1 -0
- package/dist/durable/ScheduleStoreConformance.d.mts +17 -0
- package/dist/durable/ScheduleStoreConformance.mjs +420 -0
- package/dist/durable/ScheduleStoreConformance.mjs.map +1 -0
- package/dist/durable/ScheduleTransition.d.mts +24 -0
- package/dist/durable/ScheduleTransition.mjs +180 -0
- package/dist/durable/ScheduleTransition.mjs.map +1 -0
- package/dist/durable/Scheduling.d.mts +54 -0
- package/dist/durable/Scheduling.mjs +2 -0
- package/dist/durable/SqlMemoryStore.d.mts +29 -0
- package/dist/durable/SqlMemoryStore.mjs +436 -0
- package/dist/durable/SqlMemoryStore.mjs.map +1 -0
- package/dist/durable/SqlMessageDeliveryStore.d.mts +42 -0
- package/dist/durable/SqlMessageDeliveryStore.mjs +179 -0
- package/dist/durable/SqlMessageDeliveryStore.mjs.map +1 -0
- package/dist/durable/SqlStorageV2Upgrade.d.mts +21 -0
- package/dist/durable/SqlStorageV2Upgrade.mjs +459 -0
- package/dist/durable/SqlStorageV2Upgrade.mjs.map +1 -0
- package/dist/durable/SqlSubscriptionStore.d.mts +62 -0
- package/dist/durable/SqlSubscriptionStore.mjs +751 -0
- package/dist/durable/SqlSubscriptionStore.mjs.map +1 -0
- package/dist/durable/SqlThreadNativeReads.d.mts +53 -0
- package/dist/durable/SqlThreadNativeReads.mjs +159 -0
- package/dist/durable/SqlThreadNativeReads.mjs.map +1 -0
- package/dist/durable/SubmissionLedger.d.mts +3 -0
- package/dist/durable/SubmissionLedger.mjs +959 -0
- package/dist/durable/SubmissionLedger.mjs.map +1 -0
- package/dist/durable/SubmissionLedgerConformance.d.mts +29 -0
- package/dist/durable/SubmissionLedgerConformance.mjs +2187 -0
- package/dist/durable/SubmissionLedgerConformance.mjs.map +1 -0
- package/dist/durable/SubmissionStatus.d.mts +2 -0
- package/dist/durable/SubmissionStatus.mjs +18 -0
- package/dist/durable/SubmissionStatus.mjs.map +1 -0
- package/dist/durable/Subscription.d.mts +2 -0
- package/dist/durable/Subscription.mjs +360 -0
- package/dist/durable/Subscription.mjs.map +1 -0
- package/dist/durable/SubscriptionInput.d.mts +2 -0
- package/dist/durable/SubscriptionInput.mjs +52 -0
- package/dist/durable/SubscriptionInput.mjs.map +1 -0
- package/dist/durable/SubscriptionStoreConformance.d.mts +16 -0
- package/dist/durable/SubscriptionStoreConformance.mjs +625 -0
- package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -0
- package/dist/durable/SubscriptionTools.d.mts +273 -0
- package/dist/durable/SubscriptionTools.mjs +190 -0
- package/dist/durable/SubscriptionTools.mjs.map +1 -0
- package/dist/durable/SubscriptionTransition.d.mts +21 -0
- package/dist/durable/SubscriptionTransition.mjs +148 -0
- package/dist/durable/SubscriptionTransition.mjs.map +1 -0
- package/dist/durable/Subscriptions.d.mts +73 -0
- package/dist/durable/Subscriptions.mjs +627 -0
- package/dist/durable/Subscriptions.mjs.map +1 -0
- package/dist/durable/ThreadContextHistory.d.mts +32 -0
- package/dist/durable/ThreadContextHistory.mjs +152 -0
- package/dist/durable/ThreadContextHistory.mjs.map +1 -0
- package/dist/durable/ThreadContextHistoryProjection.d.mts +60 -0
- package/dist/durable/ThreadContextHistoryProjection.mjs +149 -0
- package/dist/durable/ThreadContextHistoryProjection.mjs.map +1 -0
- package/dist/durable/ThreadInvariants.d.mts +76 -0
- package/dist/durable/ThreadInvariants.mjs +246 -0
- package/dist/durable/ThreadInvariants.mjs.map +1 -0
- package/dist/durable/ThreadProjection.d.mts +78 -0
- package/dist/durable/ThreadProjection.mjs +158 -0
- package/dist/durable/ThreadProjection.mjs.map +1 -0
- package/dist/durable/ThreadProjectionMaintenance.d.mts +49 -0
- package/dist/durable/ThreadProjectionMaintenance.mjs +33 -0
- package/dist/durable/ThreadProjectionMaintenance.mjs.map +1 -0
- package/dist/durable/ThreadStore.d.mts +2 -0
- package/dist/durable/ThreadStore.mjs +355 -0
- package/dist/durable/ThreadStore.mjs.map +1 -0
- package/dist/durable/ThreadStoreConformance.d.mts +28 -0
- package/dist/durable/ThreadStoreConformance.mjs +503 -0
- package/dist/durable/ThreadStoreConformance.mjs.map +1 -0
- package/dist/durable/ToolReconciler.d.mts +2 -0
- package/dist/durable/ToolReconciler.mjs +85 -0
- package/dist/durable/ToolReconciler.mjs.map +1 -0
- package/dist/durable/WakeScheduler.d.mts +2 -0
- package/dist/durable/WakeScheduler.mjs +85 -0
- package/dist/durable/WakeScheduler.mjs.map +1 -0
- package/dist/durable/WorkerHost.d.mts +129 -0
- package/dist/durable/WorkerHost.mjs +77 -0
- package/dist/durable/WorkerHost.mjs.map +1 -0
- package/dist/engine/AgentRuntime.d.mts +2 -0
- package/dist/engine/AgentRuntime.mjs +2 -0
- package/dist/engine/Compaction.d.mts +7 -0
- package/dist/engine/Compaction.mjs +16 -0
- package/dist/engine/Compaction.mjs.map +1 -0
- package/dist/engine/ContextCompactor.d.mts +2 -0
- package/dist/engine/ContextCompactor.mjs +119 -0
- package/dist/engine/ContextCompactor.mjs.map +1 -0
- package/dist/engine/ContextHistory.d.mts +65 -0
- package/dist/engine/ContextHistory.mjs +76 -0
- package/dist/engine/ContextHistory.mjs.map +1 -0
- package/dist/engine/ContextWindow.d.mts +2 -0
- package/dist/engine/ContextWindow.mjs +59 -0
- package/dist/engine/ContextWindow.mjs.map +1 -0
- package/dist/engine/DurableStep.d.mts +2 -0
- package/dist/engine/DurableStep.mjs +62 -0
- package/dist/engine/DurableStep.mjs.map +1 -0
- package/dist/engine/MessagingHost.d.mts +2 -0
- package/dist/engine/MessagingHost.mjs +2 -0
- package/dist/engine/Output.d.mts +2 -0
- package/dist/engine/Output.mjs +8 -0
- package/dist/engine/Output.mjs.map +1 -0
- package/dist/engine/RunEventSink.d.mts +2 -0
- package/dist/engine/RunEventSink.mjs +22 -0
- package/dist/engine/RunEventSink.mjs.map +1 -0
- package/dist/engine/RunOptions.d.mts +2 -0
- package/dist/engine/RunOptions.mjs +124 -0
- package/dist/engine/RunOptions.mjs.map +1 -0
- package/dist/engine/SubagentHost.d.mts +2 -0
- package/dist/engine/SubagentHost.mjs +76 -0
- package/dist/engine/SubagentHost.mjs.map +1 -0
- package/dist/engine/ThreadHistory.d.mts +2 -0
- package/dist/engine/ThreadHistory.mjs +67 -0
- package/dist/engine/ThreadHistory.mjs.map +1 -0
- package/dist/engine/ToolBroker.d.mts +2 -0
- package/dist/engine/ToolBroker.mjs +42 -0
- package/dist/engine/ToolBroker.mjs.map +1 -0
- package/dist/foreign-diagnostic-DBQ1XHKh.mjs +37 -0
- package/dist/foreign-diagnostic-DBQ1XHKh.mjs.map +1 -0
- package/dist/index.d.mts +91 -6
- package/dist/index.mjs +100 -6
- package/dist/output-contract-BC7tjlGw.mjs +84 -0
- package/dist/output-contract-BC7tjlGw.mjs.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/dist/sandbox/CodeExecutor.d.mts +194 -0
- package/dist/sandbox/CodeExecutor.mjs +278 -0
- package/dist/sandbox/CodeExecutor.mjs.map +1 -0
- package/dist/sandbox/InteractiveBrowser.d.mts +257 -0
- package/dist/sandbox/InteractiveBrowser.mjs +236 -0
- package/dist/sandbox/InteractiveBrowser.mjs.map +1 -0
- package/dist/sandbox/PageCapture.d.mts +2 -0
- package/dist/sandbox/PageCapture.mjs +450 -0
- package/dist/sandbox/PageCapture.mjs.map +1 -0
- package/dist/sandbox/PageCrawl.d.mts +88 -0
- package/dist/sandbox/PageCrawl.mjs +124 -0
- package/dist/sandbox/PageCrawl.mjs.map +1 -0
- package/dist/sandbox/PageScreenshot.d.mts +2 -0
- package/dist/sandbox/PageScreenshot.mjs +53 -0
- package/dist/sandbox/PageScreenshot.mjs.map +1 -0
- package/dist/sandbox/ProtectedBrowser.d.mts +283 -0
- package/dist/sandbox/ProtectedBrowser.mjs +298 -0
- package/dist/sandbox/ProtectedBrowser.mjs.map +1 -0
- package/dist/sandbox/Sandbox.d.mts +2 -0
- package/dist/sandbox/Sandbox.mjs +208 -0
- package/dist/sandbox/Sandbox.mjs.map +1 -0
- package/dist/utf8-BYfhEkcj.mjs +11 -0
- package/dist/utf8-BYfhEkcj.mjs.map +1 -0
- package/dist/utf8-DchGZRBd.mjs +23 -0
- package/dist/utf8-DchGZRBd.mjs.map +1 -0
- package/package.json +1 -40
- package/src/InMemory.ts +19 -0
- package/src/ToolExposure.ts +2 -0
- package/src/capabilities/Approval.ts +352 -0
- package/src/capabilities/Budget.ts +536 -0
- package/src/capabilities/CodeMode.ts +1090 -0
- package/src/capabilities/Commands.ts +86 -0
- package/src/capabilities/ContextTools.ts +184 -0
- package/src/capabilities/Mcp.ts +426 -0
- package/src/capabilities/McpClient.ts +967 -0
- package/src/capabilities/MemoryNotes.ts +174 -0
- package/src/capabilities/Messaging.ts +261 -0
- package/src/capabilities/ModelContext.ts +354 -0
- package/src/capabilities/Redaction.ts +157 -0
- package/src/capabilities/Remembering.ts +550 -0
- package/src/capabilities/RunHooks.ts +280 -0
- package/src/capabilities/SemanticMemory.ts +447 -0
- package/src/capabilities/Subagent.ts +2489 -0
- package/src/capabilities/SubagentReservations.ts +850 -0
- package/src/capabilities/ToolDiscovery.ts +369 -0
- package/src/capabilities/WebCapture.ts +722 -0
- package/src/capabilities/WebSearch.ts +190 -0
- package/src/capabilities/internal/subagent-background.ts +1273 -0
- package/src/capabilities/internal/subagent-contract.ts +146 -0
- package/src/capabilities/internal/subagent-policy.ts +235 -0
- package/src/capabilities/internal/subagent-reporting.ts +136 -0
- package/src/capabilities/internal/utf8.ts +10 -0
- package/src/core/Agent.ts +602 -0
- package/src/core/AgentError.ts +172 -0
- package/src/core/AgentPolicy.ts +153 -0
- package/src/core/AgentUpdates.ts +100 -0
- package/src/core/FailureDiagnostic.ts +343 -0
- package/src/core/IdGenerator.ts +39 -0
- package/src/core/Identifiers.ts +48 -0
- package/src/core/Memory.ts +290 -0
- package/src/core/MemoryNamespace.ts +196 -0
- package/src/core/MemoryReference.ts +121 -0
- package/src/core/MemoryRevalidation.ts +185 -0
- package/src/core/MemoryStore.ts +368 -0
- package/src/core/Messaging.ts +72 -0
- package/src/core/Receipt.ts +42 -0
- package/src/core/RememberingStore.ts +300 -0
- package/src/core/RunEvent.ts +366 -0
- package/src/core/RunPolicyUsage.ts +17 -0
- package/src/core/SemanticMemoryIndex.ts +250 -0
- package/src/core/SemanticMemoryRevalidation.ts +254 -0
- package/src/core/SubagentContract.ts +196 -0
- package/src/core/Thread.ts +371 -0
- package/src/core/ToolExposure.ts +74 -0
- package/src/core/ToolResult.ts +190 -0
- package/src/core/Usage.ts +529 -0
- package/src/core/Worker.ts +240 -0
- package/src/core/internal/agent-updates.ts +34 -0
- package/src/core/internal/message-status.ts +60 -0
- package/src/core/internal/strict-schema.ts +14 -0
- package/src/core/internal/utf8.ts +23 -0
- package/src/durable/ActivityStore.ts +160 -0
- package/src/durable/Admin.ts +505 -0
- package/src/durable/AgentRegistration.ts +14 -0
- package/src/durable/Certification.ts +210 -0
- package/src/durable/CommittedActivity.ts +296 -0
- package/src/durable/Digest.ts +87 -0
- package/src/durable/DurableAgentRuntime.ts +11275 -0
- package/src/durable/DurableFailpoint.ts +111 -0
- package/src/durable/DurableFailpointTestControl.ts +39 -0
- package/src/durable/EventSource.ts +172 -0
- package/src/durable/GitHubWorkflowSource.ts +447 -0
- package/src/durable/MessageDelivery.ts +832 -0
- package/src/durable/MessageDeliveryStoreConformance.ts +410 -0
- package/src/durable/OperationAuthorizer.ts +85 -0
- package/src/durable/PersistentHistory.ts +260 -0
- package/src/durable/PreparedInputAdmission.ts +57 -0
- package/src/durable/Records.ts +1075 -0
- package/src/durable/Recovery.ts +1018 -0
- package/src/durable/RunJournal.ts +1631 -0
- package/src/durable/Schedule.ts +513 -0
- package/src/durable/ScheduleStoreConformance.ts +638 -0
- package/src/durable/ScheduleTransition.ts +265 -0
- package/src/durable/Scheduling.ts +1077 -0
- package/src/durable/SqlMemoryStore.ts +778 -0
- package/src/durable/SqlMessageDeliveryStore.ts +335 -0
- package/src/durable/SqlStorageV2Upgrade.ts +500 -0
- package/src/durable/SqlSubscriptionStore.ts +1440 -0
- package/src/durable/SqlThreadNativeReads.ts +270 -0
- package/src/durable/SubmissionLedger.ts +1265 -0
- package/src/durable/SubmissionLedgerConformance.ts +4820 -0
- package/src/durable/SubmissionStatus.ts +14 -0
- package/src/durable/Subscription.ts +544 -0
- package/src/durable/SubscriptionInput.ts +144 -0
- package/src/durable/SubscriptionStoreConformance.ts +945 -0
- package/src/durable/SubscriptionTools.ts +327 -0
- package/src/durable/SubscriptionTransition.ts +302 -0
- package/src/durable/Subscriptions.ts +1210 -0
- package/src/durable/ThreadContextHistory.ts +227 -0
- package/src/durable/ThreadContextHistoryProjection.ts +216 -0
- package/src/durable/ThreadInvariants.ts +507 -0
- package/src/durable/ThreadProjection.ts +269 -0
- package/src/durable/ThreadProjectionMaintenance.ts +67 -0
- package/src/durable/ThreadStore.ts +573 -0
- package/src/durable/ThreadStoreConformance.ts +1156 -0
- package/src/durable/ToolReconciler.ts +109 -0
- package/src/durable/WakeScheduler.ts +134 -0
- package/src/durable/WorkerHost.ts +171 -0
- package/src/durable/internal/agent-registration.ts +587 -0
- package/src/durable/internal/agent-updates.ts +302 -0
- package/src/durable/internal/foreign-diagnostic.ts +47 -0
- package/src/durable/internal/journal-checkpoint.ts +104 -0
- package/src/durable/internal/journal-metadata.ts +117 -0
- package/src/durable/internal/message-status.ts +20 -0
- package/src/durable/internal/messaging-host.ts +637 -0
- package/src/durable/internal/schedule-time.ts +303 -0
- package/src/durable/internal/storage-v2-layout.ts +163 -0
- package/src/durable/internal/storage-v2.ts +73 -0
- package/src/durable/internal/worker-host.ts +2885 -0
- package/src/durable/internal/worker-runtime.ts +9 -0
- package/src/engine/AgentRuntime.ts +37 -0
- package/src/engine/Compaction.ts +11 -0
- package/src/engine/ContextCompactor.ts +277 -0
- package/src/engine/ContextHistory.ts +73 -0
- package/src/engine/ContextWindow.ts +72 -0
- package/src/engine/DurableStep.ts +132 -0
- package/src/engine/MessagingHost.ts +110 -0
- package/src/engine/Output.ts +2 -0
- package/src/engine/RunEventSink.ts +132 -0
- package/src/engine/RunOptions.ts +1101 -0
- package/src/engine/SubagentHost.ts +230 -0
- package/src/engine/ThreadHistory.ts +120 -0
- package/src/engine/ToolBroker.ts +157 -0
- package/src/engine/ToolExposure.ts +48 -0
- package/src/engine/internal/agent-runtime.ts +10500 -0
- package/src/engine/internal/bounded-value.ts +315 -0
- package/src/engine/internal/compaction.ts +678 -0
- package/src/engine/internal/error-diagnostic.ts +39 -0
- package/src/engine/internal/output-contract.ts +173 -0
- package/src/engine/internal/primitive-delta.ts +80 -0
- package/src/engine/internal/provider-result-staging.ts +211 -0
- package/src/engine/internal/tool-derivative.ts +106 -0
- package/src/engine/internal/tool-exposure.ts +224 -0
- package/src/engine/internal/tool-telemetry.ts +484 -0
- package/src/index.ts +99 -21
- package/src/sandbox/CodeExecutor.ts +352 -0
- package/src/sandbox/InteractiveBrowser.ts +339 -0
- package/src/sandbox/PageCapture.ts +691 -0
- package/src/sandbox/PageCrawl.ts +148 -0
- package/src/sandbox/PageScreenshot.ts +81 -0
- package/src/sandbox/ProtectedBrowser.ts +452 -0
- package/src/sandbox/Sandbox.ts +241 -0
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
+
import { AgentId, DelegationId, ThreadId } from "../core/Identifiers.mjs";
|
|
3
|
+
import { IdempotencyKey, Receipt } from "../core/Receipt.mjs";
|
|
4
|
+
import { o as Value, r as Diagnostic, s as capture } from "../FailureDiagnostic-BElLOoED.mjs";
|
|
5
|
+
import { b as WorkerUpdate } from "../Worker-CfwzMZEK.mjs";
|
|
6
|
+
import { Digest } from "./Records.mjs";
|
|
7
|
+
import { Settlement } from "./SubmissionLedger.mjs";
|
|
8
|
+
import { digestJson } from "./Digest.mjs";
|
|
9
|
+
import { ScheduleInstant, ScheduleRetry, ScheduleRetryReason } from "./Schedule.mjs";
|
|
10
|
+
import { PreparedInputAdmission, admitPreparedInput } from "./PreparedInputAdmission.mjs";
|
|
11
|
+
import { PreparedInput } from "./Subscription.mjs";
|
|
12
|
+
import { Clock, Context, Crypto, Effect, Layer, Result, Schema, Semaphore } from "effect";
|
|
13
|
+
//#region src/durable/MessageDelivery.ts
|
|
14
|
+
var MessageDelivery_exports = /* @__PURE__ */ __exportAll({
|
|
15
|
+
MessageDeliveryChange: () => MessageDeliveryChange,
|
|
16
|
+
MessageDeliveryDriver: () => MessageDeliveryDriver,
|
|
17
|
+
MessageDeliveryDriverLimits: () => MessageDeliveryDriverLimits,
|
|
18
|
+
MessageDeliveryError: () => MessageDeliveryError,
|
|
19
|
+
MessageDeliveryFailpoint: () => MessageDeliveryFailpoint,
|
|
20
|
+
MessageDeliveryFailpointError: () => MessageDeliveryFailpointError,
|
|
21
|
+
MessageDeliveryKey: () => MessageDeliveryKey,
|
|
22
|
+
MessageDeliveryPage: () => MessageDeliveryPage,
|
|
23
|
+
MessageDeliveryPageRequest: () => MessageDeliveryPageRequest,
|
|
24
|
+
MessageDeliveryPolicy: () => MessageDeliveryPolicy,
|
|
25
|
+
MessageDeliveryRecord: () => MessageDeliveryRecord,
|
|
26
|
+
MessageDeliveryStore: () => MessageDeliveryStore,
|
|
27
|
+
MessageDeliveryStoreLimits: () => MessageDeliveryStoreLimits,
|
|
28
|
+
applyMessageDeliveryChange: () => applyMessageDeliveryChange,
|
|
29
|
+
defaultMessageDeliveryPolicy: () => defaultMessageDeliveryPolicy,
|
|
30
|
+
defaultMessageDeliveryStoreLimits: () => defaultMessageDeliveryStoreLimits,
|
|
31
|
+
isWorkerUpdateDelivery: () => isWorkerUpdateDelivery,
|
|
32
|
+
messageDeliveryCapacity: () => messageDeliveryCapacity,
|
|
33
|
+
messageDeliveryDeadline: () => messageDeliveryDeadline,
|
|
34
|
+
messageDeliveryKeyString: () => messageDeliveryKeyString,
|
|
35
|
+
messageDeliveryUsesCapacity: () => messageDeliveryUsesCapacity,
|
|
36
|
+
prepareMessageDelivery: () => prepareMessageDelivery,
|
|
37
|
+
readPending: () => readPending,
|
|
38
|
+
sameMessageDeliveryIdentity: () => sameMessageDeliveryIdentity,
|
|
39
|
+
validateMessageDelivery: () => validateMessageDelivery
|
|
40
|
+
});
|
|
41
|
+
const Positive = Schema.Int.check(Schema.isGreaterThan(0));
|
|
42
|
+
const BoundedName = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256));
|
|
43
|
+
/** An owner is always a source Thread. Destination admission has its own frozen key. */
|
|
44
|
+
const MessageDeliveryKey = Schema.Struct({
|
|
45
|
+
ownerThreadId: ThreadId,
|
|
46
|
+
messageId: IdempotencyKey
|
|
47
|
+
});
|
|
48
|
+
const MessageDeliveryPolicy = Schema.Struct({
|
|
49
|
+
maxAutomaticAttempts: Positive.check(Schema.isLessThanOrEqualTo(100)),
|
|
50
|
+
attemptTimeoutMillis: Positive.check(Schema.isLessThanOrEqualTo(3e5)),
|
|
51
|
+
retryBaseMillis: Positive,
|
|
52
|
+
retryMaxMillis: Positive,
|
|
53
|
+
settlementPollMillis: Positive
|
|
54
|
+
}).check(Schema.makeFilter((value) => value.retryBaseMillis <= value.retryMaxMillis));
|
|
55
|
+
const defaultMessageDeliveryPolicy = {
|
|
56
|
+
maxAutomaticAttempts: 8,
|
|
57
|
+
attemptTimeoutMillis: 3e4,
|
|
58
|
+
retryBaseMillis: 1e3,
|
|
59
|
+
retryMaxMillis: 6e4,
|
|
60
|
+
settlementPollMillis: 5e3
|
|
61
|
+
};
|
|
62
|
+
const MessageDeliveryStoreLimits = Schema.Struct({
|
|
63
|
+
maxPendingPerOwner: Positive,
|
|
64
|
+
maxRetainedPerOwner: Positive,
|
|
65
|
+
maxEnvelopeBytes: Positive,
|
|
66
|
+
/** Separate update capacity preserves the full ordinary allowance for terminal reports. */
|
|
67
|
+
maxPendingUpdatesPerOwner: Schema.optionalKey(Positive),
|
|
68
|
+
maxRetainedUpdatesPerOwner: Schema.optionalKey(Positive)
|
|
69
|
+
}).check(Schema.makeFilter((value) => value.maxPendingPerOwner <= value.maxRetainedPerOwner && (value.maxPendingUpdatesPerOwner ?? 32) <= (value.maxRetainedUpdatesPerOwner ?? 256)));
|
|
70
|
+
const defaultMessageDeliveryStoreLimits = {
|
|
71
|
+
maxPendingPerOwner: 100,
|
|
72
|
+
maxRetainedPerOwner: 1e3,
|
|
73
|
+
maxEnvelopeBytes: 262144,
|
|
74
|
+
maxPendingUpdatesPerOwner: 32,
|
|
75
|
+
maxRetainedUpdatesPerOwner: 256
|
|
76
|
+
};
|
|
77
|
+
const ParkReason = Schema.Literals([
|
|
78
|
+
"exhausted",
|
|
79
|
+
"deadline",
|
|
80
|
+
"status-unavailable"
|
|
81
|
+
]);
|
|
82
|
+
const MessageDeliveryRecord = Schema.Struct({
|
|
83
|
+
schemaVersion: Schema.Literal(1),
|
|
84
|
+
key: MessageDeliveryKey,
|
|
85
|
+
envelope: PreparedInput,
|
|
86
|
+
envelopeDigest: Digest,
|
|
87
|
+
/** Same-owner predecessor whose admission must be known before this message is submitted. */
|
|
88
|
+
predecessor: Schema.optionalKey(IdempotencyKey),
|
|
89
|
+
createdAtMillis: ScheduleInstant,
|
|
90
|
+
/** Immutable creation identity; explicit recovery only renews deadlineAtMillis. */
|
|
91
|
+
initialDeadlineAtMillis: ScheduleInstant,
|
|
92
|
+
deadlineAtMillis: ScheduleInstant,
|
|
93
|
+
policy: MessageDeliveryPolicy,
|
|
94
|
+
version: Positive,
|
|
95
|
+
status: Schema.Literals([
|
|
96
|
+
"pending",
|
|
97
|
+
"accepted",
|
|
98
|
+
"processed",
|
|
99
|
+
"refused",
|
|
100
|
+
"parked"
|
|
101
|
+
]),
|
|
102
|
+
receipt: Schema.NullOr(Receipt),
|
|
103
|
+
settlement: Schema.NullOr(Settlement),
|
|
104
|
+
refusal: Schema.NullOr(BoundedName),
|
|
105
|
+
parkReason: Schema.NullOr(ParkReason),
|
|
106
|
+
leaseUntilMillis: Schema.NullOr(ScheduleInstant),
|
|
107
|
+
retry: ScheduleRetry,
|
|
108
|
+
/** Last failed admission/status check, retained across retries and successful recovery. */
|
|
109
|
+
lastFailureDiagnostic: Schema.optionalKey(Diagnostic)
|
|
110
|
+
}).check(Schema.makeFilter((record) => record.deadlineAtMillis > record.createdAtMillis && record.initialDeadlineAtMillis > record.createdAtMillis && record.predecessor !== record.key.messageId && record.status === "processed" === (record.settlement !== null) && record.status === "refused" === (record.refusal !== null) && record.status === "parked" === (record.parkReason !== null) && record.status === "parked" === record.retry.parked && (record.status === "accepted" || record.status === "processed" ? record.receipt !== null : true) && (record.status === "pending" || record.status === "refused" ? record.receipt === null : true) && (record.receipt === null || record.receipt.threadId === record.envelope.threadId) && (record.settlement === null || record.settlement.receiptId === record.receipt?.receiptId && record.settlement.submissionId === record.receipt.submissionId) && (record.status === "processed" || record.status === "refused" || record.status === "parked" ? record.leaseUntilMillis === null : true)));
|
|
111
|
+
var MessageDeliveryError = class extends Schema.TaggedError()("MessageDeliveryError", {
|
|
112
|
+
cause: Schema.optionalKey(Value),
|
|
113
|
+
stack: Schema.optionalKey(Schema.String),
|
|
114
|
+
reason: Schema.Literals([
|
|
115
|
+
"validation",
|
|
116
|
+
"conflict",
|
|
117
|
+
"capacity",
|
|
118
|
+
"not-found",
|
|
119
|
+
"storage",
|
|
120
|
+
"corrupt"
|
|
121
|
+
]),
|
|
122
|
+
operation: Schema.String
|
|
123
|
+
}) {};
|
|
124
|
+
var MessageDeliveryFailpointError = class extends Schema.TaggedError()("MessageDeliveryFailpointError", { point: Schema.String }) {};
|
|
125
|
+
const MessageDeliveryFailpoint = Context.Reference("@effect-agent/thread/MessageDeliveryFailpoint", { defaultValue: () => ({ hit: () => Effect.void }) });
|
|
126
|
+
const fence = {
|
|
127
|
+
expectedVersion: Positive,
|
|
128
|
+
nowMillis: ScheduleInstant
|
|
129
|
+
};
|
|
130
|
+
const MessageDeliveryChange = Schema.Union([
|
|
131
|
+
Schema.Struct({
|
|
132
|
+
_tag: Schema.Literal("Claim"),
|
|
133
|
+
...fence
|
|
134
|
+
}),
|
|
135
|
+
Schema.Struct({
|
|
136
|
+
_tag: Schema.Literal("Accept"),
|
|
137
|
+
...fence,
|
|
138
|
+
receipt: Receipt
|
|
139
|
+
}),
|
|
140
|
+
Schema.Struct({
|
|
141
|
+
_tag: Schema.Literal("Process"),
|
|
142
|
+
...fence,
|
|
143
|
+
settlement: Settlement
|
|
144
|
+
}),
|
|
145
|
+
Schema.Struct({
|
|
146
|
+
_tag: Schema.Literal("ObservePending"),
|
|
147
|
+
...fence
|
|
148
|
+
}),
|
|
149
|
+
Schema.Struct({
|
|
150
|
+
_tag: Schema.Literal("Refuse"),
|
|
151
|
+
...fence,
|
|
152
|
+
code: BoundedName,
|
|
153
|
+
diagnostic: Schema.optionalKey(Diagnostic)
|
|
154
|
+
}),
|
|
155
|
+
Schema.Struct({
|
|
156
|
+
_tag: Schema.Literal("Retry"),
|
|
157
|
+
...fence,
|
|
158
|
+
reason: ScheduleRetryReason,
|
|
159
|
+
diagnostic: Schema.optionalKey(Diagnostic)
|
|
160
|
+
}),
|
|
161
|
+
Schema.Struct({
|
|
162
|
+
_tag: Schema.Literal("Park"),
|
|
163
|
+
...fence,
|
|
164
|
+
reason: ParkReason,
|
|
165
|
+
diagnostic: Schema.optionalKey(Diagnostic)
|
|
166
|
+
}),
|
|
167
|
+
Schema.Struct({
|
|
168
|
+
_tag: Schema.Literal("Recover"),
|
|
169
|
+
...fence,
|
|
170
|
+
deadlineAtMillis: ScheduleInstant
|
|
171
|
+
}),
|
|
172
|
+
Schema.Struct({
|
|
173
|
+
_tag: Schema.Literal("Defer"),
|
|
174
|
+
...fence,
|
|
175
|
+
untilMillis: ScheduleInstant
|
|
176
|
+
})
|
|
177
|
+
]);
|
|
178
|
+
/** Select one native index per page; index filters cannot be combined. */
|
|
179
|
+
const MessageDeliveryPageRequest = Schema.Struct({
|
|
180
|
+
ownerThreadId: ThreadId,
|
|
181
|
+
limit: Positive.check(Schema.isLessThanOrEqualTo(4096)),
|
|
182
|
+
after: Schema.optionalKey(IdempotencyKey),
|
|
183
|
+
/** Native pending index, including accepted, future-due and parked obligations. */
|
|
184
|
+
pendingOnly: Schema.optionalKey(Schema.Boolean),
|
|
185
|
+
/** First retained envelopes, including starts not admitted at the destination. */
|
|
186
|
+
workerStarts: Schema.optionalKey(Schema.Struct({
|
|
187
|
+
delegationId: DelegationId,
|
|
188
|
+
targetAgentId: AgentId
|
|
189
|
+
})),
|
|
190
|
+
/** Retained inputs not yet acknowledged by one destination worker. */
|
|
191
|
+
pendingWorker: Schema.optionalKey(ThreadId)
|
|
192
|
+
}).check(Schema.makeFilter((request) => Number(request.pendingOnly === true) + Number(request.workerStarts !== void 0) + Number(request.pendingWorker !== void 0) <= 1));
|
|
193
|
+
const MessageDeliveryPage = Schema.Struct({
|
|
194
|
+
items: Schema.Array(MessageDeliveryRecord),
|
|
195
|
+
next: Schema.NullOr(IdempotencyKey)
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* Trusted host port, independent of either Thread's active Submission. List/get require an owner.
|
|
199
|
+
* Inserts and changes are atomic; identical inserts return current state even after completion.
|
|
200
|
+
* No automatic deletion: completed rows retain deduplication evidence and count toward retention.
|
|
201
|
+
* `due`/`nextDeadline` are bounded host recovery seams, never model-facing management operations.
|
|
202
|
+
*/
|
|
203
|
+
var MessageDeliveryStore = class extends Context.Service()("@effect-agent/thread/MessageDeliveryStore") {};
|
|
204
|
+
/**
|
|
205
|
+
* Read current source-owned obligations without acquiring a runtime or scanning completed history.
|
|
206
|
+
* A retained receipt is native accepted-admission evidence, not proof of destination materialization.
|
|
207
|
+
* Shipped worker admission reserves the source input before returning that receipt. Policy can
|
|
208
|
+
* therefore leave accepted worker discovery to canonical outstanding inputs; a no-receipt action
|
|
209
|
+
* delivery remains uncertain, including when parked or due in the future.
|
|
210
|
+
*/
|
|
211
|
+
const readPending = Effect.fn("MessageDelivery.readPending")(function* (request) {
|
|
212
|
+
const store = yield* MessageDeliveryStore;
|
|
213
|
+
const input = yield* validateMessageDelivery(MessageDeliveryPageRequest, {
|
|
214
|
+
ownerThreadId: request.ownerThreadId,
|
|
215
|
+
limit: request.limit,
|
|
216
|
+
pendingOnly: true
|
|
217
|
+
}, "read-pending");
|
|
218
|
+
const page = yield* validateMessageDelivery(MessageDeliveryPage, yield* store.list(input), "read-pending result");
|
|
219
|
+
if (page.next !== null || page.items.length > input.limit) return yield* MessageDeliveryError.make({
|
|
220
|
+
reason: "capacity",
|
|
221
|
+
operation: "read-pending"
|
|
222
|
+
});
|
|
223
|
+
const records = page.items;
|
|
224
|
+
if (records.some((record) => record.key.ownerThreadId !== input.ownerThreadId || !messageDeliveryUsesCapacity(record)) || new Set(records.map((record) => record.key.messageId)).size !== records.length) return yield* MessageDeliveryError.make({
|
|
225
|
+
reason: "corrupt",
|
|
226
|
+
operation: "read-pending result"
|
|
227
|
+
});
|
|
228
|
+
return records;
|
|
229
|
+
});
|
|
230
|
+
const messageDeliveryKeyString = (key) => JSON.stringify([key.ownerThreadId, key.messageId]);
|
|
231
|
+
const messageDeliveryUsesCapacity = (record) => record.status !== "processed" && record.status !== "refused";
|
|
232
|
+
const isWorkerUpdateDelivery = (record) => Schema.is(WorkerUpdate)(record.envelope.messageAdmission);
|
|
233
|
+
const messageDeliveryCapacity = (limits, update) => ({
|
|
234
|
+
pending: update ? limits.maxPendingUpdatesPerOwner ?? 32 : limits.maxPendingPerOwner,
|
|
235
|
+
retained: update ? limits.maxRetainedUpdatesPerOwner ?? 256 : limits.maxRetainedPerOwner
|
|
236
|
+
});
|
|
237
|
+
const messageDeliveryDeadline = (record) => record.status === "pending" || record.status === "accepted" ? Math.min(record.deadlineAtMillis, record.leaseUntilMillis ?? record.retry.nextAttemptAtMillis) : null;
|
|
238
|
+
/** Creation identity deliberately excludes operational counters and renewed recovery deadlines. */
|
|
239
|
+
const sameMessageDeliveryIdentity = (left, right) => messageDeliveryKeyString(left.key) === messageDeliveryKeyString(right.key) && left.envelopeDigest === right.envelopeDigest && left.predecessor === right.predecessor && Schema.toEquivalence(PreparedInput)(left.envelope, right.envelope) && Schema.toEquivalence(MessageDeliveryPolicy)(left.policy, right.policy) && left.createdAtMillis === right.createdAtMillis && left.initialDeadlineAtMillis === right.initialDeadlineAtMillis;
|
|
240
|
+
const error = (reason, operation, cause) => MessageDeliveryError.make({
|
|
241
|
+
reason,
|
|
242
|
+
operation,
|
|
243
|
+
...cause === void 0 ? {} : { cause }
|
|
244
|
+
});
|
|
245
|
+
const validateMessageDelivery = (schema, value, operation) => Schema.decodeUnknownEffect(Schema.toType(schema))(value).pipe(Effect.mapError(() => error("validation", operation)));
|
|
246
|
+
const MessageDeliveryPreparation = Schema.Struct({
|
|
247
|
+
key: MessageDeliveryKey,
|
|
248
|
+
envelope: PreparedInput,
|
|
249
|
+
createdAtMillis: ScheduleInstant,
|
|
250
|
+
deadlineAtMillis: ScheduleInstant,
|
|
251
|
+
policy: MessageDeliveryPolicy,
|
|
252
|
+
predecessor: Schema.optionalKey(IdempotencyKey)
|
|
253
|
+
});
|
|
254
|
+
/** Freeze and digest the complete admission envelope before publishing the obligation. */
|
|
255
|
+
const prepareMessageDelivery = Effect.fn("MessageDelivery.prepare")(function* (options) {
|
|
256
|
+
const snapshot = yield* Schema.encodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))({
|
|
257
|
+
...options,
|
|
258
|
+
policy: options.policy ?? defaultMessageDeliveryPolicy
|
|
259
|
+
}).pipe(Effect.flatMap(Schema.decodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))), Effect.mapError((cause) => error("validation", "prepare", cause)));
|
|
260
|
+
const envelope = snapshot.envelope;
|
|
261
|
+
const encoded = yield* Schema.encodeEffect(PreparedInput)(envelope).pipe(Effect.mapError((cause) => error("validation", "prepare", cause)));
|
|
262
|
+
if ((yield* digestJson(encoded.input).pipe(Effect.mapError((cause) => error("storage", "digest", cause)))) !== envelope.inputDigest) return yield* error("corrupt", "input-digest");
|
|
263
|
+
const envelopeDigest = yield* digestJson(encoded).pipe(Effect.mapError((cause) => error("storage", "digest", cause)));
|
|
264
|
+
return yield* validateMessageDelivery(MessageDeliveryRecord, {
|
|
265
|
+
schemaVersion: 1,
|
|
266
|
+
key: snapshot.key,
|
|
267
|
+
envelope,
|
|
268
|
+
envelopeDigest,
|
|
269
|
+
...snapshot.predecessor === void 0 ? {} : { predecessor: snapshot.predecessor },
|
|
270
|
+
createdAtMillis: snapshot.createdAtMillis,
|
|
271
|
+
initialDeadlineAtMillis: snapshot.deadlineAtMillis,
|
|
272
|
+
deadlineAtMillis: snapshot.deadlineAtMillis,
|
|
273
|
+
policy: snapshot.policy,
|
|
274
|
+
version: 1,
|
|
275
|
+
status: "pending",
|
|
276
|
+
receipt: null,
|
|
277
|
+
settlement: null,
|
|
278
|
+
refusal: null,
|
|
279
|
+
parkReason: null,
|
|
280
|
+
leaseUntilMillis: null,
|
|
281
|
+
retry: {
|
|
282
|
+
attempts: 0,
|
|
283
|
+
generation: 0,
|
|
284
|
+
automaticAttempts: 0,
|
|
285
|
+
parked: false,
|
|
286
|
+
nextAttemptAtMillis: snapshot.createdAtMillis,
|
|
287
|
+
lastAttemptAtMillis: null,
|
|
288
|
+
lastFailure: null
|
|
289
|
+
}
|
|
290
|
+
}, "prepare");
|
|
291
|
+
});
|
|
292
|
+
/** Pure reducer used under the adapter's atomic compare-and-swap boundary. */
|
|
293
|
+
const applyMessageDeliveryChange = (record, change) => {
|
|
294
|
+
const conflict = () => Result.fail(error("conflict", change._tag));
|
|
295
|
+
if (record.version !== change.expectedVersion) return conflict();
|
|
296
|
+
if (record.status === "processed" || record.status === "refused") return conflict();
|
|
297
|
+
const now = change.nowMillis;
|
|
298
|
+
const base = {
|
|
299
|
+
...record,
|
|
300
|
+
version: record.version + 1,
|
|
301
|
+
..."diagnostic" in change && change.diagnostic !== void 0 ? { lastFailureDiagnostic: change.diagnostic } : {}
|
|
302
|
+
};
|
|
303
|
+
const parked = (reason) => ({
|
|
304
|
+
...base,
|
|
305
|
+
status: "parked",
|
|
306
|
+
parkReason: reason,
|
|
307
|
+
leaseUntilMillis: null,
|
|
308
|
+
retry: {
|
|
309
|
+
...record.retry,
|
|
310
|
+
parked: true
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
if (change._tag === "Defer") {
|
|
314
|
+
if (record.status !== "pending" || record.leaseUntilMillis !== null && record.leaseUntilMillis > now) return conflict();
|
|
315
|
+
if (now >= record.deadlineAtMillis) return Result.succeed(parked("deadline"));
|
|
316
|
+
if (change.untilMillis <= now) return conflict();
|
|
317
|
+
return Result.succeed({
|
|
318
|
+
...base,
|
|
319
|
+
leaseUntilMillis: null,
|
|
320
|
+
retry: {
|
|
321
|
+
...record.retry,
|
|
322
|
+
nextAttemptAtMillis: Math.min(change.untilMillis, record.deadlineAtMillis)
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
if (change._tag === "Recover") {
|
|
327
|
+
if (record.status !== "parked" || change.deadlineAtMillis <= now) return conflict();
|
|
328
|
+
return Result.succeed({
|
|
329
|
+
...base,
|
|
330
|
+
deadlineAtMillis: change.deadlineAtMillis,
|
|
331
|
+
status: record.receipt === null ? "pending" : "accepted",
|
|
332
|
+
parkReason: null,
|
|
333
|
+
retry: {
|
|
334
|
+
...record.retry,
|
|
335
|
+
generation: record.retry.generation + 1,
|
|
336
|
+
automaticAttempts: 0,
|
|
337
|
+
parked: false,
|
|
338
|
+
nextAttemptAtMillis: now
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
if (record.status === "parked") return conflict();
|
|
343
|
+
if (change._tag === "Park") return Result.succeed(parked(change.reason));
|
|
344
|
+
if (change._tag === "Claim") {
|
|
345
|
+
const due = messageDeliveryDeadline(record);
|
|
346
|
+
if (due === null || due > now) return conflict();
|
|
347
|
+
if (now >= record.deadlineAtMillis) return Result.succeed(parked("deadline"));
|
|
348
|
+
if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts) return Result.succeed(parked("exhausted"));
|
|
349
|
+
return Result.succeed({
|
|
350
|
+
...base,
|
|
351
|
+
leaseUntilMillis: Math.min(now + record.policy.attemptTimeoutMillis, record.deadlineAtMillis),
|
|
352
|
+
retry: {
|
|
353
|
+
...record.retry,
|
|
354
|
+
attempts: record.retry.attempts + 1,
|
|
355
|
+
automaticAttempts: record.retry.automaticAttempts + 1,
|
|
356
|
+
lastAttemptAtMillis: now
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
if (record.leaseUntilMillis === null || now > record.leaseUntilMillis) return conflict();
|
|
361
|
+
if (change._tag === "Accept") {
|
|
362
|
+
if (record.status !== "pending") return conflict();
|
|
363
|
+
if (change.receipt.threadId !== record.envelope.threadId) return Result.fail(error("corrupt", "receipt-identity"));
|
|
364
|
+
return Result.succeed({
|
|
365
|
+
...base,
|
|
366
|
+
status: "accepted",
|
|
367
|
+
receipt: change.receipt,
|
|
368
|
+
leaseUntilMillis: null,
|
|
369
|
+
retry: {
|
|
370
|
+
...record.retry,
|
|
371
|
+
automaticAttempts: 0,
|
|
372
|
+
nextAttemptAtMillis: Math.min(now + record.policy.settlementPollMillis, record.deadlineAtMillis),
|
|
373
|
+
lastFailure: null
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
if (change._tag === "Process") {
|
|
378
|
+
if (record.status !== "accepted") return conflict();
|
|
379
|
+
if (change.settlement.submissionId !== record.receipt?.submissionId || change.settlement.receiptId !== record.receipt.receiptId) return Result.fail(error("corrupt", "settlement-identity"));
|
|
380
|
+
return Result.succeed({
|
|
381
|
+
...base,
|
|
382
|
+
status: "processed",
|
|
383
|
+
settlement: change.settlement,
|
|
384
|
+
leaseUntilMillis: null
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
if (change._tag === "ObservePending") {
|
|
388
|
+
if (record.status !== "accepted") return conflict();
|
|
389
|
+
if (now >= record.deadlineAtMillis) return Result.succeed(parked("deadline"));
|
|
390
|
+
return Result.succeed({
|
|
391
|
+
...base,
|
|
392
|
+
leaseUntilMillis: null,
|
|
393
|
+
retry: {
|
|
394
|
+
...record.retry,
|
|
395
|
+
automaticAttempts: 0,
|
|
396
|
+
lastFailure: null,
|
|
397
|
+
nextAttemptAtMillis: Math.min(now + record.policy.settlementPollMillis, record.deadlineAtMillis)
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
if (change._tag === "Refuse") {
|
|
402
|
+
if (record.status !== "pending") return conflict();
|
|
403
|
+
return Result.succeed({
|
|
404
|
+
...base,
|
|
405
|
+
status: "refused",
|
|
406
|
+
refusal: change.code,
|
|
407
|
+
leaseUntilMillis: null
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
if (now >= record.deadlineAtMillis) return Result.succeed(parked("deadline"));
|
|
411
|
+
if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts) return Result.succeed(parked("exhausted"));
|
|
412
|
+
const delay = Math.min(record.policy.retryBaseMillis * 2 ** Math.min(record.retry.automaticAttempts - 1, 52), record.policy.retryMaxMillis);
|
|
413
|
+
return Result.succeed({
|
|
414
|
+
...base,
|
|
415
|
+
leaseUntilMillis: null,
|
|
416
|
+
retry: {
|
|
417
|
+
...record.retry,
|
|
418
|
+
nextAttemptAtMillis: Math.min(now + (record.status === "accepted" ? record.policy.settlementPollMillis : delay), record.deadlineAtMillis),
|
|
419
|
+
lastFailure: change.reason
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
};
|
|
423
|
+
const MessageDeliveryDriverLimits = Schema.Struct({
|
|
424
|
+
batchSize: Positive.check(Schema.isLessThanOrEqualTo(100)),
|
|
425
|
+
concurrency: Positive.check(Schema.isLessThanOrEqualTo(32))
|
|
426
|
+
});
|
|
427
|
+
/**
|
|
428
|
+
* Finite, structured host pump. The host owns its Scope and wakes it from nextDeadline even
|
|
429
|
+
* after source/receiver settlement. Failed or interrupted calls retain their expiring claim;
|
|
430
|
+
* no ordinary tool is replayed here, only idempotent PreparedInput admission/status lookup.
|
|
431
|
+
* Spans expose operation names; envelopes, principals, and message contents are never logged.
|
|
432
|
+
*/
|
|
433
|
+
var MessageDeliveryDriver = class MessageDeliveryDriver extends Context.Service()("@effect-agent/thread/MessageDeliveryDriver") {
|
|
434
|
+
static layer(limits = {
|
|
435
|
+
batchSize: 100,
|
|
436
|
+
concurrency: 4
|
|
437
|
+
}) {
|
|
438
|
+
return Layer.effect(MessageDeliveryDriver, Effect.gen(function* () {
|
|
439
|
+
const config = yield* validateMessageDelivery(MessageDeliveryDriverLimits, limits, "driver-limits");
|
|
440
|
+
const store = yield* MessageDeliveryStore;
|
|
441
|
+
const admission = yield* PreparedInputAdmission;
|
|
442
|
+
const crypto = yield* Crypto.Crypto;
|
|
443
|
+
const failpoint = yield* MessageDeliveryFailpoint;
|
|
444
|
+
const semaphore = yield* Semaphore.make(config.concurrency);
|
|
445
|
+
const process = Effect.fn("MessageDelivery.process")((key) => semaphore.withPermit(Effect.gen(function* () {
|
|
446
|
+
const current = yield* store.get(key);
|
|
447
|
+
if (current === null) return yield* error("not-found", "process");
|
|
448
|
+
const nowMillis = yield* Clock.currentTimeMillis;
|
|
449
|
+
const due = messageDeliveryDeadline(current);
|
|
450
|
+
if (due === null || due > nowMillis) return current;
|
|
451
|
+
if (current.status === "pending" && current.predecessor !== void 0) {
|
|
452
|
+
const previous = yield* store.get({
|
|
453
|
+
ownerThreadId: key.ownerThreadId,
|
|
454
|
+
messageId: current.predecessor
|
|
455
|
+
});
|
|
456
|
+
if (previous === null || previous.receipt === null && previous.status !== "refused") return yield* store.change(key, {
|
|
457
|
+
_tag: "Defer",
|
|
458
|
+
expectedVersion: current.version,
|
|
459
|
+
nowMillis,
|
|
460
|
+
untilMillis: nowMillis + current.policy.settlementPollMillis
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
const claimed = yield* store.change(key, {
|
|
464
|
+
_tag: "Claim",
|
|
465
|
+
expectedVersion: current.version,
|
|
466
|
+
nowMillis
|
|
467
|
+
});
|
|
468
|
+
if (claimed.status === "parked") return claimed;
|
|
469
|
+
const envelope = yield* Schema.encodeEffect(PreparedInput)(claimed.envelope).pipe(Effect.mapError((cause) => error("corrupt", "envelope", cause)));
|
|
470
|
+
if ((yield* digestJson(envelope).pipe(Effect.provideService(Crypto.Crypto, crypto), Effect.mapError((cause) => error("storage", "digest", cause)))) !== claimed.envelopeDigest) return yield* error("corrupt", "envelope-digest");
|
|
471
|
+
const timeout = Math.min(claimed.policy.attemptTimeoutMillis, (claimed.leaseUntilMillis ?? claimed.deadlineAtMillis) - (yield* Clock.currentTimeMillis));
|
|
472
|
+
if (timeout <= 0) return claimed;
|
|
473
|
+
const commit = (change) => Clock.currentTimeMillis.pipe(Effect.flatMap((time) => store.change(key, {
|
|
474
|
+
...change,
|
|
475
|
+
expectedVersion: claimed.version,
|
|
476
|
+
nowMillis: time
|
|
477
|
+
})));
|
|
478
|
+
if (claimed.status === "pending") {
|
|
479
|
+
const outcome = yield* admitPreparedInput(admission.submit(claimed.envelope), timeout).pipe(Effect.mapError((cause) => error("corrupt", "admission", cause)));
|
|
480
|
+
yield* failpoint.hit("message-delivery:admission:after");
|
|
481
|
+
if (outcome._tag === "Receipt") return yield* commit({
|
|
482
|
+
_tag: "Accept",
|
|
483
|
+
receipt: outcome.receipt
|
|
484
|
+
});
|
|
485
|
+
if (outcome._tag === "Refused") return yield* commit({
|
|
486
|
+
_tag: "Refuse",
|
|
487
|
+
code: outcome.error.code,
|
|
488
|
+
diagnostic: capture(outcome.error)
|
|
489
|
+
});
|
|
490
|
+
return yield* commit({
|
|
491
|
+
_tag: "Retry",
|
|
492
|
+
reason: outcome.reason,
|
|
493
|
+
diagnostic: outcome.diagnostic
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
if (claimed.receipt === null) return yield* error("corrupt", "receipt");
|
|
497
|
+
if (admission.submissionStatus === void 0) return yield* commit({
|
|
498
|
+
_tag: "Park",
|
|
499
|
+
reason: "status-unavailable"
|
|
500
|
+
});
|
|
501
|
+
const status = yield* admission.submissionStatus(claimed.receipt).pipe(Effect.timeout(timeout), Effect.map((status) => ({
|
|
502
|
+
_tag: "Status",
|
|
503
|
+
status
|
|
504
|
+
})), Effect.catchTag("ScheduledInputRetryable", (failure) => Effect.succeed({
|
|
505
|
+
_tag: "Retry",
|
|
506
|
+
reason: failure.reason,
|
|
507
|
+
diagnostic: capture(failure)
|
|
508
|
+
})), Effect.catchTag("ScheduledInputRefused", (failure) => Effect.succeed({
|
|
509
|
+
_tag: "Unavailable",
|
|
510
|
+
diagnostic: capture(failure)
|
|
511
|
+
})), Effect.catchTag("TimeoutError", (failure) => Effect.succeed({
|
|
512
|
+
_tag: "Retry",
|
|
513
|
+
reason: "timeout",
|
|
514
|
+
diagnostic: capture(failure)
|
|
515
|
+
})), Effect.catchTag("ScheduleStorageError", (failure) => failure.reason === "unavailable" ? Effect.succeed({
|
|
516
|
+
_tag: "Retry",
|
|
517
|
+
reason: "storage",
|
|
518
|
+
diagnostic: capture(failure)
|
|
519
|
+
}) : Effect.fail(error("corrupt", "status", failure))));
|
|
520
|
+
if (status._tag === "Unavailable") return yield* commit({
|
|
521
|
+
_tag: "Park",
|
|
522
|
+
reason: "status-unavailable",
|
|
523
|
+
diagnostic: status.diagnostic
|
|
524
|
+
});
|
|
525
|
+
if (status._tag === "Status" && status.status._tag === "settled") return yield* commit({
|
|
526
|
+
_tag: "Process",
|
|
527
|
+
settlement: status.status.settlement
|
|
528
|
+
});
|
|
529
|
+
if (status._tag === "Status") return yield* commit({ _tag: "ObservePending" });
|
|
530
|
+
return yield* commit({
|
|
531
|
+
_tag: "Retry",
|
|
532
|
+
reason: status.reason,
|
|
533
|
+
diagnostic: status.diagnostic
|
|
534
|
+
});
|
|
535
|
+
})).pipe(Effect.catchTag("MessageDeliveryError", (failure) => failure.reason === "conflict" ? store.get(key).pipe(Effect.filterOrFail((record) => record !== null, () => failure)) : Effect.fail(failure))));
|
|
536
|
+
return MessageDeliveryDriver.of({
|
|
537
|
+
process,
|
|
538
|
+
runDue: Effect.fn("MessageDelivery.runDue")(function* (ownerThreadId) {
|
|
539
|
+
const keys = yield* store.due(yield* Clock.currentTimeMillis, config.batchSize, ownerThreadId);
|
|
540
|
+
return yield* Effect.forEach(keys, process, { concurrency: config.concurrency });
|
|
541
|
+
}),
|
|
542
|
+
retry: Effect.fn("MessageDelivery.retry")(function* (key, expectedVersion, deadlineAtMillis) {
|
|
543
|
+
return yield* store.change(key, {
|
|
544
|
+
_tag: "Recover",
|
|
545
|
+
expectedVersion,
|
|
546
|
+
deadlineAtMillis,
|
|
547
|
+
nowMillis: yield* Clock.currentTimeMillis
|
|
548
|
+
});
|
|
549
|
+
})
|
|
550
|
+
});
|
|
551
|
+
}));
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
//#endregion
|
|
555
|
+
export { MessageDeliveryChange, MessageDeliveryDriver, MessageDeliveryDriverLimits, MessageDeliveryError, MessageDeliveryFailpoint, MessageDeliveryFailpointError, MessageDeliveryKey, MessageDeliveryPage, MessageDeliveryPageRequest, MessageDeliveryPolicy, MessageDeliveryRecord, MessageDeliveryStore, MessageDeliveryStoreLimits, applyMessageDeliveryChange, defaultMessageDeliveryPolicy, defaultMessageDeliveryStoreLimits, isWorkerUpdateDelivery, messageDeliveryCapacity, messageDeliveryDeadline, messageDeliveryKeyString, messageDeliveryUsesCapacity, prepareMessageDelivery, readPending, sameMessageDeliveryIdentity, MessageDelivery_exports as t, validateMessageDelivery };
|
|
556
|
+
|
|
557
|
+
//# sourceMappingURL=MessageDelivery.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageDelivery.mjs","names":["FailureDiagnostic.Diagnostic","FailureDiagnostic.Value","FailureDiagnostic.capture"],"sources":["../../src/durable/MessageDelivery.ts"],"sourcesContent":["import { Clock, Context, Crypto, Effect, Layer, Result, Schema, Semaphore } from \"effect\";\n\nimport * as FailureDiagnostic from \"../core/FailureDiagnostic.ts\";\nimport { AgentId, DelegationId, ThreadId } from \"../core/Identifiers.ts\";\nimport { Receipt } from \"../core/Receipt.ts\";\nimport { WorkerUpdate } from \"../core/Worker.ts\";\nimport { digestJson } from \"./Digest.ts\";\nimport { admitPreparedInput, PreparedInputAdmission } from \"./PreparedInputAdmission.ts\";\nimport { Digest } from \"./Records.ts\";\nimport { ScheduleInstant, ScheduleRetry, ScheduleRetryReason } from \"./Schedule.ts\";\nimport { IdempotencyKey, Settlement } from \"./SubmissionLedger.ts\";\nimport { PreparedInput } from \"./Subscription.ts\";\n\nconst Positive = Schema.Int.check(Schema.isGreaterThan(0));\nconst BoundedName = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256));\n\n/** An owner is always a source Thread. Destination admission has its own frozen key. */\nexport const MessageDeliveryKey = Schema.Struct({\n ownerThreadId: ThreadId,\n messageId: IdempotencyKey,\n});\n\nexport type MessageDeliveryKey = typeof MessageDeliveryKey.Type;\n\nexport const MessageDeliveryPolicy = Schema.Struct({\n maxAutomaticAttempts: Positive.check(Schema.isLessThanOrEqualTo(100)),\n attemptTimeoutMillis: Positive.check(Schema.isLessThanOrEqualTo(300_000)),\n retryBaseMillis: Positive,\n retryMaxMillis: Positive,\n settlementPollMillis: Positive,\n}).check(Schema.makeFilter((value) => value.retryBaseMillis <= value.retryMaxMillis));\n\nexport type MessageDeliveryPolicy = typeof MessageDeliveryPolicy.Type;\n\nexport const defaultMessageDeliveryPolicy: MessageDeliveryPolicy = {\n maxAutomaticAttempts: 8,\n attemptTimeoutMillis: 30_000,\n retryBaseMillis: 1_000,\n retryMaxMillis: 60_000,\n settlementPollMillis: 5_000,\n};\n\nexport const MessageDeliveryStoreLimits = Schema.Struct({\n maxPendingPerOwner: Positive,\n maxRetainedPerOwner: Positive,\n maxEnvelopeBytes: Positive,\n /** Separate update capacity preserves the full ordinary allowance for terminal reports. */\n maxPendingUpdatesPerOwner: Schema.optionalKey(Positive),\n maxRetainedUpdatesPerOwner: Schema.optionalKey(Positive),\n}).check(\n Schema.makeFilter(\n (value) =>\n value.maxPendingPerOwner <= value.maxRetainedPerOwner &&\n (value.maxPendingUpdatesPerOwner ?? 32) <= (value.maxRetainedUpdatesPerOwner ?? 256),\n ),\n);\n\nexport type MessageDeliveryStoreLimits = typeof MessageDeliveryStoreLimits.Type;\n\nexport const defaultMessageDeliveryStoreLimits: MessageDeliveryStoreLimits = {\n maxPendingPerOwner: 100,\n maxRetainedPerOwner: 1_000,\n maxEnvelopeBytes: 262_144,\n maxPendingUpdatesPerOwner: 32,\n maxRetainedUpdatesPerOwner: 256,\n};\n\nconst ParkReason = Schema.Literals([\"exhausted\", \"deadline\", \"status-unavailable\"]);\n\nexport const MessageDeliveryRecord = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n envelopeDigest: Digest,\n /** Same-owner predecessor whose admission must be known before this message is submitted. */\n predecessor: Schema.optionalKey(IdempotencyKey),\n createdAtMillis: ScheduleInstant,\n /** Immutable creation identity; explicit recovery only renews deadlineAtMillis. */\n initialDeadlineAtMillis: ScheduleInstant,\n deadlineAtMillis: ScheduleInstant,\n policy: MessageDeliveryPolicy,\n version: Positive,\n status: Schema.Literals([\"pending\", \"accepted\", \"processed\", \"refused\", \"parked\"]),\n receipt: Schema.NullOr(Receipt),\n settlement: Schema.NullOr(Settlement),\n refusal: Schema.NullOr(BoundedName),\n parkReason: Schema.NullOr(ParkReason),\n leaseUntilMillis: Schema.NullOr(ScheduleInstant),\n retry: ScheduleRetry,\n /** Last failed admission/status check, retained across retries and successful recovery. */\n lastFailureDiagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n}).check(\n Schema.makeFilter(\n (record) =>\n record.deadlineAtMillis > record.createdAtMillis &&\n record.initialDeadlineAtMillis > record.createdAtMillis &&\n record.predecessor !== record.key.messageId &&\n (record.status === \"processed\") === (record.settlement !== null) &&\n (record.status === \"refused\") === (record.refusal !== null) &&\n (record.status === \"parked\") === (record.parkReason !== null) &&\n (record.status === \"parked\") === record.retry.parked &&\n (record.status === \"accepted\" || record.status === \"processed\"\n ? record.receipt !== null\n : true) &&\n (record.status === \"pending\" || record.status === \"refused\"\n ? record.receipt === null\n : true) &&\n (record.receipt === null || record.receipt.threadId === record.envelope.threadId) &&\n (record.settlement === null ||\n (record.settlement.receiptId === record.receipt?.receiptId &&\n record.settlement.submissionId === record.receipt.submissionId)) &&\n (record.status === \"processed\" || record.status === \"refused\" || record.status === \"parked\"\n ? record.leaseUntilMillis === null\n : true),\n ),\n);\n\nexport type MessageDeliveryRecord = typeof MessageDeliveryRecord.Type;\n\nexport class MessageDeliveryError extends Schema.TaggedError<MessageDeliveryError>()(\n \"MessageDeliveryError\",\n {\n cause: Schema.optionalKey(FailureDiagnostic.Value),\n stack: Schema.optionalKey(Schema.String),\n reason: Schema.Literals([\n \"validation\",\n \"conflict\",\n \"capacity\",\n \"not-found\",\n \"storage\",\n \"corrupt\",\n ]),\n operation: Schema.String,\n },\n) {}\n\nexport class MessageDeliveryFailpointError extends Schema.TaggedError<MessageDeliveryFailpointError>()(\n \"MessageDeliveryFailpointError\",\n {\n point: Schema.String,\n },\n) {}\n\nexport type MessageDeliveryFailure = MessageDeliveryError | MessageDeliveryFailpointError;\n\nexport const MessageDeliveryFailpoint = Context.Reference<{\n readonly hit: (point: string) => Effect.Effect<void, MessageDeliveryFailpointError>;\n}>(\"@effect-agent/thread/MessageDeliveryFailpoint\", {\n defaultValue: () => ({ hit: () => Effect.void }),\n});\n\nconst fence = { expectedVersion: Positive, nowMillis: ScheduleInstant };\n\nexport const MessageDeliveryChange = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"Claim\"), ...fence }),\n Schema.Struct({ _tag: Schema.Literal(\"Accept\"), ...fence, receipt: Receipt }),\n Schema.Struct({ _tag: Schema.Literal(\"Process\"), ...fence, settlement: Settlement }),\n Schema.Struct({ _tag: Schema.Literal(\"ObservePending\"), ...fence }),\n Schema.Struct({\n _tag: Schema.Literal(\"Refuse\"),\n ...fence,\n code: BoundedName,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"Retry\"),\n ...fence,\n reason: ScheduleRetryReason,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"Park\"),\n ...fence,\n reason: ParkReason,\n diagnostic: Schema.optionalKey(FailureDiagnostic.Diagnostic),\n }),\n Schema.Struct({ _tag: Schema.Literal(\"Recover\"), ...fence, deadlineAtMillis: ScheduleInstant }),\n /** Waiting for earlier admission never spends an automatic transport attempt. */\n Schema.Struct({ _tag: Schema.Literal(\"Defer\"), ...fence, untilMillis: ScheduleInstant }),\n]);\n\nexport type MessageDeliveryChange = typeof MessageDeliveryChange.Type;\n\n/** Select one native index per page; index filters cannot be combined. */\nexport const MessageDeliveryPageRequest = Schema.Struct({\n ownerThreadId: ThreadId,\n limit: Positive.check(Schema.isLessThanOrEqualTo(4096)),\n after: Schema.optionalKey(IdempotencyKey),\n /** Native pending index, including accepted, future-due and parked obligations. */\n pendingOnly: Schema.optionalKey(Schema.Boolean),\n /** First retained envelopes, including starts not admitted at the destination. */\n workerStarts: Schema.optionalKey(\n Schema.Struct({ delegationId: DelegationId, targetAgentId: AgentId }),\n ),\n /** Retained inputs not yet acknowledged by one destination worker. */\n pendingWorker: Schema.optionalKey(ThreadId),\n}).check(\n Schema.makeFilter(\n (request) =>\n Number(request.pendingOnly === true) +\n Number(request.workerStarts !== undefined) +\n Number(request.pendingWorker !== undefined) <=\n 1,\n ),\n);\n\nexport type MessageDeliveryPageRequest = typeof MessageDeliveryPageRequest.Type;\n\nexport const MessageDeliveryPage = Schema.Struct({\n items: Schema.Array(MessageDeliveryRecord),\n next: Schema.NullOr(IdempotencyKey),\n});\n\nexport type MessageDeliveryPage = typeof MessageDeliveryPage.Type;\n\n/**\n * Trusted host port, independent of either Thread's active Submission. List/get require an owner.\n * Inserts and changes are atomic; identical inserts return current state even after completion.\n * No automatic deletion: completed rows retain deduplication evidence and count toward retention.\n * `due`/`nextDeadline` are bounded host recovery seams, never model-facing management operations.\n */\nexport class MessageDeliveryStore extends Context.Service<\n MessageDeliveryStore,\n {\n readonly limits: MessageDeliveryStoreLimits;\n readonly maxStoredValueBytes: number;\n readonly insert: (\n record: MessageDeliveryRecord,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly get: (\n key: MessageDeliveryKey,\n ) => Effect.Effect<MessageDeliveryRecord | null, MessageDeliveryError>;\n readonly list: (\n request: MessageDeliveryPageRequest,\n ) => Effect.Effect<MessageDeliveryPage, MessageDeliveryError>;\n readonly change: (\n key: MessageDeliveryKey,\n change: MessageDeliveryChange,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly due: (\n nowMillis: number,\n limit: number,\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<ReadonlyArray<MessageDeliveryKey>, MessageDeliveryError>;\n readonly nextDeadline: (\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<number | null, MessageDeliveryError>;\n }\n>()(\"@effect-agent/thread/MessageDeliveryStore\") {}\n\n/**\n * Read current source-owned obligations without acquiring a runtime or scanning completed history.\n * A retained receipt is native accepted-admission evidence, not proof of destination materialization.\n * Shipped worker admission reserves the source input before returning that receipt. Policy can\n * therefore leave accepted worker discovery to canonical outstanding inputs; a no-receipt action\n * delivery remains uncertain, including when parked or due in the future.\n */\nexport const readPending = Effect.fn(\"MessageDelivery.readPending\")(function* (\n request: Pick<MessageDeliveryPageRequest, \"ownerThreadId\" | \"limit\">,\n) {\n const store = yield* MessageDeliveryStore;\n\n const input = yield* validateMessageDelivery(\n MessageDeliveryPageRequest,\n {\n ownerThreadId: request.ownerThreadId,\n limit: request.limit,\n pendingOnly: true,\n },\n \"read-pending\",\n );\n\n const page = yield* validateMessageDelivery(\n MessageDeliveryPage,\n yield* store.list(input),\n \"read-pending result\",\n );\n\n if (page.next !== null || page.items.length > input.limit)\n return yield* MessageDeliveryError.make({ reason: \"capacity\", operation: \"read-pending\" });\n const records = page.items;\n\n if (\n records.some(\n (record) =>\n record.key.ownerThreadId !== input.ownerThreadId || !messageDeliveryUsesCapacity(record),\n ) ||\n new Set(records.map((record) => record.key.messageId)).size !== records.length\n )\n return yield* MessageDeliveryError.make({\n reason: \"corrupt\",\n operation: \"read-pending result\",\n });\n\n return records;\n});\n\nexport const messageDeliveryKeyString = (key: MessageDeliveryKey): string =>\n JSON.stringify([key.ownerThreadId, key.messageId]);\n\nexport const messageDeliveryUsesCapacity = (record: MessageDeliveryRecord): boolean =>\n record.status !== \"processed\" && record.status !== \"refused\";\n\nexport const isWorkerUpdateDelivery = (record: MessageDeliveryRecord): boolean =>\n Schema.is(WorkerUpdate)(record.envelope.messageAdmission);\n\nexport const messageDeliveryCapacity = (limits: MessageDeliveryStoreLimits, update: boolean) => ({\n pending: update ? (limits.maxPendingUpdatesPerOwner ?? 32) : limits.maxPendingPerOwner,\n retained: update ? (limits.maxRetainedUpdatesPerOwner ?? 256) : limits.maxRetainedPerOwner,\n});\n\nexport const messageDeliveryDeadline = (record: MessageDeliveryRecord): number | null =>\n record.status === \"pending\" || record.status === \"accepted\"\n ? Math.min(record.deadlineAtMillis, record.leaseUntilMillis ?? record.retry.nextAttemptAtMillis)\n : null;\n\n/** Creation identity deliberately excludes operational counters and renewed recovery deadlines. */\nexport const sameMessageDeliveryIdentity = (\n left: MessageDeliveryRecord,\n right: MessageDeliveryRecord,\n): boolean =>\n messageDeliveryKeyString(left.key) === messageDeliveryKeyString(right.key) &&\n left.envelopeDigest === right.envelopeDigest &&\n left.predecessor === right.predecessor &&\n Schema.toEquivalence(PreparedInput)(left.envelope, right.envelope) &&\n Schema.toEquivalence(MessageDeliveryPolicy)(left.policy, right.policy) &&\n left.createdAtMillis === right.createdAtMillis &&\n left.initialDeadlineAtMillis === right.initialDeadlineAtMillis;\n\nconst error = (reason: MessageDeliveryError[\"reason\"], operation: string, cause?: unknown) =>\n MessageDeliveryError.make({ reason, operation, ...(cause === undefined ? {} : { cause }) });\n\nexport const validateMessageDelivery = <A, I>(\n schema: Schema.Codec<A, I>,\n value: unknown,\n operation: string,\n) =>\n Schema.decodeUnknownEffect(Schema.toType(schema))(value).pipe(\n Effect.mapError(() => error(\"validation\", operation)),\n );\n\nconst MessageDeliveryPreparation = Schema.Struct({\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n createdAtMillis: ScheduleInstant,\n deadlineAtMillis: ScheduleInstant,\n policy: MessageDeliveryPolicy,\n predecessor: Schema.optionalKey(IdempotencyKey),\n});\n\n/** Freeze and digest the complete admission envelope before publishing the obligation. */\nexport const prepareMessageDelivery = Effect.fn(\"MessageDelivery.prepare\")(function* (options: {\n readonly key: MessageDeliveryKey;\n readonly envelope: PreparedInput;\n readonly createdAtMillis: number;\n readonly deadlineAtMillis: number;\n readonly policy?: MessageDeliveryPolicy;\n readonly predecessor?: IdempotencyKey;\n}): Effect.fn.Return<MessageDeliveryRecord, MessageDeliveryError, Crypto.Crypto> {\n // JSON detaches every caller-owned value before Crypto can suspend preparation.\n const snapshot = yield* Schema.encodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))({\n ...options,\n policy: options.policy ?? defaultMessageDeliveryPolicy,\n }).pipe(\n Effect.flatMap(Schema.decodeEffect(Schema.fromJsonString(MessageDeliveryPreparation))),\n Effect.mapError((cause) => error(\"validation\", \"prepare\", cause)),\n );\n\n const envelope = snapshot.envelope;\n\n const encoded = yield* Schema.encodeEffect(PreparedInput)(envelope).pipe(\n Effect.mapError((cause) => error(\"validation\", \"prepare\", cause)),\n );\n\n const inputDigest = yield* digestJson(encoded.input).pipe(\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n if (inputDigest !== envelope.inputDigest) return yield* error(\"corrupt\", \"input-digest\");\n\n const envelopeDigest = yield* digestJson(encoded).pipe(\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n return yield* validateMessageDelivery(\n MessageDeliveryRecord,\n {\n schemaVersion: 1,\n key: snapshot.key,\n envelope,\n envelopeDigest,\n ...(snapshot.predecessor === undefined ? {} : { predecessor: snapshot.predecessor }),\n createdAtMillis: snapshot.createdAtMillis,\n initialDeadlineAtMillis: snapshot.deadlineAtMillis,\n deadlineAtMillis: snapshot.deadlineAtMillis,\n policy: snapshot.policy,\n version: 1,\n status: \"pending\",\n receipt: null,\n settlement: null,\n refusal: null,\n parkReason: null,\n leaseUntilMillis: null,\n retry: {\n attempts: 0,\n generation: 0,\n automaticAttempts: 0,\n parked: false,\n nextAttemptAtMillis: snapshot.createdAtMillis,\n lastAttemptAtMillis: null,\n lastFailure: null,\n },\n },\n \"prepare\",\n );\n});\n\n/** Pure reducer used under the adapter's atomic compare-and-swap boundary. */\nexport const applyMessageDeliveryChange = (\n record: MessageDeliveryRecord,\n change: MessageDeliveryChange,\n): Result.Result<MessageDeliveryRecord, MessageDeliveryError> => {\n const conflict = () => Result.fail(error(\"conflict\", change._tag));\n\n if (record.version !== change.expectedVersion) return conflict();\n if (record.status === \"processed\" || record.status === \"refused\") return conflict();\n const now = change.nowMillis;\n\n const base = {\n ...record,\n version: record.version + 1,\n ...(\"diagnostic\" in change && change.diagnostic !== undefined\n ? { lastFailureDiagnostic: change.diagnostic }\n : {}),\n };\n\n const parked = (reason: typeof ParkReason.Type): MessageDeliveryRecord => ({\n ...base,\n status: \"parked\",\n parkReason: reason,\n leaseUntilMillis: null,\n retry: { ...record.retry, parked: true },\n });\n\n if (change._tag === \"Defer\") {\n if (\n record.status !== \"pending\" ||\n (record.leaseUntilMillis !== null && record.leaseUntilMillis > now)\n )\n return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (change.untilMillis <= now) return conflict();\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n nextAttemptAtMillis: Math.min(change.untilMillis, record.deadlineAtMillis),\n },\n });\n }\n\n if (change._tag === \"Recover\") {\n if (record.status !== \"parked\" || change.deadlineAtMillis <= now) return conflict();\n\n return Result.succeed({\n ...base,\n deadlineAtMillis: change.deadlineAtMillis,\n status: record.receipt === null ? \"pending\" : \"accepted\",\n parkReason: null,\n retry: {\n ...record.retry,\n generation: record.retry.generation + 1,\n automaticAttempts: 0,\n parked: false,\n nextAttemptAtMillis: now,\n },\n });\n }\n if (record.status === \"parked\") return conflict();\n if (change._tag === \"Park\") return Result.succeed(parked(change.reason));\n if (change._tag === \"Claim\") {\n const due = messageDeliveryDeadline(record);\n\n if (due === null || due > now) return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts)\n return Result.succeed(parked(\"exhausted\"));\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: Math.min(now + record.policy.attemptTimeoutMillis, record.deadlineAtMillis),\n retry: {\n ...record.retry,\n attempts: record.retry.attempts + 1,\n automaticAttempts: record.retry.automaticAttempts + 1,\n lastAttemptAtMillis: now,\n },\n });\n }\n if (record.leaseUntilMillis === null || now > record.leaseUntilMillis) return conflict();\n if (change._tag === \"Accept\") {\n if (record.status !== \"pending\") return conflict();\n if (change.receipt.threadId !== record.envelope.threadId)\n return Result.fail(error(\"corrupt\", \"receipt-identity\"));\n\n return Result.succeed({\n ...base,\n status: \"accepted\",\n receipt: change.receipt,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n automaticAttempts: 0,\n nextAttemptAtMillis: Math.min(\n now + record.policy.settlementPollMillis,\n record.deadlineAtMillis,\n ),\n lastFailure: null,\n },\n });\n }\n if (change._tag === \"Process\") {\n if (record.status !== \"accepted\") return conflict();\n if (\n change.settlement.submissionId !== record.receipt?.submissionId ||\n change.settlement.receiptId !== record.receipt.receiptId\n )\n return Result.fail(error(\"corrupt\", \"settlement-identity\"));\n\n return Result.succeed({\n ...base,\n status: \"processed\",\n settlement: change.settlement,\n leaseUntilMillis: null,\n });\n }\n if (change._tag === \"ObservePending\") {\n if (record.status !== \"accepted\") return conflict();\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n automaticAttempts: 0,\n lastFailure: null,\n nextAttemptAtMillis: Math.min(\n now + record.policy.settlementPollMillis,\n record.deadlineAtMillis,\n ),\n },\n });\n }\n if (change._tag === \"Refuse\") {\n if (record.status !== \"pending\") return conflict();\n\n return Result.succeed({\n ...base,\n status: \"refused\",\n refusal: change.code,\n leaseUntilMillis: null,\n });\n }\n if (now >= record.deadlineAtMillis) return Result.succeed(parked(\"deadline\"));\n if (record.retry.automaticAttempts >= record.policy.maxAutomaticAttempts)\n return Result.succeed(parked(\"exhausted\"));\n\n const delay = Math.min(\n record.policy.retryBaseMillis * 2 ** Math.min(record.retry.automaticAttempts - 1, 52),\n record.policy.retryMaxMillis,\n );\n\n return Result.succeed({\n ...base,\n leaseUntilMillis: null,\n retry: {\n ...record.retry,\n nextAttemptAtMillis: Math.min(\n now + (record.status === \"accepted\" ? record.policy.settlementPollMillis : delay),\n record.deadlineAtMillis,\n ),\n lastFailure: change.reason,\n },\n });\n};\n\nexport const MessageDeliveryDriverLimits = Schema.Struct({\n batchSize: Positive.check(Schema.isLessThanOrEqualTo(100)),\n concurrency: Positive.check(Schema.isLessThanOrEqualTo(32)),\n});\n\nexport type MessageDeliveryDriverLimits = typeof MessageDeliveryDriverLimits.Type;\n\n/**\n * Finite, structured host pump. The host owns its Scope and wakes it from nextDeadline even\n * after source/receiver settlement. Failed or interrupted calls retain their expiring claim;\n * no ordinary tool is replayed here, only idempotent PreparedInput admission/status lookup.\n * Spans expose operation names; envelopes, principals, and message contents are never logged.\n */\nexport class MessageDeliveryDriver extends Context.Service<\n MessageDeliveryDriver,\n {\n readonly process: (\n key: MessageDeliveryKey,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n readonly runDue: (\n ownerThreadId?: ThreadId,\n ) => Effect.Effect<ReadonlyArray<MessageDeliveryRecord>, MessageDeliveryFailure>;\n readonly retry: (\n key: MessageDeliveryKey,\n expectedVersion: number,\n deadlineAtMillis: number,\n ) => Effect.Effect<MessageDeliveryRecord, MessageDeliveryFailure>;\n }\n>()(\"@effect-agent/thread/MessageDeliveryDriver\") {\n static layer(\n limits: MessageDeliveryDriverLimits = { batchSize: 100, concurrency: 4 },\n ): Layer.Layer<\n MessageDeliveryDriver,\n MessageDeliveryError,\n MessageDeliveryStore | PreparedInputAdmission | Crypto.Crypto\n > {\n return Layer.effect(\n MessageDeliveryDriver,\n Effect.gen(function* () {\n const config = yield* validateMessageDelivery(\n MessageDeliveryDriverLimits,\n limits,\n \"driver-limits\",\n );\n\n const store = yield* MessageDeliveryStore;\n const admission = yield* PreparedInputAdmission;\n const crypto = yield* Crypto.Crypto;\n const failpoint = yield* MessageDeliveryFailpoint;\n const semaphore = yield* Semaphore.make(config.concurrency);\n\n const process = Effect.fn(\"MessageDelivery.process\")((key: MessageDeliveryKey) =>\n semaphore\n .withPermit(\n Effect.gen(function* () {\n const current = yield* store.get(key);\n\n if (current === null) return yield* error(\"not-found\", \"process\");\n const nowMillis = yield* Clock.currentTimeMillis;\n const due = messageDeliveryDeadline(current);\n\n if (due === null || due > nowMillis) return current;\n\n if (current.status === \"pending\" && current.predecessor !== undefined) {\n const previous = yield* store.get({\n ownerThreadId: key.ownerThreadId,\n messageId: current.predecessor,\n });\n\n if (\n previous === null ||\n (previous.receipt === null && previous.status !== \"refused\")\n ) {\n return yield* store.change(key, {\n _tag: \"Defer\",\n expectedVersion: current.version,\n nowMillis,\n untilMillis: nowMillis + current.policy.settlementPollMillis,\n });\n }\n }\n\n const claimed = yield* store.change(key, {\n _tag: \"Claim\",\n expectedVersion: current.version,\n nowMillis,\n });\n\n if (claimed.status === \"parked\") return claimed;\n\n const envelope = yield* Schema.encodeEffect(PreparedInput)(claimed.envelope).pipe(\n Effect.mapError((cause) => error(\"corrupt\", \"envelope\", cause)),\n );\n\n const digest = yield* digestJson(envelope).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n Effect.mapError((cause) => error(\"storage\", \"digest\", cause)),\n );\n\n if (digest !== claimed.envelopeDigest)\n return yield* error(\"corrupt\", \"envelope-digest\");\n\n const timeout = Math.min(\n claimed.policy.attemptTimeoutMillis,\n (claimed.leaseUntilMillis ?? claimed.deadlineAtMillis) -\n (yield* Clock.currentTimeMillis),\n );\n\n // Digest computation cannot extend this claim's admission authority.\n if (timeout <= 0) return claimed;\n\n type WithoutFence<T> = T extends MessageDeliveryChange\n ? Omit<T, \"expectedVersion\" | \"nowMillis\">\n : never;\n\n const commit = (change: WithoutFence<MessageDeliveryChange>) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((time) =>\n store.change(key, {\n ...change,\n expectedVersion: claimed.version,\n nowMillis: time,\n }),\n ),\n );\n\n if (claimed.status === \"pending\") {\n const outcome = yield* admitPreparedInput(\n admission.submit(claimed.envelope),\n timeout,\n ).pipe(Effect.mapError((cause) => error(\"corrupt\", \"admission\", cause)));\n\n yield* failpoint.hit(\"message-delivery:admission:after\");\n if (outcome._tag === \"Receipt\")\n return yield* commit({ _tag: \"Accept\", receipt: outcome.receipt });\n if (outcome._tag === \"Refused\")\n return yield* commit({\n _tag: \"Refuse\",\n code: outcome.error.code,\n diagnostic: FailureDiagnostic.capture(outcome.error),\n });\n\n return yield* commit({\n _tag: \"Retry\",\n reason: outcome.reason,\n diagnostic: outcome.diagnostic,\n });\n }\n if (claimed.receipt === null) return yield* error(\"corrupt\", \"receipt\");\n if (admission.submissionStatus === undefined)\n return yield* commit({ _tag: \"Park\", reason: \"status-unavailable\" });\n\n const status = yield* admission.submissionStatus(claimed.receipt).pipe(\n Effect.timeout(timeout),\n Effect.map((status) => ({ _tag: \"Status\" as const, status })),\n Effect.catchTag(\"ScheduledInputRetryable\", (failure) =>\n Effect.succeed({\n _tag: \"Retry\" as const,\n reason: failure.reason,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"ScheduledInputRefused\", (failure) =>\n Effect.succeed({\n _tag: \"Unavailable\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"TimeoutError\", (failure) =>\n Effect.succeed({\n _tag: \"Retry\" as const,\n reason: \"timeout\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n }),\n ),\n Effect.catchTag(\"ScheduleStorageError\", (failure) =>\n failure.reason === \"unavailable\"\n ? Effect.succeed({\n _tag: \"Retry\" as const,\n reason: \"storage\" as const,\n diagnostic: FailureDiagnostic.capture(failure),\n })\n : Effect.fail(error(\"corrupt\", \"status\", failure)),\n ),\n );\n\n if (status._tag === \"Unavailable\")\n return yield* commit({\n _tag: \"Park\",\n reason: \"status-unavailable\",\n diagnostic: status.diagnostic,\n });\n if (status._tag === \"Status\" && status.status._tag === \"settled\")\n return yield* commit({ _tag: \"Process\", settlement: status.status.settlement });\n if (status._tag === \"Status\") return yield* commit({ _tag: \"ObservePending\" });\n\n return yield* commit({\n _tag: \"Retry\",\n reason: status.reason,\n diagnostic: status.diagnostic,\n });\n }),\n )\n .pipe(\n Effect.catchTag(\"MessageDeliveryError\", (failure) =>\n failure.reason === \"conflict\"\n ? store.get(key).pipe(\n Effect.filterOrFail(\n (record) => record !== null,\n () => failure,\n ),\n )\n : Effect.fail(failure),\n ),\n ),\n );\n\n return MessageDeliveryDriver.of({\n process,\n runDue: Effect.fn(\"MessageDelivery.runDue\")(function* (ownerThreadId) {\n const keys = yield* store.due(\n yield* Clock.currentTimeMillis,\n config.batchSize,\n ownerThreadId,\n );\n\n return yield* Effect.forEach(keys, process, { concurrency: config.concurrency });\n }),\n retry: Effect.fn(\"MessageDelivery.retry\")(\n function* (key, expectedVersion, deadlineAtMillis) {\n return yield* store.change(key, {\n _tag: \"Recover\",\n expectedVersion,\n deadlineAtMillis,\n nowMillis: yield* Clock.currentTimeMillis,\n });\n },\n ),\n });\n }),\n );\n }\n}\n"],"mappings":"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"}
|