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,1273 @@
1
+ import type { Scope } from "effect";
2
+ import { Context, Crypto, Effect, Encoding, Layer, Option, Schema, Stream } from "effect";
3
+ import { Tool, Toolkit } from "effect/unstable/ai";
4
+
5
+ import type { AnyDefinition } from "../../core/Agent.ts";
6
+ import * as FailureDiagnostic from "../../core/FailureDiagnostic.ts";
7
+ import { RunId, SettlementId, ThreadId } from "../../core/Identifiers.ts";
8
+ import { utf8ByteLength } from "../../core/internal/utf8.ts";
9
+ import { MessageRef, MessageStatus } from "../../core/Messaging.ts";
10
+ import { IdempotencyKey, JoinedToHost, Receipt } from "../../core/Receipt.ts";
11
+ import {
12
+ BackgroundSpawnTool,
13
+ narrowSubagentGrant,
14
+ SubagentBudgetReservation,
15
+ SubagentGrant,
16
+ } from "../../core/SubagentContract.ts";
17
+ import {
18
+ WorkerContext,
19
+ type WorkerBudgetScope,
20
+ WorkerError,
21
+ WorkerOperationTool,
22
+ WorkerPage,
23
+ WorkerRef,
24
+ WorkerStarted,
25
+ WorkerStop,
26
+ WorkerStopped,
27
+ WorkerSummary,
28
+ } from "../../core/Worker.ts";
29
+ import {
30
+ SubagentHost,
31
+ BackgroundReporting,
32
+ WorkerReportPreparationFailure,
33
+ type WorkerReporting,
34
+ } from "../../engine/SubagentHost.ts";
35
+ import type { SubagentDefineOptions, SubagentPrepareContext } from "../Subagent.ts";
36
+ import {
37
+ SubagentExecutionFailure,
38
+ SubagentPrestartDenied,
39
+ SubagentProjectionFailure,
40
+ } from "./subagent-contract.ts";
41
+ import { resolveSubagentPolicy, resolveToolCallAllowance } from "./subagent-policy.ts";
42
+ import { automaticReporting } from "./subagent-reporting.ts";
43
+ import { utf8Bytes } from "./utf8.ts";
44
+
45
+ export type Declaration<
46
+ Name extends string,
47
+ Input extends Schema.Top,
48
+ Output extends Schema.Top,
49
+ Parameters extends Schema.Top,
50
+ Success extends Schema.Top,
51
+ Failure extends Schema.Top,
52
+ Prepare,
53
+ Project,
54
+ > = Pick<
55
+ SubagentDefineOptions<
56
+ Input,
57
+ Output,
58
+ unknown,
59
+ Record<string, Tool.Any>,
60
+ Parameters,
61
+ Success,
62
+ Failure,
63
+ Prepare,
64
+ Project
65
+ >,
66
+ | "parameters"
67
+ | "success"
68
+ | "failure"
69
+ | "prepareInput"
70
+ | "projectResult"
71
+ | "policy"
72
+ | "toolCallAllowance"
73
+ | "needsApproval"
74
+ > & {
75
+ readonly name: Name;
76
+ readonly delegationId: WorkerRef["delegationId"];
77
+ readonly target: AnyDefinition & { readonly input: Input; readonly output: Output };
78
+ readonly grant: SubagentGrant;
79
+ };
80
+
81
+ type WorkerDeclaration<Name extends string> = {
82
+ readonly name: Name;
83
+ readonly delegationId: WorkerRef["delegationId"];
84
+ readonly target: Pick<AnyDefinition, "id">;
85
+ };
86
+
87
+ /** Portable identity checked against this declaration; possession grants no authority. */
88
+ export const Worker = <const Name extends string>(declaration: WorkerDeclaration<Name>) =>
89
+ WorkerRef.check(
90
+ Schema.makeFilter(
91
+ (worker) =>
92
+ worker.delegationId === declaration.delegationId &&
93
+ worker.targetAgentId === declaration.target.id,
94
+ ),
95
+ ).pipe(Schema.brand(`@effect-agent/Worker/${declaration.name}`));
96
+
97
+ export type Worker<Name extends string> = ReturnType<typeof Worker<Name>>["Type"];
98
+
99
+ /** Model-facing projection deliberately excludes operator-private diagnostics. */
100
+ const toolObservation = <Success extends Schema.Top>(success: Success) =>
101
+ Schema.Union([
102
+ Schema.Struct({ _tag: Schema.Literal("Pending"), receipt: Receipt }),
103
+ Schema.Struct({
104
+ _tag: Schema.Literal("Settled"),
105
+ receipt: Receipt,
106
+ runId: RunId,
107
+ settlementId: SettlementId,
108
+ outcome: Schema.Literal("completed"),
109
+ result: success,
110
+ }),
111
+ Schema.Struct({
112
+ _tag: Schema.Literal("Settled"),
113
+ receipt: Receipt,
114
+ runId: Schema.optionalKey(RunId),
115
+ settlementId: SettlementId,
116
+ outcome: Schema.Literals(["failed", "aborted"]),
117
+ failure: SubagentExecutionFailure,
118
+ }),
119
+ ]);
120
+
121
+ /** One exact Receipt, including private canonical failure evidence for programmatic callers. */
122
+ export const WorkerObservation = <Success extends Schema.Top>(success: Success) => {
123
+ const projected = toolObservation(success);
124
+
125
+ return Schema.Union([
126
+ projected.members[0],
127
+ projected.members[1],
128
+ Schema.Struct({
129
+ ...projected.members[2].fields,
130
+ diagnostic: Schema.optionalKey(FailureDiagnostic.Failure),
131
+ }),
132
+ ]);
133
+ };
134
+
135
+ export type WorkerObservation<Success extends Schema.Top> = ReturnType<
136
+ typeof WorkerObservation<Success>
137
+ >["Type"];
138
+
139
+ const host: Effect.Effect<SubagentHost["Service"], WorkerError, SubagentHost> =
140
+ Effect.serviceOption(SubagentHost).pipe(
141
+ Effect.flatMap((service) =>
142
+ Option.match(service, {
143
+ onNone: () => WorkerError.make({ operation: "context", reason: "unavailable" }),
144
+ onSome: Effect.succeed,
145
+ }),
146
+ ),
147
+ );
148
+
149
+ const receiptEqual = (left: Receipt, right: Receipt): boolean =>
150
+ left.threadId === right.threadId &&
151
+ left.submissionId === right.submissionId &&
152
+ left.receiptId === right.receiptId &&
153
+ left.queueSequence === right.queueSequence;
154
+
155
+ const operations = <
156
+ const Name extends string,
157
+ Input extends Schema.Top,
158
+ Output extends Schema.Top,
159
+ Parameters extends Schema.Top,
160
+ Success extends Schema.Top,
161
+ Failure extends Schema.Top,
162
+ Prepare,
163
+ Project,
164
+ >(
165
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
166
+ ) => {
167
+ const workerSchema = Worker(declaration);
168
+
169
+ const projectionFailure = (stage: "input" | "result", cause?: unknown) =>
170
+ SubagentProjectionFailure.make({
171
+ delegationId: declaration.delegationId,
172
+ stage,
173
+ ...(cause === undefined ? {} : { cause }),
174
+ message:
175
+ stage === "input"
176
+ ? "Worker input did not satisfy the declaration Schema"
177
+ : "Worker result did not satisfy the declaration Schema",
178
+ });
179
+
180
+ const validateWorker = (worker: unknown, operation: WorkerError["operation"]) =>
181
+ Schema.decodeUnknownEffect(workerSchema)(worker).pipe(
182
+ Effect.mapError((cause) => WorkerError.make({ operation, reason: "worker-mismatch", cause })),
183
+ );
184
+
185
+ const validateReceipt = (
186
+ worker: WorkerRef,
187
+ receipt: Receipt,
188
+ operation: WorkerError["operation"],
189
+ ) =>
190
+ Schema.decodeEffect(
191
+ Receipt.check(Schema.makeFilter((value) => value.threadId === worker.threadId)),
192
+ )(receipt).pipe(
193
+ Effect.mapError((cause) =>
194
+ WorkerError.make({ operation, reason: "receipt-mismatch", cause }),
195
+ ),
196
+ );
197
+
198
+ const validateDelivery = Effect.fn("Subagent.validateWorkerDelivery")(function* (
199
+ worker: WorkerRef,
200
+ delivery: MessageStatus,
201
+ operation: WorkerError["operation"],
202
+ ) {
203
+ const validated = yield* Schema.decodeEffect(MessageStatus)(delivery).pipe(
204
+ Effect.mapError((cause) => WorkerError.make({ operation, reason: "corrupt", cause })),
205
+ );
206
+
207
+ if (validated.receipt !== null) yield* validateReceipt(worker, validated.receipt, operation);
208
+
209
+ return validated;
210
+ });
211
+
212
+ const context: Effect.Effect<WorkerContext, WorkerError, SubagentHost> = host.pipe(
213
+ Effect.flatMap((service) => service.context),
214
+ Effect.flatMap(Schema.decodeUnknownEffect(Schema.toType(WorkerContext))),
215
+ Effect.mapError((error) =>
216
+ Schema.is(WorkerError)(error)
217
+ ? error
218
+ : WorkerError.make({ operation: "context", reason: "corrupt", cause: error }),
219
+ ),
220
+ );
221
+
222
+ const prepare = Effect.fn("Subagent.prepareWorkerInput")(function* (
223
+ parameters: Parameters["Type"],
224
+ caller: WorkerContext,
225
+ ) {
226
+ const source = caller.source;
227
+
228
+ const preparation: SubagentPrepareContext =
229
+ source._tag === "tool"
230
+ ? {
231
+ source: "tool",
232
+ delegationId: declaration.delegationId,
233
+ toolCallId: source.toolCallId,
234
+ parent: { agentId: source.agentId, threadId: source.threadId, runId: source.runId },
235
+ }
236
+ : {
237
+ source: "programmatic",
238
+ delegationId: declaration.delegationId,
239
+ parent: { agentId: source.agentId, threadId: source.threadId },
240
+ };
241
+
242
+ const input = yield* declaration.prepareInput(parameters, preparation);
243
+
244
+ const encodedInput = yield* Schema.encodeEffect(declaration.target.input)(input).pipe(
245
+ Effect.mapError((cause) => projectionFailure("input", cause)),
246
+ );
247
+
248
+ return encodedInput;
249
+ });
250
+
251
+ const validateKey = (key: IdempotencyKey, operation: "start" | "followUp") =>
252
+ Schema.decodeEffect(IdempotencyKey)(key).pipe(
253
+ Effect.mapError((cause) =>
254
+ WorkerError.make({ operation, reason: "idempotency-conflict", cause }),
255
+ ),
256
+ );
257
+
258
+ const start = Effect.fn("Subagent.start")(function* (
259
+ parameters: Parameters["Type"],
260
+ options: { readonly idempotencyKey: IdempotencyKey; readonly budgetScope?: WorkerBudgetScope },
261
+ ) {
262
+ const service = yield* host;
263
+ const caller = yield* context;
264
+ const key = yield* validateKey(options.idempotencyKey, "start");
265
+
266
+ const grant = narrowSubagentGrant(declaration.grant, caller.grant);
267
+
268
+ if (caller.depth + 1 > grant.maxDepth) {
269
+ return yield* SubagentPrestartDenied.make({
270
+ delegationId: declaration.delegationId,
271
+ targetAgentId: declaration.target.id,
272
+ reason: "nested-delegation",
273
+ message: "Worker start exceeds the inherited depth ceiling",
274
+ });
275
+ }
276
+ if (!(caller.grant?.childLifetimes ?? ["attached", "background"]).includes("background")) {
277
+ return yield* SubagentPrestartDenied.make({
278
+ delegationId: declaration.delegationId,
279
+ targetAgentId: declaration.target.id,
280
+ reason: "grant-violation",
281
+ message: "The inherited grant does not permit background children",
282
+ });
283
+ }
284
+
285
+ const encodedParameters = yield* Schema.encodeEffect(declaration.parameters)(parameters).pipe(
286
+ Effect.mapError((cause) => projectionFailure("input", cause)),
287
+ );
288
+
289
+ const encodedGrant = yield* Schema.encodeEffect(SubagentGrant)(grant).pipe(
290
+ Effect.mapError((cause) => projectionFailure("input", cause)),
291
+ );
292
+
293
+ const started = yield* service.start({
294
+ delegationId: declaration.delegationId,
295
+ target: declaration.target,
296
+ idempotencyKey: key,
297
+ encodedParameters,
298
+ encodedGrant,
299
+ ...(options.budgetScope === undefined ? {} : { budgetScope: options.budgetScope }),
300
+ prepare: Effect.gen(function* () {
301
+ const encodedInput = yield* prepare(parameters, caller);
302
+
303
+ const effectiveTarget = yield* service.resolveTargetPolicy({
304
+ target: declaration.target,
305
+ encodedInput,
306
+ });
307
+
308
+ const resolvedTarget = Option.getOrUndefined(effectiveTarget);
309
+
310
+ const resolved = resolveSubagentPolicy(
311
+ declaration,
312
+ options.budgetScope === "worker-run"
313
+ ? (resolvedTarget ?? declaration.target.policy)
314
+ : caller.policy,
315
+ undefined,
316
+ options.budgetScope === "worker-run" ? "root-attached" : "conserved",
317
+ resolvedTarget,
318
+ );
319
+
320
+ return {
321
+ encodedInput,
322
+ policy: resolved.childPolicy,
323
+ budget: SubagentBudgetReservation.make({
324
+ caps: resolved.caps,
325
+ allocation: resolved.allocation,
326
+ ...(resolved.policy.descendantInvocations === undefined
327
+ ? {}
328
+ : { descendantInvocations: resolved.policy.descendantInvocations }),
329
+ }),
330
+ toolCallAllowance: resolveToolCallAllowance(
331
+ declaration.toolCallAllowance,
332
+ parameters,
333
+ resolved.policy,
334
+ resolved.childPolicy,
335
+ ),
336
+ };
337
+ }),
338
+ });
339
+
340
+ const validated = yield* Schema.decodeEffect(WorkerStarted)(started).pipe(
341
+ Effect.mapError((cause) =>
342
+ WorkerError.make({ operation: "start", reason: "corrupt", cause }),
343
+ ),
344
+ );
345
+
346
+ if (validated.delivery.message.ownerThreadId !== caller.source.threadId)
347
+ return yield* WorkerError.make({ operation: "start", reason: "message-mismatch" });
348
+
349
+ return {
350
+ worker: yield* validateWorker(validated.worker, "start"),
351
+ delivery: validated.delivery,
352
+ };
353
+ });
354
+
355
+ const followUp = Effect.fn("Subagent.followUp")(function* (
356
+ worker: Worker<Name>,
357
+ parameters: Parameters["Type"],
358
+ options: { readonly idempotencyKey: IdempotencyKey },
359
+ ) {
360
+ const service = yield* host;
361
+ const validated = yield* validateWorker(worker, "followUp");
362
+ const caller = yield* context;
363
+ const key = yield* validateKey(options.idempotencyKey, "followUp");
364
+
365
+ const encodedParameters = yield* Schema.encodeEffect(declaration.parameters)(parameters).pipe(
366
+ Effect.mapError((cause) => projectionFailure("input", cause)),
367
+ );
368
+
369
+ const delivery = yield* validateDelivery(
370
+ validated,
371
+ yield* service.followUp({
372
+ encodedParameters,
373
+ prepare: prepare(parameters, caller).pipe(Effect.map((encodedInput) => ({ encodedInput }))),
374
+ worker: validated,
375
+ target: declaration.target,
376
+ idempotencyKey: key,
377
+ }),
378
+ "followUp",
379
+ );
380
+
381
+ if (delivery.message.ownerThreadId !== caller.source.threadId)
382
+ return yield* WorkerError.make({ operation: "followUp", reason: "message-mismatch" });
383
+
384
+ return delivery;
385
+ });
386
+
387
+ const inspectMessage = Effect.fn("Subagent.inspectWorkerMessage")(function* (
388
+ worker: Worker<Name>,
389
+ message: MessageRef,
390
+ ) {
391
+ const service = yield* host;
392
+ const validated = yield* validateWorker(worker, "inspect");
393
+
394
+ const requested = yield* Schema.decodeEffect(MessageRef)(message).pipe(
395
+ Effect.mapError((cause) =>
396
+ WorkerError.make({ operation: "inspect", reason: "message-mismatch", cause }),
397
+ ),
398
+ );
399
+
400
+ const observed = yield* service.inspect({
401
+ worker: validated,
402
+ target: declaration.target,
403
+ message: requested,
404
+ });
405
+
406
+ if (!("message" in observed))
407
+ return yield* WorkerError.make({ operation: "inspect", reason: "corrupt" });
408
+ const delivery = yield* validateDelivery(validated, observed, "inspect");
409
+
410
+ if (!Schema.toEquivalence(MessageRef)(delivery.message, requested))
411
+ return yield* WorkerError.make({ operation: "inspect", reason: "message-mismatch" });
412
+
413
+ return delivery;
414
+ });
415
+
416
+ const observe = Effect.fn("Subagent.observeWorker")(function* (
417
+ operation: "inspect" | "await",
418
+ worker: Worker<Name>,
419
+ receipt: Receipt,
420
+ ): Effect.fn.Return<
421
+ WorkerObservation<Success>,
422
+ WorkerError | SubagentProjectionFailure | Failure["Type"],
423
+ | SubagentHost
424
+ | Parameters["DecodingServices"]
425
+ | Output["DecodingServices"]
426
+ | Success["EncodingServices"]
427
+ | Project
428
+ > {
429
+ const service = yield* host;
430
+ const validated = yield* validateWorker(worker, operation);
431
+ const requested = yield* validateReceipt(validated, receipt, operation);
432
+
433
+ const observed = yield* service[operation]({
434
+ worker: validated,
435
+ target: declaration.target,
436
+ receipt: requested,
437
+ });
438
+
439
+ if (!("_tag" in observed)) return yield* WorkerError.make({ operation, reason: "corrupt" });
440
+
441
+ const returned = yield* validateReceipt(validated, observed.receipt, operation);
442
+
443
+ if (!receiptEqual(returned, requested))
444
+ return yield* WorkerError.make({ operation, reason: "receipt-mismatch" });
445
+ if (observed._tag === "Pending") {
446
+ if (operation === "await") return yield* WorkerError.make({ operation, reason: "corrupt" });
447
+
448
+ return { _tag: "Pending", receipt: returned };
449
+ }
450
+
451
+ const base = {
452
+ _tag: "Settled" as const,
453
+ receipt: returned,
454
+ ...(observed.runId === undefined
455
+ ? {}
456
+ : {
457
+ runId: yield* Schema.decodeEffect(RunId)(observed.runId).pipe(
458
+ Effect.mapError((cause) => WorkerError.make({ operation, reason: "corrupt", cause })),
459
+ ),
460
+ }),
461
+ settlementId: yield* Schema.decodeEffect(SettlementId)(observed.settlementId).pipe(
462
+ Effect.mapError((cause) => WorkerError.make({ operation, reason: "corrupt", cause })),
463
+ ),
464
+ };
465
+
466
+ if (observed.outcome === "failed" || observed.outcome === "aborted") {
467
+ return {
468
+ ...base,
469
+ outcome: observed.outcome,
470
+ ...(observed.diagnostic === undefined
471
+ ? {}
472
+ : {
473
+ diagnostic: yield* Schema.decodeEffect(FailureDiagnostic.Failure)(
474
+ observed.diagnostic,
475
+ ).pipe(
476
+ Effect.mapError((cause) =>
477
+ WorkerError.make({ operation, reason: "corrupt", cause }),
478
+ ),
479
+ ),
480
+ }),
481
+ failure: SubagentExecutionFailure.make({
482
+ delegationId: declaration.delegationId,
483
+ targetAgentId: declaration.target.id,
484
+ classification: observed.outcome === "failed" ? "child-failed" : "child-aborted",
485
+ childThreadId: worker.threadId,
486
+ childSubmissionId: returned.submissionId,
487
+ ...(base.runId === undefined ? {} : { childRunId: base.runId }),
488
+ errorTag: observed.outcome === "failed" ? "WorkerFailed" : "WorkerAborted",
489
+ message:
490
+ observed.outcome === "failed" ? "Worker input failed" : "Worker input was aborted",
491
+ }),
492
+ };
493
+ }
494
+ if (
495
+ observed.outcome !== "completed" ||
496
+ base.runId === undefined ||
497
+ typeof observed.budgetExhausted !== "boolean"
498
+ ) {
499
+ return yield* WorkerError.make({ operation, reason: "corrupt" });
500
+ }
501
+
502
+ const parameters = yield* Schema.decodeUnknownEffect(declaration.parameters)(
503
+ observed.encodedParameters,
504
+ ).pipe(Effect.mapError((cause) => projectionFailure("result", cause)));
505
+
506
+ const output = yield* Schema.decodeUnknownEffect(declaration.target.output)(
507
+ observed.encodedResult,
508
+ ).pipe(Effect.mapError((cause) => projectionFailure("result", cause)));
509
+
510
+ const result = yield* declaration.projectResult(
511
+ output,
512
+ { budgetExhausted: observed.budgetExhausted },
513
+ parameters,
514
+ );
515
+
516
+ const encoded = yield* Schema.encodeEffect(declaration.success)(result).pipe(
517
+ Effect.mapError((cause) => projectionFailure("result", cause)),
518
+ );
519
+
520
+ const json = yield* Schema.decodeUnknownEffect(Schema.Json)(encoded).pipe(
521
+ Effect.mapError((cause) => projectionFailure("result", cause)),
522
+ );
523
+
524
+ const caller = yield* context;
525
+
526
+ if (
527
+ utf8ByteLength(JSON.stringify(json)) >
528
+ (declaration.policy?.maxResultBytes ?? caller.policy.toolResultBounds.maxBytes)
529
+ ) {
530
+ return yield* projectionFailure("result");
531
+ }
532
+
533
+ return yield* Schema.decodeUnknownEffect(Schema.toType(WorkerObservation(declaration.success)))(
534
+ { ...base, outcome: "completed", result },
535
+ ).pipe(Effect.mapError((cause) => projectionFailure("result", cause)));
536
+ });
537
+
538
+ const list = Effect.fn("Subagent.list")(function* (
539
+ options: { readonly limit?: number; readonly after?: ThreadId } = {},
540
+ ) {
541
+ const service = yield* host;
542
+
543
+ const limit = yield* Schema.decodeEffect(
544
+ Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(100)),
545
+ )(options.limit ?? 20).pipe(
546
+ Effect.mapError(() => WorkerError.make({ operation: "list", reason: "capacity" })),
547
+ );
548
+
549
+ const page = yield* service.list({
550
+ delegationId: declaration.delegationId,
551
+ target: declaration.target,
552
+ limit,
553
+ ...(options.after === undefined ? {} : { after: options.after }),
554
+ });
555
+
556
+ const validated = yield* Schema.decodeEffect(WorkerPage)(page).pipe(
557
+ Effect.mapError(() => WorkerError.make({ operation: "list", reason: "corrupt" })),
558
+ );
559
+
560
+ if (validated.items.length > limit)
561
+ return yield* WorkerError.make({ operation: "list", reason: "corrupt" });
562
+ const items = [];
563
+
564
+ for (const item of validated.items) {
565
+ const worker = yield* validateWorker(item.worker, "list");
566
+
567
+ const latestReceipt =
568
+ item.latestReceipt === null
569
+ ? null
570
+ : yield* validateReceipt(worker, item.latestReceipt, "list");
571
+
572
+ items.push({ ...item, worker, latestReceipt });
573
+ }
574
+
575
+ return { items, next: validated.next };
576
+ });
577
+
578
+ const cancel = Effect.fn("Subagent.cancel")(function* (worker: Worker<Name>, receipt: Receipt) {
579
+ const service = yield* host;
580
+ const validated = yield* validateWorker(worker, "cancel");
581
+ const requested = yield* validateReceipt(validated, receipt, "cancel");
582
+
583
+ yield* service.cancel({ worker: validated, target: declaration.target, receipt: requested });
584
+ });
585
+
586
+ return { start, followUp, inspectMessage, observe, list, cancel };
587
+ };
588
+
589
+ /** Retain a first worker input. The same explicit key reuses its durable delivery identity. */
590
+ export const start = <
591
+ const Name extends string,
592
+ Input extends Schema.Top,
593
+ Output extends Schema.Top,
594
+ Parameters extends Schema.Top,
595
+ Success extends Schema.Top,
596
+ Failure extends Schema.Top,
597
+ Prepare,
598
+ Project,
599
+ >(
600
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
601
+ parameters: Parameters["Type"],
602
+ options: { readonly idempotencyKey: IdempotencyKey; readonly budgetScope?: WorkerBudgetScope },
603
+ ) => operations(declaration).start(parameters, options);
604
+
605
+ /** Retain typed follow-up parameters for the same worker Thread; inspect its MessageRef for delivery. */
606
+ export const followUp = <
607
+ const Name extends string,
608
+ Input extends Schema.Top,
609
+ Output extends Schema.Top,
610
+ Parameters extends Schema.Top,
611
+ Success extends Schema.Top,
612
+ Failure extends Schema.Top,
613
+ Prepare,
614
+ Project,
615
+ >(
616
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
617
+ worker: Worker<Name>,
618
+ parameters: Parameters["Type"],
619
+ options: { readonly idempotencyKey: IdempotencyKey },
620
+ ) => operations(declaration).followUp(worker, parameters, options);
621
+
622
+ /** Inspect a continuing worker with the same summary contract returned by list. */
623
+ export const summary = <const Name extends string>(
624
+ declaration: WorkerDeclaration<Name> & { readonly target: AnyDefinition },
625
+ worker: Worker<Name>,
626
+ ) =>
627
+ Effect.gen(function* () {
628
+ const service = yield* host;
629
+
630
+ const validated = yield* Schema.decodeEffect(Worker(declaration))(worker).pipe(
631
+ Effect.mapError(() => WorkerError.make({ operation: "inspect", reason: "worker-mismatch" })),
632
+ );
633
+
634
+ const result = yield* service.summary({ worker: validated, target: declaration.target });
635
+
636
+ const value = yield* Schema.decodeEffect(WorkerSummary)(result).pipe(
637
+ Effect.mapError(() => WorkerError.make({ operation: "inspect", reason: "corrupt" })),
638
+ );
639
+
640
+ if (
641
+ value.worker.threadId !== validated.threadId ||
642
+ value.worker.delegationId !== validated.delegationId ||
643
+ value.worker.targetAgentId !== validated.targetAgentId ||
644
+ (value.latestReceipt !== null && value.latestReceipt.threadId !== validated.threadId)
645
+ )
646
+ return yield* WorkerError.make({ operation: "inspect", reason: "worker-mismatch" });
647
+
648
+ return { ...value, worker: validated };
649
+ });
650
+
651
+ /** Inspect a worker summary, retained MessageRef, or the result of one exact accepted Receipt. */
652
+ export function inspect<
653
+ const Name extends string,
654
+ Input extends Schema.Top,
655
+ Output extends Schema.Top,
656
+ Parameters extends Schema.Top,
657
+ Success extends Schema.Top,
658
+ Failure extends Schema.Top,
659
+ Prepare,
660
+ Project,
661
+ >(
662
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
663
+ worker: Worker<Name>,
664
+ ): ReturnType<typeof summary<Name>>;
665
+
666
+ export function inspect<
667
+ const Name extends string,
668
+ Input extends Schema.Top,
669
+ Output extends Schema.Top,
670
+ Parameters extends Schema.Top,
671
+ Success extends Schema.Top,
672
+ Failure extends Schema.Top,
673
+ Prepare,
674
+ Project,
675
+ >(
676
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
677
+ worker: Worker<Name>,
678
+ receipt: Receipt,
679
+ ): ReturnType<
680
+ ReturnType<
681
+ typeof operations<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>
682
+ >["observe"]
683
+ >;
684
+
685
+ export function inspect<
686
+ const Name extends string,
687
+ Input extends Schema.Top,
688
+ Output extends Schema.Top,
689
+ Parameters extends Schema.Top,
690
+ Success extends Schema.Top,
691
+ Failure extends Schema.Top,
692
+ Prepare,
693
+ Project,
694
+ >(
695
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
696
+ worker: Worker<Name>,
697
+ message: MessageRef,
698
+ ): Effect.Effect<MessageStatus, WorkerError, SubagentHost>;
699
+
700
+ export function inspect<
701
+ const Name extends string,
702
+ Input extends Schema.Top,
703
+ Output extends Schema.Top,
704
+ Parameters extends Schema.Top,
705
+ Success extends Schema.Top,
706
+ Failure extends Schema.Top,
707
+ Prepare,
708
+ Project,
709
+ >(
710
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
711
+ worker: Worker<Name>,
712
+ reference?: Receipt | MessageRef,
713
+ ) {
714
+ return reference === undefined
715
+ ? summary(declaration, worker)
716
+ : "messageId" in reference
717
+ ? operations(declaration).inspectMessage(worker, reference)
718
+ : operations(declaration).observe("inspect", worker, reference);
719
+ }
720
+
721
+ /** Read an authorized finite history snapshot; pass the last emitted sequence to resume. */
722
+ export const observe = <const Name extends string>(
723
+ declaration: WorkerDeclaration<Name> & { readonly target: AnyDefinition },
724
+ worker: Worker<Name>,
725
+ options: { readonly after?: number } = {},
726
+ ) =>
727
+ Stream.unwrap(
728
+ Effect.gen(function* () {
729
+ const service = yield* host;
730
+
731
+ const validated = yield* Schema.decodeEffect(Worker(declaration))(worker).pipe(
732
+ Effect.mapError(() =>
733
+ WorkerError.make({ operation: "observe", reason: "worker-mismatch" }),
734
+ ),
735
+ );
736
+
737
+ const after =
738
+ options.after === undefined
739
+ ? undefined
740
+ : yield* Schema.decodeEffect(Schema.Natural)(options.after).pipe(
741
+ Effect.mapError(() => WorkerError.make({ operation: "observe", reason: "corrupt" })),
742
+ );
743
+
744
+ return service.observe({
745
+ worker: validated,
746
+ target: declaration.target,
747
+ ...(after === undefined ? {} : { after }),
748
+ });
749
+ }),
750
+ );
751
+
752
+ /** Seal a continuing worker, retaining a stable command identity across retries and Runs. */
753
+ export const stop = <const Name extends string>(
754
+ declaration: WorkerDeclaration<Name> & { readonly target: AnyDefinition },
755
+ worker: Worker<Name>,
756
+ options: { readonly idempotencyKey: IdempotencyKey },
757
+ ) =>
758
+ Effect.gen(function* () {
759
+ const service = yield* host;
760
+
761
+ const command = yield* Schema.decodeEffect(WorkerStop)({ worker, ...options }).pipe(
762
+ Effect.mapError((cause) => WorkerError.make({ operation: "stop", reason: "corrupt", cause })),
763
+ );
764
+
765
+ if (
766
+ worker.delegationId !== declaration.delegationId ||
767
+ worker.targetAgentId !== declaration.target.id
768
+ )
769
+ return yield* WorkerError.make({ operation: "stop", reason: "worker-mismatch" });
770
+
771
+ return yield* service.stop({ ...command, target: declaration.target }).pipe(
772
+ Effect.flatMap(Schema.decodeEffect(WorkerStopped)),
773
+ Effect.mapError((cause) =>
774
+ Schema.is(WorkerError)(cause)
775
+ ? cause
776
+ : WorkerError.make({ operation: "stop", reason: "corrupt", cause }),
777
+ ),
778
+ );
779
+ });
780
+
781
+ /** Wait for the exact Receipt. Interrupting this Effect never cancels accepted work. */
782
+ export const awaitWorker = <
783
+ const Name extends string,
784
+ Input extends Schema.Top,
785
+ Output extends Schema.Top,
786
+ Parameters extends Schema.Top,
787
+ Success extends Schema.Top,
788
+ Failure extends Schema.Top,
789
+ Prepare,
790
+ Project,
791
+ >(
792
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
793
+ worker: Worker<Name>,
794
+ receipt: Receipt,
795
+ ) => operations(declaration).observe("await", worker, receipt);
796
+
797
+ /** List only workers visible through the caller-bound host facet. */
798
+ export const list = <
799
+ const Name extends string,
800
+ Input extends Schema.Top,
801
+ Output extends Schema.Top,
802
+ Parameters extends Schema.Top,
803
+ Success extends Schema.Top,
804
+ Failure extends Schema.Top,
805
+ Prepare,
806
+ Project,
807
+ >(
808
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
809
+ options: { readonly limit?: number; readonly after?: ThreadId } = {},
810
+ ) => operations(declaration).list(options);
811
+
812
+ /** Request cancellation of exactly one Receipt; JoinedToHost remains a typed conflict. */
813
+ export const cancel = <
814
+ const Name extends string,
815
+ Input extends Schema.Top,
816
+ Output extends Schema.Top,
817
+ Parameters extends Schema.Top,
818
+ Success extends Schema.Top,
819
+ Failure extends Schema.Top,
820
+ Prepare,
821
+ Project,
822
+ >(
823
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
824
+ worker: Worker<Name>,
825
+ receipt: Receipt,
826
+ ) => operations(declaration).cancel(worker, receipt);
827
+
828
+ /** Opt in to each model-facing operation. Waiting remains programmatic only. */
829
+ export interface BackgroundOptions {
830
+ /** Deliver standard completion and progress messages to the parent. */
831
+ readonly reportToParent?: true;
832
+ readonly start?: true;
833
+ readonly followUp?: true;
834
+ readonly inspect?: true;
835
+ readonly summary?: true;
836
+ readonly list?: true;
837
+ readonly cancel?: true;
838
+ /** Author-owned funding request for starts; every native admission separately authorizes it. */
839
+ readonly budgetScope?: WorkerBudgetScope;
840
+ }
841
+
842
+ type Operation = Exclude<keyof BackgroundOptions, "budgetScope" | "reportToParent">;
843
+ type Suffix = {
844
+ start: "start";
845
+ followUp: "follow_up";
846
+ inspect: "inspect";
847
+ summary: "summary";
848
+ list: "list";
849
+ cancel: "cancel";
850
+ };
851
+
852
+ const ReceiptParameters = <Name extends string>(declaration: WorkerDeclaration<Name>) =>
853
+ Schema.Struct({ worker: Worker(declaration), receipt: Receipt });
854
+
855
+ const InspectParameters = <Name extends string>(declaration: WorkerDeclaration<Name>) =>
856
+ Schema.Struct({
857
+ worker: Worker(declaration),
858
+ message: Schema.optionalKey(MessageRef),
859
+ receipt: Schema.optionalKey(Receipt),
860
+ }).check(
861
+ Schema.makeFilter(
862
+ ({ message, receipt }) => (message === undefined) !== (receipt === undefined),
863
+ { message: "Provide exactly one retained message reference or accepted receipt" },
864
+ ),
865
+ );
866
+
867
+ const Inspection = <Success extends Schema.Top>(success: Success) =>
868
+ Schema.Union([MessageStatus, toolObservation(success)]);
869
+
870
+ const WorkerParameters = <Name extends string>(declaration: WorkerDeclaration<Name>) =>
871
+ Schema.Struct({ worker: Worker(declaration) });
872
+
873
+ const Summary = <Name extends string>(declaration: WorkerDeclaration<Name>) =>
874
+ Schema.Struct({
875
+ ...WorkerSummary.fields,
876
+ worker: Worker(declaration),
877
+ });
878
+
879
+ const FollowUpParameters = <Name extends string, Parameters extends Schema.Top>(
880
+ declaration: WorkerDeclaration<Name>,
881
+ parameters: Parameters,
882
+ ) => Schema.Struct({ worker: Worker(declaration), parameters });
883
+
884
+ const ListParameters = Schema.Struct({
885
+ limit: Schema.optionalKey(
886
+ Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(100)),
887
+ ),
888
+ after: Schema.optionalKey(ThreadId),
889
+ });
890
+
891
+ const Started = <Name extends string>(declaration: WorkerDeclaration<Name>) =>
892
+ Schema.Struct({ worker: Worker(declaration), delivery: MessageStatus }).check(
893
+ Schema.makeFilter(
894
+ ({ worker, delivery }) =>
895
+ delivery.receipt === null || worker.threadId === delivery.receipt.threadId,
896
+ ),
897
+ );
898
+
899
+ const Page = <Name extends string>(declaration: WorkerDeclaration<Name>) =>
900
+ Schema.Struct({
901
+ items: Schema.Array(
902
+ Schema.Struct({
903
+ worker: Worker(declaration),
904
+ latestReceipt: Schema.NullOr(Receipt),
905
+ state: Schema.Literals(["starting", "active", "idle"]),
906
+ }),
907
+ ).check(Schema.isMaxLength(100)),
908
+ next: Schema.NullOr(ThreadId),
909
+ });
910
+
911
+ const preparationFailure = <Failure extends Schema.Top>(failure: Failure) =>
912
+ Schema.Union([failure, SubagentProjectionFailure, WorkerError]);
913
+
914
+ const startFailure = <Failure extends Schema.Top>(failure: Failure) =>
915
+ Schema.Union([failure, SubagentProjectionFailure, SubagentPrestartDenied, WorkerError]);
916
+
917
+ const cancelFailure = Schema.Union([WorkerError, JoinedToHost]);
918
+
919
+ type ToolSchemas<
920
+ Name extends string,
921
+ Parameters extends Schema.Top,
922
+ Success extends Schema.Top,
923
+ Failure extends Schema.Top,
924
+ > = {
925
+ start: {
926
+ parameters: Parameters;
927
+ success: ReturnType<typeof Started<Name>>;
928
+ failure: ReturnType<typeof startFailure<Failure>>;
929
+ };
930
+ followUp: {
931
+ parameters: ReturnType<typeof FollowUpParameters<Name, Parameters>>;
932
+ success: typeof MessageStatus;
933
+ failure: ReturnType<typeof preparationFailure<Failure>>;
934
+ };
935
+ inspect: {
936
+ parameters: ReturnType<typeof InspectParameters<Name>>;
937
+ success: ReturnType<typeof Inspection<Success>>;
938
+ failure: ReturnType<typeof preparationFailure<Failure>>;
939
+ };
940
+ summary: {
941
+ parameters: ReturnType<typeof WorkerParameters<Name>>;
942
+ success: ReturnType<typeof Summary<Name>>;
943
+ failure: typeof WorkerError;
944
+ };
945
+ list: {
946
+ parameters: typeof ListParameters;
947
+ success: ReturnType<typeof Page<Name>>;
948
+ failure: typeof WorkerError;
949
+ };
950
+ cancel: {
951
+ parameters: ReturnType<typeof ReceiptParameters<Name>>;
952
+ success: typeof Schema.Void;
953
+ failure: typeof cancelFailure;
954
+ };
955
+ };
956
+
957
+ type BackgroundToolMap<
958
+ Name extends string,
959
+ Parameters extends Schema.Top,
960
+ Success extends Schema.Top,
961
+ Failure extends Schema.Top,
962
+ > = {
963
+ start: Tool.Tool<
964
+ `${Name}_start`,
965
+ ToolSchemas<Name, Parameters, Success, Failure>["start"] & { readonly failureMode: "error" },
966
+ SubagentHost | Crypto.Crypto
967
+ >;
968
+ followUp: Tool.Tool<
969
+ `${Name}_follow_up`,
970
+ ToolSchemas<Name, Parameters, Success, Failure>["followUp"] & { readonly failureMode: "error" },
971
+ SubagentHost | Crypto.Crypto
972
+ >;
973
+ inspect: Tool.Tool<
974
+ `${Name}_inspect`,
975
+ ToolSchemas<Name, Parameters, Success, Failure>["inspect"] & { readonly failureMode: "error" },
976
+ SubagentHost
977
+ >;
978
+ summary: Tool.Tool<
979
+ `${Name}_summary`,
980
+ ToolSchemas<Name, Parameters, Success, Failure>["summary"] & { readonly failureMode: "error" },
981
+ SubagentHost
982
+ >;
983
+ list: Tool.Tool<
984
+ `${Name}_list`,
985
+ ToolSchemas<Name, Parameters, Success, Failure>["list"] & { readonly failureMode: "error" },
986
+ SubagentHost
987
+ >;
988
+ cancel: Tool.Tool<
989
+ `${Name}_cancel`,
990
+ ToolSchemas<Name, Parameters, Success, Failure>["cancel"] & { readonly failureMode: "error" },
991
+ SubagentHost
992
+ >;
993
+ };
994
+
995
+ /**
996
+ * Native Tool names and schemas expose statically guaranteed selections. The handler Layer also
997
+ * requires services for operations whose conditional flags may enable them at runtime.
998
+ */
999
+ export type BackgroundTools<
1000
+ Name extends string,
1001
+ Parameters extends Schema.Top,
1002
+ Success extends Schema.Top,
1003
+ Failure extends Schema.Top,
1004
+ Selected extends BackgroundOptions,
1005
+ > = {
1006
+ readonly [
1007
+ Op in Operation as Selected[Op] extends true ? `${Name}_${Suffix[Op]}` : never
1008
+ ]: BackgroundToolMap<Name, Parameters, Success, Failure>[Op];
1009
+ };
1010
+
1011
+ const modelKey = Effect.fn("Subagent.workerToolKey")(function* (operation: "start" | "followUp") {
1012
+ const service = yield* host;
1013
+ const caller = yield* service.context;
1014
+
1015
+ if (caller.source._tag !== "tool")
1016
+ return yield* WorkerError.make({ operation, reason: "denied" });
1017
+ const source = caller.source;
1018
+ const crypto = yield* Crypto.Crypto;
1019
+
1020
+ const bytes = utf8Bytes(
1021
+ JSON.stringify([
1022
+ "worker-tool-v1",
1023
+ operation,
1024
+ source.agentId,
1025
+ source.threadId,
1026
+ source.runId,
1027
+ source.toolCallId,
1028
+ ]),
1029
+ );
1030
+
1031
+ const digest = yield* crypto
1032
+ .digest("SHA-256", bytes)
1033
+ .pipe(Effect.mapError(() => WorkerError.make({ operation, reason: "unavailable" })));
1034
+
1035
+ return yield* Schema.decodeEffect(IdempotencyKey)(`worker:${Encoding.encodeHex(digest)}`).pipe(
1036
+ Effect.mapError(() => WorkerError.make({ operation, reason: "unavailable" })),
1037
+ );
1038
+ });
1039
+
1040
+ // Construction-local service keys distinguish projections for co-registered parent versions.
1041
+ // These keys are never persisted; worker/run identity and registration digests remain canonical.
1042
+ let reportingServiceId = 0;
1043
+
1044
+ /**
1045
+ * Derive optional native AI Tools and their handler Layer from one immutable declaration.
1046
+ * Projection services are captured by the Layer; the host and stable-key Crypto service remain
1047
+ * invocation dependencies. The attached `.tool` and its suspension behavior are unchanged.
1048
+ */
1049
+ export const background = <
1050
+ const Name extends string,
1051
+ Input extends Schema.Top,
1052
+ Output extends Schema.Top,
1053
+ Parameters extends Schema.Top,
1054
+ Success extends Schema.Top,
1055
+ Failure extends Schema.Top,
1056
+ Prepare,
1057
+ Project,
1058
+ const Selected extends BackgroundOptions,
1059
+ >(
1060
+ declaration: Declaration<Name, Input, Output, Parameters, Success, Failure, Prepare, Project>,
1061
+ selected: Selected,
1062
+ ) => {
1063
+ const report = selected.reportToParent === true ? automaticReporting(declaration) : undefined;
1064
+
1065
+ const reportService = Context.Service<WorkerReporting<WorkerReportPreparationFailure>>(
1066
+ `@effect-agent/capabilities/BackgroundReport/${declaration.name}/${reportingServiceId++}`,
1067
+ );
1068
+
1069
+ const descriptor: WorkerReporting<WorkerReportPreparationFailure> | undefined =
1070
+ report === undefined
1071
+ ? undefined
1072
+ : {
1073
+ ...report,
1074
+ prepare: (value) =>
1075
+ Effect.flatMap(Effect.serviceOption(reportService), (service) =>
1076
+ Option.isSome(service)
1077
+ ? service.value.prepare(value)
1078
+ : WorkerReportPreparationFailure.make({ stage: "preparation" }),
1079
+ ),
1080
+ };
1081
+
1082
+ const ops = operations(declaration);
1083
+ const failure = preparationFailure(declaration.failure);
1084
+ const receiptParameters = ReceiptParameters(declaration);
1085
+
1086
+ const startTool = Tool.make(`${declaration.name}_start` as const, {
1087
+ description: `Retain input for a background ${declaration.name} worker and return its delivery state. Pending confirms retention only; inspect the same message instead of starting another worker.`,
1088
+ parameters: declaration.parameters,
1089
+ success: Started(declaration),
1090
+ failure: startFailure(declaration.failure),
1091
+ })
1092
+ .annotate(WorkerOperationTool, true)
1093
+ .annotate(BackgroundSpawnTool, true)
1094
+ .addDependency(SubagentHost)
1095
+ .addDependency(Crypto.Crypto);
1096
+
1097
+ const followUpTool = Tool.make(`${declaration.name}_follow_up` as const, {
1098
+ description: `Retain typed follow-up input for an existing ${declaration.name} worker. Pending is retained, not executed: inspect the same message instead of sending the command again.`,
1099
+ parameters: FollowUpParameters(declaration, declaration.parameters),
1100
+ success: MessageStatus,
1101
+ failure,
1102
+ })
1103
+ .annotate(WorkerOperationTool, true)
1104
+ .addDependency(SubagentHost)
1105
+ .addDependency(Crypto.Crypto);
1106
+
1107
+ const inspectTool = Tool.make(`${declaration.name}_inspect` as const, {
1108
+ description: `Inspect one ${declaration.name} delivery by message reference, or its execution result by accepted receipt. Provide exactly one reference; inspection never resends input.`,
1109
+ parameters: InspectParameters(declaration),
1110
+ success: Inspection(declaration.success),
1111
+ failure,
1112
+ })
1113
+ .annotate(WorkerOperationTool, true)
1114
+ .addDependency(SubagentHost);
1115
+
1116
+ const summaryTool = Tool.make(`${declaration.name}_summary` as const, {
1117
+ description: `Inspect ${declaration.name}'s continuing worker state and latest accepted input.`,
1118
+ parameters: WorkerParameters(declaration),
1119
+ success: Summary(declaration),
1120
+ failure: WorkerError,
1121
+ })
1122
+ .annotate(WorkerOperationTool, true)
1123
+ .addDependency(SubagentHost);
1124
+
1125
+ const listTool = Tool.make(`${declaration.name}_list` as const, {
1126
+ description: `List visible ${declaration.name} workers.`,
1127
+ parameters: ListParameters,
1128
+ success: Page(declaration),
1129
+ failure: WorkerError,
1130
+ })
1131
+ .annotate(WorkerOperationTool, true)
1132
+ .addDependency(SubagentHost);
1133
+
1134
+ const cancelTool = Tool.make(`${declaration.name}_cancel` as const, {
1135
+ description: `Request cancellation of one exact ${declaration.name} Receipt.`,
1136
+ parameters: receiptParameters,
1137
+ success: Schema.Void,
1138
+ failure: cancelFailure,
1139
+ })
1140
+ .annotate(WorkerOperationTool, true)
1141
+ .addDependency(SubagentHost);
1142
+
1143
+ const available = {
1144
+ start: startTool,
1145
+ followUp: followUpTool,
1146
+ inspect: inspectTool,
1147
+ summary: summaryTool,
1148
+ list: listTool,
1149
+ cancel: cancelTool,
1150
+ };
1151
+
1152
+ const chosen = Object.entries(available)
1153
+ .filter(([operation]) => selected[operation as Operation] === true)
1154
+ .map(([, tool]) => tool.annotate(BackgroundReporting, descriptor));
1155
+
1156
+ type Tools = BackgroundTools<Name, Parameters, Success, Failure, Selected>;
1157
+ // The mapped keys depend on literal selection flags; the runtime filter applies exactly those flags.
1158
+ const toolkit = Toolkit.make(...chosen) as unknown as Toolkit.Toolkit<Tools>;
1159
+
1160
+ type PrepareServices = Prepare | Parameters["EncodingServices"] | Input["EncodingServices"];
1161
+ type ProjectServices =
1162
+ | Project
1163
+ | Parameters["DecodingServices"]
1164
+ | Output["DecodingServices"]
1165
+ | Success["EncodingServices"];
1166
+ type Services = PrepareServices | ProjectServices;
1167
+ type SelectionServices<Flag, Requirements> = Flag extends true ? Requirements : never;
1168
+
1169
+ const build = Effect.gen(function* () {
1170
+ const captured = yield* Effect.context<Services>();
1171
+
1172
+ const handlers = {
1173
+ [startTool.name]: (parameters: Parameters["Type"]) =>
1174
+ Effect.gen(function* () {
1175
+ const service = yield* host;
1176
+ const idempotencyKey = yield* modelKey("start");
1177
+
1178
+ return yield* ops
1179
+ .start(parameters, {
1180
+ idempotencyKey,
1181
+ ...(selected.budgetScope === undefined ? {} : { budgetScope: selected.budgetScope }),
1182
+ })
1183
+ .pipe(Effect.provideService(SubagentHost, service), Effect.provide(captured));
1184
+ }),
1185
+ [followUpTool.name]: (parameters: {
1186
+ readonly worker: Worker<Name>;
1187
+ readonly parameters: Parameters["Type"];
1188
+ }) =>
1189
+ Effect.gen(function* () {
1190
+ const service = yield* host;
1191
+ const idempotencyKey = yield* modelKey("followUp");
1192
+
1193
+ return yield* ops
1194
+ .followUp(parameters.worker, parameters.parameters, { idempotencyKey })
1195
+ .pipe(Effect.provideService(SubagentHost, service), Effect.provide(captured));
1196
+ }),
1197
+ [inspectTool.name]: (parameters: {
1198
+ readonly worker: Worker<Name>;
1199
+ readonly message?: MessageRef;
1200
+ readonly receipt?: Receipt;
1201
+ }) =>
1202
+ Effect.gen(function* () {
1203
+ const service = yield* host;
1204
+
1205
+ if (parameters.message !== undefined)
1206
+ return yield* ops.inspectMessage(parameters.worker, parameters.message);
1207
+ if (parameters.receipt === undefined)
1208
+ return yield* WorkerError.make({ operation: "inspect", reason: "message-mismatch" });
1209
+
1210
+ return yield* ops.observe("inspect", parameters.worker, parameters.receipt).pipe(
1211
+ Effect.map((observed) => {
1212
+ if ("diagnostic" in observed) {
1213
+ const { diagnostic: _diagnostic, ...projected } = observed;
1214
+
1215
+ return projected;
1216
+ }
1217
+
1218
+ return observed;
1219
+ }),
1220
+ Effect.provideService(SubagentHost, service),
1221
+ Effect.provide(captured),
1222
+ );
1223
+ }),
1224
+ [listTool.name]: (parameters: typeof ListParameters.Type) => ops.list(parameters),
1225
+ [summaryTool.name]: (parameters: { readonly worker: Worker<Name> }) =>
1226
+ summary(declaration, parameters.worker),
1227
+ [cancelTool.name]: (parameters: {
1228
+ readonly worker: Worker<Name>;
1229
+ readonly receipt: Receipt;
1230
+ }) => ops.cancel(parameters.worker, parameters.receipt),
1231
+ };
1232
+
1233
+ // Each handler above is paired with its native schema; computed generic names need this bridge.
1234
+ return handlers as unknown as Toolkit.HandlersFrom<Tools>;
1235
+ });
1236
+
1237
+ type SelectedServices =
1238
+ | SelectionServices<Selected["start"], PrepareServices>
1239
+ | SelectionServices<Selected["followUp"], PrepareServices>
1240
+ | SelectionServices<Selected["inspect"], ProjectServices>
1241
+ | SelectionServices<Selected["reportToParent"], Exclude<ProjectServices, Scope.Scope>>;
1242
+
1243
+ // Unselected handlers are never installed. Only selected operations consume projection services.
1244
+ const reportingLayer =
1245
+ report === undefined
1246
+ ? Layer.empty
1247
+ : Layer.effect(
1248
+ reportService,
1249
+ Effect.map(
1250
+ Effect.context<Effect.Services<ReturnType<typeof report.prepare>>>(),
1251
+ (context): WorkerReporting<WorkerReportPreparationFailure> => ({
1252
+ ...report,
1253
+ prepare: (value) =>
1254
+ Effect.scoped(Effect.suspend(() => report.prepare(value))).pipe(
1255
+ Effect.provide(context),
1256
+ Effect.mapError((error) =>
1257
+ Schema.is(WorkerReportPreparationFailure)(error)
1258
+ ? error
1259
+ : WorkerReportPreparationFailure.make({ stage: "preparation" }),
1260
+ ),
1261
+ ),
1262
+ }),
1263
+ ),
1264
+ );
1265
+
1266
+ const layer = Layer.merge(toolkit.toLayer(build), reportingLayer) as Layer.Layer<
1267
+ Tool.HandlersFor<Tools>,
1268
+ never,
1269
+ SelectedServices
1270
+ >;
1271
+
1272
+ return Object.freeze({ tools: toolkit.tools, toolkit, layer });
1273
+ };