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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/dist/Agent-CN0EWRsR.d.mts +226 -0
  2. package/dist/Agent-RklVROrm.mjs +83 -0
  3. package/dist/Agent-RklVROrm.mjs.map +1 -0
  4. package/dist/AgentError-CggcAQ7V.d.mts +101 -0
  5. package/dist/AgentPolicy-CetmQrf3.d.mts +96 -0
  6. package/dist/AgentRuntime-CHipL2jG.mjs +4598 -0
  7. package/dist/AgentRuntime-CHipL2jG.mjs.map +1 -0
  8. package/dist/AgentRuntime-uxR_a4VM.d.mts +346 -0
  9. package/dist/AgentUpdates-DMJ-_xow.d.mts +53 -0
  10. package/dist/ContextCompactor-Dxu5zhOL.d.mts +161 -0
  11. package/dist/ContextWindow-DRQ5Mbm2.d.mts +58 -0
  12. package/dist/DurableAgentRuntime-D7gDKGjH.mjs +6368 -0
  13. package/dist/DurableAgentRuntime-D7gDKGjH.mjs.map +1 -0
  14. package/dist/DurableFailpoint-Oinuuedm.d.mts +41 -0
  15. package/dist/DurableStep-Cry_iol4.d.mts +103 -0
  16. package/dist/Ephemeral.d.mts +22 -0
  17. package/dist/Ephemeral.mjs +22 -0
  18. package/dist/Ephemeral.mjs.map +1 -0
  19. package/dist/EventSource-OqS_P9ug.d.mts +51 -0
  20. package/dist/Identifiers-CN2s30fF.d.mts +40 -0
  21. package/dist/MemoryNamespace-BbRW5p71.d.mts +36 -0
  22. package/dist/MemoryReference-B8Q3UJoJ.d.mts +79 -0
  23. package/dist/Messaging-CkcIdt4I.d.mts +490 -0
  24. package/dist/MessagingHost-CRk0kXzT.d.mts +246 -0
  25. package/dist/MessagingHost-CWi_PP3g.mjs +137 -0
  26. package/dist/MessagingHost-CWi_PP3g.mjs.map +1 -0
  27. package/dist/OperationAuthorizer-TzcQtpX5.d.mts +61 -0
  28. package/dist/Output-D6SkedVx.d.mts +25 -0
  29. package/dist/PageCapture-Df8Xwskw.d.mts +583 -0
  30. package/dist/PageScreenshot-BpgZKAxl.d.mts +48 -0
  31. package/dist/PreparedInputAdmission-C4HbjHgl.d.mts +38 -0
  32. package/dist/Receipt-BAHyigAF.d.mts +33 -0
  33. package/dist/Records-BAGkekt8.d.mts +3570 -0
  34. package/dist/RunEvent-DIrzkjLr.d.mts +460 -0
  35. package/dist/RunEventSink-D5aVhISG.d.mts +108 -0
  36. package/dist/RunJournal-Cgg1kNvc.mjs +825 -0
  37. package/dist/RunJournal-Cgg1kNvc.mjs.map +1 -0
  38. package/dist/RunOptions-g1aigcKI.d.mts +915 -0
  39. package/dist/RunPolicyUsage-ClZxyR46.d.mts +21 -0
  40. package/dist/Sandbox-CEsDWBLq.d.mts +173 -0
  41. package/dist/Schedule-H3SEYX9g.d.mts +842 -0
  42. package/dist/Scheduling-C9aIP8zT.mjs +691 -0
  43. package/dist/Scheduling-C9aIP8zT.mjs.map +1 -0
  44. package/dist/Subagent-DyfzHNdv.d.mts +826 -0
  45. package/dist/Subagent-U5qXOFE8.mjs +1469 -0
  46. package/dist/Subagent-U5qXOFE8.mjs.map +1 -0
  47. package/dist/SubagentContract-DdT7Cqe6.d.mts +116 -0
  48. package/dist/SubagentHost-CJUBQlcc.d.mts +140 -0
  49. package/dist/Subscription-BEP8oQO5.d.mts +921 -0
  50. package/dist/SubscriptionInput-vAAOBrK7.d.mts +41 -0
  51. package/dist/Thread-DOBQ0QUY.d.mts +96 -0
  52. package/dist/ThreadHistory-tS1KwxHR.d.mts +60 -0
  53. package/dist/ToolBroker-DWs4tZra.d.mts +133 -0
  54. package/dist/ToolExposure-9uF_Yo0T.mjs +10 -0
  55. package/dist/ToolExposure-9uF_Yo0T.mjs.map +1 -0
  56. package/dist/ToolExposure-C93U1sPu.mjs +30 -0
  57. package/dist/ToolExposure-C93U1sPu.mjs.map +1 -0
  58. package/dist/ToolExposure-UCN12eCd.d.mts +39 -0
  59. package/dist/ToolExposure-r2eOWk4F.d.mts +46 -0
  60. package/dist/ToolExposure.d.mts +8 -0
  61. package/dist/ToolExposure.mjs +21 -0
  62. package/dist/ToolExposure.mjs.map +1 -0
  63. package/dist/ToolReconciler-DQVaJfpE.d.mts +76 -0
  64. package/dist/ToolResult-DmmgoChv.d.mts +61 -0
  65. package/dist/Usage-Dx0aknfk.d.mts +121 -0
  66. package/dist/WakeScheduler-EjUF-GhC.d.mts +56 -0
  67. package/dist/Worker-CaPYykpe.d.mts +228 -0
  68. package/dist/agent-registration-CWDMOAZA.mjs +172 -0
  69. package/dist/agent-registration-CWDMOAZA.mjs.map +1 -0
  70. package/dist/capabilities/Approval.d.mts +114 -0
  71. package/dist/capabilities/Approval.mjs +226 -0
  72. package/dist/capabilities/Approval.mjs.map +1 -0
  73. package/dist/capabilities/Budget.d.mts +112 -0
  74. package/dist/capabilities/Budget.mjs +346 -0
  75. package/dist/capabilities/Budget.mjs.map +1 -0
  76. package/dist/capabilities/CodeMode.d.mts +157 -0
  77. package/dist/capabilities/CodeMode.mjs +522 -0
  78. package/dist/capabilities/CodeMode.mjs.map +1 -0
  79. package/dist/capabilities/Commands.d.mts +55 -0
  80. package/dist/capabilities/Commands.mjs +57 -0
  81. package/dist/capabilities/Commands.mjs.map +1 -0
  82. package/dist/capabilities/ContextTools.d.mts +321 -0
  83. package/dist/capabilities/ContextTools.mjs +126 -0
  84. package/dist/capabilities/ContextTools.mjs.map +1 -0
  85. package/dist/capabilities/Mcp.d.mts +108 -0
  86. package/dist/capabilities/Mcp.mjs +260 -0
  87. package/dist/capabilities/Mcp.mjs.map +1 -0
  88. package/dist/capabilities/McpClient.d.mts +115 -0
  89. package/dist/capabilities/McpClient.mjs +506 -0
  90. package/dist/capabilities/McpClient.mjs.map +1 -0
  91. package/dist/capabilities/MemoryNotes.d.mts +424 -0
  92. package/dist/capabilities/MemoryNotes.mjs +128 -0
  93. package/dist/capabilities/MemoryNotes.mjs.map +1 -0
  94. package/dist/capabilities/Messaging.d.mts +3 -0
  95. package/dist/capabilities/Messaging.mjs +151 -0
  96. package/dist/capabilities/Messaging.mjs.map +1 -0
  97. package/dist/capabilities/ModelContext.d.mts +89 -0
  98. package/dist/capabilities/ModelContext.mjs +168 -0
  99. package/dist/capabilities/ModelContext.mjs.map +1 -0
  100. package/dist/capabilities/Redaction.d.mts +37 -0
  101. package/dist/capabilities/Redaction.mjs +104 -0
  102. package/dist/capabilities/Redaction.mjs.map +1 -0
  103. package/dist/capabilities/Remembering.d.mts +434 -0
  104. package/dist/capabilities/Remembering.mjs +290 -0
  105. package/dist/capabilities/Remembering.mjs.map +1 -0
  106. package/dist/capabilities/RunHooks.d.mts +82 -0
  107. package/dist/capabilities/RunHooks.mjs +144 -0
  108. package/dist/capabilities/RunHooks.mjs.map +1 -0
  109. package/dist/capabilities/SemanticMemory.d.mts +431 -0
  110. package/dist/capabilities/SemanticMemory.mjs +315 -0
  111. package/dist/capabilities/SemanticMemory.mjs.map +1 -0
  112. package/dist/capabilities/Subagent.d.mts +4 -0
  113. package/dist/capabilities/Subagent.mjs +5 -0
  114. package/dist/capabilities/SubagentReservations.d.mts +186 -0
  115. package/dist/capabilities/SubagentReservations.mjs +479 -0
  116. package/dist/capabilities/SubagentReservations.mjs.map +1 -0
  117. package/dist/capabilities/ToolDiscovery.d.mts +109 -0
  118. package/dist/capabilities/ToolDiscovery.mjs +211 -0
  119. package/dist/capabilities/ToolDiscovery.mjs.map +1 -0
  120. package/dist/capabilities/WebCapture.d.mts +163 -0
  121. package/dist/capabilities/WebCapture.mjs +335 -0
  122. package/dist/capabilities/WebCapture.mjs.map +1 -0
  123. package/dist/capabilities/WebSearch.d.mts +71 -0
  124. package/dist/capabilities/WebSearch.mjs +112 -0
  125. package/dist/capabilities/WebSearch.mjs.map +1 -0
  126. package/dist/compaction-C2OTceKw.mjs +505 -0
  127. package/dist/compaction-C2OTceKw.mjs.map +1 -0
  128. package/dist/core/Agent.d.mts +2 -0
  129. package/dist/core/Agent.mjs +2 -0
  130. package/dist/core/AgentError.d.mts +2 -0
  131. package/dist/core/AgentError.mjs +117 -0
  132. package/dist/core/AgentError.mjs.map +1 -0
  133. package/dist/core/AgentPolicy.d.mts +2 -0
  134. package/dist/core/AgentPolicy.mjs +94 -0
  135. package/dist/core/AgentPolicy.mjs.map +1 -0
  136. package/dist/core/AgentUpdates.d.mts +2 -0
  137. package/dist/core/AgentUpdates.mjs +63 -0
  138. package/dist/core/AgentUpdates.mjs.map +1 -0
  139. package/dist/core/IdGenerator.d.mts +26 -0
  140. package/dist/core/IdGenerator.mjs +27 -0
  141. package/dist/core/IdGenerator.mjs.map +1 -0
  142. package/dist/core/Identifiers.d.mts +2 -0
  143. package/dist/core/Identifiers.mjs +43 -0
  144. package/dist/core/Identifiers.mjs.map +1 -0
  145. package/dist/core/Memory.d.mts +57 -0
  146. package/dist/core/Memory.mjs +203 -0
  147. package/dist/core/Memory.mjs.map +1 -0
  148. package/dist/core/MemoryNamespace.d.mts +2 -0
  149. package/dist/core/MemoryNamespace.mjs +116 -0
  150. package/dist/core/MemoryNamespace.mjs.map +1 -0
  151. package/dist/core/MemoryReference.d.mts +2 -0
  152. package/dist/core/MemoryReference.mjs +109 -0
  153. package/dist/core/MemoryReference.mjs.map +1 -0
  154. package/dist/core/MemoryRevalidation.d.mts +65 -0
  155. package/dist/core/MemoryRevalidation.mjs +126 -0
  156. package/dist/core/MemoryRevalidation.mjs.map +1 -0
  157. package/dist/core/MemoryStore.d.mts +186 -0
  158. package/dist/core/MemoryStore.mjs +243 -0
  159. package/dist/core/MemoryStore.mjs.map +1 -0
  160. package/dist/core/Receipt.d.mts +2 -0
  161. package/dist/core/Receipt.mjs +36 -0
  162. package/dist/core/Receipt.mjs.map +1 -0
  163. package/dist/core/RememberingStore.d.mts +1562 -0
  164. package/dist/core/RememberingStore.mjs +190 -0
  165. package/dist/core/RememberingStore.mjs.map +1 -0
  166. package/dist/core/RunEvent.d.mts +2 -0
  167. package/dist/core/RunEvent.mjs +337 -0
  168. package/dist/core/RunEvent.mjs.map +1 -0
  169. package/dist/core/RunPolicyUsage.d.mts +2 -0
  170. package/dist/core/RunPolicyUsage.mjs +21 -0
  171. package/dist/core/RunPolicyUsage.mjs.map +1 -0
  172. package/dist/core/SemanticMemoryIndex.d.mts +826 -0
  173. package/dist/core/SemanticMemoryIndex.mjs +185 -0
  174. package/dist/core/SemanticMemoryIndex.mjs.map +1 -0
  175. package/dist/core/SemanticMemoryRevalidation.d.mts +45 -0
  176. package/dist/core/SemanticMemoryRevalidation.mjs +191 -0
  177. package/dist/core/SemanticMemoryRevalidation.mjs.map +1 -0
  178. package/dist/core/SubagentContract.d.mts +2 -0
  179. package/dist/core/SubagentContract.mjs +148 -0
  180. package/dist/core/SubagentContract.mjs.map +1 -0
  181. package/dist/core/Thread.d.mts +2 -0
  182. package/dist/core/Thread.mjs +250 -0
  183. package/dist/core/Thread.mjs.map +1 -0
  184. package/dist/core/ToolResult.d.mts +2 -0
  185. package/dist/core/ToolResult.mjs +140 -0
  186. package/dist/core/ToolResult.mjs.map +1 -0
  187. package/dist/core/Usage.d.mts +2 -0
  188. package/dist/core/Usage.mjs +319 -0
  189. package/dist/core/Usage.mjs.map +1 -0
  190. package/dist/core/Worker.d.mts +3 -0
  191. package/dist/core/Worker.mjs +147 -0
  192. package/dist/core/Worker.mjs.map +1 -0
  193. package/dist/durable/ActivityStore.d.mts +116 -0
  194. package/dist/durable/ActivityStore.mjs +131 -0
  195. package/dist/durable/ActivityStore.mjs.map +1 -0
  196. package/dist/durable/Admin.d.mts +2 -0
  197. package/dist/durable/Admin.mjs +328 -0
  198. package/dist/durable/Admin.mjs.map +1 -0
  199. package/dist/durable/AgentRegistration.d.mts +2 -0
  200. package/dist/durable/AgentRegistration.mjs +14 -0
  201. package/dist/durable/AgentRegistration.mjs.map +1 -0
  202. package/dist/durable/Certification.d.mts +111 -0
  203. package/dist/durable/Certification.mjs +159 -0
  204. package/dist/durable/Certification.mjs.map +1 -0
  205. package/dist/durable/CommittedActivity.d.mts +62 -0
  206. package/dist/durable/CommittedActivity.mjs +159 -0
  207. package/dist/durable/CommittedActivity.mjs.map +1 -0
  208. package/dist/durable/Digest.d.mts +2 -0
  209. package/dist/durable/Digest.mjs +50 -0
  210. package/dist/durable/Digest.mjs.map +1 -0
  211. package/dist/durable/DurableAgentRuntime.d.mts +3 -0
  212. package/dist/durable/DurableAgentRuntime.mjs +3 -0
  213. package/dist/durable/DurableFailpoint.d.mts +2 -0
  214. package/dist/durable/DurableFailpoint.mjs +94 -0
  215. package/dist/durable/DurableFailpoint.mjs.map +1 -0
  216. package/dist/durable/DurableFailpointTestControl.d.mts +15 -0
  217. package/dist/durable/DurableFailpointTestControl.mjs +19 -0
  218. package/dist/durable/DurableFailpointTestControl.mjs.map +1 -0
  219. package/dist/durable/EventSource.d.mts +2 -0
  220. package/dist/durable/EventSource.mjs +65 -0
  221. package/dist/durable/EventSource.mjs.map +1 -0
  222. package/dist/durable/GitHubWorkflowSource.d.mts +144 -0
  223. package/dist/durable/GitHubWorkflowSource.mjs +209 -0
  224. package/dist/durable/GitHubWorkflowSource.mjs.map +1 -0
  225. package/dist/durable/MessageDelivery.d.mts +492 -0
  226. package/dist/durable/MessageDelivery.mjs +495 -0
  227. package/dist/durable/MessageDelivery.mjs.map +1 -0
  228. package/dist/durable/MessageDeliveryStoreConformance.d.mts +358 -0
  229. package/dist/durable/MessageDeliveryStoreConformance.mjs +243 -0
  230. package/dist/durable/MessageDeliveryStoreConformance.mjs.map +1 -0
  231. package/dist/durable/OperationAuthorizer.d.mts +2 -0
  232. package/dist/durable/OperationAuthorizer.mjs +70 -0
  233. package/dist/durable/OperationAuthorizer.mjs.map +1 -0
  234. package/dist/durable/PersistentHistory.d.mts +16 -0
  235. package/dist/durable/PersistentHistory.mjs +125 -0
  236. package/dist/durable/PersistentHistory.mjs.map +1 -0
  237. package/dist/durable/PreparedInputAdmission.d.mts +2 -0
  238. package/dist/durable/PreparedInputAdmission.mjs +34 -0
  239. package/dist/durable/PreparedInputAdmission.mjs.map +1 -0
  240. package/dist/durable/Records.d.mts +2 -0
  241. package/dist/durable/Records.mjs +795 -0
  242. package/dist/durable/Records.mjs.map +1 -0
  243. package/dist/durable/Recovery.d.mts +2 -0
  244. package/dist/durable/Recovery.mjs +739 -0
  245. package/dist/durable/Recovery.mjs.map +1 -0
  246. package/dist/durable/RunJournal.d.mts +2 -0
  247. package/dist/durable/RunJournal.mjs +2 -0
  248. package/dist/durable/Schedule.d.mts +2 -0
  249. package/dist/durable/Schedule.mjs +382 -0
  250. package/dist/durable/Schedule.mjs.map +1 -0
  251. package/dist/durable/ScheduleStoreConformance.d.mts +18 -0
  252. package/dist/durable/ScheduleStoreConformance.mjs +420 -0
  253. package/dist/durable/ScheduleStoreConformance.mjs.map +1 -0
  254. package/dist/durable/ScheduleTransition.d.mts +24 -0
  255. package/dist/durable/ScheduleTransition.mjs +180 -0
  256. package/dist/durable/ScheduleTransition.mjs.map +1 -0
  257. package/dist/durable/Scheduling.d.mts +54 -0
  258. package/dist/durable/Scheduling.mjs +2 -0
  259. package/dist/durable/SqlMemoryStore.d.mts +30 -0
  260. package/dist/durable/SqlMemoryStore.mjs +436 -0
  261. package/dist/durable/SqlMemoryStore.mjs.map +1 -0
  262. package/dist/durable/SqlMessageDeliveryStore.d.mts +40 -0
  263. package/dist/durable/SqlMessageDeliveryStore.mjs +167 -0
  264. package/dist/durable/SqlMessageDeliveryStore.mjs.map +1 -0
  265. package/dist/durable/SqlStorageV2Upgrade.d.mts +22 -0
  266. package/dist/durable/SqlStorageV2Upgrade.mjs +459 -0
  267. package/dist/durable/SqlStorageV2Upgrade.mjs.map +1 -0
  268. package/dist/durable/SqlSubscriptionStore.d.mts +63 -0
  269. package/dist/durable/SqlSubscriptionStore.mjs +751 -0
  270. package/dist/durable/SqlSubscriptionStore.mjs.map +1 -0
  271. package/dist/durable/SubmissionLedger.d.mts +3 -0
  272. package/dist/durable/SubmissionLedger.mjs +914 -0
  273. package/dist/durable/SubmissionLedger.mjs.map +1 -0
  274. package/dist/durable/SubmissionLedgerConformance.d.mts +30 -0
  275. package/dist/durable/SubmissionLedgerConformance.mjs +1986 -0
  276. package/dist/durable/SubmissionLedgerConformance.mjs.map +1 -0
  277. package/dist/durable/SubmissionStatus.d.mts +2 -0
  278. package/dist/durable/SubmissionStatus.mjs +18 -0
  279. package/dist/durable/SubmissionStatus.mjs.map +1 -0
  280. package/dist/durable/Subscription.d.mts +2 -0
  281. package/dist/durable/Subscription.mjs +360 -0
  282. package/dist/durable/Subscription.mjs.map +1 -0
  283. package/dist/durable/SubscriptionInput.d.mts +2 -0
  284. package/dist/durable/SubscriptionInput.mjs +52 -0
  285. package/dist/durable/SubscriptionInput.mjs.map +1 -0
  286. package/dist/durable/SubscriptionStoreConformance.d.mts +17 -0
  287. package/dist/durable/SubscriptionStoreConformance.mjs +625 -0
  288. package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -0
  289. package/dist/durable/SubscriptionTools.d.mts +273 -0
  290. package/dist/durable/SubscriptionTools.mjs +190 -0
  291. package/dist/durable/SubscriptionTools.mjs.map +1 -0
  292. package/dist/durable/SubscriptionTransition.d.mts +21 -0
  293. package/dist/durable/SubscriptionTransition.mjs +148 -0
  294. package/dist/durable/SubscriptionTransition.mjs.map +1 -0
  295. package/dist/durable/Subscriptions.d.mts +73 -0
  296. package/dist/durable/Subscriptions.mjs +627 -0
  297. package/dist/durable/Subscriptions.mjs.map +1 -0
  298. package/dist/durable/ThreadContextHistory.d.mts +32 -0
  299. package/dist/durable/ThreadContextHistory.mjs +152 -0
  300. package/dist/durable/ThreadContextHistory.mjs.map +1 -0
  301. package/dist/durable/ThreadContextHistoryProjection.d.mts +60 -0
  302. package/dist/durable/ThreadContextHistoryProjection.mjs +149 -0
  303. package/dist/durable/ThreadContextHistoryProjection.mjs.map +1 -0
  304. package/dist/durable/ThreadInvariants.d.mts +74 -0
  305. package/dist/durable/ThreadInvariants.mjs +200 -0
  306. package/dist/durable/ThreadInvariants.mjs.map +1 -0
  307. package/dist/durable/ThreadProjection.d.mts +78 -0
  308. package/dist/durable/ThreadProjection.mjs +158 -0
  309. package/dist/durable/ThreadProjection.mjs.map +1 -0
  310. package/dist/durable/ThreadProjectionMaintenance.d.mts +49 -0
  311. package/dist/durable/ThreadProjectionMaintenance.mjs +33 -0
  312. package/dist/durable/ThreadProjectionMaintenance.mjs.map +1 -0
  313. package/dist/durable/ThreadStore.d.mts +2 -0
  314. package/dist/durable/ThreadStore.mjs +147 -0
  315. package/dist/durable/ThreadStore.mjs.map +1 -0
  316. package/dist/durable/ThreadStoreConformance.d.mts +29 -0
  317. package/dist/durable/ThreadStoreConformance.mjs +248 -0
  318. package/dist/durable/ThreadStoreConformance.mjs.map +1 -0
  319. package/dist/durable/ToolReconciler.d.mts +2 -0
  320. package/dist/durable/ToolReconciler.mjs +81 -0
  321. package/dist/durable/ToolReconciler.mjs.map +1 -0
  322. package/dist/durable/WakeScheduler.d.mts +2 -0
  323. package/dist/durable/WakeScheduler.mjs +85 -0
  324. package/dist/durable/WakeScheduler.mjs.map +1 -0
  325. package/dist/durable/WorkerHost.d.mts +129 -0
  326. package/dist/durable/WorkerHost.mjs +77 -0
  327. package/dist/durable/WorkerHost.mjs.map +1 -0
  328. package/dist/engine/AgentRuntime.d.mts +2 -0
  329. package/dist/engine/AgentRuntime.mjs +2 -0
  330. package/dist/engine/Compaction.d.mts +7 -0
  331. package/dist/engine/Compaction.mjs +16 -0
  332. package/dist/engine/Compaction.mjs.map +1 -0
  333. package/dist/engine/ContextCompactor.d.mts +2 -0
  334. package/dist/engine/ContextCompactor.mjs +119 -0
  335. package/dist/engine/ContextCompactor.mjs.map +1 -0
  336. package/dist/engine/ContextHistory.d.mts +65 -0
  337. package/dist/engine/ContextHistory.mjs +76 -0
  338. package/dist/engine/ContextHistory.mjs.map +1 -0
  339. package/dist/engine/ContextWindow.d.mts +2 -0
  340. package/dist/engine/ContextWindow.mjs +59 -0
  341. package/dist/engine/ContextWindow.mjs.map +1 -0
  342. package/dist/engine/DurableStep.d.mts +2 -0
  343. package/dist/engine/DurableStep.mjs +62 -0
  344. package/dist/engine/DurableStep.mjs.map +1 -0
  345. package/dist/engine/MessagingHost.d.mts +2 -0
  346. package/dist/engine/MessagingHost.mjs +2 -0
  347. package/dist/engine/Output.d.mts +2 -0
  348. package/dist/engine/Output.mjs +8 -0
  349. package/dist/engine/Output.mjs.map +1 -0
  350. package/dist/engine/RunEventSink.d.mts +2 -0
  351. package/dist/engine/RunEventSink.mjs +22 -0
  352. package/dist/engine/RunEventSink.mjs.map +1 -0
  353. package/dist/engine/RunOptions.d.mts +2 -0
  354. package/dist/engine/RunOptions.mjs +122 -0
  355. package/dist/engine/RunOptions.mjs.map +1 -0
  356. package/dist/engine/SubagentHost.d.mts +2 -0
  357. package/dist/engine/SubagentHost.mjs +72 -0
  358. package/dist/engine/SubagentHost.mjs.map +1 -0
  359. package/dist/engine/ThreadHistory.d.mts +2 -0
  360. package/dist/engine/ThreadHistory.mjs +67 -0
  361. package/dist/engine/ThreadHistory.mjs.map +1 -0
  362. package/dist/engine/ToolBroker.d.mts +2 -0
  363. package/dist/engine/ToolBroker.mjs +42 -0
  364. package/dist/engine/ToolBroker.mjs.map +1 -0
  365. package/dist/foreign-diagnostic-DBQ1XHKh.mjs +37 -0
  366. package/dist/foreign-diagnostic-DBQ1XHKh.mjs.map +1 -0
  367. package/dist/index.d.mts +89 -6
  368. package/dist/index.mjs +98 -6
  369. package/dist/output-contract-BC7tjlGw.mjs +84 -0
  370. package/dist/output-contract-BC7tjlGw.mjs.map +1 -0
  371. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  372. package/dist/sandbox/CodeExecutor.d.mts +194 -0
  373. package/dist/sandbox/CodeExecutor.mjs +278 -0
  374. package/dist/sandbox/CodeExecutor.mjs.map +1 -0
  375. package/dist/sandbox/InteractiveBrowser.d.mts +142 -0
  376. package/dist/sandbox/InteractiveBrowser.mjs +165 -0
  377. package/dist/sandbox/InteractiveBrowser.mjs.map +1 -0
  378. package/dist/sandbox/PageCapture.d.mts +2 -0
  379. package/dist/sandbox/PageCapture.mjs +450 -0
  380. package/dist/sandbox/PageCapture.mjs.map +1 -0
  381. package/dist/sandbox/PageCrawl.d.mts +88 -0
  382. package/dist/sandbox/PageCrawl.mjs +124 -0
  383. package/dist/sandbox/PageCrawl.mjs.map +1 -0
  384. package/dist/sandbox/PageScreenshot.d.mts +2 -0
  385. package/dist/sandbox/PageScreenshot.mjs +53 -0
  386. package/dist/sandbox/PageScreenshot.mjs.map +1 -0
  387. package/dist/sandbox/ProtectedBrowser.d.mts +273 -0
  388. package/dist/sandbox/ProtectedBrowser.mjs +287 -0
  389. package/dist/sandbox/ProtectedBrowser.mjs.map +1 -0
  390. package/dist/sandbox/Sandbox.d.mts +2 -0
  391. package/dist/sandbox/Sandbox.mjs +208 -0
  392. package/dist/sandbox/Sandbox.mjs.map +1 -0
  393. package/dist/utf8-BYfhEkcj.mjs +11 -0
  394. package/dist/utf8-BYfhEkcj.mjs.map +1 -0
  395. package/dist/utf8-DchGZRBd.mjs +23 -0
  396. package/dist/utf8-DchGZRBd.mjs.map +1 -0
  397. package/package.json +1 -40
  398. package/src/Ephemeral.ts +17 -0
  399. package/src/ToolExposure.ts +2 -0
  400. package/src/capabilities/Approval.ts +352 -0
  401. package/src/capabilities/Budget.ts +536 -0
  402. package/src/capabilities/CodeMode.ts +1090 -0
  403. package/src/capabilities/Commands.ts +86 -0
  404. package/src/capabilities/ContextTools.ts +184 -0
  405. package/src/capabilities/Mcp.ts +427 -0
  406. package/src/capabilities/McpClient.ts +967 -0
  407. package/src/capabilities/MemoryNotes.ts +174 -0
  408. package/src/capabilities/Messaging.ts +261 -0
  409. package/src/capabilities/ModelContext.ts +354 -0
  410. package/src/capabilities/Redaction.ts +157 -0
  411. package/src/capabilities/Remembering.ts +550 -0
  412. package/src/capabilities/RunHooks.ts +280 -0
  413. package/src/capabilities/SemanticMemory.ts +447 -0
  414. package/src/capabilities/Subagent.ts +2277 -0
  415. package/src/capabilities/SubagentReservations.ts +850 -0
  416. package/src/capabilities/ToolDiscovery.ts +339 -0
  417. package/src/capabilities/WebCapture.ts +722 -0
  418. package/src/capabilities/WebSearch.ts +184 -0
  419. package/src/capabilities/internal/subagent-background.ts +1106 -0
  420. package/src/capabilities/internal/subagent-contract.ts +142 -0
  421. package/src/capabilities/internal/subagent-policy.ts +235 -0
  422. package/src/capabilities/internal/subagent-reporting.ts +261 -0
  423. package/src/capabilities/internal/utf8.ts +10 -0
  424. package/src/core/Agent.ts +575 -0
  425. package/src/core/AgentError.ts +152 -0
  426. package/src/core/AgentPolicy.ts +153 -0
  427. package/src/core/AgentUpdates.ts +100 -0
  428. package/src/core/IdGenerator.ts +39 -0
  429. package/src/core/Identifiers.ts +48 -0
  430. package/src/core/Memory.ts +290 -0
  431. package/src/core/MemoryNamespace.ts +196 -0
  432. package/src/core/MemoryReference.ts +121 -0
  433. package/src/core/MemoryRevalidation.ts +185 -0
  434. package/src/core/MemoryStore.ts +368 -0
  435. package/src/core/Messaging.ts +90 -0
  436. package/src/core/Receipt.ts +42 -0
  437. package/src/core/RememberingStore.ts +300 -0
  438. package/src/core/RunEvent.ts +366 -0
  439. package/src/core/RunPolicyUsage.ts +17 -0
  440. package/src/core/SemanticMemoryIndex.ts +250 -0
  441. package/src/core/SemanticMemoryRevalidation.ts +254 -0
  442. package/src/core/SubagentContract.ts +196 -0
  443. package/src/core/Thread.ts +371 -0
  444. package/src/core/ToolExposure.ts +74 -0
  445. package/src/core/ToolResult.ts +170 -0
  446. package/src/core/Usage.ts +529 -0
  447. package/src/core/Worker.ts +173 -0
  448. package/src/core/internal/agent-updates.ts +32 -0
  449. package/src/core/internal/utf8.ts +23 -0
  450. package/src/durable/ActivityStore.ts +160 -0
  451. package/src/durable/Admin.ts +496 -0
  452. package/src/durable/AgentRegistration.ts +13 -0
  453. package/src/durable/Certification.ts +210 -0
  454. package/src/durable/CommittedActivity.ts +296 -0
  455. package/src/durable/Digest.ts +93 -0
  456. package/src/durable/DurableAgentRuntime.ts +10340 -0
  457. package/src/durable/DurableFailpoint.ts +103 -0
  458. package/src/durable/DurableFailpointTestControl.ts +39 -0
  459. package/src/durable/EventSource.ts +172 -0
  460. package/src/durable/GitHubWorkflowSource.ts +453 -0
  461. package/src/durable/MessageDelivery.ts +708 -0
  462. package/src/durable/MessageDeliveryStoreConformance.ts +363 -0
  463. package/src/durable/OperationAuthorizer.ts +85 -0
  464. package/src/durable/PersistentHistory.ts +260 -0
  465. package/src/durable/PreparedInputAdmission.ts +44 -0
  466. package/src/durable/Records.ts +1010 -0
  467. package/src/durable/Recovery.ts +1018 -0
  468. package/src/durable/RunJournal.ts +1479 -0
  469. package/src/durable/Schedule.ts +504 -0
  470. package/src/durable/ScheduleStoreConformance.ts +638 -0
  471. package/src/durable/ScheduleTransition.ts +265 -0
  472. package/src/durable/Scheduling.ts +1077 -0
  473. package/src/durable/SqlMemoryStore.ts +778 -0
  474. package/src/durable/SqlMessageDeliveryStore.ts +302 -0
  475. package/src/durable/SqlStorageV2Upgrade.ts +500 -0
  476. package/src/durable/SqlSubscriptionStore.ts +1440 -0
  477. package/src/durable/SubmissionLedger.ts +1201 -0
  478. package/src/durable/SubmissionLedgerConformance.ts +4579 -0
  479. package/src/durable/SubmissionStatus.ts +14 -0
  480. package/src/durable/Subscription.ts +544 -0
  481. package/src/durable/SubscriptionInput.ts +144 -0
  482. package/src/durable/SubscriptionStoreConformance.ts +945 -0
  483. package/src/durable/SubscriptionTools.ts +327 -0
  484. package/src/durable/SubscriptionTransition.ts +302 -0
  485. package/src/durable/Subscriptions.ts +1210 -0
  486. package/src/durable/ThreadContextHistory.ts +227 -0
  487. package/src/durable/ThreadContextHistoryProjection.ts +216 -0
  488. package/src/durable/ThreadInvariants.ts +442 -0
  489. package/src/durable/ThreadProjection.ts +269 -0
  490. package/src/durable/ThreadProjectionMaintenance.ts +67 -0
  491. package/src/durable/ThreadStore.ts +242 -0
  492. package/src/durable/ThreadStoreConformance.ts +710 -0
  493. package/src/durable/ToolReconciler.ts +105 -0
  494. package/src/durable/WakeScheduler.ts +134 -0
  495. package/src/durable/WorkerHost.ts +171 -0
  496. package/src/durable/internal/agent-registration.ts +525 -0
  497. package/src/durable/internal/agent-updates.ts +302 -0
  498. package/src/durable/internal/foreign-diagnostic.ts +47 -0
  499. package/src/durable/internal/journal-checkpoint.ts +104 -0
  500. package/src/durable/internal/journal-metadata.ts +107 -0
  501. package/src/durable/internal/messaging-host.ts +608 -0
  502. package/src/durable/internal/schedule-time.ts +303 -0
  503. package/src/durable/internal/storage-v2-layout.ts +163 -0
  504. package/src/durable/internal/storage-v2.ts +73 -0
  505. package/src/durable/internal/worker-host.ts +2467 -0
  506. package/src/durable/internal/worker-runtime.ts +9 -0
  507. package/src/engine/AgentRuntime.ts +37 -0
  508. package/src/engine/Compaction.ts +11 -0
  509. package/src/engine/ContextCompactor.ts +277 -0
  510. package/src/engine/ContextHistory.ts +73 -0
  511. package/src/engine/ContextWindow.ts +72 -0
  512. package/src/engine/DurableStep.ts +132 -0
  513. package/src/engine/MessagingHost.ts +110 -0
  514. package/src/engine/Output.ts +2 -0
  515. package/src/engine/RunEventSink.ts +132 -0
  516. package/src/engine/RunOptions.ts +1077 -0
  517. package/src/engine/SubagentHost.ts +181 -0
  518. package/src/engine/ThreadHistory.ts +120 -0
  519. package/src/engine/ToolBroker.ts +157 -0
  520. package/src/engine/ToolExposure.ts +48 -0
  521. package/src/engine/internal/agent-runtime.ts +10162 -0
  522. package/src/engine/internal/bounded-value.ts +315 -0
  523. package/src/engine/internal/compaction.ts +678 -0
  524. package/src/engine/internal/error-diagnostic.ts +39 -0
  525. package/src/engine/internal/output-contract.ts +173 -0
  526. package/src/engine/internal/primitive-delta.ts +80 -0
  527. package/src/engine/internal/provider-result-staging.ts +211 -0
  528. package/src/engine/internal/tool-derivative.ts +106 -0
  529. package/src/engine/internal/tool-exposure.ts +224 -0
  530. package/src/engine/internal/tool-telemetry.ts +484 -0
  531. package/src/index.ts +97 -22
  532. package/src/sandbox/CodeExecutor.ts +352 -0
  533. package/src/sandbox/InteractiveBrowser.ts +257 -0
  534. package/src/sandbox/PageCapture.ts +692 -0
  535. package/src/sandbox/PageCrawl.ts +148 -0
  536. package/src/sandbox/PageScreenshot.ts +81 -0
  537. package/src/sandbox/ProtectedBrowser.ts +436 -0
  538. package/src/sandbox/Sandbox.ts +241 -0
