effect-agent 0.1.0-beta.16 → 0.1.0-beta.160
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-Dirux8PR.d.mts +4270 -0
- package/dist/Agent-BMATXYsI.mjs +93 -0
- package/dist/Agent-BMATXYsI.mjs.map +1 -0
- package/dist/Agent-ZfnNCQXs.d.mts +259 -0
- package/dist/AgentError-Bn1ytXRD.d.mts +117 -0
- package/dist/AgentPolicy-B4oH8TbG.d.mts +112 -0
- package/dist/AgentRuntime-CVMHysXm.mjs +4844 -0
- package/dist/AgentRuntime-CVMHysXm.mjs.map +1 -0
- package/dist/AgentRuntime-D1MmB_0z.d.mts +346 -0
- package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
- package/dist/ContextCompactor-BoKQOjr5.d.mts +161 -0
- package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
- package/dist/Digest-COAt3Orl.d.mts +22 -0
- package/dist/DurableAgentRuntime-pr7cCaZw.mjs +7507 -0
- package/dist/DurableAgentRuntime-pr7cCaZw.mjs.map +1 -0
- package/dist/DurableFailpoint-Cnr3wx1L.d.mts +41 -0
- package/dist/DurableStep-Cry_iol4.d.mts +103 -0
- package/dist/EventSource-DOXB0RJR.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-7VXQnWI3.d.mts +221 -0
- package/dist/Messaging-CICd_CSi.d.mts +1067 -0
- package/dist/MessagingHost-DXwWnrMh.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-CY7NZByV.d.mts +25 -0
- package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
- package/dist/PreparedInputAdmission-B7r401xJ.d.mts +42 -0
- package/dist/Receipt-BAHyigAF.d.mts +33 -0
- package/dist/Records-Bm4Qt70a.d.mts +1115 -0
- package/dist/RunEvent-D0aepYwN.d.mts +474 -0
- package/dist/RunEventSink-9CUdI9Ar.d.mts +108 -0
- package/dist/RunJournal-CA2bsvHn.mjs +979 -0
- package/dist/RunJournal-CA2bsvHn.mjs.map +1 -0
- package/dist/RunOptions-BHmBa05n.d.mts +960 -0
- package/dist/RunPolicyUsage-CUudVtg_.d.mts +23 -0
- package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
- package/dist/Schedule-Bi_XVKLF.d.mts +847 -0
- package/dist/Scheduling-DPb2QyAK.mjs +691 -0
- package/dist/Scheduling-DPb2QyAK.mjs.map +1 -0
- package/dist/Subagent-D59om8SR.d.mts +1650 -0
- package/dist/Subagent-DH6G120f.mjs +1499 -0
- package/dist/Subagent-DH6G120f.mjs.map +1 -0
- package/dist/SubagentContract-tyN9v-Jv.d.mts +112 -0
- package/dist/SubagentHost-VTyf_wEF.d.mts +172 -0
- package/dist/Subscription-B3ScCBaN.d.mts +979 -0
- package/dist/SubscriptionInput-BP5WVsX_.d.mts +41 -0
- package/dist/Thread-DOBQ0QUY.d.mts +96 -0
- package/dist/ThreadHistory-FD-o4TsR.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-BNjPR7Zr.d.mts +129 -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-XEBYxRQv.d.mts +472 -0
- package/dist/WorkerAdmission-Cmcxd6nS.mjs +171 -0
- package/dist/WorkerAdmission-Cmcxd6nS.mjs.map +1 -0
- package/dist/agent-registration-BIOzAej4.mjs +210 -0
- package/dist/agent-registration-BIOzAej4.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/BrowserUse.d.mts +545 -0
- package/dist/capabilities/BrowserUse.mjs +254 -0
- package/dist/capabilities/BrowserUse.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 +523 -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 +187 -0
- package/dist/capabilities/ContextTools.mjs +87 -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 +519 -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 +129 -0
- package/dist/capabilities/ToolDiscovery.mjs +239 -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 +75 -0
- package/dist/capabilities/WebSearch.mjs +123 -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 +102 -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 +346 -0
- package/dist/core/RunEvent.mjs.map +1 -0
- package/dist/core/RunPolicyUsage.d.mts +2 -0
- package/dist/core/RunPolicyUsage.mjs +26 -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 +142 -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 +340 -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 +15 -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 +64 -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 +4 -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/LifecyclePublication.d.mts +2 -0
- package/dist/durable/LifecyclePublication.mjs +189 -0
- package/dist/durable/LifecyclePublication.mjs.map +1 -0
- package/dist/durable/MessageDelivery.d.mts +949 -0
- package/dist/durable/MessageDelivery.mjs +589 -0
- package/dist/durable/MessageDelivery.mjs.map +1 -0
- package/dist/durable/MessageDeliveryStoreConformance.d.mts +400 -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 +873 -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 +55 -0
- package/dist/durable/Scheduling.mjs +2 -0
- package/dist/durable/SqlMemoryStore.d.mts +742 -0
- package/dist/durable/SqlMemoryStore.mjs +627 -0
- package/dist/durable/SqlMemoryStore.mjs.map +1 -0
- package/dist/durable/SubmissionLedger.d.mts +3 -0
- package/dist/durable/SubmissionLedger.mjs +986 -0
- package/dist/durable/SubmissionLedger.mjs.map +1 -0
- package/dist/durable/SubmissionLedgerConformance.d.mts +30 -0
- package/dist/durable/SubmissionLedgerConformance.mjs +2254 -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 +274 -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 +74 -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 +77 -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 +383 -0
- package/dist/durable/ThreadStore.mjs.map +1 -0
- package/dist/durable/ThreadStoreConformance.d.mts +28 -0
- package/dist/durable/ThreadStoreConformance.mjs +543 -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/WorkerAdmission.d.mts +172 -0
- package/dist/durable/WorkerAdmission.mjs +2 -0
- package/dist/durable/WorkerHost.d.mts +156 -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 +125 -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 +93 -6
- package/dist/index.mjs +101 -6
- package/dist/output-contract-DS-S8mTv.mjs +135 -0
- package/dist/output-contract-DS-S8mTv.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 +48 -0
- package/dist/sandbox/PageScreenshot.mjs +53 -0
- package/dist/sandbox/PageScreenshot.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/BrowserUse.ts +367 -0
- package/src/capabilities/Budget.ts +536 -0
- package/src/capabilities/CodeMode.ts +1099 -0
- package/src/capabilities/Commands.ts +86 -0
- package/src/capabilities/ContextTools.ts +129 -0
- package/src/capabilities/Mcp.ts +426 -0
- package/src/capabilities/McpClient.ts +983 -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 +2486 -0
- package/src/capabilities/SubagentReservations.ts +850 -0
- package/src/capabilities/ToolDiscovery.ts +383 -0
- package/src/capabilities/WebCapture.ts +722 -0
- package/src/capabilities/WebSearch.ts +205 -0
- package/src/capabilities/internal/subagent-background.ts +1307 -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 +623 -0
- package/src/core/AgentError.ts +172 -0
- package/src/core/AgentPolicy.ts +161 -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 +375 -0
- package/src/core/RunPolicyUsage.ts +19 -0
- package/src/core/SemanticMemoryIndex.ts +250 -0
- package/src/core/SemanticMemoryRevalidation.ts +254 -0
- package/src/core/SubagentContract.ts +189 -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 +570 -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 +16 -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 +11854 -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/LifecyclePublication.ts +311 -0
- package/src/durable/MessageDelivery.ts +878 -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 +1099 -0
- package/src/durable/Recovery.ts +1018 -0
- package/src/durable/RunJournal.ts +1768 -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 +1056 -0
- package/src/durable/SubmissionLedger.ts +1297 -0
- package/src/durable/SubmissionLedgerConformance.ts +4940 -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 +637 -0
- package/src/durable/ThreadStoreConformance.ts +1296 -0
- package/src/durable/ToolReconciler.ts +109 -0
- package/src/durable/WakeScheduler.ts +134 -0
- package/src/durable/WorkerAdmission.ts +104 -0
- package/src/durable/WorkerHost.ts +205 -0
- package/src/durable/internal/agent-registration.ts +621 -0
- package/src/durable/internal/agent-updates.ts +306 -0
- package/src/durable/internal/foreign-diagnostic.ts +47 -0
- package/src/durable/internal/journal-checkpoint.ts +158 -0
- package/src/durable/internal/journal-metadata.ts +124 -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/thread-initialization.ts +195 -0
- package/src/durable/internal/worker-host.ts +3309 -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 +1127 -0
- package/src/engine/SubagentHost.ts +239 -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 +10845 -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 +250 -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 +100 -22
- 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/Sandbox.ts +241 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { u as strictSchema } from "../FailureDiagnostic-BElLOoED.mjs";
|
|
2
|
+
import { SubscriptionSourceError } from "./Subscription.mjs";
|
|
3
|
+
import { makeEventSource } from "./EventSource.mjs";
|
|
4
|
+
import { SubscriptionIntake } from "./Subscriptions.mjs";
|
|
5
|
+
import { ByteSize, Context, Effect, Encoding, Layer, Redacted, Schema } from "effect";
|
|
6
|
+
import { HttpClient, HttpClientRequest, HttpIncomingMessage } from "effect/unstable/http";
|
|
7
|
+
//#region src/durable/GitHubWorkflowSource.ts
|
|
8
|
+
const PositiveId = Schema.Int.check(Schema.isGreaterThan(0));
|
|
9
|
+
const GitHubName = Schema.NonEmptyString.check(Schema.isMaxLength(100), Schema.isPattern(/^[A-Za-z0-9_.-]+$/));
|
|
10
|
+
const GitCommitSha = Schema.String.check(Schema.isPattern(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/));
|
|
11
|
+
const GitHubConclusion = Schema.NonEmptyString.check(Schema.isMaxLength(64));
|
|
12
|
+
const GitHubStatus = Schema.NonEmptyString.check(Schema.isMaxLength(32));
|
|
13
|
+
/** One repository whose identity and credentials are selected by the host. */
|
|
14
|
+
const GitHubRepository = Schema.Struct({
|
|
15
|
+
id: PositiveId,
|
|
16
|
+
owner: GitHubName,
|
|
17
|
+
name: GitHubName
|
|
18
|
+
}).pipe(strictSchema);
|
|
19
|
+
/** Exact workflow attempt requested by an Agent through a host-permitted source. */
|
|
20
|
+
const GitHubWorkflowRunWatch = Schema.Struct({
|
|
21
|
+
runId: PositiveId,
|
|
22
|
+
attempt: PositiveId,
|
|
23
|
+
expectedHeadSha: GitCommitSha
|
|
24
|
+
}).pipe(strictSchema);
|
|
25
|
+
/**
|
|
26
|
+
* Small canonical completion shared by webhook intake and REST reconciliation. Provider delivery
|
|
27
|
+
* IDs, URLs, actors, and mutable metadata are deliberately omitted from durable event identity.
|
|
28
|
+
*/
|
|
29
|
+
const GitHubWorkflowRunCompletion = Schema.Struct({
|
|
30
|
+
repositoryId: PositiveId,
|
|
31
|
+
runId: PositiveId,
|
|
32
|
+
attempt: PositiveId,
|
|
33
|
+
headSha: GitCommitSha,
|
|
34
|
+
conclusion: GitHubConclusion
|
|
35
|
+
}).pipe(strictSchema);
|
|
36
|
+
const GitHubWorkflowRunWire = Schema.Struct({
|
|
37
|
+
id: PositiveId,
|
|
38
|
+
run_attempt: PositiveId,
|
|
39
|
+
head_sha: GitCommitSha,
|
|
40
|
+
status: GitHubStatus,
|
|
41
|
+
conclusion: Schema.NullOr(GitHubConclusion),
|
|
42
|
+
repository: Schema.Struct({ id: PositiveId })
|
|
43
|
+
});
|
|
44
|
+
const GitHubWorkflowRunWebhook = Schema.Struct({
|
|
45
|
+
action: Schema.Literal("completed"),
|
|
46
|
+
repository: Schema.Struct({ id: PositiveId }),
|
|
47
|
+
workflow_run: GitHubWorkflowRunWire
|
|
48
|
+
});
|
|
49
|
+
const GitHubWorkflowRunAttempt = GitHubWorkflowRunWire;
|
|
50
|
+
const GitHubWorkflowRunSourceVersion = {
|
|
51
|
+
name: "github-workflow-run-completed",
|
|
52
|
+
version: "1"
|
|
53
|
+
};
|
|
54
|
+
var GitHubWorkflowRunsError = class extends Schema.TaggedError()("GitHubWorkflowRunsError", {
|
|
55
|
+
reason: Schema.Literals([
|
|
56
|
+
"rate-limited",
|
|
57
|
+
"unavailable",
|
|
58
|
+
"unauthorized",
|
|
59
|
+
"not-found",
|
|
60
|
+
"invalid-response"
|
|
61
|
+
]),
|
|
62
|
+
retryable: Schema.Boolean
|
|
63
|
+
}) {};
|
|
64
|
+
/**
|
|
65
|
+
* Credentialed, read-only GitHub boundary. Implementations must authorize the repository and read
|
|
66
|
+
* the exact attempt endpoint; the source never receives or persists a credential.
|
|
67
|
+
*/
|
|
68
|
+
var GitHubWorkflowRuns = class extends Context.Service()("@effect-agent/thread/GitHubWorkflowRuns") {};
|
|
69
|
+
const httpFailure = (reason, retryable) => GitHubWorkflowRunsError.make({
|
|
70
|
+
reason,
|
|
71
|
+
retryable
|
|
72
|
+
});
|
|
73
|
+
/**
|
|
74
|
+
* GitHub REST adapter for `GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt}`.
|
|
75
|
+
* It performs one bounded read. Scheduling retries and backoff remain owned by SubscriptionDriver.
|
|
76
|
+
*/
|
|
77
|
+
const githubWorkflowRunsHttpLayer = (options) => Layer.effect(GitHubWorkflowRuns, Effect.gen(function* () {
|
|
78
|
+
const client = yield* HttpClient.HttpClient;
|
|
79
|
+
const permittedRepository = yield* Schema.decodeEffect(GitHubRepository, { onExcessProperty: "error" })(options.repository).pipe(Effect.mapError(() => httpFailure("invalid-response", false)));
|
|
80
|
+
const apiUrl = (options.apiUrl ?? "https://api.github.com").replace(/\/$/, "");
|
|
81
|
+
const getAttempt = Effect.fn("GitHubWorkflowRuns.getAttempt")(function* (request) {
|
|
82
|
+
const repository = yield* Schema.decodeEffect(GitHubRepository, { onExcessProperty: "error" })(request.repository).pipe(Effect.mapError(() => httpFailure("invalid-response", false)));
|
|
83
|
+
if (repository.id !== permittedRepository.id || repository.owner !== permittedRepository.owner || repository.name !== permittedRepository.name) return yield* httpFailure("unauthorized", false);
|
|
84
|
+
const watch = yield* Schema.decodeEffect(GitHubWorkflowRunWatch, { onExcessProperty: "error" })({
|
|
85
|
+
runId: request.runId,
|
|
86
|
+
attempt: request.attempt,
|
|
87
|
+
expectedHeadSha: "0".repeat(40)
|
|
88
|
+
}).pipe(Effect.mapError(() => httpFailure("invalid-response", false)));
|
|
89
|
+
const url = `${apiUrl}/repos/${repository.owner}/${repository.name}/actions/runs/${String(watch.runId)}/attempts/${String(watch.attempt)}`;
|
|
90
|
+
const response = yield* client.execute(HttpClientRequest.get(url).pipe(HttpClientRequest.setHeaders({
|
|
91
|
+
Accept: "application/vnd.github+json",
|
|
92
|
+
"X-GitHub-Api-Version": "2026-03-10",
|
|
93
|
+
"User-Agent": options.userAgent ?? "effect-agent-subscriptions"
|
|
94
|
+
}), HttpClientRequest.bearerToken(options.token))).pipe(Effect.mapError(() => httpFailure("unavailable", true)));
|
|
95
|
+
if (response.status === 429 || response.status === 403 && (response.headers["x-ratelimit-remaining"] === "0" || response.headers["retry-after"] !== void 0)) return yield* httpFailure("rate-limited", true);
|
|
96
|
+
if (response.status === 401 || response.status === 403) return yield* httpFailure("unauthorized", false);
|
|
97
|
+
if (response.status === 404) return yield* httpFailure("not-found", true);
|
|
98
|
+
if (response.status < 200 || response.status >= 300) return yield* httpFailure("unavailable", response.status >= 500);
|
|
99
|
+
return yield* response.json.pipe(Effect.provideService(HttpIncomingMessage.MaxBodySize, ByteSize.mebibytes(1)), Effect.mapError(() => httpFailure("invalid-response", false)), Effect.flatMap(Schema.decodeUnknownEffect(GitHubWorkflowRunAttempt)), Effect.mapError(() => httpFailure("invalid-response", false)));
|
|
100
|
+
});
|
|
101
|
+
return GitHubWorkflowRuns.of({ getAttempt });
|
|
102
|
+
}));
|
|
103
|
+
const sourceError = (code, retryable) => SubscriptionSourceError.make({
|
|
104
|
+
code,
|
|
105
|
+
retryable
|
|
106
|
+
});
|
|
107
|
+
const completionIdentity = (completion) => `github-workflow-run:${String(completion.repositoryId)}:${String(completion.runId)}:${String(completion.attempt)}:completed`;
|
|
108
|
+
const watchIdentity = (repositoryId, watch) => `github-workflow-run:${String(repositoryId)}:${String(watch.runId)}:${String(watch.attempt)}:completed`;
|
|
109
|
+
const completionFromWire = Effect.fn("GitHubWorkflowRun.completionFromWire")(function* (repository, watch, wire) {
|
|
110
|
+
if (wire.repository.id !== repository.id || wire.id !== watch.runId || wire.run_attempt !== watch.attempt || wire.head_sha !== watch.expectedHeadSha) return yield* sourceError("github-identity-mismatch", false);
|
|
111
|
+
if (wire.status !== "completed") return null;
|
|
112
|
+
if (wire.conclusion === null) return yield* sourceError("github-completed-without-conclusion", false);
|
|
113
|
+
return GitHubWorkflowRunCompletion.make({
|
|
114
|
+
repositoryId: repository.id,
|
|
115
|
+
runId: wire.id,
|
|
116
|
+
attempt: wire.run_attempt,
|
|
117
|
+
headSha: wire.head_sha,
|
|
118
|
+
conclusion: wire.conclusion
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* Build the exact-attempt completion source, shared by all destination Agents in this partition.
|
|
123
|
+
* Reconciliation depends on GitHub retaining a readable exact attempt.
|
|
124
|
+
*/
|
|
125
|
+
const makeGitHubWorkflowRunSource = Effect.fn("makeGitHubWorkflowRunSource")(function* (options) {
|
|
126
|
+
const repository = yield* Schema.decodeEffect(GitHubRepository, { onExcessProperty: "error" })(options.repository).pipe(Effect.mapError(() => sourceError("github-repository-configuration", false)));
|
|
127
|
+
const runs = yield* GitHubWorkflowRuns;
|
|
128
|
+
return yield* makeEventSource({
|
|
129
|
+
source: GitHubWorkflowRunSourceVersion,
|
|
130
|
+
continuity: "Webhook delivery is not replayed by GitHub; reconciliation can recover only while the exact workflow run attempt remains readable and authorized.",
|
|
131
|
+
event: GitHubWorkflowRunCompletion.check(Schema.makeFilter((completion) => completion.repositoryId === repository.id, { title: "GitHub completion belongs to the host-bound repository" })),
|
|
132
|
+
parameters: GitHubWorkflowRunWatch,
|
|
133
|
+
identity: completionIdentity,
|
|
134
|
+
eventKey: completionIdentity,
|
|
135
|
+
parameterKey: (watch) => watchIdentity(repository.id, watch),
|
|
136
|
+
matches: (completion, watch) => completion.repositoryId === repository.id && completion.runId === watch.runId && completion.attempt === watch.attempt && completion.headSha === watch.expectedHeadSha,
|
|
137
|
+
reconcile: (watch) => runs.getAttempt({
|
|
138
|
+
repository,
|
|
139
|
+
runId: watch.runId,
|
|
140
|
+
attempt: watch.attempt
|
|
141
|
+
}).pipe(Effect.mapError((error) => sourceError(`github-${error.reason}`, error.retryable)), Effect.flatMap((wire) => completionFromWire(repository, watch, wire)))
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
var GitHubWebhookVerificationError = class extends Schema.TaggedError()("GitHubWebhookVerificationError", { reason: Schema.Literals([
|
|
145
|
+
"invalid-signature",
|
|
146
|
+
"invalid-event",
|
|
147
|
+
"invalid-payload",
|
|
148
|
+
"payload-too-large",
|
|
149
|
+
"crypto-unavailable"
|
|
150
|
+
]) }) {};
|
|
151
|
+
/** Host-held webhook secret verification; callers cannot bypass it by supplying parsed JSON. */
|
|
152
|
+
var GitHubWebhookSignatureVerifier = class extends Context.Service()("@effect-agent/thread/GitHubWebhookSignatureVerifier") {};
|
|
153
|
+
/** GitHub-compatible HMAC-SHA256 verifier over the exact raw request bytes. */
|
|
154
|
+
const webCryptoGitHubWebhookSignatureVerifierLayer = (secret, subtle) => Layer.effect(GitHubWebhookSignatureVerifier, Effect.sync(() => {
|
|
155
|
+
const verify = Effect.fn("GitHubWebhookSignatureVerifier.verify")(function* (body, signature) {
|
|
156
|
+
if (!/^sha256=[0-9a-f]{64}$/.test(signature)) return yield* GitHubWebhookVerificationError.make({ reason: "invalid-signature" });
|
|
157
|
+
const signatureBytes = yield* Effect.fromResult(Encoding.decodeHex(signature.slice(7))).pipe(Effect.mapError(() => GitHubWebhookVerificationError.make({ reason: "invalid-signature" })));
|
|
158
|
+
const keyBytes = new TextEncoder().encode(Redacted.value(secret));
|
|
159
|
+
const keyBuffer = new ArrayBuffer(keyBytes.byteLength);
|
|
160
|
+
new Uint8Array(keyBuffer).set(keyBytes);
|
|
161
|
+
const key = yield* Effect.tryPromise({
|
|
162
|
+
try: () => subtle.importKey("raw", keyBuffer, {
|
|
163
|
+
name: "HMAC",
|
|
164
|
+
hash: "SHA-256"
|
|
165
|
+
}, false, ["verify"]),
|
|
166
|
+
catch: () => GitHubWebhookVerificationError.make({ reason: "crypto-unavailable" })
|
|
167
|
+
});
|
|
168
|
+
const signatureBuffer = new ArrayBuffer(signatureBytes.byteLength);
|
|
169
|
+
new Uint8Array(signatureBuffer).set(signatureBytes);
|
|
170
|
+
const bodyBuffer = new ArrayBuffer(body.byteLength);
|
|
171
|
+
new Uint8Array(bodyBuffer).set(body);
|
|
172
|
+
if (!(yield* Effect.tryPromise({
|
|
173
|
+
try: () => subtle.verify("HMAC", key, signatureBuffer, bodyBuffer),
|
|
174
|
+
catch: () => GitHubWebhookVerificationError.make({ reason: "crypto-unavailable" })
|
|
175
|
+
}))) return yield* GitHubWebhookVerificationError.make({ reason: "invalid-signature" });
|
|
176
|
+
});
|
|
177
|
+
return GitHubWebhookSignatureVerifier.of({ verify });
|
|
178
|
+
}));
|
|
179
|
+
/**
|
|
180
|
+
* Verify raw ingress, decode only a completed `workflow_run`, and hand its canonical completion to
|
|
181
|
+
* durable intake. The acknowledgement means routing work is retained; it is not a Submission Receipt.
|
|
182
|
+
*/
|
|
183
|
+
const acceptVerifiedGitHubWorkflowRunWebhook = Effect.fn("acceptVerifiedGitHubWorkflowRunWebhook")(function* (request) {
|
|
184
|
+
if (request.body.byteLength > 1048576) return yield* GitHubWebhookVerificationError.make({ reason: "payload-too-large" });
|
|
185
|
+
if (request.eventHeader !== "workflow_run" || request.signatureHeader === void 0) return yield* GitHubWebhookVerificationError.make({ reason: "invalid-event" });
|
|
186
|
+
yield* (yield* GitHubWebhookSignatureVerifier).verify(request.body, request.signatureHeader);
|
|
187
|
+
const text = yield* Effect.try({
|
|
188
|
+
try: () => new TextDecoder("utf-8", {
|
|
189
|
+
fatal: true,
|
|
190
|
+
ignoreBOM: false
|
|
191
|
+
}).decode(request.body),
|
|
192
|
+
catch: () => GitHubWebhookVerificationError.make({ reason: "invalid-payload" })
|
|
193
|
+
});
|
|
194
|
+
const webhook = yield* Schema.decodeEffect(Schema.fromJsonString(GitHubWorkflowRunWebhook))(text).pipe(Effect.mapError(() => GitHubWebhookVerificationError.make({ reason: "invalid-payload" })));
|
|
195
|
+
if (webhook.repository.id !== webhook.workflow_run.repository.id) return yield* GitHubWebhookVerificationError.make({ reason: "invalid-payload" });
|
|
196
|
+
if (webhook.workflow_run.status !== "completed" || webhook.workflow_run.conclusion === null) return yield* GitHubWebhookVerificationError.make({ reason: "invalid-payload" });
|
|
197
|
+
const completion = GitHubWorkflowRunCompletion.make({
|
|
198
|
+
repositoryId: webhook.repository.id,
|
|
199
|
+
runId: webhook.workflow_run.id,
|
|
200
|
+
attempt: webhook.workflow_run.run_attempt,
|
|
201
|
+
headSha: webhook.workflow_run.head_sha,
|
|
202
|
+
conclusion: webhook.workflow_run.conclusion
|
|
203
|
+
});
|
|
204
|
+
return yield* (yield* SubscriptionIntake).accept(request.principal, GitHubWorkflowRunSourceVersion, completion);
|
|
205
|
+
});
|
|
206
|
+
//#endregion
|
|
207
|
+
export { GitHubRepository, GitHubWebhookSignatureVerifier, GitHubWebhookVerificationError, GitHubWorkflowRunAttempt, GitHubWorkflowRunCompletion, GitHubWorkflowRunSourceVersion, GitHubWorkflowRunWatch, GitHubWorkflowRunWebhook, GitHubWorkflowRuns, GitHubWorkflowRunsError, acceptVerifiedGitHubWorkflowRunWebhook, githubWorkflowRunsHttpLayer, makeGitHubWorkflowRunSource, webCryptoGitHubWebhookSignatureVerifierLayer };
|
|
208
|
+
|
|
209
|
+
//# sourceMappingURL=GitHubWorkflowSource.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubWorkflowSource.mjs","names":[],"sources":["../../src/durable/GitHubWorkflowSource.ts"],"sourcesContent":["import { Context, Effect, Encoding, ByteSize, Layer, Redacted, Schema } from \"effect\";\nimport { HttpClient, HttpIncomingMessage, HttpClientRequest } from \"effect/unstable/http\";\n\nimport { strictSchema } from \"../core/internal/strict-schema.ts\";\nimport { makeEventSource, type EventSource } from \"./EventSource.ts\";\nimport type { Principal } from \"./SubmissionLedger.ts\";\nimport type { EventAcknowledgement } from \"./Subscription.ts\";\nimport { SubscriptionSourceError } from \"./Subscription.ts\";\nimport { SubscriptionIntake } from \"./Subscriptions.ts\";\n\nconst PositiveId = Schema.Int.check(Schema.isGreaterThan(0));\n\nconst GitHubName = Schema.NonEmptyString.check(\n Schema.isMaxLength(100),\n Schema.isPattern(/^[A-Za-z0-9_.-]+$/),\n);\n\nconst GitCommitSha = Schema.String.check(Schema.isPattern(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/));\nconst GitHubConclusion = Schema.NonEmptyString.check(Schema.isMaxLength(64));\nconst GitHubStatus = Schema.NonEmptyString.check(Schema.isMaxLength(32));\n\n/** One repository whose identity and credentials are selected by the host. */\nexport const GitHubRepository = Schema.Struct({\n id: PositiveId,\n owner: GitHubName,\n name: GitHubName,\n}).pipe(strictSchema);\n\nexport type GitHubRepository = typeof GitHubRepository.Type;\n\n/** Exact workflow attempt requested by an Agent through a host-permitted source. */\nexport const GitHubWorkflowRunWatch = Schema.Struct({\n runId: PositiveId,\n attempt: PositiveId,\n expectedHeadSha: GitCommitSha,\n}).pipe(strictSchema);\n\nexport type GitHubWorkflowRunWatch = typeof GitHubWorkflowRunWatch.Type;\n\n/**\n * Small canonical completion shared by webhook intake and REST reconciliation. Provider delivery\n * IDs, URLs, actors, and mutable metadata are deliberately omitted from durable event identity.\n */\nexport const GitHubWorkflowRunCompletion = Schema.Struct({\n repositoryId: PositiveId,\n runId: PositiveId,\n attempt: PositiveId,\n headSha: GitCommitSha,\n conclusion: GitHubConclusion,\n}).pipe(strictSchema);\n\nexport type GitHubWorkflowRunCompletion = typeof GitHubWorkflowRunCompletion.Type;\n\n// Provider wire payloads intentionally project the fields we own. GitHub adds many fields and\n// may add more; canonical values below remain strict after this projection.\nconst GitHubWorkflowRunWire = Schema.Struct({\n id: PositiveId,\n run_attempt: PositiveId,\n head_sha: GitCommitSha,\n status: GitHubStatus,\n conclusion: Schema.NullOr(GitHubConclusion),\n repository: Schema.Struct({ id: PositiveId }),\n});\n\nexport const GitHubWorkflowRunWebhook = Schema.Struct({\n action: Schema.Literal(\"completed\"),\n repository: Schema.Struct({ id: PositiveId }),\n workflow_run: GitHubWorkflowRunWire,\n});\n\nexport type GitHubWorkflowRunWebhook = typeof GitHubWorkflowRunWebhook.Type;\n\nexport const GitHubWorkflowRunAttempt = GitHubWorkflowRunWire;\nexport type GitHubWorkflowRunAttempt = typeof GitHubWorkflowRunAttempt.Type;\n\nexport const GitHubWorkflowRunSourceVersion = {\n name: \"github-workflow-run-completed\",\n version: \"1\",\n} as const;\n\nexport class GitHubWorkflowRunsError extends Schema.TaggedError<GitHubWorkflowRunsError>()(\n \"GitHubWorkflowRunsError\",\n {\n reason: Schema.Literals([\n \"rate-limited\",\n \"unavailable\",\n \"unauthorized\",\n \"not-found\",\n \"invalid-response\",\n ]),\n retryable: Schema.Boolean,\n },\n) {}\n\nexport interface GitHubWorkflowRunAttemptRequest {\n readonly repository: GitHubRepository;\n readonly runId: number;\n readonly attempt: number;\n}\n\n/**\n * Credentialed, read-only GitHub boundary. Implementations must authorize the repository and read\n * the exact attempt endpoint; the source never receives or persists a credential.\n */\nexport class GitHubWorkflowRuns extends Context.Service<\n GitHubWorkflowRuns,\n {\n readonly getAttempt: (\n request: GitHubWorkflowRunAttemptRequest,\n ) => Effect.Effect<GitHubWorkflowRunAttempt, GitHubWorkflowRunsError>;\n }\n>()(\"@effect-agent/thread/GitHubWorkflowRuns\") {}\n\nexport interface GitHubWorkflowRunsHttpOptions {\n /** Repository this credentialed adapter is authorized to read. */\n readonly repository: GitHubRepository;\n readonly token: Redacted.Redacted<string>;\n readonly apiUrl?: string | undefined;\n readonly userAgent?: string | undefined;\n}\n\nconst httpFailure = (\n reason: GitHubWorkflowRunsError[\"reason\"],\n retryable: boolean,\n): GitHubWorkflowRunsError => GitHubWorkflowRunsError.make({ reason, retryable });\n\n/**\n * GitHub REST adapter for `GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt}`.\n * It performs one bounded read. Scheduling retries and backoff remain owned by SubscriptionDriver.\n */\nexport const githubWorkflowRunsHttpLayer = (\n options: GitHubWorkflowRunsHttpOptions,\n): Layer.Layer<GitHubWorkflowRuns, GitHubWorkflowRunsError, HttpClient.HttpClient> =>\n Layer.effect(\n GitHubWorkflowRuns,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n\n const permittedRepository = yield* Schema.decodeEffect(GitHubRepository, {\n onExcessProperty: \"error\",\n })(options.repository).pipe(Effect.mapError(() => httpFailure(\"invalid-response\", false)));\n\n const apiUrl = (options.apiUrl ?? \"https://api.github.com\").replace(/\\/$/, \"\");\n\n const getAttempt = Effect.fn(\"GitHubWorkflowRuns.getAttempt\")(function* (\n request: GitHubWorkflowRunAttemptRequest,\n ) {\n const repository = yield* Schema.decodeEffect(GitHubRepository, {\n onExcessProperty: \"error\",\n })(request.repository).pipe(Effect.mapError(() => httpFailure(\"invalid-response\", false)));\n\n if (\n repository.id !== permittedRepository.id ||\n repository.owner !== permittedRepository.owner ||\n repository.name !== permittedRepository.name\n ) {\n return yield* httpFailure(\"unauthorized\", false);\n }\n\n const watch = yield* Schema.decodeEffect(GitHubWorkflowRunWatch, {\n onExcessProperty: \"error\",\n })({\n runId: request.runId,\n attempt: request.attempt,\n expectedHeadSha: \"0\".repeat(40),\n }).pipe(Effect.mapError(() => httpFailure(\"invalid-response\", false)));\n\n const url = `${apiUrl}/repos/${repository.owner}/${repository.name}/actions/runs/${String(watch.runId)}/attempts/${String(watch.attempt)}`;\n\n const response = yield* client\n .execute(\n HttpClientRequest.get(url).pipe(\n HttpClientRequest.setHeaders({\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2026-03-10\",\n \"User-Agent\": options.userAgent ?? \"effect-agent-subscriptions\",\n }),\n HttpClientRequest.bearerToken(options.token),\n ),\n )\n .pipe(Effect.mapError(() => httpFailure(\"unavailable\", true)));\n\n if (\n response.status === 429 ||\n (response.status === 403 &&\n (response.headers[\"x-ratelimit-remaining\"] === \"0\" ||\n response.headers[\"retry-after\"] !== undefined))\n ) {\n return yield* httpFailure(\"rate-limited\", true);\n }\n if (response.status === 401 || response.status === 403) {\n return yield* httpFailure(\"unauthorized\", false);\n }\n if (response.status === 404) return yield* httpFailure(\"not-found\", true);\n if (response.status < 200 || response.status >= 300) {\n return yield* httpFailure(\"unavailable\", response.status >= 500);\n }\n\n return yield* response.json.pipe(\n Effect.provideService(HttpIncomingMessage.MaxBodySize, ByteSize.mebibytes(1)),\n Effect.mapError(() => httpFailure(\"invalid-response\", false)),\n Effect.flatMap(Schema.decodeUnknownEffect(GitHubWorkflowRunAttempt)),\n Effect.mapError(() => httpFailure(\"invalid-response\", false)),\n );\n });\n\n return GitHubWorkflowRuns.of({ getAttempt });\n }),\n );\n\nconst sourceError = (code: string, retryable: boolean) =>\n SubscriptionSourceError.make({ code, retryable });\n\nconst completionIdentity = (completion: GitHubWorkflowRunCompletion): string =>\n `github-workflow-run:${String(completion.repositoryId)}:${String(completion.runId)}:${String(completion.attempt)}:completed`;\n\nconst watchIdentity = (repositoryId: number, watch: GitHubWorkflowRunWatch): string =>\n `github-workflow-run:${String(repositoryId)}:${String(watch.runId)}:${String(watch.attempt)}:completed`;\n\nconst completionFromWire = Effect.fn(\"GitHubWorkflowRun.completionFromWire\")(function* (\n repository: GitHubRepository,\n watch: GitHubWorkflowRunWatch,\n wire: GitHubWorkflowRunAttempt,\n) {\n if (\n wire.repository.id !== repository.id ||\n wire.id !== watch.runId ||\n wire.run_attempt !== watch.attempt ||\n wire.head_sha !== watch.expectedHeadSha\n ) {\n return yield* sourceError(\"github-identity-mismatch\", false);\n }\n if (wire.status !== \"completed\") return null;\n if (wire.conclusion === null) {\n return yield* sourceError(\"github-completed-without-conclusion\", false);\n }\n\n return GitHubWorkflowRunCompletion.make({\n repositoryId: repository.id,\n runId: wire.id,\n attempt: wire.run_attempt,\n headSha: wire.head_sha,\n conclusion: wire.conclusion,\n });\n});\n\nexport interface GitHubWorkflowRunSourceOptions {\n readonly repository: GitHubRepository;\n}\n\n/**\n * Build the exact-attempt completion source, shared by all destination Agents in this partition.\n * Reconciliation depends on GitHub retaining a readable exact attempt.\n */\nexport const makeGitHubWorkflowRunSource = Effect.fn(\"makeGitHubWorkflowRunSource\")(function* (\n options: GitHubWorkflowRunSourceOptions,\n): Effect.fn.Return<EventSource, SubscriptionSourceError, GitHubWorkflowRuns> {\n const repository = yield* Schema.decodeEffect(GitHubRepository, { onExcessProperty: \"error\" })(\n options.repository,\n ).pipe(Effect.mapError(() => sourceError(\"github-repository-configuration\", false)));\n\n const runs = yield* GitHubWorkflowRuns;\n\n return yield* makeEventSource({\n source: GitHubWorkflowRunSourceVersion,\n continuity:\n \"Webhook delivery is not replayed by GitHub; reconciliation can recover only while the exact workflow run attempt remains readable and authorized.\",\n event: GitHubWorkflowRunCompletion.check(\n Schema.makeFilter((completion) => completion.repositoryId === repository.id, {\n title: \"GitHub completion belongs to the host-bound repository\",\n }),\n ),\n parameters: GitHubWorkflowRunWatch,\n identity: completionIdentity,\n eventKey: completionIdentity,\n parameterKey: (watch) => watchIdentity(repository.id, watch),\n matches: (completion, watch) =>\n completion.repositoryId === repository.id &&\n completion.runId === watch.runId &&\n completion.attempt === watch.attempt &&\n completion.headSha === watch.expectedHeadSha,\n reconcile: (watch) =>\n runs.getAttempt({ repository, runId: watch.runId, attempt: watch.attempt }).pipe(\n Effect.mapError((error) => sourceError(`github-${error.reason}`, error.retryable)),\n Effect.flatMap((wire) => completionFromWire(repository, watch, wire)),\n ),\n });\n});\n\nexport class GitHubWebhookVerificationError extends Schema.TaggedError<GitHubWebhookVerificationError>()(\n \"GitHubWebhookVerificationError\",\n {\n reason: Schema.Literals([\n \"invalid-signature\",\n \"invalid-event\",\n \"invalid-payload\",\n \"payload-too-large\",\n \"crypto-unavailable\",\n ]),\n },\n) {}\n\n/** Host-held webhook secret verification; callers cannot bypass it by supplying parsed JSON. */\nexport class GitHubWebhookSignatureVerifier extends Context.Service<\n GitHubWebhookSignatureVerifier,\n {\n readonly verify: (\n body: Uint8Array,\n signature: string,\n ) => Effect.Effect<void, GitHubWebhookVerificationError>;\n }\n>()(\"@effect-agent/thread/GitHubWebhookSignatureVerifier\") {}\n\n/** Narrow host WebCrypto capability used for GitHub HMAC-SHA256 verification. */\nexport interface GitHubWebhookSubtleCrypto<Key> {\n readonly importKey: (\n format: \"raw\",\n keyData: ArrayBuffer,\n algorithm: { readonly name: \"HMAC\"; readonly hash: \"SHA-256\" },\n extractable: false,\n usages: [\"verify\"],\n ) => PromiseLike<Key>;\n readonly verify: (\n algorithm: \"HMAC\",\n key: Key,\n signature: ArrayBuffer,\n data: ArrayBuffer,\n ) => PromiseLike<boolean>;\n}\n\n/** GitHub-compatible HMAC-SHA256 verifier over the exact raw request bytes. */\nexport const webCryptoGitHubWebhookSignatureVerifierLayer = <Key>(\n secret: Redacted.Redacted<string>,\n subtle: GitHubWebhookSubtleCrypto<Key>,\n): Layer.Layer<GitHubWebhookSignatureVerifier> =>\n Layer.effect(\n GitHubWebhookSignatureVerifier,\n Effect.sync(() => {\n const verify = Effect.fn(\"GitHubWebhookSignatureVerifier.verify\")(function* (\n body: Uint8Array,\n signature: string,\n ) {\n if (!/^sha256=[0-9a-f]{64}$/.test(signature)) {\n return yield* GitHubWebhookVerificationError.make({ reason: \"invalid-signature\" });\n }\n\n const signatureBytes = yield* Effect.fromResult(\n Encoding.decodeHex(signature.slice(\"sha256=\".length)),\n ).pipe(\n Effect.mapError(() =>\n GitHubWebhookVerificationError.make({ reason: \"invalid-signature\" }),\n ),\n );\n\n const keyBytes = new TextEncoder().encode(Redacted.value(secret));\n const keyBuffer = new ArrayBuffer(keyBytes.byteLength);\n\n new Uint8Array(keyBuffer).set(keyBytes);\n\n const key = yield* Effect.tryPromise({\n try: () =>\n subtle.importKey(\"raw\", keyBuffer, { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n \"verify\",\n ]),\n catch: () => GitHubWebhookVerificationError.make({ reason: \"crypto-unavailable\" }),\n });\n\n const signatureBuffer = new ArrayBuffer(signatureBytes.byteLength);\n\n new Uint8Array(signatureBuffer).set(signatureBytes);\n const bodyBuffer = new ArrayBuffer(body.byteLength);\n\n new Uint8Array(bodyBuffer).set(body);\n\n const valid = yield* Effect.tryPromise({\n try: () => subtle.verify(\"HMAC\", key, signatureBuffer, bodyBuffer),\n catch: () => GitHubWebhookVerificationError.make({ reason: \"crypto-unavailable\" }),\n });\n\n if (!valid) {\n return yield* GitHubWebhookVerificationError.make({ reason: \"invalid-signature\" });\n }\n });\n\n return GitHubWebhookSignatureVerifier.of({ verify });\n }),\n );\n\nexport interface VerifiedGitHubWorkflowRunWebhookRequest {\n readonly body: Uint8Array;\n readonly eventHeader: string | undefined;\n readonly signatureHeader: string | undefined;\n readonly principal: Principal;\n}\n\n/**\n * Verify raw ingress, decode only a completed `workflow_run`, and hand its canonical completion to\n * durable intake. The acknowledgement means routing work is retained; it is not a Submission Receipt.\n */\nexport const acceptVerifiedGitHubWorkflowRunWebhook = Effect.fn(\n \"acceptVerifiedGitHubWorkflowRunWebhook\",\n)(function* (\n request: VerifiedGitHubWorkflowRunWebhookRequest,\n): Effect.fn.Return<\n EventAcknowledgement,\n | GitHubWebhookVerificationError\n | Effect.Error<ReturnType<SubscriptionIntake[\"Service\"][\"accept\"]>>,\n GitHubWebhookSignatureVerifier | SubscriptionIntake\n> {\n if (request.body.byteLength > 1024 * 1024) {\n return yield* GitHubWebhookVerificationError.make({ reason: \"payload-too-large\" });\n }\n if (request.eventHeader !== \"workflow_run\" || request.signatureHeader === undefined) {\n return yield* GitHubWebhookVerificationError.make({ reason: \"invalid-event\" });\n }\n const verifier = yield* GitHubWebhookSignatureVerifier;\n\n yield* verifier.verify(request.body, request.signatureHeader);\n\n const text = yield* Effect.try({\n try: () => new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: false }).decode(request.body),\n catch: () => GitHubWebhookVerificationError.make({ reason: \"invalid-payload\" }),\n });\n\n const webhook = yield* Schema.decodeEffect(Schema.fromJsonString(GitHubWorkflowRunWebhook))(\n text,\n ).pipe(Effect.mapError(() => GitHubWebhookVerificationError.make({ reason: \"invalid-payload\" })));\n\n if (webhook.repository.id !== webhook.workflow_run.repository.id) {\n return yield* GitHubWebhookVerificationError.make({ reason: \"invalid-payload\" });\n }\n if (webhook.workflow_run.status !== \"completed\" || webhook.workflow_run.conclusion === null) {\n return yield* GitHubWebhookVerificationError.make({ reason: \"invalid-payload\" });\n }\n\n const completion = GitHubWorkflowRunCompletion.make({\n repositoryId: webhook.repository.id,\n runId: webhook.workflow_run.id,\n attempt: webhook.workflow_run.run_attempt,\n headSha: webhook.workflow_run.head_sha,\n conclusion: webhook.workflow_run.conclusion,\n });\n\n const intake = yield* SubscriptionIntake;\n\n return yield* intake.accept(request.principal, GitHubWorkflowRunSourceVersion, completion);\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { Ci as drainLifecyclePublications, Ti as lifecyclePublicationLayer, _i as LifecyclePublicationError, bi as LifecyclePublicationSource, gi as LifecyclePublicationConfig, hi as LifecyclePublicationBatch, mi as LifecyclePublication, vi as LifecyclePublicationFact, wi as lifecyclePublicationBatchMaxFacts, xi as LifecyclePublicationStorage, yi as LifecyclePublicationHandler } from "../Admin-Dirux8PR.mjs";
|
|
2
|
+
export { LifecyclePublication, LifecyclePublicationBatch, LifecyclePublicationConfig, LifecyclePublicationError, LifecyclePublicationFact, LifecyclePublicationHandler, LifecyclePublicationSource, LifecyclePublicationStorage, drainLifecyclePublications, lifecyclePublicationBatchMaxFacts, lifecyclePublicationLayer };
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
+
import { SubmissionId, ThreadId } from "../core/Identifiers.mjs";
|
|
3
|
+
import { Receipt } from "../core/Receipt.mjs";
|
|
4
|
+
import { n as AssignmentTerminal } from "../Worker-CfwzMZEK.mjs";
|
|
5
|
+
import { AbortRequested, AgentUpdateEmitted, CanonicalSequence, RunStartedRecord, SubagentJoined, SubagentRequested, SubagentStarted, SubmissionSettledRecord, ToolApprovalDecided, ToolApprovalRequested, UserInputRecorded, WorkerInputCompleted, WorkerInputRequested, WorkerStopRequested } from "./Records.mjs";
|
|
6
|
+
import { AbortIntent, Settlement, SubmissionLedger, SubmissionLookupById, SubmissionSnapshot, SuspensionReason } from "./SubmissionLedger.mjs";
|
|
7
|
+
import { getRunInput } from "./ThreadStore.mjs";
|
|
8
|
+
import { PreparedInput } from "./Subscription.mjs";
|
|
9
|
+
import { MessageDeliveryKey } from "./MessageDelivery.mjs";
|
|
10
|
+
import { Cause, Clock, Context, Crypto, Effect, Layer, Option, Schema } from "effect";
|
|
11
|
+
//#region src/durable/LifecyclePublication.ts
|
|
12
|
+
var LifecyclePublication_exports = /* @__PURE__ */ __exportAll({
|
|
13
|
+
LifecyclePublication: () => LifecyclePublication,
|
|
14
|
+
LifecyclePublicationBatch: () => LifecyclePublicationBatch,
|
|
15
|
+
LifecyclePublicationConfig: () => LifecyclePublicationConfig,
|
|
16
|
+
LifecyclePublicationError: () => LifecyclePublicationError,
|
|
17
|
+
LifecyclePublicationFact: () => LifecyclePublicationFact,
|
|
18
|
+
LifecyclePublicationHandler: () => LifecyclePublicationHandler,
|
|
19
|
+
LifecyclePublicationSource: () => LifecyclePublicationSource,
|
|
20
|
+
drainLifecyclePublications: () => drainLifecyclePublications,
|
|
21
|
+
lifecyclePublicationBatchMaxFacts: () => 8,
|
|
22
|
+
lifecyclePublicationLayer: () => lifecyclePublicationLayer
|
|
23
|
+
});
|
|
24
|
+
/** Immutable native admission evidence. It is private and grants no application authority. */
|
|
25
|
+
const LifecyclePublicationSource = SubmissionSnapshot.mapFields((fields) => ({
|
|
26
|
+
submissionId: fields.submissionId,
|
|
27
|
+
threadId: fields.threadId,
|
|
28
|
+
queueSequence: fields.queueSequence,
|
|
29
|
+
principal: fields.principal,
|
|
30
|
+
idempotencyKey: fields.idempotencyKey,
|
|
31
|
+
agentId: fields.agentId,
|
|
32
|
+
agentDigests: fields.agentDigests,
|
|
33
|
+
inputPayload: fields.inputPayload,
|
|
34
|
+
inputDigest: fields.inputDigest,
|
|
35
|
+
receiptId: fields.receiptId,
|
|
36
|
+
parentLinkage: fields.parentLinkage,
|
|
37
|
+
workerAdmission: fields.workerAdmission,
|
|
38
|
+
messageAdmission: fields.messageAdmission,
|
|
39
|
+
createdAt: fields.createdAt
|
|
40
|
+
}));
|
|
41
|
+
/** Closed producer facts; model history, Tool payloads and diagnostics are not a publication API. */
|
|
42
|
+
const LifecyclePublicationFact = Schema.Union([
|
|
43
|
+
Schema.TaggedStruct("DeliveryRetained", {
|
|
44
|
+
key: MessageDeliveryKey,
|
|
45
|
+
envelope: PreparedInput,
|
|
46
|
+
createdAtMillis: Schema.Natural
|
|
47
|
+
}),
|
|
48
|
+
Schema.TaggedStruct("DeliveryChanged", {
|
|
49
|
+
key: MessageDeliveryKey,
|
|
50
|
+
envelope: PreparedInput,
|
|
51
|
+
status: Schema.Literals([
|
|
52
|
+
"pending",
|
|
53
|
+
"accepted",
|
|
54
|
+
"processed",
|
|
55
|
+
"refused",
|
|
56
|
+
"parked"
|
|
57
|
+
]),
|
|
58
|
+
receipt: Schema.NullOr(Receipt),
|
|
59
|
+
settlement: Schema.NullOr(Settlement),
|
|
60
|
+
version: Schema.Natural
|
|
61
|
+
}),
|
|
62
|
+
Schema.TaggedStruct("WorkerInboxSealed", {
|
|
63
|
+
threadId: ThreadId,
|
|
64
|
+
activeSubmissionIds: Schema.Array(SubmissionId),
|
|
65
|
+
/** First native seal winner; null is an explicit stop rather than assignment completion. */
|
|
66
|
+
terminal: Schema.NullOr(AssignmentTerminal)
|
|
67
|
+
}),
|
|
68
|
+
Schema.TaggedStruct("SubmissionReady", { submissionId: SubmissionId }),
|
|
69
|
+
Schema.TaggedStruct("SubmissionSuspended", {
|
|
70
|
+
submissionId: SubmissionId,
|
|
71
|
+
reason: SuspensionReason
|
|
72
|
+
}),
|
|
73
|
+
Schema.TaggedStruct("SubmissionUnknown", { submissionId: SubmissionId }),
|
|
74
|
+
Schema.TaggedStruct("SubmissionResumed", { submissionId: SubmissionId }),
|
|
75
|
+
Schema.TaggedStruct("AbortIntentRecorded", { intent: AbortIntent }),
|
|
76
|
+
UserInputRecorded,
|
|
77
|
+
RunStartedRecord,
|
|
78
|
+
AgentUpdateEmitted,
|
|
79
|
+
ToolApprovalRequested,
|
|
80
|
+
ToolApprovalDecided,
|
|
81
|
+
AbortRequested,
|
|
82
|
+
WorkerInputCompleted,
|
|
83
|
+
WorkerInputRequested,
|
|
84
|
+
WorkerStopRequested,
|
|
85
|
+
SubagentRequested,
|
|
86
|
+
SubagentStarted,
|
|
87
|
+
SubagentJoined,
|
|
88
|
+
SubmissionSettledRecord
|
|
89
|
+
]);
|
|
90
|
+
/**
|
|
91
|
+
* An exact undelivered native fact. `id` is stable across retries and lost acknowledgements.
|
|
92
|
+
* Ordinals order facts only within ownerThreadId. Accepted input order is source.queueSequence;
|
|
93
|
+
* never compare ordinals from the launching Thread and its worker Thread.
|
|
94
|
+
*/
|
|
95
|
+
var LifecyclePublication = class extends Schema.Class("@effect-agent/thread/LifecyclePublication")({
|
|
96
|
+
id: Schema.NonEmptyString.check(Schema.isMaxLength(4096)),
|
|
97
|
+
ownerThreadId: ThreadId,
|
|
98
|
+
ordinal: Schema.Int.check(Schema.isGreaterThan(0)),
|
|
99
|
+
createdAt: Schema.DateTimeUtcFromString,
|
|
100
|
+
canonicalSequence: Schema.optionalKey(CanonicalSequence),
|
|
101
|
+
source: Schema.optionalKey(LifecyclePublicationSource),
|
|
102
|
+
fact: LifecyclePublicationFact
|
|
103
|
+
}) {};
|
|
104
|
+
var LifecyclePublicationError = class extends Schema.TaggedError()("LifecyclePublicationError", {
|
|
105
|
+
reason: Schema.Literals([
|
|
106
|
+
"unavailable",
|
|
107
|
+
"conflict",
|
|
108
|
+
"corrupt",
|
|
109
|
+
"capacity"
|
|
110
|
+
]),
|
|
111
|
+
cause: Schema.optionalKey(Schema.Defect())
|
|
112
|
+
}) {};
|
|
113
|
+
/** Bound both retained facts and the immutable admission evidence resolved before dispatch. */
|
|
114
|
+
const lifecyclePublicationBatchMaxFacts = 8;
|
|
115
|
+
/** One owner's bounded pending prefix, strictly ordered by its durable ordinals. */
|
|
116
|
+
const LifecyclePublicationBatch = Schema.NonEmptyArray(LifecyclePublication).check(Schema.isMaxLength(8), Schema.makeFilter((facts) => facts.every((fact, index) => {
|
|
117
|
+
const previous = facts[index - 1];
|
|
118
|
+
return fact.ownerThreadId === facts[0].ownerThreadId && (previous === void 0 || fact.ordinal > previous.ordinal);
|
|
119
|
+
}), { expected: "One owner with strictly increasing publication ordinals" }));
|
|
120
|
+
/**
|
|
121
|
+
* Publish one owner's ordered batch in one idempotent host transaction, including authorization,
|
|
122
|
+
* records, receipts and delivery intents. Larger backlogs continue in later batches.
|
|
123
|
+
* Return only after the entire batch commits. Retries
|
|
124
|
+
* may include already committed identities plus later facts; deduplicate each fact's `id`.
|
|
125
|
+
* Private input/update/result fields remain private; select declared public fields explicitly.
|
|
126
|
+
* Revocation/deletion is an acknowledged domain decision, not an infrastructure retry.
|
|
127
|
+
*/
|
|
128
|
+
var LifecyclePublicationHandler = class extends Context.Service()("@effect-agent/thread/LifecyclePublicationHandler") {};
|
|
129
|
+
/** Adapter configuration; the opt-in layer captures its explicit Crypto requirement once. */
|
|
130
|
+
const LifecyclePublicationConfig = Context.Reference("@effect-agent/thread/LifecyclePublicationConfig", { defaultValue: () => Option.none() });
|
|
131
|
+
/** Enable native SQL obligations without changing dependencies of disabled storage assemblies. */
|
|
132
|
+
const lifecyclePublicationLayer = Layer.effect(LifecyclePublicationConfig)(Effect.map(Crypto.Crypto, Option.some));
|
|
133
|
+
/** Resolve immutable evidence by its exact native identity, never by scanning execution history. */
|
|
134
|
+
const withSource = Effect.fn("LifecyclePublication.withSource")(function* (publication) {
|
|
135
|
+
if (publication.source !== void 0 || publication.fact._tag === "WorkerInputCompleted" && publication.fact.workerThreadId !== publication.ownerThreadId) return publication;
|
|
136
|
+
const fact = publication.fact;
|
|
137
|
+
let submissionId = fact._tag === "AbortIntentRecorded" ? fact.intent.submissionId : "submissionId" in fact ? fact.submissionId : void 0;
|
|
138
|
+
const runId = fact._tag === "AgentUpdateEmitted" ? fact.update.runId : "runId" in fact ? fact.runId : void 0;
|
|
139
|
+
if (submissionId === void 0 && runId !== void 0) {
|
|
140
|
+
const input = yield* getRunInput({
|
|
141
|
+
threadId: publication.ownerThreadId,
|
|
142
|
+
runId
|
|
143
|
+
});
|
|
144
|
+
if (Option.isNone(input) || input.value.record.payload._tag !== "UserInputRecorded") return yield* LifecyclePublicationError.make({ reason: "unavailable" });
|
|
145
|
+
submissionId = input.value.record.payload.submissionId;
|
|
146
|
+
}
|
|
147
|
+
if (submissionId === void 0) return publication;
|
|
148
|
+
const found = yield* (yield* SubmissionLedger).lookup(SubmissionLookupById.make({ submissionId }));
|
|
149
|
+
if (Option.isNone(found)) return yield* LifecyclePublicationError.make({ reason: "unavailable" });
|
|
150
|
+
const source = yield* Schema.decodeEffect(Schema.toType(LifecyclePublicationSource))(found.value);
|
|
151
|
+
return LifecyclePublication.make({
|
|
152
|
+
...publication,
|
|
153
|
+
source
|
|
154
|
+
});
|
|
155
|
+
}, Effect.mapError((cause) => LifecyclePublicationError.make({
|
|
156
|
+
reason: "unavailable",
|
|
157
|
+
cause
|
|
158
|
+
})));
|
|
159
|
+
/**
|
|
160
|
+
* One finite wave for the host's existing maintenance coordinator. Persist the next deadline
|
|
161
|
+
* before dispatch, so interruption and process loss retain the same facts without another timer.
|
|
162
|
+
* Finish independent owner batches before surfacing failures; interruption stops the wave.
|
|
163
|
+
* Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.
|
|
164
|
+
*/
|
|
165
|
+
const drainLifecyclePublications = Effect.fn("LifecyclePublication.drain")(function* (storage, timeoutMillis = 1e4, limit = 4, options) {
|
|
166
|
+
const handler = yield* LifecyclePublicationHandler;
|
|
167
|
+
const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit, options);
|
|
168
|
+
let failures = Cause.empty;
|
|
169
|
+
for (const batch of pending) yield* Effect.gen(function* () {
|
|
170
|
+
if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;
|
|
171
|
+
yield* Effect.scoped(Effect.gen(function* () {
|
|
172
|
+
const publications = yield* Effect.forEach(batch, withSource);
|
|
173
|
+
yield* handler.publish(publications);
|
|
174
|
+
})).pipe(Effect.timeoutOrElse({
|
|
175
|
+
duration: timeoutMillis,
|
|
176
|
+
orElse: () => LifecyclePublicationError.make({ reason: "unavailable" })
|
|
177
|
+
}));
|
|
178
|
+
yield* storage.acknowledge(batch);
|
|
179
|
+
}).pipe(Effect.catchCauseIf((cause) => !Cause.hasInterrupts(cause), (cause) => {
|
|
180
|
+
failures = Cause.combine(failures, cause);
|
|
181
|
+
return Effect.void;
|
|
182
|
+
}));
|
|
183
|
+
if (failures.reasons.length > 0) return yield* Effect.failCause(failures);
|
|
184
|
+
return pending.length;
|
|
185
|
+
});
|
|
186
|
+
//#endregion
|
|
187
|
+
export { LifecyclePublication, LifecyclePublicationBatch, LifecyclePublicationConfig, LifecyclePublicationError, LifecyclePublicationFact, LifecyclePublicationHandler, LifecyclePublicationSource, drainLifecyclePublications, lifecyclePublicationBatchMaxFacts, lifecyclePublicationLayer, LifecyclePublication_exports as t };
|
|
188
|
+
|
|
189
|
+
//# sourceMappingURL=LifecyclePublication.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LifecyclePublication.mjs","names":[],"sources":["../../src/durable/LifecyclePublication.ts"],"sourcesContent":["import { Cause, Clock, Context, Crypto, Effect, Layer, Option, Schema, type Scope } from \"effect\";\n\nimport { SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport { Receipt } from \"../core/Receipt.ts\";\nimport { AssignmentTerminal } from \"../core/Worker.ts\";\nimport { MessageDeliveryKey } from \"./MessageDelivery.ts\";\nimport {\n AbortRequested,\n AgentUpdateEmitted,\n CanonicalSequence,\n RunStartedRecord,\n SubagentJoined,\n SubagentRequested,\n SubagentStarted,\n SubmissionSettledRecord,\n ToolApprovalDecided,\n ToolApprovalRequested,\n UserInputRecorded,\n WorkerInputCompleted,\n WorkerInputRequested,\n WorkerStopRequested,\n} from \"./Records.ts\";\nimport {\n AbortIntent,\n Settlement,\n SubmissionLedger,\n SubmissionLookupById,\n SubmissionSnapshot,\n SuspensionReason,\n} from \"./SubmissionLedger.ts\";\nimport { PreparedInput } from \"./Subscription.ts\";\nimport { getRunInput } from \"./ThreadStore.ts\";\n\n/** Immutable native admission evidence. It is private and grants no application authority. */\nexport const LifecyclePublicationSource = SubmissionSnapshot.mapFields((fields) => ({\n submissionId: fields.submissionId,\n threadId: fields.threadId,\n queueSequence: fields.queueSequence,\n principal: fields.principal,\n idempotencyKey: fields.idempotencyKey,\n agentId: fields.agentId,\n agentDigests: fields.agentDigests,\n inputPayload: fields.inputPayload,\n inputDigest: fields.inputDigest,\n receiptId: fields.receiptId,\n parentLinkage: fields.parentLinkage,\n workerAdmission: fields.workerAdmission,\n messageAdmission: fields.messageAdmission,\n createdAt: fields.createdAt,\n}));\n\nexport type LifecyclePublicationSource = typeof LifecyclePublicationSource.Type;\n\n/** Closed producer facts; model history, Tool payloads and diagnostics are not a publication API. */\nexport const LifecyclePublicationFact = Schema.Union([\n Schema.TaggedStruct(\"DeliveryRetained\", {\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n createdAtMillis: Schema.Natural,\n }),\n Schema.TaggedStruct(\"DeliveryChanged\", {\n key: MessageDeliveryKey,\n envelope: PreparedInput,\n status: Schema.Literals([\"pending\", \"accepted\", \"processed\", \"refused\", \"parked\"]),\n receipt: Schema.NullOr(Receipt),\n settlement: Schema.NullOr(Settlement),\n version: Schema.Natural,\n }),\n Schema.TaggedStruct(\"WorkerInboxSealed\", {\n threadId: ThreadId,\n activeSubmissionIds: Schema.Array(SubmissionId),\n /** First native seal winner; null is an explicit stop rather than assignment completion. */\n terminal: Schema.NullOr(AssignmentTerminal),\n }),\n Schema.TaggedStruct(\"SubmissionReady\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"SubmissionSuspended\", {\n submissionId: SubmissionId,\n reason: SuspensionReason,\n }),\n Schema.TaggedStruct(\"SubmissionUnknown\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"SubmissionResumed\", { submissionId: SubmissionId }),\n Schema.TaggedStruct(\"AbortIntentRecorded\", { intent: AbortIntent }),\n UserInputRecorded,\n RunStartedRecord,\n AgentUpdateEmitted,\n ToolApprovalRequested,\n ToolApprovalDecided,\n AbortRequested,\n WorkerInputCompleted,\n WorkerInputRequested,\n WorkerStopRequested,\n SubagentRequested,\n SubagentStarted,\n SubagentJoined,\n SubmissionSettledRecord,\n]);\n\nexport type LifecyclePublicationFact = typeof LifecyclePublicationFact.Type;\n\n/**\n * An exact undelivered native fact. `id` is stable across retries and lost acknowledgements.\n * Ordinals order facts only within ownerThreadId. Accepted input order is source.queueSequence;\n * never compare ordinals from the launching Thread and its worker Thread.\n */\nexport class LifecyclePublication extends Schema.Class<LifecyclePublication>(\n \"@effect-agent/thread/LifecyclePublication\",\n)({\n id: Schema.NonEmptyString.check(Schema.isMaxLength(4096)),\n ownerThreadId: ThreadId,\n ordinal: Schema.Int.check(Schema.isGreaterThan(0)),\n createdAt: Schema.DateTimeUtcFromString,\n canonicalSequence: Schema.optionalKey(CanonicalSequence),\n source: Schema.optionalKey(LifecyclePublicationSource),\n fact: LifecyclePublicationFact,\n}) {}\n\nexport class LifecyclePublicationError extends Schema.TaggedError<LifecyclePublicationError>()(\n \"LifecyclePublicationError\",\n {\n reason: Schema.Literals([\"unavailable\", \"conflict\", \"corrupt\", \"capacity\"]),\n cause: Schema.optionalKey(Schema.Defect()),\n },\n) {}\n\n/** Bound both retained facts and the immutable admission evidence resolved before dispatch. */\nexport const lifecyclePublicationBatchMaxFacts = 8;\n\n/** One owner's bounded pending prefix, strictly ordered by its durable ordinals. */\nexport const LifecyclePublicationBatch = Schema.NonEmptyArray(LifecyclePublication).check(\n Schema.isMaxLength(lifecyclePublicationBatchMaxFacts),\n Schema.makeFilter(\n (facts) =>\n facts.every((fact, index) => {\n const previous = facts[index - 1];\n\n return (\n fact.ownerThreadId === facts[0].ownerThreadId &&\n (previous === undefined || fact.ordinal > previous.ordinal)\n );\n }),\n { expected: \"One owner with strictly increasing publication ordinals\" },\n ),\n);\n\nexport type LifecyclePublicationBatch = typeof LifecyclePublicationBatch.Type;\n\n/** Native recovery state, independent of Attempts. Hosts serialize drains per storage owner. */\nexport interface LifecyclePublicationStorage {\n /** Select up to `limit` due owners, with a bounded pending prefix for each selected owner.\n * `retainedOnly` excludes unmaterialized source facts, for a precommitted start prefix.\n */\n readonly pending: (\n nowMillis: number,\n limit: number,\n options?: { readonly retainedOnly?: boolean },\n ) => Effect.Effect<ReadonlyArray<LifecyclePublicationBatch>, LifecyclePublicationError>;\n /** Atomically acknowledge the exact batch, retaining its identities and fingerprints. */\n readonly acknowledge: (\n publications: LifecyclePublicationBatch,\n ) => Effect.Effect<void, LifecyclePublicationError>;\n /**\n * Claim a due owner batch and persist its retry before dispatch. Eight automatic attempts;\n * 1s exponential backoff capped at 60s, after the dispatch timeout. The final attempt parks\n * the payload before dispatch so process loss cannot renew its budget. False means not due.\n */\n readonly claim: (\n publications: LifecyclePublicationBatch,\n nowMillis: number,\n timeoutMillis: number,\n ) => Effect.Effect<boolean, LifecyclePublicationError>;\n readonly pendingDeadline: Effect.Effect<Option.Option<number>, LifecyclePublicationError>;\n /**\n * Deadline for `pending(..., { retainedOnly: true })`, excluding unmaterialized source facts.\n * Source-backed stores provide this when `pendingDeadline` also includes source intent.\n * Otherwise `pendingDeadline` already describes retained work.\n */\n readonly retainedPendingDeadline?: Effect.Effect<\n Option.Option<number>,\n LifecyclePublicationError\n >;\n /** Explicit operator retry after repairing a parked owner's destination. */\n readonly retryParked: (\n ownerThreadId: ThreadId,\n nowMillis: number,\n ) => Effect.Effect<void, LifecyclePublicationError>;\n}\n\n/**\n * Publish one owner's ordered batch in one idempotent host transaction, including authorization,\n * records, receipts and delivery intents. Larger backlogs continue in later batches.\n * Return only after the entire batch commits. Retries\n * may include already committed identities plus later facts; deduplicate each fact's `id`.\n * Private input/update/result fields remain private; select declared public fields explicitly.\n * Revocation/deletion is an acknowledged domain decision, not an infrastructure retry.\n */\nexport class LifecyclePublicationHandler extends Context.Service<\n LifecyclePublicationHandler,\n {\n readonly publish: (\n publications: LifecyclePublicationBatch,\n ) => Effect.Effect<void, LifecyclePublicationError, Scope.Scope>;\n }\n>()(\"@effect-agent/thread/LifecyclePublicationHandler\") {}\n\n/** Adapter configuration; the opt-in layer captures its explicit Crypto requirement once. */\nexport const LifecyclePublicationConfig = Context.Reference<Option.Option<Crypto.Crypto>>(\n \"@effect-agent/thread/LifecyclePublicationConfig\",\n { defaultValue: () => Option.none() },\n);\n\n/** Enable native SQL obligations without changing dependencies of disabled storage assemblies. */\nexport const lifecyclePublicationLayer = Layer.effect(LifecyclePublicationConfig)(\n Effect.map(Crypto.Crypto, Option.some),\n);\n\n/** Resolve immutable evidence by its exact native identity, never by scanning execution history. */\nconst withSource = Effect.fn(\"LifecyclePublication.withSource\")(\n function* (publication: LifecyclePublication) {\n if (\n publication.source !== undefined ||\n (publication.fact._tag === \"WorkerInputCompleted\" &&\n publication.fact.workerThreadId !== publication.ownerThreadId)\n )\n return publication;\n const fact = publication.fact;\n\n let submissionId =\n fact._tag === \"AbortIntentRecorded\"\n ? fact.intent.submissionId\n : \"submissionId\" in fact\n ? fact.submissionId\n : undefined;\n\n const runId =\n fact._tag === \"AgentUpdateEmitted\"\n ? fact.update.runId\n : \"runId\" in fact\n ? fact.runId\n : undefined;\n\n if (submissionId === undefined && runId !== undefined) {\n const input = yield* getRunInput({ threadId: publication.ownerThreadId, runId });\n\n if (Option.isNone(input) || input.value.record.payload._tag !== \"UserInputRecorded\")\n return yield* LifecyclePublicationError.make({ reason: \"unavailable\" });\n submissionId = input.value.record.payload.submissionId;\n }\n if (submissionId === undefined) return publication;\n const ledger = yield* SubmissionLedger;\n const found = yield* ledger.lookup(SubmissionLookupById.make({ submissionId }));\n\n if (Option.isNone(found))\n return yield* LifecyclePublicationError.make({ reason: \"unavailable\" });\n\n const source = yield* Schema.decodeEffect(Schema.toType(LifecyclePublicationSource))(\n found.value,\n );\n\n return LifecyclePublication.make({ ...publication, source });\n },\n Effect.mapError((cause) => LifecyclePublicationError.make({ reason: \"unavailable\", cause })),\n);\n\n/**\n * One finite wave for the host's existing maintenance coordinator. Persist the next deadline\n * before dispatch, so interruption and process loss retain the same facts without another timer.\n * Finish independent owner batches before surfacing failures; interruption stops the wave.\n * Acknowledgements are exact and idempotent. No producer or external Tool is re-executed here.\n */\nexport const drainLifecyclePublications = Effect.fn(\"LifecyclePublication.drain\")(function* (\n storage: LifecyclePublicationStorage,\n timeoutMillis = 10_000,\n limit = 4,\n options?: { readonly retainedOnly?: boolean },\n) {\n const handler = yield* LifecyclePublicationHandler;\n const pending = yield* storage.pending(yield* Clock.currentTimeMillis, limit, options);\n\n let failures: Cause.Cause<LifecyclePublicationError> = Cause.empty;\n\n for (const batch of pending) {\n yield* Effect.gen(function* () {\n if (!(yield* storage.claim(batch, yield* Clock.currentTimeMillis, timeoutMillis))) return;\n yield* Effect.scoped(\n Effect.gen(function* () {\n const publications = yield* Effect.forEach(batch, withSource);\n\n yield* handler.publish(publications);\n }),\n ).pipe(\n Effect.timeoutOrElse({\n duration: timeoutMillis,\n orElse: () => LifecyclePublicationError.make({ reason: \"unavailable\" }),\n }),\n );\n yield* storage.acknowledge(batch);\n }).pipe(\n Effect.catchCauseIf(\n (cause) => !Cause.hasInterrupts(cause),\n (cause) => {\n failures = Cause.combine(failures, cause);\n\n return Effect.void;\n },\n ),\n );\n }\n if (failures.reasons.length > 0) return yield* Effect.failCause(failures);\n\n return pending.length;\n});\n"],"mappings":"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"}
|