@yielded/agent 0.1.0-beta.173 → 0.1.0-beta.175

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 (266) hide show
  1. package/dist/{Admin-BX9ns28E.d.mts → Admin-Qa3I1oA5.d.mts} +61 -21
  2. package/dist/{Agent-9aBoIi74.d.mts → Agent-B39jRnFv.d.mts} +2 -2
  3. package/dist/{Agent-0WvBWWbM.mjs → Agent-BiRbr73L.mjs} +7 -6
  4. package/dist/Agent-BiRbr73L.mjs.map +1 -0
  5. package/dist/{AgentRuntime-BfP14534.d.mts → AgentRuntime-CHDyRbSf.d.mts} +12 -12
  6. package/dist/{AgentRuntime-CQ-qcETl.mjs → AgentRuntime-DaDKMasp.mjs} +290 -273
  7. package/dist/AgentRuntime-DaDKMasp.mjs.map +1 -0
  8. package/dist/{Digest-DCuPlhNk.mjs → Digest-C3EODOee.mjs} +42 -15
  9. package/dist/Digest-C3EODOee.mjs.map +1 -0
  10. package/dist/{DurableAgentRuntime-BAmSkWYr.mjs → DurableAgentRuntime-CPlw5_7e.mjs} +1557 -1458
  11. package/dist/DurableAgentRuntime-CPlw5_7e.mjs.map +1 -0
  12. package/dist/{EventSource-BwliwQz9.d.mts → EventSource-BTu68yDW.d.mts} +2 -2
  13. package/dist/InMemory.d.mts +2 -2
  14. package/dist/{MessageDelivery-B943ebI_.d.mts → MessageDelivery-DjAZJ4Fd.d.mts} +42 -42
  15. package/dist/{Messaging-C_6OOg_s.d.mts → Messaging-SVu6rWV8.d.mts} +12 -6
  16. package/dist/{MessagingHost-B8oKM7AC.d.mts → MessagingHost-C6SOAcoG.d.mts} +2 -2
  17. package/dist/{MessagingHost-CRUK4JBi.mjs → MessagingHost-CZCyrnvJ.mjs} +27 -26
  18. package/dist/MessagingHost-CZCyrnvJ.mjs.map +1 -0
  19. package/dist/{Output-Dsx6k52t.d.mts → Output-CRamN1Fy.d.mts} +2 -2
  20. package/dist/{PreparedInputAdmission-CxSJSiTl.d.mts → PreparedInputAdmission-wgY4JMZY.d.mts} +3 -3
  21. package/dist/{Records-BiuJDWNe.mjs → Records-DzL4Kbtw.mjs} +2 -2
  22. package/dist/{Records-BiuJDWNe.mjs.map → Records-DzL4Kbtw.mjs.map} +1 -1
  23. package/dist/{RunContinuation-FHM7XPjq.d.mts → RunContinuation-3jB5pULC.d.mts} +13 -7
  24. package/dist/{RunContinuation-DHYNAQFi.mjs → RunContinuation-BiyKJK32.mjs} +173 -82
  25. package/dist/RunContinuation-BiyKJK32.mjs.map +1 -0
  26. package/dist/{RunJournal-kfKVxJj7.mjs → RunJournal-CPMKcfd0.mjs} +106 -73
  27. package/dist/RunJournal-CPMKcfd0.mjs.map +1 -0
  28. package/dist/{RunOptions-D8zxFIrZ.d.mts → RunOptions-Be77lKVZ.d.mts} +2 -2
  29. package/dist/{RunStorage-uqPxps09.mjs → RunStorage-CzutHJBE.mjs} +10 -6
  30. package/dist/RunStorage-CzutHJBE.mjs.map +1 -0
  31. package/dist/{Scheduling-CVyfXlBR.mjs → Scheduling-07_dsGED.mjs} +12 -12
  32. package/dist/Scheduling-07_dsGED.mjs.map +1 -0
  33. package/dist/{Subagent-vpffemql.mjs → Subagent-CexndZSp.mjs} +53 -40
  34. package/dist/Subagent-CexndZSp.mjs.map +1 -0
  35. package/dist/{Subagent-E6tvd7-k.d.mts → Subagent-xhN_aD1r.d.mts} +20 -9
  36. package/dist/{SubagentHost-B6w2m-SI.d.mts → SubagentHost-D1xBgn9g.d.mts} +2 -2
  37. package/dist/{Subscription-DONig54Q.d.mts → Subscription-DmIHlOJK.d.mts} +2 -2
  38. package/dist/{SubscriptionInput-mJIRxWJM.d.mts → SubscriptionInput-DgcQhvbe.d.mts} +2 -2
  39. package/dist/{Thread-dk-QiNml.d.mts → Thread-DzdJAY4J.d.mts} +4 -3
  40. package/dist/{ThreadHistory-ByxS8HU1.d.mts → ThreadHistory-KPPBJLJb.d.mts} +12 -2
  41. package/dist/{ThreadImport-DckUMEqJ.mjs → ThreadImport-CjlG57vH.mjs} +9 -9
  42. package/dist/ThreadImport-CjlG57vH.mjs.map +1 -0
  43. package/dist/{ThreadImport-DpHxjBrA.d.mts → ThreadImport-DP-vOk2F.d.mts} +5 -5
  44. package/dist/{ThreadStore-CEekRa80.mjs → ThreadStore-EuUilthA.mjs} +162 -85
  45. package/dist/ThreadStore-EuUilthA.mjs.map +1 -0
  46. package/dist/{ThreadTransfer-B4gTQLIl.mjs → ThreadTransfer-DB_zsrtJ.mjs} +4 -4
  47. package/dist/{ThreadTransfer-B4gTQLIl.mjs.map → ThreadTransfer-DB_zsrtJ.mjs.map} +1 -1
  48. package/dist/{WorkerAdmission-DFVbbVh2.mjs → WorkerAdmission-eBeXt_mu.mjs} +5 -5
  49. package/dist/{WorkerAdmission-DFVbbVh2.mjs.map → WorkerAdmission-eBeXt_mu.mjs.map} +1 -1
  50. package/dist/{agent-registration-ByMZ_cK5.mjs → agent-registration-a6QYaG3h.mjs} +70 -57
  51. package/dist/agent-registration-a6QYaG3h.mjs.map +1 -0
  52. package/dist/capabilities/Approval.mjs +2 -2
  53. package/dist/capabilities/Approval.mjs.map +1 -1
  54. package/dist/capabilities/BrowserUse.d.mts +102 -1867
  55. package/dist/capabilities/BrowserUse.mjs +74 -798
  56. package/dist/capabilities/BrowserUse.mjs.map +1 -1
  57. package/dist/capabilities/Budget.mjs +3 -1
  58. package/dist/capabilities/Budget.mjs.map +1 -1
  59. package/dist/capabilities/CodeMode.d.mts +1 -1
  60. package/dist/capabilities/CodeMode.mjs +16 -9
  61. package/dist/capabilities/CodeMode.mjs.map +1 -1
  62. package/dist/capabilities/Commands.d.mts +1 -1
  63. package/dist/capabilities/McpClient.mjs +1 -1
  64. package/dist/capabilities/McpClient.mjs.map +1 -1
  65. package/dist/capabilities/Messaging.d.mts +1 -1
  66. package/dist/capabilities/Messaging.mjs +5 -5
  67. package/dist/capabilities/Messaging.mjs.map +1 -1
  68. package/dist/capabilities/ModelContext.d.mts +1 -1
  69. package/dist/capabilities/ModelContext.mjs +7 -5
  70. package/dist/capabilities/ModelContext.mjs.map +1 -1
  71. package/dist/capabilities/Redaction.mjs +49 -19
  72. package/dist/capabilities/Redaction.mjs.map +1 -1
  73. package/dist/capabilities/RunHooks.d.mts +2 -2
  74. package/dist/capabilities/RunHooks.mjs +1 -1
  75. package/dist/capabilities/RunHooks.mjs.map +1 -1
  76. package/dist/capabilities/Subagent.d.mts +1 -1
  77. package/dist/capabilities/Subagent.mjs +1 -1
  78. package/dist/capabilities/SubagentReservations.mjs +3 -1
  79. package/dist/capabilities/SubagentReservations.mjs.map +1 -1
  80. package/dist/capabilities/WebCapture.mjs.map +1 -1
  81. package/dist/capabilities/WebSearch.mjs +7 -7
  82. package/dist/capabilities/WebSearch.mjs.map +1 -1
  83. package/dist/core/Agent.d.mts +1 -1
  84. package/dist/core/Agent.mjs +1 -1
  85. package/dist/core/AgentUpdates.mjs +8 -8
  86. package/dist/core/AgentUpdates.mjs.map +1 -1
  87. package/dist/core/Thread.d.mts +2 -2
  88. package/dist/core/Thread.mjs +6 -4
  89. package/dist/core/Thread.mjs.map +1 -1
  90. package/dist/core/Usage.mjs +2 -2
  91. package/dist/core/Usage.mjs.map +1 -1
  92. package/dist/durable/ActivityStore.mjs +1 -1
  93. package/dist/durable/Admin.d.mts +1 -1
  94. package/dist/durable/Admin.mjs +1 -1
  95. package/dist/durable/AgentRegistration.d.mts +1 -1
  96. package/dist/durable/AgentRegistration.mjs +1 -1
  97. package/dist/durable/Certification.d.mts +1 -1
  98. package/dist/durable/CommittedActivity.d.mts +1 -1
  99. package/dist/durable/CommittedActivity.mjs +3 -3
  100. package/dist/durable/Digest.mjs +1 -1
  101. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  102. package/dist/durable/DurableAgentRuntime.mjs +2 -2
  103. package/dist/durable/EventSource.d.mts +1 -1
  104. package/dist/durable/EventSource.mjs +7 -7
  105. package/dist/durable/EventSource.mjs.map +1 -1
  106. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  107. package/dist/durable/LifecyclePublication.d.mts +1 -1
  108. package/dist/durable/LifecyclePublication.mjs +2 -2
  109. package/dist/durable/MessageDelivery.d.mts +1 -1
  110. package/dist/durable/MessageDelivery.mjs +2 -2
  111. package/dist/durable/MessageDeliveryStoreConformance.d.mts +40 -40
  112. package/dist/durable/MessageDeliveryStoreConformance.mjs +2 -2
  113. package/dist/durable/PersistentHistory.d.mts +2 -2
  114. package/dist/durable/PersistentHistory.mjs +4 -4
  115. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  116. package/dist/durable/RecordFormat.mjs +3 -3
  117. package/dist/durable/RecordFormat.mjs.map +1 -1
  118. package/dist/durable/Records.mjs +1 -1
  119. package/dist/durable/Recovery.d.mts +1 -1
  120. package/dist/durable/Recovery.mjs +1 -1
  121. package/dist/durable/RunContinuation.d.mts +2 -2
  122. package/dist/durable/RunContinuation.mjs +3 -3
  123. package/dist/durable/RunJournal.d.mts +2 -2
  124. package/dist/durable/RunJournal.mjs +2 -2
  125. package/dist/durable/RunStorage.d.mts +1 -1
  126. package/dist/durable/RunStorage.mjs +1 -1
  127. package/dist/durable/Schedule.mjs +1 -1
  128. package/dist/durable/ScheduleStoreConformance.mjs +1 -1
  129. package/dist/durable/ScheduleTransition.mjs +1 -1
  130. package/dist/durable/Scheduling.d.mts +1 -1
  131. package/dist/durable/Scheduling.mjs +1 -1
  132. package/dist/durable/SettlementPublisher.d.mts +1 -1
  133. package/dist/durable/SettlementPublisher.mjs +3 -3
  134. package/dist/durable/SqlMemoryStore.mjs +5 -3
  135. package/dist/durable/SqlMemoryStore.mjs.map +1 -1
  136. package/dist/durable/SubmissionLedger.d.mts +1 -1
  137. package/dist/durable/SubmissionLedger.mjs +11 -3
  138. package/dist/durable/SubmissionLedger.mjs.map +1 -1
  139. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  140. package/dist/durable/SubmissionLedgerConformance.mjs +6 -6
  141. package/dist/durable/SubmissionStatus.d.mts +1 -1
  142. package/dist/durable/Subscription.d.mts +1 -1
  143. package/dist/durable/Subscription.mjs +2 -2
  144. package/dist/durable/SubscriptionInput.d.mts +1 -1
  145. package/dist/durable/SubscriptionInput.mjs +4 -4
  146. package/dist/durable/SubscriptionInput.mjs.map +1 -1
  147. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  148. package/dist/durable/SubscriptionStoreConformance.mjs +3 -3
  149. package/dist/durable/SubscriptionStoreConformance.mjs.map +1 -1
  150. package/dist/durable/SubscriptionTools.d.mts +2 -2
  151. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  152. package/dist/durable/SubscriptionTransition.mjs +1 -1
  153. package/dist/durable/Subscriptions.d.mts +5 -5
  154. package/dist/durable/Subscriptions.mjs +3 -3
  155. package/dist/durable/Subscriptions.mjs.map +1 -1
  156. package/dist/durable/ThreadArchiveRange.d.mts +1 -1
  157. package/dist/durable/ThreadArchiveRange.mjs +1 -1
  158. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  159. package/dist/durable/ThreadContextHistory.mjs +2 -2
  160. package/dist/durable/ThreadContextHistoryProjection.mjs +1 -1
  161. package/dist/durable/ThreadImport.d.mts +1 -1
  162. package/dist/durable/ThreadImport.mjs +1 -1
  163. package/dist/durable/ThreadInvariants.d.mts +3 -3
  164. package/dist/durable/ThreadInvariants.mjs +5 -5
  165. package/dist/durable/ThreadInvariants.mjs.map +1 -1
  166. package/dist/durable/ThreadProjection.mjs +1 -1
  167. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  168. package/dist/durable/ThreadReader.d.mts +1 -1
  169. package/dist/durable/ThreadReader.mjs +1 -1
  170. package/dist/durable/ThreadStore.d.mts +1 -1
  171. package/dist/durable/ThreadStore.mjs +2 -2
  172. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  173. package/dist/durable/ThreadStoreConformance.mjs +4 -4
  174. package/dist/durable/ThreadTransfer.d.mts +1 -1
  175. package/dist/durable/ThreadTransfer.mjs +1 -1
  176. package/dist/durable/ThreadWork.d.mts +2 -2
  177. package/dist/durable/ThreadWork.mjs +12 -6
  178. package/dist/durable/ThreadWork.mjs.map +1 -1
  179. package/dist/durable/ToolReconciler.mjs +1 -1
  180. package/dist/durable/WakeScheduler.mjs +23 -39
  181. package/dist/durable/WakeScheduler.mjs.map +1 -1
  182. package/dist/durable/WorkerAdmission.d.mts +1 -1
  183. package/dist/durable/WorkerAdmission.mjs +1 -1
  184. package/dist/durable/WorkerHost.d.mts +2 -2
  185. package/dist/engine/AgentRuntime.d.mts +1 -1
  186. package/dist/engine/AgentRuntime.mjs +1 -1
  187. package/dist/engine/MessagingHost.d.mts +1 -1
  188. package/dist/engine/MessagingHost.mjs +1 -1
  189. package/dist/engine/Output.d.mts +1 -1
  190. package/dist/engine/Output.mjs +1 -1
  191. package/dist/engine/RunOptions.d.mts +1 -1
  192. package/dist/engine/SubagentHost.d.mts +1 -1
  193. package/dist/engine/ThreadHistory.d.mts +1 -1
  194. package/dist/engine/ThreadHistory.mjs +3 -2
  195. package/dist/engine/ThreadHistory.mjs.map +1 -1
  196. package/dist/index.d.mts +21 -21
  197. package/dist/index.mjs +16 -16
  198. package/dist/{output-contract-CMIhu4Cw.mjs → output-contract-DCnLYCdp.mjs} +12 -15
  199. package/dist/{output-contract-CMIhu4Cw.mjs.map → output-contract-DCnLYCdp.mjs.map} +1 -1
  200. package/dist/{run-context-reader-OcsZr4bk.d.mts → run-context-reader-DVhJZ1Qe.d.mts} +2 -2
  201. package/package.json +1 -1
  202. package/src/capabilities/Approval.ts +58 -60
  203. package/src/capabilities/BrowserUse.ts +89 -944
  204. package/src/capabilities/Budget.ts +8 -1
  205. package/src/capabilities/CodeMode.ts +57 -33
  206. package/src/capabilities/McpClient.ts +2 -2
  207. package/src/capabilities/Messaging.ts +51 -55
  208. package/src/capabilities/ModelContext.ts +5 -2
  209. package/src/capabilities/Redaction.ts +64 -34
  210. package/src/capabilities/RunHooks.ts +52 -55
  211. package/src/capabilities/Subagent.ts +33 -33
  212. package/src/capabilities/SubagentReservations.ts +9 -1
  213. package/src/capabilities/WebCapture.ts +6 -0
  214. package/src/capabilities/WebSearch.ts +10 -7
  215. package/src/capabilities/internal/subagent-background.ts +202 -158
  216. package/src/core/Agent.ts +11 -6
  217. package/src/core/AgentUpdates.ts +8 -8
  218. package/src/core/Thread.ts +142 -146
  219. package/src/core/Usage.ts +7 -8
  220. package/src/core/internal/agent-updates.ts +1 -0
  221. package/src/durable/DurableAgentRuntime.ts +1024 -829
  222. package/src/durable/EventSource.ts +15 -9
  223. package/src/durable/RecordFormat.ts +5 -3
  224. package/src/durable/RunContinuation.ts +316 -113
  225. package/src/durable/RunJournal.ts +106 -114
  226. package/src/durable/RunStorage.ts +129 -124
  227. package/src/durable/Scheduling.ts +639 -651
  228. package/src/durable/SqlMemoryStore.ts +8 -6
  229. package/src/durable/SubmissionLedger.ts +11 -0
  230. package/src/durable/SubscriptionInput.ts +5 -3
  231. package/src/durable/SubscriptionStoreConformance.ts +23 -23
  232. package/src/durable/Subscriptions.ts +18 -19
  233. package/src/durable/ThreadImport.ts +18 -19
  234. package/src/durable/ThreadInvariants.ts +2 -1
  235. package/src/durable/ThreadStore.ts +217 -111
  236. package/src/durable/ThreadWork.ts +11 -2
  237. package/src/durable/WakeScheduler.ts +34 -66
  238. package/src/durable/internal/StorageOwner.ts +10 -4
  239. package/src/durable/internal/agent-registration.ts +96 -89
  240. package/src/durable/internal/canonical-json.ts +61 -20
  241. package/src/durable/internal/prompt-history-cache.ts +13 -4
  242. package/src/durable/internal/record-encoding.ts +120 -64
  243. package/src/durable/internal/schedule-time.ts +6 -6
  244. package/src/durable/internal/usage-totals.ts +35 -0
  245. package/src/durable/internal/worker-host.ts +69 -74
  246. package/src/engine/MessagingHost.ts +4 -2
  247. package/src/engine/ThreadHistory.ts +47 -48
  248. package/src/engine/internal/agent-runtime.ts +1298 -1217
  249. package/src/engine/internal/output-contract.ts +15 -15
  250. package/src/engine/internal/primitive-delta.ts +2 -3
  251. package/src/engine/internal/provisional-text.ts +12 -10
  252. package/src/engine/internal/tool-exposure.ts +22 -18
  253. package/src/engine/internal/tool-telemetry.ts +15 -12
  254. package/dist/Agent-0WvBWWbM.mjs.map +0 -1
  255. package/dist/AgentRuntime-CQ-qcETl.mjs.map +0 -1
  256. package/dist/Digest-DCuPlhNk.mjs.map +0 -1
  257. package/dist/DurableAgentRuntime-BAmSkWYr.mjs.map +0 -1
  258. package/dist/MessagingHost-CRUK4JBi.mjs.map +0 -1
  259. package/dist/RunContinuation-DHYNAQFi.mjs.map +0 -1
  260. package/dist/RunJournal-kfKVxJj7.mjs.map +0 -1
  261. package/dist/RunStorage-uqPxps09.mjs.map +0 -1
  262. package/dist/Scheduling-CVyfXlBR.mjs.map +0 -1
  263. package/dist/Subagent-vpffemql.mjs.map +0 -1
  264. package/dist/ThreadImport-DckUMEqJ.mjs.map +0 -1
  265. package/dist/ThreadStore-CEekRa80.mjs.map +0 -1
  266. package/dist/agent-registration-ByMZ_cK5.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scheduling-07_dsGED.mjs","names":["ScheduleTimingRequestSchema","ScheduleDestinationSchema"],"sources":["../src/durable/internal/schedule-time.ts","../src/durable/Scheduling.ts"],"sourcesContent":["import { Cron, DateTime, Option, Result, Schema } from \"effect\";\n\nimport {\n ScheduleValidationError,\n ScheduleInstant,\n type ScheduleSkippedRange,\n type ScheduleTiming,\n type ScheduleTimingRequest,\n} from \"../Schedule.ts\";\n\nconst invalid = (message: string) => Result.fail(ScheduleValidationError.make({ message }));\n\nconst checkedInstant = (millis: number, label: string) =>\n Schema.decodeResult(ScheduleInstant)(millis).pipe(\n Result.mapError(() =>\n ScheduleValidationError.make({\n message: `${label} is outside the supported ScheduleInstant range`,\n }),\n ),\n );\n\nconst values = (set: ReadonlySet<number>, size: number): ReadonlyArray<number> =>\n set.size === 0 ? Array.from({ length: size }, (_, index) => index) : [...set];\n\n/**\n * Cron frequency proof without calendar enumeration. It checks the minimum circular spacing of\n * the allowed hour/minute pairs. Day restrictions may make a rule sparser, so this deliberately\n * rejects some safe rules when a configured minimum exceeds one minute.\n */\nconst validateCronFrequency = (\n cron: Cron.Cron,\n minimumMillis: number,\n): Result.Result<void, ScheduleValidationError> => {\n if (cron.seconds.size !== 1) {\n return invalid(\"Cron must select exactly one seconds value\");\n }\n if (minimumMillis <= 60_000) return Result.succeed(undefined);\n if (\n Option.isSome(cron.tz) &&\n DateTime.isTimeZoneNamed(cron.tz.value) &&\n cron.tz.value.id !== \"UTC\"\n ) {\n return invalid(\"Cron minimums above one minute require UTC or a fixed-offset time zone\");\n }\n\n const minuteOfDay = values(cron.hours, 24).flatMap((hour) =>\n values(cron.minutes, 60).map((minute) => hour * 60 + minute),\n );\n\n minuteOfDay.sort((left, right) => left - right);\n let minimumGap = 24 * 60;\n\n for (let index = 0; index < minuteOfDay.length; index += 1) {\n const current = minuteOfDay[index];\n const next = minuteOfDay[(index + 1) % minuteOfDay.length];\n\n if (current === undefined || next === undefined) continue;\n const gap = next > current ? next - current : 24 * 60 - current + next;\n\n minimumGap = Math.min(minimumGap, gap);\n }\n\n return minimumGap * 60_000 >= minimumMillis\n ? Result.succeed(undefined)\n : invalid(`Cron may fire more often than the configured ${minimumMillis}ms minimum`);\n};\n\nexport const parseScheduleCron = (\n expression: string,\n timeZone: string,\n minimumMillis: number,\n): Result.Result<Cron.Cron, ScheduleValidationError> => {\n const parsed = Cron.parse(expression, timeZone);\n\n if (Result.isFailure(parsed)) return invalid(parsed.failure.message);\n const frequency = validateCronFrequency(parsed.success, minimumMillis);\n\n return Result.isFailure(frequency)\n ? Result.fail(frequency.failure)\n : Result.succeed(parsed.success);\n};\n\nexport const normalizeScheduleTiming = (\n request: ScheduleTimingRequest,\n nowMillis: number,\n minimumMillis: number,\n): Result.Result<ScheduleTiming, ScheduleValidationError> => {\n switch (request._tag) {\n case \"At\":\n return Result.succeed(request);\n case \"After\": {\n const at = checkedInstant(nowMillis + request.delayMillis, \"Relative deadline\");\n\n return Result.map(at, (atMillis) => ({ _tag: \"At\" as const, atMillis }));\n }\n case \"Interval\": {\n if (request.everyMillis < minimumMillis) {\n return invalid(`Interval must be at least ${minimumMillis}ms`);\n }\n\n const anchor = checkedInstant(\n request.anchorMillis ?? nowMillis + request.everyMillis,\n \"Interval anchor\",\n );\n\n return Result.map(anchor, (anchorMillis) => ({\n _tag: \"Interval\" as const,\n everyMillis: request.everyMillis,\n anchorMillis,\n }));\n }\n case \"Cron\": {\n const timeZone = request.timeZone ?? \"UTC\";\n const cron = parseScheduleCron(request.expression, timeZone, minimumMillis);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n return Result.succeed({ _tag: \"Cron\", expression: request.expression, timeZone });\n }\n }\n};\n\nconst parsedStoredCron = (timing: Extract<ScheduleTiming, { _tag: \"Cron\" }>) => {\n const parsed = Cron.parse(timing.expression, timing.timeZone);\n\n return Result.isFailure(parsed)\n ? invalid(`Stored cron is invalid: ${parsed.failure.message}`)\n : Result.succeed(parsed.success);\n};\n\n/** Strictly selects the first occurrence after an instant. */\nexport const scheduleNextAfter = (\n timing: ScheduleTiming,\n afterMillis: number,\n): Result.Result<number | null, ScheduleValidationError> => {\n switch (timing._tag) {\n case \"At\":\n return Result.succeed(timing.atMillis > afterMillis ? timing.atMillis : null);\n case \"Interval\": {\n if (afterMillis < timing.anchorMillis) return Result.succeed(timing.anchorMillis);\n const steps = Math.floor((afterMillis - timing.anchorMillis) / timing.everyMillis) + 1;\n const next = timing.anchorMillis + steps * timing.everyMillis;\n\n return checkedInstant(next, \"Next interval occurrence\");\n }\n case \"Cron\": {\n const cron = parsedStoredCron(timing);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n return Result.try({\n try: () => {\n let next = Cron.next(cron.success, afterMillis).getTime();\n\n // Inside a fall fold Effect may select the first, already elapsed local instant.\n while (next <= afterMillis) {\n const following = Cron.next(cron.success, next).getTime();\n\n if (following <= next) return invalid(\"Cron has no supported next firing\");\n next = following;\n }\n\n return checkedInstant(next, \"Next cron occurrence\");\n },\n catch: () => ScheduleValidationError.make({ message: \"Cron has no supported next firing\" }),\n }).pipe(Result.flatMap((result) => result));\n }\n }\n};\n\n/** Initial cursor. Past one-shots remain due; recurring rules start strictly after registration. */\nexport const scheduleInitialCursor = (\n timing: ScheduleTiming,\n nowMillis: number,\n): Result.Result<number | null, ScheduleValidationError> =>\n timing._tag === \"At\" ? Result.succeed(timing.atMillis) : scheduleNextAfter(timing, nowMillis);\n\nexport interface DueScheduleOccurrence {\n readonly intendedAtMillis: number;\n readonly nextAtMillis: number | null;\n readonly skippedRange: ScheduleSkippedRange | null;\n}\n\n/** Coalesces recurring occurrences using the same forward sequence as registration. */\nexport const scheduleDueOccurrence = (\n timing: ScheduleTiming,\n cursorMillis: number,\n nowMillis: number,\n): Result.Result<DueScheduleOccurrence | null, ScheduleValidationError> => {\n if (cursorMillis > nowMillis) return Result.succeed(null);\n if (timing._tag === \"At\") {\n return Result.succeed({\n intendedAtMillis: cursorMillis,\n nextAtMillis: null,\n skippedRange: null,\n });\n }\n\n let intendedAtMillis: number;\n\n if (timing._tag === \"Interval\") {\n const steps = Math.floor((nowMillis - timing.anchorMillis) / timing.everyMillis);\n\n intendedAtMillis = Math.max(cursorMillis, timing.anchorMillis + steps * timing.everyMillis);\n } else {\n const cron = parsedStoredCron(timing);\n\n if (Result.isFailure(cron)) return Result.fail(cron.failure);\n\n const due = Result.try({\n try: () => {\n let intended = cursorMillis;\n // Reverse traversal is safe only without offset transitions. Named-zone reverse\n // traversal has different gap/fold semantics from the forward occurrence sequence.\n const zone = Option.getOrUndefined(cron.success.tz);\n\n if (zone !== undefined && (DateTime.isTimeZoneOffset(zone) || zone.id === \"UTC\")) {\n intended = Math.max(cursorMillis, Cron.prev(cron.success, nowMillis + 1_000).getTime());\n } else {\n // Seek by calendar date in UTC, where reverse traversal has no DST ambiguity.\n // Include two prior civil days to cover even IANA date-line shifts. There are no\n // matching dates between this seed day and that boundary, so forward traversal\n // visits only the seed day and the recent days, regardless of downtime length.\n const calendar = Cron.make({\n ...cron.success,\n seconds: [0],\n minutes: [0],\n hours: [0],\n tz: DateTime.zoneMakeNamedUnsafe(\"UTC\"),\n });\n\n const localDay = DateTime.makeUnsafe(\n DateTime.toDate(DateTime.makeZonedUnsafe(nowMillis, { timeZone: zone })),\n ).pipe(DateTime.startOf(\"day\"), DateTime.subtract({ days: 2 }));\n\n const seedDay = Cron.prev(calendar, DateTime.toEpochMillis(localDay) + 1_000);\n\n const seed =\n DateTime.makeZonedUnsafe(seedDay, {\n timeZone: zone,\n adjustForTimeZone: true,\n }).pipe(DateTime.toEpochMillis) - 1_000;\n\n if (seed > cursorMillis) {\n const first = Cron.next(cron.success, seed).getTime();\n\n if (first <= nowMillis) intended = Math.max(intended, first);\n }\n }\n let next = Cron.next(cron.success, intended).getTime();\n\n while (next <= nowMillis) {\n if (next <= intended) return invalid(\"Cron has no supported due firing\");\n intended = next;\n next = Cron.next(cron.success, intended).getTime();\n }\n\n return Result.succeed({ intended, next });\n },\n catch: () => ScheduleValidationError.make({ message: \"Cron has no supported due firing\" }),\n }).pipe(Result.flatMap((result) => result));\n\n if (Result.isFailure(due)) return Result.fail(due.failure);\n const next = checkedInstant(due.success.next, \"Next cron occurrence\");\n\n if (Result.isFailure(next)) return Result.fail(next.failure);\n\n return Result.succeed({\n intendedAtMillis: due.success.intended,\n nextAtMillis: next.success,\n skippedRange:\n due.success.intended === cursorMillis\n ? null\n : {\n fromMillis: cursorMillis,\n toMillis: due.success.intended,\n },\n });\n }\n\n const next = scheduleNextAfter(timing, nowMillis);\n\n if (Result.isFailure(next)) return Result.fail(next.failure);\n\n return Result.succeed({\n intendedAtMillis,\n nextAtMillis: next.success,\n skippedRange:\n intendedAtMillis === cursorMillis\n ? null\n : { fromMillis: cursorMillis, toMillis: intendedAtMillis },\n });\n};\n\nexport const scheduleResumeCursor = (\n timing: ScheduleTiming,\n existingCursor: number | null,\n nowMillis: number,\n): Result.Result<number | null, ScheduleValidationError> => {\n if (timing._tag === \"At\") return Result.succeed(existingCursor);\n\n return scheduleNextAfter(timing, nowMillis);\n};\n","import {\n Cause,\n Context,\n Crypto,\n DateTime,\n Effect,\n Layer,\n Option,\n Result,\n Schema,\n Semaphore,\n} from \"effect\";\n\nimport { type AgentId, ThreadId } from \"../core/Identifiers.ts\";\nimport { utf8ByteLength } from \"../core/internal/utf8.ts\";\nimport { digestJson } from \"./Digest.ts\";\nimport type { DurableSubmitAgent } from \"./DurableAgentRuntime.ts\";\nimport {\n normalizeScheduleTiming,\n scheduleDueOccurrence,\n scheduleInitialCursor,\n scheduleNextAfter,\n scheduleResumeCursor,\n} from \"./internal/schedule-time.ts\";\nimport { admitPreparedInput } from \"./PreparedInputAdmission.ts\";\nimport { DefinitionDigests, type Digest, PersistedJson } from \"./Records.ts\";\nimport {\n defaultSchedulingLimits,\n type ScheduleAuthorizationError,\n ScheduleAuthorizer,\n ScheduleConflict,\n type ScheduleConfiguration,\n ScheduleDestination as ScheduleDestinationSchema,\n type ScheduleDestination,\n ScheduleFailpoint,\n type ScheduleId,\n type ScheduleDueCursor,\n ScheduleInstant,\n type ScheduleKey,\n SchedulingLimits,\n ScheduleNotFound,\n type ScheduleOwner,\n type ScheduleRecord,\n type ScheduleRefusal,\n type ScheduleRetryReason,\n type ScheduleScope,\n type ScheduleSnapshot,\n type ScheduleSnapshotPage,\n ScheduleStorageError,\n ScheduleStore,\n type ScheduleStoreFailure,\n ScheduleTimingRequest as ScheduleTimingRequestSchema,\n type ScheduleTimingRequest,\n ScheduleValidationError,\n ScheduledInputAdmission,\n ScheduleWake,\n} from \"./Schedule.ts\";\nimport { type AdmissionFence, IdempotencyKey, type Principal } from \"./SubmissionLedger.ts\";\n\nexport interface ScheduleCreateOptions {\n readonly scope: ScheduleScope;\n readonly scheduleId: ScheduleId;\n readonly timing: ScheduleTimingRequest;\n readonly destination: ScheduleDestination;\n readonly deliveryPrincipal: Principal;\n readonly admissionGroup?: string;\n readonly admissionFence?: AdmissionFence;\n readonly definitions: DefinitionDigests;\n}\n\nexport interface ScheduleUpdateOptions extends ScheduleCreateOptions {\n readonly expectedRevision: number;\n}\n\nexport interface ScheduleListOptions {\n readonly after?: ScheduleId | undefined;\n readonly limit?: number | undefined;\n}\n\nexport type ScheduleManagementFailure =\n | ScheduleValidationError\n | ScheduleAuthorizationError\n | ScheduleStoreFailure;\n\nexport type ScheduleProcessFailure =\n | ScheduleValidationError\n | ScheduleStoreFailure\n | ScheduleStorageError;\n\nconst equivalentDefinitions = Schema.toEquivalence(DefinitionDigests);\nconst equivalentInput = Schema.toEquivalence(PersistedJson);\n\nconst keyOf = (scope: ScheduleScope, scheduleId: ScheduleId): ScheduleKey => ({\n owner: scope.owner,\n scheduleId,\n});\n\nconst notFound = (key: ScheduleKey) => ScheduleNotFound.make({ key });\n\nconst asSnapshot = (record: ScheduleRecord, observedAtMillis: number): ScheduleSnapshot => {\n const intendedAtMillis = record.pending?.envelope.intendedAtMillis ?? record.nextAtMillis;\n\n return {\n owner: record.owner,\n scheduleId: record.scheduleId,\n createdAtMillis: record.createdAtMillis,\n updatedAtMillis: record.updatedAtMillis,\n configurationRevision: record.configurationRevision,\n configuration: {\n timing: record.configuration.timing,\n destination: record.configuration.destination,\n deliveryPrincipal: record.configuration.deliveryPrincipal,\n ...(record.configuration.admissionGroup === undefined\n ? {}\n : { admissionGroup: record.configuration.admissionGroup }),\n ...(record.configuration.admissionFence === undefined\n ? {}\n : { admissionFence: record.configuration.admissionFence }),\n agentId: record.configuration.agentId,\n },\n state: record.state,\n nextAtMillis: record.nextAtMillis,\n pending:\n record.pending === null\n ? null\n : {\n intendedAtMillis: record.pending.envelope.intendedAtMillis,\n preparedAtMillis: record.pending.envelope.preparedAtMillis,\n configurationRevision: record.pending.envelope.configurationRevision,\n occurrenceId: record.pending.envelope.occurrenceId,\n retry: record.pending.retry,\n },\n lastReceipt: record.lastReceipt,\n lastRefusal: record.lastRefusal,\n lastSkippedRange: record.lastSkippedRange,\n observedAtMillis,\n pendingAgeMillis:\n record.pending === null\n ? null\n : Math.max(0, observedAtMillis - record.pending.envelope.preparedAtMillis),\n latenessMillis:\n intendedAtMillis === null ? 0 : Math.max(0, observedAtMillis - intendedAtMillis),\n };\n};\n\nconst inputByteLength = (input: PersistedJson): number => utf8ByteLength(JSON.stringify(input));\n\nconst currentMillis = DateTime.now.pipe(Effect.map(DateTime.toEpochMillis));\n\nconst validateRequestedFields = Effect.fnUntraced(function* (options: ScheduleCreateOptions) {\n yield* Schema.encodeEffect(ScheduleTimingRequestSchema)(options.timing).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid timing request\" })),\n );\n yield* Schema.encodeEffect(ScheduleDestinationSchema)(options.destination).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid destination\" })),\n );\n yield* Schema.encodeEffect(DefinitionDigests)(options.definitions).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid definition digests\" })),\n );\n});\n\nconst resolveInput = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n maximumBytes: number,\n): Effect.fn.Return<\n { readonly payload: PersistedJson; readonly digest: Digest },\n ScheduleValidationError,\n InputSchema[\"EncodingServices\"] | Crypto.Crypto\n> {\n const encoded = yield* Schema.encodeEffect(agent.definition.input)(input).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to encode Agent input\" }),\n ),\n );\n\n const payload = yield* Schema.decodeUnknownEffect(PersistedJson)(encoded).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Agent input does not satisfy the canonical persistence bounds\",\n }),\n ),\n );\n\n if (inputByteLength(payload) > maximumBytes) {\n return yield* ScheduleValidationError.make({\n message: `Encoded Agent input exceeds the configured ${maximumBytes} byte limit`,\n });\n }\n\n const digest = yield* digestJson(payload).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to digest encoded Agent input\" }),\n ),\n );\n\n return { payload, digest };\n});\n\nconst makeManagement = Effect.fnUntraced(function* (limits: SchedulingLimits) {\n const nowMillis = yield* currentMillis;\n\n yield* Schema.decodeEffect(ScheduleInstant)(nowMillis + limits.recoveryPollMillis).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({\n message: \"Scheduling recovery deadline exceeds the supported instant range\",\n }),\n ),\n );\n const store = yield* ScheduleStore;\n const authorizer = yield* ScheduleAuthorizer;\n const wake = yield* ScheduleWake;\n const crypto = yield* Crypto.Crypto;\n\n const withCrypto = <A, E>(effect: Effect.Effect<A, E, Crypto.Crypto>) =>\n Effect.provideService(effect, Crypto.Crypto, crypto);\n\n const fingerprint = Effect.fnUntraced(function* (\n agentId: AgentId,\n inputDigest: Digest,\n options: ScheduleCreateOptions,\n ) {\n const timing = yield* Schema.encodeEffect(ScheduleTimingRequestSchema)(options.timing).pipe(\n Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid timing request\" })),\n );\n\n const destination = yield* Schema.encodeEffect(ScheduleDestinationSchema)(\n options.destination,\n ).pipe(Effect.mapError(() => ScheduleValidationError.make({ message: \"Invalid destination\" })));\n\n const definitions = yield* Schema.encodeEffect(DefinitionDigests)(options.definitions).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Invalid definition digests\" }),\n ),\n );\n\n return yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: options.scope.owner,\n scheduleId: options.scheduleId,\n registeringPrincipal: options.scope.principal,\n deliveryPrincipal: options.deliveryPrincipal,\n ...(options.admissionGroup === undefined ? {} : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined ? {} : { admissionFence: options.admissionFence }),\n agentId,\n definitions,\n destination,\n timing,\n inputDigest,\n }),\n ).pipe(\n Effect.mapError(() =>\n ScheduleValidationError.make({ message: \"Unable to digest Schedule registration\" }),\n ),\n );\n });\n\n const configuration = (\n agentId: AgentId,\n payload: PersistedJson,\n inputDigest: Digest,\n options: ScheduleCreateOptions,\n timing: ScheduleConfiguration[\"timing\"],\n ): ScheduleConfiguration => ({\n timing,\n destination: options.destination,\n deliveryPrincipal: options.deliveryPrincipal,\n ...(options.admissionGroup === undefined ? {} : { admissionGroup: options.admissionGroup }),\n ...(options.admissionFence === undefined ? {} : { admissionFence: options.admissionFence }),\n agentId,\n definitions: options.definitions,\n input: payload,\n inputDigest,\n });\n\n const create = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleCreateOptions,\n ): Effect.fn.Return<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n > {\n const nowMillis = yield* currentMillis;\n\n const resolvedInput = yield* resolveInput(agent, input, limits.maxInputBytes).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const creationFingerprint = yield* fingerprint(\n agent.definition.id,\n resolvedInput.digest,\n options,\n );\n\n const key = keyOf(options.scope, options.scheduleId);\n\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n });\n const existing = yield* store.get(key);\n\n if (existing !== null) {\n if (existing.creationFingerprint !== creationFingerprint) {\n return yield* ScheduleConflict.make({ reason: \"creation\", key });\n }\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: existing.configuration,\n });\n\n return asSnapshot(existing, nowMillis);\n }\n\n const timing = yield* Effect.fromResult(\n normalizeScheduleTiming(options.timing, nowMillis, limits.minIntervalMillis),\n );\n\n const nextAtMillis = yield* Effect.fromResult(scheduleInitialCursor(timing, nowMillis));\n\n if (nextAtMillis === null) {\n return yield* ScheduleValidationError.make({ message: \"Timing has no next occurrence\" });\n }\n\n const nextConfiguration = configuration(\n agent.definition.id,\n resolvedInput.payload,\n resolvedInput.digest,\n options,\n timing,\n );\n\n yield* authorizer.manage({\n operation: \"create\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: nextConfiguration,\n });\n\n const record: ScheduleRecord = {\n schemaVersion: 1,\n owner: options.scope.owner,\n scheduleId: options.scheduleId,\n creationFingerprint,\n createdBy: options.scope.principal,\n createdAtMillis: nowMillis,\n updatedAtMillis: nowMillis,\n configurationRevision: 1,\n version: 1,\n configuration: nextConfiguration,\n state: \"active\",\n nextAtMillis,\n pending: null,\n lastReceipt: null,\n lastRefusal: null,\n lastSkippedRange: null,\n };\n\n const inserted = yield* store.insert(record, limits.maxSchedulesPerOwner);\n\n yield* wake.notify;\n\n return asSnapshot(inserted, nowMillis);\n });\n\n const update = Effect.fnUntraced(function* <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleUpdateOptions,\n ): Effect.fn.Return<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n > {\n const nowMillis = yield* currentMillis;\n const key = keyOf(options.scope, options.scheduleId);\n\n yield* authorizer.manage({\n operation: \"update\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n });\n yield* validateRequestedFields(options);\n const existing = yield* store.get(key);\n\n if (existing === null) return yield* notFound(key);\n if (existing.configurationRevision !== options.expectedRevision) {\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n }\n\n const resolvedInput = yield* resolveInput(agent, input, limits.maxInputBytes).pipe(\n Effect.provideService(Crypto.Crypto, crypto),\n );\n\n const timingRequest =\n options.timing._tag === \"Interval\" &&\n options.timing.anchorMillis === undefined &&\n existing.configuration.timing._tag === \"Interval\" &&\n existing.configuration.timing.everyMillis === options.timing.everyMillis\n ? { ...options.timing, anchorMillis: existing.configuration.timing.anchorMillis }\n : options.timing;\n\n const timing = yield* Effect.fromResult(\n normalizeScheduleTiming(timingRequest, nowMillis, limits.minIntervalMillis),\n );\n\n const nextAtMillis =\n timing._tag === \"At\"\n ? timing.atMillis\n : yield* Effect.fromResult(scheduleNextAfter(timing, nowMillis));\n\n if (nextAtMillis === null) {\n return yield* ScheduleValidationError.make({ message: \"Timing has no next occurrence\" });\n }\n\n const nextConfiguration = configuration(\n agent.definition.id,\n resolvedInput.payload,\n resolvedInput.digest,\n options,\n timing,\n );\n\n yield* authorizer.manage({\n operation: \"update\",\n scope: options.scope,\n scheduleId: options.scheduleId,\n configuration: nextConfiguration,\n });\n\n const changed = yield* store.change(\n key,\n {\n _tag: \"Update\",\n expectedRevision: options.expectedRevision,\n configuration: nextConfiguration,\n nextAtMillis,\n nowMillis,\n },\n limits.maxSchedulesPerOwner,\n );\n\n yield* wake.notify;\n\n return asSnapshot(changed, nowMillis);\n });\n\n const get = Effect.fnUntraced(function* (scope: ScheduleScope, scheduleId: ScheduleId) {\n yield* authorizer.manage({ operation: \"get\", scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n\n return asSnapshot(record, yield* currentMillis);\n });\n\n const list = Effect.fnUntraced(function* (\n scope: ScheduleScope,\n options: ScheduleListOptions = {},\n ) {\n yield* authorizer.manage({ operation: \"list\", scope });\n const limit = options.limit ?? 50;\n\n if (!Number.isInteger(limit) || limit < 1 || limit > 100) {\n return yield* ScheduleValidationError.make({\n message: \"Schedule page limit must be an integer from 1 through 100\",\n });\n }\n\n const page = yield* store.list({\n owner: scope.owner,\n ...(options.after === undefined ? {} : { after: options.after }),\n limit,\n });\n\n const nowMillis = yield* currentMillis;\n\n return { items: page.items.map((record) => asSnapshot(record, nowMillis)), next: page.next };\n });\n\n const control = Effect.fnUntraced(function* (\n operation: \"pause\" | \"resume\" | \"cancel\",\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ): Effect.fn.Return<ScheduleSnapshot, ScheduleManagementFailure> {\n yield* authorizer.manage({ operation, scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n\n const attempt = (): Effect.Effect<ScheduleRecord, ScheduleManagementFailure> =>\n Effect.suspend(() =>\n Effect.gen(function* () {\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n if (record.configurationRevision !== expectedRevision) {\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n }\n if (operation === \"resume\" && record.state === \"active\") return record;\n const nowMillis = yield* currentMillis;\n\n const nextAtMillis =\n operation === \"resume\"\n ? yield* Effect.fromResult(\n scheduleResumeCursor(record.configuration.timing, record.nextAtMillis, nowMillis),\n )\n : operation === \"cancel\"\n ? null\n : record.nextAtMillis;\n\n const skippedRange =\n operation === \"resume\" &&\n record.configuration.timing._tag !== \"At\" &&\n record.nextAtMillis !== null &&\n nextAtMillis !== null &&\n nextAtMillis > record.nextAtMillis\n ? { fromMillis: record.nextAtMillis, toMillis: nextAtMillis }\n : null;\n\n return yield* store\n .change(\n key,\n {\n _tag: \"Control\",\n expectedRevision,\n expectedVersion: record.version,\n action: operation,\n nextAtMillis,\n nowMillis,\n skippedRange,\n },\n limits.maxSchedulesPerOwner,\n )\n .pipe(\n Effect.catchTag(\"ScheduleConflict\", (error) =>\n error.reason === \"revision\" ? attempt() : Effect.fail(error),\n ),\n );\n }),\n );\n\n const changed = yield* attempt();\n\n yield* wake.notify;\n\n return asSnapshot(changed, yield* currentMillis);\n });\n\n const recover = Effect.fn(\"Scheduling.recover\")(function* (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n expectedGeneration: number,\n ) {\n yield* authorizer.manage({ operation: \"recover\", scope, scheduleId });\n const key = keyOf(scope, scheduleId);\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n if (record.configurationRevision !== expectedRevision)\n return yield* ScheduleConflict.make({ reason: \"revision\", key });\n const time = yield* currentMillis;\n\n if (record.pending === null) return asSnapshot(record, time);\n\n const recovered = yield* store.change(key, {\n _tag: \"Recover\",\n expectedGeneration,\n expectedRevision,\n occurrenceId: record.pending.envelope.occurrenceId,\n nowMillis: time,\n });\n\n yield* wake.notify;\n\n return asSnapshot(recovered, time);\n });\n\n return Scheduling.of({\n recover,\n create,\n update,\n get,\n list,\n pause: (scope, id, revision) => control(\"pause\", scope, id, revision),\n resume: (scope, id, revision) => control(\"resume\", scope, id, revision),\n cancel: (scope, id, revision) => control(\"cancel\", scope, id, revision),\n });\n});\n\nconst makeDriver = Effect.fnUntraced(function* (limits: SchedulingLimits) {\n const store = yield* ScheduleStore;\n const authorizer = yield* ScheduleAuthorizer;\n const admission = yield* ScheduledInputAdmission;\n const failpoint = yield* ScheduleFailpoint;\n const crypto = yield* Crypto.Crypto;\n const admissionSemaphore = yield* Semaphore.make(limits.admissionConcurrency);\n\n const withCrypto = <A, E>(effect: Effect.Effect<A, E, Crypto.Crypto>) =>\n Effect.provideService(effect, Crypto.Crypto, crypto);\n\n const retry = Effect.fnUntraced(function* (\n key: ScheduleKey,\n record: ScheduleRecord,\n reason: ScheduleRetryReason,\n nowMillis: number,\n ) {\n if (record.pending === null) return record;\n const current = record.pending.retry;\n\n const delay = Math.min(\n limits.retryBaseMillis * 2 ** Math.min(current.attempts, 52),\n limits.retryMaxMillis,\n );\n\n return yield* store.change(key, {\n _tag: \"Retry\",\n occurrenceId: record.pending.envelope.occurrenceId,\n retry: {\n generation: current.generation,\n attempts: current.attempts + 1,\n automaticAttempts: current.automaticAttempts + 1,\n parked: current.automaticAttempts + 1 >= (limits.maxAutomaticAttempts ?? 8),\n nextAttemptAtMillis: Math.min(nowMillis + delay, 8_640_000_000_000_000),\n lastAttemptAtMillis: nowMillis,\n lastFailure: reason,\n },\n nowMillis,\n });\n });\n\n const verifyPending = Effect.fnUntraced(function* (key: ScheduleKey, record: ScheduleRecord) {\n const pending = record.pending;\n\n if (pending === null) return;\n const envelope = pending.envelope;\n\n const occurrenceId = yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: envelope.owner,\n scheduleId: envelope.scheduleId,\n configurationRevision: envelope.configurationRevision,\n intendedAtMillis: envelope.intendedAtMillis,\n }),\n ).pipe(Effect.mapError(() => corrupt(\"process\")));\n\n const usesCurrentConfiguration =\n envelope.configurationRevision === record.configurationRevision;\n\n const expectedThreadId = usesCurrentConfiguration\n ? record.configuration.destination._tag === \"ExistingThread\"\n ? record.configuration.destination.threadId\n : Schema.decodeSync(ThreadId)(`schedule-thread:${envelope.occurrenceId}`)\n : null;\n\n const expectedAdmissionKey = Schema.decodeSync(IdempotencyKey)(\n `schedule-occurrence:${envelope.occurrenceId}`,\n );\n\n const digest = yield* withCrypto(digestJson(envelope.input)).pipe(\n Effect.mapError(() => corrupt(\"process\")),\n );\n\n if (\n envelope.schemaVersion !== 1 ||\n envelope.owner.tenantId !== key.owner.tenantId ||\n envelope.owner.ownerId !== key.owner.ownerId ||\n envelope.scheduleId !== key.scheduleId ||\n envelope.configurationRevision > record.configurationRevision ||\n envelope.occurrenceId !== occurrenceId ||\n (usesCurrentConfiguration &&\n (envelope.deliveryPrincipal !== record.configuration.deliveryPrincipal ||\n envelope.agentId !== record.configuration.agentId ||\n !equivalentDefinitions(envelope.definitions, record.configuration.definitions) ||\n !equivalentInput(envelope.input, record.configuration.input) ||\n envelope.inputDigest !== record.configuration.inputDigest)) ||\n envelope.inputDigest !== digest ||\n (expectedThreadId !== null && envelope.threadId !== expectedThreadId) ||\n envelope.admissionKey !== expectedAdmissionKey\n ) {\n return yield* corrupt(\"process\");\n }\n });\n\n const deliverPending = Effect.fnUntraced(function* (\n key: ScheduleKey,\n record: ScheduleRecord,\n nowMillis: number,\n ) {\n if (\n record.pending === null ||\n record.pending.retry.parked === true ||\n record.pending.retry.nextAttemptAtMillis > nowMillis\n ) {\n return record;\n }\n yield* verifyPending(key, record);\n const envelope = record.pending.envelope;\n\n const outcome = yield* admissionSemaphore.withPermit(\n admitPreparedInput(admission.submit(envelope), limits.admissionTimeoutMillis).pipe(\n Effect.tap((outcome) =>\n outcome._tag === \"Receipt\" ? failpoint.hit(\"schedule:admission:after\") : Effect.void,\n ),\n ),\n );\n\n const completedAtMillis = yield* currentMillis;\n\n if (outcome._tag === \"Receipt\") {\n if (outcome.receipt.threadId !== envelope.threadId) {\n return yield* corrupt(\"admission\");\n }\n\n return yield* store\n .change(key, {\n _tag: \"Complete\",\n occurrenceId: envelope.occurrenceId,\n receipt: outcome.receipt,\n nowMillis: completedAtMillis,\n })\n .pipe(\n Effect.catchTag(\"ScheduleStorageError\", (error) =>\n error.reason === \"unavailable\"\n ? retry(key, record, \"storage\", completedAtMillis)\n : Effect.fail(error),\n ),\n );\n }\n if (outcome._tag === \"Refused\") {\n const refusal: ScheduleRefusal = {\n atMillis: completedAtMillis,\n intendedAtMillis: envelope.intendedAtMillis,\n occurrenceId: envelope.occurrenceId,\n phase: \"admission\",\n code: outcome.error.code,\n };\n\n return yield* store\n .change(key, {\n _tag: \"Refuse\",\n occurrenceId: envelope.occurrenceId,\n refusal,\n nowMillis: completedAtMillis,\n })\n .pipe(\n Effect.catchTag(\"ScheduleStorageError\", (error) =>\n error.reason === \"unavailable\"\n ? retry(key, record, \"storage\", completedAtMillis)\n : Effect.fail(error),\n ),\n );\n }\n\n return yield* retry(key, record, outcome.reason, completedAtMillis);\n });\n\n const processRecord = Effect.fnUntraced(function* (\n key: ScheduleKey,\n initial: ScheduleRecord,\n nowMillis: number,\n ): Effect.fn.Return<ScheduleRecord, ScheduleProcessFailure> {\n if (initial.pending !== null) return yield* deliverPending(key, initial, nowMillis);\n if (\n initial.state !== \"active\" ||\n initial.nextAtMillis === null ||\n initial.nextAtMillis > nowMillis\n ) {\n return initial;\n }\n\n const currentInputDigest = yield* withCrypto(digestJson(initial.configuration.input)).pipe(\n Effect.mapError(() =>\n ScheduleStorageError.make({ operation: \"prepare\", reason: \"unavailable\" }),\n ),\n );\n\n if (currentInputDigest !== initial.configuration.inputDigest) {\n return yield* corrupt(\"prepare\");\n }\n\n const due = yield* Effect.fromResult(\n scheduleDueOccurrence(initial.configuration.timing, initial.nextAtMillis, nowMillis),\n );\n\n if (due === null) return initial;\n\n const occurrenceId = yield* withCrypto(\n digestJson({\n schemaVersion: 1,\n owner: initial.owner,\n scheduleId: initial.scheduleId,\n configurationRevision: initial.configurationRevision,\n intendedAtMillis: due.intendedAtMillis,\n }),\n ).pipe(Effect.mapError(() => corrupt(\"prepare\")));\n\n const occurrence = {\n key,\n configurationRevision: initial.configurationRevision,\n configuration: initial.configuration,\n intendedAtMillis: due.intendedAtMillis,\n occurrenceId,\n };\n\n const authorization = yield* authorizer.prepare(occurrence).pipe(Effect.result);\n\n if (Result.isFailure(authorization)) {\n if (authorization.failure._tag === \"ScheduleStorageError\") {\n return yield* authorization.failure;\n }\n\n return yield* store.change(key, {\n _tag: \"DenyPreparation\",\n expectedRevision: initial.configurationRevision,\n expectedCursor: initial.nextAtMillis,\n refusal: {\n atMillis: nowMillis,\n intendedAtMillis: due.intendedAtMillis,\n occurrenceId,\n phase: \"preparation\",\n code: authorization.failure.code,\n },\n nowMillis,\n });\n }\n\n const threadId =\n initial.configuration.destination._tag === \"ExistingThread\"\n ? initial.configuration.destination.threadId\n : Schema.decodeSync(ThreadId)(`schedule-thread:${occurrenceId}`);\n\n const admissionKey = Schema.decodeSync(IdempotencyKey)(`schedule-occurrence:${occurrenceId}`);\n\n const prepared = yield* store.change(key, {\n _tag: \"Prepare\",\n expectedRevision: initial.configurationRevision,\n expectedCursor: initial.nextAtMillis,\n envelope: {\n schemaVersion: 1,\n owner: initial.owner,\n scheduleId: initial.scheduleId,\n configurationRevision: initial.configurationRevision,\n intendedAtMillis: due.intendedAtMillis,\n preparedAtMillis: nowMillis,\n occurrenceId,\n threadId,\n deliveryPrincipal: initial.configuration.deliveryPrincipal,\n ...(initial.configuration.admissionGroup === undefined\n ? {}\n : { admissionGroup: initial.configuration.admissionGroup }),\n ...(initial.configuration.admissionFence === undefined\n ? {}\n : { admissionFence: initial.configuration.admissionFence }),\n agentId: initial.configuration.agentId,\n definitions: initial.configuration.definitions,\n input: initial.configuration.input,\n inputDigest: initial.configuration.inputDigest,\n admissionKey,\n authorization: authorization.success,\n },\n nextAtMillis: due.nextAtMillis,\n skippedRange: due.skippedRange,\n nowMillis,\n });\n\n return yield* deliverPending(key, prepared, nowMillis);\n });\n\n const process = Effect.fnUntraced(function* (key: ScheduleKey) {\n const nowMillis = yield* currentMillis;\n const record = yield* store.get(key);\n\n if (record === null) return yield* notFound(key);\n\n const processed = yield* processRecord(key, record, nowMillis).pipe(\n Effect.catchTag(\"ScheduleConflict\", () =>\n store\n .get(key)\n .pipe(\n Effect.flatMap((current) =>\n current === null\n ? Effect.fail(notFound(key))\n : processRecord(key, current, nowMillis),\n ),\n ),\n ),\n );\n\n return processed;\n });\n\n const runDue = Effect.fnUntraced(function* (owner?: ScheduleOwner) {\n const nowMillis = yield* currentMillis;\n let after: ScheduleDueCursor | undefined;\n let processed = 0;\n let failed = 0;\n\n while (true) {\n const due = yield* store.due(nowMillis, limits.dueBatchSize, owner, after);\n\n if (due.length === 0) break;\n yield* Effect.forEach(\n due,\n (key) =>\n process(key).pipe(\n Effect.matchCauseEffect({\n onSuccess: () =>\n Effect.sync(() => {\n processed += 1;\n }),\n onFailure: (cause) =>\n Cause.hasInterrupts(cause)\n ? Effect.interrupt\n : Effect.gen(function* () {\n failed += 1;\n yield* Effect.logWarning(\"Schedule processing failed\").pipe(\n Effect.annotateLogs({\n failureTag: Option.match(Cause.findErrorOption(cause), {\n onNone: () => \"Defect\",\n onSome: (error) => error._tag,\n }),\n }),\n );\n }),\n }),\n ),\n { concurrency: limits.admissionConcurrency },\n );\n after = due.at(-1);\n if (due.length < limits.dueBatchSize) break;\n }\n\n return { processed, failed };\n });\n\n return ScheduleDriver.of({ process, runDue });\n});\n\nconst corrupt = (operation: string): ScheduleStorageError =>\n ScheduleStorageError.make({ operation, reason: \"corrupt\" });\n\nconst validateLimits = (limits: SchedulingLimits) =>\n Schema.decodeEffect(SchedulingLimits)(limits).pipe(\n Effect.mapError((error) =>\n ScheduleValidationError.make({ message: `Invalid Scheduling limits: ${error.message}` }),\n ),\n Effect.filterOrFail(\n (validated) => validated.retryBaseMillis <= validated.retryMaxMillis,\n () =>\n ScheduleValidationError.make({\n message: \"Scheduling retryBaseMillis must not exceed retryMaxMillis\",\n }),\n ),\n );\n\nexport class Scheduling extends Context.Service<\n Scheduling,\n {\n readonly create: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleCreateOptions,\n ) => Effect.Effect<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n >;\n readonly update: <InputSchema extends Schema.Top>(\n agent: DurableSubmitAgent<InputSchema>,\n input: InputSchema[\"Type\"],\n options: ScheduleUpdateOptions,\n ) => Effect.Effect<\n ScheduleSnapshot,\n ScheduleManagementFailure,\n InputSchema[\"EncodingServices\"]\n >;\n readonly get: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly list: (\n scope: ScheduleScope,\n options?: ScheduleListOptions,\n ) => Effect.Effect<ScheduleSnapshotPage, ScheduleManagementFailure>;\n readonly pause: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly resume: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly recover: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n expectedGeneration: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n readonly cancel: (\n scope: ScheduleScope,\n scheduleId: ScheduleId,\n expectedRevision: number,\n ) => Effect.Effect<ScheduleSnapshot, ScheduleManagementFailure>;\n }\n>()(\"@effect-agent/thread/Scheduling\") {\n static layer(\n limits: SchedulingLimits = defaultSchedulingLimits,\n ): Layer.Layer<\n Scheduling,\n ScheduleValidationError,\n ScheduleStore | ScheduleAuthorizer | ScheduleWake | Crypto.Crypto\n > {\n return Layer.effect(Scheduling, validateLimits(limits).pipe(Effect.flatMap(makeManagement)));\n }\n}\n\nexport const ScheduleWakeNoop: Layer.Layer<ScheduleWake> = Layer.succeed(ScheduleWake, {\n notify: Effect.void,\n await: Effect.never,\n});\n\n/** Privileged host capability. Never provide this service to management callers or model tools. */\nexport class ScheduleDriver extends Context.Service<\n ScheduleDriver,\n {\n readonly process: (key: ScheduleKey) => Effect.Effect<ScheduleRecord, ScheduleProcessFailure>;\n readonly runDue: (\n owner?: ScheduleOwner,\n ) => Effect.Effect<\n { readonly processed: number; readonly failed: number },\n ScheduleStorageError\n >;\n }\n>()(\"@effect-agent/thread/ScheduleDriver\") {\n static layer(\n limits: SchedulingLimits = defaultSchedulingLimits,\n ): Layer.Layer<\n ScheduleDriver,\n ScheduleValidationError,\n ScheduleStore | ScheduleAuthorizer | ScheduledInputAdmission | Crypto.Crypto\n > {\n return Layer.effect(ScheduleDriver, validateLimits(limits).pipe(Effect.flatMap(makeDriver)));\n }\n}\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { BackgroundSpawnTool, DelegationTool, SubagentBudgetReservation, Subagen
