effect-agent 0.1.0-beta.14 → 0.1.0-beta.142

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 (532) hide show
  1. package/dist/Admin-DGZXE5BU.d.mts +3237 -0
  2. package/dist/Agent-1DMSO_Fl.mjs +86 -0
  3. package/dist/Agent-1DMSO_Fl.mjs.map +1 -0
  4. package/dist/Agent-BWhD4Dvu.d.mts +255 -0
  5. package/dist/AgentError-Bn1ytXRD.d.mts +117 -0
  6. package/dist/AgentPolicy-BqDoSXO6.d.mts +96 -0
  7. package/dist/AgentRuntime-B4kIzmSF.d.mts +346 -0
  8. package/dist/AgentRuntime-xeCUXutN.mjs +4740 -0
  9. package/dist/AgentRuntime-xeCUXutN.mjs.map +1 -0
  10. package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
  11. package/dist/ContextCompactor-WwSIG_Z2.d.mts +161 -0
  12. package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
  13. package/dist/Digest-U69rDHuO.d.mts +22 -0
  14. package/dist/DurableAgentRuntime-DQXDcPKQ.mjs +7165 -0
  15. package/dist/DurableAgentRuntime-DQXDcPKQ.mjs.map +1 -0
  16. package/dist/DurableFailpoint-Cnr3wx1L.d.mts +41 -0
  17. package/dist/DurableStep-Cry_iol4.d.mts +103 -0
  18. package/dist/EventSource-Cg3IeJa6.d.mts +51 -0
  19. package/dist/FailureDiagnostic-BElLOoED.mjs +274 -0
  20. package/dist/FailureDiagnostic-BElLOoED.mjs.map +1 -0
  21. package/dist/FailureDiagnostic-CaAkzGHL.d.mts +223 -0
  22. package/dist/Identifiers-CN2s30fF.d.mts +40 -0
  23. package/dist/InMemory.d.mts +24 -0
  24. package/dist/InMemory.mjs +24 -0
  25. package/dist/InMemory.mjs.map +1 -0
  26. package/dist/MemoryNamespace-BbRW5p71.d.mts +36 -0
  27. package/dist/MemoryReference-B8Q3UJoJ.d.mts +79 -0
  28. package/dist/Messaging-Dkg87ebg.d.mts +221 -0
  29. package/dist/Messaging-Dnmk31yq.d.mts +1067 -0
  30. package/dist/MessagingHost-CajpPDPG.d.mts +74 -0
  31. package/dist/MessagingHost-DfsbMPvq.mjs +110 -0
  32. package/dist/MessagingHost-DfsbMPvq.mjs.map +1 -0
  33. package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
  34. package/dist/Output-DhtWbBcw.d.mts +25 -0
  35. package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
  36. package/dist/PreparedInputAdmission-CLvaruRe.d.mts +42 -0
  37. package/dist/Receipt-BAHyigAF.d.mts +33 -0
  38. package/dist/Records-B5GFWCpn.d.mts +1104 -0
  39. package/dist/RunEvent-DIrzkjLr.d.mts +460 -0
  40. package/dist/RunEventSink-D5aVhISG.d.mts +108 -0
  41. package/dist/RunJournal-Gd83HYqG.mjs +954 -0
  42. package/dist/RunJournal-Gd83HYqG.mjs.map +1 -0
  43. package/dist/RunOptions-IlEXLG5F.d.mts +935 -0
  44. package/dist/RunPolicyUsage-ClZxyR46.d.mts +21 -0
  45. package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
  46. package/dist/Schedule-CtYREFnz.d.mts +847 -0
  47. package/dist/Scheduling-DPb2QyAK.mjs +691 -0
  48. package/dist/Scheduling-DPb2QyAK.mjs.map +1 -0
  49. package/dist/Subagent-8RzJkqJ9.mjs +1502 -0
  50. package/dist/Subagent-8RzJkqJ9.mjs.map +1 -0
  51. package/dist/Subagent-Cl8D1mFM.d.mts +1652 -0
  52. package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
  53. package/dist/SubagentHost-B6f4PBC2.d.mts +172 -0
  54. package/dist/Subscription-_VTIVN8o.d.mts +979 -0
  55. package/dist/SubscriptionInput-BIH1f3Th.d.mts +41 -0
  56. package/dist/Thread-DOBQ0QUY.d.mts +96 -0
  57. package/dist/ThreadHistory-tS1KwxHR.d.mts +60 -0
  58. package/dist/ToolBroker-DWs4tZra.d.mts +133 -0
  59. package/dist/ToolExposure-9uF_Yo0T.mjs +10 -0
  60. package/dist/ToolExposure-9uF_Yo0T.mjs.map +1 -0
  61. package/dist/ToolExposure-C93U1sPu.mjs +30 -0
  62. package/dist/ToolExposure-C93U1sPu.mjs.map +1 -0
  63. package/dist/ToolExposure-UCN12eCd.d.mts +39 -0
  64. package/dist/ToolExposure-r2eOWk4F.d.mts +46 -0
  65. package/dist/ToolExposure.d.mts +8 -0
  66. package/dist/ToolExposure.mjs +21 -0
  67. package/dist/ToolExposure.mjs.map +1 -0
  68. package/dist/ToolReconciler-BmVRAHKs.d.mts +80 -0
  69. package/dist/ToolResult-BKdqWRff.d.mts +78 -0
  70. package/dist/Usage-Dx0aknfk.d.mts +121 -0
  71. package/dist/WakeScheduler-EjUF-GhC.d.mts +56 -0
  72. package/dist/Worker-CfwzMZEK.mjs +271 -0
  73. package/dist/Worker-CfwzMZEK.mjs.map +1 -0
  74. package/dist/Worker-fwWkBg12.d.mts +472 -0
  75. package/dist/agent-registration-CKNsrpwo.mjs +201 -0
  76. package/dist/agent-registration-CKNsrpwo.mjs.map +1 -0
  77. package/dist/capabilities/Approval.d.mts +114 -0
  78. package/dist/capabilities/Approval.mjs +226 -0
  79. package/dist/capabilities/Approval.mjs.map +1 -0
  80. package/dist/capabilities/Budget.d.mts +112 -0
  81. package/dist/capabilities/Budget.mjs +346 -0
  82. package/dist/capabilities/Budget.mjs.map +1 -0
  83. package/dist/capabilities/CodeMode.d.mts +157 -0
  84. package/dist/capabilities/CodeMode.mjs +523 -0
  85. package/dist/capabilities/CodeMode.mjs.map +1 -0
  86. package/dist/capabilities/Commands.d.mts +55 -0
  87. package/dist/capabilities/Commands.mjs +57 -0
  88. package/dist/capabilities/Commands.mjs.map +1 -0
  89. package/dist/capabilities/ContextTools.d.mts +321 -0
  90. package/dist/capabilities/ContextTools.mjs +126 -0
  91. package/dist/capabilities/ContextTools.mjs.map +1 -0
  92. package/dist/capabilities/Mcp.d.mts +108 -0
  93. package/dist/capabilities/Mcp.mjs +259 -0
  94. package/dist/capabilities/Mcp.mjs.map +1 -0
  95. package/dist/capabilities/McpClient.d.mts +115 -0
  96. package/dist/capabilities/McpClient.mjs +519 -0
  97. package/dist/capabilities/McpClient.mjs.map +1 -0
  98. package/dist/capabilities/MemoryNotes.d.mts +424 -0
  99. package/dist/capabilities/MemoryNotes.mjs +128 -0
  100. package/dist/capabilities/MemoryNotes.mjs.map +1 -0
  101. package/dist/capabilities/Messaging.d.mts +3 -0
  102. package/dist/capabilities/Messaging.mjs +152 -0
  103. package/dist/capabilities/Messaging.mjs.map +1 -0
  104. package/dist/capabilities/ModelContext.d.mts +89 -0
  105. package/dist/capabilities/ModelContext.mjs +168 -0
  106. package/dist/capabilities/ModelContext.mjs.map +1 -0
  107. package/dist/capabilities/Redaction.d.mts +37 -0
  108. package/dist/capabilities/Redaction.mjs +104 -0
  109. package/dist/capabilities/Redaction.mjs.map +1 -0
  110. package/dist/capabilities/Remembering.d.mts +434 -0
  111. package/dist/capabilities/Remembering.mjs +290 -0
  112. package/dist/capabilities/Remembering.mjs.map +1 -0
  113. package/dist/capabilities/RunHooks.d.mts +82 -0
  114. package/dist/capabilities/RunHooks.mjs +144 -0
  115. package/dist/capabilities/RunHooks.mjs.map +1 -0
  116. package/dist/capabilities/SemanticMemory.d.mts +431 -0
  117. package/dist/capabilities/SemanticMemory.mjs +315 -0
  118. package/dist/capabilities/SemanticMemory.mjs.map +1 -0
  119. package/dist/capabilities/Subagent.d.mts +4 -0
  120. package/dist/capabilities/Subagent.mjs +5 -0
  121. package/dist/capabilities/SubagentReservations.d.mts +186 -0
  122. package/dist/capabilities/SubagentReservations.mjs +479 -0
  123. package/dist/capabilities/SubagentReservations.mjs.map +1 -0
  124. package/dist/capabilities/ToolDiscovery.d.mts +124 -0
  125. package/dist/capabilities/ToolDiscovery.mjs +230 -0
  126. package/dist/capabilities/ToolDiscovery.mjs.map +1 -0
  127. package/dist/capabilities/WebCapture.d.mts +163 -0
  128. package/dist/capabilities/WebCapture.mjs +335 -0
  129. package/dist/capabilities/WebCapture.mjs.map +1 -0
  130. package/dist/capabilities/WebSearch.d.mts +71 -0
  131. package/dist/capabilities/WebSearch.mjs +115 -0
  132. package/dist/capabilities/WebSearch.mjs.map +1 -0
  133. package/dist/compaction-C2OTceKw.mjs +505 -0
  134. package/dist/compaction-C2OTceKw.mjs.map +1 -0
  135. package/dist/core/Agent.d.mts +2 -0
  136. package/dist/core/Agent.mjs +2 -0
  137. package/dist/core/AgentError.d.mts +2 -0
  138. package/dist/core/AgentError.mjs +134 -0
  139. package/dist/core/AgentError.mjs.map +1 -0
  140. package/dist/core/AgentPolicy.d.mts +2 -0
  141. package/dist/core/AgentPolicy.mjs +94 -0
  142. package/dist/core/AgentPolicy.mjs.map +1 -0
  143. package/dist/core/AgentUpdates.d.mts +2 -0
  144. package/dist/core/AgentUpdates.mjs +63 -0
  145. package/dist/core/AgentUpdates.mjs.map +1 -0
  146. package/dist/core/FailureDiagnostic.d.mts +2 -0
  147. package/dist/core/FailureDiagnostic.mjs +2 -0
  148. package/dist/core/IdGenerator.d.mts +26 -0
  149. package/dist/core/IdGenerator.mjs +27 -0
  150. package/dist/core/IdGenerator.mjs.map +1 -0
  151. package/dist/core/Identifiers.d.mts +2 -0
  152. package/dist/core/Identifiers.mjs +43 -0
  153. package/dist/core/Identifiers.mjs.map +1 -0
  154. package/dist/core/Memory.d.mts +57 -0
  155. package/dist/core/Memory.mjs +203 -0
  156. package/dist/core/Memory.mjs.map +1 -0
  157. package/dist/core/MemoryNamespace.d.mts +2 -0
  158. package/dist/core/MemoryNamespace.mjs +116 -0
  159. package/dist/core/MemoryNamespace.mjs.map +1 -0
  160. package/dist/core/MemoryReference.d.mts +2 -0
  161. package/dist/core/MemoryReference.mjs +109 -0
  162. package/dist/core/MemoryReference.mjs.map +1 -0
  163. package/dist/core/MemoryRevalidation.d.mts +65 -0
  164. package/dist/core/MemoryRevalidation.mjs +126 -0
  165. package/dist/core/MemoryRevalidation.mjs.map +1 -0
  166. package/dist/core/MemoryStore.d.mts +186 -0
  167. package/dist/core/MemoryStore.mjs +243 -0
  168. package/dist/core/MemoryStore.mjs.map +1 -0
  169. package/dist/core/Receipt.d.mts +2 -0
  170. package/dist/core/Receipt.mjs +36 -0
  171. package/dist/core/Receipt.mjs.map +1 -0
  172. package/dist/core/RememberingStore.d.mts +1562 -0
  173. package/dist/core/RememberingStore.mjs +190 -0
  174. package/dist/core/RememberingStore.mjs.map +1 -0
  175. package/dist/core/RunEvent.d.mts +2 -0
  176. package/dist/core/RunEvent.mjs +337 -0
  177. package/dist/core/RunEvent.mjs.map +1 -0
  178. package/dist/core/RunPolicyUsage.d.mts +2 -0
  179. package/dist/core/RunPolicyUsage.mjs +21 -0
  180. package/dist/core/RunPolicyUsage.mjs.map +1 -0
  181. package/dist/core/SemanticMemoryIndex.d.mts +826 -0
  182. package/dist/core/SemanticMemoryIndex.mjs +185 -0
  183. package/dist/core/SemanticMemoryIndex.mjs.map +1 -0
  184. package/dist/core/SemanticMemoryRevalidation.d.mts +45 -0
  185. package/dist/core/SemanticMemoryRevalidation.mjs +191 -0
  186. package/dist/core/SemanticMemoryRevalidation.mjs.map +1 -0
  187. package/dist/core/SubagentContract.d.mts +2 -0
  188. package/dist/core/SubagentContract.mjs +148 -0
  189. package/dist/core/SubagentContract.mjs.map +1 -0
  190. package/dist/core/Thread.d.mts +2 -0
  191. package/dist/core/Thread.mjs +250 -0
  192. package/dist/core/Thread.mjs.map +1 -0
  193. package/dist/core/ToolResult.d.mts +2 -0
  194. package/dist/core/ToolResult.mjs +156 -0
  195. package/dist/core/ToolResult.mjs.map +1 -0
  196. package/dist/core/Usage.d.mts +2 -0
  197. package/dist/core/Usage.mjs +319 -0
  198. package/dist/core/Usage.mjs.map +1 -0
  199. package/dist/core/Worker.d.mts +3 -0
  200. package/dist/core/Worker.mjs +3 -0
  201. package/dist/durable/ActivityStore.d.mts +116 -0
  202. package/dist/durable/ActivityStore.mjs +131 -0
  203. package/dist/durable/ActivityStore.mjs.map +1 -0
  204. package/dist/durable/Admin.d.mts +2 -0
  205. package/dist/durable/Admin.mjs +330 -0
  206. package/dist/durable/Admin.mjs.map +1 -0
  207. package/dist/durable/AgentRegistration.d.mts +2 -0
  208. package/dist/durable/AgentRegistration.mjs +14 -0
  209. package/dist/durable/AgentRegistration.mjs.map +1 -0
  210. package/dist/durable/Certification.d.mts +110 -0
  211. package/dist/durable/Certification.mjs +159 -0
  212. package/dist/durable/Certification.mjs.map +1 -0
  213. package/dist/durable/CommittedActivity.d.mts +64 -0
  214. package/dist/durable/CommittedActivity.mjs +159 -0
  215. package/dist/durable/CommittedActivity.mjs.map +1 -0
  216. package/dist/durable/Digest.d.mts +2 -0
  217. package/dist/durable/Digest.mjs +50 -0
  218. package/dist/durable/Digest.mjs.map +1 -0
  219. package/dist/durable/DurableAgentRuntime.d.mts +3 -0
  220. package/dist/durable/DurableAgentRuntime.mjs +3 -0
  221. package/dist/durable/DurableFailpoint.d.mts +2 -0
  222. package/dist/durable/DurableFailpoint.mjs +102 -0
  223. package/dist/durable/DurableFailpoint.mjs.map +1 -0
  224. package/dist/durable/DurableFailpointTestControl.d.mts +14 -0
  225. package/dist/durable/DurableFailpointTestControl.mjs +19 -0
  226. package/dist/durable/DurableFailpointTestControl.mjs.map +1 -0
  227. package/dist/durable/EventSource.d.mts +2 -0
  228. package/dist/durable/EventSource.mjs +65 -0
  229. package/dist/durable/EventSource.mjs.map +1 -0
  230. package/dist/durable/GitHubWorkflowSource.d.mts +185 -0
  231. package/dist/durable/GitHubWorkflowSource.mjs +209 -0
  232. package/dist/durable/GitHubWorkflowSource.mjs.map +1 -0
  233. package/dist/durable/MessageDelivery.d.mts +934 -0
  234. package/dist/durable/MessageDelivery.mjs +557 -0
  235. package/dist/durable/MessageDelivery.mjs.map +1 -0
  236. package/dist/durable/MessageDeliveryStoreConformance.d.mts +400 -0
  237. package/dist/durable/MessageDeliveryStoreConformance.mjs +270 -0
  238. package/dist/durable/MessageDeliveryStoreConformance.mjs.map +1 -0
  239. package/dist/durable/OperationAuthorizer.d.mts +2 -0
  240. package/dist/durable/OperationAuthorizer.mjs +70 -0
  241. package/dist/durable/OperationAuthorizer.mjs.map +1 -0
  242. package/dist/durable/PersistentHistory.d.mts +16 -0
  243. package/dist/durable/PersistentHistory.mjs +125 -0
  244. package/dist/durable/PersistentHistory.mjs.map +1 -0
  245. package/dist/durable/PreparedInputAdmission.d.mts +2 -0
  246. package/dist/durable/PreparedInputAdmission.mjs +38 -0
  247. package/dist/durable/PreparedInputAdmission.mjs.map +1 -0
  248. package/dist/durable/Records.d.mts +2 -0
  249. package/dist/durable/Records.mjs +858 -0
  250. package/dist/durable/Records.mjs.map +1 -0
  251. package/dist/durable/Recovery.d.mts +2 -0
  252. package/dist/durable/Recovery.mjs +739 -0
  253. package/dist/durable/Recovery.mjs.map +1 -0
  254. package/dist/durable/RunJournal.d.mts +2 -0
  255. package/dist/durable/RunJournal.mjs +2 -0
  256. package/dist/durable/Schedule.d.mts +2 -0
  257. package/dist/durable/Schedule.mjs +391 -0
  258. package/dist/durable/Schedule.mjs.map +1 -0
  259. package/dist/durable/ScheduleStoreConformance.d.mts +17 -0
  260. package/dist/durable/ScheduleStoreConformance.mjs +420 -0
  261. package/dist/durable/ScheduleStoreConformance.mjs.map +1 -0
  262. package/dist/durable/ScheduleTransition.d.mts +24 -0
  263. package/dist/durable/ScheduleTransition.mjs +180 -0
  264. package/dist/durable/ScheduleTransition.mjs.map +1 -0
  265. package/dist/durable/Scheduling.d.mts +55 -0
  266. package/dist/durable/Scheduling.mjs +2 -0
  267. package/dist/durable/SqlMemoryStore.d.mts +29 -0
  268. package/dist/durable/SqlMemoryStore.mjs +436 -0
  269. package/dist/durable/SqlMemoryStore.mjs.map +1 -0
  270. package/dist/durable/SubmissionLedger.d.mts +3 -0
  271. package/dist/durable/SubmissionLedger.mjs +986 -0
  272. package/dist/durable/SubmissionLedger.mjs.map +1 -0
  273. package/dist/durable/SubmissionLedgerConformance.d.mts +30 -0
  274. package/dist/durable/SubmissionLedgerConformance.mjs +2254 -0
  275. package/dist/durable/SubmissionLedgerConformance.mjs.map +1 -0
  276. package/dist/durable/SubmissionStatus.d.mts +2 -0
  277. package/dist/durable/SubmissionStatus.mjs +18 -0
  278. package/dist/durable/SubmissionStatus.mjs.map +1 -0
  279. package/dist/durable/Subscription.d.mts +2 -0
  280. package/dist/durable/Subscription.mjs +360 -0
  281. package/dist/durable/Subscription.mjs.map +1 -0
  282. package/dist/durable/SubscriptionInput.d.mts +2 -0
  283. package/dist/durable/SubscriptionInput.mjs +52 -0
  284. package/dist/durable/SubscriptionInput.mjs.map +1 -0
  285. package/dist/durable/SubscriptionStoreConformance.d.mts +16 -0
  286. package/dist/durable/SubscriptionStoreConformance.mjs +625 -0
  287. package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -0
  288. package/dist/durable/SubscriptionTools.d.mts +274 -0
  289. package/dist/durable/SubscriptionTools.mjs +190 -0
  290. package/dist/durable/SubscriptionTools.mjs.map +1 -0
  291. package/dist/durable/SubscriptionTransition.d.mts +21 -0
  292. package/dist/durable/SubscriptionTransition.mjs +148 -0
  293. package/dist/durable/SubscriptionTransition.mjs.map +1 -0
  294. package/dist/durable/Subscriptions.d.mts +74 -0
  295. package/dist/durable/Subscriptions.mjs +627 -0
  296. package/dist/durable/Subscriptions.mjs.map +1 -0
  297. package/dist/durable/ThreadContextHistory.d.mts +32 -0
  298. package/dist/durable/ThreadContextHistory.mjs +152 -0
  299. package/dist/durable/ThreadContextHistory.mjs.map +1 -0
  300. package/dist/durable/ThreadContextHistoryProjection.d.mts +60 -0
  301. package/dist/durable/ThreadContextHistoryProjection.mjs +149 -0
  302. package/dist/durable/ThreadContextHistoryProjection.mjs.map +1 -0
  303. package/dist/durable/ThreadInvariants.d.mts +77 -0
  304. package/dist/durable/ThreadInvariants.mjs +246 -0
  305. package/dist/durable/ThreadInvariants.mjs.map +1 -0
  306. package/dist/durable/ThreadProjection.d.mts +78 -0
  307. package/dist/durable/ThreadProjection.mjs +158 -0
  308. package/dist/durable/ThreadProjection.mjs.map +1 -0
  309. package/dist/durable/ThreadProjectionMaintenance.d.mts +49 -0
  310. package/dist/durable/ThreadProjectionMaintenance.mjs +33 -0
  311. package/dist/durable/ThreadProjectionMaintenance.mjs.map +1 -0
  312. package/dist/durable/ThreadStore.d.mts +2 -0
  313. package/dist/durable/ThreadStore.mjs +383 -0
  314. package/dist/durable/ThreadStore.mjs.map +1 -0
  315. package/dist/durable/ThreadStoreConformance.d.mts +28 -0
  316. package/dist/durable/ThreadStoreConformance.mjs +543 -0
  317. package/dist/durable/ThreadStoreConformance.mjs.map +1 -0
  318. package/dist/durable/ToolReconciler.d.mts +2 -0
  319. package/dist/durable/ToolReconciler.mjs +85 -0
  320. package/dist/durable/ToolReconciler.mjs.map +1 -0
  321. package/dist/durable/WakeScheduler.d.mts +2 -0
  322. package/dist/durable/WakeScheduler.mjs +85 -0
  323. package/dist/durable/WakeScheduler.mjs.map +1 -0
  324. package/dist/durable/WorkerHost.d.mts +136 -0
  325. package/dist/durable/WorkerHost.mjs +77 -0
  326. package/dist/durable/WorkerHost.mjs.map +1 -0
  327. package/dist/engine/AgentRuntime.d.mts +2 -0
  328. package/dist/engine/AgentRuntime.mjs +2 -0
  329. package/dist/engine/Compaction.d.mts +7 -0
  330. package/dist/engine/Compaction.mjs +16 -0
  331. package/dist/engine/Compaction.mjs.map +1 -0
  332. package/dist/engine/ContextCompactor.d.mts +2 -0
  333. package/dist/engine/ContextCompactor.mjs +119 -0
  334. package/dist/engine/ContextCompactor.mjs.map +1 -0
  335. package/dist/engine/ContextHistory.d.mts +65 -0
  336. package/dist/engine/ContextHistory.mjs +76 -0
  337. package/dist/engine/ContextHistory.mjs.map +1 -0
  338. package/dist/engine/ContextWindow.d.mts +2 -0
  339. package/dist/engine/ContextWindow.mjs +59 -0
  340. package/dist/engine/ContextWindow.mjs.map +1 -0
  341. package/dist/engine/DurableStep.d.mts +2 -0
  342. package/dist/engine/DurableStep.mjs +62 -0
  343. package/dist/engine/DurableStep.mjs.map +1 -0
  344. package/dist/engine/MessagingHost.d.mts +2 -0
  345. package/dist/engine/MessagingHost.mjs +2 -0
  346. package/dist/engine/Output.d.mts +2 -0
  347. package/dist/engine/Output.mjs +8 -0
  348. package/dist/engine/Output.mjs.map +1 -0
  349. package/dist/engine/RunEventSink.d.mts +2 -0
  350. package/dist/engine/RunEventSink.mjs +22 -0
  351. package/dist/engine/RunEventSink.mjs.map +1 -0
  352. package/dist/engine/RunOptions.d.mts +2 -0
  353. package/dist/engine/RunOptions.mjs +124 -0
  354. package/dist/engine/RunOptions.mjs.map +1 -0
  355. package/dist/engine/SubagentHost.d.mts +2 -0
  356. package/dist/engine/SubagentHost.mjs +76 -0
  357. package/dist/engine/SubagentHost.mjs.map +1 -0
  358. package/dist/engine/ThreadHistory.d.mts +2 -0
  359. package/dist/engine/ThreadHistory.mjs +67 -0
  360. package/dist/engine/ThreadHistory.mjs.map +1 -0
  361. package/dist/engine/ToolBroker.d.mts +2 -0
  362. package/dist/engine/ToolBroker.mjs +42 -0
  363. package/dist/engine/ToolBroker.mjs.map +1 -0
  364. package/dist/foreign-diagnostic-DBQ1XHKh.mjs +37 -0
  365. package/dist/foreign-diagnostic-DBQ1XHKh.mjs.map +1 -0
  366. package/dist/index.d.mts +91 -6
  367. package/dist/index.mjs +98 -6
  368. package/dist/output-contract-CANJJGA5.mjs +99 -0
  369. package/dist/output-contract-CANJJGA5.mjs.map +1 -0
  370. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  371. package/dist/sandbox/CodeExecutor.d.mts +194 -0
  372. package/dist/sandbox/CodeExecutor.mjs +278 -0
  373. package/dist/sandbox/CodeExecutor.mjs.map +1 -0
  374. package/dist/sandbox/InteractiveBrowser.d.mts +257 -0
  375. package/dist/sandbox/InteractiveBrowser.mjs +236 -0
  376. package/dist/sandbox/InteractiveBrowser.mjs.map +1 -0
  377. package/dist/sandbox/PageCapture.d.mts +2 -0
  378. package/dist/sandbox/PageCapture.mjs +450 -0
  379. package/dist/sandbox/PageCapture.mjs.map +1 -0
  380. package/dist/sandbox/PageCrawl.d.mts +88 -0
  381. package/dist/sandbox/PageCrawl.mjs +124 -0
  382. package/dist/sandbox/PageCrawl.mjs.map +1 -0
  383. package/dist/sandbox/PageScreenshot.d.mts +48 -0
  384. package/dist/sandbox/PageScreenshot.mjs +53 -0
  385. package/dist/sandbox/PageScreenshot.mjs.map +1 -0
  386. package/dist/sandbox/Sandbox.d.mts +2 -0
  387. package/dist/sandbox/Sandbox.mjs +208 -0
  388. package/dist/sandbox/Sandbox.mjs.map +1 -0
  389. package/dist/utf8-BYfhEkcj.mjs +11 -0
  390. package/dist/utf8-BYfhEkcj.mjs.map +1 -0
  391. package/dist/utf8-DchGZRBd.mjs +23 -0
  392. package/dist/utf8-DchGZRBd.mjs.map +1 -0
  393. package/package.json +1 -40
  394. package/src/InMemory.ts +19 -0
  395. package/src/ToolExposure.ts +2 -0
  396. package/src/capabilities/Approval.ts +352 -0
  397. package/src/capabilities/Budget.ts +536 -0
  398. package/src/capabilities/CodeMode.ts +1099 -0
  399. package/src/capabilities/Commands.ts +86 -0
  400. package/src/capabilities/ContextTools.ts +184 -0
  401. package/src/capabilities/Mcp.ts +426 -0
  402. package/src/capabilities/McpClient.ts +983 -0
  403. package/src/capabilities/MemoryNotes.ts +174 -0
  404. package/src/capabilities/Messaging.ts +261 -0
  405. package/src/capabilities/ModelContext.ts +354 -0
  406. package/src/capabilities/Redaction.ts +157 -0
  407. package/src/capabilities/Remembering.ts +550 -0
  408. package/src/capabilities/RunHooks.ts +280 -0
  409. package/src/capabilities/SemanticMemory.ts +447 -0
  410. package/src/capabilities/Subagent.ts +2489 -0
  411. package/src/capabilities/SubagentReservations.ts +850 -0
  412. package/src/capabilities/ToolDiscovery.ts +369 -0
  413. package/src/capabilities/WebCapture.ts +722 -0
  414. package/src/capabilities/WebSearch.ts +190 -0
  415. package/src/capabilities/internal/subagent-background.ts +1307 -0
  416. package/src/capabilities/internal/subagent-contract.ts +146 -0
  417. package/src/capabilities/internal/subagent-policy.ts +235 -0
  418. package/src/capabilities/internal/subagent-reporting.ts +136 -0
  419. package/src/capabilities/internal/utf8.ts +10 -0
  420. package/src/core/Agent.ts +605 -0
  421. package/src/core/AgentError.ts +172 -0
  422. package/src/core/AgentPolicy.ts +153 -0
  423. package/src/core/AgentUpdates.ts +100 -0
  424. package/src/core/FailureDiagnostic.ts +343 -0
  425. package/src/core/IdGenerator.ts +39 -0
  426. package/src/core/Identifiers.ts +48 -0
  427. package/src/core/Memory.ts +290 -0
  428. package/src/core/MemoryNamespace.ts +196 -0
  429. package/src/core/MemoryReference.ts +121 -0
  430. package/src/core/MemoryRevalidation.ts +185 -0
  431. package/src/core/MemoryStore.ts +368 -0
  432. package/src/core/Messaging.ts +72 -0
  433. package/src/core/Receipt.ts +42 -0
  434. package/src/core/RememberingStore.ts +300 -0
  435. package/src/core/RunEvent.ts +366 -0
  436. package/src/core/RunPolicyUsage.ts +17 -0
  437. package/src/core/SemanticMemoryIndex.ts +250 -0
  438. package/src/core/SemanticMemoryRevalidation.ts +254 -0
  439. package/src/core/SubagentContract.ts +196 -0
  440. package/src/core/Thread.ts +371 -0
  441. package/src/core/ToolExposure.ts +74 -0
  442. package/src/core/ToolResult.ts +190 -0
  443. package/src/core/Usage.ts +529 -0
  444. package/src/core/Worker.ts +240 -0
  445. package/src/core/internal/agent-updates.ts +34 -0
  446. package/src/core/internal/message-status.ts +60 -0
  447. package/src/core/internal/strict-schema.ts +14 -0
  448. package/src/core/internal/utf8.ts +23 -0
  449. package/src/durable/ActivityStore.ts +160 -0
  450. package/src/durable/Admin.ts +505 -0
  451. package/src/durable/AgentRegistration.ts +14 -0
  452. package/src/durable/Certification.ts +210 -0
  453. package/src/durable/CommittedActivity.ts +296 -0
  454. package/src/durable/Digest.ts +87 -0
  455. package/src/durable/DurableAgentRuntime.ts +11359 -0
  456. package/src/durable/DurableFailpoint.ts +111 -0
  457. package/src/durable/DurableFailpointTestControl.ts +39 -0
  458. package/src/durable/EventSource.ts +172 -0
  459. package/src/durable/GitHubWorkflowSource.ts +447 -0
  460. package/src/durable/MessageDelivery.ts +832 -0
  461. package/src/durable/MessageDeliveryStoreConformance.ts +410 -0
  462. package/src/durable/OperationAuthorizer.ts +85 -0
  463. package/src/durable/PersistentHistory.ts +260 -0
  464. package/src/durable/PreparedInputAdmission.ts +57 -0
  465. package/src/durable/Records.ts +1087 -0
  466. package/src/durable/Recovery.ts +1018 -0
  467. package/src/durable/RunJournal.ts +1695 -0
  468. package/src/durable/Schedule.ts +513 -0
  469. package/src/durable/ScheduleStoreConformance.ts +638 -0
  470. package/src/durable/ScheduleTransition.ts +265 -0
  471. package/src/durable/Scheduling.ts +1077 -0
  472. package/src/durable/SqlMemoryStore.ts +778 -0
  473. package/src/durable/SubmissionLedger.ts +1297 -0
  474. package/src/durable/SubmissionLedgerConformance.ts +4940 -0
  475. package/src/durable/SubmissionStatus.ts +14 -0
  476. package/src/durable/Subscription.ts +544 -0
  477. package/src/durable/SubscriptionInput.ts +144 -0
  478. package/src/durable/SubscriptionStoreConformance.ts +945 -0
  479. package/src/durable/SubscriptionTools.ts +327 -0
  480. package/src/durable/SubscriptionTransition.ts +302 -0
  481. package/src/durable/Subscriptions.ts +1210 -0
  482. package/src/durable/ThreadContextHistory.ts +227 -0
  483. package/src/durable/ThreadContextHistoryProjection.ts +216 -0
  484. package/src/durable/ThreadInvariants.ts +507 -0
  485. package/src/durable/ThreadProjection.ts +269 -0
  486. package/src/durable/ThreadProjectionMaintenance.ts +67 -0
  487. package/src/durable/ThreadStore.ts +635 -0
  488. package/src/durable/ThreadStoreConformance.ts +1296 -0
  489. package/src/durable/ToolReconciler.ts +109 -0
  490. package/src/durable/WakeScheduler.ts +134 -0
  491. package/src/durable/WorkerHost.ts +183 -0
  492. package/src/durable/internal/agent-registration.ts +587 -0
  493. package/src/durable/internal/agent-updates.ts +306 -0
  494. package/src/durable/internal/foreign-diagnostic.ts +47 -0
  495. package/src/durable/internal/journal-checkpoint.ts +104 -0
  496. package/src/durable/internal/journal-metadata.ts +124 -0
  497. package/src/durable/internal/message-status.ts +20 -0
  498. package/src/durable/internal/messaging-host.ts +637 -0
  499. package/src/durable/internal/schedule-time.ts +303 -0
  500. package/src/durable/internal/worker-host.ts +3159 -0
  501. package/src/durable/internal/worker-runtime.ts +9 -0
  502. package/src/engine/AgentRuntime.ts +37 -0
  503. package/src/engine/Compaction.ts +11 -0
  504. package/src/engine/ContextCompactor.ts +277 -0
  505. package/src/engine/ContextHistory.ts +73 -0
  506. package/src/engine/ContextWindow.ts +72 -0
  507. package/src/engine/DurableStep.ts +132 -0
  508. package/src/engine/MessagingHost.ts +110 -0
  509. package/src/engine/Output.ts +2 -0
  510. package/src/engine/RunEventSink.ts +132 -0
  511. package/src/engine/RunOptions.ts +1101 -0
  512. package/src/engine/SubagentHost.ts +239 -0
  513. package/src/engine/ThreadHistory.ts +120 -0
  514. package/src/engine/ToolBroker.ts +157 -0
  515. package/src/engine/ToolExposure.ts +48 -0
  516. package/src/engine/internal/agent-runtime.ts +10534 -0
  517. package/src/engine/internal/bounded-value.ts +315 -0
  518. package/src/engine/internal/compaction.ts +678 -0
  519. package/src/engine/internal/error-diagnostic.ts +39 -0
  520. package/src/engine/internal/output-contract.ts +191 -0
  521. package/src/engine/internal/primitive-delta.ts +80 -0
  522. package/src/engine/internal/provider-result-staging.ts +211 -0
  523. package/src/engine/internal/tool-derivative.ts +106 -0
  524. package/src/engine/internal/tool-exposure.ts +224 -0
  525. package/src/engine/internal/tool-telemetry.ts +484 -0
  526. package/src/index.ts +97 -22
  527. package/src/sandbox/CodeExecutor.ts +352 -0
  528. package/src/sandbox/InteractiveBrowser.ts +339 -0
  529. package/src/sandbox/PageCapture.ts +691 -0
  530. package/src/sandbox/PageCrawl.ts +148 -0
  531. package/src/sandbox/PageScreenshot.ts +81 -0
  532. package/src/sandbox/Sandbox.ts +241 -0