@@ -0,0 +1,371 @@
1
+ import { Clock, Context, DateTime, Effect, Layer, Schema, SynchronizedRef } from "effect";
2
+ import { Prompt } from "effect/unstable/ai";
3
+
4
+ import { ThreadId, RunId } from "./Identifiers.ts";
5
+ import { utf8ByteLength } from "./internal/utf8.ts";
6
+
7
+ /** Bound applied to one text projection before it can enter a model context. */
8
+ export const ThreadText = Schema.String.check(Schema.isMaxLength(64 * 1024));
9
+ const MAX_THREAD_MESSAGES = 1_024;
10
+ const MAX_THREAD_CONTENT_BYTES = 4 * 1024 * 1024;
11
+ const MAX_THREADS = 256;
12
+ const MAX_STORE_CONTENT_BYTES = 64 * 1024 * 1024;
13
+
14
+ /** One append-only native Effect AI message in a conversation. */
15
+ export class ThreadMessage extends Schema.Class<ThreadMessage>(
16
+ "@effect-agent/capabilities/ThreadMessage",
17
+ )({
18
+ threadId: ThreadId,
19
+ sequence: Schema.Natural,
20
+ runId: Schema.optionalKey(RunId),
21
+ message: Prompt.Message,
22
+ encodedBytes: Schema.Natural.check(Schema.isLessThanOrEqualTo(MAX_THREAD_CONTENT_BYTES)),
23
+ timestamp: Schema.DateTimeUtcFromString,
24
+ }) {}
25
+
26
+ /** An identified, ordered conversation snapshot. Storage and execution recovery are separate concerns. */
27
+ export class Thread extends Schema.Class<Thread>("@effect-agent/capabilities/ThreadSnapshot")({
28
+ version: Schema.Literal(1),
29
+ threadId: ThreadId,
30
+ nextSequence: Schema.Natural,
31
+ contentBytes: Schema.Natural.check(Schema.isLessThanOrEqualTo(MAX_THREAD_CONTENT_BYTES)),
32
+ messages: Schema.Array(ThreadMessage).check(Schema.isMaxLength(MAX_THREAD_MESSAGES)),
33
+ }) {}
34
+
35
+ /** Portable conversation snapshot. Its format is independent of the durable execution journal. */
36
+ export class ThreadExport extends Schema.Class<ThreadExport>(
37
+ "@effect-agent/capabilities/ThreadExport",
38
+ )({
39
+ format: Schema.Literal("effect-agent/ephemeral-thread@1"),
40
+ exportedAt: Schema.DateTimeUtcFromString,
41
+ snapshot: Thread,
42
+ }) {}
43
+
44
+ /** Native message accepted by the append-only thread. */
45
+ export class ThreadAppend extends Schema.Class<ThreadAppend>(
46
+ "@effect-agent/capabilities/ThreadAppend",
47
+ )({
48
+ runId: Schema.optionalKey(RunId),
49
+ message: Prompt.Message,
50
+ }) {}
51
+
52
+ /** The requested Thread has not been created in this store. */
53
+ export class ThreadNotFound extends Schema.TaggedError<ThreadNotFound>()("ThreadNotFound", {
54
+ threadId: ThreadId,
55
+ }) {}
56
+
57
+ /** A process-local Thread store reached an explicit count or encoded-content bound. */
58
+ export class ThreadLimitExceeded extends Schema.TaggedError<ThreadLimitExceeded>()(
59
+ "ThreadLimitExceeded",
60
+ {
61
+ threadId: ThreadId,
62
+ limit: Schema.Literals(["messages", "content-bytes", "threads", "store-content-bytes"]),
63
+ limitValue: Schema.Natural,
64
+ observedValue: Schema.Natural,
65
+ },
66
+ ) {}
67
+
68
+ /** Engine history was not an append-only extension of the official snapshot. */
69
+ export class ThreadHistoryDiverged extends Schema.TaggedError<ThreadHistoryDiverged>()(
70
+ "ThreadHistoryDiverged",
71
+ { threadId: ThreadId, message: Schema.String },
72
+ ) {}
73
+
74
+ /** Native Prompt encoding failed before a bounded state mutation. */
75
+ export class ThreadEncodingError extends Schema.TaggedError<ThreadEncodingError>()(
76
+ "ThreadEncodingError",
77
+ { threadId: ThreadId, message: Schema.String },
78
+ ) {}
79
+
80
+ export type ThreadError =
81
+ | ThreadNotFound
82
+ | ThreadLimitExceeded
83
+ | ThreadHistoryDiverged
84
+ | ThreadEncodingError;
85
+
86
+ /** Reconstruct exact Effect AI Prompt history, including tools, reasoning, files, and options. */
87
+ export const toPrompt = (snapshot: Thread): Prompt.Prompt =>
88
+ Prompt.fromMessages(snapshot.messages.map((entry) => entry.message));
89
+
90
+ /**
91
+ * Process-local state for conversation history. Updates remain visible even
92
+ * when a Run later fails; this service has no successful-Run commit boundary or durable recovery.
93
+ * ThreadHistory.layer uses this store for ordinary Runs and interactive history.
94
+ * Scope closure releases all in-memory state.
95
+ */
96
+ export class Store extends Context.Service<
97
+ Store,
98
+ {
99
+ readonly create: (threadId: ThreadId) => Effect.Effect<Thread, ThreadLimitExceeded>;
100
+ readonly append: (
101
+ threadId: ThreadId,
102
+ message: ThreadAppend,
103
+ ) => Effect.Effect<Thread, ThreadNotFound | ThreadLimitExceeded | ThreadEncodingError>;
104
+ /**
105
+ * Record an engine-emitted full history only when it is an append-only
106
+ * extension of the exact official Prompt already stored. The entire
107
+ * suffix commits in one transaction or not at all: concurrent writers are
108
+ * serialized, a writer whose history no longer extends the committed
109
+ * official history fails with ThreadHistoryDiverged, and a limit
110
+ * failure inside the suffix records nothing. Earlier updates remain committed if the Run
111
+ * later fails or is interrupted; this transaction covers one update, not the whole Run.
112
+ */
113
+ readonly recordHistory: (
114
+ threadId: ThreadId,
115
+ runId: RunId,
116
+ history: Prompt.Prompt,
117
+ ) => Effect.Effect<Thread, ThreadError>;
118
+ readonly snapshot: (threadId: ThreadId) => Effect.Effect<Thread, ThreadNotFound>;
119
+ readonly export: (threadId: ThreadId) => Effect.Effect<ThreadExport, ThreadNotFound>;
120
+ }
121
+ >()("@effect-agent/capabilities/EphemeralThreads") {}
122
+
123
+ const encodeMessage = (
124
+ threadId: ThreadId,
125
+ message: Prompt.Message,
126
+ ): Effect.Effect<string, ThreadEncodingError> =>
127
+ Schema.encodeEffect(Prompt.Message)(message).pipe(
128
+ Effect.map((encoded) => JSON.stringify(encoded)),
129
+ Effect.mapError((error) =>
130
+ ThreadEncodingError.make({
131
+ threadId,
132
+ message: `Could not encode native Effect AI message: ${error.message}`,
133
+ }),
134
+ ),
135
+ );
136
+
137
+ const findSnapshot = (
138
+ state: ReadonlyMap<ThreadId, Thread>,
139
+ threadId: ThreadId,
140
+ ): Effect.Effect<Thread, ThreadNotFound> => {
141
+ const snapshot = state.get(threadId);
142
+
143
+ return snapshot === undefined
144
+ ? Effect.fail(ThreadNotFound.make({ threadId }))
145
+ : Effect.succeed(snapshot);
146
+ };
147
+
148
+ const totalStoreBytes = (threads: ReadonlyMap<ThreadId, Thread>): number => {
149
+ let total = 0;
150
+
151
+ for (const snapshot of threads.values()) total += snapshot.contentBytes;
152
+
153
+ return total;
154
+ };
155
+
156
+ const appendEncoded = Effect.fn("Thread.Store.appendEncoded")(function* (
157
+ threads: ReadonlyMap<ThreadId, Thread>,
158
+ current: Thread,
159
+ append: ThreadAppend,
160
+ encoded: string,
161
+ timestamp: DateTime.Utc,
162
+ ) {
163
+ const threadId = current.threadId;
164
+
165
+ if (current.messages.length >= MAX_THREAD_MESSAGES) {
166
+ return yield* ThreadLimitExceeded.make({
167
+ threadId,
168
+ limit: "messages",
169
+ limitValue: MAX_THREAD_MESSAGES,
170
+ observedValue: current.messages.length + 1,
171
+ });
172
+ }
173
+ const messageBytes = utf8ByteLength(encoded);
174
+ const contentBytes = current.contentBytes + messageBytes;
175
+
176
+ if (contentBytes > MAX_THREAD_CONTENT_BYTES) {
177
+ return yield* ThreadLimitExceeded.make({
178
+ threadId,
179
+ limit: "content-bytes",
180
+ limitValue: MAX_THREAD_CONTENT_BYTES,
181
+ observedValue: contentBytes,
182
+ });
183
+ }
184
+ const storeBytes = totalStoreBytes(threads) + messageBytes;
185
+
186
+ if (storeBytes > MAX_STORE_CONTENT_BYTES) {
187
+ return yield* ThreadLimitExceeded.make({
188
+ threadId,
189
+ limit: "store-content-bytes",
190
+ limitValue: MAX_STORE_CONTENT_BYTES,
191
+ observedValue: storeBytes,
192
+ });
193
+ }
194
+
195
+ const message = ThreadMessage.make({
196
+ threadId,
197
+ sequence: current.nextSequence,
198
+ ...(append.runId === undefined ? {} : { runId: append.runId }),
199
+ message: append.message,
200
+ encodedBytes: messageBytes,
201
+ timestamp,
202
+ });
203
+
204
+ const next = Thread.make({
205
+ version: current.version,
206
+ threadId: current.threadId,
207
+ nextSequence: current.nextSequence + 1,
208
+ contentBytes,
209
+ messages: [...current.messages, message],
210
+ });
211
+
212
+ return [next, new Map(threads).set(threadId, next)] as const;
213
+ });
214
+
215
+ /** In-memory storage shared for the consumer's Scope; it does not survive process loss. */
216
+ export const layerMemory = Layer.effect(
217
+ Store,
218
+ Effect.gen(function* () {
219
+ const state = yield* SynchronizedRef.make<ReadonlyMap<ThreadId, Thread>>(new Map());
220
+
221
+ yield* Effect.addFinalizer(() => SynchronizedRef.set(state, new Map()));
222
+
223
+ return Store.of({
224
+ create: (threadId) =>
225
+ SynchronizedRef.modifyEffect(
226
+ state,
227
+ Effect.fn(function* (threads) {
228
+ const existing = threads.get(threadId);
229
+
230
+ if (existing !== undefined) return [existing, threads] as const;
231
+ if (threads.size >= MAX_THREADS) {
232
+ return yield* ThreadLimitExceeded.make({
233
+ threadId,
234
+ limit: "threads",
235
+ limitValue: MAX_THREADS,
236
+ observedValue: threads.size + 1,
237
+ });
238
+ }
239
+
240
+ const created = Thread.make({
241
+ version: 1,
242
+ threadId,
243
+ nextSequence: 0,
244
+ contentBytes: 0,
245
+ messages: [],
246
+ });
247
+
248
+ return [created, new Map(threads).set(threadId, created)] as const;
249
+ }),
250
+ ),
251
+ append: Effect.fn("Thread.Store.append")(function* (threadId, message) {
252
+ const encoded = yield* encodeMessage(threadId, message.message);
253
+ const timestamp = DateTime.toUtc(DateTime.makeUnsafe(yield* Clock.currentTimeMillis));
254
+
255
+ return yield* SynchronizedRef.modifyEffect(
256
+ state,
257
+ Effect.fn(function* (threads) {
258
+ const current = yield* findSnapshot(threads, threadId);
259
+
260
+ return yield* appendEncoded(threads, current, message, encoded, timestamp);
261
+ }),
262
+ );
263
+ }),
264
+ recordHistory: Effect.fn("Thread.Store.recordHistory")(
265
+ function* (threadId, historyRunId, history) {
266
+ const incoming = yield* Effect.forEach(history.content, (message) =>
267
+ encodeMessage(threadId, message).pipe(Effect.map((encoded) => ({ message, encoded }))),
268
+ );
269
+
270
+ // Publish the complete suffix only after verification and every bounded append succeed.
271
+ return yield* SynchronizedRef.modifyEffect(
272
+ state,
273
+ Effect.fn(function* (threads) {
274
+ const current = yield* findSnapshot(threads, threadId);
275
+
276
+ const currentEncoded = yield* Effect.forEach(current.messages, (entry) =>
277
+ encodeMessage(threadId, entry.message),
278
+ );
279
+
280
+ if (
281
+ incoming.length < currentEncoded.length ||
282
+ currentEncoded.some((encoded, index) => encoded !== incoming[index]?.encoded)
283
+ ) {
284
+ return yield* ThreadHistoryDiverged.make({
285
+ threadId,
286
+ message: "Engine history is not an append-only extension of official history",
287
+ });
288
+ }
289
+ const timestamp = DateTime.toUtc(DateTime.makeUnsafe(yield* Clock.currentTimeMillis));
290
+
291
+ if (incoming.length === currentEncoded.length) return [current, threads] as const;
292
+
293
+ const messages = [...current.messages];
294
+ let contentBytes = current.contentBytes;
295
+ let storeBytes = totalStoreBytes(threads);
296
+ let nextSequence = current.nextSequence;
297
+
298
+ for (const entry of incoming.slice(currentEncoded.length)) {
299
+ const append = ThreadAppend.make({ runId: historyRunId, message: entry.message });
300
+
301
+ // Preserve append's first failing bound and observed value without publishing
302
+ // intermediate snapshots or rescanning the store for each suffix message.
303
+ if (messages.length >= MAX_THREAD_MESSAGES) {
304
+ return yield* ThreadLimitExceeded.make({
305
+ threadId,
306
+ limit: "messages",
307
+ limitValue: MAX_THREAD_MESSAGES,
308
+ observedValue: messages.length + 1,
309
+ });
310
+ }
311
+ const messageBytes = utf8ByteLength(entry.encoded);
312
+
313
+ contentBytes += messageBytes;
314
+ if (contentBytes > MAX_THREAD_CONTENT_BYTES) {
315
+ return yield* ThreadLimitExceeded.make({
316
+ threadId,
317
+ limit: "content-bytes",
318
+ limitValue: MAX_THREAD_CONTENT_BYTES,
319
+ observedValue: contentBytes,
320
+ });
321
+ }
322
+ storeBytes += messageBytes;
323
+ if (storeBytes > MAX_STORE_CONTENT_BYTES) {
324
+ return yield* ThreadLimitExceeded.make({
325
+ threadId,
326
+ limit: "store-content-bytes",
327
+ limitValue: MAX_STORE_CONTENT_BYTES,
328
+ observedValue: storeBytes,
329
+ });
330
+ }
331
+ messages.push(
332
+ ThreadMessage.make({
333
+ threadId,
334
+ sequence: nextSequence,
335
+ ...(append.runId === undefined ? {} : { runId: append.runId }),
336
+ message: append.message,
337
+ encodedBytes: messageBytes,
338
+ timestamp,
339
+ }),
340
+ );
341
+ nextSequence += 1;
342
+ }
343
+
344
+ const snapshot = Thread.make({
345
+ version: current.version,
346
+ threadId,
347
+ nextSequence,
348
+ contentBytes,
349
+ messages,
350
+ });
351
+
352
+ return [snapshot, new Map(threads).set(threadId, snapshot)] as const;
353
+ }),
354
+ );
355
+ },
356
+ ),
357
+ snapshot: (threadId) =>
358
+ SynchronizedRef.get(state).pipe(Effect.flatMap((all) => findSnapshot(all, threadId))),
359
+ export: (threadId) =>
360
+ Effect.gen(function* () {
361
+ const snapshot = yield* findSnapshot(yield* SynchronizedRef.get(state), threadId);
362
+
363
+ return ThreadExport.make({
364
+ format: "effect-agent/ephemeral-thread@1",
365
+ exportedAt: DateTime.toUtc(DateTime.makeUnsafe(yield* Clock.currentTimeMillis)),
366
+ snapshot,
367
+ });
368
+ }),
369
+ });
370
+ }),
371
+ );
@@ -0,0 +1,74 @@
1
+ import { Context, Schema } from "effect";
2
+ import type { Tool } from "effect/unstable/ai";
3
+
4
+ /** Registered native names only. Empty selection deliberately clears non-pinned Tools. */
5
+ export const ToolNames = Schema.Array(
6
+ Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(256)),
7
+ ).check(
8
+ Schema.isMaxLength(1_024),
9
+ Schema.makeFilter((names) => new Set(names).size === names.length, {
10
+ title: "Tool names are unique",
11
+ }),
12
+ );
13
+
14
+ /** One run-scoped replacement, independent of search and of model-visible result text. */
15
+ export class Selection extends Schema.Class<Selection>("@effect-agent/core/ToolExposure/Selection")(
16
+ {
17
+ toolNames: ToolNames,
18
+ },
19
+ ) {}
20
+
21
+ /** Exact declarations used by one model request, with the selection that produced them. */
22
+ export class Snapshot extends Schema.Class<Snapshot>("@effect-agent/core/ToolExposure/Snapshot")({
23
+ exposedToolNames: ToolNames,
24
+ selection: Schema.optionalKey(Selection),
25
+ }) {}
26
+
27
+ export const Limits = Schema.Struct({
28
+ maxTools: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1_024)),
29
+ maxSchemaBytes: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(4_194_304)),
30
+ });
31
+
32
+ /** Omission preserves eager exposure. Selection changes take effect only after a complete batch. */
33
+ export interface Configuration {
34
+ readonly initialToolNames?: ReadonlyArray<string> | undefined;
35
+ readonly maxTools?: number | undefined;
36
+ readonly maxSchemaBytes?: number | undefined;
37
+ }
38
+
39
+ /** Trusted grouping metadata; never inferred from a Tool's name. */
40
+ export const ToolNamespace = Context.Reference<string | undefined>(
41
+ "@effect-agent/core/ToolExposure/ToolNamespace",
42
+ { defaultValue: () => undefined },
43
+ );
44
+
45
+ /** An ordinary readonly Tool whose successful result has a `toolNames` field of native names. */
46
+ export const DiscoveryTool = Context.Reference<boolean>(
47
+ "@effect-agent/core/ToolExposure/DiscoveryTool",
48
+ { defaultValue: () => false },
49
+ );
50
+
51
+ /** Remains selected while eligible. Host visibility and inherited grants may hide an explicit
52
+ * pin without failing the Run; discovery, context rollover and required completion stay mandatory.
53
+ */
54
+ export const PinnedTool = Context.Reference<boolean>("@effect-agent/core/ToolExposure/PinnedTool", {
55
+ defaultValue: () => false,
56
+ });
57
+
58
+ /** Extra documentation candidates executed through their owning native Tool, such as Code Mode. */
59
+ export interface AdditionalCatalogEntry {
60
+ readonly tool: Tool.Any;
61
+ readonly namespace: string;
62
+ readonly method: string;
63
+ }
64
+
65
+ export const AdditionalToolCatalog = Context.Reference<ReadonlyArray<AdditionalCatalogEntry>>(
66
+ "@effect-agent/core/ToolExposure/AdditionalToolCatalog",
67
+ { defaultValue: () => [] },
68
+ );
69
+
70
+ /** The owning Tool description embeds its complete additional catalogue. */
71
+ export const IncludesCatalogDocumentation = Context.Reference<boolean>(
72
+ "@effect-agent/core/ToolExposure/IncludesCatalogDocumentation",
73
+ { defaultValue: () => false },
74
+ );
@@ -0,0 +1,170 @@
1
+ import * as Schema from "effect/Schema";
2
+
3
+ import { codePointUtf8Length, utf8ByteLength } from "./internal/utf8.ts";
4
+
5
+ /**
6
+ * The minimal `TruncatedToolResult` envelope (empty head/tail, a 16-digit
7
+ * `originalBytes`) encodes to at most 81 UTF-8 bytes; 256 guarantees every
8
+ * accepted bound fits the envelope plus some real content, so the bound is a
9
+ * hard resource guard rather than a best-effort one.
10
+ */
11
+ const ENVELOPE_FLOOR_BYTES = 256;
12
+
13
+ /** Byte bound applied to one encoded application Tool result before it enters history. */
14
+ export class ToolResultBounds extends Schema.Class<ToolResultBounds>("ToolResultBounds")({
15
+ maxBytes: Schema.Int.check(Schema.isGreaterThanOrEqualTo(ENVELOPE_FLOOR_BYTES)),
16
+ }) {}
17
+
18
+ /**
19
+ * Canonical envelope replacing an encoded Tool result that exceeded its
20
+ * policy bounds. `head` and `tail` are an exact prefix and suffix of the
21
+ * original encoded JSON text; the middle is dropped, never paraphrased.
22
+ */
23
+ export class TruncatedToolResult extends Schema.Class<TruncatedToolResult>("TruncatedToolResult")({
24
+ truncatedToolResult: Schema.Literal(true),
25
+ originalBytes: Schema.Natural,
26
+ head: Schema.String,
27
+ tail: Schema.String,
28
+ }) {}
29
+
30
+ /**
31
+ * Canonical fail-closed sentinel replacing an encoded Tool result that could
32
+ * not be JSON-serialized at all (cyclic value, BigInt, `undefined`, throwing
33
+ * `toJSON`). The original value never enters history or durable records —
34
+ * an unserializable value is unbounded by construction, so the bound seam
35
+ * replaces it wholesale rather than passing it through (runtime spec §9).
36
+ */
37
+ export class UnserializableToolResult extends Schema.Class<UnserializableToolResult>(
38
+ "UnserializableToolResult",
39
+ )({
40
+ unserializableToolResult: Schema.Literal(true),
41
+ reason: Schema.String.check(Schema.isMaxLength(256)),
42
+ }) {}
43
+
44
+ /**
45
+ * Build the encoded sentinel for a serialization failure. Total by
46
+ * construction — the cause is untrusted (a hostile `toString` or an
47
+ * accessor-backed `Error.message` can itself throw on this last-resort
48
+ * path) — and byte-bound: the complete encoded sentinel stays within the
49
+ * 256-byte `ToolResultBounds` schema floor, so it fits every accepted
50
+ * policy without the caller re-applying bounds.
51
+ */
52
+ export const unserializableToolResult = (
53
+ cause: unknown,
54
+ ): typeof UnserializableToolResult.Encoded => {
55
+ let reason: string;
56
+
57
+ try {
58
+ const message = cause instanceof Error ? cause.message : cause;
59
+
60
+ reason = typeof message === "string" ? message : String(message);
61
+ } catch {
62
+ reason = "unserializable value";
63
+ }
64
+
65
+ const build = (clipped: string): typeof UnserializableToolResult.Encoded =>
66
+ Schema.encodeSync(UnserializableToolResult)(
67
+ UnserializableToolResult.make({
68
+ unserializableToolResult: true,
69
+ reason: clipped,
70
+ }),
71
+ );
72
+
73
+ // JSON escaping inflates bytes, so shrink by whole code points until the
74
+ // encoded sentinel fits the floor; the empty reason always fits.
75
+ let clipped = takePrefixWithinBytes(reason, 128);
76
+ let sentinel = build(clipped);
77
+
78
+ while (clipped.length > 0 && utf8ByteLength(JSON.stringify(sentinel)) > 256) {
79
+ const last = clipped.codePointAt(clipped.length - 1);
80
+
81
+ clipped = clipped.slice(0, clipped.length - (last !== undefined && last > 0xffff ? 2 : 1));
82
+ sentinel = build(clipped);
83
+ }
84
+
85
+ return sentinel;
86
+ };
87
+
88
+ const takePrefixWithinBytes = (value: string, maxBytes: number): string => {
89
+ let bytes = 0;
90
+ let index = 0;
91
+
92
+ while (index < value.length) {
93
+ const codePoint = value.codePointAt(index) ?? 0;
94
+ const width = codePointUtf8Length(codePoint);
95
+
96
+ if (bytes + width > maxBytes) break;
97
+ bytes += width;
98
+ index += codePoint > 0xffff ? 2 : 1;
99
+ }
100
+
101
+ return value.slice(0, index);
102
+ };
103
+
104
+ const takeSuffixWithinBytes = (value: string, maxBytes: number): string => {
105
+ let bytes = 0;
106
+ let index = value.length;
107
+
108
+ while (index > 0) {
109
+ const unit = value.charCodeAt(index - 1);
110
+ const isLowSurrogate = unit >= 0xdc00 && unit <= 0xdfff;
111
+ const pairStart = isLowSurrogate && index >= 2 ? index - 2 : index - 1;
112
+ const codePoint = value.codePointAt(pairStart) ?? 0;
113
+ const width = codePointUtf8Length(codePoint);
114
+
115
+ if (bytes + width > maxBytes) break;
116
+ bytes += width;
117
+ index = pairStart;
118
+ }
119
+
120
+ return value.slice(index);
121
+ };
122
+
123
+ /**
124
+ * Bound one encoded Tool result to `bounds.maxBytes` UTF-8 bytes.
125
+ *
126
+ * Within bounds the input is returned unchanged. Over bounds the result is
127
+ * the JSON-encoded `TruncatedToolResult` envelope preserving an exact prefix
128
+ * and suffix of the input, split ~50/50 across the byte budget left after
129
+ * the envelope's own overhead and shrunk deterministically until the encoded
130
+ * envelope itself fits. Slicing never splits a UTF-16 surrogate pair, so the
131
+ * envelope always re-encodes as valid JSON.
132
+ *
133
+ * The Schema-level 256-byte floor on `ToolResultBounds.maxBytes` guarantees
134
+ * every accepted bound fits the minimal envelope (at most 81 bytes), so the
135
+ * returned value never exceeds `maxBytes` for a decodable bound. The
136
+ * minimal-envelope fallback below survives purely as defense in depth.
137
+ */
138
+ export const applyToolResultBounds = (encodedJson: string, bounds: ToolResultBounds): string => {
139
+ const originalBytes = utf8ByteLength(encodedJson);
140
+
141
+ if (originalBytes <= bounds.maxBytes) return encodedJson;
142
+
143
+ const render = (head: string, tail: string): string =>
144
+ JSON.stringify(
145
+ Schema.encodeSync(TruncatedToolResult)(
146
+ TruncatedToolResult.make({ truncatedToolResult: true, originalBytes, head, tail }),
147
+ ),
148
+ );
149
+
150
+ const minimal = render("", "");
151
+ const contentBudget = bounds.maxBytes - utf8ByteLength(minimal);
152
+
153
+ if (contentBudget <= 0) return minimal;
154
+ let headBudget = Math.floor(contentBudget / 2);
155
+ let tailBudget = contentBudget - headBudget;
156
+
157
+ for (;;) {
158
+ const head = takePrefixWithinBytes(encodedJson, headBudget);
159
+ const tail = takeSuffixWithinBytes(encodedJson, tailBudget);
160
+ const output = render(head, tail);
161
+ const outputBytes = utf8ByteLength(output);
162
+
163
+ if (outputBytes <= bounds.maxBytes) return output;
164
+ if (headBudget === 0 && tailBudget === 0) return minimal;
165
+ const shrink = Math.max(1, Math.ceil((outputBytes - bounds.maxBytes) / 2));
166
+
167
+ headBudget = Math.max(0, headBudget - shrink);
168
+ tailBudget = Math.max(0, tailBudget - shrink);
169
+ }
170
+ };