effect-agent 0.1.0-beta.12 → 0.1.0-beta.121

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-D9cXqfF3.d.mts +252 -0
  4. package/dist/AgentError-Bn1ytXRD.d.mts +117 -0
  5. package/dist/AgentPolicy-BqDoSXO6.d.mts +96 -0
  6. package/dist/AgentRuntime-BUxDdLpw.d.mts +346 -0
  7. package/dist/AgentRuntime-Cp1hAb-W.mjs +4739 -0
  8. package/dist/AgentRuntime-Cp1hAb-W.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-B-9w7jDt.mjs +7061 -0
  13. package/dist/DurableAgentRuntime-B-9w7jDt.mjs.map +1 -0
  14. package/dist/DurableFailpoint-Cnr3wx1L.d.mts +41 -0
  15. package/dist/DurableStep-Cry_iol4.d.mts +103 -0
  16. package/dist/EventSource-CnlZ3Kma.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-Dkg87ebg.d.mts +221 -0
  27. package/dist/Messaging-JYYN3oYS.d.mts +1067 -0
  28. package/dist/MessagingHost-CqzpxbGz.d.mts +74 -0
  29. package/dist/MessagingHost-DfsbMPvq.mjs +110 -0
  30. package/dist/MessagingHost-DfsbMPvq.mjs.map +1 -0
  31. package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
  32. package/dist/Output-V-6YL1_Z.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-BQLGldl-.d.mts +42 -0
  36. package/dist/Receipt-BAHyigAF.d.mts +33 -0
  37. package/dist/Records-D88mgvyS.d.mts +4214 -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-CSBsSj0X.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-BIOHA6RR.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-CNik9RiA.d.mts +1635 -0
  49. package/dist/Subagent-DCrB7an7.mjs +1498 -0
  50. package/dist/Subagent-DCrB7an7.mjs.map +1 -0
  51. package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
  52. package/dist/SubagentHost-4WB8Hj0C.d.mts +164 -0
  53. package/dist/Subscription-CRteOKRf.d.mts +948 -0
  54. package/dist/SubscriptionInput-oNcwTPti.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-CfwzMZEK.mjs +271 -0
  72. package/dist/Worker-CfwzMZEK.mjs.map +1 -0
  73. package/dist/Worker-fwWkBg12.d.mts +472 -0
  74. package/dist/agent-registration-CKNsrpwo.mjs +201 -0
  75. package/dist/agent-registration-CKNsrpwo.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 +259 -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 +102 -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 +893 -0
  233. package/dist/durable/MessageDelivery.mjs +557 -0
  234. package/dist/durable/MessageDelivery.mjs.map +1 -0
  235. package/dist/durable/MessageDeliveryStoreConformance.d.mts +378 -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 +848 -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 +179 -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 +53 -0
  279. package/dist/durable/SqlThreadNativeReads.mjs +159 -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 +959 -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 +2187 -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 +355 -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 +76 -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 +283 -0
  398. package/dist/sandbox/ProtectedBrowser.mjs +298 -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 +426 -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 +2489 -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 +1273 -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 +136 -0
  433. package/src/capabilities/internal/utf8.ts +10 -0
  434. package/src/core/Agent.ts +602 -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 +240 -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 +11275 -0
  470. package/src/durable/DurableFailpoint.ts +111 -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 +832 -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 +1075 -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 +335 -0
  488. package/src/durable/SqlStorageV2Upgrade.ts +500 -0
  489. package/src/durable/SqlSubscriptionStore.ts +1440 -0
  490. package/src/durable/SqlThreadNativeReads.ts +270 -0
  491. package/src/durable/SubmissionLedger.ts +1265 -0
  492. package/src/durable/SubmissionLedgerConformance.ts +4820 -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 +573 -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 +587 -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 +2885 -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 +230 -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 +10500 -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 +452 -0
  553. package/src/sandbox/Sandbox.ts +241 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Approval.mjs","names":[],"sources":["../../src/capabilities/Approval.ts"],"sourcesContent":["import { Clock, Context, DateTime, Duration, Effect, Layer, Ref, Schema } from \"effect\";\n\nimport { ThreadId, RunId, ToolCallId } from \"../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../core/internal/utf8.ts\";\nimport { RedactedPreview, Redactor, type RedactionError } from \"./Redaction.ts\";\n\nconst MAX_APPROVAL_TARGETS = 32;\nconst MAX_APPROVAL_TARGET_BYTES = 64 * 1024;\nconst MAX_APPROVAL_AUDIT_EVENTS = 2_048;\n\nconst ApprovalTargets = Schema.Array(Schema.String.check(Schema.isMaxLength(2 * 1024)))\n .check(Schema.isMaxLength(MAX_APPROVAL_TARGETS))\n .pipe(\n Schema.refine(\n (targets): targets is ReadonlyArray<string> =>\n targets.reduce((total, target) => total + utf8ByteLength(target), 0) <=\n MAX_APPROVAL_TARGET_BYTES,\n { expected: `approval targets totaling at most ${MAX_APPROVAL_TARGET_BYTES} UTF-8 bytes` },\n ),\n );\n\nconst ApprovalRequestFields = {\n requestId: Schema.NonEmptyString,\n runId: RunId,\n threadId: ThreadId,\n toolCallId: ToolCallId,\n toolName: Schema.NonEmptyString,\n actionSummary: Schema.String.check(Schema.isMaxLength(2 * 1024)),\n resourceTargets: ApprovalTargets,\n risk: Schema.Literals([\"low\", \"medium\", \"high\", \"critical\"]),\n expiresAt: Schema.DateTimeUtcFromString,\n denial: Schema.Literals([\"terminal\", \"recoverable\"]),\n} as const;\n\n/** Decoded approval metadata before the Redactor owns Tool input preview creation. */\nexport class ApprovalRequestDraft extends Schema.Class<ApprovalRequestDraft>(\n \"@effect-agent/capabilities/ApprovalRequestDraft\",\n)(ApprovalRequestFields) {}\n\n/** Fully decoded, structurally redacted approval input. */\nexport class ApprovalRequest extends Schema.Class<ApprovalRequest>(\n \"@effect-agent/capabilities/ApprovalRequest\",\n)({\n ...ApprovalRequestFields,\n redactedInputPreview: RedactedPreview,\n}) {}\n\nexport class ApprovalApproved extends Schema.TaggedClass<ApprovalApproved>()(\"ApprovalApproved\", {\n requestId: Schema.NonEmptyString,\n decidedAt: Schema.DateTimeUtcFromString,\n resolver: Schema.NonEmptyString,\n}) {}\n\nexport class ApprovalDenied extends Schema.TaggedClass<ApprovalDenied>()(\"ApprovalDenied\", {\n requestId: Schema.NonEmptyString,\n decidedAt: Schema.DateTimeUtcFromString,\n resolver: Schema.NonEmptyString,\n reason: Schema.String.check(Schema.isMaxLength(2 * 1024)),\n timedOut: Schema.Boolean,\n}) {}\n\nexport const ApprovalDecision = Schema.Union([ApprovalApproved, ApprovalDenied]);\nexport type ApprovalDecision = typeof ApprovalDecision.Type;\n\n/** Resolver infrastructure failed before it could make a policy decision. */\nexport class ApprovalResolverError extends Schema.TaggedError<ApprovalResolverError>()(\n \"ApprovalResolverError\",\n { message: Schema.String },\n) {}\n\n/** The resolver explicitly observed its request deadline; callers turn this into a denial. */\nexport class ApprovalTimedOut extends Schema.TaggedError<ApprovalTimedOut>()(\"ApprovalTimedOut\", {\n requestId: Schema.NonEmptyString,\n}) {}\n\n/** First-class approval authority. Interactive, policy, and remote adapters implement this service. */\nexport class ApprovalResolver extends Context.Service<\n ApprovalResolver,\n {\n readonly request: (\n request: ApprovalRequest,\n ) => Effect.Effect<ApprovalDecision, ApprovalResolverError | ApprovalTimedOut>;\n }\n>()(\"@effect-agent/capabilities/ApprovalResolver\") {}\n\nexport class ApprovalRequestRecorded extends Schema.TaggedClass<ApprovalRequestRecorded>()(\n \"ApprovalRequestRecorded\",\n {\n sequence: Schema.Natural,\n recordedAt: Schema.DateTimeUtcFromString,\n request: ApprovalRequest,\n },\n) {}\n\nexport class ApprovalDecisionRecorded extends Schema.TaggedClass<ApprovalDecisionRecorded>()(\n \"ApprovalDecisionRecorded\",\n {\n sequence: Schema.Natural,\n recordedAt: Schema.DateTimeUtcFromString,\n decision: ApprovalDecision,\n },\n) {}\n\nexport const ApprovalAuditEvent = Schema.Union([ApprovalRequestRecorded, ApprovalDecisionRecorded]);\nexport type ApprovalAuditEvent = typeof ApprovalAuditEvent.Type;\n\nexport const ApprovalAuditEvents = Schema.Array(ApprovalAuditEvent).check(\n Schema.isMaxLength(MAX_APPROVAL_AUDIT_EVENTS),\n);\n\nexport class ApprovalAuditLimitExceeded extends Schema.TaggedError<ApprovalAuditLimitExceeded>()(\n \"ApprovalAuditLimitExceeded\",\n {\n limitValue: Schema.Natural,\n observedValue: Schema.Natural,\n },\n) {}\n\n/** A resolver or audit sink tried to associate a decision with another request. */\nexport class ApprovalDecisionMismatch extends Schema.TaggedError<ApprovalDecisionMismatch>()(\n \"ApprovalDecisionMismatch\",\n {\n expectedRequestId: Schema.NonEmptyString,\n observedRequestId: Schema.NonEmptyString,\n },\n) {}\n\n/** P2 semantic audit sink; durable runtimes replace this with canonical records. */\nexport class ApprovalAudit extends Context.Service<\n ApprovalAudit,\n {\n readonly recordRequest: (\n request: ApprovalRequest,\n ) => Effect.Effect<void, ApprovalAuditLimitExceeded>;\n readonly recordDecision: (\n decision: ApprovalDecision,\n ) => Effect.Effect<void, ApprovalAuditLimitExceeded | ApprovalDecisionMismatch>;\n readonly events: Effect.Effect<ReadonlyArray<ApprovalAuditEvent>>;\n }\n>()(\"@effect-agent/capabilities/ApprovalAudit\") {}\n\n/** Scoped in-memory audit projection with monotonic event order. */\nexport const ApprovalAuditMemoryLive = Layer.effect(\n ApprovalAudit,\n Effect.gen(function* () {\n interface AuditState {\n readonly events: ReadonlyArray<ApprovalAuditEvent>;\n readonly pending: ReadonlySet<string>;\n }\n const state = yield* Ref.make<AuditState>({ events: [], pending: new Set() });\n\n return ApprovalAudit.of({\n recordRequest: (request) =>\n Effect.gen(function* () {\n const recordedAt = DateTime.toUtc(DateTime.makeUnsafe(yield* Clock.currentTimeMillis));\n\n const error = yield* Ref.modify(state, (current) => {\n // Each accepted request atomically reserves room for its decision.\n const reservedSize = current.events.length + current.pending.size + 2;\n\n if (reservedSize > MAX_APPROVAL_AUDIT_EVENTS) {\n return [\n ApprovalAuditLimitExceeded.make({\n limitValue: MAX_APPROVAL_AUDIT_EVENTS,\n observedValue: reservedSize,\n }),\n current,\n ] as const;\n }\n\n const event = ApprovalRequestRecorded.make({\n sequence: current.events.length,\n recordedAt,\n request,\n });\n\n return [\n undefined,\n {\n events: [...current.events, event],\n pending: new Set(current.pending).add(request.requestId),\n },\n ] as const;\n });\n\n if (error !== undefined) return yield* error;\n }),\n recordDecision: (decision) =>\n Effect.gen(function* () {\n const recordedAt = DateTime.toUtc(DateTime.makeUnsafe(yield* Clock.currentTimeMillis));\n\n const error = yield* Ref.modify(state, (current) => {\n if (!current.pending.has(decision.requestId)) {\n return [\n ApprovalDecisionMismatch.make({\n expectedRequestId: [...current.pending][0] ?? \"no-pending-request\",\n observedRequestId: decision.requestId,\n }),\n current,\n ] as const;\n }\n const pending = new Set(current.pending);\n\n pending.delete(decision.requestId);\n\n const event = ApprovalDecisionRecorded.make({\n sequence: current.events.length,\n recordedAt,\n decision,\n });\n\n return [\n undefined,\n {\n events: [...current.events, event],\n pending,\n },\n ] as const;\n });\n\n if (error !== undefined) return yield* error;\n }),\n events: Ref.get(state).pipe(Effect.map((current) => current.events)),\n });\n }),\n);\n\n/** Construct an ApprovalRequest only after decoded input passes the configured Redactor. */\nexport const makeApprovalRequest = Effect.fn(\"makeApprovalRequest\")(function* (\n draft: ApprovalRequestDraft,\n decodedToolInput: unknown,\n): Effect.fn.Return<ApprovalRequest, RedactionError, Redactor> {\n const redactor = yield* Redactor;\n const redactedInputPreview = yield* redactor.redact(decodedToolInput);\n\n return ApprovalRequest.make({\n requestId: draft.requestId,\n runId: draft.runId,\n threadId: draft.threadId,\n toolCallId: draft.toolCallId,\n toolName: draft.toolName,\n actionSummary: draft.actionSummary,\n resourceTargets: draft.resourceTargets,\n risk: draft.risk,\n expiresAt: draft.expiresAt,\n denial: draft.denial,\n redactedInputPreview,\n });\n});\n\nconst timeoutDenial = (request: ApprovalRequest, decidedAt: DateTime.Utc): ApprovalDenied =>\n ApprovalDenied.make({\n requestId: request.requestId,\n decidedAt,\n resolver: \"effect-agent.timeout-deny\",\n reason: \"Approval request expired before a decision was available\",\n timedOut: true,\n });\n\n/**\n * Resolve with fail-closed deadline semantics and record request/decision audit\n * events around every successful, denied, timed-out, or resolver-failed\n * resolution. A resolver infrastructure failure records a synthetic denial so\n * the audit reservation is released before the typed error propagates.\n */\nexport const requestApproval = Effect.fn(\"requestApproval\")(function* (request: ApprovalRequest) {\n const audit = yield* ApprovalAudit;\n\n yield* audit.recordRequest(request);\n const nowMillis = yield* Clock.currentTimeMillis;\n const now = DateTime.toUtc(DateTime.makeUnsafe(nowMillis));\n const remainingMillis = DateTime.toEpochMillis(request.expiresAt) - nowMillis;\n\n let decision: ApprovalDecision;\n\n if (remainingMillis <= 0) {\n decision = timeoutDenial(request, now);\n } else {\n const resolver = yield* ApprovalResolver;\n\n decision = yield* resolver.request(request).pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(remainingMillis),\n orElse: () =>\n Clock.currentTimeMillis.pipe(\n Effect.map((millis) =>\n timeoutDenial(request, DateTime.toUtc(DateTime.makeUnsafe(millis))),\n ),\n ),\n }),\n Effect.catchTag(\"ApprovalTimedOut\", () =>\n Clock.currentTimeMillis.pipe(\n Effect.map((millis) =>\n timeoutDenial(request, DateTime.toUtc(DateTime.makeUnsafe(millis))),\n ),\n ),\n ),\n Effect.tapError(() =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((millis) =>\n audit.recordDecision(\n ApprovalDenied.make({\n requestId: request.requestId,\n decidedAt: DateTime.toUtc(DateTime.makeUnsafe(millis)),\n resolver: \"effect-agent.resolver-error\",\n reason: \"Approval resolver failed before making a policy decision\",\n timedOut: false,\n }),\n ),\n ),\n ),\n ),\n );\n }\n if (decision.requestId !== request.requestId) {\n const mismatch = ApprovalDecisionMismatch.make({\n expectedRequestId: request.requestId,\n observedRequestId: decision.requestId,\n });\n\n const denied = ApprovalDenied.make({\n requestId: request.requestId,\n decidedAt: DateTime.toUtc(DateTime.makeUnsafe(yield* Clock.currentTimeMillis)),\n resolver: \"effect-agent.correlation-check\",\n reason: \"Approval resolver returned a decision for another request\",\n timedOut: false,\n });\n\n yield* audit.recordDecision(denied);\n\n return yield* mismatch;\n }\n yield* audit.recordDecision(decision);\n\n return decision;\n});\n\n/** Deterministic policy layer for tests and deny-by-default deployments. */\nexport const ApprovalDenyAll = Layer.succeed(ApprovalResolver)({\n request: (request) =>\n Clock.currentTimeMillis.pipe(\n Effect.map((millis) =>\n ApprovalDenied.make({\n requestId: request.requestId,\n decidedAt: DateTime.toUtc(DateTime.makeUnsafe(millis)),\n resolver: \"effect-agent.deny-all\",\n reason: \"No approving policy is configured\",\n timedOut: false,\n }),\n ),\n ),\n});\n"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { Effect, Schema, Scope } from "effect";
