effect-agent 0.1.0-beta.85 → 0.1.0-beta.87

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.
Files changed (751) hide show
  1. package/dist/Agent-CN0EWRsR.d.mts +226 -0
  2. package/dist/Agent-RklVROrm.mjs +83 -0
  3. package/dist/Agent-RklVROrm.mjs.map +1 -0
  4. package/dist/AgentError-CggcAQ7V.d.mts +101 -0
  5. package/dist/AgentPolicy-CetmQrf3.d.mts +96 -0
  6. package/dist/AgentRuntime-BLyETCPo.mjs +4562 -0
  7. package/dist/AgentRuntime-BLyETCPo.mjs.map +1 -0
  8. package/dist/AgentRuntime-uxR_a4VM.d.mts +346 -0
  9. package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
  10. package/dist/ContextCompactor-Dxu5zhOL.d.mts +161 -0
  11. package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
  12. package/dist/DurableAgentRuntime-uggeJpv3.mjs +6368 -0
  13. package/dist/DurableAgentRuntime-uggeJpv3.mjs.map +1 -0
  14. package/dist/DurableFailpoint-Oinuuedm.d.mts +41 -0
  15. package/dist/DurableStep-Cry_iol4.d.mts +103 -0
  16. package/dist/Ephemeral.d.mts +22 -0
  17. package/dist/Ephemeral.mjs +22 -0
  18. package/dist/Ephemeral.mjs.map +1 -0
  19. package/dist/EventSource-OqS_P9ug.d.mts +51 -0
  20. package/dist/Identifiers-CN2s30fF.d.mts +40 -0
  21. package/dist/MemoryNamespace-BbRW5p71.d.mts +36 -0
  22. package/dist/MemoryReference-B8Q3UJoJ.d.mts +79 -0
  23. package/dist/Messaging-CkcIdt4I.d.mts +490 -0
  24. package/dist/MessagingHost-CRk0kXzT.d.mts +246 -0
  25. package/dist/MessagingHost-CWi_PP3g.mjs +137 -0
  26. package/dist/MessagingHost-CWi_PP3g.mjs.map +1 -0
  27. package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
  28. package/dist/Output-D6SkedVx.d.mts +25 -0
  29. package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
  30. package/dist/PageScreenshot-BpgZKAxl.d.mts +48 -0
  31. package/dist/PreparedInputAdmission-C4HbjHgl.d.mts +38 -0
  32. package/dist/Receipt-BAHyigAF.d.mts +33 -0
  33. package/dist/Records-BAGkekt8.d.mts +3570 -0
  34. package/dist/RunEvent-DIrzkjLr.d.mts +460 -0
  35. package/dist/RunEventSink-D5aVhISG.d.mts +108 -0
  36. package/dist/RunJournal-Cgg1kNvc.mjs +825 -0
  37. package/dist/RunJournal-Cgg1kNvc.mjs.map +1 -0
  38. package/dist/RunOptions-g1aigcKI.d.mts +915 -0
  39. package/dist/RunPolicyUsage-ClZxyR46.d.mts +21 -0
  40. package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
  41. package/dist/Schedule-H3SEYX9g.d.mts +842 -0
  42. package/dist/Scheduling-C9aIP8zT.mjs +691 -0
  43. package/dist/Scheduling-C9aIP8zT.mjs.map +1 -0
  44. package/dist/Subagent-Cy_hU1tv.mjs +1469 -0
  45. package/dist/Subagent-Cy_hU1tv.mjs.map +1 -0
  46. package/dist/Subagent-DyfzHNdv.d.mts +826 -0
  47. package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
  48. package/dist/SubagentHost-CJUBQlcc.d.mts +140 -0
  49. package/dist/Subscription-BEP8oQO5.d.mts +921 -0
  50. package/dist/SubscriptionInput-vAAOBrK7.d.mts +41 -0
  51. package/dist/Thread-DOBQ0QUY.d.mts +96 -0
  52. package/dist/ThreadHistory-tS1KwxHR.d.mts +60 -0
  53. package/dist/ToolBroker-DWs4tZra.d.mts +133 -0
  54. package/dist/ToolExposure-9uF_Yo0T.mjs +10 -0
  55. package/dist/ToolExposure-9uF_Yo0T.mjs.map +1 -0
  56. package/dist/ToolExposure-C93U1sPu.mjs +30 -0
  57. package/dist/ToolExposure-C93U1sPu.mjs.map +1 -0
  58. package/dist/ToolExposure-UCN12eCd.d.mts +39 -0
  59. package/dist/ToolExposure-r2eOWk4F.d.mts +46 -0
  60. package/dist/ToolExposure.d.mts +6 -5
  61. package/dist/ToolExposure.mjs +17 -9
  62. package/dist/ToolExposure.mjs.map +1 -1
  63. package/dist/ToolReconciler-DQVaJfpE.d.mts +76 -0
  64. package/dist/ToolResult-DmmgoChv.d.mts +61 -0
  65. package/dist/Usage-Dx0aknfk.d.mts +121 -0
  66. package/dist/WakeScheduler-EjUF-GhC.d.mts +56 -0
  67. package/dist/Worker-CaPYykpe.d.mts +228 -0
  68. package/dist/agent-registration-CWDMOAZA.mjs +172 -0
  69. package/dist/agent-registration-CWDMOAZA.mjs.map +1 -0
  70. package/dist/capabilities/Approval.d.mts +114 -0
  71. package/dist/capabilities/Approval.mjs +226 -0
  72. package/dist/capabilities/Approval.mjs.map +1 -0
  73. package/dist/capabilities/Budget.d.mts +112 -0
  74. package/dist/capabilities/Budget.mjs +346 -0
  75. package/dist/capabilities/Budget.mjs.map +1 -0
  76. package/dist/capabilities/CodeMode.d.mts +157 -0
  77. package/dist/capabilities/CodeMode.mjs +522 -0
  78. package/dist/capabilities/CodeMode.mjs.map +1 -0
  79. package/dist/capabilities/Commands.d.mts +55 -0
  80. package/dist/capabilities/Commands.mjs +57 -0
  81. package/dist/capabilities/Commands.mjs.map +1 -0
  82. package/dist/capabilities/ContextTools.d.mts +321 -0
  83. package/dist/capabilities/ContextTools.mjs +126 -0
  84. package/dist/capabilities/ContextTools.mjs.map +1 -0
  85. package/dist/capabilities/Mcp.d.mts +108 -0
  86. package/dist/capabilities/Mcp.mjs +260 -0
  87. package/dist/capabilities/Mcp.mjs.map +1 -0
  88. package/dist/capabilities/McpClient.d.mts +115 -0
  89. package/dist/capabilities/McpClient.mjs +506 -0
  90. package/dist/capabilities/McpClient.mjs.map +1 -0
  91. package/dist/capabilities/MemoryNotes.d.mts +424 -0
  92. package/dist/capabilities/MemoryNotes.mjs +128 -0
  93. package/dist/capabilities/MemoryNotes.mjs.map +1 -0
  94. package/dist/capabilities/Messaging.d.mts +3 -0
  95. package/dist/capabilities/Messaging.mjs +151 -0
  96. package/dist/capabilities/Messaging.mjs.map +1 -0
  97. package/dist/capabilities/ModelContext.d.mts +89 -0
  98. package/dist/capabilities/ModelContext.mjs +168 -0
  99. package/dist/capabilities/ModelContext.mjs.map +1 -0
  100. package/dist/capabilities/Redaction.d.mts +37 -0
  101. package/dist/capabilities/Redaction.mjs +104 -0
  102. package/dist/capabilities/Redaction.mjs.map +1 -0
  103. package/dist/capabilities/Remembering.d.mts +434 -0
  104. package/dist/capabilities/Remembering.mjs +290 -0
  105. package/dist/capabilities/Remembering.mjs.map +1 -0
  106. package/dist/capabilities/RunHooks.d.mts +82 -0
  107. package/dist/capabilities/RunHooks.mjs +144 -0
  108. package/dist/capabilities/RunHooks.mjs.map +1 -0
  109. package/dist/capabilities/SemanticMemory.d.mts +431 -0
  110. package/dist/capabilities/SemanticMemory.mjs +315 -0
  111. package/dist/capabilities/SemanticMemory.mjs.map +1 -0
  112. package/dist/capabilities/Subagent.d.mts +4 -0
  113. package/dist/capabilities/Subagent.mjs +5 -0
  114. package/dist/capabilities/SubagentReservations.d.mts +186 -0
  115. package/dist/capabilities/SubagentReservations.mjs +479 -0
  116. package/dist/capabilities/SubagentReservations.mjs.map +1 -0
  117. package/dist/capabilities/ToolDiscovery.d.mts +109 -0
  118. package/dist/capabilities/ToolDiscovery.mjs +211 -0
  119. package/dist/capabilities/ToolDiscovery.mjs.map +1 -0
  120. package/dist/capabilities/WebCapture.d.mts +163 -0
  121. package/dist/capabilities/WebCapture.mjs +335 -0
  122. package/dist/capabilities/WebCapture.mjs.map +1 -0
  123. package/dist/capabilities/WebSearch.d.mts +71 -0
  124. package/dist/capabilities/WebSearch.mjs +112 -0
  125. package/dist/capabilities/WebSearch.mjs.map +1 -0
  126. package/dist/compaction-C2OTceKw.mjs +505 -0
  127. package/dist/compaction-C2OTceKw.mjs.map +1 -0
  128. package/dist/core/Agent.d.mts +2 -0
  129. package/dist/core/Agent.mjs +2 -0
  130. package/dist/core/AgentError.d.mts +2 -0
  131. package/dist/core/AgentError.mjs +117 -0
  132. package/dist/core/AgentError.mjs.map +1 -0
  133. package/dist/core/AgentPolicy.d.mts +2 -0
  134. package/dist/core/AgentPolicy.mjs +94 -0
  135. package/dist/core/AgentPolicy.mjs.map +1 -0
  136. package/dist/core/AgentUpdates.d.mts +2 -0
  137. package/dist/core/AgentUpdates.mjs +63 -0
  138. package/dist/core/AgentUpdates.mjs.map +1 -0
  139. package/dist/core/IdGenerator.d.mts +26 -0
  140. package/dist/core/IdGenerator.mjs +27 -0
  141. package/dist/core/IdGenerator.mjs.map +1 -0
  142. package/dist/core/Identifiers.d.mts +2 -0
  143. package/dist/core/Identifiers.mjs +43 -0
  144. package/dist/core/Identifiers.mjs.map +1 -0
  145. package/dist/core/Memory.d.mts +57 -0
  146. package/dist/core/Memory.mjs +203 -0
  147. package/dist/core/Memory.mjs.map +1 -0
  148. package/dist/core/MemoryNamespace.d.mts +2 -0
  149. package/dist/core/MemoryNamespace.mjs +116 -0
  150. package/dist/core/MemoryNamespace.mjs.map +1 -0
  151. package/dist/core/MemoryReference.d.mts +2 -0
  152. package/dist/core/MemoryReference.mjs +109 -0
  153. package/dist/core/MemoryReference.mjs.map +1 -0
  154. package/dist/core/MemoryRevalidation.d.mts +65 -0
  155. package/dist/core/MemoryRevalidation.mjs +126 -0
  156. package/dist/core/MemoryRevalidation.mjs.map +1 -0
  157. package/dist/core/MemoryStore.d.mts +186 -0
  158. package/dist/core/MemoryStore.mjs +243 -0
  159. package/dist/core/MemoryStore.mjs.map +1 -0
  160. package/dist/core/Receipt.d.mts +2 -0
  161. package/dist/core/Receipt.mjs +36 -0
  162. package/dist/core/Receipt.mjs.map +1 -0
  163. package/dist/core/RememberingStore.d.mts +1562 -0
  164. package/dist/core/RememberingStore.mjs +190 -0
  165. package/dist/core/RememberingStore.mjs.map +1 -0
  166. package/dist/core/RunEvent.d.mts +2 -0
  167. package/dist/core/RunEvent.mjs +337 -0
  168. package/dist/core/RunEvent.mjs.map +1 -0
  169. package/dist/core/RunPolicyUsage.d.mts +2 -0
  170. package/dist/core/RunPolicyUsage.mjs +21 -0
  171. package/dist/core/RunPolicyUsage.mjs.map +1 -0
  172. package/dist/core/SemanticMemoryIndex.d.mts +826 -0
  173. package/dist/core/SemanticMemoryIndex.mjs +185 -0
  174. package/dist/core/SemanticMemoryIndex.mjs.map +1 -0
  175. package/dist/core/SemanticMemoryRevalidation.d.mts +45 -0
  176. package/dist/core/SemanticMemoryRevalidation.mjs +191 -0
  177. package/dist/core/SemanticMemoryRevalidation.mjs.map +1 -0
  178. package/dist/core/SubagentContract.d.mts +2 -0
  179. package/dist/core/SubagentContract.mjs +148 -0
  180. package/dist/core/SubagentContract.mjs.map +1 -0
  181. package/dist/core/Thread.d.mts +2 -0
  182. package/dist/core/Thread.mjs +250 -0
  183. package/dist/core/Thread.mjs.map +1 -0
  184. package/dist/core/ToolResult.d.mts +2 -0
  185. package/dist/core/ToolResult.mjs +140 -0
  186. package/dist/core/ToolResult.mjs.map +1 -0
  187. package/dist/core/Usage.d.mts +2 -0
  188. package/dist/core/Usage.mjs +319 -0
  189. package/dist/core/Usage.mjs.map +1 -0
  190. package/dist/core/Worker.d.mts +3 -0
  191. package/dist/core/Worker.mjs +147 -0
  192. package/dist/core/Worker.mjs.map +1 -0
  193. package/dist/durable/ActivityStore.d.mts +116 -0
  194. package/dist/durable/ActivityStore.mjs +131 -0
  195. package/dist/durable/ActivityStore.mjs.map +1 -0
  196. package/dist/durable/Admin.d.mts +2 -0
  197. package/dist/durable/Admin.mjs +328 -0
  198. package/dist/durable/Admin.mjs.map +1 -0
  199. package/dist/durable/AgentRegistration.d.mts +2 -0
  200. package/dist/durable/AgentRegistration.mjs +14 -0
  201. package/dist/durable/AgentRegistration.mjs.map +1 -0
  202. package/dist/durable/Certification.d.mts +111 -0
  203. package/dist/durable/Certification.mjs +159 -0
  204. package/dist/durable/Certification.mjs.map +1 -0
  205. package/dist/durable/CommittedActivity.d.mts +62 -0
  206. package/dist/durable/CommittedActivity.mjs +159 -0
  207. package/dist/durable/CommittedActivity.mjs.map +1 -0
  208. package/dist/durable/Digest.d.mts +2 -0
  209. package/dist/durable/Digest.mjs +50 -0
  210. package/dist/durable/Digest.mjs.map +1 -0
  211. package/dist/durable/DurableAgentRuntime.d.mts +3 -0
  212. package/dist/durable/DurableAgentRuntime.mjs +3 -0
  213. package/dist/durable/DurableFailpoint.d.mts +2 -0
  214. package/dist/durable/DurableFailpoint.mjs +94 -0
  215. package/dist/durable/DurableFailpoint.mjs.map +1 -0
  216. package/dist/durable/DurableFailpointTestControl.d.mts +15 -0
  217. package/dist/durable/DurableFailpointTestControl.mjs +19 -0
  218. package/dist/durable/DurableFailpointTestControl.mjs.map +1 -0
  219. package/dist/durable/EventSource.d.mts +2 -0
  220. package/dist/durable/EventSource.mjs +65 -0
  221. package/dist/durable/EventSource.mjs.map +1 -0
  222. package/dist/durable/GitHubWorkflowSource.d.mts +144 -0
  223. package/dist/durable/GitHubWorkflowSource.mjs +209 -0
  224. package/dist/durable/GitHubWorkflowSource.mjs.map +1 -0
  225. package/dist/durable/MessageDelivery.d.mts +492 -0
  226. package/dist/durable/MessageDelivery.mjs +495 -0
  227. package/dist/durable/MessageDelivery.mjs.map +1 -0
  228. package/dist/durable/MessageDeliveryStoreConformance.d.mts +358 -0
  229. package/dist/durable/MessageDeliveryStoreConformance.mjs +243 -0
  230. package/dist/durable/MessageDeliveryStoreConformance.mjs.map +1 -0
  231. package/dist/durable/OperationAuthorizer.d.mts +2 -0
  232. package/dist/durable/OperationAuthorizer.mjs +70 -0
  233. package/dist/durable/OperationAuthorizer.mjs.map +1 -0
  234. package/dist/durable/PersistentHistory.d.mts +16 -0
  235. package/dist/durable/PersistentHistory.mjs +125 -0
  236. package/dist/durable/PersistentHistory.mjs.map +1 -0
  237. package/dist/durable/PreparedInputAdmission.d.mts +2 -0
  238. package/dist/durable/PreparedInputAdmission.mjs +34 -0
  239. package/dist/durable/PreparedInputAdmission.mjs.map +1 -0
  240. package/dist/durable/Records.d.mts +2 -0
  241. package/dist/durable/Records.mjs +795 -0
  242. package/dist/durable/Records.mjs.map +1 -0
  243. package/dist/durable/Recovery.d.mts +2 -0
  244. package/dist/durable/Recovery.mjs +739 -0
  245. package/dist/durable/Recovery.mjs.map +1 -0
  246. package/dist/durable/RunJournal.d.mts +2 -0
  247. package/dist/durable/RunJournal.mjs +2 -0
  248. package/dist/durable/Schedule.d.mts +2 -0
  249. package/dist/durable/Schedule.mjs +382 -0
  250. package/dist/durable/Schedule.mjs.map +1 -0
  251. package/dist/durable/ScheduleStoreConformance.d.mts +18 -0
  252. package/dist/durable/ScheduleStoreConformance.mjs +420 -0
  253. package/dist/durable/ScheduleStoreConformance.mjs.map +1 -0
  254. package/dist/durable/ScheduleTransition.d.mts +24 -0
  255. package/dist/durable/ScheduleTransition.mjs +180 -0
  256. package/dist/durable/ScheduleTransition.mjs.map +1 -0
  257. package/dist/durable/Scheduling.d.mts +54 -0
  258. package/dist/durable/Scheduling.mjs +2 -0
  259. package/dist/durable/SqlMemoryStore.d.mts +30 -0
  260. package/dist/durable/SqlMemoryStore.mjs +435 -0
  261. package/dist/durable/SqlMemoryStore.mjs.map +1 -0
  262. package/dist/durable/SqlMessageDeliveryStore.d.mts +40 -0
  263. package/dist/durable/SqlMessageDeliveryStore.mjs +167 -0
  264. package/dist/durable/SqlMessageDeliveryStore.mjs.map +1 -0
  265. package/dist/durable/SqlStorageV2Upgrade.d.mts +22 -0
  266. package/dist/durable/SqlStorageV2Upgrade.mjs +459 -0
  267. package/dist/durable/SqlStorageV2Upgrade.mjs.map +1 -0
  268. package/dist/durable/SqlSubscriptionStore.d.mts +63 -0
  269. package/dist/durable/SqlSubscriptionStore.mjs +751 -0
  270. package/dist/durable/SqlSubscriptionStore.mjs.map +1 -0
  271. package/dist/durable/SubmissionLedger.d.mts +3 -0
  272. package/dist/durable/SubmissionLedger.mjs +914 -0
  273. package/dist/durable/SubmissionLedger.mjs.map +1 -0
  274. package/dist/durable/SubmissionLedgerConformance.d.mts +30 -0
  275. package/dist/durable/SubmissionLedgerConformance.mjs +1986 -0
  276. package/dist/durable/SubmissionLedgerConformance.mjs.map +1 -0
  277. package/dist/durable/SubmissionStatus.d.mts +2 -0
  278. package/dist/durable/SubmissionStatus.mjs +18 -0
  279. package/dist/durable/SubmissionStatus.mjs.map +1 -0
  280. package/dist/durable/Subscription.d.mts +2 -0
  281. package/dist/durable/Subscription.mjs +360 -0
  282. package/dist/durable/Subscription.mjs.map +1 -0
  283. package/dist/durable/SubscriptionInput.d.mts +2 -0
  284. package/dist/durable/SubscriptionInput.mjs +52 -0
  285. package/dist/durable/SubscriptionInput.mjs.map +1 -0
  286. package/dist/durable/SubscriptionStoreConformance.d.mts +17 -0
  287. package/dist/durable/SubscriptionStoreConformance.mjs +625 -0
  288. package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -0
  289. package/dist/durable/SubscriptionTools.d.mts +273 -0
  290. package/dist/durable/SubscriptionTools.mjs +190 -0
  291. package/dist/durable/SubscriptionTools.mjs.map +1 -0
  292. package/dist/durable/SubscriptionTransition.d.mts +21 -0
  293. package/dist/durable/SubscriptionTransition.mjs +148 -0
  294. package/dist/durable/SubscriptionTransition.mjs.map +1 -0
  295. package/dist/durable/Subscriptions.d.mts +73 -0
  296. package/dist/durable/Subscriptions.mjs +627 -0
  297. package/dist/durable/Subscriptions.mjs.map +1 -0
  298. package/dist/durable/ThreadContextHistory.d.mts +32 -0
  299. package/dist/durable/ThreadContextHistory.mjs +152 -0
  300. package/dist/durable/ThreadContextHistory.mjs.map +1 -0
  301. package/dist/durable/ThreadContextHistoryProjection.d.mts +60 -0
  302. package/dist/durable/ThreadContextHistoryProjection.mjs +149 -0
  303. package/dist/durable/ThreadContextHistoryProjection.mjs.map +1 -0
  304. package/dist/durable/ThreadInvariants.d.mts +74 -0
  305. package/dist/durable/ThreadInvariants.mjs +200 -0
  306. package/dist/durable/ThreadInvariants.mjs.map +1 -0
  307. package/dist/durable/ThreadProjection.d.mts +78 -0
  308. package/dist/durable/ThreadProjection.mjs +158 -0
  309. package/dist/durable/ThreadProjection.mjs.map +1 -0
  310. package/dist/durable/ThreadProjectionMaintenance.d.mts +49 -0
  311. package/dist/durable/ThreadProjectionMaintenance.mjs +33 -0
  312. package/dist/durable/ThreadProjectionMaintenance.mjs.map +1 -0
  313. package/dist/durable/ThreadStore.d.mts +2 -0
  314. package/dist/durable/ThreadStore.mjs +147 -0
  315. package/dist/durable/ThreadStore.mjs.map +1 -0
  316. package/dist/durable/ThreadStoreConformance.d.mts +29 -0
  317. package/dist/durable/ThreadStoreConformance.mjs +248 -0
  318. package/dist/durable/ThreadStoreConformance.mjs.map +1 -0
  319. package/dist/durable/ToolReconciler.d.mts +2 -0
  320. package/dist/durable/ToolReconciler.mjs +81 -0
  321. package/dist/durable/ToolReconciler.mjs.map +1 -0
  322. package/dist/durable/WakeScheduler.d.mts +2 -0
  323. package/dist/durable/WakeScheduler.mjs +85 -0
  324. package/dist/durable/WakeScheduler.mjs.map +1 -0
  325. package/dist/durable/WorkerHost.d.mts +129 -0
  326. package/dist/durable/WorkerHost.mjs +77 -0
  327. package/dist/durable/WorkerHost.mjs.map +1 -0
  328. package/dist/engine/AgentRuntime.d.mts +2 -0
  329. package/dist/engine/AgentRuntime.mjs +2 -0
  330. package/dist/engine/Compaction.d.mts +7 -0
  331. package/dist/engine/Compaction.mjs +16 -0
  332. package/dist/engine/Compaction.mjs.map +1 -0
  333. package/dist/engine/ContextCompactor.d.mts +2 -0
  334. package/dist/engine/ContextCompactor.mjs +119 -0
  335. package/dist/engine/ContextCompactor.mjs.map +1 -0
  336. package/dist/engine/ContextHistory.d.mts +65 -0
  337. package/dist/engine/ContextHistory.mjs +76 -0
  338. package/dist/engine/ContextHistory.mjs.map +1 -0
  339. package/dist/engine/ContextWindow.d.mts +2 -0
  340. package/dist/engine/ContextWindow.mjs +59 -0
  341. package/dist/engine/ContextWindow.mjs.map +1 -0
  342. package/dist/engine/DurableStep.d.mts +2 -0
  343. package/dist/engine/DurableStep.mjs +62 -0
  344. package/dist/engine/DurableStep.mjs.map +1 -0
  345. package/dist/engine/MessagingHost.d.mts +2 -0
  346. package/dist/engine/MessagingHost.mjs +2 -0
  347. package/dist/engine/Output.d.mts +2 -0
  348. package/dist/engine/Output.mjs +8 -0
  349. package/dist/engine/Output.mjs.map +1 -0
  350. package/dist/engine/RunEventSink.d.mts +2 -0
  351. package/dist/engine/RunEventSink.mjs +22 -0
  352. package/dist/engine/RunEventSink.mjs.map +1 -0
  353. package/dist/engine/RunOptions.d.mts +2 -0
  354. package/dist/engine/RunOptions.mjs +122 -0
  355. package/dist/engine/RunOptions.mjs.map +1 -0
  356. package/dist/engine/SubagentHost.d.mts +2 -0
  357. package/dist/engine/SubagentHost.mjs +72 -0
  358. package/dist/engine/SubagentHost.mjs.map +1 -0
  359. package/dist/engine/ThreadHistory.d.mts +2 -0
  360. package/dist/engine/ThreadHistory.mjs +67 -0
  361. package/dist/engine/ThreadHistory.mjs.map +1 -0
  362. package/dist/engine/ToolBroker.d.mts +2 -0
  363. package/dist/engine/ToolBroker.mjs +42 -0
  364. package/dist/engine/ToolBroker.mjs.map +1 -0
  365. package/dist/foreign-diagnostic-DBQ1XHKh.mjs +37 -0
  366. package/dist/foreign-diagnostic-DBQ1XHKh.mjs.map +1 -0
  367. package/dist/index.d.mts +88 -54
  368. package/dist/index.mjs +97 -54
  369. package/dist/output-contract-BC7tjlGw.mjs +84 -0
  370. package/dist/output-contract-BC7tjlGw.mjs.map +1 -0
  371. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  372. package/dist/sandbox/CodeExecutor.d.mts +194 -0
  373. package/dist/sandbox/CodeExecutor.mjs +278 -0
  374. package/dist/sandbox/CodeExecutor.mjs.map +1 -0
  375. package/dist/sandbox/InteractiveBrowser.d.mts +142 -0
  376. package/dist/sandbox/InteractiveBrowser.mjs +165 -0
  377. package/dist/sandbox/InteractiveBrowser.mjs.map +1 -0
  378. package/dist/sandbox/PageCapture.d.mts +2 -0
  379. package/dist/sandbox/PageCapture.mjs +450 -0
  380. package/dist/sandbox/PageCapture.mjs.map +1 -0
  381. package/dist/sandbox/PageCrawl.d.mts +88 -0
  382. package/dist/sandbox/PageCrawl.mjs +124 -0
  383. package/dist/sandbox/PageCrawl.mjs.map +1 -0
  384. package/dist/sandbox/PageScreenshot.d.mts +2 -0
  385. package/dist/sandbox/PageScreenshot.mjs +53 -0
  386. package/dist/sandbox/PageScreenshot.mjs.map +1 -0
  387. package/dist/sandbox/ProtectedBrowser.d.mts +252 -0
  388. package/dist/sandbox/ProtectedBrowser.mjs +270 -0
  389. package/dist/sandbox/ProtectedBrowser.mjs.map +1 -0
  390. package/dist/sandbox/Sandbox.d.mts +2 -0
  391. package/dist/sandbox/Sandbox.mjs +208 -0
  392. package/dist/sandbox/Sandbox.mjs.map +1 -0
  393. package/dist/utf8-BYfhEkcj.mjs +11 -0
  394. package/dist/utf8-BYfhEkcj.mjs.map +1 -0
  395. package/dist/utf8-DchGZRBd.mjs +23 -0
  396. package/dist/utf8-DchGZRBd.mjs.map +1 -0
  397. package/package.json +1 -1
  398. package/src/Ephemeral.ts +17 -0
  399. package/src/ToolExposure.ts +2 -2
  400. package/src/capabilities/Approval.ts +352 -0
  401. package/src/capabilities/Budget.ts +536 -0
  402. package/src/capabilities/CodeMode.ts +1090 -0
  403. package/src/capabilities/Commands.ts +86 -0
  404. package/src/capabilities/ContextTools.ts +184 -0
  405. package/src/capabilities/Mcp.ts +427 -0
  406. package/src/capabilities/McpClient.ts +967 -0
  407. package/src/capabilities/MemoryNotes.ts +174 -0
  408. package/src/capabilities/Messaging.ts +261 -0
  409. package/src/capabilities/ModelContext.ts +354 -0
  410. package/src/capabilities/Redaction.ts +157 -0
  411. package/src/capabilities/Remembering.ts +550 -0
  412. package/src/capabilities/RunHooks.ts +280 -0
  413. package/src/capabilities/SemanticMemory.ts +447 -0
  414. package/src/capabilities/Subagent.ts +2277 -0
  415. package/src/capabilities/SubagentReservations.ts +850 -0
  416. package/src/capabilities/ToolDiscovery.ts +339 -0
  417. package/src/capabilities/WebCapture.ts +722 -0
  418. package/src/capabilities/WebSearch.ts +184 -0
  419. package/src/capabilities/internal/subagent-background.ts +1106 -0
  420. package/src/capabilities/internal/subagent-contract.ts +142 -0
  421. package/src/capabilities/internal/subagent-policy.ts +235 -0
  422. package/src/capabilities/internal/subagent-reporting.ts +261 -0
  423. package/src/capabilities/internal/utf8.ts +10 -0
  424. package/src/core/Agent.ts +575 -0
  425. package/src/core/AgentError.ts +152 -0
  426. package/src/core/AgentPolicy.ts +153 -0
  427. package/src/core/AgentUpdates.ts +100 -0
  428. package/src/core/IdGenerator.ts +39 -0
  429. package/src/core/Identifiers.ts +48 -0
  430. package/src/core/Memory.ts +290 -0
  431. package/src/core/MemoryNamespace.ts +196 -0
  432. package/src/core/MemoryReference.ts +121 -0
  433. package/src/core/MemoryRevalidation.ts +185 -0
  434. package/src/core/MemoryStore.ts +368 -0
  435. package/src/core/Messaging.ts +90 -0
  436. package/src/core/Receipt.ts +42 -0
  437. package/src/core/RememberingStore.ts +300 -0
  438. package/src/core/RunEvent.ts +366 -0
  439. package/src/core/RunPolicyUsage.ts +17 -0
  440. package/src/core/SemanticMemoryIndex.ts +250 -0
  441. package/src/core/SemanticMemoryRevalidation.ts +254 -0
  442. package/src/core/SubagentContract.ts +196 -0
  443. package/src/core/Thread.ts +371 -0
  444. package/src/core/ToolExposure.ts +74 -0
  445. package/src/core/ToolResult.ts +170 -0
  446. package/src/core/Usage.ts +529 -0
  447. package/src/core/Worker.ts +173 -0
  448. package/src/core/internal/agent-updates.ts +32 -0
  449. package/src/core/internal/utf8.ts +23 -0
  450. package/src/durable/ActivityStore.ts +160 -0
  451. package/src/durable/Admin.ts +496 -0
  452. package/src/durable/AgentRegistration.ts +13 -0
  453. package/src/durable/Certification.ts +210 -0
  454. package/src/durable/CommittedActivity.ts +296 -0
  455. package/src/durable/Digest.ts +93 -0
  456. package/src/durable/DurableAgentRuntime.ts +10340 -0
  457. package/src/durable/DurableFailpoint.ts +103 -0
  458. package/src/durable/DurableFailpointTestControl.ts +39 -0
  459. package/src/durable/EventSource.ts +172 -0
  460. package/src/durable/GitHubWorkflowSource.ts +453 -0
  461. package/src/durable/MessageDelivery.ts +708 -0
  462. package/src/durable/MessageDeliveryStoreConformance.ts +363 -0
  463. package/src/durable/OperationAuthorizer.ts +85 -0
  464. package/src/durable/PersistentHistory.ts +260 -0
  465. package/src/durable/PreparedInputAdmission.ts +44 -0
  466. package/src/durable/Records.ts +1010 -0
  467. package/src/durable/Recovery.ts +1018 -0
  468. package/src/durable/RunJournal.ts +1479 -0
  469. package/src/durable/Schedule.ts +504 -0
  470. package/src/durable/ScheduleStoreConformance.ts +638 -0
  471. package/src/durable/ScheduleTransition.ts +265 -0
  472. package/src/durable/Scheduling.ts +1077 -0
  473. package/src/durable/SqlMemoryStore.ts +774 -0
  474. package/src/durable/SqlMessageDeliveryStore.ts +302 -0
  475. package/src/durable/SqlStorageV2Upgrade.ts +500 -0
  476. package/src/durable/SqlSubscriptionStore.ts +1440 -0
  477. package/src/durable/SubmissionLedger.ts +1201 -0
  478. package/src/durable/SubmissionLedgerConformance.ts +4579 -0
  479. package/src/durable/SubmissionStatus.ts +14 -0
  480. package/src/durable/Subscription.ts +544 -0
  481. package/src/durable/SubscriptionInput.ts +144 -0
  482. package/src/durable/SubscriptionStoreConformance.ts +945 -0
  483. package/src/durable/SubscriptionTools.ts +327 -0
  484. package/src/durable/SubscriptionTransition.ts +302 -0
  485. package/src/durable/Subscriptions.ts +1210 -0
  486. package/src/durable/ThreadContextHistory.ts +227 -0
  487. package/src/durable/ThreadContextHistoryProjection.ts +216 -0
  488. package/src/durable/ThreadInvariants.ts +442 -0
  489. package/src/durable/ThreadProjection.ts +269 -0
  490. package/src/durable/ThreadProjectionMaintenance.ts +67 -0
  491. package/src/durable/ThreadStore.ts +242 -0
  492. package/src/durable/ThreadStoreConformance.ts +710 -0
  493. package/src/durable/ToolReconciler.ts +105 -0
  494. package/src/durable/WakeScheduler.ts +134 -0
  495. package/src/durable/WorkerHost.ts +171 -0
  496. package/src/durable/internal/agent-registration.ts +525 -0
  497. package/src/durable/internal/agent-updates.ts +302 -0
  498. package/src/durable/internal/foreign-diagnostic.ts +47 -0
  499. package/src/durable/internal/journal-checkpoint.ts +104 -0
  500. package/src/durable/internal/journal-metadata.ts +107 -0
  501. package/src/durable/internal/messaging-host.ts +608 -0
  502. package/src/durable/internal/schedule-time.ts +303 -0
  503. package/src/durable/internal/storage-v2-layout.ts +163 -0
  504. package/src/durable/internal/storage-v2.ts +73 -0
  505. package/src/durable/internal/worker-host.ts +2467 -0
  506. package/src/durable/internal/worker-runtime.ts +9 -0
  507. package/src/engine/AgentRuntime.ts +37 -0
  508. package/src/engine/Compaction.ts +11 -0
  509. package/src/engine/ContextCompactor.ts +277 -0
  510. package/src/engine/ContextHistory.ts +73 -0
  511. package/src/engine/ContextWindow.ts +72 -0
  512. package/src/engine/DurableStep.ts +132 -0
  513. package/src/engine/MessagingHost.ts +110 -0
  514. package/src/engine/Output.ts +2 -0
  515. package/src/engine/RunEventSink.ts +132 -0
  516. package/src/engine/RunOptions.ts +1077 -0
  517. package/src/engine/SubagentHost.ts +181 -0
  518. package/src/engine/ThreadHistory.ts +120 -0
  519. package/src/engine/ToolBroker.ts +157 -0
  520. package/src/engine/ToolExposure.ts +48 -0
  521. package/src/engine/internal/agent-runtime.ts +10117 -0
  522. package/src/engine/internal/bounded-value.ts +315 -0
  523. package/src/engine/internal/compaction.ts +678 -0
  524. package/src/engine/internal/error-diagnostic.ts +39 -0
  525. package/src/engine/internal/output-contract.ts +173 -0
  526. package/src/engine/internal/primitive-delta.ts +80 -0
  527. package/src/engine/internal/provider-result-staging.ts +211 -0
  528. package/src/engine/internal/tool-derivative.ts +106 -0
  529. package/src/engine/internal/tool-exposure.ts +224 -0
  530. package/src/engine/internal/tool-telemetry.ts +484 -0
  531. package/src/index.ts +96 -53
  532. package/src/sandbox/CodeExecutor.ts +352 -0
  533. package/src/sandbox/InteractiveBrowser.ts +257 -0
  534. package/src/sandbox/PageCapture.ts +692 -0
  535. package/src/sandbox/PageCrawl.ts +148 -0
  536. package/src/sandbox/PageScreenshot.ts +81 -0
  537. package/src/sandbox/ProtectedBrowser.ts +413 -0
  538. package/src/sandbox/Sandbox.ts +241 -0
  539. package/dist/Agent.d.mts +0 -5
  540. package/dist/Agent.mjs +0 -10
  541. package/dist/Agent.mjs.map +0 -1
  542. package/dist/AgentError.d.mts +0 -5
  543. package/dist/AgentError.mjs +0 -10
  544. package/dist/AgentError.mjs.map +0 -1
  545. package/dist/AgentPolicy.d.mts +0 -5
  546. package/dist/AgentPolicy.mjs +0 -10
  547. package/dist/AgentPolicy.mjs.map +0 -1
  548. package/dist/AgentRuntime.d.mts +0 -5
  549. package/dist/AgentRuntime.mjs +0 -10
  550. package/dist/AgentRuntime.mjs.map +0 -1
  551. package/dist/AgentUpdates.d.mts +0 -5
  552. package/dist/AgentUpdates.mjs +0 -10
  553. package/dist/AgentUpdates.mjs.map +0 -1
  554. package/dist/Approval.d.mts +0 -5
  555. package/dist/Approval.mjs +0 -10
  556. package/dist/Approval.mjs.map +0 -1
  557. package/dist/Budget.d.mts +0 -5
  558. package/dist/Budget.mjs +0 -10
  559. package/dist/Budget.mjs.map +0 -1
  560. package/dist/CodeMode.d.mts +0 -5
  561. package/dist/CodeMode.mjs +0 -10
  562. package/dist/CodeMode.mjs.map +0 -1
  563. package/dist/Commands.d.mts +0 -5
  564. package/dist/Commands.mjs +0 -10
  565. package/dist/Commands.mjs.map +0 -1
  566. package/dist/Compaction.d.mts +0 -5
  567. package/dist/Compaction.mjs +0 -10
  568. package/dist/Compaction.mjs.map +0 -1
  569. package/dist/ContextCompactor.d.mts +0 -5
  570. package/dist/ContextCompactor.mjs +0 -10
  571. package/dist/ContextCompactor.mjs.map +0 -1
  572. package/dist/ContextHistory.d.mts +0 -5
  573. package/dist/ContextHistory.mjs +0 -10
  574. package/dist/ContextHistory.mjs.map +0 -1
  575. package/dist/ContextTools.d.mts +0 -5
  576. package/dist/ContextTools.mjs +0 -10
  577. package/dist/ContextTools.mjs.map +0 -1
  578. package/dist/ContextWindow.d.mts +0 -5
  579. package/dist/ContextWindow.mjs +0 -10
  580. package/dist/ContextWindow.mjs.map +0 -1
  581. package/dist/DurableStep.d.mts +0 -5
  582. package/dist/DurableStep.mjs +0 -10
  583. package/dist/DurableStep.mjs.map +0 -1
  584. package/dist/EphemeralThreads.d.mts +0 -5
  585. package/dist/EphemeralThreads.mjs +0 -10
  586. package/dist/EphemeralThreads.mjs.map +0 -1
  587. package/dist/IdGenerator.d.mts +0 -5
  588. package/dist/IdGenerator.mjs +0 -10
  589. package/dist/IdGenerator.mjs.map +0 -1
  590. package/dist/Identifiers.d.mts +0 -5
  591. package/dist/Identifiers.mjs +0 -10
  592. package/dist/Identifiers.mjs.map +0 -1
  593. package/dist/Mcp.d.mts +0 -5
  594. package/dist/Mcp.mjs +0 -10
  595. package/dist/Mcp.mjs.map +0 -1
  596. package/dist/McpClient.d.mts +0 -5
  597. package/dist/McpClient.mjs +0 -10
  598. package/dist/McpClient.mjs.map +0 -1
  599. package/dist/Memory.d.mts +0 -5
  600. package/dist/Memory.mjs +0 -10
  601. package/dist/Memory.mjs.map +0 -1
  602. package/dist/MemoryNamespace.d.mts +0 -5
  603. package/dist/MemoryNamespace.mjs +0 -10
  604. package/dist/MemoryNamespace.mjs.map +0 -1
  605. package/dist/MemoryNotes.d.mts +0 -5
  606. package/dist/MemoryNotes.mjs +0 -10
  607. package/dist/MemoryNotes.mjs.map +0 -1
  608. package/dist/MemoryReference.d.mts +0 -5
  609. package/dist/MemoryReference.mjs +0 -10
  610. package/dist/MemoryReference.mjs.map +0 -1
  611. package/dist/MemoryRevalidation.d.mts +0 -5
  612. package/dist/MemoryRevalidation.mjs +0 -10
  613. package/dist/MemoryRevalidation.mjs.map +0 -1
  614. package/dist/MemoryStore.d.mts +0 -5
  615. package/dist/MemoryStore.mjs +0 -10
  616. package/dist/MemoryStore.mjs.map +0 -1
  617. package/dist/Messaging.d.mts +0 -5
  618. package/dist/Messaging.mjs +0 -10
  619. package/dist/Messaging.mjs.map +0 -1
  620. package/dist/MessagingHost.d.mts +0 -5
  621. package/dist/MessagingHost.mjs +0 -10
  622. package/dist/MessagingHost.mjs.map +0 -1
  623. package/dist/ModelContext.d.mts +0 -5
  624. package/dist/ModelContext.mjs +0 -10
  625. package/dist/ModelContext.mjs.map +0 -1
  626. package/dist/Receipt.d.mts +0 -5
  627. package/dist/Receipt.mjs +0 -10
  628. package/dist/Receipt.mjs.map +0 -1
  629. package/dist/Redaction.d.mts +0 -5
  630. package/dist/Redaction.mjs +0 -10
  631. package/dist/Redaction.mjs.map +0 -1
  632. package/dist/Remembering.d.mts +0 -5
  633. package/dist/Remembering.mjs +0 -10
  634. package/dist/Remembering.mjs.map +0 -1
  635. package/dist/RememberingStore.d.mts +0 -5
  636. package/dist/RememberingStore.mjs +0 -10
  637. package/dist/RememberingStore.mjs.map +0 -1
  638. package/dist/RunEvent.d.mts +0 -5
  639. package/dist/RunEvent.mjs +0 -10
  640. package/dist/RunEvent.mjs.map +0 -1
  641. package/dist/RunEventSink.d.mts +0 -5
  642. package/dist/RunEventSink.mjs +0 -10
  643. package/dist/RunEventSink.mjs.map +0 -1
  644. package/dist/RunHooks.d.mts +0 -5
  645. package/dist/RunHooks.mjs +0 -10
  646. package/dist/RunHooks.mjs.map +0 -1
  647. package/dist/RunOptions.d.mts +0 -5
  648. package/dist/RunOptions.mjs +0 -10
  649. package/dist/RunOptions.mjs.map +0 -1
  650. package/dist/RunPolicyUsage.d.mts +0 -5
  651. package/dist/RunPolicyUsage.mjs +0 -10
  652. package/dist/RunPolicyUsage.mjs.map +0 -1
  653. package/dist/SemanticMemory.d.mts +0 -5
  654. package/dist/SemanticMemory.mjs +0 -10
  655. package/dist/SemanticMemory.mjs.map +0 -1
  656. package/dist/SemanticMemoryIndex.d.mts +0 -5
  657. package/dist/SemanticMemoryIndex.mjs +0 -10
  658. package/dist/SemanticMemoryIndex.mjs.map +0 -1
  659. package/dist/SemanticMemoryRevalidation.d.mts +0 -5
  660. package/dist/SemanticMemoryRevalidation.mjs +0 -10
  661. package/dist/SemanticMemoryRevalidation.mjs.map +0 -1
  662. package/dist/Subagent.d.mts +0 -5
  663. package/dist/Subagent.mjs +0 -10
  664. package/dist/Subagent.mjs.map +0 -1
  665. package/dist/SubagentContract.d.mts +0 -5
  666. package/dist/SubagentContract.mjs +0 -10
  667. package/dist/SubagentContract.mjs.map +0 -1
  668. package/dist/SubagentHost.d.mts +0 -5
  669. package/dist/SubagentHost.mjs +0 -10
  670. package/dist/SubagentHost.mjs.map +0 -1
  671. package/dist/SubagentReservations.d.mts +0 -5
  672. package/dist/SubagentReservations.mjs +0 -10
  673. package/dist/SubagentReservations.mjs.map +0 -1
  674. package/dist/ThreadHistory.d.mts +0 -5
  675. package/dist/ThreadHistory.mjs +0 -10
  676. package/dist/ThreadHistory.mjs.map +0 -1
  677. package/dist/ToolBroker.d.mts +0 -5
  678. package/dist/ToolBroker.mjs +0 -10
  679. package/dist/ToolBroker.mjs.map +0 -1
  680. package/dist/ToolDiscovery.d.mts +0 -5
  681. package/dist/ToolDiscovery.mjs +0 -10
  682. package/dist/ToolDiscovery.mjs.map +0 -1
  683. package/dist/ToolResult.d.mts +0 -5
  684. package/dist/ToolResult.mjs +0 -10
  685. package/dist/ToolResult.mjs.map +0 -1
  686. package/dist/Usage.d.mts +0 -5
  687. package/dist/Usage.mjs +0 -10
  688. package/dist/Usage.mjs.map +0 -1
  689. package/dist/WebCapture.d.mts +0 -5
  690. package/dist/WebCapture.mjs +0 -10
  691. package/dist/WebCapture.mjs.map +0 -1
  692. package/dist/WebSearch.d.mts +0 -5
  693. package/dist/WebSearch.mjs +0 -10
  694. package/dist/WebSearch.mjs.map +0 -1
  695. package/dist/Worker.d.mts +0 -5
  696. package/dist/Worker.mjs +0 -10
  697. package/dist/Worker.mjs.map +0 -1
  698. package/dist/rolldown-runtime-BBjsoOtd.mjs +0 -27
  699. package/src/Agent.ts +0 -1
  700. package/src/AgentError.ts +0 -1
  701. package/src/AgentPolicy.ts +0 -1
  702. package/src/AgentRuntime.ts +0 -1
  703. package/src/AgentUpdates.ts +0 -1
  704. package/src/Approval.ts +0 -1
  705. package/src/Budget.ts +0 -1
  706. package/src/CodeMode.ts +0 -1
  707. package/src/Commands.ts +0 -1
  708. package/src/Compaction.ts +0 -1
  709. package/src/ContextCompactor.ts +0 -1
  710. package/src/ContextHistory.ts +0 -1
  711. package/src/ContextTools.ts +0 -1
  712. package/src/ContextWindow.ts +0 -1
  713. package/src/DurableStep.ts +0 -1
  714. package/src/EphemeralThreads.ts +0 -1
  715. package/src/IdGenerator.ts +0 -1
  716. package/src/Identifiers.ts +0 -1
  717. package/src/Mcp.ts +0 -1
  718. package/src/McpClient.ts +0 -1
  719. package/src/Memory.ts +0 -1
  720. package/src/MemoryNamespace.ts +0 -1
  721. package/src/MemoryNotes.ts +0 -1
  722. package/src/MemoryReference.ts +0 -1
  723. package/src/MemoryRevalidation.ts +0 -1
  724. package/src/MemoryStore.ts +0 -1
  725. package/src/Messaging.ts +0 -1
  726. package/src/MessagingHost.ts +0 -1
  727. package/src/ModelContext.ts +0 -1
  728. package/src/Receipt.ts +0 -1
  729. package/src/Redaction.ts +0 -1
  730. package/src/Remembering.ts +0 -1
  731. package/src/RememberingStore.ts +0 -1
  732. package/src/RunEvent.ts +0 -1
  733. package/src/RunEventSink.ts +0 -1
  734. package/src/RunHooks.ts +0 -1
  735. package/src/RunOptions.ts +0 -1
  736. package/src/RunPolicyUsage.ts +0 -1
  737. package/src/SemanticMemory.ts +0 -1
  738. package/src/SemanticMemoryIndex.ts +0 -1
  739. package/src/SemanticMemoryRevalidation.ts +0 -1
  740. package/src/Subagent.ts +0 -1
  741. package/src/SubagentContract.ts +0 -1
  742. package/src/SubagentHost.ts +0 -1
  743. package/src/SubagentReservations.ts +0 -1
  744. package/src/ThreadHistory.ts +0 -1
  745. package/src/ToolBroker.ts +0 -1
  746. package/src/ToolDiscovery.ts +0 -1
  747. package/src/ToolResult.ts +0 -1
  748. package/src/Usage.ts +0 -1
  749. package/src/WebCapture.ts +0 -1
  750. package/src/WebSearch.ts +0 -1
  751. package/src/Worker.ts +0 -1
