effect-agent 0.1.0-beta.11 → 0.1.0-beta.111

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 (553) hide show
  1. package/dist/Agent-1DMSO_Fl.mjs +86 -0
  2. package/dist/Agent-1DMSO_Fl.mjs.map +1 -0
  3. package/dist/Agent-DriBcXBN.d.mts +245 -0
  4. package/dist/AgentError-Bn1ytXRD.d.mts +117 -0
  5. package/dist/AgentPolicy-BqDoSXO6.d.mts +96 -0
  6. package/dist/AgentRuntime-CWkHuzyt.d.mts +346 -0
  7. package/dist/AgentRuntime-DLwPoEVH.mjs +4735 -0
  8. package/dist/AgentRuntime-DLwPoEVH.mjs.map +1 -0
  9. package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
  10. package/dist/ContextCompactor-WwSIG_Z2.d.mts +161 -0
  11. package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
  12. package/dist/DurableAgentRuntime-PyIgNYXF.mjs +6772 -0
  13. package/dist/DurableAgentRuntime-PyIgNYXF.mjs.map +1 -0
  14. package/dist/DurableFailpoint-mx3-nsxU.d.mts +41 -0
  15. package/dist/DurableStep-Cry_iol4.d.mts +103 -0
  16. package/dist/EventSource-BUYLmL77.d.mts +51 -0
  17. package/dist/FailureDiagnostic-BElLOoED.mjs +274 -0
  18. package/dist/FailureDiagnostic-BElLOoED.mjs.map +1 -0
  19. package/dist/FailureDiagnostic-CaAkzGHL.d.mts +223 -0
  20. package/dist/Identifiers-CN2s30fF.d.mts +40 -0
  21. package/dist/InMemory.d.mts +24 -0
  22. package/dist/InMemory.mjs +24 -0
  23. package/dist/InMemory.mjs.map +1 -0
  24. package/dist/MemoryNamespace-BbRW5p71.d.mts +36 -0
  25. package/dist/MemoryReference-B8Q3UJoJ.d.mts +79 -0
  26. package/dist/Messaging-DaZDlBqh.d.mts +1067 -0
  27. package/dist/Messaging-Dkg87ebg.d.mts +221 -0
  28. package/dist/MessagingHost-D89X7ma8.mjs +110 -0
  29. package/dist/MessagingHost-D89X7ma8.mjs.map +1 -0
  30. package/dist/MessagingHost-e1Sbzfao.d.mts +74 -0
  31. package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
  32. package/dist/Output-CAFJTAbP.d.mts +25 -0
  33. package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
  34. package/dist/PageScreenshot-BpgZKAxl.d.mts +48 -0
  35. package/dist/PreparedInputAdmission-J3YK6LAm.d.mts +42 -0
  36. package/dist/Receipt-BAHyigAF.d.mts +33 -0
  37. package/dist/Records-4qnRmniE.d.mts +4058 -0
  38. package/dist/RunEvent-DIrzkjLr.d.mts +460 -0
  39. package/dist/RunEventSink-D5aVhISG.d.mts +108 -0
  40. package/dist/RunJournal-BXrq0VIK.mjs +931 -0
  41. package/dist/RunJournal-BXrq0VIK.mjs.map +1 -0
  42. package/dist/RunOptions-BoESJrxw.d.mts +935 -0
  43. package/dist/RunPolicyUsage-ClZxyR46.d.mts +21 -0
  44. package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
  45. package/dist/Schedule-C2lH2kxY.d.mts +847 -0
  46. package/dist/Scheduling-DPb2QyAK.mjs +691 -0
  47. package/dist/Scheduling-DPb2QyAK.mjs.map +1 -0
  48. package/dist/Subagent-D9eYdGTl.mjs +1537 -0
  49. package/dist/Subagent-D9eYdGTl.mjs.map +1 -0
  50. package/dist/Subagent-F72tuaxy.d.mts +1360 -0
  51. package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
  52. package/dist/SubagentHost-CmiNTOBZ.d.mts +149 -0
  53. package/dist/Subscription-pQUv0QD6.d.mts +945 -0
  54. package/dist/SubscriptionInput-DdJOiNMY.d.mts +41 -0
  55. package/dist/Thread-DOBQ0QUY.d.mts +96 -0
  56. package/dist/ThreadHistory-tS1KwxHR.d.mts +60 -0
  57. package/dist/ToolBroker-DWs4tZra.d.mts +133 -0
  58. package/dist/ToolExposure-9uF_Yo0T.mjs +10 -0
  59. package/dist/ToolExposure-9uF_Yo0T.mjs.map +1 -0
  60. package/dist/ToolExposure-C93U1sPu.mjs +30 -0
  61. package/dist/ToolExposure-C93U1sPu.mjs.map +1 -0
  62. package/dist/ToolExposure-UCN12eCd.d.mts +39 -0
  63. package/dist/ToolExposure-r2eOWk4F.d.mts +46 -0
  64. package/dist/ToolExposure.d.mts +8 -0
  65. package/dist/ToolExposure.mjs +21 -0
  66. package/dist/ToolExposure.mjs.map +1 -0
  67. package/dist/ToolReconciler-BmVRAHKs.d.mts +80 -0
  68. package/dist/ToolResult-BKdqWRff.d.mts +78 -0
  69. package/dist/Usage-Dx0aknfk.d.mts +121 -0
  70. package/dist/WakeScheduler-EjUF-GhC.d.mts +56 -0
  71. package/dist/Worker-Du9dhVnp.d.mts +279 -0
  72. package/dist/Worker-T_3RbaKc.mjs +210 -0
  73. package/dist/Worker-T_3RbaKc.mjs.map +1 -0
  74. package/dist/agent-registration-B5CI-Ygk.mjs +201 -0
  75. package/dist/agent-registration-B5CI-Ygk.mjs.map +1 -0
  76. package/dist/capabilities/Approval.d.mts +114 -0
  77. package/dist/capabilities/Approval.mjs +226 -0
  78. package/dist/capabilities/Approval.mjs.map +1 -0
  79. package/dist/capabilities/Budget.d.mts +112 -0
  80. package/dist/capabilities/Budget.mjs +346 -0
  81. package/dist/capabilities/Budget.mjs.map +1 -0
  82. package/dist/capabilities/CodeMode.d.mts +157 -0
  83. package/dist/capabilities/CodeMode.mjs +522 -0
  84. package/dist/capabilities/CodeMode.mjs.map +1 -0
  85. package/dist/capabilities/Commands.d.mts +55 -0
  86. package/dist/capabilities/Commands.mjs +57 -0
  87. package/dist/capabilities/Commands.mjs.map +1 -0
  88. package/dist/capabilities/ContextTools.d.mts +321 -0
  89. package/dist/capabilities/ContextTools.mjs +126 -0
  90. package/dist/capabilities/ContextTools.mjs.map +1 -0
  91. package/dist/capabilities/Mcp.d.mts +108 -0
  92. package/dist/capabilities/Mcp.mjs +260 -0
  93. package/dist/capabilities/Mcp.mjs.map +1 -0
  94. package/dist/capabilities/McpClient.d.mts +115 -0
  95. package/dist/capabilities/McpClient.mjs +506 -0
  96. package/dist/capabilities/McpClient.mjs.map +1 -0
  97. package/dist/capabilities/MemoryNotes.d.mts +424 -0
  98. package/dist/capabilities/MemoryNotes.mjs +128 -0
  99. package/dist/capabilities/MemoryNotes.mjs.map +1 -0
  100. package/dist/capabilities/Messaging.d.mts +3 -0
  101. package/dist/capabilities/Messaging.mjs +152 -0
  102. package/dist/capabilities/Messaging.mjs.map +1 -0
  103. package/dist/capabilities/ModelContext.d.mts +89 -0
  104. package/dist/capabilities/ModelContext.mjs +168 -0
  105. package/dist/capabilities/ModelContext.mjs.map +1 -0
  106. package/dist/capabilities/Redaction.d.mts +37 -0
  107. package/dist/capabilities/Redaction.mjs +104 -0
  108. package/dist/capabilities/Redaction.mjs.map +1 -0
  109. package/dist/capabilities/Remembering.d.mts +434 -0
  110. package/dist/capabilities/Remembering.mjs +290 -0
  111. package/dist/capabilities/Remembering.mjs.map +1 -0
  112. package/dist/capabilities/RunHooks.d.mts +82 -0
  113. package/dist/capabilities/RunHooks.mjs +144 -0
  114. package/dist/capabilities/RunHooks.mjs.map +1 -0
  115. package/dist/capabilities/SemanticMemory.d.mts +431 -0
  116. package/dist/capabilities/SemanticMemory.mjs +315 -0
  117. package/dist/capabilities/SemanticMemory.mjs.map +1 -0
  118. package/dist/capabilities/Subagent.d.mts +4 -0
  119. package/dist/capabilities/Subagent.mjs +5 -0
  120. package/dist/capabilities/SubagentReservations.d.mts +186 -0
  121. package/dist/capabilities/SubagentReservations.mjs +479 -0
  122. package/dist/capabilities/SubagentReservations.mjs.map +1 -0
  123. package/dist/capabilities/ToolDiscovery.d.mts +124 -0
  124. package/dist/capabilities/ToolDiscovery.mjs +230 -0
  125. package/dist/capabilities/ToolDiscovery.mjs.map +1 -0
  126. package/dist/capabilities/WebCapture.d.mts +163 -0
  127. package/dist/capabilities/WebCapture.mjs +335 -0
  128. package/dist/capabilities/WebCapture.mjs.map +1 -0
  129. package/dist/capabilities/WebSearch.d.mts +71 -0
  130. package/dist/capabilities/WebSearch.mjs +115 -0
  131. package/dist/capabilities/WebSearch.mjs.map +1 -0
  132. package/dist/compaction-C2OTceKw.mjs +505 -0
  133. package/dist/compaction-C2OTceKw.mjs.map +1 -0
  134. package/dist/core/Agent.d.mts +2 -0
  135. package/dist/core/Agent.mjs +2 -0
  136. package/dist/core/AgentError.d.mts +2 -0
  137. package/dist/core/AgentError.mjs +134 -0
  138. package/dist/core/AgentError.mjs.map +1 -0
  139. package/dist/core/AgentPolicy.d.mts +2 -0
  140. package/dist/core/AgentPolicy.mjs +94 -0
  141. package/dist/core/AgentPolicy.mjs.map +1 -0
  142. package/dist/core/AgentUpdates.d.mts +2 -0
  143. package/dist/core/AgentUpdates.mjs +63 -0
  144. package/dist/core/AgentUpdates.mjs.map +1 -0
  145. package/dist/core/FailureDiagnostic.d.mts +2 -0
  146. package/dist/core/FailureDiagnostic.mjs +2 -0
  147. package/dist/core/IdGenerator.d.mts +26 -0
  148. package/dist/core/IdGenerator.mjs +27 -0
  149. package/dist/core/IdGenerator.mjs.map +1 -0
  150. package/dist/core/Identifiers.d.mts +2 -0
  151. package/dist/core/Identifiers.mjs +43 -0
  152. package/dist/core/Identifiers.mjs.map +1 -0
  153. package/dist/core/Memory.d.mts +57 -0
  154. package/dist/core/Memory.mjs +203 -0
  155. package/dist/core/Memory.mjs.map +1 -0
  156. package/dist/core/MemoryNamespace.d.mts +2 -0
  157. package/dist/core/MemoryNamespace.mjs +116 -0
  158. package/dist/core/MemoryNamespace.mjs.map +1 -0
  159. package/dist/core/MemoryReference.d.mts +2 -0
  160. package/dist/core/MemoryReference.mjs +109 -0
  161. package/dist/core/MemoryReference.mjs.map +1 -0
  162. package/dist/core/MemoryRevalidation.d.mts +65 -0
  163. package/dist/core/MemoryRevalidation.mjs +126 -0
  164. package/dist/core/MemoryRevalidation.mjs.map +1 -0
  165. package/dist/core/MemoryStore.d.mts +186 -0
  166. package/dist/core/MemoryStore.mjs +243 -0
  167. package/dist/core/MemoryStore.mjs.map +1 -0
  168. package/dist/core/Receipt.d.mts +2 -0
  169. package/dist/core/Receipt.mjs +36 -0
  170. package/dist/core/Receipt.mjs.map +1 -0
  171. package/dist/core/RememberingStore.d.mts +1562 -0
  172. package/dist/core/RememberingStore.mjs +190 -0
  173. package/dist/core/RememberingStore.mjs.map +1 -0
  174. package/dist/core/RunEvent.d.mts +2 -0
  175. package/dist/core/RunEvent.mjs +337 -0
  176. package/dist/core/RunEvent.mjs.map +1 -0
  177. package/dist/core/RunPolicyUsage.d.mts +2 -0
  178. package/dist/core/RunPolicyUsage.mjs +21 -0
  179. package/dist/core/RunPolicyUsage.mjs.map +1 -0
  180. package/dist/core/SemanticMemoryIndex.d.mts +826 -0
  181. package/dist/core/SemanticMemoryIndex.mjs +185 -0
  182. package/dist/core/SemanticMemoryIndex.mjs.map +1 -0
  183. package/dist/core/SemanticMemoryRevalidation.d.mts +45 -0
  184. package/dist/core/SemanticMemoryRevalidation.mjs +191 -0
  185. package/dist/core/SemanticMemoryRevalidation.mjs.map +1 -0
  186. package/dist/core/SubagentContract.d.mts +2 -0
  187. package/dist/core/SubagentContract.mjs +148 -0
  188. package/dist/core/SubagentContract.mjs.map +1 -0
  189. package/dist/core/Thread.d.mts +2 -0
  190. package/dist/core/Thread.mjs +250 -0
  191. package/dist/core/Thread.mjs.map +1 -0
  192. package/dist/core/ToolResult.d.mts +2 -0
  193. package/dist/core/ToolResult.mjs +156 -0
  194. package/dist/core/ToolResult.mjs.map +1 -0
  195. package/dist/core/Usage.d.mts +2 -0
  196. package/dist/core/Usage.mjs +319 -0
  197. package/dist/core/Usage.mjs.map +1 -0
  198. package/dist/core/Worker.d.mts +3 -0
  199. package/dist/core/Worker.mjs +3 -0
  200. package/dist/durable/ActivityStore.d.mts +116 -0
  201. package/dist/durable/ActivityStore.mjs +131 -0
  202. package/dist/durable/ActivityStore.mjs.map +1 -0
  203. package/dist/durable/Admin.d.mts +2 -0
  204. package/dist/durable/Admin.mjs +330 -0
  205. package/dist/durable/Admin.mjs.map +1 -0
  206. package/dist/durable/AgentRegistration.d.mts +2 -0
  207. package/dist/durable/AgentRegistration.mjs +14 -0
  208. package/dist/durable/AgentRegistration.mjs.map +1 -0
  209. package/dist/durable/Certification.d.mts +110 -0
  210. package/dist/durable/Certification.mjs +159 -0
  211. package/dist/durable/Certification.mjs.map +1 -0
  212. package/dist/durable/CommittedActivity.d.mts +62 -0
  213. package/dist/durable/CommittedActivity.mjs +159 -0
  214. package/dist/durable/CommittedActivity.mjs.map +1 -0
  215. package/dist/durable/Digest.d.mts +2 -0
  216. package/dist/durable/Digest.mjs +50 -0
  217. package/dist/durable/Digest.mjs.map +1 -0
  218. package/dist/durable/DurableAgentRuntime.d.mts +3 -0
  219. package/dist/durable/DurableAgentRuntime.mjs +3 -0
  220. package/dist/durable/DurableFailpoint.d.mts +2 -0
  221. package/dist/durable/DurableFailpoint.mjs +98 -0
  222. package/dist/durable/DurableFailpoint.mjs.map +1 -0
  223. package/dist/durable/DurableFailpointTestControl.d.mts +14 -0
  224. package/dist/durable/DurableFailpointTestControl.mjs +19 -0
  225. package/dist/durable/DurableFailpointTestControl.mjs.map +1 -0
  226. package/dist/durable/EventSource.d.mts +2 -0
  227. package/dist/durable/EventSource.mjs +65 -0
  228. package/dist/durable/EventSource.mjs.map +1 -0
  229. package/dist/durable/GitHubWorkflowSource.d.mts +185 -0
  230. package/dist/durable/GitHubWorkflowSource.mjs +209 -0
  231. package/dist/durable/GitHubWorkflowSource.mjs.map +1 -0
  232. package/dist/durable/MessageDelivery.d.mts +876 -0
  233. package/dist/durable/MessageDelivery.mjs +549 -0
  234. package/dist/durable/MessageDelivery.mjs.map +1 -0
  235. package/dist/durable/MessageDeliveryStoreConformance.d.mts +376 -0
  236. package/dist/durable/MessageDeliveryStoreConformance.mjs +270 -0
  237. package/dist/durable/MessageDeliveryStoreConformance.mjs.map +1 -0
  238. package/dist/durable/OperationAuthorizer.d.mts +2 -0
  239. package/dist/durable/OperationAuthorizer.mjs +70 -0
  240. package/dist/durable/OperationAuthorizer.mjs.map +1 -0
  241. package/dist/durable/PersistentHistory.d.mts +16 -0
  242. package/dist/durable/PersistentHistory.mjs +125 -0
  243. package/dist/durable/PersistentHistory.mjs.map +1 -0
  244. package/dist/durable/PreparedInputAdmission.d.mts +2 -0
  245. package/dist/durable/PreparedInputAdmission.mjs +38 -0
  246. package/dist/durable/PreparedInputAdmission.mjs.map +1 -0
  247. package/dist/durable/Records.d.mts +2 -0
  248. package/dist/durable/Records.mjs +841 -0
  249. package/dist/durable/Records.mjs.map +1 -0
  250. package/dist/durable/Recovery.d.mts +2 -0
  251. package/dist/durable/Recovery.mjs +739 -0
  252. package/dist/durable/Recovery.mjs.map +1 -0
  253. package/dist/durable/RunJournal.d.mts +2 -0
  254. package/dist/durable/RunJournal.mjs +2 -0
  255. package/dist/durable/Schedule.d.mts +2 -0
  256. package/dist/durable/Schedule.mjs +391 -0
  257. package/dist/durable/Schedule.mjs.map +1 -0
  258. package/dist/durable/ScheduleStoreConformance.d.mts +17 -0
  259. package/dist/durable/ScheduleStoreConformance.mjs +420 -0
  260. package/dist/durable/ScheduleStoreConformance.mjs.map +1 -0
  261. package/dist/durable/ScheduleTransition.d.mts +24 -0
  262. package/dist/durable/ScheduleTransition.mjs +180 -0
  263. package/dist/durable/ScheduleTransition.mjs.map +1 -0
  264. package/dist/durable/Scheduling.d.mts +54 -0
  265. package/dist/durable/Scheduling.mjs +2 -0
  266. package/dist/durable/SqlMemoryStore.d.mts +29 -0
  267. package/dist/durable/SqlMemoryStore.mjs +436 -0
  268. package/dist/durable/SqlMemoryStore.mjs.map +1 -0
  269. package/dist/durable/SqlMessageDeliveryStore.d.mts +42 -0
  270. package/dist/durable/SqlMessageDeliveryStore.mjs +173 -0
  271. package/dist/durable/SqlMessageDeliveryStore.mjs.map +1 -0
  272. package/dist/durable/SqlStorageV2Upgrade.d.mts +21 -0
  273. package/dist/durable/SqlStorageV2Upgrade.mjs +459 -0
  274. package/dist/durable/SqlStorageV2Upgrade.mjs.map +1 -0
  275. package/dist/durable/SqlSubscriptionStore.d.mts +62 -0
  276. package/dist/durable/SqlSubscriptionStore.mjs +751 -0
  277. package/dist/durable/SqlSubscriptionStore.mjs.map +1 -0
  278. package/dist/durable/SqlThreadNativeReads.d.mts +49 -0
  279. package/dist/durable/SqlThreadNativeReads.mjs +153 -0
  280. package/dist/durable/SqlThreadNativeReads.mjs.map +1 -0
  281. package/dist/durable/SubmissionLedger.d.mts +3 -0
  282. package/dist/durable/SubmissionLedger.mjs +918 -0
  283. package/dist/durable/SubmissionLedger.mjs.map +1 -0
  284. package/dist/durable/SubmissionLedgerConformance.d.mts +29 -0
  285. package/dist/durable/SubmissionLedgerConformance.mjs +1993 -0
  286. package/dist/durable/SubmissionLedgerConformance.mjs.map +1 -0
  287. package/dist/durable/SubmissionStatus.d.mts +2 -0
  288. package/dist/durable/SubmissionStatus.mjs +18 -0
  289. package/dist/durable/SubmissionStatus.mjs.map +1 -0
  290. package/dist/durable/Subscription.d.mts +2 -0
  291. package/dist/durable/Subscription.mjs +360 -0
  292. package/dist/durable/Subscription.mjs.map +1 -0
  293. package/dist/durable/SubscriptionInput.d.mts +2 -0
  294. package/dist/durable/SubscriptionInput.mjs +52 -0
  295. package/dist/durable/SubscriptionInput.mjs.map +1 -0
  296. package/dist/durable/SubscriptionStoreConformance.d.mts +16 -0
  297. package/dist/durable/SubscriptionStoreConformance.mjs +625 -0
  298. package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -0
  299. package/dist/durable/SubscriptionTools.d.mts +273 -0
  300. package/dist/durable/SubscriptionTools.mjs +190 -0
  301. package/dist/durable/SubscriptionTools.mjs.map +1 -0
  302. package/dist/durable/SubscriptionTransition.d.mts +21 -0
  303. package/dist/durable/SubscriptionTransition.mjs +148 -0
  304. package/dist/durable/SubscriptionTransition.mjs.map +1 -0
  305. package/dist/durable/Subscriptions.d.mts +73 -0
  306. package/dist/durable/Subscriptions.mjs +627 -0
  307. package/dist/durable/Subscriptions.mjs.map +1 -0
  308. package/dist/durable/ThreadContextHistory.d.mts +32 -0
  309. package/dist/durable/ThreadContextHistory.mjs +152 -0
  310. package/dist/durable/ThreadContextHistory.mjs.map +1 -0
  311. package/dist/durable/ThreadContextHistoryProjection.d.mts +60 -0
  312. package/dist/durable/ThreadContextHistoryProjection.mjs +149 -0
  313. package/dist/durable/ThreadContextHistoryProjection.mjs.map +1 -0
  314. package/dist/durable/ThreadInvariants.d.mts +76 -0
  315. package/dist/durable/ThreadInvariants.mjs +246 -0
  316. package/dist/durable/ThreadInvariants.mjs.map +1 -0
  317. package/dist/durable/ThreadProjection.d.mts +78 -0
  318. package/dist/durable/ThreadProjection.mjs +158 -0
  319. package/dist/durable/ThreadProjection.mjs.map +1 -0
  320. package/dist/durable/ThreadProjectionMaintenance.d.mts +49 -0
  321. package/dist/durable/ThreadProjectionMaintenance.mjs +33 -0
  322. package/dist/durable/ThreadProjectionMaintenance.mjs.map +1 -0
  323. package/dist/durable/ThreadStore.d.mts +2 -0
  324. package/dist/durable/ThreadStore.mjs +336 -0
  325. package/dist/durable/ThreadStore.mjs.map +1 -0
  326. package/dist/durable/ThreadStoreConformance.d.mts +28 -0
  327. package/dist/durable/ThreadStoreConformance.mjs +503 -0
  328. package/dist/durable/ThreadStoreConformance.mjs.map +1 -0
  329. package/dist/durable/ToolReconciler.d.mts +2 -0
  330. package/dist/durable/ToolReconciler.mjs +85 -0
  331. package/dist/durable/ToolReconciler.mjs.map +1 -0
  332. package/dist/durable/WakeScheduler.d.mts +2 -0
  333. package/dist/durable/WakeScheduler.mjs +85 -0
  334. package/dist/durable/WakeScheduler.mjs.map +1 -0
  335. package/dist/durable/WorkerHost.d.mts +129 -0
  336. package/dist/durable/WorkerHost.mjs +77 -0
  337. package/dist/durable/WorkerHost.mjs.map +1 -0
  338. package/dist/engine/AgentRuntime.d.mts +2 -0
  339. package/dist/engine/AgentRuntime.mjs +2 -0
  340. package/dist/engine/Compaction.d.mts +7 -0
  341. package/dist/engine/Compaction.mjs +16 -0
  342. package/dist/engine/Compaction.mjs.map +1 -0
  343. package/dist/engine/ContextCompactor.d.mts +2 -0
  344. package/dist/engine/ContextCompactor.mjs +119 -0
  345. package/dist/engine/ContextCompactor.mjs.map +1 -0
  346. package/dist/engine/ContextHistory.d.mts +65 -0
  347. package/dist/engine/ContextHistory.mjs +76 -0
  348. package/dist/engine/ContextHistory.mjs.map +1 -0
  349. package/dist/engine/ContextWindow.d.mts +2 -0
  350. package/dist/engine/ContextWindow.mjs +59 -0
  351. package/dist/engine/ContextWindow.mjs.map +1 -0
  352. package/dist/engine/DurableStep.d.mts +2 -0
  353. package/dist/engine/DurableStep.mjs +62 -0
  354. package/dist/engine/DurableStep.mjs.map +1 -0
  355. package/dist/engine/MessagingHost.d.mts +2 -0
  356. package/dist/engine/MessagingHost.mjs +2 -0
  357. package/dist/engine/Output.d.mts +2 -0
  358. package/dist/engine/Output.mjs +8 -0
  359. package/dist/engine/Output.mjs.map +1 -0
  360. package/dist/engine/RunEventSink.d.mts +2 -0
  361. package/dist/engine/RunEventSink.mjs +22 -0
  362. package/dist/engine/RunEventSink.mjs.map +1 -0
  363. package/dist/engine/RunOptions.d.mts +2 -0
  364. package/dist/engine/RunOptions.mjs +124 -0
  365. package/dist/engine/RunOptions.mjs.map +1 -0
  366. package/dist/engine/SubagentHost.d.mts +2 -0
  367. package/dist/engine/SubagentHost.mjs +72 -0
  368. package/dist/engine/SubagentHost.mjs.map +1 -0
  369. package/dist/engine/ThreadHistory.d.mts +2 -0
  370. package/dist/engine/ThreadHistory.mjs +67 -0
  371. package/dist/engine/ThreadHistory.mjs.map +1 -0
  372. package/dist/engine/ToolBroker.d.mts +2 -0
  373. package/dist/engine/ToolBroker.mjs +42 -0
  374. package/dist/engine/ToolBroker.mjs.map +1 -0
  375. package/dist/foreign-diagnostic-DBQ1XHKh.mjs +37 -0
  376. package/dist/foreign-diagnostic-DBQ1XHKh.mjs.map +1 -0
  377. package/dist/index.d.mts +91 -6
  378. package/dist/index.mjs +100 -6
  379. package/dist/output-contract-BC7tjlGw.mjs +84 -0
  380. package/dist/output-contract-BC7tjlGw.mjs.map +1 -0
  381. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  382. package/dist/sandbox/CodeExecutor.d.mts +194 -0
  383. package/dist/sandbox/CodeExecutor.mjs +278 -0
  384. package/dist/sandbox/CodeExecutor.mjs.map +1 -0
  385. package/dist/sandbox/InteractiveBrowser.d.mts +257 -0
  386. package/dist/sandbox/InteractiveBrowser.mjs +236 -0
  387. package/dist/sandbox/InteractiveBrowser.mjs.map +1 -0
  388. package/dist/sandbox/PageCapture.d.mts +2 -0
  389. package/dist/sandbox/PageCapture.mjs +450 -0
  390. package/dist/sandbox/PageCapture.mjs.map +1 -0
  391. package/dist/sandbox/PageCrawl.d.mts +88 -0
  392. package/dist/sandbox/PageCrawl.mjs +124 -0
  393. package/dist/sandbox/PageCrawl.mjs.map +1 -0
  394. package/dist/sandbox/PageScreenshot.d.mts +2 -0
  395. package/dist/sandbox/PageScreenshot.mjs +53 -0
  396. package/dist/sandbox/PageScreenshot.mjs.map +1 -0
  397. package/dist/sandbox/ProtectedBrowser.d.mts +273 -0
  398. package/dist/sandbox/ProtectedBrowser.mjs +287 -0
  399. package/dist/sandbox/ProtectedBrowser.mjs.map +1 -0
  400. package/dist/sandbox/Sandbox.d.mts +2 -0
  401. package/dist/sandbox/Sandbox.mjs +208 -0
  402. package/dist/sandbox/Sandbox.mjs.map +1 -0
  403. package/dist/utf8-BYfhEkcj.mjs +11 -0
  404. package/dist/utf8-BYfhEkcj.mjs.map +1 -0
  405. package/dist/utf8-DchGZRBd.mjs +23 -0
  406. package/dist/utf8-DchGZRBd.mjs.map +1 -0
  407. package/package.json +1 -40
  408. package/src/InMemory.ts +19 -0
  409. package/src/ToolExposure.ts +2 -0
  410. package/src/capabilities/Approval.ts +352 -0
  411. package/src/capabilities/Budget.ts +536 -0
  412. package/src/capabilities/CodeMode.ts +1090 -0
  413. package/src/capabilities/Commands.ts +86 -0
  414. package/src/capabilities/ContextTools.ts +184 -0
  415. package/src/capabilities/Mcp.ts +427 -0
  416. package/src/capabilities/McpClient.ts +967 -0
  417. package/src/capabilities/MemoryNotes.ts +174 -0
  418. package/src/capabilities/Messaging.ts +261 -0
  419. package/src/capabilities/ModelContext.ts +354 -0
  420. package/src/capabilities/Redaction.ts +157 -0
  421. package/src/capabilities/Remembering.ts +550 -0
  422. package/src/capabilities/RunHooks.ts +280 -0
  423. package/src/capabilities/SemanticMemory.ts +447 -0
  424. package/src/capabilities/Subagent.ts +2488 -0
  425. package/src/capabilities/SubagentReservations.ts +850 -0
  426. package/src/capabilities/ToolDiscovery.ts +369 -0
  427. package/src/capabilities/WebCapture.ts +722 -0
  428. package/src/capabilities/WebSearch.ts +190 -0
  429. package/src/capabilities/internal/subagent-background.ts +1246 -0
  430. package/src/capabilities/internal/subagent-contract.ts +146 -0
  431. package/src/capabilities/internal/subagent-policy.ts +235 -0
  432. package/src/capabilities/internal/subagent-reporting.ts +261 -0
  433. package/src/capabilities/internal/utf8.ts +10 -0
  434. package/src/core/Agent.ts +595 -0
  435. package/src/core/AgentError.ts +172 -0
  436. package/src/core/AgentPolicy.ts +153 -0
  437. package/src/core/AgentUpdates.ts +100 -0
  438. package/src/core/FailureDiagnostic.ts +343 -0
  439. package/src/core/IdGenerator.ts +39 -0
  440. package/src/core/Identifiers.ts +48 -0
  441. package/src/core/Memory.ts +290 -0
  442. package/src/core/MemoryNamespace.ts +196 -0
  443. package/src/core/MemoryReference.ts +121 -0
  444. package/src/core/MemoryRevalidation.ts +185 -0
  445. package/src/core/MemoryStore.ts +368 -0
  446. package/src/core/Messaging.ts +72 -0
  447. package/src/core/Receipt.ts +42 -0
  448. package/src/core/RememberingStore.ts +300 -0
  449. package/src/core/RunEvent.ts +366 -0
  450. package/src/core/RunPolicyUsage.ts +17 -0
  451. package/src/core/SemanticMemoryIndex.ts +250 -0
  452. package/src/core/SemanticMemoryRevalidation.ts +254 -0
  453. package/src/core/SubagentContract.ts +196 -0
  454. package/src/core/Thread.ts +371 -0
  455. package/src/core/ToolExposure.ts +74 -0
  456. package/src/core/ToolResult.ts +190 -0
  457. package/src/core/Usage.ts +529 -0
  458. package/src/core/Worker.ts +184 -0
  459. package/src/core/internal/agent-updates.ts +34 -0
  460. package/src/core/internal/message-status.ts +60 -0
  461. package/src/core/internal/strict-schema.ts +14 -0
  462. package/src/core/internal/utf8.ts +23 -0
  463. package/src/durable/ActivityStore.ts +160 -0
  464. package/src/durable/Admin.ts +505 -0
  465. package/src/durable/AgentRegistration.ts +14 -0
  466. package/src/durable/Certification.ts +210 -0
  467. package/src/durable/CommittedActivity.ts +296 -0
  468. package/src/durable/Digest.ts +87 -0
  469. package/src/durable/DurableAgentRuntime.ts +10950 -0
  470. package/src/durable/DurableFailpoint.ts +107 -0
  471. package/src/durable/DurableFailpointTestControl.ts +39 -0
  472. package/src/durable/EventSource.ts +172 -0
  473. package/src/durable/GitHubWorkflowSource.ts +447 -0
  474. package/src/durable/MessageDelivery.ts +817 -0
  475. package/src/durable/MessageDeliveryStoreConformance.ts +410 -0
  476. package/src/durable/OperationAuthorizer.ts +85 -0
  477. package/src/durable/PersistentHistory.ts +260 -0
  478. package/src/durable/PreparedInputAdmission.ts +57 -0
  479. package/src/durable/Records.ts +1065 -0
  480. package/src/durable/Recovery.ts +1018 -0
  481. package/src/durable/RunJournal.ts +1631 -0
  482. package/src/durable/Schedule.ts +513 -0
  483. package/src/durable/ScheduleStoreConformance.ts +638 -0
  484. package/src/durable/ScheduleTransition.ts +265 -0
  485. package/src/durable/Scheduling.ts +1077 -0
  486. package/src/durable/SqlMemoryStore.ts +778 -0
  487. package/src/durable/SqlMessageDeliveryStore.ts +321 -0
  488. package/src/durable/SqlStorageV2Upgrade.ts +500 -0
  489. package/src/durable/SqlSubscriptionStore.ts +1440 -0
  490. package/src/durable/SqlThreadNativeReads.ts +256 -0
  491. package/src/durable/SubmissionLedger.ts +1205 -0
  492. package/src/durable/SubmissionLedgerConformance.ts +4590 -0
  493. package/src/durable/SubmissionStatus.ts +14 -0
  494. package/src/durable/Subscription.ts +544 -0
  495. package/src/durable/SubscriptionInput.ts +144 -0
  496. package/src/durable/SubscriptionStoreConformance.ts +945 -0
  497. package/src/durable/SubscriptionTools.ts +327 -0
  498. package/src/durable/SubscriptionTransition.ts +302 -0
  499. package/src/durable/Subscriptions.ts +1210 -0
  500. package/src/durable/ThreadContextHistory.ts +227 -0
  501. package/src/durable/ThreadContextHistoryProjection.ts +216 -0
  502. package/src/durable/ThreadInvariants.ts +507 -0
  503. package/src/durable/ThreadProjection.ts +269 -0
  504. package/src/durable/ThreadProjectionMaintenance.ts +67 -0
  505. package/src/durable/ThreadStore.ts +552 -0
  506. package/src/durable/ThreadStoreConformance.ts +1156 -0
  507. package/src/durable/ToolReconciler.ts +109 -0
  508. package/src/durable/WakeScheduler.ts +134 -0
  509. package/src/durable/WorkerHost.ts +171 -0
  510. package/src/durable/internal/agent-registration.ts +621 -0
  511. package/src/durable/internal/agent-updates.ts +302 -0
  512. package/src/durable/internal/foreign-diagnostic.ts +47 -0
  513. package/src/durable/internal/journal-checkpoint.ts +104 -0
  514. package/src/durable/internal/journal-metadata.ts +117 -0
  515. package/src/durable/internal/message-status.ts +20 -0
  516. package/src/durable/internal/messaging-host.ts +637 -0
  517. package/src/durable/internal/schedule-time.ts +303 -0
  518. package/src/durable/internal/storage-v2-layout.ts +163 -0
  519. package/src/durable/internal/storage-v2.ts +73 -0
  520. package/src/durable/internal/worker-host.ts +2678 -0
  521. package/src/durable/internal/worker-runtime.ts +9 -0
  522. package/src/engine/AgentRuntime.ts +37 -0
  523. package/src/engine/Compaction.ts +11 -0
  524. package/src/engine/ContextCompactor.ts +277 -0
  525. package/src/engine/ContextHistory.ts +73 -0
  526. package/src/engine/ContextWindow.ts +72 -0
  527. package/src/engine/DurableStep.ts +132 -0
  528. package/src/engine/MessagingHost.ts +110 -0
  529. package/src/engine/Output.ts +2 -0
  530. package/src/engine/RunEventSink.ts +132 -0
  531. package/src/engine/RunOptions.ts +1101 -0
  532. package/src/engine/SubagentHost.ts +193 -0
  533. package/src/engine/ThreadHistory.ts +120 -0
  534. package/src/engine/ToolBroker.ts +157 -0
  535. package/src/engine/ToolExposure.ts +48 -0
  536. package/src/engine/internal/agent-runtime.ts +10485 -0
  537. package/src/engine/internal/bounded-value.ts +315 -0
  538. package/src/engine/internal/compaction.ts +678 -0
  539. package/src/engine/internal/error-diagnostic.ts +39 -0
  540. package/src/engine/internal/output-contract.ts +173 -0
  541. package/src/engine/internal/primitive-delta.ts +80 -0
  542. package/src/engine/internal/provider-result-staging.ts +211 -0
  543. package/src/engine/internal/tool-derivative.ts +106 -0
  544. package/src/engine/internal/tool-exposure.ts +224 -0
  545. package/src/engine/internal/tool-telemetry.ts +484 -0
  546. package/src/index.ts +99 -21
  547. package/src/sandbox/CodeExecutor.ts +352 -0
  548. package/src/sandbox/InteractiveBrowser.ts +339 -0
  549. package/src/sandbox/PageCapture.ts +691 -0
  550. package/src/sandbox/PageCrawl.ts +148 -0
  551. package/src/sandbox/PageScreenshot.ts +81 -0
  552. package/src/sandbox/ProtectedBrowser.ts +436 -0
  553. package/src/sandbox/Sandbox.ts +241 -0
