effect-agent 0.1.0-beta.9 → 0.1.0-beta.91

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 (538) 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-CHipL2jG.mjs +4598 -0
  7. package/dist/AgentRuntime-CHipL2jG.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-D7gDKGjH.mjs +6368 -0
  13. package/dist/DurableAgentRuntime-D7gDKGjH.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-DyfzHNdv.d.mts +826 -0
  45. package/dist/Subagent-U5qXOFE8.mjs +1469 -0
  46. package/dist/Subagent-U5qXOFE8.mjs.map +1 -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 +8 -0
  61. package/dist/ToolExposure.mjs +21 -0
  62. package/dist/ToolExposure.mjs.map +1 -0
  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 +436 -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 +89 -6
  368. package/dist/index.mjs +98 -6
  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 +273 -0
  388. package/dist/sandbox/ProtectedBrowser.mjs +287 -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 -40
  398. package/src/Ephemeral.ts +17 -0
  399. package/src/ToolExposure.ts +2 -0
  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 +778 -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 +10162 -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 +97 -22
  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 +436 -0
  538. package/src/sandbox/Sandbox.ts +241 -0
@@ -0,0 +1,710 @@
1
+ import { Effect, DateTime, Option, Schema, Stream } from "effect";
2
+
3
+ import { ThreadId, RunId, SubmissionId } from "../core/Identifiers.ts";
4
+ import { EMPTY_TAIL_DIGEST } from "./Digest.ts";
5
+ import type { Digest } from "./Records.ts";
6
+ import {
7
+ BatchId,
8
+ CanonicalBatch,
9
+ CanonicalSequence,
10
+ DeploymentId,
11
+ ProducerEpoch,
12
+ ProducerId,
13
+ RecordEnvelope,
14
+ RecordId,
15
+ UserInputRecorded,
16
+ } from "./Records.ts";
17
+ import {
18
+ type AppendResult,
19
+ AppendConflict,
20
+ CheckpointRejected,
21
+ ThreadCheckpoint,
22
+ ThreadExportRequest,
23
+ ThreadMaterialization,
24
+ ThreadNotMaterialized,
25
+ ThreadObservation,
26
+ ThreadRead,
27
+ ThreadStore,
28
+ ThreadTailRequest,
29
+ FencedAppendRequest,
30
+ FenceRejected,
31
+ LoadCheckpointRequest,
32
+ SaveCheckpointRequest,
33
+ type ThreadStoreFailure,
34
+ } from "./ThreadStore.ts";
35
+
36
+ /** A ThreadStore contract invariant that an adapter under test violated. */
37
+ export class ThreadStoreConformanceViolation extends Schema.TaggedError<ThreadStoreConformanceViolation>()(
38
+ "ThreadStoreConformanceViolation",
39
+ {
40
+ caseName: Schema.String,
41
+ message: Schema.String,
42
+ },
43
+ ) {}
44
+
45
+ export type ThreadStoreConformanceFailure =
46
+ | ThreadStoreFailure
47
+ | CheckpointRejected
48
+ | ThreadStoreConformanceViolation;
49
+
50
+ /**
51
+ * One adapter-neutral ThreadStore contract case. Each case owns disjoint
52
+ * Thread identities, so a suite may run every case against one shared store
53
+ * instance or against a fresh store per case.
54
+ */
55
+ export interface ThreadStoreConformanceCase {
56
+ readonly name: string;
57
+ readonly run: Effect.Effect<void, ThreadStoreConformanceFailure, ThreadStore>;
58
+ }
59
+
60
+ const decodeThreadId = Schema.decodeSync(ThreadId);
61
+ const decodeRecordId = Schema.decodeSync(RecordId);
62
+ const decodeBatchId = Schema.decodeSync(BatchId);
63
+ const decodeSequence = Schema.decodeSync(CanonicalSequence);
64
+ const decodeEpoch = Schema.decodeSync(ProducerEpoch);
65
+
66
+ const CONFORMANCE_DEPLOYMENT = Schema.decodeSync(DeploymentId)("deployment-conformance");
67
+ const CONFORMANCE_PRODUCER = Schema.decodeSync(ProducerId)("producer-conformance");
68
+ const CONFORMANCE_SUBMISSION = Schema.decodeSync(SubmissionId)("submission-conformance");
69
+ const CONFORMANCE_RUN = Schema.decodeSync(RunId)("run-conformance");
70
+ const CONFORMANCE_CREATED_AT = DateTime.toUtc(DateTime.makeUnsafe(1));
71
+
72
+ const ZERO_SEQUENCE = decodeSequence(0);
73
+ const EPOCH_ONE = decodeEpoch(1);
74
+ const EPOCH_TWO = decodeEpoch(2);
75
+ const EMPTY_TAIL = { lastSequence: ZERO_SEQUENCE, tailDigest: EMPTY_TAIL_DIGEST } as const;
76
+ const isAppendConflict = Schema.is(AppendConflict);
77
+ const isFenceRejected = Schema.is(FenceRejected);
78
+ const isCheckpointRejected = Schema.is(CheckpointRejected);
79
+ const isThreadNotMaterialized = Schema.is(ThreadNotMaterialized);
80
+
81
+ const record = (recordId: string, input: string): RecordEnvelope =>
82
+ RecordEnvelope.make({
83
+ recordId: decodeRecordId(recordId),
84
+ family: "thread",
85
+ schemaVersion: 1,
86
+ createdAt: CONFORMANCE_CREATED_AT,
87
+ deploymentId: CONFORMANCE_DEPLOYMENT,
88
+ payload: UserInputRecorded.make({
89
+ submissionId: CONFORMANCE_SUBMISSION,
90
+ kind: "user",
91
+ runId: CONFORMANCE_RUN,
92
+ input,
93
+ }),
94
+ });
95
+
96
+ const batch = (
97
+ batchId: string,
98
+ records: readonly [RecordEnvelope, ...Array<RecordEnvelope>],
99
+ ): CanonicalBatch =>
100
+ CanonicalBatch.make({
101
+ batchId: decodeBatchId(batchId),
102
+ producerId: CONFORMANCE_PRODUCER,
103
+ records,
104
+ });
105
+
106
+ const materialize = Effect.fn("ThreadStoreConformance.materialize")(function* (
107
+ threadId: ThreadId,
108
+ producerEpoch: ProducerEpoch,
109
+ ) {
110
+ const store = yield* ThreadStore;
111
+
112
+ yield* store.materialize(ThreadMaterialization.make({ threadId, producerEpoch }));
113
+ });
114
+
115
+ const append = Effect.fn("ThreadStoreConformance.append")(function* (
116
+ threadId: ThreadId,
117
+ canonicalBatch: CanonicalBatch,
118
+ tail: Pick<AppendResult, "lastSequence" | "tailDigest"> = EMPTY_TAIL,
119
+ producerEpoch: ProducerEpoch = EPOCH_ONE,
120
+ ) {
121
+ const store = yield* ThreadStore;
122
+
123
+ return yield* store.append(
124
+ FencedAppendRequest.make({
125
+ threadId,
126
+ batch: canonicalBatch,
127
+ expectedTailSequence: tail.lastSequence,
128
+ expectedTailDigest: tail.tailDigest,
129
+ producerEpoch,
130
+ }),
131
+ );
132
+ });
133
+
134
+ const readAll = Effect.fn("ThreadStoreConformance.readAll")(function* (threadId: ThreadId) {
135
+ const store = yield* ThreadStore;
136
+
137
+ return yield* store.read(ThreadRead.make({ threadId, limit: 1_024 })).pipe(Stream.runCollect);
138
+ });
139
+
140
+ const checkpointAt = (
141
+ threadId: ThreadId,
142
+ throughSequence: CanonicalSequence,
143
+ tailDigest: Digest,
144
+ ): ThreadCheckpoint =>
145
+ ThreadCheckpoint.make({
146
+ schemaVersion: 1,
147
+ threadId,
148
+ throughSequence,
149
+ tailDigest,
150
+ state: { conformance: true },
151
+ createdAt: CONFORMANCE_CREATED_AT,
152
+ });
153
+
154
+ const conformanceCase = (
155
+ name: string,
156
+ build: (assert: {
157
+ readonly ensure: (
158
+ condition: boolean,
159
+ message: string,
160
+ ) => Effect.Effect<void, ThreadStoreConformanceViolation>;
161
+ readonly expectFailure: <A, E, R>(
162
+ description: string,
163
+ effect: Effect.Effect<A, E, R>,
164
+ ) => Effect.Effect<E, ThreadStoreConformanceViolation, R>;
165
+ }) => Effect.Effect<void, ThreadStoreConformanceFailure, ThreadStore>,
166
+ ): ThreadStoreConformanceCase => ({
167
+ name,
168
+ run: build({
169
+ ensure: (condition, message) =>
170
+ condition
171
+ ? Effect.void
172
+ : Effect.fail(ThreadStoreConformanceViolation.make({ caseName: name, message })),
173
+ expectFailure: (description, effect) =>
174
+ Effect.flip(effect).pipe(
175
+ Effect.mapError(() =>
176
+ ThreadStoreConformanceViolation.make({
177
+ caseName: name,
178
+ message: `Expected failure but the operation succeeded: ${description}`,
179
+ }),
180
+ ),
181
+ ),
182
+ }).pipe(Effect.withSpan(`ThreadStoreConformance.${name}`)),
183
+ });
184
+
185
+ const atomicBatchVisibility = conformanceCase(
186
+ "commits batches atomically with no partial reader visibility",
187
+ ({ ensure, expectFailure }) =>
188
+ Effect.gen(function* () {
189
+ const threadId = decodeThreadId("conformance-atomic");
190
+ const store = yield* ThreadStore;
191
+
192
+ yield* materialize(threadId, EPOCH_ONE);
193
+
194
+ const committed = yield* append(
195
+ threadId,
196
+ batch("atomic-batch-1", [
197
+ record("atomic-record-1", "first"),
198
+ record("atomic-record-2", "second"),
199
+ record("atomic-record-3", "third"),
200
+ ]),
201
+ );
202
+
203
+ yield* ensure(
204
+ committed.firstSequence === 1 && committed.lastSequence === 3,
205
+ "A three-record batch must commit sequences 1 through 3",
206
+ );
207
+
208
+ const read = yield* readAll(threadId);
209
+
210
+ yield* ensure(read.length === 3, "Readers must observe the full committed batch");
211
+ yield* ensure(
212
+ read.every((envelope, index) => envelope.sequence === index + 1),
213
+ "Committed records must be gap-free in declaration order",
214
+ );
215
+
216
+ const observed = yield* store
217
+ .observe(ThreadObservation.make({ threadId }))
218
+ .pipe(Stream.take(3), Stream.runCollect);
219
+
220
+ yield* ensure(
221
+ observed.map((envelope) => envelope.record.recordId).join(",") ===
222
+ read.map((envelope) => envelope.record.recordId).join(","),
223
+ "Observers must see exactly the committed batch records in order",
224
+ );
225
+
226
+ const duplicate = record("atomic-record-4", "duplicate");
227
+
228
+ const intraBatch = yield* expectFailure(
229
+ "a batch containing one record ID twice",
230
+ append(threadId, batch("atomic-batch-2", [duplicate, duplicate]), committed),
231
+ );
232
+
233
+ yield* ensure(
234
+ isAppendConflict(intraBatch) && intraBatch.reason === "record-identity",
235
+ "A duplicated record ID inside one batch must conflict with reason record-identity",
236
+ );
237
+
238
+ const crossBatch = yield* expectFailure(
239
+ "a batch reusing an already-committed record ID",
240
+ append(threadId, batch("atomic-batch-3", [record("atomic-record-1", "reused")]), committed),
241
+ );
242
+
243
+ yield* ensure(
244
+ isAppendConflict(crossBatch) && crossBatch.reason === "record-identity",
245
+ "A record ID reused across batches must conflict with reason record-identity",
246
+ );
247
+
248
+ const exported = yield* store.export(ThreadExportRequest.make({ threadId }));
249
+
250
+ yield* ensure(
251
+ exported.records.length === 3 &&
252
+ exported.tailSequence === committed.lastSequence &&
253
+ exported.tailDigest === committed.tailDigest,
254
+ "A conflicting batch must leave no partial prefix behind",
255
+ );
256
+ }),
257
+ );
258
+
259
+ const idempotentReplay = conformanceCase(
260
+ "replays an identical batch idempotently and rejects altered content",
261
+ ({ ensure, expectFailure }) =>
262
+ Effect.gen(function* () {
263
+ const threadId = decodeThreadId("conformance-replay");
264
+
265
+ yield* materialize(threadId, EPOCH_ONE);
266
+
267
+ const original = batch("replay-batch-1", [
268
+ record("replay-record-1", "Lisbon"),
269
+ record("replay-record-2", "Porto"),
270
+ ]);
271
+
272
+ const first = yield* append(threadId, original);
273
+
274
+ yield* ensure(!first.replayed, "The first append of a batch must not report replayed");
275
+
276
+ const replayed = yield* append(threadId, original);
277
+
278
+ yield* ensure(
279
+ replayed.replayed &&
280
+ replayed.firstSequence === first.firstSequence &&
281
+ replayed.lastSequence === first.lastSequence &&
282
+ replayed.tailDigest === first.tailDigest,
283
+ "Replaying an identical batch must return the original result with replayed set",
284
+ );
285
+
286
+ const altered = yield* expectFailure(
287
+ "replaying a batch ID with different canonical content",
288
+ append(threadId, batch("replay-batch-1", [record("replay-record-3", "Faro")])),
289
+ );
290
+
291
+ yield* ensure(
292
+ isAppendConflict(altered) && altered.reason === "batch-digest",
293
+ "A batch ID replayed with different content must conflict with reason batch-digest",
294
+ );
295
+
296
+ const read = yield* readAll(threadId);
297
+
298
+ yield* ensure(read.length === 2, "Replay and conflict must not duplicate committed records");
299
+ }),
300
+ );
301
+
302
+ const tailConflict = conformanceCase(
303
+ "rejects stale expected tails and reports the actual tail",
304
+ ({ ensure, expectFailure }) =>
305
+ Effect.gen(function* () {
306
+ const threadId = decodeThreadId("conformance-tail");
307
+
308
+ yield* materialize(threadId, EPOCH_ONE);
309
+
310
+ const first = yield* append(
311
+ threadId,
312
+ batch("tail-batch-1", [record("tail-record-1", "first")]),
313
+ );
314
+
315
+ const staleSequence = yield* expectFailure(
316
+ "an append declaring the pre-append tail sequence",
317
+ append(threadId, batch("tail-batch-2", [record("tail-record-2", "second")])),
318
+ );
319
+
320
+ yield* ensure(
321
+ isAppendConflict(staleSequence) && staleSequence.reason === "tail",
322
+ "A stale expected tail sequence must conflict with reason tail",
323
+ );
324
+ yield* ensure(
325
+ isAppendConflict(staleSequence) &&
326
+ staleSequence.actualTailSequence === first.lastSequence &&
327
+ staleSequence.actualTailDigest === first.tailDigest,
328
+ "A tail conflict must carry the actual committed tail as a resume hint",
329
+ );
330
+
331
+ const staleDigest = yield* expectFailure(
332
+ "an append declaring the right sequence with the wrong digest",
333
+ append(threadId, batch("tail-batch-2", [record("tail-record-2", "second")]), {
334
+ lastSequence: first.lastSequence,
335
+ tailDigest: EMPTY_TAIL_DIGEST,
336
+ }),
337
+ );
338
+
339
+ yield* ensure(
340
+ isAppendConflict(staleDigest) && staleDigest.reason === "tail",
341
+ "A stale expected tail digest must conflict with reason tail",
342
+ );
343
+
344
+ const recovered = yield* append(
345
+ threadId,
346
+ batch("tail-batch-2", [record("tail-record-2", "second")]),
347
+ first,
348
+ );
349
+
350
+ yield* ensure(
351
+ recovered.firstSequence === first.lastSequence + 1,
352
+ "An append declaring the true tail must commit after a tail conflict",
353
+ );
354
+ }),
355
+ );
356
+
357
+ const producerFencing = conformanceCase(
358
+ "fences stale producer epochs while allowing epoch takeover",
359
+ ({ ensure, expectFailure }) =>
360
+ Effect.gen(function* () {
361
+ const threadId = decodeThreadId("conformance-fencing");
362
+
363
+ yield* materialize(threadId, EPOCH_ONE);
364
+
365
+ const first = yield* append(
366
+ threadId,
367
+ batch("fence-batch-1", [record("fence-record-1", "first")]),
368
+ );
369
+
370
+ yield* materialize(threadId, EPOCH_TWO);
371
+
372
+ const staleAppend = yield* expectFailure(
373
+ "an append using the pre-takeover producer epoch",
374
+ append(
375
+ threadId,
376
+ batch("fence-batch-2", [record("fence-record-2", "second")]),
377
+ first,
378
+ EPOCH_ONE,
379
+ ),
380
+ );
381
+
382
+ yield* ensure(
383
+ isFenceRejected(staleAppend) &&
384
+ staleAppend.actualEpoch === EPOCH_TWO &&
385
+ staleAppend.attemptedEpoch === EPOCH_ONE,
386
+ "A stale producer epoch must be fenced with both epochs reported",
387
+ );
388
+
389
+ const staleMaterialize = yield* expectFailure(
390
+ "re-materializing with the pre-takeover producer epoch",
391
+ materialize(threadId, EPOCH_ONE),
392
+ );
393
+
394
+ yield* ensure(
395
+ isFenceRejected(staleMaterialize),
396
+ "A stale producer epoch must not re-register through materialization",
397
+ );
398
+
399
+ const takeover = yield* append(
400
+ threadId,
401
+ batch("fence-batch-2", [record("fence-record-2", "second")]),
402
+ first,
403
+ EPOCH_TWO,
404
+ );
405
+
406
+ yield* ensure(
407
+ !takeover.replayed && takeover.firstSequence === first.lastSequence + 1,
408
+ "The takeover epoch must append after the committed tail",
409
+ );
410
+ }),
411
+ );
412
+
413
+ const offsetResumability = conformanceCase(
414
+ "resumes observation from a saved offset with exactly the suffix",
415
+ ({ ensure }) =>
416
+ Effect.gen(function* () {
417
+ const threadId = decodeThreadId("conformance-offsets");
418
+ const store = yield* ThreadStore;
419
+
420
+ yield* materialize(threadId, EPOCH_ONE);
421
+
422
+ const first = yield* append(
423
+ threadId,
424
+ batch("offset-batch-1", [
425
+ record("offset-record-1", "first"),
426
+ record("offset-record-2", "second"),
427
+ ]),
428
+ );
429
+
430
+ const second = yield* append(
431
+ threadId,
432
+ batch("offset-batch-2", [record("offset-record-3", "third")]),
433
+ first,
434
+ );
435
+
436
+ yield* append(
437
+ threadId,
438
+ batch("offset-batch-3", [record("offset-record-4", "fourth")]),
439
+ second,
440
+ );
441
+
442
+ const committed = yield* readAll(threadId);
443
+
444
+ yield* ensure(committed.length === 4, "All committed records must be readable");
445
+ const savedOffset = committed[1]?.offset;
446
+
447
+ yield* ensure(savedOffset !== undefined, "Committed records must carry observation offsets");
448
+ if (savedOffset === undefined) return;
449
+
450
+ const resumed = yield* store
451
+ .observe(ThreadObservation.make({ threadId, afterOffset: savedOffset }))
452
+ .pipe(Stream.take(2), Stream.runCollect);
453
+
454
+ yield* ensure(
455
+ resumed.map((envelope) => envelope.record.recordId).join(",") ===
456
+ committed
457
+ .slice(2)
458
+ .map((envelope) => envelope.record.recordId)
459
+ .join(","),
460
+ "Observation from a saved offset must deliver exactly the suffix in order",
461
+ );
462
+
463
+ const fromStart = yield* store
464
+ .observe(ThreadObservation.make({ threadId }))
465
+ .pipe(Stream.take(4), Stream.runCollect);
466
+
467
+ yield* ensure(
468
+ fromStart.map((envelope) => envelope.record.recordId).join(",") ===
469
+ committed.map((envelope) => envelope.record.recordId).join(","),
470
+ "Observation without an offset must deliver the full log in order",
471
+ );
472
+ }),
473
+ );
474
+
475
+ const checkpointBoundaries = conformanceCase(
476
+ "enforces checkpoint save and load boundary rules",
477
+ ({ ensure, expectFailure }) =>
478
+ Effect.gen(function* () {
479
+ const threadId = decodeThreadId("conformance-checkpoints");
480
+ const store = yield* ThreadStore;
481
+ const checkpoints = store.checkpoints;
482
+
483
+ if (checkpoints === undefined) {
484
+ return yield* ThreadStoreConformanceViolation.make({
485
+ caseName: "enforces checkpoint save and load boundary rules",
486
+ message: "The optional checkpoint suite requires checkpoint support",
487
+ });
488
+ }
489
+
490
+ const missing = [
491
+ yield* expectFailure(
492
+ "saving a checkpoint for an unmaterialized Thread",
493
+ checkpoints.save(
494
+ SaveCheckpointRequest.make({
495
+ checkpoint: checkpointAt(threadId, ZERO_SEQUENCE, EMPTY_TAIL_DIGEST),
496
+ }),
497
+ ),
498
+ ),
499
+ yield* expectFailure(
500
+ "loading a checkpoint for an unmaterialized Thread",
501
+ checkpoints.load(LoadCheckpointRequest.make({ threadId })),
502
+ ),
503
+ ];
504
+
505
+ yield* ensure(
506
+ missing.every(isThreadNotMaterialized),
507
+ "Checkpoints require a materialized Thread",
508
+ );
509
+ yield* materialize(threadId, EPOCH_ONE);
510
+
511
+ const first = yield* append(
512
+ threadId,
513
+ batch("checkpoint-batch-1", [record("checkpoint-record-1", "Kyoto")]),
514
+ );
515
+
516
+ const aheadOfTail = yield* expectFailure(
517
+ "a checkpoint claiming a sequence beyond the committed tail",
518
+ checkpoints.save(
519
+ SaveCheckpointRequest.make({
520
+ checkpoint: checkpointAt(
521
+ threadId,
522
+ decodeSequence(first.lastSequence + 1),
523
+ first.tailDigest,
524
+ ),
525
+ }),
526
+ ),
527
+ );
528
+
529
+ yield* ensure(
530
+ isCheckpointRejected(aheadOfTail) && aheadOfTail.reason === "ahead-of-tail",
531
+ "A checkpoint ahead of the tail must be rejected with reason ahead-of-tail",
532
+ );
533
+
534
+ const digestMismatch = yield* expectFailure(
535
+ "a checkpoint whose digest does not match the canonical chain",
536
+ checkpoints.save(
537
+ SaveCheckpointRequest.make({
538
+ checkpoint: checkpointAt(threadId, first.lastSequence, EMPTY_TAIL_DIGEST),
539
+ }),
540
+ ),
541
+ );
542
+
543
+ yield* ensure(
544
+ isCheckpointRejected(digestMismatch) && digestMismatch.reason === "digest-mismatch",
545
+ "A checkpoint with a mismatched digest must be rejected with reason digest-mismatch",
546
+ );
547
+ yield* ensure(
548
+ Option.isNone(yield* checkpoints.load(LoadCheckpointRequest.make({ threadId }))),
549
+ "Rejected checkpoints must not become loadable",
550
+ );
551
+
552
+ const valid = checkpointAt(threadId, first.lastSequence, first.tailDigest);
553
+
554
+ yield* checkpoints.save(SaveCheckpointRequest.make({ checkpoint: valid }));
555
+ yield* checkpoints.save(SaveCheckpointRequest.make({ checkpoint: valid }));
556
+
557
+ const loaded = yield* checkpoints.load(LoadCheckpointRequest.make({ threadId }));
558
+
559
+ yield* ensure(
560
+ Option.isSome(loaded) &&
561
+ loaded.value.throughSequence === first.lastSequence &&
562
+ loaded.value.tailDigest === first.tailDigest,
563
+ "A valid checkpoint must load bound to its canonical sequence and digest",
564
+ );
565
+
566
+ const beforeCheckpoint = yield* checkpoints.load(
567
+ LoadCheckpointRequest.make({ threadId, atOrBeforeSequence: ZERO_SEQUENCE }),
568
+ );
569
+
570
+ yield* ensure(
571
+ Option.isNone(beforeCheckpoint),
572
+ "Checkpoint lookup must respect the atOrBeforeSequence bound",
573
+ );
574
+
575
+ yield* append(
576
+ threadId,
577
+ batch("checkpoint-batch-2", [record("checkpoint-record-2", "Nara")]),
578
+ first,
579
+ );
580
+ const afterAppend = yield* checkpoints.load(LoadCheckpointRequest.make({ threadId }));
581
+
582
+ yield* ensure(
583
+ Option.isSome(afterAppend) && afterAppend.value.throughSequence === first.lastSequence,
584
+ "An older checkpoint must remain loadable after later appends",
585
+ );
586
+ }),
587
+ );
588
+
589
+ const tailInspection = conformanceCase(
590
+ "inspects the canonical tail so a resuming producer can compose its next append",
591
+ ({ ensure, expectFailure }) =>
592
+ Effect.gen(function* () {
593
+ const threadId = decodeThreadId("conformance-tail-inspection");
594
+ const store = yield* ThreadStore;
595
+
596
+ const missing = yield* expectFailure(
597
+ "inspecting the tail of an unmaterialized Thread",
598
+ store.inspectTail(ThreadTailRequest.make({ threadId })),
599
+ );
600
+
601
+ yield* ensure(
602
+ isThreadNotMaterialized(missing) && missing.threadId === threadId,
603
+ "Tail inspection of an unmaterialized Thread must fail as not materialized",
604
+ );
605
+
606
+ yield* materialize(threadId, EPOCH_ONE);
607
+ const empty = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));
608
+
609
+ yield* ensure(
610
+ empty.tailSequence === ZERO_SEQUENCE &&
611
+ empty.tailDigest === EMPTY_TAIL_DIGEST &&
612
+ empty.producerEpoch === EPOCH_ONE,
613
+ "An empty Thread must report the zero tail and its registered epoch",
614
+ );
615
+
616
+ const first = yield* append(
617
+ threadId,
618
+ batch("inspect-batch-1", [record("inspect-record-1", "first")]),
619
+ );
620
+
621
+ const afterAppend = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));
622
+
623
+ yield* ensure(
624
+ afterAppend.tailSequence === first.lastSequence &&
625
+ afterAppend.tailDigest === first.tailDigest,
626
+ "Tail inspection must match the latest AppendResult",
627
+ );
628
+
629
+ const resumed = yield* append(
630
+ threadId,
631
+ batch("inspect-batch-2", [record("inspect-record-2", "second")]),
632
+ { lastSequence: afterAppend.tailSequence, tailDigest: afterAppend.tailDigest },
633
+ afterAppend.producerEpoch,
634
+ );
635
+
636
+ yield* ensure(
637
+ resumed.firstSequence === afterAppend.tailSequence + 1,
638
+ "An append composed from the inspected tail must commit without exporting the log",
639
+ );
640
+
641
+ yield* materialize(threadId, EPOCH_TWO);
642
+ const afterTakeover = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));
643
+
644
+ yield* ensure(
645
+ afterTakeover.producerEpoch === EPOCH_TWO &&
646
+ afterTakeover.tailSequence === resumed.lastSequence,
647
+ "Tail inspection must reflect epoch takeover without disturbing the tail",
648
+ );
649
+ }),
650
+ );
651
+
652
+ const notMaterializedOperations = conformanceCase(
653
+ "fails every read and write against an unmaterialized Thread",
654
+ ({ ensure, expectFailure }) =>
655
+ Effect.gen(function* () {
656
+ const threadId = decodeThreadId("conformance-not-materialized");
657
+ const store = yield* ThreadStore;
658
+
659
+ const failures = [
660
+ yield* expectFailure(
661
+ "appending to an unmaterialized Thread",
662
+ append(threadId, batch("missing-batch-1", [record("missing-record-1", "first")])),
663
+ ),
664
+ yield* expectFailure("reading an unmaterialized Thread", readAll(threadId)),
665
+ yield* expectFailure(
666
+ "observing an unmaterialized Thread",
667
+ store
668
+ .observe(ThreadObservation.make({ threadId }))
669
+ .pipe(Stream.take(1), Stream.runCollect),
670
+ ),
671
+ yield* expectFailure(
672
+ "exporting an unmaterialized Thread",
673
+ store.export(ThreadExportRequest.make({ threadId })),
674
+ ),
675
+ yield* expectFailure(
676
+ "inspecting the tail of an unmaterialized Thread",
677
+ store.inspectTail(ThreadTailRequest.make({ threadId })),
678
+ ),
679
+ ];
680
+
681
+ yield* Effect.forEach(
682
+ failures,
683
+ (failure) =>
684
+ ensure(
685
+ isThreadNotMaterialized(failure) && failure.threadId === threadId,
686
+ "Operations against an unmaterialized Thread must fail as not materialized",
687
+ ),
688
+ { discard: true },
689
+ );
690
+ }),
691
+ );
692
+
693
+ /**
694
+ * The shared, adapter-parameterized ThreadStore contract suite (STORE-010). Every
695
+ * durable adapter test suite must execute each case against its own store provisioning.
696
+ */
697
+ export const threadStoreConformanceCases: ReadonlyArray<ThreadStoreConformanceCase> = [
698
+ atomicBatchVisibility,
699
+ idempotentReplay,
700
+ tailConflict,
701
+ producerFencing,
702
+ offsetResumability,
703
+ tailInspection,
704
+ notMaterializedOperations,
705
+ ];
706
+
707
+ /** Additional contract cases only for adapters advertising `ThreadStore.checkpoints`. */
708
+ export const threadCheckpointConformanceCases: ReadonlyArray<ThreadStoreConformanceCase> = [
709
+ checkpointBoundaries,
710
+ ];