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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/dist/Agent-CN0EWRsR.d.mts +226 -0
  2. package/dist/Agent-RklVROrm.mjs +83 -0
  3. package/dist/Agent-RklVROrm.mjs.map +1 -0
  4. package/dist/AgentError-CggcAQ7V.d.mts +101 -0
  5. package/dist/AgentPolicy-CetmQrf3.d.mts +96 -0
  6. package/dist/AgentRuntime-CHipL2jG.mjs +4598 -0
  7. package/dist/AgentRuntime-CHipL2jG.mjs.map +1 -0
  8. package/dist/AgentRuntime-uxR_a4VM.d.mts +346 -0
  9. package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
  10. package/dist/ContextCompactor-Dxu5zhOL.d.mts +161 -0
  11. package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
  12. package/dist/DurableAgentRuntime-D7gDKGjH.mjs +6368 -0
  13. package/dist/DurableAgentRuntime-D7gDKGjH.mjs.map +1 -0
  14. package/dist/DurableFailpoint-Oinuuedm.d.mts +41 -0
  15. package/dist/DurableStep-Cry_iol4.d.mts +103 -0
  16. package/dist/Ephemeral.d.mts +22 -0
  17. package/dist/Ephemeral.mjs +22 -0
  18. package/dist/Ephemeral.mjs.map +1 -0
  19. package/dist/EventSource-OqS_P9ug.d.mts +51 -0
  20. package/dist/Identifiers-CN2s30fF.d.mts +40 -0
  21. package/dist/MemoryNamespace-BbRW5p71.d.mts +36 -0
  22. package/dist/MemoryReference-B8Q3UJoJ.d.mts +79 -0
  23. package/dist/Messaging-CkcIdt4I.d.mts +490 -0
  24. package/dist/MessagingHost-CRk0kXzT.d.mts +246 -0
  25. package/dist/MessagingHost-CWi_PP3g.mjs +137 -0
  26. package/dist/MessagingHost-CWi_PP3g.mjs.map +1 -0
  27. package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
  28. package/dist/Output-D6SkedVx.d.mts +25 -0
  29. package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
  30. package/dist/PageScreenshot-BpgZKAxl.d.mts +48 -0
  31. package/dist/PreparedInputAdmission-C4HbjHgl.d.mts +38 -0
  32. package/dist/Receipt-BAHyigAF.d.mts +33 -0
  33. package/dist/Records-BAGkekt8.d.mts +3570 -0
  34. package/dist/RunEvent-DIrzkjLr.d.mts +460 -0
  35. package/dist/RunEventSink-D5aVhISG.d.mts +108 -0
  36. package/dist/RunJournal-Cgg1kNvc.mjs +825 -0
  37. package/dist/RunJournal-Cgg1kNvc.mjs.map +1 -0
  38. package/dist/RunOptions-g1aigcKI.d.mts +915 -0
  39. package/dist/RunPolicyUsage-ClZxyR46.d.mts +21 -0
  40. package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
  41. package/dist/Schedule-H3SEYX9g.d.mts +842 -0
  42. package/dist/Scheduling-C9aIP8zT.mjs +691 -0
  43. package/dist/Scheduling-C9aIP8zT.mjs.map +1 -0
  44. package/dist/Subagent-DyfzHNdv.d.mts +826 -0
  45. package/dist/Subagent-U5qXOFE8.mjs +1469 -0
  46. package/dist/Subagent-U5qXOFE8.mjs.map +1 -0
  47. package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
  48. package/dist/SubagentHost-CJUBQlcc.d.mts +140 -0
  49. package/dist/Subscription-BEP8oQO5.d.mts +921 -0
  50. package/dist/SubscriptionInput-vAAOBrK7.d.mts +41 -0
  51. package/dist/Thread-DOBQ0QUY.d.mts +96 -0
  52. package/dist/ThreadHistory-tS1KwxHR.d.mts +60 -0
  53. package/dist/ToolBroker-DWs4tZra.d.mts +133 -0
  54. package/dist/ToolExposure-9uF_Yo0T.mjs +10 -0
  55. package/dist/ToolExposure-9uF_Yo0T.mjs.map +1 -0
  56. package/dist/ToolExposure-C93U1sPu.mjs +30 -0
  57. package/dist/ToolExposure-C93U1sPu.mjs.map +1 -0
  58. package/dist/ToolExposure-UCN12eCd.d.mts +39 -0
  59. package/dist/ToolExposure-r2eOWk4F.d.mts +46 -0
  60. package/dist/ToolExposure.d.mts +8 -0
  61. package/dist/ToolExposure.mjs +21 -0
  62. package/dist/ToolExposure.mjs.map +1 -0
  63. package/dist/ToolReconciler-DQVaJfpE.d.mts +76 -0
  64. package/dist/ToolResult-DmmgoChv.d.mts +61 -0
  65. package/dist/Usage-Dx0aknfk.d.mts +121 -0
  66. package/dist/WakeScheduler-EjUF-GhC.d.mts +56 -0
  67. package/dist/Worker-CaPYykpe.d.mts +228 -0
  68. package/dist/agent-registration-CWDMOAZA.mjs +172 -0
  69. package/dist/agent-registration-CWDMOAZA.mjs.map +1 -0
  70. package/dist/capabilities/Approval.d.mts +114 -0
  71. package/dist/capabilities/Approval.mjs +226 -0
  72. package/dist/capabilities/Approval.mjs.map +1 -0
  73. package/dist/capabilities/Budget.d.mts +112 -0
  74. package/dist/capabilities/Budget.mjs +346 -0
  75. package/dist/capabilities/Budget.mjs.map +1 -0
  76. package/dist/capabilities/CodeMode.d.mts +157 -0
  77. package/dist/capabilities/CodeMode.mjs +522 -0
  78. package/dist/capabilities/CodeMode.mjs.map +1 -0
  79. package/dist/capabilities/Commands.d.mts +55 -0
  80. package/dist/capabilities/Commands.mjs +57 -0
  81. package/dist/capabilities/Commands.mjs.map +1 -0
  82. package/dist/capabilities/ContextTools.d.mts +321 -0
  83. package/dist/capabilities/ContextTools.mjs +126 -0
  84. package/dist/capabilities/ContextTools.mjs.map +1 -0
  85. package/dist/capabilities/Mcp.d.mts +108 -0
  86. package/dist/capabilities/Mcp.mjs +260 -0
  87. package/dist/capabilities/Mcp.mjs.map +1 -0
  88. package/dist/capabilities/McpClient.d.mts +115 -0
  89. package/dist/capabilities/McpClient.mjs +506 -0
  90. package/dist/capabilities/McpClient.mjs.map +1 -0
  91. package/dist/capabilities/MemoryNotes.d.mts +424 -0
  92. package/dist/capabilities/MemoryNotes.mjs +128 -0
  93. package/dist/capabilities/MemoryNotes.mjs.map +1 -0
  94. package/dist/capabilities/Messaging.d.mts +3 -0
  95. package/dist/capabilities/Messaging.mjs +151 -0
  96. package/dist/capabilities/Messaging.mjs.map +1 -0
  97. package/dist/capabilities/ModelContext.d.mts +89 -0
  98. package/dist/capabilities/ModelContext.mjs +168 -0
  99. package/dist/capabilities/ModelContext.mjs.map +1 -0
  100. package/dist/capabilities/Redaction.d.mts +37 -0
  101. package/dist/capabilities/Redaction.mjs +104 -0
  102. package/dist/capabilities/Redaction.mjs.map +1 -0
  103. package/dist/capabilities/Remembering.d.mts +434 -0
  104. package/dist/capabilities/Remembering.mjs +290 -0
  105. package/dist/capabilities/Remembering.mjs.map +1 -0
  106. package/dist/capabilities/RunHooks.d.mts +82 -0
  107. package/dist/capabilities/RunHooks.mjs +144 -0
  108. package/dist/capabilities/RunHooks.mjs.map +1 -0
  109. package/dist/capabilities/SemanticMemory.d.mts +431 -0
  110. package/dist/capabilities/SemanticMemory.mjs +315 -0
  111. package/dist/capabilities/SemanticMemory.mjs.map +1 -0
  112. package/dist/capabilities/Subagent.d.mts +4 -0
  113. package/dist/capabilities/Subagent.mjs +5 -0
  114. package/dist/capabilities/SubagentReservations.d.mts +186 -0
  115. package/dist/capabilities/SubagentReservations.mjs +479 -0
  116. package/dist/capabilities/SubagentReservations.mjs.map +1 -0
  117. package/dist/capabilities/ToolDiscovery.d.mts +109 -0
  118. package/dist/capabilities/ToolDiscovery.mjs +211 -0
  119. package/dist/capabilities/ToolDiscovery.mjs.map +1 -0
  120. package/dist/capabilities/WebCapture.d.mts +163 -0
  121. package/dist/capabilities/WebCapture.mjs +335 -0
  122. package/dist/capabilities/WebCapture.mjs.map +1 -0
  123. package/dist/capabilities/WebSearch.d.mts +71 -0
  124. package/dist/capabilities/WebSearch.mjs +112 -0
  125. package/dist/capabilities/WebSearch.mjs.map +1 -0
  126. package/dist/compaction-C2OTceKw.mjs +505 -0
  127. package/dist/compaction-C2OTceKw.mjs.map +1 -0
  128. package/dist/core/Agent.d.mts +2 -0
  129. package/dist/core/Agent.mjs +2 -0
  130. package/dist/core/AgentError.d.mts +2 -0
  131. package/dist/core/AgentError.mjs +117 -0
  132. package/dist/core/AgentError.mjs.map +1 -0
  133. package/dist/core/AgentPolicy.d.mts +2 -0
  134. package/dist/core/AgentPolicy.mjs +94 -0
  135. package/dist/core/AgentPolicy.mjs.map +1 -0
  136. package/dist/core/AgentUpdates.d.mts +2 -0
  137. package/dist/core/AgentUpdates.mjs +63 -0
  138. package/dist/core/AgentUpdates.mjs.map +1 -0
  139. package/dist/core/IdGenerator.d.mts +26 -0
  140. package/dist/core/IdGenerator.mjs +27 -0
  141. package/dist/core/IdGenerator.mjs.map +1 -0
  142. package/dist/core/Identifiers.d.mts +2 -0
  143. package/dist/core/Identifiers.mjs +43 -0
  144. package/dist/core/Identifiers.mjs.map +1 -0
  145. package/dist/core/Memory.d.mts +57 -0
  146. package/dist/core/Memory.mjs +203 -0
  147. package/dist/core/Memory.mjs.map +1 -0
  148. package/dist/core/MemoryNamespace.d.mts +2 -0
  149. package/dist/core/MemoryNamespace.mjs +116 -0
  150. package/dist/core/MemoryNamespace.mjs.map +1 -0
  151. package/dist/core/MemoryReference.d.mts +2 -0
  152. package/dist/core/MemoryReference.mjs +109 -0
  153. package/dist/core/MemoryReference.mjs.map +1 -0
  154. package/dist/core/MemoryRevalidation.d.mts +65 -0
  155. package/dist/core/MemoryRevalidation.mjs +126 -0
  156. package/dist/core/MemoryRevalidation.mjs.map +1 -0
  157. package/dist/core/MemoryStore.d.mts +186 -0
  158. package/dist/core/MemoryStore.mjs +243 -0
  159. package/dist/core/MemoryStore.mjs.map +1 -0
  160. package/dist/core/Receipt.d.mts +2 -0
  161. package/dist/core/Receipt.mjs +36 -0
  162. package/dist/core/Receipt.mjs.map +1 -0
  163. package/dist/core/RememberingStore.d.mts +1562 -0
  164. package/dist/core/RememberingStore.mjs +190 -0
  165. package/dist/core/RememberingStore.mjs.map +1 -0
  166. package/dist/core/RunEvent.d.mts +2 -0
  167. package/dist/core/RunEvent.mjs +337 -0
  168. package/dist/core/RunEvent.mjs.map +1 -0
  169. package/dist/core/RunPolicyUsage.d.mts +2 -0
  170. package/dist/core/RunPolicyUsage.mjs +21 -0
  171. package/dist/core/RunPolicyUsage.mjs.map +1 -0
  172. package/dist/core/SemanticMemoryIndex.d.mts +826 -0
  173. package/dist/core/SemanticMemoryIndex.mjs +185 -0
  174. package/dist/core/SemanticMemoryIndex.mjs.map +1 -0
  175. package/dist/core/SemanticMemoryRevalidation.d.mts +45 -0
  176. package/dist/core/SemanticMemoryRevalidation.mjs +191 -0
  177. package/dist/core/SemanticMemoryRevalidation.mjs.map +1 -0
  178. package/dist/core/SubagentContract.d.mts +2 -0
  179. package/dist/core/SubagentContract.mjs +148 -0
  180. package/dist/core/SubagentContract.mjs.map +1 -0
  181. package/dist/core/Thread.d.mts +2 -0
  182. package/dist/core/Thread.mjs +250 -0
  183. package/dist/core/Thread.mjs.map +1 -0
  184. package/dist/core/ToolResult.d.mts +2 -0
  185. package/dist/core/ToolResult.mjs +140 -0
  186. package/dist/core/ToolResult.mjs.map +1 -0
  187. package/dist/core/Usage.d.mts +2 -0
  188. package/dist/core/Usage.mjs +319 -0
  189. package/dist/core/Usage.mjs.map +1 -0
  190. package/dist/core/Worker.d.mts +3 -0
  191. package/dist/core/Worker.mjs +147 -0
  192. package/dist/core/Worker.mjs.map +1 -0
  193. package/dist/durable/ActivityStore.d.mts +116 -0
  194. package/dist/durable/ActivityStore.mjs +131 -0
  195. package/dist/durable/ActivityStore.mjs.map +1 -0
  196. package/dist/durable/Admin.d.mts +2 -0
  197. package/dist/durable/Admin.mjs +328 -0
  198. package/dist/durable/Admin.mjs.map +1 -0
  199. package/dist/durable/AgentRegistration.d.mts +2 -0
  200. package/dist/durable/AgentRegistration.mjs +14 -0
  201. package/dist/durable/AgentRegistration.mjs.map +1 -0
  202. package/dist/durable/Certification.d.mts +111 -0
  203. package/dist/durable/Certification.mjs +159 -0
  204. package/dist/durable/Certification.mjs.map +1 -0
  205. package/dist/durable/CommittedActivity.d.mts +62 -0
  206. package/dist/durable/CommittedActivity.mjs +159 -0
  207. package/dist/durable/CommittedActivity.mjs.map +1 -0
  208. package/dist/durable/Digest.d.mts +2 -0
  209. package/dist/durable/Digest.mjs +50 -0
  210. package/dist/durable/Digest.mjs.map +1 -0
  211. package/dist/durable/DurableAgentRuntime.d.mts +3 -0
  212. package/dist/durable/DurableAgentRuntime.mjs +3 -0
  213. package/dist/durable/DurableFailpoint.d.mts +2 -0
  214. package/dist/durable/DurableFailpoint.mjs +94 -0
  215. package/dist/durable/DurableFailpoint.mjs.map +1 -0
  216. package/dist/durable/DurableFailpointTestControl.d.mts +15 -0
  217. package/dist/durable/DurableFailpointTestControl.mjs +19 -0
  218. package/dist/durable/DurableFailpointTestControl.mjs.map +1 -0
  219. package/dist/durable/EventSource.d.mts +2 -0
  220. package/dist/durable/EventSource.mjs +65 -0
  221. package/dist/durable/EventSource.mjs.map +1 -0
  222. package/dist/durable/GitHubWorkflowSource.d.mts +144 -0
  223. package/dist/durable/GitHubWorkflowSource.mjs +209 -0
  224. package/dist/durable/GitHubWorkflowSource.mjs.map +1 -0
  225. package/dist/durable/MessageDelivery.d.mts +492 -0
  226. package/dist/durable/MessageDelivery.mjs +495 -0
  227. package/dist/durable/MessageDelivery.mjs.map +1 -0
  228. package/dist/durable/MessageDeliveryStoreConformance.d.mts +358 -0
  229. package/dist/durable/MessageDeliveryStoreConformance.mjs +243 -0
  230. package/dist/durable/MessageDeliveryStoreConformance.mjs.map +1 -0
  231. package/dist/durable/OperationAuthorizer.d.mts +2 -0
  232. package/dist/durable/OperationAuthorizer.mjs +70 -0
  233. package/dist/durable/OperationAuthorizer.mjs.map +1 -0
  234. package/dist/durable/PersistentHistory.d.mts +16 -0
  235. package/dist/durable/PersistentHistory.mjs +125 -0
  236. package/dist/durable/PersistentHistory.mjs.map +1 -0
  237. package/dist/durable/PreparedInputAdmission.d.mts +2 -0
  238. package/dist/durable/PreparedInputAdmission.mjs +34 -0
  239. package/dist/durable/PreparedInputAdmission.mjs.map +1 -0
  240. package/dist/durable/Records.d.mts +2 -0
  241. package/dist/durable/Records.mjs +795 -0
  242. package/dist/durable/Records.mjs.map +1 -0
  243. package/dist/durable/Recovery.d.mts +2 -0
  244. package/dist/durable/Recovery.mjs +739 -0
  245. package/dist/durable/Recovery.mjs.map +1 -0
  246. package/dist/durable/RunJournal.d.mts +2 -0
  247. package/dist/durable/RunJournal.mjs +2 -0
  248. package/dist/durable/Schedule.d.mts +2 -0
  249. package/dist/durable/Schedule.mjs +382 -0
  250. package/dist/durable/Schedule.mjs.map +1 -0
  251. package/dist/durable/ScheduleStoreConformance.d.mts +18 -0
  252. package/dist/durable/ScheduleStoreConformance.mjs +420 -0
  253. package/dist/durable/ScheduleStoreConformance.mjs.map +1 -0
  254. package/dist/durable/ScheduleTransition.d.mts +24 -0
  255. package/dist/durable/ScheduleTransition.mjs +180 -0
  256. package/dist/durable/ScheduleTransition.mjs.map +1 -0
  257. package/dist/durable/Scheduling.d.mts +54 -0
  258. package/dist/durable/Scheduling.mjs +2 -0
  259. package/dist/durable/SqlMemoryStore.d.mts +30 -0
  260. package/dist/durable/SqlMemoryStore.mjs +436 -0
  261. package/dist/durable/SqlMemoryStore.mjs.map +1 -0
  262. package/dist/durable/SqlMessageDeliveryStore.d.mts +40 -0
  263. package/dist/durable/SqlMessageDeliveryStore.mjs +167 -0
  264. package/dist/durable/SqlMessageDeliveryStore.mjs.map +1 -0
  265. package/dist/durable/SqlStorageV2Upgrade.d.mts +22 -0
  266. package/dist/durable/SqlStorageV2Upgrade.mjs +459 -0
  267. package/dist/durable/SqlStorageV2Upgrade.mjs.map +1 -0
  268. package/dist/durable/SqlSubscriptionStore.d.mts +63 -0
  269. package/dist/durable/SqlSubscriptionStore.mjs +751 -0
  270. package/dist/durable/SqlSubscriptionStore.mjs.map +1 -0
  271. package/dist/durable/SubmissionLedger.d.mts +3 -0
  272. package/dist/durable/SubmissionLedger.mjs +914 -0
  273. package/dist/durable/SubmissionLedger.mjs.map +1 -0
  274. package/dist/durable/SubmissionLedgerConformance.d.mts +30 -0
  275. package/dist/durable/SubmissionLedgerConformance.mjs +1986 -0
  276. package/dist/durable/SubmissionLedgerConformance.mjs.map +1 -0
  277. package/dist/durable/SubmissionStatus.d.mts +2 -0
  278. package/dist/durable/SubmissionStatus.mjs +18 -0
  279. package/dist/durable/SubmissionStatus.mjs.map +1 -0
  280. package/dist/durable/Subscription.d.mts +2 -0
  281. package/dist/durable/Subscription.mjs +360 -0
  282. package/dist/durable/Subscription.mjs.map +1 -0
  283. package/dist/durable/SubscriptionInput.d.mts +2 -0
  284. package/dist/durable/SubscriptionInput.mjs +52 -0
  285. package/dist/durable/SubscriptionInput.mjs.map +1 -0
  286. package/dist/durable/SubscriptionStoreConformance.d.mts +17 -0
  287. package/dist/durable/SubscriptionStoreConformance.mjs +625 -0
  288. package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -0
  289. package/dist/durable/SubscriptionTools.d.mts +273 -0
  290. package/dist/durable/SubscriptionTools.mjs +190 -0
  291. package/dist/durable/SubscriptionTools.mjs.map +1 -0
  292. package/dist/durable/SubscriptionTransition.d.mts +21 -0
  293. package/dist/durable/SubscriptionTransition.mjs +148 -0
  294. package/dist/durable/SubscriptionTransition.mjs.map +1 -0
  295. package/dist/durable/Subscriptions.d.mts +73 -0
  296. package/dist/durable/Subscriptions.mjs +627 -0
  297. package/dist/durable/Subscriptions.mjs.map +1 -0
  298. package/dist/durable/ThreadContextHistory.d.mts +32 -0
  299. package/dist/durable/ThreadContextHistory.mjs +152 -0
  300. package/dist/durable/ThreadContextHistory.mjs.map +1 -0
  301. package/dist/durable/ThreadContextHistoryProjection.d.mts +60 -0
  302. package/dist/durable/ThreadContextHistoryProjection.mjs +149 -0
  303. package/dist/durable/ThreadContextHistoryProjection.mjs.map +1 -0
  304. package/dist/durable/ThreadInvariants.d.mts +74 -0
  305. package/dist/durable/ThreadInvariants.mjs +200 -0
  306. package/dist/durable/ThreadInvariants.mjs.map +1 -0
  307. package/dist/durable/ThreadProjection.d.mts +78 -0
  308. package/dist/durable/ThreadProjection.mjs +158 -0
  309. package/dist/durable/ThreadProjection.mjs.map +1 -0
  310. package/dist/durable/ThreadProjectionMaintenance.d.mts +49 -0
  311. package/dist/durable/ThreadProjectionMaintenance.mjs +33 -0
  312. package/dist/durable/ThreadProjectionMaintenance.mjs.map +1 -0
  313. package/dist/durable/ThreadStore.d.mts +2 -0
  314. package/dist/durable/ThreadStore.mjs +147 -0
  315. package/dist/durable/ThreadStore.mjs.map +1 -0
  316. package/dist/durable/ThreadStoreConformance.d.mts +29 -0
  317. package/dist/durable/ThreadStoreConformance.mjs +248 -0
  318. package/dist/durable/ThreadStoreConformance.mjs.map +1 -0
  319. package/dist/durable/ToolReconciler.d.mts +2 -0
  320. package/dist/durable/ToolReconciler.mjs +81 -0
  321. package/dist/durable/ToolReconciler.mjs.map +1 -0
  322. package/dist/durable/WakeScheduler.d.mts +2 -0
  323. package/dist/durable/WakeScheduler.mjs +85 -0
  324. package/dist/durable/WakeScheduler.mjs.map +1 -0
  325. package/dist/durable/WorkerHost.d.mts +129 -0
  326. package/dist/durable/WorkerHost.mjs +77 -0
  327. package/dist/durable/WorkerHost.mjs.map +1 -0
  328. package/dist/engine/AgentRuntime.d.mts +2 -0
  329. package/dist/engine/AgentRuntime.mjs +2 -0
  330. package/dist/engine/Compaction.d.mts +7 -0
  331. package/dist/engine/Compaction.mjs +16 -0
  332. package/dist/engine/Compaction.mjs.map +1 -0
  333. package/dist/engine/ContextCompactor.d.mts +2 -0
  334. package/dist/engine/ContextCompactor.mjs +119 -0
  335. package/dist/engine/ContextCompactor.mjs.map +1 -0
  336. package/dist/engine/ContextHistory.d.mts +65 -0
  337. package/dist/engine/ContextHistory.mjs +76 -0
  338. package/dist/engine/ContextHistory.mjs.map +1 -0
  339. package/dist/engine/ContextWindow.d.mts +2 -0
  340. package/dist/engine/ContextWindow.mjs +59 -0
  341. package/dist/engine/ContextWindow.mjs.map +1 -0
  342. package/dist/engine/DurableStep.d.mts +2 -0
  343. package/dist/engine/DurableStep.mjs +62 -0
  344. package/dist/engine/DurableStep.mjs.map +1 -0
  345. package/dist/engine/MessagingHost.d.mts +2 -0
  346. package/dist/engine/MessagingHost.mjs +2 -0
  347. package/dist/engine/Output.d.mts +2 -0
  348. package/dist/engine/Output.mjs +8 -0
  349. package/dist/engine/Output.mjs.map +1 -0
  350. package/dist/engine/RunEventSink.d.mts +2 -0
  351. package/dist/engine/RunEventSink.mjs +22 -0
  352. package/dist/engine/RunEventSink.mjs.map +1 -0
  353. package/dist/engine/RunOptions.d.mts +2 -0
  354. package/dist/engine/RunOptions.mjs +122 -0
  355. package/dist/engine/RunOptions.mjs.map +1 -0
  356. package/dist/engine/SubagentHost.d.mts +2 -0
  357. package/dist/engine/SubagentHost.mjs +72 -0
  358. package/dist/engine/SubagentHost.mjs.map +1 -0
  359. package/dist/engine/ThreadHistory.d.mts +2 -0
  360. package/dist/engine/ThreadHistory.mjs +67 -0
  361. package/dist/engine/ThreadHistory.mjs.map +1 -0
  362. package/dist/engine/ToolBroker.d.mts +2 -0
  363. package/dist/engine/ToolBroker.mjs +42 -0
  364. package/dist/engine/ToolBroker.mjs.map +1 -0
  365. package/dist/foreign-diagnostic-DBQ1XHKh.mjs +37 -0
  366. package/dist/foreign-diagnostic-DBQ1XHKh.mjs.map +1 -0
  367. package/dist/index.d.mts +89 -6
  368. package/dist/index.mjs +98 -6
  369. package/dist/output-contract-BC7tjlGw.mjs +84 -0
  370. package/dist/output-contract-BC7tjlGw.mjs.map +1 -0
  371. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  372. package/dist/sandbox/CodeExecutor.d.mts +194 -0
  373. package/dist/sandbox/CodeExecutor.mjs +278 -0
  374. package/dist/sandbox/CodeExecutor.mjs.map +1 -0
  375. package/dist/sandbox/InteractiveBrowser.d.mts +142 -0
  376. package/dist/sandbox/InteractiveBrowser.mjs +165 -0
  377. package/dist/sandbox/InteractiveBrowser.mjs.map +1 -0
  378. package/dist/sandbox/PageCapture.d.mts +2 -0
  379. package/dist/sandbox/PageCapture.mjs +450 -0
  380. package/dist/sandbox/PageCapture.mjs.map +1 -0
  381. package/dist/sandbox/PageCrawl.d.mts +88 -0
  382. package/dist/sandbox/PageCrawl.mjs +124 -0
  383. package/dist/sandbox/PageCrawl.mjs.map +1 -0
  384. package/dist/sandbox/PageScreenshot.d.mts +2 -0
  385. package/dist/sandbox/PageScreenshot.mjs +53 -0
  386. package/dist/sandbox/PageScreenshot.mjs.map +1 -0
  387. package/dist/sandbox/ProtectedBrowser.d.mts +273 -0
  388. package/dist/sandbox/ProtectedBrowser.mjs +287 -0
  389. package/dist/sandbox/ProtectedBrowser.mjs.map +1 -0
  390. package/dist/sandbox/Sandbox.d.mts +2 -0
  391. package/dist/sandbox/Sandbox.mjs +208 -0
  392. package/dist/sandbox/Sandbox.mjs.map +1 -0
  393. package/dist/utf8-BYfhEkcj.mjs +11 -0
  394. package/dist/utf8-BYfhEkcj.mjs.map +1 -0
  395. package/dist/utf8-DchGZRBd.mjs +23 -0
  396. package/dist/utf8-DchGZRBd.mjs.map +1 -0
  397. package/package.json +1 -40
  398. package/src/Ephemeral.ts +17 -0
  399. package/src/ToolExposure.ts +2 -0
  400. package/src/capabilities/Approval.ts +352 -0
  401. package/src/capabilities/Budget.ts +536 -0
  402. package/src/capabilities/CodeMode.ts +1090 -0
  403. package/src/capabilities/Commands.ts +86 -0
  404. package/src/capabilities/ContextTools.ts +184 -0
  405. package/src/capabilities/Mcp.ts +427 -0
  406. package/src/capabilities/McpClient.ts +967 -0
  407. package/src/capabilities/MemoryNotes.ts +174 -0
  408. package/src/capabilities/Messaging.ts +261 -0
  409. package/src/capabilities/ModelContext.ts +354 -0
  410. package/src/capabilities/Redaction.ts +157 -0
  411. package/src/capabilities/Remembering.ts +550 -0
  412. package/src/capabilities/RunHooks.ts +280 -0
  413. package/src/capabilities/SemanticMemory.ts +447 -0
  414. package/src/capabilities/Subagent.ts +2277 -0
  415. package/src/capabilities/SubagentReservations.ts +850 -0
  416. package/src/capabilities/ToolDiscovery.ts +339 -0
  417. package/src/capabilities/WebCapture.ts +722 -0
  418. package/src/capabilities/WebSearch.ts +184 -0
  419. package/src/capabilities/internal/subagent-background.ts +1106 -0
  420. package/src/capabilities/internal/subagent-contract.ts +142 -0
  421. package/src/capabilities/internal/subagent-policy.ts +235 -0
  422. package/src/capabilities/internal/subagent-reporting.ts +261 -0
  423. package/src/capabilities/internal/utf8.ts +10 -0
  424. package/src/core/Agent.ts +575 -0
  425. package/src/core/AgentError.ts +152 -0
  426. package/src/core/AgentPolicy.ts +153 -0
  427. package/src/core/AgentUpdates.ts +100 -0
  428. package/src/core/IdGenerator.ts +39 -0
  429. package/src/core/Identifiers.ts +48 -0
  430. package/src/core/Memory.ts +290 -0
  431. package/src/core/MemoryNamespace.ts +196 -0
  432. package/src/core/MemoryReference.ts +121 -0
  433. package/src/core/MemoryRevalidation.ts +185 -0
  434. package/src/core/MemoryStore.ts +368 -0
  435. package/src/core/Messaging.ts +90 -0
  436. package/src/core/Receipt.ts +42 -0
  437. package/src/core/RememberingStore.ts +300 -0
  438. package/src/core/RunEvent.ts +366 -0
  439. package/src/core/RunPolicyUsage.ts +17 -0
  440. package/src/core/SemanticMemoryIndex.ts +250 -0
  441. package/src/core/SemanticMemoryRevalidation.ts +254 -0
  442. package/src/core/SubagentContract.ts +196 -0
  443. package/src/core/Thread.ts +371 -0
  444. package/src/core/ToolExposure.ts +74 -0
  445. package/src/core/ToolResult.ts +170 -0
  446. package/src/core/Usage.ts +529 -0
  447. package/src/core/Worker.ts +173 -0
  448. package/src/core/internal/agent-updates.ts +32 -0
  449. package/src/core/internal/utf8.ts +23 -0
  450. package/src/durable/ActivityStore.ts +160 -0
  451. package/src/durable/Admin.ts +496 -0
  452. package/src/durable/AgentRegistration.ts +13 -0
  453. package/src/durable/Certification.ts +210 -0
  454. package/src/durable/CommittedActivity.ts +296 -0
  455. package/src/durable/Digest.ts +93 -0
  456. package/src/durable/DurableAgentRuntime.ts +10340 -0
  457. package/src/durable/DurableFailpoint.ts +103 -0
  458. package/src/durable/DurableFailpointTestControl.ts +39 -0
  459. package/src/durable/EventSource.ts +172 -0
  460. package/src/durable/GitHubWorkflowSource.ts +453 -0
  461. package/src/durable/MessageDelivery.ts +708 -0
  462. package/src/durable/MessageDeliveryStoreConformance.ts +363 -0
  463. package/src/durable/OperationAuthorizer.ts +85 -0
  464. package/src/durable/PersistentHistory.ts +260 -0
  465. package/src/durable/PreparedInputAdmission.ts +44 -0
  466. package/src/durable/Records.ts +1010 -0
  467. package/src/durable/Recovery.ts +1018 -0
  468. package/src/durable/RunJournal.ts +1479 -0
  469. package/src/durable/Schedule.ts +504 -0
  470. package/src/durable/ScheduleStoreConformance.ts +638 -0
  471. package/src/durable/ScheduleTransition.ts +265 -0
  472. package/src/durable/Scheduling.ts +1077 -0
  473. package/src/durable/SqlMemoryStore.ts +778 -0
  474. package/src/durable/SqlMessageDeliveryStore.ts +302 -0
  475. package/src/durable/SqlStorageV2Upgrade.ts +500 -0
  476. package/src/durable/SqlSubscriptionStore.ts +1440 -0
  477. package/src/durable/SubmissionLedger.ts +1201 -0
  478. package/src/durable/SubmissionLedgerConformance.ts +4579 -0
  479. package/src/durable/SubmissionStatus.ts +14 -0
  480. package/src/durable/Subscription.ts +544 -0
  481. package/src/durable/SubscriptionInput.ts +144 -0
  482. package/src/durable/SubscriptionStoreConformance.ts +945 -0
  483. package/src/durable/SubscriptionTools.ts +327 -0
  484. package/src/durable/SubscriptionTransition.ts +302 -0
  485. package/src/durable/Subscriptions.ts +1210 -0
  486. package/src/durable/ThreadContextHistory.ts +227 -0
  487. package/src/durable/ThreadContextHistoryProjection.ts +216 -0
  488. package/src/durable/ThreadInvariants.ts +442 -0
  489. package/src/durable/ThreadProjection.ts +269 -0
  490. package/src/durable/ThreadProjectionMaintenance.ts +67 -0
  491. package/src/durable/ThreadStore.ts +242 -0
  492. package/src/durable/ThreadStoreConformance.ts +710 -0
  493. package/src/durable/ToolReconciler.ts +105 -0
  494. package/src/durable/WakeScheduler.ts +134 -0
  495. package/src/durable/WorkerHost.ts +171 -0
  496. package/src/durable/internal/agent-registration.ts +525 -0
  497. package/src/durable/internal/agent-updates.ts +302 -0
  498. package/src/durable/internal/foreign-diagnostic.ts +47 -0
  499. package/src/durable/internal/journal-checkpoint.ts +104 -0
  500. package/src/durable/internal/journal-metadata.ts +107 -0
  501. package/src/durable/internal/messaging-host.ts +608 -0
  502. package/src/durable/internal/schedule-time.ts +303 -0
  503. package/src/durable/internal/storage-v2-layout.ts +163 -0
  504. package/src/durable/internal/storage-v2.ts +73 -0
  505. package/src/durable/internal/worker-host.ts +2467 -0
  506. package/src/durable/internal/worker-runtime.ts +9 -0
  507. package/src/engine/AgentRuntime.ts +37 -0
  508. package/src/engine/Compaction.ts +11 -0
  509. package/src/engine/ContextCompactor.ts +277 -0
  510. package/src/engine/ContextHistory.ts +73 -0
  511. package/src/engine/ContextWindow.ts +72 -0
  512. package/src/engine/DurableStep.ts +132 -0
  513. package/src/engine/MessagingHost.ts +110 -0
  514. package/src/engine/Output.ts +2 -0
  515. package/src/engine/RunEventSink.ts +132 -0
  516. package/src/engine/RunOptions.ts +1077 -0
  517. package/src/engine/SubagentHost.ts +181 -0
  518. package/src/engine/ThreadHistory.ts +120 -0
  519. package/src/engine/ToolBroker.ts +157 -0
  520. package/src/engine/ToolExposure.ts +48 -0
  521. package/src/engine/internal/agent-runtime.ts +10162 -0
  522. package/src/engine/internal/bounded-value.ts +315 -0
  523. package/src/engine/internal/compaction.ts +678 -0
  524. package/src/engine/internal/error-diagnostic.ts +39 -0
  525. package/src/engine/internal/output-contract.ts +173 -0
  526. package/src/engine/internal/primitive-delta.ts +80 -0
  527. package/src/engine/internal/provider-result-staging.ts +211 -0
  528. package/src/engine/internal/tool-derivative.ts +106 -0
  529. package/src/engine/internal/tool-exposure.ts +224 -0
  530. package/src/engine/internal/tool-telemetry.ts +484 -0
  531. package/src/index.ts +97 -22
  532. package/src/sandbox/CodeExecutor.ts +352 -0
  533. package/src/sandbox/InteractiveBrowser.ts +257 -0
  534. package/src/sandbox/PageCapture.ts +692 -0
  535. package/src/sandbox/PageCrawl.ts +148 -0
  536. package/src/sandbox/PageScreenshot.ts +81 -0
  537. package/src/sandbox/ProtectedBrowser.ts +436 -0
  538. package/src/sandbox/Sandbox.ts +241 -0