9
9
  import { RunUsageReport, unknownRunTotals } from "./core/Usage.mjs";
10
10
  import { C as MessageStatus, S as MessageRef, _ as WorkerStop, c as WorkerError, d as WorkerPage, f as WorkerRef, g as WorkerStarted, o as WorkerCompletion, p as WorkerReport, s as WorkerContext, v as WorkerStopped, y as WorkerSummary } from "./Worker-DZjdMjZn.mjs";
11
11
  import { BackgroundReporting, SubagentHost, WorkerReportPreparationFailure } from "./engine/SubagentHost.mjs";
12
- import { a as SubagentDurability, i as AgentSpawner, o as SubagentDurabilityError, s as ToolCallWaiting } from "./AgentRuntime-CQ-qcETl.mjs";
12
+ import { a as SubagentDurability, i as AgentSpawner, o as SubagentDurabilityError, s as ToolCallWaiting } from "./AgentRuntime-DaDKMasp.mjs";
13
13
  import { RunEventSink } from "./engine/RunEventSink.mjs";
14
14
  import { SubagentBudgetExhausted, SubagentObservedUsage, SubagentReservationRequest, SubagentReservations, makeBudgetReservationId } from "./capabilities/SubagentReservations.mjs";
15
15
  import { t as utf8Bytes } from "./utf8-B770uxC3.mjs";