@@ -0,0 +1,536 @@
1
+ import { Clock, Duration, Effect, Ref, Schema, type Scope } from "effect";
2
+
3
+ const Natural = Schema.Natural;
4
+ const BudgetLevel = Schema.Literals(["global", "tenant", "agent", "thread", "run"]);
5
+
6
+ export type BudgetLevel = typeof BudgetLevel.Type;
7
+
8
+ /** Fixed units avoid floating-point currency accounting: costs are micro-USD. */
9
+ export class UsageTotals extends Schema.Class<UsageTotals>(
10
+ "@effect-agent/capabilities/UsageTotals",
11
+ )({
12
+ /** Total input tokens across every model call, INCLUDING cache reads and writes at par. */
13
+ inputTokens: Natural,
14
+ outputTokens: Natural,
15
+ /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */
16
+ cacheReadInputTokens: Natural,
17
+ /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */
18
+ cacheWriteInputTokens: Natural,
19
+ /** The most recent model call's input tokens — the live model-context estimate (CAP-017). */
20
+ lastInputTokens: Natural,
21
+ /** The most recent model call's output tokens. */
22
+ lastOutputTokens: Natural,
23
+ toolCalls: Natural,
24
+ costMicrousd: Natural,
25
+ elapsedMillis: Natural,
26
+ }) {}
27
+
28
+ /** Increment recorded at one model/tool accounting boundary. */
29
+ export class UsageDelta extends Schema.Class<UsageDelta>("@effect-agent/capabilities/UsageDelta")({
30
+ /** `1` for a model-response boundary, `0` for a mid-pass tool charge; gates last-call tracking. */
31
+ modelCalls: Natural,
32
+ /** Total input tokens of this boundary, INCLUDING cache reads and writes at par. */
33
+ inputTokens: Natural,
34
+ outputTokens: Natural,
35
+ /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */
36
+ cacheReadInputTokens: Natural,
37
+ /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */
38
+ cacheWriteInputTokens: Natural,
39
+ toolCalls: Natural,
40
+ costMicrousd: Natural,
41
+ }) {}
42
+
43
+ /** All optional limits are finite when present; absent means not configured. */
44
+ export class UsageBudgetLimits extends Schema.Class<UsageBudgetLimits>(
45
+ "@effect-agent/capabilities/UsageBudgetLimits",
46
+ )({
47
+ maxInputTokens: Schema.optionalKey(Natural),
48
+ maxOutputTokens: Schema.optionalKey(Natural),
49
+ maxToolCalls: Schema.optionalKey(Natural),
50
+ maxCostMicrousd: Schema.optionalKey(Natural),
51
+ maxDurationMillis: Schema.optionalKey(Natural),
52
+ }) {}
53
+
54
+ /** Identity and local limits for one node in a global-to-Run budget hierarchy. */
55
+ export class UsageBudgetNodeConfig extends Schema.Class<UsageBudgetNodeConfig>(
56
+ "@effect-agent/capabilities/UsageBudgetNodeConfig",
57
+ )({
58
+ level: BudgetLevel,
59
+ id: Schema.NonEmptyString,
60
+ limits: UsageBudgetLimits,
61
+ }) {}
62
+
63
+ /** Typed finite-budget rejection. A rejected increment is not committed at any hierarchy level. */
64
+ export class BudgetExceeded extends Schema.TaggedError<BudgetExceeded>()("BudgetExceeded", {
65
+ scopeLevel: BudgetLevel,
66
+ scopeId: Schema.NonEmptyString,
67
+ limit: Schema.Literals(["input-tokens", "output-tokens", "tool-calls", "cost", "duration"]),
68
+ limitValue: Natural,
69
+ observedValue: Natural,
70
+ }) {}
71
+
72
+ /** Hierarchical accounting authority. All ancestors share one atomic Ref-backed transaction. */
73
+ export interface UsageBudgetNode {
74
+ readonly level: BudgetLevel;
75
+ readonly id: string;
76
+ /**
77
+ * Register or re-attach one child node. Re-attaching an already-registered
78
+ * `level:id` with identical limits returns a handle to the shared
79
+ * registration; different limits fail with BudgetNodeConflict rather than
80
+ * being silently ignored. Every returned handle owns one registration and
81
+ * must be retired when its lifetime ends; prefer `childScoped` when the
82
+ * lifetime already belongs to an Effect Scope.
83
+ */
84
+ readonly child: (
85
+ config: UsageBudgetNodeConfig,
86
+ ) => Effect.Effect<UsageBudgetNode, InvalidBudgetHierarchy | BudgetNodeConflict>;
87
+ /** Register a child whose registration is retired when the current Scope closes. */
88
+ readonly childScoped: (
89
+ config: UsageBudgetNodeConfig,
90
+ ) => Effect.Effect<UsageBudgetNode, InvalidBudgetHierarchy | BudgetNodeConflict, Scope.Scope>;
91
+ /**
92
+ * Release this handle's registration exactly once. Accumulated usage stays
93
+ * charged to every live ancestor; a node is reclaimed only after its last
94
+ * handle and every descendant have retired.
95
+ */
96
+ readonly retire: Effect.Effect<void>;
97
+ readonly consume: (delta: UsageDelta) => Effect.Effect<UsageTotals, BudgetExceeded>;
98
+ readonly snapshot: Effect.Effect<UsageTotals>;
99
+ /**
100
+ * Guard stalled model/tool work with the earliest configured ancestor deadline.
101
+ * The timeout is driven by Effect Clock and interrupts the guarded child effect.
102
+ */
103
+ readonly guard: <A, E, R>(
104
+ effect: Effect.Effect<A, E, R>,
105
+ ) => Effect.Effect<A, E | BudgetExceeded, R>;
106
+ }
107
+
108
+ /** A child budget must move strictly inward through the declared hierarchy. */
109
+ export class InvalidBudgetHierarchy extends Schema.TaggedError<InvalidBudgetHierarchy>()(
110
+ "InvalidBudgetHierarchy",
111
+ {
112
+ parentLevel: BudgetLevel,
113
+ childLevel: BudgetLevel,
114
+ },
115
+ ) {}
116
+
117
+ /** A child `level:id` is already registered with different limits; neither set may win silently. */
118
+ export class BudgetNodeConflict extends Schema.TaggedError<BudgetNodeConflict>()(
119
+ "BudgetNodeConflict",
120
+ {
121
+ scopeLevel: BudgetLevel,
122
+ scopeId: Schema.NonEmptyString,
123
+ },
124
+ ) {}
125
+
126
+ interface LedgerNode {
127
+ readonly config: UsageBudgetNodeConfig;
128
+ readonly startedAt: number;
129
+ readonly totals: UsageTotals;
130
+ /** Ledger-owned identities of the live handles for this exact registration. */
131
+ readonly handles: ReadonlySet<symbol>;
132
+ }
133
+
134
+ interface BudgetLedger {
135
+ readonly nodes: ReadonlyMap<string, LedgerNode>;
136
+ }
137
+
138
+ type ConsumptionResult =
139
+ | { readonly _tag: "success"; readonly value: UsageTotals }
140
+ | { readonly _tag: "failure"; readonly error: BudgetExceeded }
141
+ | { readonly _tag: "retired" };
142
+
143
+ type ChildRegistrationResult =
144
+ | { readonly _tag: "success" }
145
+ | { readonly _tag: "conflict"; readonly error: BudgetNodeConflict }
146
+ | { readonly _tag: "invalid"; readonly error: InvalidBudgetHierarchy }
147
+ | { readonly _tag: "retired" };
148
+
149
+ const levelOrder: Readonly<Record<BudgetLevel, number>> = {
150
+ global: 0,
151
+ tenant: 1,
152
+ agent: 2,
153
+ thread: 3,
154
+ run: 4,
155
+ };
156
+
157
+ const emptyTotals = (elapsedMillis = 0): UsageTotals =>
158
+ UsageTotals.make({
159
+ inputTokens: 0,
160
+ outputTokens: 0,
161
+ cacheReadInputTokens: 0,
162
+ cacheWriteInputTokens: 0,
163
+ lastInputTokens: 0,
164
+ lastOutputTokens: 0,
165
+ toolCalls: 0,
166
+ costMicrousd: 0,
167
+ elapsedMillis,
168
+ });
169
+
170
+ // Spread-preserve every accumulated field so future additions cannot be
171
+ // silently dropped by an elapsed-only snapshot.
172
+ const withElapsed = (node: LedgerNode, now: number): UsageTotals =>
173
+ UsageTotals.make({
174
+ ...node.totals,
175
+ elapsedMillis: Math.max(0, now - node.startedAt),
176
+ });
177
+
178
+ const addUsage = (node: LedgerNode, delta: UsageDelta, now: number): UsageTotals =>
179
+ UsageTotals.make({
180
+ inputTokens: node.totals.inputTokens + delta.inputTokens,
181
+ outputTokens: node.totals.outputTokens + delta.outputTokens,
182
+ cacheReadInputTokens: node.totals.cacheReadInputTokens + delta.cacheReadInputTokens,
183
+ cacheWriteInputTokens: node.totals.cacheWriteInputTokens + delta.cacheWriteInputTokens,
184
+ lastInputTokens: delta.modelCalls > 0 ? delta.inputTokens : node.totals.lastInputTokens,
185
+ lastOutputTokens: delta.modelCalls > 0 ? delta.outputTokens : node.totals.lastOutputTokens,
186
+ toolCalls: node.totals.toolCalls + delta.toolCalls,
187
+ costMicrousd: node.totals.costMicrousd + delta.costMicrousd,
188
+ elapsedMillis: Math.max(0, now - node.startedAt),
189
+ });
190
+
191
+ const exceeded = (node: LedgerNode, totals: UsageTotals): BudgetExceeded | undefined => {
192
+ const limits = node.config.limits;
193
+
194
+ const checks: ReadonlyArray<readonly [BudgetExceeded["limit"], number | undefined, number]> = [
195
+ ["input-tokens", limits.maxInputTokens, totals.inputTokens],
196
+ ["output-tokens", limits.maxOutputTokens, totals.outputTokens],
197
+ ["tool-calls", limits.maxToolCalls, totals.toolCalls],
198
+ ["cost", limits.maxCostMicrousd, totals.costMicrousd],
199
+ ["duration", limits.maxDurationMillis, totals.elapsedMillis],
200
+ ];
201
+
202
+ for (const [limit, limitValue, observedValue] of checks) {
203
+ if (limitValue !== undefined && observedValue > limitValue) {
204
+ return BudgetExceeded.make({
205
+ scopeLevel: node.config.level,
206
+ scopeId: node.config.id,
207
+ limit,
208
+ limitValue,
209
+ observedValue,
210
+ });
211
+ }
212
+ }
213
+
214
+ return undefined;
215
+ };
216
+
217
+ const sameLimits = (a: UsageBudgetLimits, b: UsageBudgetLimits): boolean =>
218
+ a.maxInputTokens === b.maxInputTokens &&
219
+ a.maxOutputTokens === b.maxOutputTokens &&
220
+ a.maxToolCalls === b.maxToolCalls &&
221
+ a.maxCostMicrousd === b.maxCostMicrousd &&
222
+ a.maxDurationMillis === b.maxDurationMillis;
223
+
224
+ // JSON escapes lone surrogates before URI encoding; every valid string stays distinct,
225
+ // and an ID can never introduce the path separator used by retirement.
226
+ const nodeKeyComponent = (config: UsageBudgetNodeConfig): string =>
227
+ `${config.level}:${encodeURIComponent(JSON.stringify(config.id))}`;
228
+
229
+ const durationExceeded = (node: LedgerNode, now: number): BudgetExceeded => {
230
+ const limitValue = node.config.limits.maxDurationMillis ?? 0;
231
+
232
+ return BudgetExceeded.make({
233
+ scopeLevel: node.config.level,
234
+ scopeId: node.config.id,
235
+ limit: "duration",
236
+ limitValue,
237
+ observedValue: Math.max(limitValue + 1, now - node.startedAt),
238
+ });
239
+ };
240
+
241
+ /** Reclaim one released leaf and any newly unowned ancestors on its fixed hierarchy path. */
242
+ const pruneRetiredHierarchy = (
243
+ nodes: Map<string, LedgerNode>,
244
+ hierarchy: ReadonlyArray<string>,
245
+ ): Map<string, LedgerNode> => {
246
+ for (let index = hierarchy.length - 1; index >= 0; index -= 1) {
247
+ const candidateKey = hierarchy[index];
248
+
249
+ if (candidateKey === undefined) continue;
250
+ const candidate = nodes.get(candidateKey);
251
+
252
+ if (candidate === undefined) continue;
253
+ if (candidate.handles.size > 0) break;
254
+ const childPrefix = `${candidateKey}/`;
255
+
256
+ if ([...nodes.keys()].some((otherKey) => otherKey.startsWith(childPrefix))) {
257
+ break;
258
+ }
259
+ nodes.delete(candidateKey);
260
+ }
261
+
262
+ return nodes;
263
+ };
264
+
265
+ const makeNode = (
266
+ ledger: Ref.Ref<BudgetLedger>,
267
+ key: string,
268
+ ancestors: ReadonlyArray<string>,
269
+ config: UsageBudgetNodeConfig,
270
+ handleId: symbol,
271
+ ): UsageBudgetNode => {
272
+ const hierarchy = [...ancestors, key];
273
+
274
+ const retiredDefect = () =>
275
+ Effect.die(
276
+ new Error(`Usage budget handle ${config.level}:${config.id} was used after retirement`),
277
+ );
278
+
279
+ const liveHierarchy = (state: BudgetLedger): ReadonlyArray<LedgerNode> | undefined => {
280
+ const current = state.nodes.get(key);
281
+
282
+ if (current === undefined || !current.handles.has(handleId)) return undefined;
283
+ const nodes: Array<LedgerNode> = [];
284
+
285
+ for (const ancestorKey of hierarchy) {
286
+ const node = state.nodes.get(ancestorKey);
287
+
288
+ if (node === undefined) return undefined;
289
+ nodes.push(node);
290
+ }
291
+
292
+ return nodes;
293
+ };
294
+
295
+ const readLiveHierarchy = Ref.modify(
296
+ ledger,
297
+ (state): readonly [ReadonlyArray<LedgerNode> | undefined, BudgetLedger] => [
298
+ liveHierarchy(state),
299
+ state,
300
+ ],
301
+ );
302
+
303
+ const snapshot = Effect.gen(function* () {
304
+ const now = yield* Clock.currentTimeMillis;
305
+ const nodes = yield* readLiveHierarchy;
306
+
307
+ if (nodes === undefined) return yield* retiredDefect();
308
+ const node = nodes[nodes.length - 1];
309
+
310
+ if (node === undefined) return yield* retiredDefect();
311
+
312
+ return withElapsed(node, now);
313
+ });
314
+
315
+ const guard = <A, E, R>(
316
+ effect: Effect.Effect<A, E, R>,
317
+ ): Effect.Effect<A, E | BudgetExceeded, R> =>
318
+ Effect.gen(function* () {
319
+ const now = yield* Clock.currentTimeMillis;
320
+ const nodes = yield* readLiveHierarchy;
321
+
322
+ if (nodes === undefined) return yield* retiredDefect();
323
+ let deadline: { readonly remaining: number; readonly node: LedgerNode } | undefined;
324
+
325
+ for (const node of nodes) {
326
+ const current = withElapsed(node, now);
327
+ const alreadyExceeded = exceeded(node, current);
328
+
329
+ if (alreadyExceeded !== undefined) {
330
+ return yield* alreadyExceeded;
331
+ }
332
+ const maxDuration = node.config.limits.maxDurationMillis;
333
+
334
+ if (maxDuration !== undefined) {
335
+ const remaining = maxDuration - current.elapsedMillis;
336
+
337
+ if (remaining <= 0) {
338
+ return yield* durationExceeded(node, now);
339
+ }
340
+ if (deadline === undefined || remaining < deadline.remaining) {
341
+ deadline = { remaining, node };
342
+ }
343
+ }
344
+ }
345
+ if (deadline === undefined) {
346
+ return yield* effect;
347
+ }
348
+ const selected = deadline;
349
+
350
+ return yield* effect.pipe(
351
+ Effect.timeoutOrElse({
352
+ duration: Duration.millis(selected.remaining),
353
+ orElse: () =>
354
+ Clock.currentTimeMillis.pipe(
355
+ Effect.flatMap((timeoutAt) =>
356
+ Effect.fail(durationExceeded(selected.node, timeoutAt)),
357
+ ),
358
+ ),
359
+ }),
360
+ );
361
+ });
362
+
363
+ const child = Effect.fn("UsageBudgetNode.child")(function* (childConfig: UsageBudgetNodeConfig) {
364
+ const childKey = `${key}/${nodeKeyComponent(childConfig)}`;
365
+ const childHandleId = Symbol(`usage-budget:${childConfig.level}:${childConfig.id}`);
366
+ const now = yield* Clock.currentTimeMillis;
367
+
368
+ const registration = yield* Ref.modify(
369
+ ledger,
370
+ (state): readonly [ChildRegistrationResult, BudgetLedger] => {
371
+ if (liveHierarchy(state) === undefined) {
372
+ return [{ _tag: "retired" }, state];
373
+ }
374
+ if (levelOrder[childConfig.level] <= levelOrder[config.level]) {
375
+ return [
376
+ {
377
+ _tag: "invalid",
378
+ error: InvalidBudgetHierarchy.make({
379
+ parentLevel: config.level,
380
+ childLevel: childConfig.level,
381
+ }),
382
+ },
383
+ state,
384
+ ];
385
+ }
386
+ const existing = state.nodes.get(childKey);
387
+
388
+ if (existing !== undefined) {
389
+ return sameLimits(existing.config.limits, childConfig.limits)
390
+ ? [
391
+ { _tag: "success" },
392
+ {
393
+ nodes: new Map(state.nodes).set(childKey, {
394
+ ...existing,
395
+ handles: new Set(existing.handles).add(childHandleId),
396
+ }),
397
+ },
398
+ ]
399
+ : [
400
+ {
401
+ _tag: "conflict",
402
+ error: BudgetNodeConflict.make({
403
+ scopeLevel: childConfig.level,
404
+ scopeId: childConfig.id,
405
+ }),
406
+ },
407
+ state,
408
+ ];
409
+ }
410
+
411
+ return [
412
+ { _tag: "success" },
413
+ {
414
+ nodes: new Map(state.nodes).set(childKey, {
415
+ config: childConfig,
416
+ startedAt: now,
417
+ totals: emptyTotals(),
418
+ handles: new Set([childHandleId]),
419
+ }),
420
+ },
421
+ ];
422
+ },
423
+ );
424
+
425
+ if (registration._tag === "retired") return yield* retiredDefect();
426
+ if (registration._tag === "conflict" || registration._tag === "invalid") {
427
+ return yield* registration.error;
428
+ }
429
+
430
+ return makeNode(ledger, childKey, hierarchy, childConfig, childHandleId);
431
+ });
432
+
433
+ const retire = Effect.uninterruptible(
434
+ Ref.update(ledger, (state) => {
435
+ const existing = state.nodes.get(key);
436
+
437
+ if (existing === undefined || !existing.handles.has(handleId)) return state;
438
+ const handles = new Set(existing.handles);
439
+
440
+ handles.delete(handleId);
441
+ const nodes = new Map(state.nodes).set(key, { ...existing, handles });
442
+
443
+ return { nodes: pruneRetiredHierarchy(nodes, hierarchy) };
444
+ }),
445
+ );
446
+
447
+ return {
448
+ level: config.level,
449
+ id: config.id,
450
+ child,
451
+ childScoped: (childConfig) => Effect.acquireRelease(child(childConfig), (node) => node.retire),
452
+ retire,
453
+ consume: (delta) =>
454
+ Clock.currentTimeMillis.pipe(
455
+ Effect.flatMap((now) =>
456
+ Ref.modify(ledger, (state): readonly [ConsumptionResult, BudgetLedger] => {
457
+ if (liveHierarchy(state) === undefined) {
458
+ return [{ _tag: "retired" }, state];
459
+ }
460
+ const updates = new Map<string, LedgerNode>();
461
+
462
+ for (const ancestorKey of hierarchy) {
463
+ const node = state.nodes.get(ancestorKey);
464
+
465
+ if (node === undefined) return [{ _tag: "retired" }, state];
466
+ const totals = addUsage(node, delta, now);
467
+ const error = exceeded(node, totals);
468
+
469
+ if (error !== undefined) {
470
+ return [{ _tag: "failure", error }, state];
471
+ }
472
+ updates.set(ancestorKey, { ...node, totals });
473
+ }
474
+ const nextNodes = new Map(state.nodes);
475
+
476
+ for (const [updatedKey, updatedNode] of updates) {
477
+ nextNodes.set(updatedKey, updatedNode);
478
+ }
479
+ const value = updates.get(key)?.totals;
480
+
481
+ return value === undefined
482
+ ? [{ _tag: "retired" }, state]
483
+ : [{ _tag: "success", value }, { nodes: nextNodes }];
484
+ }).pipe(
485
+ Effect.flatMap((result) => {
486
+ switch (result._tag) {
487
+ case "success":
488
+ return Effect.succeed(result.value);
489
+ case "failure":
490
+ return Effect.fail(result.error);
491
+ case "retired":
492
+ return retiredDefect();
493
+ }
494
+ }),
495
+ ),
496
+ ),
497
+ ),
498
+ snapshot,
499
+ guard,
500
+ };
501
+ };
502
+
503
+ /** Create the outermost node of a hierarchy. Child nodes share its atomic ledger. */
504
+ export const makeUsageBudgetRoot = Effect.fn("makeUsageBudgetRoot")(function* (
505
+ config: UsageBudgetNodeConfig,
506
+ ) {
507
+ const startedAt = yield* Clock.currentTimeMillis;
508
+ const key = nodeKeyComponent(config);
509
+ const handleId = Symbol(`usage-budget:${config.level}:${config.id}`);
510
+
511
+ const ledger = yield* Ref.make<BudgetLedger>({
512
+ nodes: new Map([
513
+ [
514
+ key,
515
+ {
516
+ config,
517
+ startedAt,
518
+ totals: emptyTotals(),
519
+ handles: new Set([handleId]),
520
+ },
521
+ ],
522
+ ]),
523
+ });
524
+
525
+ return makeNode(ledger, key, [], config, handleId);
526
+ });
527
+
528
+ /** Compatibility constructor for a standalone Run budget. */
529
+ export const makeUsageBudget = (limits: UsageBudgetLimits): Effect.Effect<UsageBudgetNode> =>
530
+ makeUsageBudgetRoot(
531
+ UsageBudgetNodeConfig.make({
532
+ level: "run",
533
+ id: "standalone-run",
534
+ limits,
535
+ }),
536
+ );