@@ -0,0 +1,850 @@
1
+ import { Context, Effect, Layer, Ref, Schema, type Scope, Semaphore } from "effect";
2
+
3
+ import { RunId, ToolCallId } from "../core/Identifiers.ts";
4
+ import { SubagentDelegationCaps, SubagentReservationAmounts } from "../core/SubagentContract.ts";
5
+
6
+ const Natural = Schema.Natural;
7
+
8
+ /**
9
+ * Stable identity of one parent-owned Subagent budget reservation.
10
+ *
11
+ * Derivation rule (see {@link makeBudgetReservationId}):
12
+ * `encodeURIComponent(parentRunId) + ":" + encodeURIComponent(parentToolCallId)`.
13
+ * Component encoding escapes `:`; the mapping is injective for every
14
+ * `(parentRunId, parentToolCallId)` pair.
15
+ */
16
+ export const BudgetReservationId = Schema.NonEmptyString.pipe(
17
+ Schema.brand("@effect-agent/capabilities/BudgetReservationId"),
18
+ );
19
+
20
+ export type BudgetReservationId = typeof BudgetReservationId.Type;
21
+
22
+ const decodeBudgetReservationId = Schema.decodeSync(BudgetReservationId);
23
+
24
+ /** Derive the stable reservation identity of one Subagent Invocation. */
25
+ export const makeBudgetReservationId = (
26
+ parentRunId: RunId,
27
+ parentToolCallId: ToolCallId,
28
+ ): BudgetReservationId =>
29
+ decodeBudgetReservationId(
30
+ `${encodeURIComponent(parentRunId)}:${encodeURIComponent(parentToolCallId)}`,
31
+ );
32
+
33
+ /** One enforced hierarchical delegation budget dimension. */
34
+ export const SubagentBudgetDimension = Schema.Literals([
35
+ "total-child-invocations",
36
+ "concurrent-children",
37
+ "turns",
38
+ "tool-calls",
39
+ "duration",
40
+ "input-tokens",
41
+ "output-tokens",
42
+ "cost",
43
+ "result-bytes",
44
+ ]);
45
+
46
+ export type SubagentBudgetDimension = typeof SubagentBudgetDimension.Type;
47
+
48
+ const AmountFields = SubagentReservationAmounts.fields;
49
+
50
+ const OptionalAmountFields = {
51
+ turns: Schema.optionalKey(Natural),
52
+ toolCalls: Schema.optionalKey(Natural),
53
+ durationMillis: Schema.optionalKey(Natural),
54
+ inputTokens: Schema.optionalKey(Natural),
55
+ outputTokens: Schema.optionalKey(Natural),
56
+ costMicrousd: Schema.optionalKey(Natural),
57
+ resultBytes: Schema.optionalKey(Natural),
58
+ } as const;
59
+
60
+ /** Observed child usage. An absent dimension was never reported and settles conservatively. */
61
+ export class SubagentObservedUsage extends Schema.Class<SubagentObservedUsage>(
62
+ "@effect-agent/capabilities/SubagentObservedUsage",
63
+ )(OptionalAmountFields) {}
64
+
65
+ /** Remaining delegable allocation per configured dimension. Absent means not configured. */
66
+ export class SubagentAvailableAmounts extends Schema.Class<SubagentAvailableAmounts>(
67
+ "@effect-agent/capabilities/SubagentAvailableAmounts",
68
+ )(OptionalAmountFields) {}
69
+
70
+ /** Reservation lifecycle: absent → reserved → releasePending → released. */
71
+ export const SubagentReservationStatus = Schema.Literals([
72
+ "reserved",
73
+ "releasePending",
74
+ "released",
75
+ ]);
76
+
77
+ export type SubagentReservationStatus = typeof SubagentReservationStatus.Type;
78
+
79
+ /** All-or-nothing allocation request for one Subagent Invocation. */
80
+ export class SubagentReservationRequest extends Schema.Class<SubagentReservationRequest>(
81
+ "@effect-agent/capabilities/SubagentReservationRequest",
82
+ )({
83
+ parentRunId: RunId,
84
+ parentToolCallId: ToolCallId,
85
+ allocation: SubagentReservationAmounts,
86
+ /** Additional invocation slots held for this child's entire subtree. */
87
+ descendantInvocations: Schema.optionalKey(Natural),
88
+ }) {}
89
+
90
+ /** Accounting snapshot of one reservation: allocated, observed, covered, released, and overrun. */
91
+ export class SubagentReservationView extends Schema.Class<SubagentReservationView>(
92
+ "@effect-agent/capabilities/SubagentReservationView",
93
+ )({
94
+ reservationId: BudgetReservationId,
95
+ parentRunId: RunId,
96
+ parentToolCallId: ToolCallId,
97
+ status: SubagentReservationStatus,
98
+ allocated: SubagentReservationAmounts,
99
+ observedConsumed: SubagentObservedUsage,
100
+ coveredConsumed: SubagentReservationAmounts,
101
+ released: SubagentReservationAmounts,
102
+ overrun: SubagentReservationAmounts,
103
+ }) {}
104
+
105
+ /** Aggregate parent delegation budget snapshot including every reservation it owns. */
106
+ export class SubagentParentBudgetView extends Schema.Class<SubagentParentBudgetView>(
107
+ "@effect-agent/capabilities/SubagentParentBudgetView",
108
+ )({
109
+ parentRunId: RunId,
110
+ caps: SubagentDelegationCaps,
111
+ totalChildInvocations: Natural,
112
+ available: SubagentAvailableAmounts,
113
+ cumulativeOverrun: SubagentReservationAmounts,
114
+ reservations: Schema.Array(SubagentReservationView),
115
+ }) {}
116
+
117
+ /** All-or-nothing admission failed: one dimension cannot cover the requested allocation. */
118
+ export class SubagentBudgetExhausted extends Schema.TaggedError<SubagentBudgetExhausted>()(
119
+ "SubagentBudgetExhausted",
120
+ {
121
+ parentRunId: RunId,
122
+ dimension: SubagentBudgetDimension,
123
+ limitValue: Natural,
124
+ observedValue: Natural,
125
+ },
126
+ ) {}
127
+
128
+ /** The stable key is already reserved with a different allocation; neither request may win silently. */
129
+ export class SubagentReservationConflict extends Schema.TaggedError<SubagentReservationConflict>()(
130
+ "SubagentReservationConflict",
131
+ {
132
+ reservationId: BudgetReservationId,
133
+ existingAllocation: SubagentReservationAmounts,
134
+ requestedAllocation: SubagentReservationAmounts,
135
+ },
136
+ ) {}
137
+
138
+ /** No reservation exists for this identity. */
139
+ export class SubagentReservationUnknown extends Schema.TaggedError<SubagentReservationUnknown>()(
140
+ "SubagentReservationUnknown",
141
+ {
142
+ reservationId: BudgetReservationId,
143
+ },
144
+ ) {}
145
+
146
+ /** No delegation budget was registered for this parent Run. */
147
+ export class SubagentParentBudgetUnknown extends Schema.TaggedError<SubagentParentBudgetUnknown>()(
148
+ "SubagentParentBudgetUnknown",
149
+ {
150
+ parentRunId: RunId,
151
+ },
152
+ ) {}
153
+
154
+ /** The parent Run is already registered with different caps; neither set may win silently. */
155
+ export class SubagentParentBudgetConflict extends Schema.TaggedError<SubagentParentBudgetConflict>()(
156
+ "SubagentParentBudgetConflict",
157
+ {
158
+ parentRunId: RunId,
159
+ },
160
+ ) {}
161
+
162
+ /** A parent budget cannot retire while one of its child reservations is unsettled. */
163
+ export class SubagentParentBudgetActive extends Schema.TaggedError<SubagentParentBudgetActive>()(
164
+ "SubagentParentBudgetActive",
165
+ {
166
+ parentRunId: RunId,
167
+ openReservations: Natural,
168
+ },
169
+ ) {}
170
+
171
+ /**
172
+ * Parent-owned hierarchical Subagent budget reservation authority.
173
+ *
174
+ * Every transition is a single atomic `Ref` update, so parallel children can
175
+ * never observe and spend the same remainder. The post-response usage hook in
176
+ * `budget.ts` is deliberately not reused here: it accounts after the fact and
177
+ * is not a reservation service.
178
+ */
179
+ export class SubagentReservations extends Context.Service<
180
+ SubagentReservations,
181
+ {
182
+ /**
183
+ * Register the finite delegable budget of one parent Run. Re-registering
184
+ * identical caps returns the existing registration; different caps fail
185
+ * rather than silently winning.
186
+ */
187
+ readonly registerParent: (
188
+ parentRunId: RunId,
189
+ caps: SubagentDelegationCaps,
190
+ ) => Effect.Effect<SubagentParentBudgetView, SubagentParentBudgetConflict>;
191
+ /**
192
+ * Atomically reserve an all-or-nothing child allocation from the parent's
193
+ * remaining delegable budget, checking every dimension before committing
194
+ * any. The same key with the same allocation is idempotent and never
195
+ * double-reserves; a distinct key charges the monotonic total-invocation
196
+ * counter by one plus its reserved descendant slots, which release never refunds.
197
+ */
198
+ readonly reserve: (
199
+ request: SubagentReservationRequest,
200
+ ) => Effect.Effect<
201
+ SubagentReservationView,
202
+ SubagentBudgetExhausted | SubagentReservationConflict | SubagentParentBudgetUnknown
203
+ >;
204
+ /**
205
+ * Record observed child usage against a reservation. Usage above the
206
+ * reserved amount is recorded as overrun and charged to the parent
207
+ * aggregate, never clipped. Usage observed after settlement begins is
208
+ * pure overrun and cannot create budget.
209
+ */
210
+ readonly observe: (
211
+ reservationId: BudgetReservationId,
212
+ usage: SubagentObservedUsage,
213
+ ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;
214
+ /**
215
+ * `reserved → releasePending`: freeze the settlement decision. A dimension
216
+ * with no observed usage conservatively consumes its reserved amount.
217
+ * Idempotent once settlement has begun.
218
+ */
219
+ readonly beginRelease: (
220
+ reservationId: BudgetReservationId,
221
+ ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;
222
+ /**
223
+ * `releasePending → released`: return the unused allocation to the parent
224
+ * exactly once. Called on a still-reserved reservation it settles through
225
+ * `releasePending` in the same atomic update. Idempotent once released.
226
+ */
227
+ readonly release: (
228
+ reservationId: BudgetReservationId,
229
+ ) => Effect.Effect<SubagentReservationView, SubagentReservationUnknown>;
230
+ /**
231
+ * Acquire bounded child execution slots as a Scope-owned resource, so
232
+ * an interrupted child always frees its slot. The Semaphore bounds only
233
+ * concurrent children; a subtree holds one plus its possible descendants up front.
234
+ * Total invocations are enforced separately by
235
+ * `reserve`'s monotonic counter. A configured cap of zero fails closed
236
+ * instead of queueing forever; an unconfigured cap leaves execution
237
+ * ungated by this service.
238
+ */
239
+ readonly acquireChildSlot: (
240
+ parentRunId: RunId,
241
+ slots?: number,
242
+ ) => Effect.Effect<void, SubagentParentBudgetUnknown | SubagentBudgetExhausted, Scope.Scope>;
243
+ /**
244
+ * Reclaim one terminal parent registration and all of its released child
245
+ * reservations. Retirement is idempotent; an unknown parent is already
246
+ * retired. Open reservations fail typed and leave the ledger unchanged.
247
+ * The Run owner must call this after its final accounting snapshot no
248
+ * longer needs to be observable.
249
+ */
250
+ readonly retireParent: (parentRunId: RunId) => Effect.Effect<void, SubagentParentBudgetActive>;
251
+ /** Read the aggregate parent view for auditing and conservation checks. */
252
+ readonly parentSnapshot: (
253
+ parentRunId: RunId,
254
+ ) => Effect.Effect<SubagentParentBudgetView, SubagentParentBudgetUnknown>;
255
+ }
256
+ >()("@effect-agent/capabilities/SubagentReservations") {}
257
+
258
+ type ReservableDimensionKey = keyof typeof AmountFields;
259
+
260
+ type Amounts = Readonly<Record<ReservableDimensionKey, number>>;
261
+ type PartialAmounts = Readonly<Partial<Record<ReservableDimensionKey, number>>>;
262
+
263
+ interface DimensionSpec {
264
+ readonly key: ReservableDimensionKey;
265
+ readonly dimension: SubagentBudgetDimension;
266
+ readonly cap: (caps: SubagentDelegationCaps) => number | undefined;
267
+ }
268
+
269
+ const dimensionSpecs: ReadonlyArray<DimensionSpec> = [
270
+ { key: "turns", dimension: "turns", cap: (caps) => caps.maxTurns },
271
+ { key: "toolCalls", dimension: "tool-calls", cap: (caps) => caps.maxToolCalls },
272
+ { key: "durationMillis", dimension: "duration", cap: (caps) => caps.maxDurationMillis },
273
+ { key: "inputTokens", dimension: "input-tokens", cap: (caps) => caps.maxInputTokens },
274
+ { key: "outputTokens", dimension: "output-tokens", cap: (caps) => caps.maxOutputTokens },
275
+ { key: "costMicrousd", dimension: "cost", cap: (caps) => caps.maxCostMicrousd },
276
+ { key: "resultBytes", dimension: "result-bytes", cap: (caps) => caps.maxResultBytes },
277
+ ];
278
+
279
+ const zeroAmounts: Amounts = {
280
+ turns: 0,
281
+ toolCalls: 0,
282
+ durationMillis: 0,
283
+ inputTokens: 0,
284
+ outputTokens: 0,
285
+ costMicrousd: 0,
286
+ resultBytes: 0,
287
+ };
288
+
289
+ interface ReservationState {
290
+ readonly parentRunId: RunId;
291
+ readonly parentToolCallId: ToolCallId;
292
+ readonly descendantInvocations: number;
293
+ readonly status: SubagentReservationStatus;
294
+ readonly allocated: Amounts;
295
+ readonly observed: PartialAmounts;
296
+ readonly covered: Amounts;
297
+ readonly overrun: Amounts;
298
+ }
299
+
300
+ interface ParentBudgetState {
301
+ readonly parentRunId: RunId;
302
+ readonly caps: SubagentDelegationCaps;
303
+ readonly gate: Semaphore.Semaphore | undefined;
304
+ /** Monotonic count of distinct reservations; never refunded by release. */
305
+ readonly totalChildInvocations: number;
306
+ /** Remaining delegable allocation for configured dimensions only. */
307
+ readonly available: PartialAmounts;
308
+ readonly cumulativeOverrun: Amounts;
309
+ }
310
+
311
+ interface ReservationLedger {
312
+ readonly parents: ReadonlyMap<RunId, ParentBudgetState>;
313
+ readonly reservations: ReadonlyMap<BudgetReservationId, ReservationState>;
314
+ }
315
+
316
+ type TransitionResult<A, E> =
317
+ | { readonly _tag: "ok"; readonly value: A }
318
+ | { readonly _tag: "error"; readonly error: E }
319
+ | { readonly _tag: "corrupt"; readonly message: string };
320
+
321
+ const ok = <A>(value: A): TransitionResult<A, never> => ({ _tag: "ok", value });
322
+ const fail = <E>(error: E): TransitionResult<never, E> => ({ _tag: "error", error });
323
+
324
+ const resolve = <A, E>(result: TransitionResult<A, E>): Effect.Effect<A, E> => {
325
+ switch (result._tag) {
326
+ case "ok":
327
+ return Effect.succeed(result.value);
328
+ case "error":
329
+ return Effect.fail(result.error);
330
+ case "corrupt":
331
+ return Effect.die(new Error(result.message));
332
+ }
333
+ };
334
+
335
+ const sameCaps = (a: SubagentDelegationCaps, b: SubagentDelegationCaps): boolean =>
336
+ a.maxTotalChildInvocations === b.maxTotalChildInvocations &&
337
+ a.maxConcurrentChildren === b.maxConcurrentChildren &&
338
+ a.maxTurns === b.maxTurns &&
339
+ a.maxToolCalls === b.maxToolCalls &&
340
+ a.maxDurationMillis === b.maxDurationMillis &&
341
+ a.maxInputTokens === b.maxInputTokens &&
342
+ a.maxOutputTokens === b.maxOutputTokens &&
343
+ a.maxCostMicrousd === b.maxCostMicrousd &&
344
+ a.maxResultBytes === b.maxResultBytes;
345
+
346
+ const sameAmounts = (a: Amounts, b: Amounts): boolean =>
347
+ dimensionSpecs.every((spec) => a[spec.key] === b[spec.key]);
348
+
349
+ const optionalAmounts = (partial: PartialAmounts): { [K in ReservableDimensionKey]?: number } => {
350
+ const out: { [K in ReservableDimensionKey]?: number } = {};
351
+
352
+ for (const spec of dimensionSpecs) {
353
+ const value = partial[spec.key];
354
+
355
+ if (value !== undefined) {
356
+ out[spec.key] = value;
357
+ }
358
+ }
359
+
360
+ return out;
361
+ };
362
+
363
+ /** Covered usage freezes at settlement, so the unused allocation remains stable afterward. */
364
+ const unusedAllocation = (reservation: ReservationState): Amounts => {
365
+ const unused = { ...zeroAmounts };
366
+
367
+ for (const spec of dimensionSpecs) {
368
+ unused[spec.key] = reservation.allocated[spec.key] - reservation.covered[spec.key];
369
+ }
370
+
371
+ return unused;
372
+ };
373
+
374
+ const reservationView = (
375
+ reservationId: BudgetReservationId,
376
+ state: ReservationState,
377
+ ): SubagentReservationView =>
378
+ SubagentReservationView.make({
379
+ reservationId,
380
+ parentRunId: state.parentRunId,
381
+ parentToolCallId: state.parentToolCallId,
382
+ status: state.status,
383
+ allocated: SubagentReservationAmounts.make(state.allocated),
384
+ observedConsumed: SubagentObservedUsage.make(optionalAmounts(state.observed)),
385
+ coveredConsumed: SubagentReservationAmounts.make(state.covered),
386
+ released: SubagentReservationAmounts.make(
387
+ state.status === "released" ? unusedAllocation(state) : zeroAmounts,
388
+ ),
389
+ overrun: SubagentReservationAmounts.make(state.overrun),
390
+ });
391
+
392
+ const parentView = (
393
+ ledger: ReservationLedger,
394
+ parent: ParentBudgetState,
395
+ ): SubagentParentBudgetView => {
396
+ const reservations: Array<SubagentReservationView> = [];
397
+
398
+ for (const [reservationId, reservation] of ledger.reservations) {
399
+ if (reservation.parentRunId === parent.parentRunId) {
400
+ reservations.push(reservationView(reservationId, reservation));
401
+ }
402
+ }
403
+
404
+ return SubagentParentBudgetView.make({
405
+ parentRunId: parent.parentRunId,
406
+ caps: parent.caps,
407
+ totalChildInvocations: parent.totalChildInvocations,
408
+ available: SubagentAvailableAmounts.make(optionalAmounts(parent.available)),
409
+ cumulativeOverrun: SubagentReservationAmounts.make(parent.cumulativeOverrun),
410
+ reservations,
411
+ });
412
+ };
413
+
414
+ const corruptParent = (parentRunId: RunId): TransitionResult<never, never> => ({
415
+ _tag: "corrupt",
416
+ message: `SubagentReservations ledger invariant violated: reservation references unregistered parent Run ${parentRunId}`,
417
+ });
418
+
419
+ const registerTransition = (
420
+ ledger: ReservationLedger,
421
+ parentRunId: RunId,
422
+ caps: SubagentDelegationCaps,
423
+ gate: Semaphore.Semaphore | undefined,
424
+ ): readonly [
425
+ TransitionResult<SubagentParentBudgetView, SubagentParentBudgetConflict>,
426
+ ReservationLedger,
427
+ ] => {
428
+ const existing = ledger.parents.get(parentRunId);
429
+
430
+ if (existing !== undefined) {
431
+ return sameCaps(existing.caps, caps)
432
+ ? [ok(parentView(ledger, existing)), ledger]
433
+ : [fail(SubagentParentBudgetConflict.make({ parentRunId })), ledger];
434
+ }
435
+ const available: { [K in ReservableDimensionKey]?: number } = {};
436
+
437
+ for (const spec of dimensionSpecs) {
438
+ const cap = spec.cap(caps);
439
+
440
+ if (cap !== undefined) {
441
+ available[spec.key] = cap;
442
+ }
443
+ }
444
+
445
+ const parent: ParentBudgetState = {
446
+ parentRunId,
447
+ caps,
448
+ gate,
449
+ totalChildInvocations: 0,
450
+ available,
451
+ cumulativeOverrun: zeroAmounts,
452
+ };
453
+
454
+ const next: ReservationLedger = {
455
+ parents: new Map(ledger.parents).set(parentRunId, parent),
456
+ reservations: ledger.reservations,
457
+ };
458
+
459
+ return [ok(parentView(next, parent)), next];
460
+ };
461
+
462
+ const reserveTransition = (
463
+ ledger: ReservationLedger,
464
+ request: SubagentReservationRequest,
465
+ ): readonly [
466
+ TransitionResult<
467
+ SubagentReservationView,
468
+ SubagentBudgetExhausted | SubagentReservationConflict | SubagentParentBudgetUnknown
469
+ >,
470
+ ReservationLedger,
471
+ ] => {
472
+ const parent = ledger.parents.get(request.parentRunId);
473
+
474
+ if (parent === undefined) {
475
+ return [fail(SubagentParentBudgetUnknown.make({ parentRunId: request.parentRunId })), ledger];
476
+ }
477
+ const reservationId = makeBudgetReservationId(request.parentRunId, request.parentToolCallId);
478
+ const existing = ledger.reservations.get(reservationId);
479
+
480
+ if (existing !== undefined) {
481
+ return sameAmounts(existing.allocated, request.allocation) &&
482
+ existing.descendantInvocations === (request.descendantInvocations ?? 0)
483
+ ? [ok(reservationView(reservationId, existing)), ledger]
484
+ : [
485
+ fail(
486
+ SubagentReservationConflict.make({
487
+ reservationId,
488
+ existingAllocation: SubagentReservationAmounts.make(existing.allocated),
489
+ requestedAllocation: request.allocation,
490
+ }),
491
+ ),
492
+ ledger,
493
+ ];
494
+ }
495
+ const maxInvocations = parent.caps.maxTotalChildInvocations;
496
+ const slots = 1 + (request.descendantInvocations ?? 0);
497
+
498
+ if (maxInvocations !== undefined && parent.totalChildInvocations + slots > maxInvocations) {
499
+ return [
500
+ fail(
501
+ SubagentBudgetExhausted.make({
502
+ parentRunId: request.parentRunId,
503
+ dimension: "total-child-invocations",
504
+ limitValue: maxInvocations,
505
+ observedValue: parent.totalChildInvocations + slots,
506
+ }),
507
+ ),
508
+ ledger,
509
+ ];
510
+ }
511
+ for (const spec of dimensionSpecs) {
512
+ const cap = spec.cap(parent.caps);
513
+
514
+ if (cap === undefined) {
515
+ continue;
516
+ }
517
+ // Overrun already charged to the parent aggregate reduces delegable
518
+ // headroom without mutating `available`.
519
+ const headroom = (parent.available[spec.key] ?? 0) - parent.cumulativeOverrun[spec.key];
520
+ const requested = request.allocation[spec.key];
521
+
522
+ if (requested > headroom) {
523
+ return [
524
+ fail(
525
+ SubagentBudgetExhausted.make({
526
+ parentRunId: request.parentRunId,
527
+ dimension: spec.dimension,
528
+ limitValue: cap,
529
+ observedValue: cap - headroom + requested,
530
+ }),
531
+ ),
532
+ ledger,
533
+ ];
534
+ }
535
+ }
536
+
537
+ const nextAvailable: { [K in ReservableDimensionKey]?: number } = {
538
+ ...parent.available,
539
+ };
540
+
541
+ for (const spec of dimensionSpecs) {
542
+ const available = parent.available[spec.key];
543
+
544
+ if (available !== undefined) {
545
+ nextAvailable[spec.key] = available - request.allocation[spec.key];
546
+ }
547
+ }
548
+
549
+ const reservation: ReservationState = {
550
+ parentRunId: request.parentRunId,
551
+ parentToolCallId: request.parentToolCallId,
552
+ descendantInvocations: request.descendantInvocations ?? 0,
553
+ status: "reserved",
554
+ allocated: request.allocation,
555
+ observed: {},
556
+ covered: zeroAmounts,
557
+ overrun: zeroAmounts,
558
+ };
559
+
560
+ const next: ReservationLedger = {
561
+ parents: new Map(ledger.parents).set(request.parentRunId, {
562
+ ...parent,
563
+ totalChildInvocations: parent.totalChildInvocations + slots,
564
+ available: nextAvailable,
565
+ }),
566
+ reservations: new Map(ledger.reservations).set(reservationId, reservation),
567
+ };
568
+
569
+ return [ok(reservationView(reservationId, reservation)), next];
570
+ };
571
+
572
+ const observeTransition = (
573
+ ledger: ReservationLedger,
574
+ reservationId: BudgetReservationId,
575
+ usage: SubagentObservedUsage,
576
+ ): readonly [
577
+ TransitionResult<SubagentReservationView, SubagentReservationUnknown>,
578
+ ReservationLedger,
579
+ ] => {
580
+ const reservation = ledger.reservations.get(reservationId);
581
+
582
+ if (reservation === undefined) {
583
+ return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];
584
+ }
585
+ const parent = ledger.parents.get(reservation.parentRunId);
586
+
587
+ if (parent === undefined) {
588
+ return [corruptParent(reservation.parentRunId), ledger];
589
+ }
590
+ const observed: { [K in ReservableDimensionKey]?: number } = { ...reservation.observed };
591
+ const covered: Record<ReservableDimensionKey, number> = { ...reservation.covered };
592
+ const overrun: Record<ReservableDimensionKey, number> = { ...reservation.overrun };
593
+
594
+ const cumulativeOverrun: Record<ReservableDimensionKey, number> = {
595
+ ...parent.cumulativeOverrun,
596
+ };
597
+
598
+ for (const spec of dimensionSpecs) {
599
+ const delta = usage[spec.key];
600
+
601
+ if (delta === undefined) {
602
+ continue;
603
+ }
604
+ observed[spec.key] = (observed[spec.key] ?? 0) + delta;
605
+
606
+ // Once settlement began the accounting decision is frozen, so late or
607
+ // corrected usage is pure overrun and cannot silently create budget.
608
+ const coverable =
609
+ reservation.status === "reserved"
610
+ ? Math.min(delta, reservation.allocated[spec.key] - covered[spec.key])
611
+ : 0;
612
+
613
+ covered[spec.key] += coverable;
614
+ const overrunDelta = delta - coverable;
615
+
616
+ overrun[spec.key] += overrunDelta;
617
+ cumulativeOverrun[spec.key] += overrunDelta;
618
+ }
619
+ const nextReservation: ReservationState = { ...reservation, observed, covered, overrun };
620
+
621
+ const next: ReservationLedger = {
622
+ parents: new Map(ledger.parents).set(parent.parentRunId, { ...parent, cumulativeOverrun }),
623
+ reservations: new Map(ledger.reservations).set(reservationId, nextReservation),
624
+ };
625
+
626
+ return [ok(reservationView(reservationId, nextReservation)), next];
627
+ };
628
+
629
+ /**
630
+ * Freeze the settlement decision. A dimension that was never observed
631
+ * conservatively consumes its full reserved amount.
632
+ */
633
+ const freezeSettlement = (reservation: ReservationState): ReservationState => {
634
+ const observed: { [K in ReservableDimensionKey]?: number } = { ...reservation.observed };
635
+ const covered: Record<ReservableDimensionKey, number> = { ...reservation.covered };
636
+
637
+ for (const spec of dimensionSpecs) {
638
+ if (observed[spec.key] === undefined) {
639
+ observed[spec.key] = reservation.allocated[spec.key];
640
+ covered[spec.key] = reservation.allocated[spec.key];
641
+ }
642
+ }
643
+
644
+ return { ...reservation, status: "releasePending", observed, covered };
645
+ };
646
+
647
+ const beginReleaseTransition = (
648
+ ledger: ReservationLedger,
649
+ reservationId: BudgetReservationId,
650
+ ): readonly [
651
+ TransitionResult<SubagentReservationView, SubagentReservationUnknown>,
652
+ ReservationLedger,
653
+ ] => {
654
+ const reservation = ledger.reservations.get(reservationId);
655
+
656
+ if (reservation === undefined) {
657
+ return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];
658
+ }
659
+ if (reservation.status !== "reserved") {
660
+ return [ok(reservationView(reservationId, reservation)), ledger];
661
+ }
662
+ const frozen = freezeSettlement(reservation);
663
+
664
+ const next: ReservationLedger = {
665
+ parents: ledger.parents,
666
+ reservations: new Map(ledger.reservations).set(reservationId, frozen),
667
+ };
668
+
669
+ return [ok(reservationView(reservationId, frozen)), next];
670
+ };
671
+
672
+ const releaseTransition = (
673
+ ledger: ReservationLedger,
674
+ reservationId: BudgetReservationId,
675
+ ): readonly [
676
+ TransitionResult<SubagentReservationView, SubagentReservationUnknown>,
677
+ ReservationLedger,
678
+ ] => {
679
+ const reservation = ledger.reservations.get(reservationId);
680
+
681
+ if (reservation === undefined) {
682
+ return [fail(SubagentReservationUnknown.make({ reservationId })), ledger];
683
+ }
684
+ if (reservation.status === "released") {
685
+ return [ok(reservationView(reservationId, reservation)), ledger];
686
+ }
687
+ const parent = ledger.parents.get(reservation.parentRunId);
688
+
689
+ if (parent === undefined) {
690
+ return [corruptParent(reservation.parentRunId), ledger];
691
+ }
692
+ const frozen = reservation.status === "reserved" ? freezeSettlement(reservation) : reservation;
693
+ const unused = unusedAllocation(frozen);
694
+ const nextAvailable: { [K in ReservableDimensionKey]?: number } = { ...parent.available };
695
+
696
+ for (const spec of dimensionSpecs) {
697
+ const available = parent.available[spec.key];
698
+
699
+ if (available !== undefined) {
700
+ nextAvailable[spec.key] = available + unused[spec.key];
701
+ }
702
+ }
703
+ const settled: ReservationState = { ...frozen, status: "released" };
704
+
705
+ const next: ReservationLedger = {
706
+ parents: new Map(ledger.parents).set(parent.parentRunId, {
707
+ ...parent,
708
+ available: nextAvailable,
709
+ }),
710
+ reservations: new Map(ledger.reservations).set(reservationId, settled),
711
+ };
712
+
713
+ return [ok(reservationView(reservationId, settled)), next];
714
+ };
715
+
716
+ const retireParentTransition = (
717
+ ledger: ReservationLedger,
718
+ parentRunId: RunId,
719
+ ): readonly [TransitionResult<void, SubagentParentBudgetActive>, ReservationLedger] => {
720
+ if (!ledger.parents.has(parentRunId)) {
721
+ return [ok(undefined), ledger];
722
+ }
723
+ let openReservations = 0;
724
+
725
+ for (const reservation of ledger.reservations.values()) {
726
+ if (reservation.parentRunId === parentRunId && reservation.status !== "released") {
727
+ openReservations += 1;
728
+ }
729
+ }
730
+ if (openReservations > 0) {
731
+ return [fail(SubagentParentBudgetActive.make({ parentRunId, openReservations })), ledger];
732
+ }
733
+ const parents = new Map(ledger.parents);
734
+
735
+ parents.delete(parentRunId);
736
+ const reservations = new Map(ledger.reservations);
737
+
738
+ for (const [reservationId, reservation] of reservations) {
739
+ if (reservation.parentRunId === parentRunId) {
740
+ reservations.delete(reservationId);
741
+ }
742
+ }
743
+
744
+ return [ok(undefined), { parents, reservations }];
745
+ };
746
+
747
+ /**
748
+ * In-memory reservation ledger. All state lives in one `Ref` owned by the
749
+ * Layer's Scope; every transition is a single atomic `Ref.modify`.
750
+ */
751
+ export const SubagentReservationsMemoryLive: Layer.Layer<SubagentReservations> = Layer.effect(
752
+ SubagentReservations,
753
+ Effect.gen(function* () {
754
+ const state = yield* Ref.make<ReservationLedger>({
755
+ parents: new Map(),
756
+ reservations: new Map(),
757
+ });
758
+
759
+ return SubagentReservations.of({
760
+ registerParent: Effect.fn("SubagentReservations.registerParent")(
761
+ function* (parentRunId, caps) {
762
+ const gate =
763
+ caps.maxConcurrentChildren !== undefined && caps.maxConcurrentChildren > 0
764
+ ? yield* Semaphore.make(caps.maxConcurrentChildren)
765
+ : undefined;
766
+
767
+ const result = yield* Ref.modify(state, (ledger) =>
768
+ registerTransition(ledger, parentRunId, caps, gate),
769
+ );
770
+
771
+ return yield* resolve(result);
772
+ },
773
+ ),
774
+ reserve: Effect.fn("SubagentReservations.reserve")(function* (request) {
775
+ const result = yield* Ref.modify(state, (ledger) => reserveTransition(ledger, request));
776
+
777
+ return yield* resolve(result);
778
+ }),
779
+ observe: Effect.fn("SubagentReservations.observe")(function* (reservationId, usage) {
780
+ const result = yield* Ref.modify(state, (ledger) =>
781
+ observeTransition(ledger, reservationId, usage),
782
+ );
783
+
784
+ return yield* resolve(result);
785
+ }),
786
+ beginRelease: Effect.fn("SubagentReservations.beginRelease")(function* (reservationId) {
787
+ const result = yield* Ref.modify(state, (ledger) =>
788
+ beginReleaseTransition(ledger, reservationId),
789
+ );
790
+
791
+ return yield* resolve(result);
792
+ }),
793
+ release: Effect.fn("SubagentReservations.release")(function* (reservationId) {
794
+ const result = yield* Ref.modify(state, (ledger) =>
795
+ releaseTransition(ledger, reservationId),
796
+ );
797
+
798
+ return yield* resolve(result);
799
+ }),
800
+ acquireChildSlot: Effect.fn("SubagentReservations.acquireChildSlot")(function* (
801
+ parentRunId,
802
+ slots = 1,
803
+ ) {
804
+ const ledger = yield* Ref.get(state);
805
+ const parent = ledger.parents.get(parentRunId);
806
+
807
+ if (parent === undefined) {
808
+ return yield* SubagentParentBudgetUnknown.make({ parentRunId });
809
+ }
810
+ const cap = parent.caps.maxConcurrentChildren;
811
+
812
+ if (cap === undefined) {
813
+ return;
814
+ }
815
+ if (!Number.isSafeInteger(slots) || slots < 1 || slots > cap || parent.gate === undefined) {
816
+ return yield* SubagentBudgetExhausted.make({
817
+ parentRunId,
818
+ dimension: "concurrent-children",
819
+ limitValue: cap,
820
+ observedValue: Number.isSafeInteger(slots) && slots > 0 ? slots : 0,
821
+ });
822
+ }
823
+ const gate = parent.gate;
824
+
825
+ yield* Effect.acquireRelease(
826
+ gate.take(slots),
827
+ (permits) => gate.release(permits).pipe(Effect.asVoid),
828
+ { interruptible: true },
829
+ );
830
+ }),
831
+ retireParent: Effect.fn("SubagentReservations.retireParent")(function* (parentRunId) {
832
+ const result = yield* Ref.modify(state, (ledger) =>
833
+ retireParentTransition(ledger, parentRunId),
834
+ );
835
+
836
+ return yield* resolve(result);
837
+ }),
838
+ parentSnapshot: Effect.fn("SubagentReservations.parentSnapshot")(function* (parentRunId) {
839
+ const ledger = yield* Ref.get(state);
840
+ const parent = ledger.parents.get(parentRunId);
841
+
842
+ if (parent === undefined) {
843
+ return yield* SubagentParentBudgetUnknown.make({ parentRunId });
844
+ }
845
+
846
+ return parentView(ledger, parent);
847
+ }),
848
+ });
849
+ }),
850
+ );