2
+ declare namespace Budget_d_exports {
3
+ export { BudgetExceeded, BudgetLevel, BudgetNodeConflict, InvalidBudgetHierarchy, UsageBudgetLimits, UsageBudgetNode, UsageBudgetNodeConfig, UsageDelta, UsageTotals, makeUsageBudget, makeUsageBudgetRoot };
4
+ }
5
+ declare const BudgetLevel: Schema.Literals<readonly ["global", "tenant", "agent", "thread", "run"]>;
6
+ type BudgetLevel = typeof BudgetLevel.Type;
7
+ declare const UsageTotals_base: Schema.Class<UsageTotals, Schema.Struct<{
8
+ /** Total input tokens across every model call, INCLUDING cache reads and writes at par. */
9
+ readonly inputTokens: Schema.Natural;
10
+ readonly outputTokens: Schema.Natural;
11
+ /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */
12
+ readonly cacheReadInputTokens: Schema.Natural;
13
+ /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */
14
+ readonly cacheWriteInputTokens: Schema.Natural;
15
+ /** The most recent model call's input tokens — the live model-context estimate (CAP-017). */
16
+ readonly lastInputTokens: Schema.Natural;
17
+ /** The most recent model call's output tokens. */
18
+ readonly lastOutputTokens: Schema.Natural;
19
+ readonly toolCalls: Schema.Natural;
20
+ readonly costMicrousd: Schema.Natural;
21
+ readonly elapsedMillis: Schema.Natural;
22
+ }>, {}>;
23
+ /** Fixed units avoid floating-point currency accounting: costs are micro-USD. */
24
+ export declare class UsageTotals extends UsageTotals_base {}
25
+ declare const UsageDelta_base: Schema.Class<UsageDelta, Schema.Struct<{
26
+ /** `1` for a model-response boundary, `0` for a mid-pass tool charge; gates last-call tracking. */
27
+ readonly modelCalls: Schema.Natural;
28
+ /** Total input tokens of this boundary, INCLUDING cache reads and writes at par. */
29
+ readonly inputTokens: Schema.Natural;
30
+ readonly outputTokens: Schema.Natural;
31
+ /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */
32
+ readonly cacheReadInputTokens: Schema.Natural;
33
+ /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */
34
+ readonly cacheWriteInputTokens: Schema.Natural;
35
+ readonly toolCalls: Schema.Natural;
36
+ readonly costMicrousd: Schema.Natural;
37
+ }>, {}>;
38
+ /** Increment recorded at one model/tool accounting boundary. */
39
+ export declare class UsageDelta extends UsageDelta_base {}
40
+ declare const UsageBudgetLimits_base: Schema.Class<UsageBudgetLimits, Schema.Struct<{
41
+ readonly maxInputTokens: Schema.optionalKey<Schema.Natural>;
42
+ readonly maxOutputTokens: Schema.optionalKey<Schema.Natural>;
43
+ readonly maxToolCalls: Schema.optionalKey<Schema.Natural>;
44
+ readonly maxCostMicrousd: Schema.optionalKey<Schema.Natural>;
45
+ readonly maxDurationMillis: Schema.optionalKey<Schema.Natural>;
46
+ }>, {}>;
47
+ /** All optional limits are finite when present; absent means not configured. */
48
+ export declare class UsageBudgetLimits extends UsageBudgetLimits_base {}
49
+ declare const UsageBudgetNodeConfig_base: Schema.Class<UsageBudgetNodeConfig, Schema.Struct<{
50
+ readonly level: Schema.Literals<readonly ["global", "tenant", "agent", "thread", "run"]>;
51
+ readonly id: Schema.NonEmptyString;
52
+ readonly limits: typeof UsageBudgetLimits;
53
+ }>, {}>;
54
+ /** Identity and local limits for one node in a global-to-Run budget hierarchy. */
55
+ export declare class UsageBudgetNodeConfig extends UsageBudgetNodeConfig_base {}
56
+ declare const BudgetExceeded_base: Schema.Class<BudgetExceeded, Schema.TaggedStruct<"BudgetExceeded", {
57
+ readonly scopeLevel: Schema.Literals<readonly ["global", "tenant", "agent", "thread", "run"]>;
58
+ readonly scopeId: Schema.NonEmptyString;
59
+ readonly limit: Schema.Literals<readonly ["input-tokens", "output-tokens", "tool-calls", "cost", "duration"]>;
60
+ readonly limitValue: Schema.Natural;
61
+ readonly observedValue: Schema.Natural;
62
+ }>, import("effect/Cause").YieldableError>;
63
+ /** Typed finite-budget rejection. A rejected increment is not committed at any hierarchy level. */
64
+ export declare class BudgetExceeded extends BudgetExceeded_base {}
65
+ /** Hierarchical accounting authority. All ancestors share one atomic Ref-backed transaction. */
66
+ export interface UsageBudgetNode {
67
+ readonly level: BudgetLevel;
68
+ readonly id: string;
69
+ /**
70
+ * Register or re-attach one child node. Re-attaching an already-registered
71
+ * `level:id` with identical limits returns a handle to the shared
72
+ * registration; different limits fail with BudgetNodeConflict rather than
73
+ * being silently ignored. Every returned handle owns one registration and
74
+ * must be retired when its lifetime ends; prefer `childScoped` when the
75
+ * lifetime already belongs to an Effect Scope.
76
+ */
77
+ readonly child: (config: UsageBudgetNodeConfig) => Effect.Effect<UsageBudgetNode, InvalidBudgetHierarchy | BudgetNodeConflict>;
78
+ /** Register a child whose registration is retired when the current Scope closes. */
79
+ readonly childScoped: (config: UsageBudgetNodeConfig) => Effect.Effect<UsageBudgetNode, InvalidBudgetHierarchy | BudgetNodeConflict, Scope.Scope>;
80
+ /**
81
+ * Release this handle's registration exactly once. Accumulated usage stays
82
+ * charged to every live ancestor; a node is reclaimed only after its last
83
+ * handle and every descendant have retired.
84
+ */
85
+ readonly retire: Effect.Effect<void>;
86
+ readonly consume: (delta: UsageDelta) => Effect.Effect<UsageTotals, BudgetExceeded>;
87
+ readonly snapshot: Effect.Effect<UsageTotals>;
88
+ /**
89
+ * Guard stalled model/tool work with the earliest configured ancestor deadline.
90
+ * The timeout is driven by Effect Clock and interrupts the guarded child effect.
91
+ */
92
+ readonly guard: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | BudgetExceeded, R>;
93
+ }
94
+ declare const InvalidBudgetHierarchy_base: Schema.Class<InvalidBudgetHierarchy, Schema.TaggedStruct<"InvalidBudgetHierarchy", {
95
+ readonly parentLevel: Schema.Literals<readonly ["global", "tenant", "agent", "thread", "run"]>;
96
+ readonly childLevel: Schema.Literals<readonly ["global", "tenant", "agent", "thread", "run"]>;
97
+ }>, import("effect/Cause").YieldableError>;
98
+ /** A child budget must move strictly inward through the declared hierarchy. */
99
+ export declare class InvalidBudgetHierarchy extends InvalidBudgetHierarchy_base {}
100
+ declare const BudgetNodeConflict_base: Schema.Class<BudgetNodeConflict, Schema.TaggedStruct<"BudgetNodeConflict", {
101
+ readonly scopeLevel: Schema.Literals<readonly ["global", "tenant", "agent", "thread", "run"]>;
102
+ readonly scopeId: Schema.NonEmptyString;
103
+ }>, import("effect/Cause").YieldableError>;
104
+ /** A child `level:id` is already registered with different limits; neither set may win silently. */
105
+ export declare class BudgetNodeConflict extends BudgetNodeConflict_base {}
106
+ /** Create the outermost node of a hierarchy. Child nodes share its atomic ledger. */
107
+ export declare const makeUsageBudgetRoot: (config: UsageBudgetNodeConfig) => Effect.Effect<UsageBudgetNode, never, never>;
108
+ /** Compatibility constructor for a standalone Run budget. */
109
+ export declare const makeUsageBudget: (limits: UsageBudgetLimits) => Effect.Effect<UsageBudgetNode>;
110
+ //#endregion
111
+ export { BudgetLevel, Budget_d_exports as t };
112
+ //# sourceMappingURL=Budget.d.mts.map
@@ -0,0 +1,346 @@
1
+ import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
2
+ import { Clock, Duration, Effect, Ref, Schema } from "effect";
3
+ //#region src/capabilities/Budget.ts
4
+ var Budget_exports = /* @__PURE__ */ __exportAll({
5
+ BudgetExceeded: () => BudgetExceeded,
6
+ BudgetNodeConflict: () => BudgetNodeConflict,
7
+ InvalidBudgetHierarchy: () => InvalidBudgetHierarchy,
8
+ UsageBudgetLimits: () => UsageBudgetLimits,
9
+ UsageBudgetNodeConfig: () => UsageBudgetNodeConfig,
10
+ UsageDelta: () => UsageDelta,
11
+ UsageTotals: () => UsageTotals,
12
+ makeUsageBudget: () => makeUsageBudget,
13
+ makeUsageBudgetRoot: () => makeUsageBudgetRoot
14
+ });
15
+ const Natural = Schema.Natural;
16
+ const BudgetLevel = Schema.Literals([
17
+ "global",
18
+ "tenant",
19
+ "agent",
20
+ "thread",
21
+ "run"
22
+ ]);
23
+ /** Fixed units avoid floating-point currency accounting: costs are micro-USD. */
24
+ var UsageTotals = class extends Schema.Class("@effect-agent/capabilities/UsageTotals")({
25
+ /** Total input tokens across every model call, INCLUDING cache reads and writes at par. */
26
+ inputTokens: Natural,
27
+ outputTokens: Natural,
28
+ /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */
29
+ cacheReadInputTokens: Natural,
30
+ /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */
31
+ cacheWriteInputTokens: Natural,
32
+ /** The most recent model call's input tokens — the live model-context estimate (CAP-017). */
33
+ lastInputTokens: Natural,
34
+ /** The most recent model call's output tokens. */
35
+ lastOutputTokens: Natural,
36
+ toolCalls: Natural,
37
+ costMicrousd: Natural,
38
+ elapsedMillis: Natural
39
+ }) {};
40
+ /** Increment recorded at one model/tool accounting boundary. */
41
+ var UsageDelta = class extends Schema.Class("@effect-agent/capabilities/UsageDelta")({
42
+ /** `1` for a model-response boundary, `0` for a mid-pass tool charge; gates last-call tracking. */
43
+ modelCalls: Natural,
44
+ /** Total input tokens of this boundary, INCLUDING cache reads and writes at par. */
45
+ inputTokens: Natural,
46
+ outputTokens: Natural,
47
+ /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */
48
+ cacheReadInputTokens: Natural,
49
+ /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */
50
+ cacheWriteInputTokens: Natural,
51
+ toolCalls: Natural,
52
+ costMicrousd: Natural
53
+ }) {};
54
+ /** All optional limits are finite when present; absent means not configured. */
55
+ var UsageBudgetLimits = class extends Schema.Class("@effect-agent/capabilities/UsageBudgetLimits")({
56
+ maxInputTokens: Schema.optionalKey(Natural),
57
+ maxOutputTokens: Schema.optionalKey(Natural),
58
+ maxToolCalls: Schema.optionalKey(Natural),
59
+ maxCostMicrousd: Schema.optionalKey(Natural),
60
+ maxDurationMillis: Schema.optionalKey(Natural)
61
+ }) {};
62
+ /** Identity and local limits for one node in a global-to-Run budget hierarchy. */
63
+ var UsageBudgetNodeConfig = class extends Schema.Class("@effect-agent/capabilities/UsageBudgetNodeConfig")({
64
+ level: BudgetLevel,
65
+ id: Schema.NonEmptyString,
66
+ limits: UsageBudgetLimits
67
+ }) {};
68
+ /** Typed finite-budget rejection. A rejected increment is not committed at any hierarchy level. */
69
+ var BudgetExceeded = class extends Schema.TaggedError()("BudgetExceeded", {
70
+ scopeLevel: BudgetLevel,
71
+ scopeId: Schema.NonEmptyString,
72
+ limit: Schema.Literals([
73
+ "input-tokens",
74
+ "output-tokens",
75
+ "tool-calls",
76
+ "cost",
77
+ "duration"
78
+ ]),
79
+ limitValue: Natural,
80
+ observedValue: Natural
81
+ }) {};
82
+ /** A child budget must move strictly inward through the declared hierarchy. */
83
+ var InvalidBudgetHierarchy = class extends Schema.TaggedError()("InvalidBudgetHierarchy", {
84
+ parentLevel: BudgetLevel,
85
+ childLevel: BudgetLevel
86
+ }) {};
87
+ /** A child `level:id` is already registered with different limits; neither set may win silently. */
88
+ var BudgetNodeConflict = class extends Schema.TaggedError()("BudgetNodeConflict", {
89
+ scopeLevel: BudgetLevel,
90
+ scopeId: Schema.NonEmptyString
91
+ }) {};
92
+ const levelOrder = {
93
+ global: 0,
94
+ tenant: 1,
95
+ agent: 2,
96
+ thread: 3,
97
+ run: 4
98
+ };
99
+ const emptyTotals = (elapsedMillis = 0) => UsageTotals.make({
100
+ inputTokens: 0,
101
+ outputTokens: 0,
102
+ cacheReadInputTokens: 0,
103
+ cacheWriteInputTokens: 0,
104
+ lastInputTokens: 0,
105
+ lastOutputTokens: 0,
106
+ toolCalls: 0,
107
+ costMicrousd: 0,
108
+ elapsedMillis
109
+ });
110
+ const withElapsed = (node, now) => UsageTotals.make({
111
+ ...node.totals,
112
+ elapsedMillis: Math.max(0, now - node.startedAt)
113
+ });
114
+ const addUsage = (node, delta, now) => UsageTotals.make({
115
+ inputTokens: node.totals.inputTokens + delta.inputTokens,
116
+ outputTokens: node.totals.outputTokens + delta.outputTokens,
117
+ cacheReadInputTokens: node.totals.cacheReadInputTokens + delta.cacheReadInputTokens,
118
+ cacheWriteInputTokens: node.totals.cacheWriteInputTokens + delta.cacheWriteInputTokens,
119
+ lastInputTokens: delta.modelCalls > 0 ? delta.inputTokens : node.totals.lastInputTokens,
120
+ lastOutputTokens: delta.modelCalls > 0 ? delta.outputTokens : node.totals.lastOutputTokens,
121
+ toolCalls: node.totals.toolCalls + delta.toolCalls,
122
+ costMicrousd: node.totals.costMicrousd + delta.costMicrousd,
123
+ elapsedMillis: Math.max(0, now - node.startedAt)
124
+ });
125
+ const exceeded = (node, totals) => {
126
+ const limits = node.config.limits;
127
+ const checks = [
128
+ [
129
+ "input-tokens",
130
+ limits.maxInputTokens,
131
+ totals.inputTokens
132
+ ],
133
+ [
134
+ "output-tokens",
135
+ limits.maxOutputTokens,
136
+ totals.outputTokens
137
+ ],
138
+ [
139
+ "tool-calls",
140
+ limits.maxToolCalls,
141
+ totals.toolCalls
142
+ ],
143
+ [
144
+ "cost",
145
+ limits.maxCostMicrousd,
146
+ totals.costMicrousd
147
+ ],
148
+ [
149
+ "duration",
150
+ limits.maxDurationMillis,
151
+ totals.elapsedMillis
152
+ ]
153
+ ];
154
+ for (const [limit, limitValue, observedValue] of checks) if (limitValue !== void 0 && observedValue > limitValue) return BudgetExceeded.make({
155
+ scopeLevel: node.config.level,
156
+ scopeId: node.config.id,
157
+ limit,
158
+ limitValue,
159
+ observedValue
160
+ });
161
+ };
162
+ const sameLimits = (a, b) => a.maxInputTokens === b.maxInputTokens && a.maxOutputTokens === b.maxOutputTokens && a.maxToolCalls === b.maxToolCalls && a.maxCostMicrousd === b.maxCostMicrousd && a.maxDurationMillis === b.maxDurationMillis;
163
+ const nodeKeyComponent = (config) => `${config.level}:${encodeURIComponent(JSON.stringify(config.id))}`;
164
+ const durationExceeded = (node, now) => {
165
+ const limitValue = node.config.limits.maxDurationMillis ?? 0;
166
+ return BudgetExceeded.make({
167
+ scopeLevel: node.config.level,
168
+ scopeId: node.config.id,
169
+ limit: "duration",
170
+ limitValue,
171
+ observedValue: Math.max(limitValue + 1, now - node.startedAt)
172
+ });
173
+ };
174
+ /** Reclaim one released leaf and any newly unowned ancestors on its fixed hierarchy path. */
175
+ const pruneRetiredHierarchy = (nodes, hierarchy) => {
176
+ for (let index = hierarchy.length - 1; index >= 0; index -= 1) {
177
+ const candidateKey = hierarchy[index];
178
+ if (candidateKey === void 0) continue;
179
+ const candidate = nodes.get(candidateKey);
180
+ if (candidate === void 0) continue;
181
+ if (candidate.handles.size > 0) break;
182
+ const childPrefix = `${candidateKey}/`;
183
+ if ([...nodes.keys()].some((otherKey) => otherKey.startsWith(childPrefix))) break;
184
+ nodes.delete(candidateKey);
185
+ }
186
+ return nodes;
187
+ };
188
+ const makeNode = (ledger, key, ancestors, config, handleId) => {
189
+ const hierarchy = [...ancestors, key];
190
+ const retiredDefect = () => Effect.die(/* @__PURE__ */ new Error(`Usage budget handle ${config.level}:${config.id} was used after retirement`));
191
+ const liveHierarchy = (state) => {
192
+ const current = state.nodes.get(key);
193
+ if (current === void 0 || !current.handles.has(handleId)) return void 0;
194
+ const nodes = [];
195
+ for (const ancestorKey of hierarchy) {
196
+ const node = state.nodes.get(ancestorKey);
197
+ if (node === void 0) return void 0;
198
+ nodes.push(node);
199
+ }
200
+ return nodes;
201
+ };
202
+ const readLiveHierarchy = Ref.modify(ledger, (state) => [liveHierarchy(state), state]);
203
+ const snapshot = Effect.gen(function* () {
204
+ const now = yield* Clock.currentTimeMillis;
205
+ const nodes = yield* readLiveHierarchy;
206
+ if (nodes === void 0) return yield* retiredDefect();
207
+ const node = nodes[nodes.length - 1];
208
+ if (node === void 0) return yield* retiredDefect();
209
+ return withElapsed(node, now);
210
+ });
211
+ const guard = (effect) => Effect.gen(function* () {
212
+ const now = yield* Clock.currentTimeMillis;
213
+ const nodes = yield* readLiveHierarchy;
214
+ if (nodes === void 0) return yield* retiredDefect();
215
+ let deadline;
216
+ for (const node of nodes) {
217
+ const current = withElapsed(node, now);
218
+ const alreadyExceeded = exceeded(node, current);
219
+ if (alreadyExceeded !== void 0) return yield* alreadyExceeded;
220
+ const maxDuration = node.config.limits.maxDurationMillis;
221
+ if (maxDuration !== void 0) {
222
+ const remaining = maxDuration - current.elapsedMillis;
223
+ if (remaining <= 0) return yield* durationExceeded(node, now);
224
+ if (deadline === void 0 || remaining < deadline.remaining) deadline = {
225
+ remaining,
226
+ node
227
+ };
228
+ }
229
+ }
230
+ if (deadline === void 0) return yield* effect;
231
+ const selected = deadline;
232
+ return yield* effect.pipe(Effect.timeoutOrElse({
233
+ duration: Duration.millis(selected.remaining),
234
+ orElse: () => Clock.currentTimeMillis.pipe(Effect.flatMap((timeoutAt) => Effect.fail(durationExceeded(selected.node, timeoutAt))))
235
+ }));
236
+ });
237
+ const child = Effect.fn("UsageBudgetNode.child")(function* (childConfig) {
238
+ const childKey = `${key}/${nodeKeyComponent(childConfig)}`;
239
+ const childHandleId = Symbol(`usage-budget:${childConfig.level}:${childConfig.id}`);
240
+ const now = yield* Clock.currentTimeMillis;
241
+ const registration = yield* Ref.modify(ledger, (state) => {
242
+ if (liveHierarchy(state) === void 0) return [{ _tag: "retired" }, state];
243
+ if (levelOrder[childConfig.level] <= levelOrder[config.level]) return [{
244
+ _tag: "invalid",
245
+ error: InvalidBudgetHierarchy.make({
246
+ parentLevel: config.level,
247
+ childLevel: childConfig.level
248
+ })
249
+ }, state];
250
+ const existing = state.nodes.get(childKey);
251
+ if (existing !== void 0) return sameLimits(existing.config.limits, childConfig.limits) ? [{ _tag: "success" }, { nodes: new Map(state.nodes).set(childKey, {
252
+ ...existing,
253
+ handles: new Set(existing.handles).add(childHandleId)
254
+ }) }] : [{
255
+ _tag: "conflict",
256
+ error: BudgetNodeConflict.make({
257
+ scopeLevel: childConfig.level,
258
+ scopeId: childConfig.id
259
+ })
260
+ }, state];
261
+ return [{ _tag: "success" }, { nodes: new Map(state.nodes).set(childKey, {
262
+ config: childConfig,
263
+ startedAt: now,
264
+ totals: emptyTotals(),
265
+ handles: /* @__PURE__ */ new Set([childHandleId])
266
+ }) }];
267
+ });
268
+ if (registration._tag === "retired") return yield* retiredDefect();
269
+ if (registration._tag === "conflict" || registration._tag === "invalid") return yield* registration.error;
270
+ return makeNode(ledger, childKey, hierarchy, childConfig, childHandleId);
271
+ });
272
+ const retire = Effect.uninterruptible(Ref.update(ledger, (state) => {
273
+ const existing = state.nodes.get(key);
274
+ if (existing === void 0 || !existing.handles.has(handleId)) return state;
275
+ const handles = new Set(existing.handles);
276
+ handles.delete(handleId);
277
+ const nodes = new Map(state.nodes).set(key, {
278
+ ...existing,
279
+ handles
280
+ });
281
+ return { nodes: pruneRetiredHierarchy(nodes, hierarchy) };
282
+ }));
283
+ return {
284
+ level: config.level,
285
+ id: config.id,
286
+ child,
287
+ childScoped: (childConfig) => Effect.acquireRelease(child(childConfig), (node) => node.retire),
288
+ retire,
289
+ consume: (delta) => Clock.currentTimeMillis.pipe(Effect.flatMap((now) => Ref.modify(ledger, (state) => {
290
+ if (liveHierarchy(state) === void 0) return [{ _tag: "retired" }, state];
291
+ const updates = /* @__PURE__ */ new Map();
292
+ for (const ancestorKey of hierarchy) {
293
+ const node = state.nodes.get(ancestorKey);
294
+ if (node === void 0) return [{ _tag: "retired" }, state];
295
+ const totals = addUsage(node, delta, now);
296
+ const error = exceeded(node, totals);
297
+ if (error !== void 0) return [{
298
+ _tag: "failure",
299
+ error
300
+ }, state];
301
+ updates.set(ancestorKey, {
302
+ ...node,
303
+ totals
304
+ });
305
+ }
306
+ const nextNodes = new Map(state.nodes);
307
+ for (const [updatedKey, updatedNode] of updates) nextNodes.set(updatedKey, updatedNode);
308
+ const value = updates.get(key)?.totals;
309
+ return value === void 0 ? [{ _tag: "retired" }, state] : [{
310
+ _tag: "success",
311
+ value
312
+ }, { nodes: nextNodes }];
313
+ }).pipe(Effect.flatMap((result) => {
314
+ switch (result._tag) {
315
+ case "success": return Effect.succeed(result.value);
316
+ case "failure": return Effect.fail(result.error);
317
+ case "retired": return retiredDefect();
318
+ }
319
+ })))),
320
+ snapshot,
321
+ guard
322
+ };
323
+ };
324
+ /** Create the outermost node of a hierarchy. Child nodes share its atomic ledger. */
325
+ const makeUsageBudgetRoot = Effect.fn("makeUsageBudgetRoot")(function* (config) {
326
+ const startedAt = yield* Clock.currentTimeMillis;
327
+ const key = nodeKeyComponent(config);
328
+ const handleId = Symbol(`usage-budget:${config.level}:${config.id}`);
329
+ const ledger = yield* Ref.make({ nodes: /* @__PURE__ */ new Map([[key, {
330
+ config,
331
+ startedAt,
332
+ totals: emptyTotals(),
333
+ handles: /* @__PURE__ */ new Set([handleId])
334
+ }]]) });
335
+ return makeNode(ledger, key, [], config, handleId);
336
+ });
337
+ /** Compatibility constructor for a standalone Run budget. */
338
+ const makeUsageBudget = (limits) => makeUsageBudgetRoot(UsageBudgetNodeConfig.make({
339
+ level: "run",
340
+ id: "standalone-run",
341
+ limits
342
+ }));
343
+ //#endregion
344
+ export { BudgetExceeded, BudgetNodeConflict, InvalidBudgetHierarchy, UsageBudgetLimits, UsageBudgetNodeConfig, UsageDelta, UsageTotals, makeUsageBudget, makeUsageBudgetRoot, Budget_exports as t };
345
+
346
+ //# sourceMappingURL=Budget.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Budget.mjs","names":[],"sources":["../../src/capabilities/Budget.ts"],"sourcesContent":["import { Clock, Duration, Effect, Ref, Schema, type Scope } from \"effect\";\n\nconst Natural = Schema.Natural;\nconst BudgetLevel = Schema.Literals([\"global\", \"tenant\", \"agent\", \"thread\", \"run\"]);\n\nexport type BudgetLevel = typeof BudgetLevel.Type;\n\n/** Fixed units avoid floating-point currency accounting: costs are micro-USD. */\nexport class UsageTotals extends Schema.Class<UsageTotals>(\n \"@effect-agent/capabilities/UsageTotals\",\n)({\n /** Total input tokens across every model call, INCLUDING cache reads and writes at par. */\n inputTokens: Natural,\n outputTokens: Natural,\n /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */\n cacheReadInputTokens: Natural,\n /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */\n cacheWriteInputTokens: Natural,\n /** The most recent model call's input tokens — the live model-context estimate (CAP-017). */\n lastInputTokens: Natural,\n /** The most recent model call's output tokens. */\n lastOutputTokens: Natural,\n toolCalls: Natural,\n costMicrousd: Natural,\n elapsedMillis: Natural,\n}) {}\n\n/** Increment recorded at one model/tool accounting boundary. */\nexport class UsageDelta extends Schema.Class<UsageDelta>(\"@effect-agent/capabilities/UsageDelta\")({\n /** `1` for a model-response boundary, `0` for a mid-pass tool charge; gates last-call tracking. */\n modelCalls: Natural,\n /** Total input tokens of this boundary, INCLUDING cache reads and writes at par. */\n inputTokens: Natural,\n outputTokens: Natural,\n /** Informational split of `inputTokens` served from the provider prompt cache; never separately limited. */\n cacheReadInputTokens: Natural,\n /** Informational split of `inputTokens` written to the provider prompt cache; never separately limited. */\n cacheWriteInputTokens: Natural,\n toolCalls: Natural,\n costMicrousd: Natural,\n}) {}\n\n/** All optional limits are finite when present; absent means not configured. */\nexport class UsageBudgetLimits extends Schema.Class<UsageBudgetLimits>(\n \"@effect-agent/capabilities/UsageBudgetLimits\",\n)({\n maxInputTokens: Schema.optionalKey(Natural),\n maxOutputTokens: Schema.optionalKey(Natural),\n maxToolCalls: Schema.optionalKey(Natural),\n maxCostMicrousd: Schema.optionalKey(Natural),\n maxDurationMillis: Schema.optionalKey(Natural),\n}) {}\n\n/** Identity and local limits for one node in a global-to-Run budget hierarchy. */\nexport class UsageBudgetNodeConfig extends Schema.Class<UsageBudgetNodeConfig>(\n \"@effect-agent/capabilities/UsageBudgetNodeConfig\",\n)({\n level: BudgetLevel,\n id: Schema.NonEmptyString,\n limits: UsageBudgetLimits,\n}) {}\n\n/** Typed finite-budget rejection. A rejected increment is not committed at any hierarchy level. */\nexport class BudgetExceeded extends Schema.TaggedError<BudgetExceeded>()(\"BudgetExceeded\", {\n scopeLevel: BudgetLevel,\n scopeId: Schema.NonEmptyString,\n limit: Schema.Literals([\"input-tokens\", \"output-tokens\", \"tool-calls\", \"cost\", \"duration\"]),\n limitValue: Natural,\n observedValue: Natural,\n}) {}\n\n/** Hierarchical accounting authority. All ancestors share one atomic Ref-backed transaction. */\nexport interface UsageBudgetNode {\n readonly level: BudgetLevel;\n readonly id: string;\n /**\n * Register or re-attach one child node. Re-attaching an already-registered\n * `level:id` with identical limits returns a handle to the shared\n * registration; different limits fail with BudgetNodeConflict rather than\n * being silently ignored. Every returned handle owns one registration and\n * must be retired when its lifetime ends; prefer `childScoped` when the\n * lifetime already belongs to an Effect Scope.\n */\n readonly child: (\n config: UsageBudgetNodeConfig,\n ) => Effect.Effect<UsageBudgetNode, InvalidBudgetHierarchy | BudgetNodeConflict>;\n /** Register a child whose registration is retired when the current Scope closes. */\n readonly childScoped: (\n config: UsageBudgetNodeConfig,\n ) => Effect.Effect<UsageBudgetNode, InvalidBudgetHierarchy | BudgetNodeConflict, Scope.Scope>;\n /**\n * Release this handle's registration exactly once. Accumulated usage stays\n * charged to every live ancestor; a node is reclaimed only after its last\n * handle and every descendant have retired.\n */\n readonly retire: Effect.Effect<void>;\n readonly consume: (delta: UsageDelta) => Effect.Effect<UsageTotals, BudgetExceeded>;\n readonly snapshot: Effect.Effect<UsageTotals>;\n /**\n * Guard stalled model/tool work with the earliest configured ancestor deadline.\n * The timeout is driven by Effect Clock and interrupts the guarded child effect.\n */\n readonly guard: <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | BudgetExceeded, R>;\n}\n\n/** A child budget must move strictly inward through the declared hierarchy. */\nexport class InvalidBudgetHierarchy extends Schema.TaggedError<InvalidBudgetHierarchy>()(\n \"InvalidBudgetHierarchy\",\n {\n parentLevel: BudgetLevel,\n childLevel: BudgetLevel,\n },\n) {}\n\n/** A child `level:id` is already registered with different limits; neither set may win silently. */\nexport class BudgetNodeConflict extends Schema.TaggedError<BudgetNodeConflict>()(\n \"BudgetNodeConflict\",\n {\n scopeLevel: BudgetLevel,\n scopeId: Schema.NonEmptyString,\n },\n) {}\n\ninterface LedgerNode {\n readonly config: UsageBudgetNodeConfig;\n readonly startedAt: number;\n readonly totals: UsageTotals;\n /** Ledger-owned identities of the live handles for this exact registration. */\n readonly handles: ReadonlySet<symbol>;\n}\n\ninterface BudgetLedger {\n readonly nodes: ReadonlyMap<string, LedgerNode>;\n}\n\ntype ConsumptionResult =\n | { readonly _tag: \"success\"; readonly value: UsageTotals }\n | { readonly _tag: \"failure\"; readonly error: BudgetExceeded }\n | { readonly _tag: \"retired\" };\n\ntype ChildRegistrationResult =\n | { readonly _tag: \"success\" }\n | { readonly _tag: \"conflict\"; readonly error: BudgetNodeConflict }\n | { readonly _tag: \"invalid\"; readonly error: InvalidBudgetHierarchy }\n | { readonly _tag: \"retired\" };\n\nconst levelOrder: Readonly<Record<BudgetLevel, number>> = {\n global: 0,\n tenant: 1,\n agent: 2,\n thread: 3,\n run: 4,\n};\n\nconst emptyTotals = (elapsedMillis = 0): UsageTotals =>\n UsageTotals.make({\n inputTokens: 0,\n outputTokens: 0,\n cacheReadInputTokens: 0,\n cacheWriteInputTokens: 0,\n lastInputTokens: 0,\n lastOutputTokens: 0,\n toolCalls: 0,\n costMicrousd: 0,\n elapsedMillis,\n });\n\n// Spread-preserve every accumulated field so future additions cannot be\n// silently dropped by an elapsed-only snapshot.\nconst withElapsed = (node: LedgerNode, now: number): UsageTotals =>\n UsageTotals.make({\n ...node.totals,\n elapsedMillis: Math.max(0, now - node.startedAt),\n });\n\nconst addUsage = (node: LedgerNode, delta: UsageDelta, now: number): UsageTotals =>\n UsageTotals.make({\n inputTokens: node.totals.inputTokens + delta.inputTokens,\n outputTokens: node.totals.outputTokens + delta.outputTokens,\n cacheReadInputTokens: node.totals.cacheReadInputTokens + delta.cacheReadInputTokens,\n cacheWriteInputTokens: node.totals.cacheWriteInputTokens + delta.cacheWriteInputTokens,\n lastInputTokens: delta.modelCalls > 0 ? delta.inputTokens : node.totals.lastInputTokens,\n lastOutputTokens: delta.modelCalls > 0 ? delta.outputTokens : node.totals.lastOutputTokens,\n toolCalls: node.totals.toolCalls + delta.toolCalls,\n costMicrousd: node.totals.costMicrousd + delta.costMicrousd,\n elapsedMillis: Math.max(0, now - node.startedAt),\n });\n\nconst exceeded = (node: LedgerNode, totals: UsageTotals): BudgetExceeded | undefined => {\n const limits = node.config.limits;\n\n const checks: ReadonlyArray<readonly [BudgetExceeded[\"limit\"], number | undefined, number]> = [\n [\"input-tokens\", limits.maxInputTokens, totals.inputTokens],\n [\"output-tokens\", limits.maxOutputTokens, totals.outputTokens],\n [\"tool-calls\", limits.maxToolCalls, totals.toolCalls],\n [\"cost\", limits.maxCostMicrousd, totals.costMicrousd],\n [\"duration\", limits.maxDurationMillis, totals.elapsedMillis],\n ];\n\n for (const [limit, limitValue, observedValue] of checks) {\n if (limitValue !== undefined && observedValue > limitValue) {\n return BudgetExceeded.make({\n scopeLevel: node.config.level,\n scopeId: node.config.id,\n limit,\n limitValue,\n observedValue,\n });\n }\n }\n\n return undefined;\n};\n\nconst sameLimits = (a: UsageBudgetLimits, b: UsageBudgetLimits): boolean =>\n a.maxInputTokens === b.maxInputTokens &&\n a.maxOutputTokens === b.maxOutputTokens &&\n a.maxToolCalls === b.maxToolCalls &&\n a.maxCostMicrousd === b.maxCostMicrousd &&\n a.maxDurationMillis === b.maxDurationMillis;\n\n// JSON escapes lone surrogates before URI encoding; every valid string stays distinct,\n// and an ID can never introduce the path separator used by retirement.\nconst nodeKeyComponent = (config: UsageBudgetNodeConfig): string =>\n `${config.level}:${encodeURIComponent(JSON.stringify(config.id))}`;\n\nconst durationExceeded = (node: LedgerNode, now: number): BudgetExceeded => {\n const limitValue = node.config.limits.maxDurationMillis ?? 0;\n\n return BudgetExceeded.make({\n scopeLevel: node.config.level,\n scopeId: node.config.id,\n limit: \"duration\",\n limitValue,\n observedValue: Math.max(limitValue + 1, now - node.startedAt),\n });\n};\n\n/** Reclaim one released leaf and any newly unowned ancestors on its fixed hierarchy path. */\nconst pruneRetiredHierarchy = (\n nodes: Map<string, LedgerNode>,\n hierarchy: ReadonlyArray<string>,\n): Map<string, LedgerNode> => {\n for (let index = hierarchy.length - 1; index >= 0; index -= 1) {\n const candidateKey = hierarchy[index];\n\n if (candidateKey === undefined) continue;\n const candidate = nodes.get(candidateKey);\n\n if (candidate === undefined) continue;\n if (candidate.handles.size > 0) break;\n const childPrefix = `${candidateKey}/`;\n\n if ([...nodes.keys()].some((otherKey) => otherKey.startsWith(childPrefix))) {\n break;\n }\n nodes.delete(candidateKey);\n }\n\n return nodes;\n};\n\nconst makeNode = (\n ledger: Ref.Ref<BudgetLedger>,\n key: string,\n ancestors: ReadonlyArray<string>,\n config: UsageBudgetNodeConfig,\n handleId: symbol,\n): UsageBudgetNode => {\n const hierarchy = [...ancestors, key];\n\n const retiredDefect = () =>\n Effect.die(\n new Error(`Usage budget handle ${config.level}:${config.id} was used after retirement`),\n );\n\n const liveHierarchy = (state: BudgetLedger): ReadonlyArray<LedgerNode> | undefined => {\n const current = state.nodes.get(key);\n\n if (current === undefined || !current.handles.has(handleId)) return undefined;\n const nodes: Array<LedgerNode> = [];\n\n for (const ancestorKey of hierarchy) {\n const node = state.nodes.get(ancestorKey);\n\n if (node === undefined) return undefined;\n nodes.push(node);\n }\n\n return nodes;\n };\n\n const readLiveHierarchy = Ref.modify(\n ledger,\n (state): readonly [ReadonlyArray<LedgerNode> | undefined, BudgetLedger] => [\n liveHierarchy(state),\n state,\n ],\n );\n\n const snapshot = Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis;\n const nodes = yield* readLiveHierarchy;\n\n if (nodes === undefined) return yield* retiredDefect();\n const node = nodes[nodes.length - 1];\n\n if (node === undefined) return yield* retiredDefect();\n\n return withElapsed(node, now);\n });\n\n const guard = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<A, E | BudgetExceeded, R> =>\n Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis;\n const nodes = yield* readLiveHierarchy;\n\n if (nodes === undefined) return yield* retiredDefect();\n let deadline: { readonly remaining: number; readonly node: LedgerNode } | undefined;\n\n for (const node of nodes) {\n const current = withElapsed(node, now);\n const alreadyExceeded = exceeded(node, current);\n\n if (alreadyExceeded !== undefined) {\n return yield* alreadyExceeded;\n }\n const maxDuration = node.config.limits.maxDurationMillis;\n\n if (maxDuration !== undefined) {\n const remaining = maxDuration - current.elapsedMillis;\n\n if (remaining <= 0) {\n return yield* durationExceeded(node, now);\n }\n if (deadline === undefined || remaining < deadline.remaining) {\n deadline = { remaining, node };\n }\n }\n }\n if (deadline === undefined) {\n return yield* effect;\n }\n const selected = deadline;\n\n return yield* effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(selected.remaining),\n orElse: () =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((timeoutAt) =>\n Effect.fail(durationExceeded(selected.node, timeoutAt)),\n ),\n ),\n }),\n );\n });\n\n const child = Effect.fn(\"UsageBudgetNode.child\")(function* (childConfig: UsageBudgetNodeConfig) {\n const childKey = `${key}/${nodeKeyComponent(childConfig)}`;\n const childHandleId = Symbol(`usage-budget:${childConfig.level}:${childConfig.id}`);\n const now = yield* Clock.currentTimeMillis;\n\n const registration = yield* Ref.modify(\n ledger,\n (state): readonly [ChildRegistrationResult, BudgetLedger] => {\n if (liveHierarchy(state) === undefined) {\n return [{ _tag: \"retired\" }, state];\n }\n if (levelOrder[childConfig.level] <= levelOrder[config.level]) {\n return [\n {\n _tag: \"invalid\",\n error: InvalidBudgetHierarchy.make({\n parentLevel: config.level,\n childLevel: childConfig.level,\n }),\n },\n state,\n ];\n }\n const existing = state.nodes.get(childKey);\n\n if (existing !== undefined) {\n return sameLimits(existing.config.limits, childConfig.limits)\n ? [\n { _tag: \"success\" },\n {\n nodes: new Map(state.nodes).set(childKey, {\n ...existing,\n handles: new Set(existing.handles).add(childHandleId),\n }),\n },\n ]\n : [\n {\n _tag: \"conflict\",\n error: BudgetNodeConflict.make({\n scopeLevel: childConfig.level,\n scopeId: childConfig.id,\n }),\n },\n state,\n ];\n }\n\n return [\n { _tag: \"success\" },\n {\n nodes: new Map(state.nodes).set(childKey, {\n config: childConfig,\n startedAt: now,\n totals: emptyTotals(),\n handles: new Set([childHandleId]),\n }),\n },\n ];\n },\n );\n\n if (registration._tag === \"retired\") return yield* retiredDefect();\n if (registration._tag === \"conflict\" || registration._tag === \"invalid\") {\n return yield* registration.error;\n }\n\n return makeNode(ledger, childKey, hierarchy, childConfig, childHandleId);\n });\n\n const retire = Effect.uninterruptible(\n Ref.update(ledger, (state) => {\n const existing = state.nodes.get(key);\n\n if (existing === undefined || !existing.handles.has(handleId)) return state;\n const handles = new Set(existing.handles);\n\n handles.delete(handleId);\n const nodes = new Map(state.nodes).set(key, { ...existing, handles });\n\n return { nodes: pruneRetiredHierarchy(nodes, hierarchy) };\n }),\n );\n\n return {\n level: config.level,\n id: config.id,\n child,\n childScoped: (childConfig) => Effect.acquireRelease(child(childConfig), (node) => node.retire),\n retire,\n consume: (delta) =>\n Clock.currentTimeMillis.pipe(\n Effect.flatMap((now) =>\n Ref.modify(ledger, (state): readonly [ConsumptionResult, BudgetLedger] => {\n if (liveHierarchy(state) === undefined) {\n return [{ _tag: \"retired\" }, state];\n }\n const updates = new Map<string, LedgerNode>();\n\n for (const ancestorKey of hierarchy) {\n const node = state.nodes.get(ancestorKey);\n\n if (node === undefined) return [{ _tag: \"retired\" }, state];\n const totals = addUsage(node, delta, now);\n const error = exceeded(node, totals);\n\n if (error !== undefined) {\n return [{ _tag: \"failure\", error }, state];\n }\n updates.set(ancestorKey, { ...node, totals });\n }\n const nextNodes = new Map(state.nodes);\n\n for (const [updatedKey, updatedNode] of updates) {\n nextNodes.set(updatedKey, updatedNode);\n }\n const value = updates.get(key)?.totals;\n\n return value === undefined\n ? [{ _tag: \"retired\" }, state]\n : [{ _tag: \"success\", value }, { nodes: nextNodes }];\n }).pipe(\n Effect.flatMap((result) => {\n switch (result._tag) {\n case \"success\":\n return Effect.succeed(result.value);\n case \"failure\":\n return Effect.fail(result.error);\n case \"retired\":\n return retiredDefect();\n }\n }),\n ),\n ),\n ),\n snapshot,\n guard,\n };\n};\n\n/** Create the outermost node of a hierarchy. Child nodes share its atomic ledger. */\nexport const makeUsageBudgetRoot = Effect.fn(\"makeUsageBudgetRoot\")(function* (\n config: UsageBudgetNodeConfig,\n) {\n const startedAt = yield* Clock.currentTimeMillis;\n const key = nodeKeyComponent(config);\n const handleId = Symbol(`usage-budget:${config.level}:${config.id}`);\n\n const ledger = yield* Ref.make<BudgetLedger>({\n nodes: new Map([\n [\n key,\n {\n config,\n startedAt,\n totals: emptyTotals(),\n handles: new Set([handleId]),\n },\n ],\n ]),\n });\n\n return makeNode(ledger, key, [], config, handleId);\n});\n\n/** Compatibility constructor for a standalone Run budget. */\nexport const makeUsageBudget = (limits: UsageBudgetLimits): Effect.Effect<UsageBudgetNode> =>\n makeUsageBudgetRoot(\n UsageBudgetNodeConfig.make({\n level: \"run\",\n id: \"standalone-run\",\n limits,\n }),\n );\n"],"mappings":"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"}