@@ -0,0 +1,1210 @@
1
+ import { Cause, Context, Crypto, DateTime, Effect, Layer, Option, Schema, Semaphore } from "effect";
2
+
3
+ import { ThreadId } from "../core/Identifiers.ts";
4
+ import { utf8ByteLength } from "../core/internal/utf8.ts";
5
+ import { digestJson } from "./Digest.ts";
6
+ import { EventSources, type NormalizedEvent } from "./EventSource.ts";
7
+ import { admitPreparedInput, PreparedInputAdmission } from "./PreparedInputAdmission.ts";
8
+ import { DefinitionDigests, type PersistedJson } from "./Records.ts";
9
+ import { type ScheduleRetryReason } from "./Schedule.ts";
10
+ import { type AdmissionFence, IdempotencyKey, type Principal } from "./SubmissionLedger.ts";
11
+ import {
12
+ AcceptedEvent,
13
+ type EventAcknowledgement,
14
+ type EventSourceVersion,
15
+ PreparedInput,
16
+ SubscriptionAuthorizer,
17
+ SubscriptionConfiguration,
18
+ SubscriptionDelivery,
19
+ type SubscriptionDeliveryKey,
20
+ type SubscriptionDeliverySnapshot,
21
+ SubscriptionError,
22
+ SubscriptionFailpoint,
23
+ SubscriptionKey,
24
+ SubscriptionLimits,
25
+ type SubscriptionRecord,
26
+ type SubscriptionChange,
27
+ SubscriptionScope,
28
+ type SubscriptionSnapshot,
29
+ SubscriptionSourceError,
30
+ SubscriptionStore,
31
+ type SubscriptionStoreFailure,
32
+ defaultSubscriptionLimits,
33
+ subscriptionDeliveryKeyString,
34
+ } from "./Subscription.ts";
35
+ import { resolveSubscriptionInput, SubscriptionInputBindings } from "./SubscriptionInput.ts";
36
+
37
+ const now = DateTime.now.pipe(Effect.map(DateTime.toEpochMillis));
38
+
39
+ const failure = (reason: SubscriptionError["reason"], code: string) =>
40
+ SubscriptionError.make({ reason, code });
41
+
42
+ const bytes = (value: PersistedJson) => utf8ByteLength(JSON.stringify(value));
43
+
44
+ const sameSource = (a: EventSourceVersion, b: EventSourceVersion) =>
45
+ a.name === b.name && a.version === b.version;
46
+
47
+ const samePartition = Schema.toEquivalence(SubscriptionScope.fields.partition);
48
+
49
+ const validate = <S extends Schema.Top>(schema: S, value: unknown) =>
50
+ Schema.decodeUnknownEffect(schema)(value).pipe(
51
+ Effect.mapError(() => failure("validation", "schema")),
52
+ );
53
+
54
+ const snapshot = (record: SubscriptionRecord, time: number): SubscriptionSnapshot => ({
55
+ key: record.key,
56
+ configurationRevision: record.configurationRevision,
57
+ configurationFingerprint: record.configurationFingerprint,
58
+ ...(record.configuration.admissionGroup === undefined
59
+ ? {}
60
+ : { admissionGroup: record.configuration.admissionGroup }),
61
+ ...(record.configuration.admissionFence === undefined
62
+ ? {}
63
+ : { admissionFence: record.configuration.admissionFence }),
64
+ source: record.configuration.source,
65
+ mode: record.configuration.mode,
66
+ state:
67
+ record.state === "active" &&
68
+ record.configuration.expiresAtMillis !== null &&
69
+ record.configuration.expiresAtMillis <= time
70
+ ? "expired"
71
+ : record.state,
72
+ createdAtMillis: record.createdAtMillis,
73
+ expiresAtMillis: record.configuration.expiresAtMillis,
74
+ recovery: record.recovery,
75
+ });
76
+
77
+ const deliverySnapshot = (
78
+ record: SubscriptionDelivery,
79
+ ): typeof SubscriptionDeliverySnapshot.Type => ({
80
+ key: record.key,
81
+ state: record.state,
82
+ configurationRevision: record.configurationRevision,
83
+ ...(record.observeSettlement === undefined
84
+ ? {}
85
+ : { observeSettlement: record.observeSettlement }),
86
+ ...(record.settledAtMillis === undefined ? {} : { settledAtMillis: record.settledAtMillis }),
87
+ retry: record.retry,
88
+ receipt: record.receipt,
89
+ refusal: record.refusal,
90
+ });
91
+
92
+ export interface SubscribeOptions {
93
+ readonly subscriptionId: string;
94
+ readonly source: EventSourceVersion;
95
+ readonly parameters: PersistedJson;
96
+ readonly context: PersistedJson;
97
+ readonly mode: "once" | "continuous";
98
+ readonly expiresAtMillis: number | null;
99
+ readonly destination: SubscriptionConfiguration["destination"];
100
+ readonly deliveryPrincipal: Principal;
101
+ readonly admissionGroup?: string;
102
+ readonly admissionFence?: AdmissionFence;
103
+ readonly agentId: SubscriptionConfiguration["agentId"];
104
+ readonly definitions: SubscriptionConfiguration["definitions"];
105
+ }
106
+
107
+ export type SubscriptionFailure = SubscriptionStoreFailure | SubscriptionSourceError;
108
+
109
+ /** Only management and redacted status. Do not provide intake or drivers to Agent Tools. */
110
+ export class Subscriptions extends Context.Service<
111
+ Subscriptions,
112
+ {
113
+ readonly recoverSubscription: (
114
+ scope: SubscriptionScope,
115
+ key: SubscriptionKey,
116
+ expectedRevision: number,
117
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionStoreFailure>;
118
+ readonly getSubscription: (
119
+ scope: SubscriptionScope,
120
+ key: SubscriptionKey,
121
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionError>;
122
+ readonly subscribe: (
123
+ scope: SubscriptionScope,
124
+ options: SubscribeOptions,
125
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionFailure>;
126
+ readonly updateSubscription: (
127
+ scope: SubscriptionScope,
128
+ key: SubscriptionKey,
129
+ expectedRevision: number,
130
+ options: Omit<SubscribeOptions, "subscriptionId">,
131
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionFailure>;
132
+ readonly pauseSubscription: (
133
+ scope: SubscriptionScope,
134
+ key: SubscriptionKey,
135
+ expectedRevision: number,
136
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionStoreFailure>;
137
+ readonly resumeSubscription: (
138
+ scope: SubscriptionScope,
139
+ key: SubscriptionKey,
140
+ expectedRevision: number,
141
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionStoreFailure>;
142
+ readonly listSubscriptions: (
143
+ scope: SubscriptionScope,
144
+ after?: number,
145
+ limit?: number,
146
+ ) => Effect.Effect<
147
+ { readonly items: ReadonlyArray<SubscriptionSnapshot>; readonly next: number | null },
148
+ SubscriptionError
149
+ >;
150
+ readonly recoverDelivery: (
151
+ scope: SubscriptionScope,
152
+ key: SubscriptionDeliveryKey,
153
+ expectedGeneration: number,
154
+ ) => Effect.Effect<typeof SubscriptionDeliverySnapshot.Type, SubscriptionStoreFailure>;
155
+ readonly cancelSubscription: (
156
+ scope: SubscriptionScope,
157
+ key: SubscriptionKey,
158
+ expectedRevision?: number,
159
+ ) => Effect.Effect<SubscriptionSnapshot, SubscriptionStoreFailure>;
160
+ readonly listDeliveries: (
161
+ scope: SubscriptionScope,
162
+ key: SubscriptionKey,
163
+ after?: string,
164
+ limit?: number,
165
+ ) => Effect.Effect<
166
+ {
167
+ readonly items: ReadonlyArray<typeof SubscriptionDeliverySnapshot.Type>;
168
+ readonly next: string | null;
169
+ },
170
+ SubscriptionError
171
+ >;
172
+ }
173
+ >()("@effect-agent/thread/Subscriptions") {
174
+ static layer(limits: SubscriptionLimits = defaultSubscriptionLimits) {
175
+ return Layer.effect(Subscriptions, makeManagement(limits));
176
+ }
177
+ }
178
+
179
+ /** Trusted intake acknowledges retained routing work, never a Thread Submission Receipt. */
180
+ export class SubscriptionIntake extends Context.Service<
181
+ SubscriptionIntake,
182
+ {
183
+ readonly accept: (
184
+ principal: Principal,
185
+ source: EventSourceVersion,
186
+ payload: unknown,
187
+ ) => Effect.Effect<EventAcknowledgement, SubscriptionFailure>;
188
+ readonly status: (
189
+ principal: Principal,
190
+ source: EventSourceVersion,
191
+ eventId: string,
192
+ ) => Effect.Effect<
193
+ EventAcknowledgement & {
194
+ readonly routingComplete: boolean;
195
+ readonly routingFailure: string | null;
196
+ readonly nextAttemptAtMillis: number;
197
+ },
198
+ SubscriptionError
199
+ >;
200
+ }
201
+ >()("@effect-agent/thread/SubscriptionIntake") {
202
+ static layer(limits: SubscriptionLimits = defaultSubscriptionLimits) {
203
+ return Layer.effect(SubscriptionIntake, makeIntake(limits));
204
+ }
205
+ }
206
+
207
+ /** One bounded sweep. The platform owns polling/alarm recovery; no subscription retains a Run. */
208
+ export class SubscriptionDriver extends Context.Service<
209
+ SubscriptionDriver,
210
+ {
211
+ readonly runDue: Effect.Effect<
212
+ { readonly processed: number; readonly failed: number },
213
+ SubscriptionStoreFailure
214
+ >;
215
+ readonly processDelivery: (
216
+ key: SubscriptionDeliveryKey,
217
+ ) => Effect.Effect<void, SubscriptionFailure>;
218
+ }
219
+ >()("@effect-agent/thread/SubscriptionDriver") {
220
+ static layer(limits: SubscriptionLimits = defaultSubscriptionLimits) {
221
+ return Layer.effect(SubscriptionDriver, makeDriver(limits));
222
+ }
223
+ }
224
+
225
+ const dependencies = Effect.gen(function* () {
226
+ const store = yield* SubscriptionStore;
227
+ const authorizer = yield* SubscriptionAuthorizer;
228
+ const sources = (yield* EventSources).sources;
229
+ const crypto = yield* Crypto.Crypto;
230
+
231
+ const digest = (value: PersistedJson) =>
232
+ digestJson(value).pipe(
233
+ Effect.provideService(Crypto.Crypto, crypto),
234
+ Effect.mapError(() => failure("storage", "digest")),
235
+ );
236
+
237
+ const source = (version: EventSourceVersion) => {
238
+ const found = sources.filter((s) => sameSource(s.source, version));
239
+ const item = found[0];
240
+
241
+ return found.length === 1 && item !== undefined
242
+ ? Effect.succeed(item)
243
+ : Effect.fail(failure("unsupported-source", "source-version"));
244
+ };
245
+
246
+ const scope = Effect.fn("Subscriptions.scope")(function* (value: SubscriptionScope) {
247
+ const decoded = yield* validate(SubscriptionScope, value);
248
+
249
+ if (!samePartition(decoded.partition, store.partition))
250
+ return yield* failure("unauthorized", "partition");
251
+
252
+ return decoded;
253
+ });
254
+
255
+ const acceptNormalized = Effect.fn("Subscriptions.acceptNormalized")(function* (
256
+ version: EventSourceVersion,
257
+ event: NormalizedEvent,
258
+ limits: SubscriptionLimits,
259
+ ) {
260
+ const time = yield* now;
261
+
262
+ const record = yield* validate(AcceptedEvent, {
263
+ schemaVersion: 1,
264
+ partition: store.partition,
265
+ eventId: event.eventId,
266
+ source: version,
267
+ matchingKey: event.matchingKey,
268
+ payload: event.payload,
269
+ payloadDigest: yield* digest(event.payload),
270
+ acceptedAtMillis: time,
271
+ ...(event.occurredAtMillis === undefined ? {} : { occurredAtMillis: event.occurredAtMillis }),
272
+ cutoff: 0,
273
+ cursor: 0,
274
+ routingComplete: false,
275
+ routingFailure: null,
276
+ nextAttemptAtMillis: time,
277
+ });
278
+
279
+ const retained = yield* store.accept(record, limits);
280
+
281
+ if (retained.tombstone !== true && (yield* digest(retained.payload)) !== retained.payloadDigest)
282
+ return yield* failure("corrupt", "event-digest");
283
+
284
+ return retained;
285
+ });
286
+
287
+ return { store, authorizer, source, digest, scope, acceptNormalized };
288
+ });
289
+
290
+ const pageLimit = (value: number) =>
291
+ validate(Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(100)), value);
292
+
293
+ const makeManagement = Effect.fn("Subscriptions.make")(function* (requested: SubscriptionLimits) {
294
+ const limits = yield* validate(SubscriptionLimits, requested);
295
+ const { bindings } = yield* SubscriptionInputBindings;
296
+ const { store, authorizer, source, digest, scope } = yield* dependencies;
297
+
298
+ const subscribe: Subscriptions["Service"]["subscribe"] = Effect.fn("Subscriptions.subscribe")(
299
+ function* (scopeValue, options) {
300
+ const owner = yield* scope(scopeValue);
301
+
302
+ yield* authorizer.manage("subscribe", owner);
303
+ const behavior = yield* source(options.source);
304
+ const params = yield* behavior.parameters(options.parameters);
305
+ const binding = yield* resolveSubscriptionInput(bindings, options);
306
+ const context = yield* binding.context(options.context);
307
+
308
+ const configuration = yield* validate(SubscriptionConfiguration, {
309
+ ...options,
310
+ parameters: params.parameters,
311
+ context,
312
+ matchingKey: params.matchingKey,
313
+ });
314
+
315
+ yield* authorizer.manage("subscribe", owner, configuration);
316
+
317
+ const key = yield* validate(SubscriptionKey, {
318
+ partition: owner.partition,
319
+ ownerId: owner.ownerId,
320
+ subscriptionId: options.subscriptionId,
321
+ });
322
+
323
+ const encodedConfiguration = yield* Schema.encodeEffect(SubscriptionConfiguration)(
324
+ configuration,
325
+ ).pipe(Effect.mapError(() => failure("validation", "configuration")));
326
+
327
+ const creationFingerprint = yield* digest({
328
+ key,
329
+ createdBy: owner.principal,
330
+ configuration: encodedConfiguration,
331
+ });
332
+
333
+ const existing = yield* store.get(key);
334
+
335
+ if (existing !== null) {
336
+ const retainedConfiguration = yield* Schema.encodeEffect(SubscriptionConfiguration)(
337
+ existing.creationConfiguration,
338
+ ).pipe(Effect.mapError(() => failure("corrupt", "creation-configuration")));
339
+
340
+ const retainedFingerprint = yield* digest({
341
+ key: existing.key,
342
+ createdBy: existing.createdBy,
343
+ configuration: retainedConfiguration,
344
+ });
345
+
346
+ if (retainedFingerprint !== existing.creationFingerprint)
347
+ return yield* failure("corrupt", "creation-fingerprint");
348
+
349
+ const currentConfiguration = yield* Schema.encodeEffect(SubscriptionConfiguration)(
350
+ existing.configuration,
351
+ ).pipe(Effect.mapError(() => failure("corrupt", "configuration")));
352
+
353
+ if (
354
+ (yield* digest({
355
+ key: existing.key,
356
+ createdBy: existing.createdBy,
357
+ configuration: currentConfiguration,
358
+ })) !== existing.configurationFingerprint
359
+ )
360
+ return yield* failure("corrupt", "creation-fingerprint");
361
+ if (existing.creationFingerprint !== creationFingerprint)
362
+ return yield* failure("conflict", "creation");
363
+
364
+ return snapshot(existing, yield* now);
365
+ }
366
+ if (
367
+ bytes(params.parameters) > limits.maxPayloadBytes ||
368
+ bytes(context) > limits.maxContextBytes
369
+ )
370
+ return yield* failure("validation", "registration-bounds");
371
+ const time = yield* now;
372
+
373
+ if (
374
+ configuration.expiresAtMillis !== null &&
375
+ (configuration.expiresAtMillis <= time ||
376
+ configuration.expiresAtMillis - time > limits.maxLifetimeMillis)
377
+ )
378
+ return yield* failure("validation", "lifetime");
379
+ if (behavior.reconcile !== undefined && configuration.mode !== "once")
380
+ return yield* failure("validation", "reconciliation-requires-once");
381
+
382
+ const record = yield* store.register(
383
+ {
384
+ schemaVersion: 1,
385
+ key,
386
+ creationFingerprint,
387
+ configurationRevision: 1,
388
+ configurationFingerprint: creationFingerprint,
389
+ creationConfiguration: configuration,
390
+ createdBy: owner.principal,
391
+ createdAtMillis: time,
392
+ ordinal: 0,
393
+ configuration,
394
+ state: "active",
395
+ recovery:
396
+ behavior.reconcile === undefined
397
+ ? null
398
+ : { attempts: 0, nextAttemptAtMillis: time, lastFailure: null },
399
+ },
400
+ limits,
401
+ );
402
+
403
+ return snapshot(record, time);
404
+ },
405
+ );
406
+
407
+ const listSubscriptions: Subscriptions["Service"]["listSubscriptions"] = Effect.fn(
408
+ "Subscriptions.listSubscriptions",
409
+ )(function* (scopeValue, after = 0, requestedLimit = 50) {
410
+ const owner = yield* scope(scopeValue);
411
+
412
+ yield* authorizer.manage("list", owner);
413
+ const limit = yield* pageLimit(requestedLimit);
414
+
415
+ yield* validate(Schema.Natural, after);
416
+ const records = yield* store.list(owner.ownerId, after, limit);
417
+ const time = yield* now;
418
+
419
+ return {
420
+ items: records.map((record) => snapshot(record, time)),
421
+ next: records.length === limit ? (records.at(-1)?.ordinal ?? null) : null,
422
+ };
423
+ });
424
+
425
+ const ownedKey = Effect.fn("Subscriptions.ownedKey")(function* (
426
+ owner: SubscriptionScope,
427
+ key: SubscriptionKey,
428
+ ) {
429
+ yield* validate(SubscriptionKey, key);
430
+ if (!samePartition(owner.partition, key.partition) || owner.ownerId !== key.ownerId)
431
+ return yield* failure("unauthorized", "owner");
432
+
433
+ return key;
434
+ });
435
+
436
+ const updateSubscription: Subscriptions["Service"]["updateSubscription"] = Effect.fn(
437
+ "Subscriptions.updateSubscription",
438
+ )(function* (scopeValue, key, expectedRevision, options) {
439
+ const owner = yield* scope(scopeValue);
440
+
441
+ yield* authorizer.manage("update", owner);
442
+ yield* ownedKey(owner, key);
443
+ const behavior = yield* source(options.source);
444
+ const parameters = yield* behavior.parameters(options.parameters);
445
+ const binding = yield* resolveSubscriptionInput(bindings, options);
446
+ const context = yield* binding.context(options.context);
447
+
448
+ const configuration = yield* validate(SubscriptionConfiguration, {
449
+ ...options,
450
+ ...parameters,
451
+ context,
452
+ });
453
+
454
+ yield* authorizer.manage("update", owner, configuration);
455
+ const time = yield* now;
456
+
457
+ if (
458
+ bytes(parameters.parameters) > limits.maxPayloadBytes ||
459
+ bytes(context) > limits.maxContextBytes
460
+ )
461
+ return yield* failure("validation", "registration-bounds");
462
+ if (
463
+ configuration.expiresAtMillis !== null &&
464
+ (configuration.expiresAtMillis <= time ||
465
+ configuration.expiresAtMillis - time > limits.maxLifetimeMillis)
466
+ )
467
+ return yield* failure("validation", "lifetime");
468
+ if (behavior.reconcile !== undefined && configuration.mode !== "once")
469
+ return yield* failure("validation", "reconciliation-requires-once");
470
+ const existing = yield* store.get(key);
471
+
472
+ if (existing === null) return yield* failure("not-found", "subscription");
473
+
474
+ const encoded = yield* Schema.encodeEffect(SubscriptionConfiguration)(configuration).pipe(
475
+ Effect.mapError(() => failure("validation", "configuration")),
476
+ );
477
+
478
+ const configurationFingerprint = yield* digest({
479
+ key,
480
+ createdBy: existing.createdBy,
481
+ configuration: encoded,
482
+ });
483
+
484
+ const updated = yield* store.change(key, expectedRevision, {
485
+ _tag: "Update",
486
+ configuration,
487
+ configurationFingerprint,
488
+ recovery:
489
+ behavior.reconcile === undefined
490
+ ? null
491
+ : { attempts: 0, nextAttemptAtMillis: time, lastFailure: null },
492
+ });
493
+
494
+ return snapshot(updated, time);
495
+ });
496
+
497
+ const changeState = Effect.fn("Subscriptions.changeState")(function* (
498
+ scopeValue: SubscriptionScope,
499
+ key: SubscriptionKey,
500
+ expectedRevision: number,
501
+ change: Extract<SubscriptionChange, { readonly _tag: "Pause" | "Resume" }>,
502
+ ) {
503
+ const owner = yield* scope(scopeValue);
504
+
505
+ yield* authorizer.manage(change._tag === "Pause" ? "pause" : "resume", owner);
506
+ const updated = yield* store.change(yield* ownedKey(owner, key), expectedRevision, change);
507
+
508
+ return snapshot(updated, yield* now);
509
+ });
510
+
511
+ const cancelSubscription: Subscriptions["Service"]["cancelSubscription"] = Effect.fn(
512
+ "Subscriptions.cancelSubscription",
513
+ )(function* (scopeValue, key, expectedRevision) {
514
+ const owner = yield* scope(scopeValue);
515
+
516
+ yield* authorizer.manage("cancel", owner);
517
+ const record = yield* store.cancel(yield* ownedKey(owner, key), expectedRevision);
518
+
519
+ return snapshot(record, yield* now);
520
+ });
521
+
522
+ const listDeliveries: Subscriptions["Service"]["listDeliveries"] = Effect.fn(
523
+ "Subscriptions.listDeliveries",
524
+ )(function* (scopeValue, key, after = "", requestedLimit = 50) {
525
+ const owner = yield* scope(scopeValue);
526
+
527
+ yield* authorizer.manage("deliveries", owner);
528
+ const limit = yield* pageLimit(requestedLimit);
529
+ const records = yield* store.listDeliveries(yield* ownedKey(owner, key), after, limit);
530
+ const last = records.at(-1);
531
+
532
+ return {
533
+ items: records.map(deliverySnapshot),
534
+ next:
535
+ records.length === limit && last !== undefined
536
+ ? subscriptionDeliveryKeyString(last.key)
537
+ : null,
538
+ };
539
+ });
540
+
541
+ const recoverDelivery: Subscriptions["Service"]["recoverDelivery"] = Effect.fn(
542
+ "Subscriptions.recoverDelivery",
543
+ )(function* (scopeValue, key, expectedGeneration) {
544
+ const owner = yield* scope(scopeValue);
545
+
546
+ yield* authorizer.manage("recover", owner);
547
+ yield* ownedKey(owner, key.subscription);
548
+ const existing = yield* store.delivery(key);
549
+
550
+ if (existing === null) return yield* failure("not-found", "delivery");
551
+
552
+ const recovered = yield* store.changeDelivery(key, existing.deliveryId, {
553
+ _tag: "Recover",
554
+ expectedGeneration,
555
+ nowMillis: yield* now,
556
+ });
557
+
558
+ return deliverySnapshot(recovered);
559
+ });
560
+
561
+ const getSubscription: Subscriptions["Service"]["getSubscription"] = Effect.fn(
562
+ "Subscriptions.getSubscription",
563
+ )(function* (scopeValue, key) {
564
+ const owner = yield* scope(scopeValue);
565
+
566
+ yield* authorizer.manage("get", owner);
567
+ const record = yield* store.get(yield* ownedKey(owner, key));
568
+
569
+ if (record === null) return yield* failure("not-found", "subscription");
570
+
571
+ return snapshot(record, yield* now);
572
+ });
573
+
574
+ return Subscriptions.of({
575
+ getSubscription,
576
+ recoverSubscription: (scopeValue, key, expectedRevision) =>
577
+ Effect.gen(function* () {
578
+ const owner = yield* scope(scopeValue);
579
+
580
+ yield* authorizer.manage("recover", owner);
581
+
582
+ return snapshot(
583
+ yield* store.change(yield* ownedKey(owner, key), expectedRevision, {
584
+ _tag: "Recover",
585
+ nowMillis: yield* now,
586
+ }),
587
+ yield* now,
588
+ );
589
+ }),
590
+ recoverDelivery,
591
+ subscribe,
592
+ updateSubscription,
593
+ pauseSubscription: (scope, key, revision) =>
594
+ changeState(scope, key, revision, { _tag: "Pause" }),
595
+ resumeSubscription: (scope, key, revision) =>
596
+ changeState(scope, key, revision, { _tag: "Resume" }),
597
+ listSubscriptions,
598
+ cancelSubscription,
599
+ listDeliveries,
600
+ });
601
+ });
602
+
603
+ const makeIntake = Effect.fn("SubscriptionIntake.make")(function* (requested: SubscriptionLimits) {
604
+ const limits = yield* validate(SubscriptionLimits, requested);
605
+ const { store, authorizer, source, acceptNormalized } = yield* dependencies;
606
+
607
+ const accept: SubscriptionIntake["Service"]["accept"] = Effect.fn("SubscriptionIntake.accept")(
608
+ function* (principal, version, payload) {
609
+ yield* authorizer.intake(store.partition, version, principal);
610
+ const behavior = yield* source(version);
611
+ const event = yield* behavior.normalize(payload);
612
+ const accepted = yield* acceptNormalized(version, event, limits);
613
+
614
+ return {
615
+ partition: accepted.partition,
616
+ eventId: accepted.eventId,
617
+ acceptedAtMillis: accepted.acceptedAtMillis,
618
+ };
619
+ },
620
+ );
621
+
622
+ const status: SubscriptionIntake["Service"]["status"] = Effect.fn("SubscriptionIntake.status")(
623
+ function* (principal, version, eventId) {
624
+ yield* authorizer.intake(store.partition, version, principal);
625
+ const event = yield* store.event(eventId);
626
+
627
+ if (event === null) return yield* failure("not-found", "event");
628
+ if (!sameSource(event.source, version)) return yield* failure("conflict", "event-source");
629
+
630
+ return {
631
+ partition: event.partition,
632
+ eventId: event.eventId,
633
+ acceptedAtMillis: event.acceptedAtMillis,
634
+ routingComplete: event.routingComplete,
635
+ routingFailure: event.routingFailure,
636
+ nextAttemptAtMillis: event.nextAttemptAtMillis,
637
+ };
638
+ },
639
+ );
640
+
641
+ return SubscriptionIntake.of({ accept, status });
642
+ });
643
+
644
+ const makeDriver = Effect.fn("SubscriptionDriver.make")(function* (requested: SubscriptionLimits) {
645
+ const limits = yield* validate(SubscriptionLimits, requested);
646
+ const { bindings } = yield* SubscriptionInputBindings;
647
+ const { store, authorizer, source, digest, acceptNormalized } = yield* dependencies;
648
+ const admission = yield* PreparedInputAdmission;
649
+
650
+ if (limits.retention !== undefined && admission.submissionStatus === undefined)
651
+ return yield* failure("validation", "retention-requires-submission-status");
652
+ const failpoint = yield* SubscriptionFailpoint;
653
+ const semaphore = yield* Semaphore.make(limits.concurrency);
654
+ const sweepSemaphore = yield* Semaphore.make(1);
655
+ const definitionEquals = Schema.toEquivalence(DefinitionDigests);
656
+ const nextAttempt = (time: number) => Math.min(time + limits.retryMillis, 8_640_000_000_000_000);
657
+
658
+ const selected = Effect.fn("Subscriptions.selected")(function* (
659
+ event: AcceptedEvent,
660
+ subscription: SubscriptionRecord,
661
+ ) {
662
+ const deliveryId = yield* digest({
663
+ schemaVersion: 1,
664
+ subscription: subscription.key,
665
+ eventId: event.eventId,
666
+ });
667
+
668
+ const time = yield* now;
669
+
670
+ return yield* validate(SubscriptionDelivery, {
671
+ schemaVersion: 1,
672
+ key: { subscription: subscription.key, eventId: event.eventId },
673
+ deliveryId,
674
+ subscriptionFingerprint: subscription.configurationFingerprint,
675
+ configurationRevision: subscription.configurationRevision,
676
+ configuration: subscription.configuration,
677
+ eventDigest: event.payloadDigest,
678
+ source: event.source,
679
+ threadId:
680
+ subscription.configuration.destination._tag === "ExistingThread"
681
+ ? subscription.configuration.destination.threadId
682
+ : Schema.decodeSync(ThreadId)(`subscription:${deliveryId}`),
683
+ admissionKey: Schema.decodeSync(IdempotencyKey)(`subscription:${deliveryId}`),
684
+ selectedAtMillis: time,
685
+ ...(limits.retention === undefined ? {} : { observeSettlement: true }),
686
+ state: "selected",
687
+ envelope: null,
688
+ envelopeDigest: null,
689
+ retry: {
690
+ generation: 0,
691
+ attempts: 0,
692
+ automaticAttempts: 0,
693
+ parked: false,
694
+ nextAttemptAtMillis: time,
695
+ lastAttemptAtMillis: null,
696
+ lastFailure: null,
697
+ },
698
+ receipt: null,
699
+ refusal: null,
700
+ });
701
+ });
702
+
703
+ const route = Effect.fn("Subscriptions.route")(function* (event: AcceptedEvent) {
704
+ const behavior = yield* source(event.source);
705
+ const normalized = yield* behavior.normalize(event.payload);
706
+
707
+ if (
708
+ normalized.eventId !== event.eventId ||
709
+ normalized.occurredAtMillis !== event.occurredAtMillis ||
710
+ normalized.matchingKey !== event.matchingKey ||
711
+ (yield* digest(normalized.payload)) !== event.payloadDigest ||
712
+ (yield* digest(event.payload)) !== event.payloadDigest
713
+ )
714
+ return yield* failure("corrupt", "event-source-bindings");
715
+ const candidates = yield* store.candidates(event, limits.batchSize);
716
+ const deliveries: Array<SubscriptionDelivery> = [];
717
+ const time = yield* now;
718
+
719
+ for (const candidate of candidates) {
720
+ if (
721
+ candidate.state !== "active" ||
722
+ (candidate.configuration.expiresAtMillis !== null &&
723
+ candidate.configuration.expiresAtMillis <= time)
724
+ )
725
+ continue;
726
+
727
+ const config = yield* Schema.encodeEffect(SubscriptionConfiguration)(
728
+ candidate.configuration,
729
+ ).pipe(Effect.mapError(() => failure("corrupt", "configuration")));
730
+
731
+ const fingerprint = yield* digest({
732
+ key: candidate.key,
733
+ createdBy: candidate.createdBy,
734
+ configuration: config,
735
+ });
736
+
737
+ const parameters = yield* behavior.parameters(candidate.configuration.parameters);
738
+
739
+ if (
740
+ fingerprint !== candidate.configurationFingerprint ||
741
+ parameters.matchingKey !== candidate.configuration.matchingKey
742
+ )
743
+ return yield* failure("corrupt", "registration-source-bindings");
744
+ if (yield* behavior.matches(event, candidate))
745
+ deliveries.push(yield* selected(event, candidate));
746
+ }
747
+ const cursor = candidates.at(-1)?.ordinal ?? event.cursor;
748
+
749
+ yield* store.select(
750
+ event,
751
+ deliveries,
752
+ cursor,
753
+ candidates.length < limits.batchSize,
754
+ yield* now,
755
+ limits,
756
+ );
757
+ });
758
+
759
+ const retry = (delivery: SubscriptionDelivery, reason: ScheduleRetryReason) =>
760
+ now.pipe(
761
+ Effect.flatMap((time) =>
762
+ store.changeDelivery(delivery.key, delivery.deliveryId, {
763
+ _tag: "Retry",
764
+ nowMillis: time,
765
+ retry: {
766
+ generation: delivery.retry.generation,
767
+ attempts: delivery.retry.attempts + 1,
768
+ automaticAttempts: delivery.retry.automaticAttempts + 1,
769
+ parked: delivery.retry.automaticAttempts + 1 >= (limits.maxAutomaticAttempts ?? 8),
770
+ lastAttemptAtMillis: time,
771
+ nextAttemptAtMillis: nextAttempt(time),
772
+ lastFailure: reason,
773
+ },
774
+ }),
775
+ ),
776
+ Effect.asVoid,
777
+ );
778
+
779
+ const refuse = (
780
+ delivery: SubscriptionDelivery,
781
+ phase: "preparation" | "admission",
782
+ code: string,
783
+ ) =>
784
+ now.pipe(
785
+ Effect.flatMap((time) =>
786
+ store.changeDelivery(delivery.key, delivery.deliveryId, {
787
+ _tag: "Refuse",
788
+ refusal: { phase, code },
789
+ nowMillis: time,
790
+ }),
791
+ ),
792
+ Effect.asVoid,
793
+ );
794
+
795
+ const verifySelected = Effect.fn("Subscriptions.verifySelected")(function* (
796
+ delivery: SubscriptionDelivery,
797
+ ) {
798
+ const current = yield* store.get(delivery.key.subscription);
799
+
800
+ const subscription =
801
+ current === null
802
+ ? null
803
+ : {
804
+ ...current,
805
+ configuration: delivery.configuration,
806
+ configurationRevision: delivery.configurationRevision,
807
+ configurationFingerprint: delivery.subscriptionFingerprint,
808
+ };
809
+
810
+ const event = yield* store.event(delivery.key.eventId);
811
+
812
+ if (
813
+ subscription === null ||
814
+ event === null ||
815
+ !sameSource(delivery.source, event.source) ||
816
+ !sameSource(delivery.source, subscription.configuration.source)
817
+ )
818
+ return yield* failure("corrupt", "selected-reference");
819
+
820
+ const expectedId = yield* digest({
821
+ schemaVersion: 1,
822
+ subscription: subscription.key,
823
+ eventId: event.eventId,
824
+ });
825
+
826
+ const configuration = yield* Schema.encodeEffect(SubscriptionConfiguration)(
827
+ subscription.configuration,
828
+ ).pipe(Effect.mapError(() => failure("corrupt", "configuration")));
829
+
830
+ const fingerprint = yield* digest({
831
+ key: subscription.key,
832
+ createdBy: subscription.createdBy,
833
+ configuration,
834
+ });
835
+
836
+ const destination = subscription.configuration.destination;
837
+
838
+ if (
839
+ delivery.subscriptionFingerprint !== fingerprint ||
840
+ delivery.eventDigest !== event.payloadDigest ||
841
+ (yield* digest(event.payload)) !== event.payloadDigest ||
842
+ delivery.deliveryId !== expectedId ||
843
+ delivery.admissionKey !== `subscription:${expectedId}` ||
844
+ delivery.threadId !==
845
+ (destination._tag === "ExistingThread"
846
+ ? destination.threadId
847
+ : `subscription:${expectedId}`)
848
+ )
849
+ return yield* failure("corrupt", "selected-bindings");
850
+
851
+ return { subscription, event };
852
+ });
853
+
854
+ const envelopeDigest = Effect.fn("Subscriptions.envelopeDigest")(function* (
855
+ delivery: SubscriptionDelivery,
856
+ envelope: PreparedInput,
857
+ ) {
858
+ const encoded = yield* Schema.encodeEffect(PreparedInput)(envelope).pipe(
859
+ Effect.mapError(() => failure("corrupt", "prepared-envelope")),
860
+ );
861
+
862
+ return yield* digest({
863
+ deliveryId: delivery.deliveryId,
864
+ subscriptionFingerprint: delivery.subscriptionFingerprint,
865
+ eventDigest: delivery.eventDigest,
866
+ envelope: encoded,
867
+ });
868
+ });
869
+
870
+ const prepare = Effect.fn("Subscriptions.prepare")(function* (delivery: SubscriptionDelivery) {
871
+ const { subscription, event } = yield* verifySelected(delivery);
872
+ const time = yield* now;
873
+
874
+ if (
875
+ subscription.state === "cancelled" ||
876
+ (subscription.configuration.expiresAtMillis !== null &&
877
+ subscription.configuration.expiresAtMillis <= time)
878
+ ) {
879
+ yield* refuse(
880
+ delivery,
881
+ "preparation",
882
+ subscription.state === "cancelled" ? "cancelled" : "expired",
883
+ );
884
+
885
+ return null;
886
+ }
887
+ const binding = yield* resolveSubscriptionInput(bindings, subscription.configuration);
888
+
889
+ if ((yield* digest(event.payload)) !== event.payloadDigest)
890
+ return yield* failure("corrupt", "event-digest");
891
+ const authorization = yield* authorizer.prepare(subscription, event);
892
+ const input = yield* binding.prepare(event, subscription);
893
+
894
+ if (bytes(input) > limits.maxPayloadBytes)
895
+ return yield* SubscriptionSourceError.make({ code: "input-bounds", retryable: false });
896
+
897
+ const envelope = yield* validate(PreparedInput, {
898
+ schemaVersion: 1,
899
+ threadId: delivery.threadId,
900
+ admissionKey: delivery.admissionKey,
901
+ deliveryPrincipal: subscription.configuration.deliveryPrincipal,
902
+ ...(subscription.configuration.admissionGroup === undefined
903
+ ? {}
904
+ : { admissionGroup: subscription.configuration.admissionGroup }),
905
+ ...(subscription.configuration.admissionFence === undefined
906
+ ? {}
907
+ : { admissionFence: subscription.configuration.admissionFence }),
908
+ agentId: subscription.configuration.agentId,
909
+ definitions: subscription.configuration.definitions,
910
+ input,
911
+ inputDigest: yield* digest(input),
912
+ authorization,
913
+ });
914
+
915
+ return yield* store.changeDelivery(delivery.key, delivery.deliveryId, {
916
+ _tag: "Prepare",
917
+ envelope,
918
+ envelopeDigest: yield* envelopeDigest(delivery, envelope),
919
+ nowMillis: yield* now,
920
+ });
921
+ });
922
+
923
+ const process = Effect.fn("Subscriptions.processDelivery")(function* (
924
+ key: SubscriptionDeliveryKey,
925
+ ) {
926
+ let delivery = yield* store.delivery(key);
927
+
928
+ if (delivery === null) return yield* failure("not-found", "delivery");
929
+ if (
930
+ delivery.state === "delivered" &&
931
+ delivery.observeSettlement === true &&
932
+ delivery.receipt !== null
933
+ ) {
934
+ const settled =
935
+ admission.submissionStatus === undefined
936
+ ? false
937
+ : yield* admission.submissionStatus(delivery.receipt).pipe(
938
+ Effect.timeout(limits.operationTimeoutMillis),
939
+ Effect.map((status) => status._tag === "settled"),
940
+ Effect.catch((error) =>
941
+ Effect.logWarning("Subscription settlement observation unavailable", {
942
+ tag: error._tag,
943
+ }).pipe(Effect.as(false)),
944
+ ),
945
+ );
946
+
947
+ const time = yield* now;
948
+
949
+ yield* store.changeDelivery(delivery.key, delivery.deliveryId, {
950
+ _tag: "ObserveSettlement",
951
+ receipt: delivery.receipt,
952
+ settled,
953
+ nowMillis: time,
954
+ nextAttemptAtMillis: nextAttempt(time),
955
+ });
956
+
957
+ return;
958
+ }
959
+ if (
960
+ delivery.retry.parked === true ||
961
+ delivery.retry.nextAttemptAtMillis > (yield* now) ||
962
+ delivery.state === "delivered" ||
963
+ delivery.state === "refused"
964
+ )
965
+ return;
966
+ if (delivery.state === "selected") {
967
+ const original = delivery;
968
+
969
+ delivery = yield* prepare(original).pipe(
970
+ Effect.timeout(limits.operationTimeoutMillis),
971
+ Effect.catchTag("SubscriptionSourceError", (error) =>
972
+ (error.retryable
973
+ ? retry(original, "transport")
974
+ : refuse(original, "preparation", error.code)
975
+ ).pipe(Effect.as(null)),
976
+ ),
977
+ Effect.catchTag("SubscriptionError", (error) =>
978
+ error.reason === "unauthorized"
979
+ ? refuse(original, "preparation", error.code).pipe(Effect.as(null))
980
+ : Effect.fail(error),
981
+ ),
982
+ Effect.catchTag("TimeoutError", () => retry(original, "timeout").pipe(Effect.as(null))),
983
+ );
984
+ }
985
+ if (delivery === null || delivery.state === "refused" || delivery.state === "delivered") return;
986
+ if (
987
+ delivery.state !== "prepared" ||
988
+ delivery.envelope === null ||
989
+ delivery.envelopeDigest === null
990
+ )
991
+ return yield* failure("corrupt", "prepared-state");
992
+ const { subscription } = yield* verifySelected(delivery);
993
+ const envelope = delivery.envelope;
994
+
995
+ if (
996
+ (yield* digest(envelope.input)) !== envelope.inputDigest ||
997
+ envelope.threadId !== delivery.threadId ||
998
+ envelope.admissionKey !== delivery.admissionKey ||
999
+ envelope.deliveryPrincipal !== subscription.configuration.deliveryPrincipal ||
1000
+ envelope.agentId !== subscription.configuration.agentId ||
1001
+ !definitionEquals(envelope.definitions, subscription.configuration.definitions) ||
1002
+ delivery.envelopeDigest !== (yield* envelopeDigest(delivery, envelope))
1003
+ )
1004
+ return yield* failure("corrupt", "prepared-envelope");
1005
+
1006
+ const outcome = yield* admitPreparedInput(
1007
+ admission.submit(envelope),
1008
+ limits.operationTimeoutMillis,
1009
+ ).pipe(Effect.mapError(() => failure("corrupt", "admission")));
1010
+
1011
+ if (outcome._tag === "Receipt") {
1012
+ yield* failpoint.hit("subscription:admission:after");
1013
+ if (outcome.receipt.threadId !== envelope.threadId)
1014
+ return yield* failure("corrupt", "receipt-destination");
1015
+ yield* store.changeDelivery(delivery.key, delivery.deliveryId, {
1016
+ _tag: "Complete",
1017
+ receipt: outcome.receipt,
1018
+ nowMillis: yield* now,
1019
+ });
1020
+ } else if (outcome._tag === "Refused") yield* refuse(delivery, "admission", outcome.error.code);
1021
+ else yield* retry(delivery, outcome.reason);
1022
+ });
1023
+
1024
+ const processDelivery: SubscriptionDriver["Service"]["processDelivery"] = (key) =>
1025
+ semaphore.withPermit(process(key));
1026
+
1027
+ const reconcile = Effect.fn("Subscriptions.reconcile")(function* (
1028
+ subscription: SubscriptionRecord,
1029
+ ) {
1030
+ const time = yield* now;
1031
+
1032
+ if (
1033
+ subscription.state !== "active" ||
1034
+ (subscription.configuration.expiresAtMillis !== null &&
1035
+ subscription.configuration.expiresAtMillis <= time)
1036
+ )
1037
+ return yield* store.deferRecovery(subscription.key, subscription.configurationRevision, null);
1038
+ const behavior = yield* source(subscription.configuration.source);
1039
+
1040
+ if (behavior.reconcile === undefined)
1041
+ return yield* failure("unsupported-source", "source-reconciliation");
1042
+ yield* authorizer.reconcile(subscription);
1043
+
1044
+ const observation = yield* behavior.reconcile(subscription).pipe(
1045
+ Effect.timeout(limits.operationTimeoutMillis),
1046
+ Effect.map((event) => ({ _tag: "Observed" as const, event })),
1047
+ Effect.catchTag("SubscriptionSourceError", (error) =>
1048
+ Effect.succeed({ _tag: "Failed" as const, error }),
1049
+ ),
1050
+ );
1051
+
1052
+ if (observation._tag === "Failed")
1053
+ return yield* store.deferRecovery(subscription.key, subscription.configurationRevision, {
1054
+ attempts: (subscription.recovery?.attempts ?? 0) + 1,
1055
+ nextAttemptAtMillis: observation.error.retryable ? nextAttempt(time) : null,
1056
+ lastFailure: observation.error.code,
1057
+ });
1058
+ const observed = observation.event;
1059
+
1060
+ if (observed !== null) {
1061
+ const event = yield* acceptNormalized(behavior.source, observed, limits);
1062
+
1063
+ if (event.tombstone === true)
1064
+ return yield* store.deferRecovery(subscription.key, subscription.configurationRevision, {
1065
+ attempts: (subscription.recovery?.attempts ?? 0) + 1,
1066
+ nextAttemptAtMillis: null,
1067
+ lastFailure: "event-reclaimed",
1068
+ });
1069
+
1070
+ if (
1071
+ event.matchingKey !== subscription.configuration.matchingKey ||
1072
+ !(yield* behavior.matches(event, subscription))
1073
+ )
1074
+ return yield* failure("conflict", "reconciliation-match");
1075
+ yield* store.catchUp(event, yield* selected(event, subscription), yield* now, limits);
1076
+
1077
+ return;
1078
+ }
1079
+ yield* store.deferRecovery(subscription.key, subscription.configurationRevision, {
1080
+ attempts: (subscription.recovery?.attempts ?? 0) + 1,
1081
+ nextAttemptAtMillis: nextAttempt(time),
1082
+ lastFailure: null,
1083
+ });
1084
+ });
1085
+
1086
+ const runDue = Effect.gen(function* () {
1087
+ const time = yield* now;
1088
+ let processed = 0;
1089
+ let failed = 0;
1090
+
1091
+ const failureCode = <E>(cause: Cause.Cause<E>) =>
1092
+ Option.match(Cause.findErrorOption(cause), {
1093
+ onNone: () => "defect",
1094
+ onSome: (error) =>
1095
+ Schema.is(SubscriptionError)(error)
1096
+ ? error.reason
1097
+ : Schema.is(SubscriptionSourceError)(error)
1098
+ ? error.code
1099
+ : Schema.is(Schema.Struct({ _tag: Schema.Literal("TimeoutError") }))(error)
1100
+ ? "timeout"
1101
+ : "interrupted-work",
1102
+ });
1103
+
1104
+ const attempt = <E>(
1105
+ work: Effect.Effect<void, E>,
1106
+ recover: (code: string) => Effect.Effect<void, SubscriptionStoreFailure>,
1107
+ ) =>
1108
+ work.pipe(
1109
+ Effect.matchCauseEffect({
1110
+ onSuccess: () =>
1111
+ Effect.sync(() => {
1112
+ processed += 1;
1113
+ }),
1114
+ onFailure: (cause) =>
1115
+ Cause.hasInterruptsOnly(cause)
1116
+ ? Effect.interrupt
1117
+ : Effect.gen(function* () {
1118
+ failed += 1;
1119
+ const code = failureCode(cause);
1120
+
1121
+ yield* recover(code).pipe(
1122
+ Effect.catchCause((c) =>
1123
+ Cause.hasInterruptsOnly(c) ? Effect.interrupt : Effect.void,
1124
+ ),
1125
+ );
1126
+ yield* Effect.logWarning("Subscription work remains pending").pipe(
1127
+ Effect.annotateLogs({ failureCode: code }),
1128
+ );
1129
+ }),
1130
+ }),
1131
+ );
1132
+
1133
+ // Persist progress even when one record cannot be decoded or deferred. An eviction cannot
1134
+ // send every sweep back to a corrupt first page. Each category receives one bounded page.
1135
+ const cursors = yield* store.readScanCursors;
1136
+ const records = yield* store.recovering(time, cursors.recovery, limits.batchSize);
1137
+ const events = yield* store.pendingEvents(time, cursors.events, limits.batchSize);
1138
+ const deliveries = yield* store.pendingDeliveries(time, cursors.deliveries, limits.batchSize);
1139
+ const lastDelivery = deliveries.at(-1);
1140
+
1141
+ yield* store.advanceScanCursors({
1142
+ recovery: records.length < limits.batchSize ? 0 : (records.at(-1)?.ordinal ?? 0),
1143
+ events: events.length < limits.batchSize ? "" : (events.at(-1) ?? ""),
1144
+ deliveries:
1145
+ deliveries.length < limits.batchSize || lastDelivery === undefined
1146
+ ? ""
1147
+ : subscriptionDeliveryKeyString(lastDelivery),
1148
+ });
1149
+ yield* Effect.forEach(
1150
+ records,
1151
+ (cursor) =>
1152
+ Effect.gen(function* () {
1153
+ let record: SubscriptionRecord | null = null;
1154
+
1155
+ yield* attempt(
1156
+ Effect.gen(function* () {
1157
+ record = yield* store.get(cursor.key);
1158
+
1159
+ if (record !== null) yield* reconcile(record);
1160
+ }).pipe(Effect.timeout(limits.operationTimeoutMillis)),
1161
+ (code) =>
1162
+ // A failed read supplies no revision that can safely authorize a mutation.
1163
+ record === null
1164
+ ? Effect.void
1165
+ : store.deferRecovery(record.key, record.configurationRevision, {
1166
+ attempts: (record.recovery?.attempts ?? 0) + 1,
1167
+ nextAttemptAtMillis: code === "unauthorized" ? null : nextAttempt(time),
1168
+ lastFailure: code,
1169
+ }),
1170
+ );
1171
+ }),
1172
+ { concurrency: limits.concurrency },
1173
+ );
1174
+ yield* Effect.forEach(
1175
+ events,
1176
+ (eventId) =>
1177
+ attempt(
1178
+ store.event(eventId).pipe(
1179
+ Effect.flatMap((event) =>
1180
+ event === null ? failure("not-found", "event") : route(event),
1181
+ ),
1182
+ Effect.timeout(limits.operationTimeoutMillis),
1183
+ ),
1184
+ (code) => store.deferEvent(eventId, nextAttempt(time), code),
1185
+ ),
1186
+ { concurrency: limits.concurrency },
1187
+ );
1188
+ yield* Effect.forEach(
1189
+ deliveries,
1190
+ (key) =>
1191
+ attempt(processDelivery(key), () =>
1192
+ store
1193
+ .delivery(key)
1194
+ .pipe(
1195
+ Effect.flatMap((delivery) =>
1196
+ delivery === null ? Effect.void : retry(delivery, "ambiguous"),
1197
+ ),
1198
+ ),
1199
+ ),
1200
+ { concurrency: limits.concurrency },
1201
+ );
1202
+
1203
+ if (limits.retention !== undefined)
1204
+ yield* store.compact(yield* now, limits.retention, limits.batchSize);
1205
+
1206
+ return { processed, failed };
1207
+ });
1208
+
1209
+ return SubscriptionDriver.of({ runDue: sweepSemaphore.withPermit(runDue), processDelivery });
1210
+ });