@@ -0,0 +1,1297 @@
1
+ import type { Option, Stream } from "effect";
2
+ import { Context, Duration, Effect, Schema } from "effect";
3
+
4
+ import { InputMessage } from "../capabilities/Messaging.ts";
5
+ import * as FailureDiagnostic from "../core/FailureDiagnostic.ts";
6
+ import {
7
+ AgentId,
8
+ AttemptId,
9
+ ThreadId,
10
+ ReceiptId,
11
+ SettlementId,
12
+ SubmissionId,
13
+ ToolCallId,
14
+ } from "../core/Identifiers.ts";
15
+ import type { JoinedToHost } from "../core/Receipt.ts";
16
+ import { IdempotencyKey, QueueSequence, Principal } from "../core/Receipt.ts";
17
+ import { RunUsageSummary } from "../core/Usage.ts";
18
+ import { AssignmentTerminal } from "../core/Worker.ts";
19
+ import {
20
+ AbortRequested,
21
+ ApprovalDecision,
22
+ BatchId,
23
+ CanonicalSequence,
24
+ DefinitionDigests,
25
+ DeploymentId,
26
+ Digest,
27
+ PersistedJson,
28
+ ProducerEpoch,
29
+ ProducerId,
30
+ RecordEnvelope,
31
+ RecordId,
32
+ SettlementFailureDiagnostic,
33
+ SettlementOutcome,
34
+ ToolApprovalDecided,
35
+ ToolCallResolved,
36
+ ToolCallUnknown,
37
+ WorkerAdmission,
38
+ } from "./Records.ts";
39
+
40
+ export { IdempotencyKey, JoinedToHost, QueueSequence, Principal } from "../core/Receipt.ts";
41
+
42
+ const identifier = <const Name extends string>(name: Name) =>
43
+ Schema.NonEmptyString.check(Schema.isMaxLength(256)).pipe(
44
+ Schema.brand(`@effect-agent/thread/${name}`),
45
+ );
46
+
47
+ /**
48
+ * Opaque proof that one Attempt currently owns a Submission's lane. It authorizes ledger
49
+ * mutations only; canonical-log fencing authority remains the producer epoch (DUR-006).
50
+ */
51
+ export const OwnershipToken = identifier("OwnershipToken");
52
+ export type OwnershipToken = typeof OwnershipToken.Type;
53
+
54
+ /**
55
+ * Ledger lifecycle states for one Submission. `settled` is the only terminal state; every other
56
+ * state carries an outstanding accepted-work obligation (Accepted-work Contract, DUR-002).
57
+ *
58
+ * Phase 5 states:
59
+ *
60
+ * - `joining` — a queued Submission claimed by an active host Run, before its canonical
61
+ * `UserInputRecorded` append; recovery reverts it to `ready` (DUR-016).
62
+ * - `joined` — the input is canonical and linked to its host; the Submission settles WITH the
63
+ * host Run's outcome.
64
+ * - `suspended` — durably waiting for explicit approval decisions; the ownership period has
65
+ * ended and the lane consumes no worker permit while the obligation stays owed.
66
+ * - `unknown` — at least one Tool Call has a durable Unknown Outcome; this Submission is
67
+ * parked until an authorized resolution covers every open call or a durable abort intent
68
+ * authorizes cleanup without Tool replay. Later eligible input may run (DUR-012/DUR-017).
69
+ *
70
+ * `claim` never grants or bypasses a `joining`, `joined`, or `suspended` head. It skips unknown
71
+ * work without an abort intent. Any live ownership in the Thread prevents another claim.
72
+ */
73
+ export const SubmissionState = Schema.Literals([
74
+ "admitted",
75
+ "ready",
76
+ "joining",
77
+ "joined",
78
+ "running",
79
+ "input-applied",
80
+ "suspended",
81
+ "unknown",
82
+ "terminalizing",
83
+ "settled",
84
+ ]);
85
+
86
+ export type SubmissionState = typeof SubmissionState.Type;
87
+
88
+ /**
89
+ * Opt-in host policy for handling the next runnable same-Agent input in its own Run at a complete Turn
90
+ * boundary. This never joins inputs or changes their principals, grants, or receipts. The
91
+ * runtime selects the ordered candidate; policy cannot select an arbitrary Submission.
92
+ * Approval waits, child waits and incomplete Tool batches are not handoff boundaries. Hosts
93
+ * retaining independent replies must also leave those inputs unclaimed by `claimJoining`.
94
+ * In-flight model requests and Tool batches run to their existing safe boundary.
95
+ */
96
+ export const SubmissionScheduling = Context.Reference<{
97
+ readonly yieldTo?: (request: {
98
+ readonly active: SubmissionSnapshot;
99
+ readonly next: SubmissionSnapshot;
100
+ }) => Effect.Effect<boolean, LedgerError>;
101
+ }>("@effect-agent/thread/SubmissionScheduling", { defaultValue: () => ({}) });
102
+
103
+ /**
104
+ * Default ownership lease duration (D5). The lease is a liveness hint that makes an abandoned
105
+ * claim reclaimable; correctness never depends on it because every canonical append is fenced by
106
+ * producer epoch. Adapters expose this as configuration and use this value when unconfigured.
107
+ */
108
+ export const DEFAULT_OWNERSHIP_LEASE_DURATION: Duration.Duration = Duration.seconds(30);
109
+
110
+ /**
111
+ * What a SubmissionLedger adapter claims about itself. `durable-node` asserts single-node
112
+ * process-crash durability (fsync-backed storage); `durable-cloudflare` asserts the same
113
+ * single-serialized-owner crash durability through Durable Object storage output gates;
114
+ * `non-durable` marks reference adapters whose state does not survive the process (in-memory
115
+ * conformance/test adapters). The label is an honest self-description for reports and
116
+ * evidence — no runtime behavior branches on it.
117
+ */
118
+ export class LedgerCapabilities extends Schema.Class<LedgerCapabilities>(
119
+ "@effect-agent/thread/LedgerCapabilities",
120
+ )({
121
+ durability: Schema.Literals(["durable-node", "durable-cloudflare", "non-durable"]),
122
+ }) {}
123
+
124
+ /**
125
+ * Immutable lineage from a child Submission to the exact parent Tool Call that established it
126
+ * (spec §12 step 5, SUB-004). Recorded once at admission and never rewritten; it is an
127
+ * identifier, not an authorization capability (D10) — the join path verifies the canonical
128
+ * Parent Link records, never this marker alone.
129
+ */
130
+ export class ParentLinkage extends Schema.Class<ParentLinkage>(
131
+ "@effect-agent/thread/ParentLinkage",
132
+ )({
133
+ parentSubmissionId: SubmissionId,
134
+ parentToolCallId: ToolCallId,
135
+ }) {}
136
+
137
+ /** Host-owned policy coordinates, interpreted only by the destination transaction owner. */
138
+ export const AdmissionFence = Schema.Struct({
139
+ policyId: Schema.NonEmptyString.check(Schema.isMaxLength(128)),
140
+ key: Schema.NonEmptyString.check(Schema.isMaxLength(256)),
141
+ revision: Schema.NonEmptyString.check(Schema.isMaxLength(256)),
142
+ });
143
+
144
+ export type AdmissionFence = typeof AdmissionFence.Type;
145
+ export const AdmissionGroup = Schema.NonEmptyString.check(Schema.isMaxLength(256));
146
+
147
+ /** Fresh admission alone may be refused; unavailability never proves non-admission. */
148
+ export class AdmissionPolicyError extends Schema.TaggedError<AdmissionPolicyError>()(
149
+ "AdmissionPolicyError",
150
+ {
151
+ reason: Schema.Literals(["refused", "unavailable", "occupied"]),
152
+ code: Schema.NonEmptyString.check(Schema.isMaxLength(128)),
153
+ cause: Schema.optionalKey(FailureDiagnostic.Value),
154
+ stack: Schema.optionalKey(Schema.String),
155
+ },
156
+ ) {}
157
+
158
+ /**
159
+ * Durable admission input. `inputDigest` must be the digest of the canonical JSON encoding of
160
+ * `inputPayload` (see `digestJson`); admission idempotency compares digests, never re-encodes.
161
+ * `agentId`/`agentDigests`/`deploymentId` are persisted so recovery can complete Thread
162
+ * materialization without the submitting client. `parentLinkage` is present exactly when the
163
+ * Submission is a durable attached child (spec §12); an admission replay must repeat the same
164
+ * linkage (or its absence) or fail with `AdmissionConflict`.
165
+ */
166
+ export class AdmissionRequest extends Schema.Class<AdmissionRequest>(
167
+ "@effect-agent/thread/AdmissionRequest",
168
+ )({
169
+ threadId: ThreadId,
170
+ principal: Principal,
171
+ idempotencyKey: IdempotencyKey,
172
+ agentId: AgentId,
173
+ agentDigests: DefinitionDigests,
174
+ deploymentId: DeploymentId,
175
+ inputPayload: PersistedJson,
176
+ inputDigest: Digest,
177
+ parentLinkage: Schema.optionalKey(ParentLinkage),
178
+ workerAdmission: Schema.optionalKey(WorkerAdmission),
179
+ messageAdmission: Schema.optionalKey(InputMessage),
180
+ admissionGroup: Schema.optionalKey(AdmissionGroup),
181
+ admissionFence: Schema.optionalKey(AdmissionFence),
182
+ }) {}
183
+
184
+ /**
185
+ * The committed admission row. `replayed` is true when an identical (thread, principal,
186
+ * idempotencyKey, inputDigest) admission already existed; the original identities are returned
187
+ * unchanged so a client retry resumes rather than duplicates (DUR-001).
188
+ */
189
+ export class AdmissionResult extends Schema.Class<AdmissionResult>(
190
+ "@effect-agent/thread/AdmissionResult",
191
+ )({
192
+ submissionId: SubmissionId,
193
+ receiptId: ReceiptId,
194
+ queueSequence: QueueSequence,
195
+ state: SubmissionState,
196
+ replayed: Schema.Boolean,
197
+ }) {}
198
+
199
+ export class MarkReadyRequest extends Schema.Class<MarkReadyRequest>(
200
+ "@effect-agent/thread/MarkReadyRequest",
201
+ )({
202
+ submissionId: SubmissionId,
203
+ }) {}
204
+
205
+ export class SubmissionLookupById extends Schema.TaggedClass<SubmissionLookupById>(
206
+ "@effect-agent/thread/SubmissionLookupById",
207
+ )("SubmissionLookupById", {
208
+ submissionId: SubmissionId,
209
+ }) {}
210
+
211
+ export class SubmissionLookupByKey extends Schema.TaggedClass<SubmissionLookupByKey>(
212
+ "@effect-agent/thread/SubmissionLookupByKey",
213
+ )("SubmissionLookupByKey", {
214
+ threadId: ThreadId,
215
+ principal: Principal,
216
+ idempotencyKey: IdempotencyKey,
217
+ }) {}
218
+
219
+ /** Lookup by Submission identity or by the scoped client idempotency key. */
220
+ export const SubmissionLookup = Schema.Union([SubmissionLookupById, SubmissionLookupByKey]);
221
+ export type SubmissionLookup = typeof SubmissionLookup.Type;
222
+
223
+ /**
224
+ * Control-only worklist entry. Discovery validates identities, ordering and state without
225
+ * decoding retained execution payloads. Hydrate only the selected Thread through `lookup`
226
+ * or `loadRecoverySnapshot`, inside its recovery failure boundary.
227
+ */
228
+ export class SubmissionWorkItem extends Schema.Class<SubmissionWorkItem>(
229
+ "@effect-agent/thread/SubmissionWorkItem",
230
+ )({
231
+ submissionId: SubmissionId,
232
+ threadId: ThreadId,
233
+ queueSequence: QueueSequence,
234
+ principal: Principal,
235
+ idempotencyKey: IdempotencyKey,
236
+ deploymentId: DeploymentId,
237
+ receiptId: ReceiptId,
238
+ state: SubmissionState,
239
+ }) {}
240
+
241
+ /** The full durable ledger view of one Submission. */
242
+ export class SubmissionSnapshot extends Schema.Class<SubmissionSnapshot>(
243
+ "@effect-agent/thread/SubmissionSnapshot",
244
+ )({
245
+ ...SubmissionWorkItem.fields,
246
+ agentId: AgentId,
247
+ agentDigests: DefinitionDigests,
248
+ inputPayload: PersistedJson,
249
+ inputDigest: Digest,
250
+ settledOutcome: Schema.optionalKey(SettlementOutcome),
251
+ createdAt: Schema.DateTimeUtcFromString,
252
+ readyAt: Schema.optionalKey(Schema.DateTimeUtcFromString),
253
+ admissionGroup: Schema.optionalKey(AdmissionGroup),
254
+ admissionFence: Schema.optionalKey(AdmissionFence),
255
+ parentLinkage: Schema.optionalKey(ParentLinkage),
256
+ workerAdmission: Schema.optionalKey(WorkerAdmission),
257
+ messageAdmission: Schema.optionalKey(InputMessage),
258
+ }) {}
259
+
260
+ /** Bounded native control facts. Canonical input/Run records remain ThreadStore-owned. */
261
+ export const WorkerLedgerState = Schema.Struct({
262
+ latest: Schema.NullOr(SubmissionSnapshot),
263
+ active: Schema.NullOr(SubmissionSnapshot),
264
+ stopped: Schema.Boolean,
265
+ terminal: Schema.optionalKey(AssignmentTerminal),
266
+ }).check(Schema.makeFilter((state) => state.terminal === undefined || state.stopped));
267
+
268
+ export type WorkerLedgerState = typeof WorkerLedgerState.Type;
269
+
270
+ /** The authoritative store proves the scoped idempotency key was never admitted (SUB-031). */
271
+ export class AdmissionNotAdmitted extends Schema.TaggedClass<AdmissionNotAdmitted>(
272
+ "@effect-agent/thread/AdmissionNotAdmitted",
273
+ )("NotAdmitted", {}) {}
274
+
275
+ /** The scoped idempotency key was admitted; the full Submission snapshot is authoritative. */
276
+ export class AdmissionAdmitted extends Schema.TaggedClass<AdmissionAdmitted>(
277
+ "@effect-agent/thread/AdmissionAdmitted",
278
+ )("Admitted", {
279
+ submission: SubmissionSnapshot,
280
+ }) {}
281
+
282
+ /**
283
+ * The adapter cannot currently prove admission or its absence (e.g. the authoritative child
284
+ * owner is unreachable on a partitioned platform). Callers wait and retry; an indeterminate
285
+ * answer NEVER permits a second admission attempt (SUB-031).
286
+ */
287
+ export class AdmissionIndeterminate extends Schema.TaggedClass<AdmissionIndeterminate>(
288
+ "@effect-agent/thread/AdmissionIndeterminate",
289
+ )("Indeterminate", {
290
+ reason: Schema.String.check(Schema.isMaxLength(4096)),
291
+ }) {}
292
+
293
+ /**
294
+ * The tri-state answer of `resolveAdmission` (spec §12: "absence from an eventually consistent
295
+ * projection is never proof"). Single strongly consistent stores derive `NotAdmitted`/`Admitted`
296
+ * from a direct lookup; only adapters that can genuinely fail to reach the authoritative owner
297
+ * answer `Indeterminate`.
298
+ */
299
+ export const AdmissionResolution = Schema.Union([
300
+ AdmissionNotAdmitted,
301
+ AdmissionAdmitted,
302
+ AdmissionIndeterminate,
303
+ ]);
304
+
305
+ export type AdmissionResolution = typeof AdmissionResolution.Type;
306
+
307
+ /**
308
+ * A trusted runtime's advisory handoff after committing a complete Turn and closing its
309
+ * Attempt. The epoch fences the observation; an intervening claim invalidates it. Deferred
310
+ * Runs retain their identities and obligations. Losing this hint resumes ordinary FIFO.
311
+ */
312
+ export class ClaimHandoff extends Schema.Class<ClaimHandoff>("@effect-agent/thread/ClaimHandoff")({
313
+ producerEpoch: ProducerEpoch,
314
+ deferredSubmissionIds: Schema.NonEmptyArray(SubmissionId),
315
+ submissionId: SubmissionId,
316
+ }) {}
317
+
318
+ export class ClaimRequest extends Schema.Class<ClaimRequest>("@effect-agent/thread/ClaimRequest")({
319
+ threadId: ThreadId,
320
+ producerId: ProducerId,
321
+ handoff: Schema.optionalKey(ClaimHandoff),
322
+ }) {}
323
+
324
+ /**
325
+ * One granted ownership period. `producerEpoch` is the fencing token for every canonical append
326
+ * this Attempt performs; `leaseExpiresAt` is when the claim becomes reclaimable unless renewed.
327
+ */
328
+ export class Claim extends Schema.Class<Claim>("@effect-agent/thread/Claim")({
329
+ submissionId: SubmissionId,
330
+ attemptId: AttemptId,
331
+ ownershipToken: OwnershipToken,
332
+ producerEpoch: ProducerEpoch,
333
+ leaseExpiresAt: Schema.DateTimeUtcFromString,
334
+ inputPayload: PersistedJson,
335
+ }) {}
336
+
337
+ export class RenewOwnershipRequest extends Schema.Class<RenewOwnershipRequest>(
338
+ "@effect-agent/thread/RenewOwnershipRequest",
339
+ )({
340
+ submissionId: SubmissionId,
341
+ ownershipToken: OwnershipToken,
342
+ }) {}
343
+
344
+ /**
345
+ * A renewed lease. Adapters MAY rotate the token; callers must use the returned token for every
346
+ * later ledger mutation.
347
+ */
348
+ export class OwnershipRenewal extends Schema.Class<OwnershipRenewal>(
349
+ "@effect-agent/thread/OwnershipRenewal",
350
+ )({
351
+ ownershipToken: OwnershipToken,
352
+ leaseExpiresAt: Schema.DateTimeUtcFromString,
353
+ }) {}
354
+
355
+ export class ReleaseOwnershipRequest extends Schema.Class<ReleaseOwnershipRequest>(
356
+ "@effect-agent/thread/ReleaseOwnershipRequest",
357
+ )({
358
+ submissionId: SubmissionId,
359
+ ownershipToken: OwnershipToken,
360
+ }) {}
361
+
362
+ /**
363
+ * The canonical position of the applied `UserInputRecorded` record for one Submission.
364
+ */
365
+ export class MarkInputAppliedRequest extends Schema.Class<MarkInputAppliedRequest>(
366
+ "@effect-agent/thread/MarkInputAppliedRequest",
367
+ )({
368
+ submissionId: SubmissionId,
369
+ ownershipToken: OwnershipToken,
370
+ recordId: RecordId,
371
+ sequence: CanonicalSequence,
372
+ }) {}
373
+
374
+ export class InputAppliedMarker extends Schema.Class<InputAppliedMarker>(
375
+ "@effect-agent/thread/InputAppliedMarker",
376
+ )({
377
+ recordId: RecordId,
378
+ sequence: CanonicalSequence,
379
+ }) {}
380
+
381
+ /**
382
+ * Reservation of the single exact settlement record for one Submission (DUR-011). `record` is
383
+ * the complete canonical envelope that will be appended — including `createdAt` — so a recovering
384
+ * Attempt can re-append byte-identical content without a batch-digest conflict. `recordDigest`
385
+ * must be the digest of the canonical JSON encoding of the Schema-encoded envelope.
386
+ */
387
+ export class SettlementReservation extends Schema.Class<SettlementReservation>(
388
+ "@effect-agent/thread/SettlementReservation",
389
+ )({
390
+ submissionId: SubmissionId,
391
+ ownershipToken: OwnershipToken,
392
+ settlementId: SettlementId,
393
+ outcome: SettlementOutcome,
394
+ record: RecordEnvelope,
395
+ recordDigest: Digest,
396
+ }) {}
397
+
398
+ /**
399
+ * The committed reservation. `replayed` is true when an identical reservation already existed;
400
+ * the stored exact record is returned so recovery appends precisely what was reserved.
401
+ */
402
+ export class ReservedSettlement extends Schema.Class<ReservedSettlement>(
403
+ "@effect-agent/thread/ReservedSettlement",
404
+ )({
405
+ submissionId: SubmissionId,
406
+ settlementId: SettlementId,
407
+ outcome: SettlementOutcome,
408
+ record: RecordEnvelope,
409
+ recordDigest: Digest,
410
+ replayed: Schema.Boolean,
411
+ }) {}
412
+
413
+ export class SettlementFinalization extends Schema.Class<SettlementFinalization>(
414
+ "@effect-agent/thread/SettlementFinalization",
415
+ )({
416
+ submissionId: SubmissionId,
417
+ settlementId: SettlementId,
418
+ }) {}
419
+
420
+ const SettlementFields = Schema.Struct({
421
+ submissionId: SubmissionId,
422
+ settlementId: SettlementId,
423
+ receiptId: ReceiptId,
424
+ outcome: SettlementOutcome,
425
+ /** Schema-encoded application disposition materialized from the exact canonical reservation. */
426
+ runDisposition: Schema.optionalKey(PersistedJson),
427
+ /** Canonical aggregate of model usage and estimated spend for this Run. */
428
+ usageSummary: Schema.optionalKey(RunUsageSummary),
429
+ /** Present exactly for `failed`; its Schema rejects excess keys before canonical projection. */
430
+ failure: Schema.optionalKey(SettlementFailureDiagnostic),
431
+ settledAt: Schema.DateTimeUtcFromString,
432
+ }).check(
433
+ Schema.makeFilter(
434
+ (settlement) => (settlement.outcome === "failed") === (settlement.failure !== undefined),
435
+ { title: "failure exactly on a failed Settlement" },
436
+ ),
437
+ );
438
+
439
+ /** The single durable terminal outcome recorded for one accepted Submission (DUR-002). */
440
+ export class Settlement extends Schema.Class<Settlement>("@effect-agent/thread/Settlement")(
441
+ SettlementFields,
442
+ ) {}
443
+
444
+ /**
445
+ * Project the bounded failed-settlement diagnostic from an already Schema-validated exact
446
+ * reservation. Storage adapters use this when materializing their operational Settlement value;
447
+ * the canonical record remains the authority.
448
+ */
449
+ export const settlementFailureFromRecord = (
450
+ record: RecordEnvelope,
451
+ ): SettlementFailureDiagnostic | undefined => {
452
+ const payload = record.payload;
453
+
454
+ return payload._tag === "SubmissionSettled" && payload.outcome === "failed"
455
+ ? payload.result
456
+ : undefined;
457
+ };
458
+
459
+ /**
460
+ * Assignment intent derived only from frozen admission and exact settlement evidence.
461
+ * Joined receipts and cancellation before a Run starts do not finish an assignment.
462
+ * Adapters suppress completed intent when newer accepted input remains unapplied, then
463
+ * install the first seal and outstanding abort intents atomically before releasing the lane.
464
+ */
465
+ export const workerTerminalFromRecord = (
466
+ submission: SubmissionSnapshot,
467
+ record: RecordEnvelope,
468
+ ): AssignmentTerminal | undefined => {
469
+ const payload = record.payload;
470
+
471
+ if (
472
+ submission.workerAdmission?.origin.lifecycle !== "assignment" ||
473
+ payload._tag !== "SubmissionSettled" ||
474
+ (payload.runId !== undefined && payload.runId !== `run:${submission.submissionId}`)
475
+ )
476
+ return undefined;
477
+ if (payload.outcome === "failed" || payload.finishReason === "budget-exhausted") return "failed";
478
+ if (payload.outcome === "aborted") return payload.runId === undefined ? undefined : "cancelled";
479
+
480
+ return payload.runDisposition === "completed" ? "completed" : undefined;
481
+ };
482
+
483
+ /** Destination-owned permanent inbox seal; recorded atomically with all outstanding abort intents. */
484
+ export const WorkerStopCommand = Schema.Struct({
485
+ threadId: ThreadId,
486
+ author: Principal,
487
+ });
488
+
489
+ export type WorkerStopCommand = typeof WorkerStopCommand.Type;
490
+
491
+ /**
492
+ * A durable abort command (durability §13). Field bounds are exactly those of the canonical
493
+ * `AbortRequested` payload so the intent can become canonical without re-validation.
494
+ */
495
+ export class AbortCommand extends Schema.Class<AbortCommand>("@effect-agent/thread/AbortCommand")({
496
+ submissionId: SubmissionId,
497
+ author: AbortRequested.fields.author,
498
+ reason: AbortRequested.fields.reason,
499
+ }) {}
500
+
501
+ /**
502
+ * The recorded abort intent. `canonicalRecordId` is present once the corresponding canonical
503
+ * `AbortRequested` record has been appended (its identity is deterministic; see
504
+ * `submissionAbortRecordId`).
505
+ */
506
+ export class AbortIntent extends Schema.Class<AbortIntent>("@effect-agent/thread/AbortIntent")({
507
+ submissionId: SubmissionId,
508
+ author: AbortRequested.fields.author,
509
+ reason: AbortRequested.fields.reason,
510
+ requestedAt: Schema.DateTimeUtcFromString,
511
+ canonicalRecordId: Schema.optionalKey(RecordId),
512
+ }) {}
513
+
514
+ /** Address one lane-local abort intent without loading unrelated recovery state. */
515
+ export class AbortIntentRequest extends Schema.Class<AbortIntentRequest>(
516
+ "@effect-agent/thread/AbortIntentRequest",
517
+ )({ submissionId: SubmissionId }) {}
518
+
519
+ /**
520
+ * Atomic claim of the contiguous ready prefix of strictly-later queued Submissions for joining
521
+ * into the active host Run (plan §2.5). Fenced by the host Attempt's ownership token — no epoch
522
+ * bump, the host already owns the lane. An `admitted`-but-not-`ready` row breaks the prefix;
523
+ * an aborted-settled row is a closed obligation and is skipped as a non-gap (P7 §7(c)).
524
+ */
525
+ export class ClaimJoiningRequest extends Schema.Class<ClaimJoiningRequest>(
526
+ "@effect-agent/thread/ClaimJoiningRequest",
527
+ )({
528
+ threadId: ThreadId,
529
+ hostSubmissionId: SubmissionId,
530
+ ownershipToken: OwnershipToken,
531
+ maxCount: Schema.Int.check(Schema.isGreaterThan(0)),
532
+ }) {}
533
+
534
+ /** One queued Submission transitioned to `joining` under the host's ownership. */
535
+ export class JoiningClaim extends Schema.Class<JoiningClaim>("@effect-agent/thread/JoiningClaim")({
536
+ submissionId: SubmissionId,
537
+ queueSequence: QueueSequence,
538
+ inputPayload: PersistedJson,
539
+ }) {}
540
+
541
+ /**
542
+ * The canonical position of one joined Submission's `UserInputRecorded` record (`input:{sid}`).
543
+ * Marking transitions `joining → joined` and records the host linkage established at claim time.
544
+ */
545
+ export class MarkJoinedRequest extends Schema.Class<MarkJoinedRequest>(
546
+ "@effect-agent/thread/MarkJoinedRequest",
547
+ )({
548
+ submissionId: SubmissionId,
549
+ ownershipToken: OwnershipToken,
550
+ recordId: RecordId,
551
+ sequence: CanonicalSequence,
552
+ }) {}
553
+
554
+ /**
555
+ * Recovery-only revert of a `joining` Submission whose canonical input append never committed
556
+ * (DUR-016): `joining → ready`, idempotent, a no-op when the Submission already joined.
557
+ */
558
+ export class RevertJoiningRequest extends Schema.Class<RevertJoiningRequest>(
559
+ "@effect-agent/thread/RevertJoiningRequest",
560
+ )({
561
+ submissionId: SubmissionId,
562
+ }) {}
563
+
564
+ /**
565
+ * Why one Submission is durably suspended. Approval was the only Phase 5 reason; S2 adds
566
+ * `WaitingForChild` (spec §12 step 10) and the union keeps later suspension families (e.g.
567
+ * operator quarantine) additive.
568
+ */
569
+ export class ApprovalPendingSuspension extends Schema.TaggedClass<ApprovalPendingSuspension>(
570
+ "@effect-agent/thread/ApprovalPendingSuspension",
571
+ )("ApprovalPending", {
572
+ toolCallIds: Schema.NonEmptyArray(ToolCallId),
573
+ }) {}
574
+
575
+ /** One attached child a `waitingForChild` parent is durably waiting on (spec §12 step 10). */
576
+ export class WaitingChild extends Schema.Class<WaitingChild>("@effect-agent/thread/WaitingChild")({
577
+ toolCallId: ToolCallId,
578
+ childSubmissionId: SubmissionId,
579
+ }) {}
580
+
581
+ /**
582
+ * The parent Attempt ended without settling because attached durable children must settle and
583
+ * join first (spec §12 step 10, SUB-030). The suspended lane holds no worker permit; each listed
584
+ * child settles on its own Thread lane and `recordChildSettled` wakes the parent once
585
+ * every listed child is settled.
586
+ */
587
+ export class WaitingForChildSuspension extends Schema.TaggedClass<WaitingForChildSuspension>(
588
+ "@effect-agent/thread/WaitingForChildSuspension",
589
+ )("WaitingForChild", {
590
+ children: Schema.NonEmptyArray(WaitingChild),
591
+ }) {}
592
+
593
+ export const SuspensionReason = Schema.Union([
594
+ ApprovalPendingSuspension,
595
+ WaitingForChildSuspension,
596
+ ]);
597
+
598
+ export type SuspensionReason = typeof SuspensionReason.Type;
599
+
600
+ /**
601
+ * Durable suspension of owned work (plan §2.6): `input-applied`/`running` → `suspended`, the
602
+ * ownership period ends, NO settlement occurs — the accepted-work obligation stays owed while
603
+ * the lane consumes no worker permit.
604
+ */
605
+ export class SuspendRequest extends Schema.Class<SuspendRequest>(
606
+ "@effect-agent/thread/SuspendRequest",
607
+ )({
608
+ submissionId: SubmissionId,
609
+ ownershipToken: OwnershipToken,
610
+ reason: SuspensionReason,
611
+ }) {}
612
+
613
+ /**
614
+ * `suspended` when the lane is now durably waiting; `resume-immediately` when the suspension
615
+ * reason is already fully covered (a covering decision or child settlement raced ahead of the
616
+ * suspend transaction), so the caller resumes without releasing the lane.
617
+ */
618
+ export const SuspensionOutcome = Schema.Literals(["suspended", "resume-immediately"]);
619
+ export type SuspensionOutcome = typeof SuspensionOutcome.Type;
620
+
621
+ /**
622
+ * A durable child-settlement notification for one waitingForChild parent (spec §12 step 10).
623
+ * The child's canonical Settlement is the authority; this command only drives the parent lane's
624
+ * wake transition.
625
+ */
626
+ export class ChildSettledNotification extends Schema.Class<ChildSettledNotification>(
627
+ "@effect-agent/thread/ChildSettledNotification",
628
+ )({
629
+ parentSubmissionId: SubmissionId,
630
+ childSubmissionId: SubmissionId,
631
+ }) {}
632
+
633
+ /**
634
+ * `woken` when this notification completed the waiting set and the parent transitioned
635
+ * `suspended(WaitingForChild) → input-applied`; `still-waiting` while other listed children are
636
+ * unsettled; `not-waiting` when the parent is not (or no longer) suspended waiting on this
637
+ * child — including replays after a wake, so the operation is idempotent.
638
+ */
639
+ export const ChildSettledOutcome = Schema.Literals(["woken", "still-waiting", "not-waiting"]);
640
+ export type ChildSettledOutcome = typeof ChildSettledOutcome.Type;
641
+
642
+ /** Parent-owned child budget reservation identity, deterministically derived by the
643
+ * coordinator from the parent Run and Tool Call identity (spec §12 step 2). */
644
+ export const ChildReservationId = identifier("ChildReservationId");
645
+ export type ChildReservationId = typeof ChildReservationId.Type;
646
+
647
+ /**
648
+ * The reservation state machine (spec §12 steps 2 and 6): `reserved` while the child may still
649
+ * consume the allocation, `releasePending` once the final accounting decision is frozen, and
650
+ * `released` after the unused allocation returned exactly once.
651
+ */
652
+ export const ChildReservationStatus = Schema.Literals(["reserved", "releasePending", "released"]);
653
+ export type ChildReservationStatus = typeof ChildReservationStatus.Type;
654
+
655
+ /**
656
+ * Creation input for one parent-owned child budget reservation. The allocation is an opaque
657
+ * Schema-encoded budget document (D8: adapters implement transitions only and never interpret
658
+ * budget dimensions); `allocationDigest` must be the digest of its canonical JSON encoding.
659
+ */
660
+ export class ChildBudgetReservationRequest extends Schema.Class<ChildBudgetReservationRequest>(
661
+ "@effect-agent/thread/ChildBudgetReservationRequest",
662
+ )({
663
+ reservationId: ChildReservationId,
664
+ parentSubmissionId: SubmissionId,
665
+ parentToolCallId: ToolCallId,
666
+ ownershipToken: OwnershipToken,
667
+ allocation: PersistedJson,
668
+ allocationDigest: Digest,
669
+ }) {}
670
+
671
+ /** One child budget reservation row as the port exposes it. */
672
+ export class ChildBudgetReservationSnapshot extends Schema.Class<ChildBudgetReservationSnapshot>(
673
+ "@effect-agent/thread/ChildBudgetReservationSnapshot",
674
+ )({
675
+ reservationId: ChildReservationId,
676
+ parentSubmissionId: SubmissionId,
677
+ parentToolCallId: ToolCallId,
678
+ childSubmissionId: Schema.optionalKey(SubmissionId),
679
+ status: ChildReservationStatus,
680
+ allocation: PersistedJson,
681
+ allocationDigest: Digest,
682
+ accounting: Schema.optionalKey(PersistedJson),
683
+ reservedAt: Schema.DateTimeUtcFromString,
684
+ releaseBeganAt: Schema.optionalKey(Schema.DateTimeUtcFromString),
685
+ releasedAt: Schema.optionalKey(Schema.DateTimeUtcFromString),
686
+ }) {}
687
+
688
+ /**
689
+ * The committed reservation. `replayed` is true when an identical reservation already existed;
690
+ * the stored row is returned unchanged so a recovering caller resumes rather than duplicates
691
+ * (SUB-016).
692
+ */
693
+ export class ReservedChildBudget extends Schema.Class<ReservedChildBudget>(
694
+ "@effect-agent/thread/ReservedChildBudget",
695
+ )({
696
+ reservation: ChildBudgetReservationSnapshot,
697
+ replayed: Schema.Boolean,
698
+ }) {}
699
+
700
+ /** Records the admitted child on its reservation row (repairable from `SubagentStarted`). */
701
+ export class AttachChildToReservationRequest extends Schema.Class<AttachChildToReservationRequest>(
702
+ "@effect-agent/thread/AttachChildToReservationRequest",
703
+ )({
704
+ reservationId: ChildReservationId,
705
+ ownershipToken: OwnershipToken,
706
+ childSubmissionId: SubmissionId,
707
+ }) {}
708
+
709
+ /**
710
+ * Freezes the final consumed/released accounting decision (spec §12 join step 6). The
711
+ * accounting is an opaque Schema-encoded document replayed from the canonical `SubagentJoined`
712
+ * record (or the deterministic zero-consumed decision for an orphaned reservation), so the
713
+ * decision itself authorizes the transition — no ownership token is consulted (DUR-015).
714
+ */
715
+ export class BeginChildBudgetReleaseRequest extends Schema.Class<BeginChildBudgetReleaseRequest>(
716
+ "@effect-agent/thread/BeginChildBudgetReleaseRequest",
717
+ )({
718
+ reservationId: ChildReservationId,
719
+ accounting: PersistedJson,
720
+ }) {}
721
+
722
+ /** Applies the frozen accounting decision: `releasePending → released`, exactly once. */
723
+ export class ReleaseChildBudgetRequest extends Schema.Class<ReleaseChildBudgetRequest>(
724
+ "@effect-agent/thread/ReleaseChildBudgetRequest",
725
+ )({
726
+ reservationId: ChildReservationId,
727
+ }) {}
728
+
729
+ /**
730
+ * A durable approval decision command (plan §2.6, `abort`-shaped). Field bounds are exactly those
731
+ * of the canonical `ToolApprovalDecided` payload so the intent can become canonical without
732
+ * re-validation.
733
+ */
734
+ export class ApprovalDecisionCommand extends Schema.Class<ApprovalDecisionCommand>(
735
+ "@effect-agent/thread/ApprovalDecisionCommand",
736
+ )({
737
+ submissionId: SubmissionId,
738
+ toolCallId: ToolCallId,
739
+ decision: ApprovalDecision,
740
+ resolver: ToolApprovalDecided.fields.resolver,
741
+ reason: ToolApprovalDecided.fields.reason,
742
+ }) {}
743
+
744
+ /**
745
+ * The recorded approval-decision intent, idempotent per `(submissionId, toolCallId)`.
746
+ * `canonicalRecordId` is present once the corresponding canonical `ToolApprovalDecided` record
747
+ * has been appended (see `toolApprovalDecisionRecordId`).
748
+ */
749
+ export class ApprovalDecisionIntent extends Schema.Class<ApprovalDecisionIntent>(
750
+ "@effect-agent/thread/ApprovalDecisionIntent",
751
+ )({
752
+ submissionId: SubmissionId,
753
+ toolCallId: ToolCallId,
754
+ decision: ApprovalDecision,
755
+ resolver: ToolApprovalDecided.fields.resolver,
756
+ reason: ToolApprovalDecided.fields.reason,
757
+ decidedAt: Schema.DateTimeUtcFromString,
758
+ canonicalRecordId: Schema.optionalKey(RecordId),
759
+ }) {}
760
+
761
+ /**
762
+ * Durable Unknown marking for one Submission's open ordinary Tool Calls (DUR-009): state →
763
+ * `unknown`, parking that Submission without changing ownership or the Thread epoch. Idempotent.
764
+ */
765
+ export class MarkUnknownRequest extends Schema.Class<MarkUnknownRequest>(
766
+ "@effect-agent/thread/MarkUnknownRequest",
767
+ )({
768
+ submissionId: SubmissionId,
769
+ toolCallIds: Schema.NonEmptyArray(ToolCallId),
770
+ reason: ToolCallUnknown.fields.reason,
771
+ }) {}
772
+
773
+ /** The recovered supplier truth: the external effect completed with this exact result. */
774
+ export class ResolutionCompletedWithResult extends Schema.TaggedClass<ResolutionCompletedWithResult>(
775
+ "@effect-agent/thread/ResolutionCompletedWithResult",
776
+ )("CompletedWithResult", {
777
+ result: PersistedJson,
778
+ isFailure: Schema.Boolean,
779
+ }) {}
780
+
781
+ /** The external effect provably never happened; the call may re-execute on resume. */
782
+ export class ResolutionNeverHappened extends Schema.TaggedClass<ResolutionNeverHappened>(
783
+ "@effect-agent/thread/ResolutionNeverHappened",
784
+ )("NeverHappened", {}) {}
785
+
786
+ /** The call is safe to repeat under the external system's idempotency contract. */
787
+ export class ResolutionSafeToRetry extends Schema.TaggedClass<ResolutionSafeToRetry>(
788
+ "@effect-agent/thread/ResolutionSafeToRetry",
789
+ )("SafeToRetry", {}) {}
790
+
791
+ /** Give up on the Submission: route into the abort path (unknown calls stay recorded; abort
792
+ * never claims external rollback, durability §13). */
793
+ export class ResolutionAbortSubmission extends Schema.TaggedClass<ResolutionAbortSubmission>(
794
+ "@effect-agent/thread/ResolutionAbortSubmission",
795
+ )("AbortSubmission", {}) {}
796
+
797
+ /** How an authorized resolver closed one Unknown Outcome (DUR-017). */
798
+ export const UnknownResolution = Schema.Union([
799
+ ResolutionCompletedWithResult,
800
+ ResolutionNeverHappened,
801
+ ResolutionSafeToRetry,
802
+ ResolutionAbortSubmission,
803
+ ]);
804
+
805
+ export type UnknownResolution = typeof UnknownResolution.Type;
806
+
807
+ /**
808
+ * A durable Unknown-Outcome resolution command (DUR-017, `abort`-shaped). Possession of the
809
+ * runtime service plus the mandatory `author`/`reason` audit fields is the Phase 5 authorization
810
+ * boundary — identical to `abort`; the authenticated operator surface is a P7 deliverable.
811
+ * Field bounds are exactly those of the canonical `ToolCallResolved` payload.
812
+ */
813
+ export class UnknownResolutionCommand extends Schema.Class<UnknownResolutionCommand>(
814
+ "@effect-agent/thread/UnknownResolutionCommand",
815
+ )({
816
+ submissionId: SubmissionId,
817
+ toolCallId: ToolCallId,
818
+ author: ToolCallResolved.fields.author,
819
+ reason: ToolCallResolved.fields.reason,
820
+ resolution: UnknownResolution,
821
+ }) {}
822
+
823
+ /**
824
+ * The recorded resolution intent, idempotent per `(submissionId, toolCallId)`. The canonical
825
+ * `ToolCallResolved` (+ `ToolCallSettled` for `CompletedWithResult`) is appended by the recovery
826
+ * pass or the next owning Attempt; `canonicalRecordId` is present once it is.
827
+ */
828
+ export class UnknownResolutionIntent extends Schema.Class<UnknownResolutionIntent>(
829
+ "@effect-agent/thread/UnknownResolutionIntent",
830
+ )({
831
+ submissionId: SubmissionId,
832
+ toolCallId: ToolCallId,
833
+ author: ToolCallResolved.fields.author,
834
+ reason: ToolCallResolved.fields.reason,
835
+ resolution: UnknownResolution,
836
+ resolvedAt: Schema.DateTimeUtcFromString,
837
+ canonicalRecordId: Schema.optionalKey(RecordId),
838
+ }) {}
839
+
840
+ /** Current ownership as recovery sees it. The live owner's token is never exposed here. */
841
+ export class OwnershipSnapshot extends Schema.Class<OwnershipSnapshot>(
842
+ "@effect-agent/thread/OwnershipSnapshot",
843
+ )({
844
+ attemptId: AttemptId,
845
+ ownerProducerId: ProducerId,
846
+ producerEpoch: ProducerEpoch,
847
+ leaseExpiresAt: Schema.DateTimeUtcFromString,
848
+ }) {}
849
+
850
+ /** A settlement reservation as recovery sees it. */
851
+ export class SettlementReservationSnapshot extends Schema.Class<SettlementReservationSnapshot>(
852
+ "@effect-agent/thread/SettlementReservationSnapshot",
853
+ )({
854
+ settlementId: SettlementId,
855
+ outcome: SettlementOutcome,
856
+ record: RecordEnvelope,
857
+ recordDigest: Digest,
858
+ finalized: Schema.Boolean,
859
+ }) {}
860
+
861
+ export class RecoverySnapshotRequest extends Schema.Class<RecoverySnapshotRequest>(
862
+ "@effect-agent/thread/RecoverySnapshotRequest",
863
+ )({
864
+ submissionId: SubmissionId,
865
+ }) {}
866
+
867
+ /** One joined/joining Submission of a host Run, as the host's recovery sees it. */
868
+ export class JoinSnapshot extends Schema.Class<JoinSnapshot>("@effect-agent/thread/JoinSnapshot")({
869
+ submissionId: SubmissionId,
870
+ state: SubmissionState,
871
+ hostSubmissionId: SubmissionId,
872
+ }) {}
873
+
874
+ /** A durable suspension as recovery sees it. */
875
+ export class SuspensionSnapshot extends Schema.Class<SuspensionSnapshot>(
876
+ "@effect-agent/thread/SuspensionSnapshot",
877
+ )({
878
+ reason: SuspensionReason,
879
+ suspendedAt: Schema.DateTimeUtcFromString,
880
+ }) {}
881
+
882
+ /**
883
+ * One attached child of this parent as its recovery sees it: the reservation's recorded child
884
+ * plus that child's current lane state. A disposable derived view — the canonical
885
+ * `SubagentRequested`/`SubagentStarted` records and the child's own canonical Settlement remain
886
+ * the recovery truth (DUR-015).
887
+ */
888
+ export class ChildAttachmentSnapshot extends Schema.Class<ChildAttachmentSnapshot>(
889
+ "@effect-agent/thread/ChildAttachmentSnapshot",
890
+ )({
891
+ toolCallId: ToolCallId,
892
+ childSubmissionId: SubmissionId,
893
+ childState: SubmissionState,
894
+ childOutcome: Schema.optionalKey(SettlementOutcome),
895
+ }) {}
896
+
897
+ /**
898
+ * Everything the pure recovery classifier needs about one Submission, read strongly consistently
899
+ * (STORE-003). Canonical history still wins over every marker in this snapshot (DUR-015).
900
+ *
901
+ * Phase 5 fields: `joins` is the host-side view (every Submission `joining`/`joined` to this
902
+ * one); `hostSubmissionId` is the joined-side view; `suspension` mirrors the `suspended` state;
903
+ * `approvalDecisions` and `unknownResolutions` are the durable intents recorded against this
904
+ * Submission (empty when none exist).
905
+ *
906
+ * S2 fields: `childReservations`/`childAttachments` are the parent-side subagent view (ordered
907
+ * by parent Tool Call id) and `parentLinkage` is the child-side view. They default to
908
+ * empty/absent at construction so pre-S2 call sites stay valid; adapters always populate them.
909
+ */
910
+ export class RecoverySnapshot extends Schema.Class<RecoverySnapshot>(
911
+ "@effect-agent/thread/RecoverySnapshot",
912
+ )({
913
+ submission: SubmissionSnapshot,
914
+ ownership: Schema.optionalKey(OwnershipSnapshot),
915
+ inputApplied: Schema.optionalKey(InputAppliedMarker),
916
+ reservation: Schema.optionalKey(SettlementReservationSnapshot),
917
+ abortIntent: Schema.optionalKey(AbortIntent),
918
+ joins: Schema.Array(JoinSnapshot),
919
+ hostSubmissionId: Schema.optionalKey(SubmissionId),
920
+ suspension: Schema.optionalKey(SuspensionSnapshot),
921
+ approvalDecisions: Schema.Array(ApprovalDecisionIntent),
922
+ unknownResolutions: Schema.Array(UnknownResolutionIntent),
923
+ childReservations: Schema.Array(ChildBudgetReservationSnapshot).pipe(
924
+ Schema.withConstructorDefault(Effect.succeed([])),
925
+ ),
926
+ childAttachments: Schema.Array(ChildAttachmentSnapshot).pipe(
927
+ Schema.withConstructorDefault(Effect.succeed([])),
928
+ ),
929
+ parentLinkage: Schema.optionalKey(ParentLinkage),
930
+ }) {}
931
+
932
+ /** The same idempotency key was admitted with different canonical input content. */
933
+ export class AdmissionConflict extends Schema.TaggedError<AdmissionConflict>()(
934
+ "AdmissionConflict",
935
+ {
936
+ threadId: ThreadId,
937
+ principal: Principal,
938
+ idempotencyKey: IdempotencyKey,
939
+ existingInputDigest: Digest,
940
+ attemptedInputDigest: Digest,
941
+ },
942
+ ) {}
943
+
944
+ /**
945
+ * The presented ownership token no longer owns the Submission's lane. `actualEpoch` is the
946
+ * thread's current producer epoch so a stale Attempt can prove to itself it was superseded.
947
+ */
948
+ export class OwnershipLost extends Schema.TaggedError<OwnershipLost>()("OwnershipLost", {
949
+ submissionId: SubmissionId,
950
+ actualEpoch: ProducerEpoch,
951
+ }) {}
952
+
953
+ /** A conflicting terminal outcome was already reserved or finalized (DUR-002, DUR-012). */
954
+ export class SettlementConflict extends Schema.TaggedError<SettlementConflict>()(
955
+ "SettlementConflict",
956
+ {
957
+ submissionId: SubmissionId,
958
+ existingOutcome: SettlementOutcome,
959
+ },
960
+ ) {}
961
+
962
+ /**
963
+ * A divergent approval re-decision for an already-decided `(submissionId, toolCallId)` pair.
964
+ * Repeating the SAME decision replays the recorded intent instead (idempotency).
965
+ */
966
+ export class ApprovalConflict extends Schema.TaggedError<ApprovalConflict>()("ApprovalConflict", {
967
+ submissionId: SubmissionId,
968
+ toolCallId: ToolCallId,
969
+ existingDecision: ApprovalDecision,
970
+ }) {}
971
+
972
+ /**
973
+ * A divergent unknown-outcome re-resolution for an already-resolved `(submissionId, toolCallId)`
974
+ * pair (DUR-017). Repeating the SAME resolution replays the recorded intent instead.
975
+ */
976
+ export class UnknownResolutionConflict extends Schema.TaggedError<UnknownResolutionConflict>()(
977
+ "UnknownResolutionConflict",
978
+ {
979
+ submissionId: SubmissionId,
980
+ toolCallId: ToolCallId,
981
+ },
982
+ ) {}
983
+
984
+ /**
985
+ * A child budget reservation request contradicts recorded reservation state: a divergent
986
+ * allocation for the same reservation id, a second reservation id for the same parent Tool
987
+ * Call, a divergent child attachment, a divergent accounting freeze, or an out-of-order state
988
+ * transition. `status` reports the existing row's status. Identical replays never conflict.
989
+ */
990
+ export class ChildReservationConflict extends Schema.TaggedError<ChildReservationConflict>()(
991
+ "ChildReservationConflict",
992
+ {
993
+ reservationId: ChildReservationId,
994
+ status: ChildReservationStatus,
995
+ message: Schema.String,
996
+ },
997
+ ) {}
998
+
999
+ /** Adapter-level ledger failure (storage unavailable, unknown submission, corrupt row, ...). */
1000
+ export class LedgerError extends Schema.TaggedError<LedgerError>()("LedgerError", {
1001
+ operation: Schema.String,
1002
+ message: Schema.String,
1003
+ cause: Schema.optionalKey(FailureDiagnostic.Value),
1004
+ }) {}
1005
+
1006
+ export type SubmissionLedgerFailure =
1007
+ | AdmissionConflict
1008
+ | OwnershipLost
1009
+ | SettlementConflict
1010
+ | ApprovalConflict
1011
+ | UnknownResolutionConflict
1012
+ | JoinedToHost
1013
+ | ChildReservationConflict
1014
+ | LedgerError
1015
+ | AdmissionPolicyError;
1016
+
1017
+ /**
1018
+ * Operational durable state for accepted work: admission, FIFO readiness, ownership, leases,
1019
+ * abort intent, and settlement obligations (STORE-001). The Thread Log remains the
1020
+ * authority for applied input and terminal outcomes; every marker in this ledger can be rebuilt
1021
+ * from canonical history (DUR-015).
1022
+ *
1023
+ * Operation contracts:
1024
+ *
1025
+ * - `admit` — atomic and idempotent by (threadId, principal, idempotencyKey). A replay
1026
+ * with the same `inputDigest` returns the original `AdmissionResult` with `replayed` set; a
1027
+ * replay with a different digest fails with `AdmissionConflict`. Admission allocates the
1028
+ * Submission's `queueSequence` (FIFO position, DUR-004) and mints `submissionId`/`receiptId`.
1029
+ * An optional `parentLinkage` is recorded immutably at first admission (SUB-016); a replay
1030
+ * whose linkage diverges (present vs. absent, or different identities) fails with
1031
+ * `AdmissionConflict` even when the input digest matches.
1032
+ * - `resolveAdmission` — authoritative tri-state admission lookup by scoped idempotency key
1033
+ * (SUB-031): `NotAdmitted` proves absence, `Admitted` carries the full snapshot, and
1034
+ * `Indeterminate` states that the adapter cannot currently prove either. Only `NotAdmitted`
1035
+ * permits an admission attempt. Single strongly consistent stores derive the answer from a
1036
+ * direct lookup and never answer `Indeterminate`.
1037
+ * - `markReady` — idempotent transition admitted → ready after Thread materialization.
1038
+ * Marking an already-ready (or later-state) Submission is a no-op.
1039
+ * - `lookup` — read one Submission by identity or scoped idempotency key; strongly consistent
1040
+ * with prior ledger writes.
1041
+ * - `claim` — claims the lowest unsettled `queueSequence` after skipping only unknown rows
1042
+ * without abort intent. Approval, joining and child-wait barriers remain ordered. Returns
1043
+ * `Option.none` when no eligible work exists or ANY lease in the Thread is live, including
1044
+ * a lease belonging to the same producer. A successful claim atomically bumps the Thread's producer
1045
+ * epoch — fencing every stale Attempt out of canonical appends (DUR-006) — mints a fresh
1046
+ * `attemptId` and `ownershipToken`, and starts the ownership lease (D5: adapters default to
1047
+ * `DEFAULT_OWNERSHIP_LEASE_DURATION`, configurable). An expired lease makes the head
1048
+ * claimable; expiry alone never revokes correctness, only permission to assume liveness.
1049
+ * An optional trusted-runtime `handoff` can defer only the named `input-applied` prefix,
1050
+ * with no abort intent, to claim the exact next runnable Submission. It is checked atomically
1051
+ * against the current producer epoch and the same whole-Thread ownership fence. Admission
1052
+ * gaps, approval/child waits and joined work cannot be bypassed. Hints are not durable facts;
1053
+ * recovery resumes the same retained Runs and can select another complete-Turn handoff.
1054
+ * - `renewOwnership` — extends the lease while the token still owns the lane; fails with
1055
+ * `OwnershipLost` once superseded. Renewal after lease expiry succeeds if no other claim has
1056
+ * taken the lane in between.
1057
+ * - `releaseOwnership` — graceful drain: ends the ownership period without settling, returning
1058
+ * a nonterminal head to claimable state. Fails with `OwnershipLost` once superseded.
1059
+ * - `markInputApplied` — idempotent marker that the deterministic `UserInputRecorded` record is
1060
+ * canonical (state → input-applied). Recovery repairs this marker from history when the append
1061
+ * committed but the marker write was lost.
1062
+ * - `reserveSettlement` — reserves the Submission's single exact settlement record
1063
+ * (state → terminalizing). Idempotent: an identical reservation replays with `replayed` set; a
1064
+ * different outcome or content fails with `SettlementConflict{existingOutcome}` (DUR-011).
1065
+ * For a `joined` Submission the reservation is authorized by its recorded host linkage — a
1066
+ * joined lane is never worker-claimable, so no ownership token can exist for it and the
1067
+ * presented token is not consulted (plan §2.5: joined Submissions settle with the host).
1068
+ * Likewise, an ABORTED reservation for a `ready`/`terminalizing` Submission that carries a
1069
+ * durable abort intent and holds no live ownership is authorized by that intent (P7 §7(c)):
1070
+ * recovery settles aborted never-claimed queued work immediately, without waiting for it to
1071
+ * head the lane. Both exceptions are outcome- and state-narrow; everything else stays fenced.
1072
+ * - `finalizeSettlement` — idempotent terminal transition (state → settled) after the reserved
1073
+ * record is canonical. Native adapters seal opted-in worker assignments atomically before
1074
+ * releasing the lane. Otherwise the next `queueSequence` becomes claimable. It
1075
+ * requires no ownership token: canonical history authorizes finalization (DUR-015). A
1076
+ * finalization that disagrees with the recorded outcome fails with `SettlementConflict`.
1077
+ * - `requestAbort` — durable, idempotent by `submissionId`: repeating returns the recorded
1078
+ * intent unchanged (DUR-012). Fails with `SettlementConflict` once the Submission is settled;
1079
+ * abort never rewrites a terminal outcome. Fails with `JoinedToHost` for a `joined` Submission
1080
+ * — it settles with its host, so the abort target is the host (plan §2.5). Abort of a
1081
+ * `joining` Submission records the intent; it is honored only if the host has not consumed the
1082
+ * input (revert-then-abort).
1083
+ * - `claimJoining` — atomic: transitions the contiguous `ready` prefix of strictly-later
1084
+ * `queueSequence`s (up to `maxCount`) to `joining` under the host's ownership token, recording
1085
+ * the host linkage; no epoch bump (the host Attempt already owns the lane). An
1086
+ * `admitted`-not-`ready` row breaks the prefix; an aborted-settled row is a closed obligation
1087
+ * and is skipped as a non-gap (P7 §7(c)). Fails with `OwnershipLost` once superseded.
1088
+ * - `markJoined` — idempotent `joining → joined` with the canonical input record position;
1089
+ * repairable from history when the append committed but the marker write was lost (DUR-016).
1090
+ * - `revertJoining` — recovery-only, idempotent `joining → ready`; a no-op when already joined.
1091
+ * - `suspend` — `input-applied`/`running` → `suspended`; ends the ownership period WITHOUT
1092
+ * settling (the obligation stays owed, the lane consumes no worker permit). Returns
1093
+ * `resume-immediately` when the reason is already fully covered: for `ApprovalPending`,
1094
+ * recorded decisions cover every pending call; for `WaitingForChild`, every listed child is
1095
+ * already provably settled. Adapters must guarantee that a child settlement reported before
1096
+ * the suspend transaction commits is observed by that suspend (single-store adapters derive
1097
+ * this from the child's own row; cross-store adapters record a durable notification marker).
1098
+ * Fails with `SettlementConflict` once settled.
1099
+ * - `recordApprovalDecision` — durable, idempotent per `(submissionId, toolCallId)`: repeating
1100
+ * the same decision replays the intent; a divergent re-decision fails with `ApprovalConflict`.
1101
+ * Transitions `suspended(ApprovalPending) → input-applied` once every pending call of the
1102
+ * suspension reason is decided, waking the lane. Fails with `SettlementConflict` once settled.
1103
+ * - `recordChildSettled` — idempotent cross-lane wake (spec §12 step 10): transitions
1104
+ * `suspended(WaitingForChild) → input-applied` exactly when EVERY listed child is settled,
1105
+ * answering `woken`; `still-waiting` while any listed child is unsettled; `not-waiting` when
1106
+ * the parent is not suspended waiting on this child (including replays after the wake). The
1107
+ * child's canonical Settlement is the authority. The runtime reports it after the exact
1108
+ * reserved record is appended and before ledger finalization, so same-store adapters accept
1109
+ * `terminalizing` only when its exact reservation exists; an earlier child is an
1110
+ * adapter-checked caller error. It never settles the parent and requires no ownership token:
1111
+ * the canonically recorded child settlement authorizes the wake.
1112
+ * - `reserveChildBudget` — idempotent get-or-create of the parent-owned child budget
1113
+ * reservation (spec §12 step 2), fenced by the parent lane's live `OwnershipToken`. An
1114
+ * identical replay returns the stored row with `replayed` set (unfenced, mirroring
1115
+ * `reserveSettlement`); a divergent allocation for the same id, or a second id for the same
1116
+ * `(parentSubmissionId, parentToolCallId)`, fails with `ChildReservationConflict`.
1117
+ * - `attachChildToReservation` — idempotent: records the admitted child on the reservation row
1118
+ * (repairable from the canonical `SubagentStarted` record). A replay with the recorded child
1119
+ * is a no-op; the first attach is fenced by the parent token and requires status `reserved`;
1120
+ * a divergent child fails with `ChildReservationConflict`.
1121
+ * - `beginChildBudgetRelease` — `reserved → releasePending`: freezes the final accounting
1122
+ * decision exactly once. Replaying the identical accounting (at `releasePending` or
1123
+ * `released`) is a no-op; a divergent accounting fails with `ChildReservationConflict`.
1124
+ * Requires no ownership token: the accounting is replayed from the canonical `SubagentJoined`
1125
+ * record (or is the deterministic zero-consumed decision for an orphaned reservation), so
1126
+ * canonical history authorizes the transition (DUR-015) and the freeze comparison — not a
1127
+ * fence — guarantees one decision.
1128
+ * - `releaseChildBudget` — `releasePending → released`, applied exactly once; replaying returns
1129
+ * the released row unchanged. Releasing a still-`reserved` row (no frozen accounting) fails
1130
+ * with `ChildReservationConflict`. "A crash before release leaves budget unavailable until
1131
+ * repair, never available twice" (spec §12).
1132
+ * - `markUnknown` — idempotent, ownership-free (canonical evidence authorizes it): state →
1133
+ * `unknown`, parking the Submission while its accepted settlement obligation stays visible.
1134
+ * Existing ownership must release or expire before another claim (DUR-009/DUR-017).
1135
+ * Fails with `SettlementConflict` once settled.
1136
+ * - `recordUnknownResolution` — durable, idempotent per `(submissionId, toolCallId)`; a
1137
+ * divergent re-resolution fails with `UnknownResolutionConflict`. Transitions
1138
+ * `unknown → input-applied` once no open call remains, waking the lane. Fails with
1139
+ * `SettlementConflict` once settled.
1140
+ * - `scanNonterminal` — streams control-only entries for every Submission whose state is not
1141
+ * `settled`, ordered by (threadId, queueSequence); recovery's admission-independent worklist
1142
+ * (DUR-014). It must not decode execution payloads. SQL or control-identity corruption fails
1143
+ * the scan; selected-Thread payload hydration belongs inside the caller's isolation boundary.
1144
+ * - `loadRecoverySnapshot` — strongly consistent full snapshot for the pure recovery classifier.
1145
+ *
1146
+ * No operation claims exactly-once external side effects; the ledger records decisions
1147
+ * exactly once (DUR-003).
1148
+ */
1149
+ export class SubmissionLedger extends Context.Service<
1150
+ SubmissionLedger,
1151
+ {
1152
+ readonly capabilities: Effect.Effect<LedgerCapabilities>;
1153
+ readonly admit: (
1154
+ request: AdmissionRequest,
1155
+ ) => Effect.Effect<AdmissionResult, AdmissionConflict | AdmissionPolicyError | LedgerError>;
1156
+ readonly markReady: (request: MarkReadyRequest) => Effect.Effect<void, LedgerError>;
1157
+ readonly lookup: (
1158
+ request: SubmissionLookup,
1159
+ ) => Effect.Effect<Option.Option<SubmissionSnapshot>, LedgerError>;
1160
+ readonly resolveAdmission: (
1161
+ request: SubmissionLookupByKey,
1162
+ ) => Effect.Effect<AdmissionResolution, LedgerError>;
1163
+ readonly claim: (request: ClaimRequest) => Effect.Effect<Option.Option<Claim>, LedgerError>;
1164
+ readonly renewOwnership: (
1165
+ request: RenewOwnershipRequest,
1166
+ ) => Effect.Effect<OwnershipRenewal, OwnershipLost | LedgerError>;
1167
+ readonly releaseOwnership: (
1168
+ request: ReleaseOwnershipRequest,
1169
+ ) => Effect.Effect<void, OwnershipLost | LedgerError>;
1170
+ readonly markInputApplied: (
1171
+ request: MarkInputAppliedRequest,
1172
+ ) => Effect.Effect<void, OwnershipLost | LedgerError>;
1173
+ readonly reserveSettlement: (
1174
+ request: SettlementReservation,
1175
+ ) => Effect.Effect<ReservedSettlement, SettlementConflict | OwnershipLost | LedgerError>;
1176
+ readonly finalizeSettlement: (
1177
+ request: SettlementFinalization,
1178
+ ) => Effect.Effect<Settlement, SettlementConflict | LedgerError>;
1179
+ /** Optional for third-party adapters. Remaining ownership must reach zero before stop acknowledgement. */
1180
+ readonly inspectWorker?: (threadId: ThreadId) => Effect.Effect<WorkerLedgerState, LedgerError>;
1181
+ readonly stopWorker?: (request: WorkerStopCommand) => Effect.Effect<number, LedgerError>;
1182
+ readonly requestAbort: (
1183
+ request: AbortCommand,
1184
+ ) => Effect.Effect<AbortIntent, SettlementConflict | JoinedToHost | LedgerError>;
1185
+ /**
1186
+ * Strongly consistent lane-local read. Unknown Submissions fail with LedgerError. Canonical
1187
+ * proof has the same meaning as in RecoverySnapshot; this read grants no execution authority.
1188
+ */
1189
+ readonly readAbortIntent: (
1190
+ request: AbortIntentRequest,
1191
+ ) => Effect.Effect<AbortIntent | undefined, LedgerError>;
1192
+ readonly claimJoining: (
1193
+ request: ClaimJoiningRequest,
1194
+ ) => Effect.Effect<ReadonlyArray<JoiningClaim>, OwnershipLost | LedgerError>;
1195
+ readonly markJoined: (
1196
+ request: MarkJoinedRequest,
1197
+ ) => Effect.Effect<void, OwnershipLost | LedgerError>;
1198
+ readonly revertJoining: (request: RevertJoiningRequest) => Effect.Effect<void, LedgerError>;
1199
+ readonly suspend: (
1200
+ request: SuspendRequest,
1201
+ ) => Effect.Effect<SuspensionOutcome, OwnershipLost | SettlementConflict | LedgerError>;
1202
+ readonly recordApprovalDecision: (
1203
+ command: ApprovalDecisionCommand,
1204
+ ) => Effect.Effect<ApprovalDecisionIntent, ApprovalConflict | SettlementConflict | LedgerError>;
1205
+ readonly markUnknown: (
1206
+ request: MarkUnknownRequest,
1207
+ ) => Effect.Effect<void, SettlementConflict | LedgerError>;
1208
+ readonly recordUnknownResolution: (
1209
+ command: UnknownResolutionCommand,
1210
+ ) => Effect.Effect<
1211
+ UnknownResolutionIntent,
1212
+ UnknownResolutionConflict | SettlementConflict | LedgerError
1213
+ >;
1214
+ readonly recordChildSettled: (
1215
+ request: ChildSettledNotification,
1216
+ ) => Effect.Effect<ChildSettledOutcome, LedgerError>;
1217
+ readonly reserveChildBudget: (
1218
+ request: ChildBudgetReservationRequest,
1219
+ ) => Effect.Effect<ReservedChildBudget, ChildReservationConflict | OwnershipLost | LedgerError>;
1220
+ readonly attachChildToReservation: (
1221
+ request: AttachChildToReservationRequest,
1222
+ ) => Effect.Effect<
1223
+ ChildBudgetReservationSnapshot,
1224
+ ChildReservationConflict | OwnershipLost | LedgerError
1225
+ >;
1226
+ readonly beginChildBudgetRelease: (
1227
+ request: BeginChildBudgetReleaseRequest,
1228
+ ) => Effect.Effect<ChildBudgetReservationSnapshot, ChildReservationConflict | LedgerError>;
1229
+ readonly releaseChildBudget: (
1230
+ request: ReleaseChildBudgetRequest,
1231
+ ) => Effect.Effect<ChildBudgetReservationSnapshot, ChildReservationConflict | LedgerError>;
1232
+ readonly scanNonterminal: Stream.Stream<SubmissionWorkItem, LedgerError>;
1233
+ readonly loadRecoverySnapshot: (
1234
+ request: RecoverySnapshotRequest,
1235
+ ) => Effect.Effect<RecoverySnapshot, LedgerError>;
1236
+ }
1237
+ >()("@effect-agent/thread/SubmissionLedger") {}
1238
+
1239
+ const decodeBatchId = Schema.decodeSync(BatchId);
1240
+ const decodeRecordId = Schema.decodeSync(RecordId);
1241
+ const decodeSettlementId = Schema.decodeSync(SettlementId);
1242
+
1243
+ /**
1244
+ * Deterministic identity rules shared by every adapter and the durable coordinator. The batch
1245
+ * carrying one Submission's canonical `UserInputRecorded` record is `submission-input:{sid}` and
1246
+ * the record is `input:{sid}`, so batch idempotency (DUR-007) makes the input append
1247
+ * exactly-once-canonical across Attempts.
1248
+ */
1249
+ export const submissionInputBatchId = (submissionId: SubmissionId): BatchId =>
1250
+ decodeBatchId(`submission-input:${submissionId}`);
1251
+
1252
+ /** Deterministic canonical record identity of one Submission's `UserInputRecorded` record. */
1253
+ export const submissionInputRecordId = (submissionId: SubmissionId): RecordId =>
1254
+ decodeRecordId(`input:${submissionId}`);
1255
+
1256
+ /** Deterministic `SettlementId` for one Submission: `settlement:{sid}`. */
1257
+ export const submissionSettlementId = (submissionId: SubmissionId): SettlementId =>
1258
+ decodeSettlementId(`settlement:${submissionId}`);
1259
+
1260
+ /** Deterministic batch identity of one Submission's canonical `SubmissionSettled` append. */
1261
+ export const submissionSettlementBatchId = (submissionId: SubmissionId): BatchId =>
1262
+ decodeBatchId(`submission-settlement:${submissionId}`);
1263
+
1264
+ /** Deterministic canonical record identity of one Submission's `SubmissionSettled` record. */
1265
+ export const submissionSettlementRecordId = (submissionId: SubmissionId): RecordId =>
1266
+ decodeRecordId(`settlement:${submissionId}`);
1267
+
1268
+ /** Deterministic batch identity of one Submission's canonical `AbortRequested` append. */
1269
+ export const submissionAbortBatchId = (submissionId: SubmissionId): BatchId =>
1270
+ decodeBatchId(`submission-abort:${submissionId}`);
1271
+
1272
+ /** Deterministic canonical record identity of one Submission's `AbortRequested` record. */
1273
+ export const submissionAbortRecordId = (submissionId: SubmissionId): RecordId =>
1274
+ decodeRecordId(`abort:${submissionId}`);
1275
+
1276
+ /** Destination policy, captured when the ledger is acquired. It runs inside fresh admission's
1277
+ * serialization after replay lookup. The host must keep it bounded and must not reenter admit.
1278
+ * The callback must read authoritative policy in this SAME local transaction, through the
1279
+ * acquired SqlClient. Memory evaluates the callback synchronously inside its atomic mutation;
1280
+ * an async callback fails with `unavailable/synchronous-memory-policy-required`. Remote reads do not fence remote changes.
1281
+ * All policy writers must use that transaction owner. Do not fork, reenter admission, or retain
1282
+ * transaction resources. Failure/defect/interruption commits no fresh admission.
1283
+ * Current policy never invalidates an exact retained receipt. A supplied fence fails closed
1284
+ * unless the destination installed an interpreter for it. */
1285
+ export const SubmissionAdmissionFence = Context.Reference<{
1286
+ readonly check: (request: AdmissionRequest) => Effect.Effect<void, AdmissionPolicyError>;
1287
+ }>("@effect-agent/thread/SubmissionAdmissionFence", {
1288
+ defaultValue: () => ({
1289
+ check: (request) =>
1290
+ request.admissionFence === undefined
1291
+ ? Effect.void
1292
+ : AdmissionPolicyError.make({
1293
+ reason: "refused",
1294
+ code: "unsupported-policy",
1295
+ }),
1296
+ }),
1297
+ });