@@ -384,7 +384,7 @@ const operations = (declaration) => {
384
384
  encodedGrant,
385
385
  ...options.continuationOf === void 0 ? {} : { continuationOf: options.continuationOf },
386
386
  ...options.budgetScope === void 0 ? {} : { budgetScope: options.budgetScope },
387
- prepare: (budgetScope) => Effect.gen(function* () {
387
+ prepare: Effect.fnUntraced(function* (budgetScope) {
388
388
  const encodedInput = yield* prepare(parameters, caller);
389
389
  const effectiveTarget = yield* service.resolveTargetPolicy({
390
390
  target: declaration.target,
@@ -592,7 +592,7 @@ const start = (declaration, parameters, options) => operations(declaration).star
592
592
  /** Retain typed follow-up parameters for the same worker Thread; inspect its MessageRef for delivery. */
593
593
  const followUp = (declaration, worker, parameters, options) => operations(declaration).followUp(worker, parameters, options);
594
594
  /** Inspect a continuing worker with the same summary contract returned by list. */
595
- const summary = (declaration, worker) => Effect.gen(function* () {
595
+ const summary = Effect.fnUntraced(function* (declaration, worker) {
596
596
  const service = yield* host;
597
597
  const validated = yield* Schema.decodeEffect(Worker(declaration))(worker).pipe(Effect.mapError(() => WorkerError.make({
598
598
  operation: "inspect",
@@ -636,7 +636,7 @@ const observe = (declaration, worker, options = {}) => Stream.unwrap(Effect.gen(
636
636
  });
637
637
  }));
638
638
  /** Seal a continuing worker, retaining a stable command identity across retries and Runs. */
639
- const stop = (declaration, worker, options) => Effect.gen(function* () {
639
+ const stop = Effect.fnUntraced(function* (declaration, worker, options) {
640
640
  const service = yield* host;
641
641
  const command = yield* Schema.decodeEffect(WorkerStop)({
642
642
  worker,
@@ -741,6 +741,12 @@ const modelKey = Effect.fnUntraced(function* (operation) {
741
741
  reason: "unavailable"
742
742
  })));
743
743
  });
744
+ const captureSelected = (flag) => {
745
+ function capture(effect) {
746
+ return flag === true ? Effect.map(effect, Option.some) : Effect.succeedNone;
747
+ }
748
+ return capture;
749
+ };
744
750
  let reportingServiceId = 0;
745
751
  /**
746
752
  * Derive optional native AI Tools and their handler Layer from one immutable declaration.
@@ -805,45 +811,53 @@ const background$1 = (declaration, selected) => {
805
811
  }).filter(([operation]) => selected[operation] === true).map(([, tool]) => tool.annotate(BackgroundReporting, descriptor));
806
812
  const toolkit = Toolkit.make(...chosen);
807
813
  const build = Effect.gen(function* () {
808
- const captured = yield* Effect.context();
814
+ const start = yield* captureSelected(selected.start)(Effect.map(Effect.context(), (captured) => (parameters) => Effect.gen(function* () {
815
+ const service = yield* host;
816
+ const idempotencyKey = yield* modelKey("start");
817
+ return yield* ops.start(parameters, {
818
+ idempotencyKey,
819
+ ...selected.budgetScope === void 0 ? {} : { budgetScope: selected.budgetScope }
820
+ }).pipe(Effect.provideService(SubagentHost, service), Effect.provide(captured));
821
+ })));
822
+ const followUp = yield* captureSelected(selected.followUp)(Effect.map(Effect.context(), (captured) => (parameters) => Effect.gen(function* () {
823
+ const service = yield* host;
824
+ const idempotencyKey = yield* modelKey("followUp");
825
+ return yield* ops.followUp(parameters.worker, parameters.parameters, { idempotencyKey }).pipe(Effect.provideService(SubagentHost, service), Effect.provide(captured));
826
+ })));
827
+ const inspect = yield* captureSelected(selected.inspect)(Effect.map(Effect.context(), (captured) => (parameters) => Effect.gen(function* () {
828
+ const service = yield* host;
829
+ if (parameters.message !== void 0) return yield* ops.inspectMessage(parameters.worker, parameters.message);
830
+ if (parameters.receipt === void 0) return yield* WorkerError.make({
831
+ operation: "inspect",
832
+ reason: "message-mismatch"
833
+ });
834
+ return yield* ops.observe("inspect", parameters.worker, parameters.receipt).pipe(Effect.map((observed) => {
835
+ if ("diagnostic" in observed) {
836
+ const { diagnostic: _diagnostic, ...projected } = observed;
837
+ return projected;
838
+ }
839
+ return observed;
840
+ }), Effect.provideService(SubagentHost, service), Effect.provide(captured));
841
+ })));
809
842
  return {
810
- [startTool.name]: (parameters) => Effect.gen(function* () {
811
- const service = yield* host;
812
- const idempotencyKey = yield* modelKey("start");
813
- return yield* ops.start(parameters, {
814
- idempotencyKey,
815
- ...selected.budgetScope === void 0 ? {} : { budgetScope: selected.budgetScope }
816
- }).pipe(Effect.provideService(SubagentHost, service), Effect.provide(captured));
817
- }),
818
- [followUpTool.name]: (parameters) => Effect.gen(function* () {
819
- const service = yield* host;
820
- const idempotencyKey = yield* modelKey("followUp");
821
- return yield* ops.followUp(parameters.worker, parameters.parameters, { idempotencyKey }).pipe(Effect.provideService(SubagentHost, service), Effect.provide(captured));
822
- }),
823
- [inspectTool.name]: (parameters) => Effect.gen(function* () {
824
- const service = yield* host;
825
- if (parameters.message !== void 0) return yield* ops.inspectMessage(parameters.worker, parameters.message);
826
- if (parameters.receipt === void 0) return yield* WorkerError.make({
827
- operation: "inspect",
828
- reason: "message-mismatch"
829
- });
830
- return yield* ops.observe("inspect", parameters.worker, parameters.receipt).pipe(Effect.map((observed) => {
831
- if ("diagnostic" in observed) {
832
- const { diagnostic: _diagnostic, ...projected } = observed;
833
- return projected;
834
- }
835
- return observed;
836
- }), Effect.provideService(SubagentHost, service), Effect.provide(captured));
837
- }),
843
+ ...Option.isSome(start) ? { [startTool.name]: start.value } : {},
844
+ ...Option.isSome(followUp) ? { [followUpTool.name]: followUp.value } : {},
845
+ ...Option.isSome(inspect) ? { [inspectTool.name]: inspect.value } : {},
838
846
  [listTool.name]: (parameters) => ops.list(parameters),
839
847
  [summaryTool.name]: (parameters) => summary(declaration, parameters.worker),
840
848
  [cancelTool.name]: (parameters) => ops.cancel(parameters.worker, parameters.receipt)
841
849
  };
842
850
  });
843
- const reportingLayer = report === void 0 ? Layer.empty : Layer.effect(reportService, Effect.map(Effect.context(), (context) => ({
844
- ...report,
845
- prepare: (value) => Effect.scoped(Effect.suspend(() => report.prepare(value))).pipe(Effect.provide(context), Effect.mapError((error) => Schema.is(WorkerReportPreparationFailure)(error) ? error : WorkerReportPreparationFailure.make({ stage: "preparation" })))
846
- })));
851
+ const reportingLayer = Layer.effectContext(Effect.gen(function* () {
852
+ const capturedReport = yield* captureSelected(selected.reportToParent)(Effect.map(Effect.context(), (context) => {
853
+ const reporting = automaticReporting(declaration);
854
+ return {
855
+ ...reporting,
856
+ prepare: (value) => Effect.scoped(Effect.suspend(() => reporting.prepare(value))).pipe(Effect.provide(context), Effect.mapError((error) => Schema.is(WorkerReportPreparationFailure)(error) ? error : WorkerReportPreparationFailure.make({ stage: "preparation" })))
857
+ };
858
+ }));
859
+ return Option.isNone(capturedReport) ? Context.empty() : Context.make(reportService, capturedReport.value);
860
+ }));
847
861
  const layer = Layer.merge(toolkit.toLayer(build), reportingLayer);
848
862
  return Object.freeze({
849
863
  tools: toolkit.tools,
@@ -1474,7 +1488,7 @@ function layer(delegation, modelOrBinding, options = {}) {
1474
1488
  });
1475
1489
  const containSignals = (failure) => failure instanceof GenuineEngineSignal ? Effect.fail(failure.signal) : Effect.succeed(failure);
1476
1490
  const unwrapSignals = (failure) => failure instanceof GenuineEngineSignal ? failure.signal : failure;
1477
- const handlerImpl = (parameters, handlerContext) => Effect.gen(function* () {
1491
+ const handler = Effect.fnUntraced(function* (parameters, handlerContext) {
1478
1492
  const spawner = yield* AgentSpawner;
1479
1493
  const sink = yield* RunEventSink;
1480
1494
  const durability = yield* SubagentDurability;
@@ -1485,7 +1499,6 @@ function layer(delegation, modelOrBinding, options = {}) {
1485
1499
  const ephemeral = invoke(parameters, handlerContext).pipe(Effect.scoped, Effect.provideService(AgentSpawner, spawner), Effect.provideService(RunEventSink, sink), Effect.provideService(SubagentDurability, durability), Effect.provide(captured));
1486
1500
  return yield* contained ? ephemeral.pipe(Effect.catch(containSignals)) : ephemeral.pipe(Effect.mapError(unwrapSignals));
1487
1501
  });
1488
- const handler = handlerImpl;
1489
1502
  return { [delegation.name]: handler };
1490
1503
  });
1491
1504
  return toolkit.toLayer(build);
@@ -1497,4 +1510,4 @@ function background(targetOrDeclaration, selected) {
1497
1510
  //#endregion
1498
1511
  export { SubagentPolicy as _, layer as a, delegationAllocationFromPolicy as b, WorkerObservation as c, followUp as d, inspect as f, stop as g, start as h, background as i, awaitWorker as l, observe as m, SubagentResult as n, make as o, list as p, Subagent_exports as r, Worker as s, SubagentDurableAccounting as t, cancel as u, SubagentPrestartDenied as v, delegationCapsFromPolicy as x, SubagentProjectionFailure as y };
1499
1512
 
1500
- //# sourceMappingURL=Subagent-vpffemql.mjs.map
1513
+ //# sourceMappingURL=Subagent-CexndZSp.mjs.map