@warlock.js/ai 4.1.14 → 4.2.0

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 (449) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/cjs/index.cjs +88 -87
  4. package/cjs/index.cjs.map +1 -1
  5. package/esm/agent/agent-config.type.d.mts +1 -1
  6. package/esm/agent/agent-config.type.d.mts.map +1 -1
  7. package/esm/agent/agent-input-builder.mjs +1 -1
  8. package/esm/agent/agent-input-builder.mjs.map +1 -1
  9. package/esm/agent/agent-log-event.mjs +1 -1
  10. package/esm/agent/agent-log-event.mjs.map +1 -1
  11. package/esm/agent/agent-stream.d.mts +1 -1
  12. package/esm/agent/agent-stream.d.mts.map +1 -1
  13. package/esm/agent/agent-stream.mjs +1 -1
  14. package/esm/agent/agent-stream.mjs.map +1 -1
  15. package/esm/agent/agent-to-stream-event.mjs +1 -1
  16. package/esm/agent/agent-to-stream-event.mjs.map +1 -1
  17. package/esm/agent/agent.d.mts +1 -1
  18. package/esm/agent/agent.d.mts.map +1 -1
  19. package/esm/agent/agent.mjs +1 -1
  20. package/esm/agent/agent.mjs.map +1 -1
  21. package/esm/agent/json-stream-guard.mjs +1 -1
  22. package/esm/agent/json-stream-guard.mjs.map +1 -1
  23. package/esm/ai.d.mts +1 -1
  24. package/esm/ai.d.mts.map +1 -1
  25. package/esm/ai.mjs +1 -1
  26. package/esm/ai.mjs.map +1 -1
  27. package/esm/config.d.mts +1 -1
  28. package/esm/config.d.mts.map +1 -1
  29. package/esm/config.mjs +1 -1
  30. package/esm/config.mjs.map +1 -1
  31. package/esm/contracts/agent/agent-options.type.d.mts +1 -1
  32. package/esm/contracts/agent/agent-options.type.d.mts.map +1 -1
  33. package/esm/contracts/agent/agent.contract.d.mts +1 -1
  34. package/esm/contracts/agent/agent.contract.d.mts.map +1 -1
  35. package/esm/contracts/attachment.type.d.mts +1 -1
  36. package/esm/contracts/attachment.type.d.mts.map +1 -1
  37. package/esm/contracts/content-part.type.d.mts +1 -1
  38. package/esm/contracts/content-part.type.d.mts.map +1 -1
  39. package/esm/contracts/conversation-message.type.d.mts +1 -1
  40. package/esm/contracts/conversation-message.type.d.mts.map +1 -1
  41. package/esm/contracts/embedder.contract.d.mts +1 -1
  42. package/esm/contracts/embedder.contract.d.mts.map +1 -1
  43. package/esm/contracts/end.type.d.mts +1 -1
  44. package/esm/contracts/end.type.d.mts.map +1 -1
  45. package/esm/contracts/end.type.mjs +1 -1
  46. package/esm/contracts/end.type.mjs.map +1 -1
  47. package/esm/contracts/events/agent-events.type.d.mts +1 -1
  48. package/esm/contracts/events/agent-events.type.d.mts.map +1 -1
  49. package/esm/contracts/events/complete-event.type.d.mts +1 -1
  50. package/esm/contracts/events/complete-event.type.d.mts.map +1 -1
  51. package/esm/contracts/events/event-identity.type.d.mts +1 -1
  52. package/esm/contracts/events/event-identity.type.d.mts.map +1 -1
  53. package/esm/contracts/events/event-map.type.d.mts +1 -1
  54. package/esm/contracts/events/event-map.type.d.mts.map +1 -1
  55. package/esm/contracts/events/supervisor-events.type.d.mts +1 -1
  56. package/esm/contracts/events/supervisor-events.type.d.mts.map +1 -1
  57. package/esm/contracts/events/usage-event.type.d.mts +1 -1
  58. package/esm/contracts/events/usage-event.type.d.mts.map +1 -1
  59. package/esm/contracts/events/workflow-events.type.d.mts +1 -1
  60. package/esm/contracts/events/workflow-events.type.d.mts.map +1 -1
  61. package/esm/contracts/executable.contract.d.mts +1 -1
  62. package/esm/contracts/executable.contract.d.mts.map +1 -1
  63. package/esm/contracts/finish-reason.type.d.mts +1 -1
  64. package/esm/contracts/finish-reason.type.d.mts.map +1 -1
  65. package/esm/contracts/middleware/middleware-context.type.d.mts +1 -1
  66. package/esm/contracts/middleware/middleware-context.type.d.mts.map +1 -1
  67. package/esm/contracts/middleware/middleware-state.type.d.mts +1 -1
  68. package/esm/contracts/middleware/middleware-state.type.d.mts.map +1 -1
  69. package/esm/contracts/middleware/middleware.contract.d.mts +1 -1
  70. package/esm/contracts/middleware/middleware.contract.d.mts.map +1 -1
  71. package/esm/contracts/model-tool-call-request.type.d.mts +1 -1
  72. package/esm/contracts/model-tool-call-request.type.d.mts.map +1 -1
  73. package/esm/contracts/model.contract.d.mts +1 -1
  74. package/esm/contracts/model.contract.d.mts.map +1 -1
  75. package/esm/contracts/placeholders.type.d.mts +1 -1
  76. package/esm/contracts/placeholders.type.d.mts.map +1 -1
  77. package/esm/contracts/result/agent-result.type.d.mts +1 -1
  78. package/esm/contracts/result/agent-result.type.d.mts.map +1 -1
  79. package/esm/contracts/result/attempt-entry.type.d.mts +1 -1
  80. package/esm/contracts/result/attempt-entry.type.d.mts.map +1 -1
  81. package/esm/contracts/result/base-report.type.d.mts +1 -1
  82. package/esm/contracts/result/base-report.type.d.mts.map +1 -1
  83. package/esm/contracts/result/base-report.type.mjs +1 -1
  84. package/esm/contracts/result/base-report.type.mjs.map +1 -1
  85. package/esm/contracts/result/base-result.type.d.mts +1 -1
  86. package/esm/contracts/result/base-result.type.d.mts.map +1 -1
  87. package/esm/contracts/result/execute-result.type.d.mts +1 -1
  88. package/esm/contracts/result/execute-result.type.d.mts.map +1 -1
  89. package/esm/contracts/result/execution-report.type.d.mts +1 -1
  90. package/esm/contracts/result/execution-report.type.d.mts.map +1 -1
  91. package/esm/contracts/result/llm-trip.type.d.mts +1 -1
  92. package/esm/contracts/result/llm-trip.type.d.mts.map +1 -1
  93. package/esm/contracts/result/model-pricing.type.d.mts +1 -1
  94. package/esm/contracts/result/model-pricing.type.d.mts.map +1 -1
  95. package/esm/contracts/result/session-send-result.type.d.mts +1 -1
  96. package/esm/contracts/result/session-send-result.type.d.mts.map +1 -1
  97. package/esm/contracts/result/step-result.type.d.mts +1 -1
  98. package/esm/contracts/result/step-result.type.d.mts.map +1 -1
  99. package/esm/contracts/result/supervisor-result.type.d.mts +1 -1
  100. package/esm/contracts/result/supervisor-result.type.d.mts.map +1 -1
  101. package/esm/contracts/result/tool-call.type.d.mts +1 -1
  102. package/esm/contracts/result/tool-call.type.d.mts.map +1 -1
  103. package/esm/contracts/result/usage.type.d.mts +1 -1
  104. package/esm/contracts/result/usage.type.d.mts.map +1 -1
  105. package/esm/contracts/result/workflow-result.type.d.mts +1 -1
  106. package/esm/contracts/result/workflow-result.type.d.mts.map +1 -1
  107. package/esm/contracts/sdk-adapter.contract.d.mts +1 -1
  108. package/esm/contracts/sdk-adapter.contract.d.mts.map +1 -1
  109. package/esm/contracts/stream/stream-event.type.d.mts +1 -1
  110. package/esm/contracts/stream/stream-event.type.d.mts.map +1 -1
  111. package/esm/contracts/stream/stream.contract.d.mts +1 -1
  112. package/esm/contracts/stream/stream.contract.d.mts.map +1 -1
  113. package/esm/contracts/streaming-tool-guard-config.type.d.mts +1 -1
  114. package/esm/contracts/streaming-tool-guard-config.type.d.mts.map +1 -1
  115. package/esm/contracts/supervisor/ack-entry.type.d.mts +1 -1
  116. package/esm/contracts/supervisor/ack-entry.type.d.mts.map +1 -1
  117. package/esm/contracts/supervisor/classifier-context.type.d.mts +1 -1
  118. package/esm/contracts/supervisor/classifier-context.type.d.mts.map +1 -1
  119. package/esm/contracts/supervisor/dispatch-context.type.d.mts +1 -1
  120. package/esm/contracts/supervisor/dispatch-context.type.d.mts.map +1 -1
  121. package/esm/contracts/supervisor/evaluate-context.type.d.mts +1 -1
  122. package/esm/contracts/supervisor/evaluate-context.type.d.mts.map +1 -1
  123. package/esm/contracts/supervisor/intent-entry.type.d.mts +1 -1
  124. package/esm/contracts/supervisor/intent-entry.type.d.mts.map +1 -1
  125. package/esm/contracts/supervisor/iteration-snapshot.type.d.mts +1 -1
  126. package/esm/contracts/supervisor/iteration-snapshot.type.d.mts.map +1 -1
  127. package/esm/contracts/supervisor/next.type.d.mts +1 -1
  128. package/esm/contracts/supervisor/next.type.d.mts.map +1 -1
  129. package/esm/contracts/supervisor/route-context.type.d.mts +1 -1
  130. package/esm/contracts/supervisor/route-context.type.d.mts.map +1 -1
  131. package/esm/contracts/supervisor/router-entry.type.d.mts +1 -1
  132. package/esm/contracts/supervisor/router-entry.type.d.mts.map +1 -1
  133. package/esm/contracts/supervisor/supervisor-config.type.d.mts +1 -1
  134. package/esm/contracts/supervisor/supervisor-config.type.d.mts.map +1 -1
  135. package/esm/contracts/supervisor/supervisor-execute-options.type.d.mts +1 -1
  136. package/esm/contracts/supervisor/supervisor-execute-options.type.d.mts.map +1 -1
  137. package/esm/contracts/supervisor/supervisor-input.type.d.mts +1 -1
  138. package/esm/contracts/supervisor/supervisor-input.type.d.mts.map +1 -1
  139. package/esm/contracts/supervisor/supervisor-snapshot.type.d.mts +1 -1
  140. package/esm/contracts/supervisor/supervisor-snapshot.type.d.mts.map +1 -1
  141. package/esm/contracts/supervisor/supervisor-stream-event.type.d.mts +1 -1
  142. package/esm/contracts/supervisor/supervisor-stream-event.type.d.mts.map +1 -1
  143. package/esm/contracts/supervisor/supervisor.contract.d.mts +1 -1
  144. package/esm/contracts/supervisor/supervisor.contract.d.mts.map +1 -1
  145. package/esm/contracts/system-prompt.contract.d.mts +1 -1
  146. package/esm/contracts/system-prompt.contract.d.mts.map +1 -1
  147. package/esm/contracts/tool.contract.d.mts +1 -1
  148. package/esm/contracts/tool.contract.d.mts.map +1 -1
  149. package/esm/contracts/workflow/next-step-result.type.d.mts +1 -1
  150. package/esm/contracts/workflow/next-step-result.type.d.mts.map +1 -1
  151. package/esm/contracts/workflow/retry-config.type.d.mts +1 -1
  152. package/esm/contracts/workflow/retry-config.type.d.mts.map +1 -1
  153. package/esm/contracts/workflow/step.contract.d.mts +1 -1
  154. package/esm/contracts/workflow/step.contract.d.mts.map +1 -1
  155. package/esm/contracts/workflow/workflow-context.type.d.mts +1 -1
  156. package/esm/contracts/workflow/workflow-context.type.d.mts.map +1 -1
  157. package/esm/contracts/workflow/workflow-snapshot.type.d.mts +1 -1
  158. package/esm/contracts/workflow/workflow-snapshot.type.d.mts.map +1 -1
  159. package/esm/contracts/workflow/workflow.contract.d.mts +1 -1
  160. package/esm/contracts/workflow/workflow.contract.d.mts.map +1 -1
  161. package/esm/errors/agent-cancelled-error.d.mts +1 -1
  162. package/esm/errors/agent-cancelled-error.d.mts.map +1 -1
  163. package/esm/errors/agent-cancelled-error.mjs +1 -1
  164. package/esm/errors/agent-cancelled-error.mjs.map +1 -1
  165. package/esm/errors/agent-execution-error.d.mts +1 -1
  166. package/esm/errors/agent-execution-error.d.mts.map +1 -1
  167. package/esm/errors/agent-execution-error.mjs +1 -1
  168. package/esm/errors/agent-execution-error.mjs.map +1 -1
  169. package/esm/errors/agent-max-trips-error.d.mts +1 -1
  170. package/esm/errors/agent-max-trips-error.d.mts.map +1 -1
  171. package/esm/errors/agent-max-trips-error.mjs +1 -1
  172. package/esm/errors/agent-max-trips-error.mjs.map +1 -1
  173. package/esm/errors/ai-error.d.mts +1 -1
  174. package/esm/errors/ai-error.d.mts.map +1 -1
  175. package/esm/errors/ai-error.mjs +1 -1
  176. package/esm/errors/ai-error.mjs.map +1 -1
  177. package/esm/errors/budget-exceeded-error.d.mts +1 -1
  178. package/esm/errors/budget-exceeded-error.d.mts.map +1 -1
  179. package/esm/errors/budget-exceeded-error.mjs +1 -1
  180. package/esm/errors/budget-exceeded-error.mjs.map +1 -1
  181. package/esm/errors/content-filter-error.d.mts +1 -1
  182. package/esm/errors/content-filter-error.d.mts.map +1 -1
  183. package/esm/errors/content-filter-error.mjs +1 -1
  184. package/esm/errors/content-filter-error.mjs.map +1 -1
  185. package/esm/errors/context-length-exceeded-error.d.mts +1 -1
  186. package/esm/errors/context-length-exceeded-error.d.mts.map +1 -1
  187. package/esm/errors/context-length-exceeded-error.mjs +1 -1
  188. package/esm/errors/context-length-exceeded-error.mjs.map +1 -1
  189. package/esm/errors/error-category.type.d.mts +1 -1
  190. package/esm/errors/error-category.type.d.mts.map +1 -1
  191. package/esm/errors/error-code.type.d.mts +1 -1
  192. package/esm/errors/error-code.type.d.mts.map +1 -1
  193. package/esm/errors/guardrail-violation-error.d.mts +1 -1
  194. package/esm/errors/guardrail-violation-error.d.mts.map +1 -1
  195. package/esm/errors/guardrail-violation-error.mjs +1 -1
  196. package/esm/errors/guardrail-violation-error.mjs.map +1 -1
  197. package/esm/errors/invalid-request-error.d.mts +1 -1
  198. package/esm/errors/invalid-request-error.d.mts.map +1 -1
  199. package/esm/errors/invalid-request-error.mjs +1 -1
  200. package/esm/errors/invalid-request-error.mjs.map +1 -1
  201. package/esm/errors/max-iterations-error.d.mts +1 -1
  202. package/esm/errors/max-iterations-error.d.mts.map +1 -1
  203. package/esm/errors/max-iterations-error.mjs +1 -1
  204. package/esm/errors/max-iterations-error.mjs.map +1 -1
  205. package/esm/errors/max-steps-exceeded-error.d.mts +1 -1
  206. package/esm/errors/max-steps-exceeded-error.d.mts.map +1 -1
  207. package/esm/errors/max-steps-exceeded-error.mjs +1 -1
  208. package/esm/errors/max-steps-exceeded-error.mjs.map +1 -1
  209. package/esm/errors/provider-auth-error.d.mts +1 -1
  210. package/esm/errors/provider-auth-error.d.mts.map +1 -1
  211. package/esm/errors/provider-auth-error.mjs +1 -1
  212. package/esm/errors/provider-auth-error.mjs.map +1 -1
  213. package/esm/errors/provider-error.d.mts +1 -1
  214. package/esm/errors/provider-error.d.mts.map +1 -1
  215. package/esm/errors/provider-error.mjs +1 -1
  216. package/esm/errors/provider-error.mjs.map +1 -1
  217. package/esm/errors/provider-rate-limit-error.d.mts +1 -1
  218. package/esm/errors/provider-rate-limit-error.d.mts.map +1 -1
  219. package/esm/errors/provider-rate-limit-error.mjs +1 -1
  220. package/esm/errors/provider-rate-limit-error.mjs.map +1 -1
  221. package/esm/errors/provider-timeout-error.d.mts +1 -1
  222. package/esm/errors/provider-timeout-error.d.mts.map +1 -1
  223. package/esm/errors/provider-timeout-error.mjs +1 -1
  224. package/esm/errors/provider-timeout-error.mjs.map +1 -1
  225. package/esm/errors/quota-exceeded-error.d.mts +1 -1
  226. package/esm/errors/quota-exceeded-error.d.mts.map +1 -1
  227. package/esm/errors/quota-exceeded-error.mjs +1 -1
  228. package/esm/errors/quota-exceeded-error.mjs.map +1 -1
  229. package/esm/errors/routing-error.d.mts +1 -1
  230. package/esm/errors/routing-error.d.mts.map +1 -1
  231. package/esm/errors/routing-error.mjs +1 -1
  232. package/esm/errors/routing-error.mjs.map +1 -1
  233. package/esm/errors/schema-validation-error.d.mts +1 -1
  234. package/esm/errors/schema-validation-error.d.mts.map +1 -1
  235. package/esm/errors/schema-validation-error.mjs +1 -1
  236. package/esm/errors/schema-validation-error.mjs.map +1 -1
  237. package/esm/errors/step-failed-error.d.mts +1 -1
  238. package/esm/errors/step-failed-error.d.mts.map +1 -1
  239. package/esm/errors/step-failed-error.mjs +1 -1
  240. package/esm/errors/step-failed-error.mjs.map +1 -1
  241. package/esm/errors/supervisor-cancelled-error.d.mts +1 -1
  242. package/esm/errors/supervisor-cancelled-error.d.mts.map +1 -1
  243. package/esm/errors/supervisor-cancelled-error.mjs +1 -1
  244. package/esm/errors/supervisor-cancelled-error.mjs.map +1 -1
  245. package/esm/errors/supervisor-drift-error.d.mts +1 -1
  246. package/esm/errors/supervisor-drift-error.d.mts.map +1 -1
  247. package/esm/errors/supervisor-drift-error.mjs +1 -1
  248. package/esm/errors/supervisor-drift-error.mjs.map +1 -1
  249. package/esm/errors/supervisor-failed-error.d.mts +1 -1
  250. package/esm/errors/supervisor-failed-error.d.mts.map +1 -1
  251. package/esm/errors/supervisor-failed-error.mjs +1 -1
  252. package/esm/errors/supervisor-failed-error.mjs.map +1 -1
  253. package/esm/errors/supervisor-routing-error.d.mts +1 -1
  254. package/esm/errors/supervisor-routing-error.d.mts.map +1 -1
  255. package/esm/errors/supervisor-routing-error.mjs +1 -1
  256. package/esm/errors/supervisor-routing-error.mjs.map +1 -1
  257. package/esm/errors/tool-execution-error.d.mts +1 -1
  258. package/esm/errors/tool-execution-error.d.mts.map +1 -1
  259. package/esm/errors/tool-execution-error.mjs +1 -1
  260. package/esm/errors/tool-execution-error.mjs.map +1 -1
  261. package/esm/errors/workflow-cancelled-error.d.mts +1 -1
  262. package/esm/errors/workflow-cancelled-error.d.mts.map +1 -1
  263. package/esm/errors/workflow-cancelled-error.mjs +1 -1
  264. package/esm/errors/workflow-cancelled-error.mjs.map +1 -1
  265. package/esm/errors/workflow-drift-error.d.mts +1 -1
  266. package/esm/errors/workflow-drift-error.d.mts.map +1 -1
  267. package/esm/errors/workflow-drift-error.mjs +1 -1
  268. package/esm/errors/workflow-drift-error.mjs.map +1 -1
  269. package/esm/errors/workflow-error.d.mts +1 -1
  270. package/esm/errors/workflow-error.d.mts.map +1 -1
  271. package/esm/errors/workflow-error.mjs +1 -1
  272. package/esm/errors/workflow-error.mjs.map +1 -1
  273. package/esm/middleware/builtins/budget.d.mts +1 -1
  274. package/esm/middleware/builtins/budget.d.mts.map +1 -1
  275. package/esm/middleware/builtins/budget.mjs +1 -1
  276. package/esm/middleware/builtins/budget.mjs.map +1 -1
  277. package/esm/middleware/builtins/guardrail.d.mts +1 -1
  278. package/esm/middleware/builtins/guardrail.d.mts.map +1 -1
  279. package/esm/middleware/builtins/guardrail.mjs +1 -1
  280. package/esm/middleware/builtins/guardrail.mjs.map +1 -1
  281. package/esm/middleware/builtins/semantic-cache.d.mts +1 -1
  282. package/esm/middleware/builtins/semantic-cache.d.mts.map +1 -1
  283. package/esm/middleware/builtins/semantic-cache.mjs +1 -1
  284. package/esm/middleware/builtins/semantic-cache.mjs.map +1 -1
  285. package/esm/middleware/helpers/compose.d.mts +1 -1
  286. package/esm/middleware/helpers/compose.d.mts.map +1 -1
  287. package/esm/middleware/helpers/compose.mjs +1 -1
  288. package/esm/middleware/helpers/compose.mjs.map +1 -1
  289. package/esm/middleware/helpers/for-tool.d.mts +1 -1
  290. package/esm/middleware/helpers/for-tool.d.mts.map +1 -1
  291. package/esm/middleware/helpers/for-tool.mjs +1 -1
  292. package/esm/middleware/helpers/for-tool.mjs.map +1 -1
  293. package/esm/middleware/pipeline.d.mts +1 -1
  294. package/esm/middleware/pipeline.d.mts.map +1 -1
  295. package/esm/middleware/pipeline.mjs +1 -1
  296. package/esm/middleware/pipeline.mjs.map +1 -1
  297. package/esm/middleware/utils/extract-user-text.d.mts +1 -1
  298. package/esm/middleware/utils/extract-user-text.d.mts.map +1 -1
  299. package/esm/middleware/utils/extract-user-text.mjs +1 -1
  300. package/esm/middleware/utils/extract-user-text.mjs.map +1 -1
  301. package/esm/middleware/utils/namespaced-state.d.mts +1 -1
  302. package/esm/middleware/utils/namespaced-state.d.mts.map +1 -1
  303. package/esm/middleware/utils/namespaced-state.mjs +1 -1
  304. package/esm/middleware/utils/namespaced-state.mjs.map +1 -1
  305. package/esm/mock/mock-agent.d.mts +1 -1
  306. package/esm/mock/mock-agent.d.mts.map +1 -1
  307. package/esm/mock/mock-agent.mjs +1 -1
  308. package/esm/mock/mock-agent.mjs.map +1 -1
  309. package/esm/mock/mock-config.type.d.mts +1 -1
  310. package/esm/mock/mock-config.type.d.mts.map +1 -1
  311. package/esm/mock/mock-model.d.mts +1 -1
  312. package/esm/mock/mock-model.d.mts.map +1 -1
  313. package/esm/mock/mock-model.mjs +1 -1
  314. package/esm/mock/mock-model.mjs.map +1 -1
  315. package/esm/mock/mock-sdk.d.mts +1 -1
  316. package/esm/mock/mock-sdk.d.mts.map +1 -1
  317. package/esm/mock/mock-sdk.mjs +1 -1
  318. package/esm/mock/mock-sdk.mjs.map +1 -1
  319. package/esm/supervisor/as-tool.d.mts +1 -1
  320. package/esm/supervisor/as-tool.d.mts.map +1 -1
  321. package/esm/supervisor/as-tool.mjs +1 -1
  322. package/esm/supervisor/as-tool.mjs.map +1 -1
  323. package/esm/supervisor/cancellation.d.mts +1 -1
  324. package/esm/supervisor/cancellation.d.mts.map +1 -1
  325. package/esm/supervisor/cancellation.mjs +1 -1
  326. package/esm/supervisor/cancellation.mjs.map +1 -1
  327. package/esm/supervisor/decide.mjs +1 -1
  328. package/esm/supervisor/decide.mjs.map +1 -1
  329. package/esm/supervisor/emitter.d.mts +1 -1
  330. package/esm/supervisor/emitter.d.mts.map +1 -1
  331. package/esm/supervisor/emitter.mjs +1 -1
  332. package/esm/supervisor/emitter.mjs.map +1 -1
  333. package/esm/supervisor/entries.d.mts +1 -1
  334. package/esm/supervisor/entries.d.mts.map +1 -1
  335. package/esm/supervisor/entries.mjs +1 -1
  336. package/esm/supervisor/entries.mjs.map +1 -1
  337. package/esm/supervisor/execution.d.mts +1 -1
  338. package/esm/supervisor/execution.d.mts.map +1 -1
  339. package/esm/supervisor/execution.mjs +1 -1
  340. package/esm/supervisor/execution.mjs.map +1 -1
  341. package/esm/supervisor/router-prompt.d.mts +1 -1
  342. package/esm/supervisor/router-prompt.d.mts.map +1 -1
  343. package/esm/supervisor/router-prompt.mjs +1 -1
  344. package/esm/supervisor/router-prompt.mjs.map +1 -1
  345. package/esm/supervisor/signature.d.mts +1 -1
  346. package/esm/supervisor/signature.d.mts.map +1 -1
  347. package/esm/supervisor/signature.mjs +1 -1
  348. package/esm/supervisor/signature.mjs.map +1 -1
  349. package/esm/supervisor/snapshot.d.mts +1 -1
  350. package/esm/supervisor/snapshot.d.mts.map +1 -1
  351. package/esm/supervisor/snapshot.mjs +1 -1
  352. package/esm/supervisor/snapshot.mjs.map +1 -1
  353. package/esm/supervisor/supervisor-stream.d.mts +1 -1
  354. package/esm/supervisor/supervisor-stream.d.mts.map +1 -1
  355. package/esm/supervisor/supervisor-stream.mjs +1 -1
  356. package/esm/supervisor/supervisor-stream.mjs.map +1 -1
  357. package/esm/supervisor/supervisor.d.mts +1 -1
  358. package/esm/supervisor/supervisor.d.mts.map +1 -1
  359. package/esm/supervisor/supervisor.mjs +1 -1
  360. package/esm/supervisor/supervisor.mjs.map +1 -1
  361. package/esm/system-prompt/instruction.d.mts +1 -1
  362. package/esm/system-prompt/instruction.d.mts.map +1 -1
  363. package/esm/system-prompt/instruction.mjs +1 -1
  364. package/esm/system-prompt/instruction.mjs.map +1 -1
  365. package/esm/system-prompt/persona.d.mts +1 -1
  366. package/esm/system-prompt/persona.d.mts.map +1 -1
  367. package/esm/system-prompt/persona.mjs +1 -1
  368. package/esm/system-prompt/persona.mjs.map +1 -1
  369. package/esm/system-prompt/render-placeholders.d.mts +1 -1
  370. package/esm/system-prompt/render-placeholders.d.mts.map +1 -1
  371. package/esm/system-prompt/render-placeholders.mjs +1 -1
  372. package/esm/system-prompt/render-placeholders.mjs.map +1 -1
  373. package/esm/system-prompt/system-prompt.d.mts +1 -1
  374. package/esm/system-prompt/system-prompt.d.mts.map +1 -1
  375. package/esm/system-prompt/system-prompt.mjs +1 -1
  376. package/esm/system-prompt/system-prompt.mjs.map +1 -1
  377. package/esm/tool/tool.d.mts +1 -1
  378. package/esm/tool/tool.d.mts.map +1 -1
  379. package/esm/tool/tool.mjs +3 -2
  380. package/esm/tool/tool.mjs.map +1 -1
  381. package/esm/utils/compute-cost.d.mts +1 -1
  382. package/esm/utils/compute-cost.d.mts.map +1 -1
  383. package/esm/utils/compute-cost.mjs +1 -1
  384. package/esm/utils/compute-cost.mjs.map +1 -1
  385. package/esm/utils/extract-json-payload.d.mts +1 -1
  386. package/esm/utils/extract-json-payload.d.mts.map +1 -1
  387. package/esm/utils/extract-json-payload.mjs +1 -1
  388. package/esm/utils/extract-json-payload.mjs.map +1 -1
  389. package/esm/utils/generate-run-id.d.mts +1 -1
  390. package/esm/utils/generate-run-id.d.mts.map +1 -1
  391. package/esm/utils/generate-run-id.mjs +1 -1
  392. package/esm/utils/generate-run-id.mjs.map +1 -1
  393. package/esm/utils/json-schema.d.mts +1 -1
  394. package/esm/utils/json-schema.d.mts.map +1 -1
  395. package/esm/utils/json-schema.mjs +1 -1
  396. package/esm/utils/json-schema.mjs.map +1 -1
  397. package/esm/utils/prepare-attachment-part.d.mts +1 -1
  398. package/esm/utils/prepare-attachment-part.d.mts.map +1 -1
  399. package/esm/utils/prepare-attachment-part.mjs +1 -1
  400. package/esm/utils/prepare-attachment-part.mjs.map +1 -1
  401. package/esm/utils/resolve-attachment.d.mts +1 -1
  402. package/esm/utils/resolve-attachment.d.mts.map +1 -1
  403. package/esm/utils/resolve-attachment.mjs +1 -1
  404. package/esm/utils/resolve-attachment.mjs.map +1 -1
  405. package/esm/utils/safe-json-parse.d.mts +1 -1
  406. package/esm/utils/safe-json-parse.d.mts.map +1 -1
  407. package/esm/utils/safe-json-parse.mjs +1 -1
  408. package/esm/utils/safe-json-parse.mjs.map +1 -1
  409. package/esm/utils/stamp-report-lineage.d.mts +1 -1
  410. package/esm/utils/stamp-report-lineage.d.mts.map +1 -1
  411. package/esm/utils/stamp-report-lineage.mjs +1 -1
  412. package/esm/utils/stamp-report-lineage.mjs.map +1 -1
  413. package/esm/utils/token-count.d.mts +1 -1
  414. package/esm/utils/token-count.d.mts.map +1 -1
  415. package/esm/utils/token-count.mjs +1 -1
  416. package/esm/utils/token-count.mjs.map +1 -1
  417. package/esm/workflow/as-tool.mjs +1 -1
  418. package/esm/workflow/as-tool.mjs.map +1 -1
  419. package/esm/workflow/cancellation.mjs +1 -1
  420. package/esm/workflow/cancellation.mjs.map +1 -1
  421. package/esm/workflow/emitter.mjs +1 -1
  422. package/esm/workflow/emitter.mjs.map +1 -1
  423. package/esm/workflow/engine.mjs +1 -1
  424. package/esm/workflow/engine.mjs.map +1 -1
  425. package/esm/workflow/retry.mjs +1 -1
  426. package/esm/workflow/retry.mjs.map +1 -1
  427. package/esm/workflow/router.mjs +1 -1
  428. package/esm/workflow/router.mjs.map +1 -1
  429. package/esm/workflow/run-scoped-emitter.mjs +1 -1
  430. package/esm/workflow/run-scoped-emitter.mjs.map +1 -1
  431. package/esm/workflow/signature.d.mts +1 -1
  432. package/esm/workflow/signature.d.mts.map +1 -1
  433. package/esm/workflow/signature.mjs +1 -1
  434. package/esm/workflow/signature.mjs.map +1 -1
  435. package/esm/workflow/snapshot.mjs +1 -1
  436. package/esm/workflow/snapshot.mjs.map +1 -1
  437. package/esm/workflow/state.mjs +1 -1
  438. package/esm/workflow/state.mjs.map +1 -1
  439. package/esm/workflow/step-runner.mjs +1 -1
  440. package/esm/workflow/step-runner.mjs.map +1 -1
  441. package/esm/workflow/step.d.mts +1 -1
  442. package/esm/workflow/step.d.mts.map +1 -1
  443. package/esm/workflow/step.mjs +1 -1
  444. package/esm/workflow/step.mjs.map +1 -1
  445. package/esm/workflow/workflow.d.mts +1 -1
  446. package/esm/workflow/workflow.d.mts.map +1 -1
  447. package/esm/workflow/workflow.mjs +1 -1
  448. package/esm/workflow/workflow.mjs.map +1 -1
  449. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"engine.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/engine.ts"],"sourcesContent":["import { log } from \"@warlock.js/logger\";\nimport type { BaseReport } from \"../contracts/result/base-report.type\";\nimport type { StepSnapshot } from \"../contracts/result/step-result.type\";\nimport type { Usage } from \"../contracts/result/usage.type\";\nimport type {\n WorkflowReport,\n WorkflowResult,\n} from \"../contracts/result/workflow-result.type\";\nimport type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowContext } from \"../contracts/workflow/workflow-context.type\";\nimport type { WorkflowSnapshot } from \"../contracts/workflow/workflow-snapshot.type\";\nimport type {\n WorkflowDefinition,\n WorkflowEventHandlers,\n} from \"../contracts/workflow/workflow.contract\";\nimport {\n AIError,\n MaxStepsExceededError,\n RoutingError,\n SchemaValidationError,\n WorkflowCancelledError,\n WorkflowError,\n} from \"../errors\";\nimport { stampReportLineage } from \"../utils\";\nimport { createCancelledError } from \"./cancellation\";\nimport type { WorkflowEmitter } from \"./emitter\";\nimport { mapNextStep, nextDeclaredStep, resolveNextStep } from \"./router\";\nimport { runScopedEmitter } from \"./run-scoped-emitter\";\nimport { persistSnapshot } from \"./snapshot\";\nimport { cloneState, deepFreeze } from \"./state\";\nimport { executeStep, finalizeSnapshot, toAIError } from \"./step-runner\";\n\nexport { loadSnapshotForResume } from \"./snapshot\";\n\nconst DEFAULT_MAX_STEPS = 100;\nconst DEFAULT_LOOP_WARN = 5;\nconst LOG_MODULE_BASE = \"ai.workflow\";\n\ntype EngineParams<TOutput> = {\n definition: WorkflowDefinition<any, TOutput, any, any>;\n signature: string;\n emitter: WorkflowEmitter;\n input: unknown;\n /**\n * Request-scoped envelope, frozen and exposed as `ctx.context` to\n * every step. Never persisted in snapshots; resume callers supply\n * it fresh via `WorkflowResumeOptions.context`. Defaults to a\n * frozen empty object when caller omits it.\n */\n context?: unknown;\n runId: string;\n signal?: AbortSignal;\n executionHandlers?: WorkflowEventHandlers;\n resumeFrom?: WorkflowSnapshot;\n /**\n * Opaque session identifier propagated onto every report node this\n * run produces — including agent reports from child steps. Threaded\n * from `WorkflowRunOptions.sessionId`. Omitted leaves the field\n * undefined throughout the tree.\n */\n sessionId?: string;\n};\n\n/**\n * Main workflow driver. Walks the declared steps, handling routing,\n * cancellation, retries, parallel execution, and snapshot\n * persistence. Delegates the step lifecycle to `step-runner.ts`,\n * routing to `router.ts`, persistence to `snapshot.ts`. Never throws\n * — every failure funnels into `result.error`.\n */\nexport async function runWorkflow<TOutput>(\n params: EngineParams<TOutput>,\n): Promise<WorkflowResult<TOutput>> {\n const { definition, signature, input, runId, signal } = params;\n // Bind the factory-scoped emitter to THIS run's identity. Every\n // `emitter.emit(...)` below — and the one threaded into\n // `executeStep` — now stamps `runId` / `rootRunId` automatically.\n const emitter = runScopedEmitter(params.emitter, {\n runId,\n rootRunId: runId,\n });\n\n // Freeze the envelope once at run start. Default to `{}` so step\n // code can always read `ctx.context` without an undefined guard.\n const context = Object.freeze(params.context ?? {});\n const maxSteps = definition.maxSteps ?? DEFAULT_MAX_STEPS;\n const loopWarnAfter = definition.loopWarnAfter ?? DEFAULT_LOOP_WARN;\n\n const logger = log;\n const logModule = `${LOG_MODULE_BASE}.${definition.name}`;\n\n const stepByName = new Map<string, StepDefinition>();\n for (const s of definition.steps) stepByName.set(s.name, s);\n\n const state: Record<string, unknown> = params.resumeFrom\n ? { ...params.resumeFrom.state }\n : {};\n const steps: Record<string, StepSnapshot> = params.resumeFrom\n ? { ...params.resumeFrom.steps }\n : {};\n const enteredCount = new Map<string, number>();\n const usage: Usage = { input: 0, output: 0, total: 0 };\n\n const startedAt = params.resumeFrom?.startedAt ?? new Date().toISOString();\n const startedAtDate = new Date(startedAt);\n const runStartPerf = performance.now();\n\n let error: AIError | undefined;\n let status: \"completed\" | \"failed\" | \"cancelled\" = \"completed\";\n let cancelledAt: string | undefined;\n let lastGoto: string | null = null;\n // Captured when a step throws after retries exhaust (and `onFailure`\n // didn't recover). Used to point the final snapshot's `next` at the\n // failed step so `resume()` re-runs it after the cause is fixed.\n let failedStepName: string | undefined;\n\n const buildContext = (current?: {\n state: Record<string, unknown>;\n agentResult?: unknown;\n }): WorkflowContext => ({\n input,\n context,\n steps: steps as Readonly<Record<string, StepSnapshot>>,\n state: current?.state ?? state,\n agentResult: current?.agentResult as WorkflowContext[\"agentResult\"],\n runId,\n signal,\n startedAt: startedAtDate,\n });\n\n emitter.emit(\n \"workflow.starting\",\n { workflowName: definition.name, input },\n params.executionHandlers,\n );\n logger.info(logModule, \"starting\", \"workflow starting\", { runId });\n\n let currentName: string | null = resolveInitialStep(\n definition,\n params.resumeFrom,\n );\n let stepCount = 0;\n\n try {\n while (currentName !== null) {\n if (signal?.aborted) throw createCancelledError(signal);\n\n stepCount += 1;\n if (stepCount > maxSteps) {\n throw new MaxStepsExceededError(\n `workflow \"${definition.name}\" exceeded maxSteps=${maxSteps}`,\n { maxSteps },\n );\n }\n\n const entered = (enteredCount.get(currentName) ?? 0) + 1;\n enteredCount.set(currentName, entered);\n if (entered === loopWarnAfter) {\n emitter.emit(\n \"workflow.loop.warning\",\n { step: currentName, enteredCount: entered, lastGoto },\n params.executionHandlers,\n );\n logger.warn(logModule, \"loop.warning\", \"loop warning\", {\n step: currentName,\n enteredCount: entered,\n });\n }\n\n const step = stepByName.get(currentName);\n if (!step) {\n throw new RoutingError(\n `workflow \"${definition.name}\": unknown step \"${currentName}\"`,\n { stepName: currentName },\n );\n }\n\n const snapshot = await executeStep({\n step,\n state,\n emitter,\n executionHandlers: params.executionHandlers,\n logger,\n logModule,\n signal,\n buildContext,\n usage,\n workflowDefaultRetry: definition.defaultRetry,\n });\n\n Object.assign(state, snapshot.state);\n steps[step.name] = finalizeSnapshot(snapshot);\n // Parallel children — flat-path addressing alongside nested.\n if (snapshot.steps) {\n for (const [childName, childSnap] of Object.entries(snapshot.steps)) {\n steps[childName] = childSnap;\n }\n }\n\n // Failure path: retries exhausted. Give `onFailure` a chance to\n // recover; otherwise checkpoint at the failed step (so resume\n // re-runs it) and throw — workflow halts.\n if (snapshot.status === \"failed\" && snapshot.error) {\n const failureRoute = await resolveFailureRoute({\n step,\n definition,\n error: snapshot.error,\n ctx: buildContext({ state, agentResult: snapshot.executionResult }),\n });\n\n if (failureRoute === undefined) {\n // No recovery — persist with `next: step.name` so resume\n // re-runs this step after the user fixes the cause.\n const persistOutcome = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: step.name,\n status: \"running\",\n });\n if (!persistOutcome.ok) {\n const persistErr = toAIError(persistOutcome.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(\n logModule,\n \"persist.failed\",\n \"snapshot persist failed\",\n {\n step: step.name,\n code: persistErr.code,\n message: persistErr.message,\n },\n );\n }\n failedStepName = step.name;\n throw snapshot.error;\n }\n\n // onFailure routed — workflow continues. Checkpoint at the\n // routed target (or `null` for `end`) so resume picks up there.\n const failureNext = failureRoute === \"end\" ? null : failureRoute;\n if (failureNext !== null && !stepByName.has(failureNext)) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" onFailure routed to unknown target \"${failureNext}\"`,\n { stepName: step.name, targetName: failureNext },\n );\n }\n\n const failurePersist = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: failureNext,\n status: \"running\",\n });\n if (!failurePersist.ok) {\n const persistErr = toAIError(failurePersist.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(\n logModule,\n \"persist.failed\",\n \"snapshot persist failed\",\n {\n step: step.name,\n code: persistErr.code,\n message: persistErr.message,\n },\n );\n }\n\n if (signal?.aborted) throw createCancelledError(signal);\n\n if (failureRoute === \"end\") {\n currentName = null;\n break;\n }\n\n lastGoto = failureRoute;\n currentName = failureRoute;\n continue;\n }\n\n // Resolve next step for checkpoint accuracy BEFORE routing errors\n // bubble — so the snapshot records where resume should resume from.\n const resolved = await resolveNextStep({\n step,\n definition,\n ctx: buildContext({ state, agentResult: snapshot.executionResult }),\n });\n\n const nextName =\n resolved === \"end\"\n ? null\n : typeof resolved === \"string\"\n ? resolved\n : nextDeclaredStep(definition, step.name);\n\n // Checkpoint after every step with the resolved `next`.\n const outcome = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: nextName,\n status: \"running\",\n });\n if (!outcome.ok) {\n const persistErr = toAIError(outcome.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(logModule, \"persist.failed\", \"snapshot persist failed\", {\n step: step.name,\n code: persistErr.code,\n message: persistErr.message,\n });\n }\n\n if (signal?.aborted) throw createCancelledError(signal);\n\n if (resolved === \"end\") {\n currentName = null;\n break;\n }\n\n if (typeof resolved === \"string\") {\n if (!stepByName.has(resolved)) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" goto unknown target \"${resolved}\"`,\n { stepName: step.name, targetName: resolved },\n );\n }\n lastGoto = resolved;\n currentName = resolved;\n continue;\n }\n\n currentName = nextName;\n lastGoto = currentName;\n }\n } catch (err) {\n if (err instanceof WorkflowCancelledError) {\n status = \"cancelled\";\n cancelledAt = err.cancelledAt;\n error = err;\n } else if (err instanceof AIError) {\n status = \"failed\";\n error = err;\n } else {\n status = \"failed\";\n error = new WorkflowError(\n err instanceof Error ? err.message : String(err),\n { cause: err },\n );\n }\n }\n\n // Note: a `failed` step always throws (caught above) unless its\n // `onFailure` recovered the run. A `completed` workflow may still\n // contain `failed` step snapshots — those are the recovered cases\n // and are intentionally preserved for forensic trace.\n\n const endedAt = new Date().toISOString();\n const duration = performance.now() - runStartPerf;\n\n let data: TOutput | undefined;\n if (status === \"completed\" && definition.output) {\n try {\n const extracted = await definition.output.extract(\n buildContext({ state }),\n );\n data = (await validateWorkflowOutput(\n definition.output.schema,\n extracted,\n )) as TOutput;\n } catch (err) {\n status = \"failed\";\n error =\n err instanceof AIError\n ? err\n : new WorkflowError(\n err instanceof Error ? err.message : String(err),\n { cause: err },\n );\n }\n }\n\n // Collect child executable reports from every step that ran one.\n // Today the step runner surfaces agent reports (the only executable\n // kind steps can invoke natively via `step.agent`); custom `run`\n // callbacks that call tools/workflows/supervisors can't be observed\n // here without a richer step-runner API — that's a v1.x follow-up\n // (see backlog: \"step.run executables surface in workflow tree\").\n const children: BaseReport[] = [];\n for (const stepName in steps) {\n const snap = steps[stepName];\n if (snap.agentReport) {\n children.push(snap.agentReport);\n }\n }\n\n const report: WorkflowReport = {\n runId,\n rootRunId: runId,\n name: definition.name,\n version: definition.version,\n type: \"workflow\",\n workflowName: definition.name,\n signature,\n status,\n startedAt,\n endedAt,\n duration,\n cancelledAt,\n usage,\n children,\n steps,\n state: deepFreeze(cloneState(state)),\n };\n\n // Stamp lineage on the assembled tree exactly once. Walker rewrites\n // any inner self-roots that nested agent reports brought in (each\n // agent's `buildResult` set its own runId as root), propagates\n // sessionId, and writes `reportSchemaVersion` on the root.\n stampReportLineage(report, {\n rootRunId: runId,\n sessionId: params.sessionId,\n });\n\n // On a failed run with a captured `failedStepName`, point `next` at\n // the failed step so `resume()` re-runs it. The pre-throw checkpoint\n // already wrote this value, but the final snapshot would otherwise\n // overwrite it with `null` and force resume to fall back to the\n // first non-completed step (which is the same step in practice, but\n // less informative for tooling reading the snapshot).\n const finalNext = status === \"failed\" ? failedStepName ?? null : null;\n\n const finalOutcome = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: finalNext,\n status,\n });\n if (!finalOutcome.ok) {\n const persistErr = toAIError(finalOutcome.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(logModule, \"persist.failed\", \"final snapshot persist failed\", {\n code: persistErr.code,\n message: persistErr.message,\n });\n }\n\n const result: WorkflowResult<TOutput> = {\n type: \"workflow\",\n data,\n report,\n usage,\n error,\n };\n\n if (status === \"cancelled\") {\n emitter.emit(\n \"workflow.cancelled\",\n {\n cancelledAt: cancelledAt ?? endedAt,\n reason: (error as WorkflowCancelledError | undefined)?.reason ?? \"\",\n },\n params.executionHandlers,\n );\n logger.warn(logModule, \"cancelled\", \"workflow cancelled\", { runId });\n }\n\n if (status === \"failed\" && error) {\n emitter.emit(\"workflow.error\", { error }, params.executionHandlers);\n logger.error(logModule, \"error\", \"workflow failed\", {\n runId,\n code: error.code,\n message: error.message,\n });\n }\n\n emitter.emit(\n \"workflow.completed\",\n { result: result as WorkflowResult<unknown> },\n params.executionHandlers,\n );\n logger.info(logModule, \"completed\", \"workflow completed\", {\n runId,\n status,\n duration,\n });\n\n return result;\n}\n\n/**\n * Run a failed step's `onFailure` hook (if present) and translate its\n * result into a route. Returns `undefined` when the workflow should\n * halt with the original error; `\"end\"` for clean termination; or a\n * step name to redirect to. A throw inside `onFailure` is wrapped in\n * `RoutingError` — routing is authoritative, never retried.\n */\nasync function resolveFailureRoute<T>(params: {\n step: StepDefinition;\n definition: WorkflowDefinition<any, T, any, any>;\n error: AIError;\n ctx: WorkflowContext;\n}): Promise<\"end\" | string | undefined> {\n const { step, definition, error, ctx } = params;\n if (!step.onFailure) return undefined;\n\n let outcome;\n try {\n outcome = await step.onFailure(ctx, error);\n } catch (err) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" onFailure threw`,\n { stepName: step.name, cause: err },\n );\n }\n return mapNextStep(outcome);\n}\n\nfunction resolveInitialStep<T>(\n definition: WorkflowDefinition<any, T, any, any>,\n resumeFrom: WorkflowSnapshot | undefined,\n): string | null {\n if (!resumeFrom) return definition.steps[0]?.name ?? null;\n\n // Prefer the explicitly-recorded `next` (now populated on every\n // checkpoint). Falls back to first step whose snapshot is missing\n // or not in a terminal-success state — covers older snapshots\n // written before `next` was wired.\n if (\n resumeFrom.next &&\n definition.steps.some(s => s.name === resumeFrom.next)\n ) {\n return resumeFrom.next;\n }\n\n for (const step of definition.steps) {\n const snap = resumeFrom.steps[step.name];\n if (!snap || (snap.status !== \"completed\" && snap.status !== \"skipped\")) {\n return step.name;\n }\n }\n\n return null;\n}\n\nasync function validateWorkflowOutput(\n schema: unknown,\n value: unknown,\n): Promise<unknown> {\n if (!schema) return value;\n\n const result = await (\n schema as {\n \"~standard\": { validate: (v: unknown) => Promise<unknown> | unknown };\n }\n )[\"~standard\"].validate(value);\n\n if (\n result &&\n typeof result === \"object\" &&\n \"issues\" in result &&\n (result as { issues: unknown }).issues\n ) {\n throw new SchemaValidationError(\n \"workflow output failed schema validation\",\n {\n issues: (result as { issues: any }).issues,\n },\n );\n }\n\n return (result as { value: unknown }).value;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"engine.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/engine.ts"],"sourcesContent":["import { log } from \"@warlock.js/logger\";\nimport type { BaseReport } from \"../contracts/result/base-report.type\";\nimport type { StepSnapshot } from \"../contracts/result/step-result.type\";\nimport type { Usage } from \"../contracts/result/usage.type\";\nimport type {\n WorkflowReport,\n WorkflowResult,\n} from \"../contracts/result/workflow-result.type\";\nimport type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowContext } from \"../contracts/workflow/workflow-context.type\";\nimport type { WorkflowSnapshot } from \"../contracts/workflow/workflow-snapshot.type\";\nimport type {\n WorkflowDefinition,\n WorkflowEventHandlers,\n} from \"../contracts/workflow/workflow.contract\";\nimport {\n AIError,\n MaxStepsExceededError,\n RoutingError,\n SchemaValidationError,\n WorkflowCancelledError,\n WorkflowError,\n} from \"../errors\";\nimport { stampReportLineage } from \"../utils\";\nimport { createCancelledError } from \"./cancellation\";\nimport type { WorkflowEmitter } from \"./emitter\";\nimport { mapNextStep, nextDeclaredStep, resolveNextStep } from \"./router\";\nimport { runScopedEmitter } from \"./run-scoped-emitter\";\nimport { persistSnapshot } from \"./snapshot\";\nimport { cloneState, deepFreeze } from \"./state\";\nimport { executeStep, finalizeSnapshot, toAIError } from \"./step-runner\";\n\nexport { loadSnapshotForResume } from \"./snapshot\";\n\nconst DEFAULT_MAX_STEPS = 100;\nconst DEFAULT_LOOP_WARN = 5;\nconst LOG_MODULE_BASE = \"ai.workflow\";\n\ntype EngineParams<TOutput> = {\n definition: WorkflowDefinition<any, TOutput, any, any>;\n signature: string;\n emitter: WorkflowEmitter;\n input: unknown;\n /**\n * Request-scoped envelope, frozen and exposed as `ctx.context` to\n * every step. Never persisted in snapshots; resume callers supply\n * it fresh via `WorkflowResumeOptions.context`. Defaults to a\n * frozen empty object when caller omits it.\n */\n context?: unknown;\n runId: string;\n signal?: AbortSignal;\n executionHandlers?: WorkflowEventHandlers;\n resumeFrom?: WorkflowSnapshot;\n /**\n * Opaque session identifier propagated onto every report node this\n * run produces — including agent reports from child steps. Threaded\n * from `WorkflowRunOptions.sessionId`. Omitted leaves the field\n * undefined throughout the tree.\n */\n sessionId?: string;\n};\n\n/**\n * Main workflow driver. Walks the declared steps, handling routing,\n * cancellation, retries, parallel execution, and snapshot\n * persistence. Delegates the step lifecycle to `step-runner.ts`,\n * routing to `router.ts`, persistence to `snapshot.ts`. Never throws\n * — every failure funnels into `result.error`.\n */\nexport async function runWorkflow<TOutput>(\n params: EngineParams<TOutput>,\n): Promise<WorkflowResult<TOutput>> {\n const { definition, signature, input, runId, signal } = params;\n // Bind the factory-scoped emitter to THIS run's identity. Every\n // `emitter.emit(...)` below — and the one threaded into\n // `executeStep` — now stamps `runId` / `rootRunId` automatically.\n const emitter = runScopedEmitter(params.emitter, {\n runId,\n rootRunId: runId,\n });\n\n // Freeze the envelope once at run start. Default to `{}` so step\n // code can always read `ctx.context` without an undefined guard.\n const context = Object.freeze(params.context ?? {});\n const maxSteps = definition.maxSteps ?? DEFAULT_MAX_STEPS;\n const loopWarnAfter = definition.loopWarnAfter ?? DEFAULT_LOOP_WARN;\n\n const logger = log;\n const logModule = `${LOG_MODULE_BASE}.${definition.name}`;\n\n const stepByName = new Map<string, StepDefinition>();\n for (const s of definition.steps) stepByName.set(s.name, s);\n\n const state: Record<string, unknown> = params.resumeFrom\n ? { ...params.resumeFrom.state }\n : {};\n const steps: Record<string, StepSnapshot> = params.resumeFrom\n ? { ...params.resumeFrom.steps }\n : {};\n const enteredCount = new Map<string, number>();\n const usage: Usage = { input: 0, output: 0, total: 0 };\n\n const startedAt = params.resumeFrom?.startedAt ?? new Date().toISOString();\n const startedAtDate = new Date(startedAt);\n const runStartPerf = performance.now();\n\n let error: AIError | undefined;\n let status: \"completed\" | \"failed\" | \"cancelled\" = \"completed\";\n let cancelledAt: string | undefined;\n let lastGoto: string | null = null;\n // Captured when a step throws after retries exhaust (and `onFailure`\n // didn't recover). Used to point the final snapshot's `next` at the\n // failed step so `resume()` re-runs it after the cause is fixed.\n let failedStepName: string | undefined;\n\n const buildContext = (current?: {\n state: Record<string, unknown>;\n agentResult?: unknown;\n }): WorkflowContext => ({\n input,\n context,\n steps: steps as Readonly<Record<string, StepSnapshot>>,\n state: current?.state ?? state,\n agentResult: current?.agentResult as WorkflowContext[\"agentResult\"],\n runId,\n signal,\n startedAt: startedAtDate,\n });\n\n emitter.emit(\n \"workflow.starting\",\n { workflowName: definition.name, input },\n params.executionHandlers,\n );\n logger.info(logModule, \"starting\", \"workflow starting\", { runId });\n\n let currentName: string | null = resolveInitialStep(\n definition,\n params.resumeFrom,\n );\n let stepCount = 0;\n\n try {\n while (currentName !== null) {\n if (signal?.aborted) throw createCancelledError(signal);\n\n stepCount += 1;\n if (stepCount > maxSteps) {\n throw new MaxStepsExceededError(\n `workflow \"${definition.name}\" exceeded maxSteps=${maxSteps}`,\n { maxSteps },\n );\n }\n\n const entered = (enteredCount.get(currentName) ?? 0) + 1;\n enteredCount.set(currentName, entered);\n if (entered === loopWarnAfter) {\n emitter.emit(\n \"workflow.loop.warning\",\n { step: currentName, enteredCount: entered, lastGoto },\n params.executionHandlers,\n );\n logger.warn(logModule, \"loop.warning\", \"loop warning\", {\n step: currentName,\n enteredCount: entered,\n });\n }\n\n const step = stepByName.get(currentName);\n if (!step) {\n throw new RoutingError(\n `workflow \"${definition.name}\": unknown step \"${currentName}\"`,\n { stepName: currentName },\n );\n }\n\n const snapshot = await executeStep({\n step,\n state,\n emitter,\n executionHandlers: params.executionHandlers,\n logger,\n logModule,\n signal,\n buildContext,\n usage,\n workflowDefaultRetry: definition.defaultRetry,\n });\n\n Object.assign(state, snapshot.state);\n steps[step.name] = finalizeSnapshot(snapshot);\n // Parallel children — flat-path addressing alongside nested.\n if (snapshot.steps) {\n for (const [childName, childSnap] of Object.entries(snapshot.steps)) {\n steps[childName] = childSnap;\n }\n }\n\n // Failure path: retries exhausted. Give `onFailure` a chance to\n // recover; otherwise checkpoint at the failed step (so resume\n // re-runs it) and throw — workflow halts.\n if (snapshot.status === \"failed\" && snapshot.error) {\n const failureRoute = await resolveFailureRoute({\n step,\n definition,\n error: snapshot.error,\n ctx: buildContext({ state, agentResult: snapshot.executionResult }),\n });\n\n if (failureRoute === undefined) {\n // No recovery — persist with `next: step.name` so resume\n // re-runs this step after the user fixes the cause.\n const persistOutcome = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: step.name,\n status: \"running\",\n });\n if (!persistOutcome.ok) {\n const persistErr = toAIError(persistOutcome.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(\n logModule,\n \"persist.failed\",\n \"snapshot persist failed\",\n {\n step: step.name,\n code: persistErr.code,\n message: persistErr.message,\n },\n );\n }\n failedStepName = step.name;\n throw snapshot.error;\n }\n\n // onFailure routed — workflow continues. Checkpoint at the\n // routed target (or `null` for `end`) so resume picks up there.\n const failureNext = failureRoute === \"end\" ? null : failureRoute;\n if (failureNext !== null && !stepByName.has(failureNext)) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" onFailure routed to unknown target \"${failureNext}\"`,\n { stepName: step.name, targetName: failureNext },\n );\n }\n\n const failurePersist = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: failureNext,\n status: \"running\",\n });\n if (!failurePersist.ok) {\n const persistErr = toAIError(failurePersist.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(\n logModule,\n \"persist.failed\",\n \"snapshot persist failed\",\n {\n step: step.name,\n code: persistErr.code,\n message: persistErr.message,\n },\n );\n }\n\n if (signal?.aborted) throw createCancelledError(signal);\n\n if (failureRoute === \"end\") {\n currentName = null;\n break;\n }\n\n lastGoto = failureRoute;\n currentName = failureRoute;\n continue;\n }\n\n // Resolve next step for checkpoint accuracy BEFORE routing errors\n // bubble — so the snapshot records where resume should resume from.\n const resolved = await resolveNextStep({\n step,\n definition,\n ctx: buildContext({ state, agentResult: snapshot.executionResult }),\n });\n\n const nextName =\n resolved === \"end\"\n ? null\n : typeof resolved === \"string\"\n ? resolved\n : nextDeclaredStep(definition, step.name);\n\n // Checkpoint after every step with the resolved `next`.\n const outcome = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: nextName,\n status: \"running\",\n });\n if (!outcome.ok) {\n const persistErr = toAIError(outcome.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(logModule, \"persist.failed\", \"snapshot persist failed\", {\n step: step.name,\n code: persistErr.code,\n message: persistErr.message,\n });\n }\n\n if (signal?.aborted) throw createCancelledError(signal);\n\n if (resolved === \"end\") {\n currentName = null;\n break;\n }\n\n if (typeof resolved === \"string\") {\n if (!stepByName.has(resolved)) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" goto unknown target \"${resolved}\"`,\n { stepName: step.name, targetName: resolved },\n );\n }\n lastGoto = resolved;\n currentName = resolved;\n continue;\n }\n\n currentName = nextName;\n lastGoto = currentName;\n }\n } catch (err) {\n if (err instanceof WorkflowCancelledError) {\n status = \"cancelled\";\n cancelledAt = err.cancelledAt;\n error = err;\n } else if (err instanceof AIError) {\n status = \"failed\";\n error = err;\n } else {\n status = \"failed\";\n error = new WorkflowError(\n err instanceof Error ? err.message : String(err),\n { cause: err },\n );\n }\n }\n\n // Note: a `failed` step always throws (caught above) unless its\n // `onFailure` recovered the run. A `completed` workflow may still\n // contain `failed` step snapshots — those are the recovered cases\n // and are intentionally preserved for forensic trace.\n\n const endedAt = new Date().toISOString();\n const duration = performance.now() - runStartPerf;\n\n let data: TOutput | undefined;\n if (status === \"completed\" && definition.output) {\n try {\n const extracted = await definition.output.extract(\n buildContext({ state }),\n );\n data = (await validateWorkflowOutput(\n definition.output.schema,\n extracted,\n )) as TOutput;\n } catch (err) {\n status = \"failed\";\n error =\n err instanceof AIError\n ? err\n : new WorkflowError(\n err instanceof Error ? err.message : String(err),\n { cause: err },\n );\n }\n }\n\n // Collect child executable reports from every step that ran one.\n // Today the step runner surfaces agent reports (the only executable\n // kind steps can invoke natively via `step.agent`); custom `run`\n // callbacks that call tools/workflows/supervisors can't be observed\n // here without a richer step-runner API — that's a v1.x follow-up\n // (see backlog: \"step.run executables surface in workflow tree\").\n const children: BaseReport[] = [];\n for (const stepName in steps) {\n const snap = steps[stepName];\n if (snap.agentReport) {\n children.push(snap.agentReport);\n }\n }\n\n const report: WorkflowReport = {\n runId,\n rootRunId: runId,\n name: definition.name,\n version: definition.version,\n type: \"workflow\",\n workflowName: definition.name,\n signature,\n status,\n startedAt,\n endedAt,\n duration,\n cancelledAt,\n usage,\n children,\n steps,\n state: deepFreeze(cloneState(state)),\n };\n\n // Stamp lineage on the assembled tree exactly once. Walker rewrites\n // any inner self-roots that nested agent reports brought in (each\n // agent's `buildResult` set its own runId as root), propagates\n // sessionId, and writes `reportSchemaVersion` on the root.\n stampReportLineage(report, {\n rootRunId: runId,\n sessionId: params.sessionId,\n });\n\n // On a failed run with a captured `failedStepName`, point `next` at\n // the failed step so `resume()` re-runs it. The pre-throw checkpoint\n // already wrote this value, but the final snapshot would otherwise\n // overwrite it with `null` and force resume to fall back to the\n // first non-completed step (which is the same step in practice, but\n // less informative for tooling reading the snapshot).\n const finalNext = status === \"failed\" ? failedStepName ?? null : null;\n\n const finalOutcome = await persistSnapshot({\n definition,\n signature,\n runId,\n startedAt,\n input,\n state,\n steps,\n next: finalNext,\n status,\n });\n if (!finalOutcome.ok) {\n const persistErr = toAIError(finalOutcome.error);\n emitter.emit(\n \"workflow.error\",\n { error: persistErr },\n params.executionHandlers,\n );\n logger.error(logModule, \"persist.failed\", \"final snapshot persist failed\", {\n code: persistErr.code,\n message: persistErr.message,\n });\n }\n\n const result: WorkflowResult<TOutput> = {\n type: \"workflow\",\n data,\n report,\n usage,\n error,\n };\n\n if (status === \"cancelled\") {\n emitter.emit(\n \"workflow.cancelled\",\n {\n cancelledAt: cancelledAt ?? endedAt,\n reason: (error as WorkflowCancelledError | undefined)?.reason ?? \"\",\n },\n params.executionHandlers,\n );\n logger.warn(logModule, \"cancelled\", \"workflow cancelled\", { runId });\n }\n\n if (status === \"failed\" && error) {\n emitter.emit(\"workflow.error\", { error }, params.executionHandlers);\n logger.error(logModule, \"error\", \"workflow failed\", {\n runId,\n code: error.code,\n message: error.message,\n });\n }\n\n emitter.emit(\n \"workflow.completed\",\n { result: result as WorkflowResult<unknown> },\n params.executionHandlers,\n );\n logger.info(logModule, \"completed\", \"workflow completed\", {\n runId,\n status,\n duration,\n });\n\n return result;\n}\n\n/**\n * Run a failed step's `onFailure` hook (if present) and translate its\n * result into a route. Returns `undefined` when the workflow should\n * halt with the original error; `\"end\"` for clean termination; or a\n * step name to redirect to. A throw inside `onFailure` is wrapped in\n * `RoutingError` — routing is authoritative, never retried.\n */\nasync function resolveFailureRoute<T>(params: {\n step: StepDefinition;\n definition: WorkflowDefinition<any, T, any, any>;\n error: AIError;\n ctx: WorkflowContext;\n}): Promise<\"end\" | string | undefined> {\n const { step, definition, error, ctx } = params;\n if (!step.onFailure) return undefined;\n\n let outcome;\n try {\n outcome = await step.onFailure(ctx, error);\n } catch (err) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" onFailure threw`,\n { stepName: step.name, cause: err },\n );\n }\n return mapNextStep(outcome);\n}\n\nfunction resolveInitialStep<T>(\n definition: WorkflowDefinition<any, T, any, any>,\n resumeFrom: WorkflowSnapshot | undefined,\n): string | null {\n if (!resumeFrom) return definition.steps[0]?.name ?? null;\n\n // Prefer the explicitly-recorded `next` (now populated on every\n // checkpoint). Falls back to first step whose snapshot is missing\n // or not in a terminal-success state — covers older snapshots\n // written before `next` was wired.\n if (\n resumeFrom.next &&\n definition.steps.some(s => s.name === resumeFrom.next)\n ) {\n return resumeFrom.next;\n }\n\n for (const step of definition.steps) {\n const snap = resumeFrom.steps[step.name];\n if (!snap || (snap.status !== \"completed\" && snap.status !== \"skipped\")) {\n return step.name;\n }\n }\n\n return null;\n}\n\nasync function validateWorkflowOutput(\n schema: unknown,\n value: unknown,\n): Promise<unknown> {\n if (!schema) return value;\n\n const result = await (\n schema as {\n \"~standard\": { validate: (v: unknown) => Promise<unknown> | unknown };\n }\n )[\"~standard\"].validate(value);\n\n if (\n result &&\n typeof result === \"object\" &&\n \"issues\" in result &&\n (result as { issues: unknown }).issues\n ) {\n throw new SchemaValidationError(\n \"workflow output failed schema validation\",\n {\n issues: (result as { issues: any }).issues,\n },\n );\n }\n\n return (result as { value: unknown }).value;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/workflow/retry.ts
1
+ //#region ../@warlock.js/ai/src/workflow/retry.ts
2
2
  const DEFAULT_BACKOFF_CAP_MS = 3e4;
3
3
  function resolveBackoff(attempt, backoff) {
4
4
  const value = (() => {
@@ -1 +1 @@
1
- {"version":3,"file":"retry.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/retry.ts"],"sourcesContent":["import type {\n RetryBackoff,\n RetryConfig,\n} from \"../contracts/workflow/retry-config.type\";\n\nexport const DEFAULT_BACKOFF_CAP_MS = 30_000;\n\nexport function resolveBackoff(\n attempt: number,\n backoff: RetryBackoff | undefined,\n): number {\n const value = (() => {\n switch (backoff) {\n case \"none\":\n return 0;\n case \"linear\":\n return attempt * 500;\n case \"exponential\":\n case undefined:\n return 500 * 2 ** (attempt - 1);\n default:\n return backoff(attempt);\n }\n })();\n\n return Math.max(0, Math.min(value, DEFAULT_BACKOFF_CAP_MS));\n}\n\nexport function isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const name = (error as { name?: unknown }).name;\n return name === \"AbortError\";\n}\n\n/**\n * Resolve the effective retry config for a step, merging per-step and\n * workflow-level defaults. `retry: false` disables retries entirely.\n */\nexport function resolveRetryConfig(\n step: { retry?: RetryConfig | false } | undefined,\n workflowDefault: RetryConfig | false | undefined,\n): RetryConfig {\n if (step?.retry === false) return { attempts: 1 };\n if (step?.retry) return step.retry;\n if (workflowDefault === false || workflowDefault === undefined) {\n return { attempts: 1 };\n }\n return workflowDefault;\n}\n"],"mappings":";AAKA,MAAa,yBAAyB;AAEtC,SAAgB,eACd,SACA,SACQ;CACR,MAAM,eAAe;EACnB,QAAQ,SAAR;GACE,KAAK,QACH,OAAO;GACT,KAAK,UACH,OAAO,UAAU;GACnB,KAAK;GACL,KAAK,QACH,OAAO,MAAM,MAAM,UAAU;GAC/B,SACE,OAAO,QAAQ,OAAO;EAC1B;CACF,GAAG;CAEH,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,sBAAsB,CAAC;AAC5D;AAEA,SAAgB,aAAa,OAAyB;CACpD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAEhD,OADc,MAA6B,SAC3B;AAClB;;;;;AAMA,SAAgB,mBACd,MACA,iBACa;CACb,IAAI,MAAM,UAAU,OAAO,OAAO,EAAE,UAAU,EAAE;CAChD,IAAI,MAAM,OAAO,OAAO,KAAK;CAC7B,IAAI,oBAAoB,SAAS,oBAAoB,QACnD,OAAO,EAAE,UAAU,EAAE;CAEvB,OAAO;AACT"}
1
+ {"version":3,"file":"retry.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/retry.ts"],"sourcesContent":["import type {\n RetryBackoff,\n RetryConfig,\n} from \"../contracts/workflow/retry-config.type\";\n\nexport const DEFAULT_BACKOFF_CAP_MS = 30_000;\n\nexport function resolveBackoff(\n attempt: number,\n backoff: RetryBackoff | undefined,\n): number {\n const value = (() => {\n switch (backoff) {\n case \"none\":\n return 0;\n case \"linear\":\n return attempt * 500;\n case \"exponential\":\n case undefined:\n return 500 * 2 ** (attempt - 1);\n default:\n return backoff(attempt);\n }\n })();\n\n return Math.max(0, Math.min(value, DEFAULT_BACKOFF_CAP_MS));\n}\n\nexport function isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const name = (error as { name?: unknown }).name;\n return name === \"AbortError\";\n}\n\n/**\n * Resolve the effective retry config for a step, merging per-step and\n * workflow-level defaults. `retry: false` disables retries entirely.\n */\nexport function resolveRetryConfig(\n step: { retry?: RetryConfig | false } | undefined,\n workflowDefault: RetryConfig | false | undefined,\n): RetryConfig {\n if (step?.retry === false) return { attempts: 1 };\n if (step?.retry) return step.retry;\n if (workflowDefault === false || workflowDefault === undefined) {\n return { attempts: 1 };\n }\n return workflowDefault;\n}\n"],"mappings":";AAKA,MAAa,yBAAyB;AAEtC,SAAgB,eACd,SACA,SACQ;CACR,MAAM,eAAe;EACnB,QAAQ,SAAR;GACE,KAAK,QACH,OAAO;GACT,KAAK,UACH,OAAO,UAAU;GACnB,KAAK;GACL,KAAK,QACH,OAAO,MAAM,MAAM,UAAU;GAC/B,SACE,OAAO,QAAQ,OAAO;EAC1B;CACF,EAAC,CAAE;CAEH,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,sBAAsB,CAAC;AAC5D;AAEA,SAAgB,aAAa,OAAyB;CACpD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;CAEhD,OADc,MAA6B,SAC3B;AAClB;;;;;AAMA,SAAgB,mBACd,MACA,iBACa;CACb,IAAI,MAAM,UAAU,OAAO,OAAO,EAAE,UAAU,EAAE;CAChD,IAAI,MAAM,OAAO,OAAO,KAAK;CAC7B,IAAI,oBAAoB,SAAS,oBAAoB,QACnD,OAAO,EAAE,UAAU,EAAE;CAEvB,OAAO;AACT"}
@@ -1,7 +1,7 @@
1
1
  import { RoutingError } from "../errors/routing-error.mjs";
2
2
  import "../errors/index.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/workflow/router.ts
4
+ //#region ../@warlock.js/ai/src/workflow/router.ts
5
5
  /**
6
6
  * Resolve the next step to run after `step` completes. Tries
7
7
  * step-level `nextStep` first, then workflow-level, then falls
@@ -1 +1 @@
1
- {"version":3,"file":"router.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/router.ts"],"sourcesContent":["import type { NextStepResult } from \"../contracts/workflow/next-step-result.type\";\nimport type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowContext } from \"../contracts/workflow/workflow-context.type\";\nimport type { WorkflowDefinition } from \"../contracts/workflow/workflow.contract\";\nimport { RoutingError } from \"../errors\";\n\n/**\n * Resolve the next step to run after `step` completes. Tries\n * step-level `nextStep` first, then workflow-level, then falls\n * through (returns `undefined`, engine picks the next declared step).\n *\n * Throws `RoutingError` when either callback throws — routing is\n * authoritative, so a broken router terminates the workflow instead\n * of being retried.\n */\nexport async function resolveNextStep<T>(params: {\n step: StepDefinition;\n definition: WorkflowDefinition<any, T, any, any>;\n ctx: WorkflowContext;\n}): Promise<\"end\" | string | undefined> {\n const { step, definition, ctx } = params;\n\n if (step.nextStep) {\n let outcome: NextStepResult;\n try {\n outcome = await step.nextStep(ctx);\n } catch (err) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" nextStep threw`,\n { stepName: step.name, cause: err },\n );\n }\n const mapped = mapNextStep(outcome);\n if (mapped !== undefined) return mapped;\n }\n\n if (definition.nextStep) {\n let outcome: NextStepResult;\n try {\n outcome = await definition.nextStep(step.name, ctx);\n } catch (err) {\n throw new RoutingError(\n `workflow \"${definition.name}\": workflow-level nextStep threw after \"${step.name}\"`,\n { stepName: step.name, cause: err },\n );\n }\n const mapped = mapNextStep(outcome);\n if (mapped !== undefined) return mapped;\n }\n\n return undefined;\n}\n\nexport function mapNextStep(\n outcome: NextStepResult,\n): \"end\" | string | undefined {\n if (!outcome) return undefined;\n if (\"end\" in outcome && outcome.end === true) return \"end\";\n if (\"goto\" in outcome && typeof outcome.goto === \"string\")\n return outcome.goto;\n return undefined;\n}\n\nexport function nextDeclaredStep<T>(\n definition: WorkflowDefinition<any, T, any, any>,\n currentName: string,\n): string | null {\n const idx = definition.steps.findIndex(s => s.name === currentName);\n if (idx === -1) return null;\n return definition.steps[idx + 1]?.name ?? null;\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,eAAsB,gBAAmB,QAID;CACtC,MAAM,EAAE,MAAM,YAAY,QAAQ;CAElC,IAAI,KAAK,UAAU;EACjB,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,KAAK,SAAS,GAAG;EACnC,SAAS,KAAK;GACZ,MAAM,IAAI,aACR,aAAa,WAAW,KAAK,WAAW,KAAK,KAAK,mBAClD;IAAE,UAAU,KAAK;IAAM,OAAO;GAAI,CACpC;EACF;EACA,MAAM,SAAS,YAAY,OAAO;EAClC,IAAI,WAAW,QAAW,OAAO;CACnC;CAEA,IAAI,WAAW,UAAU;EACvB,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,WAAW,SAAS,KAAK,MAAM,GAAG;EACpD,SAAS,KAAK;GACZ,MAAM,IAAI,aACR,aAAa,WAAW,KAAK,0CAA0C,KAAK,KAAK,IACjF;IAAE,UAAU,KAAK;IAAM,OAAO;GAAI,CACpC;EACF;EACA,MAAM,SAAS,YAAY,OAAO;EAClC,IAAI,WAAW,QAAW,OAAO;CACnC;AAGF;AAEA,SAAgB,YACd,SAC4B;CAC5B,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,SAAS,WAAW,QAAQ,QAAQ,MAAM,OAAO;CACrD,IAAI,UAAU,WAAW,OAAO,QAAQ,SAAS,UAC/C,OAAO,QAAQ;AAEnB;AAEA,SAAgB,iBACd,YACA,aACe;CACf,MAAM,MAAM,WAAW,MAAM,WAAU,MAAK,EAAE,SAAS,WAAW;CAClE,IAAI,QAAQ,IAAI,OAAO;CACvB,OAAO,WAAW,MAAM,MAAM,IAAI,QAAQ;AAC5C"}
1
+ {"version":3,"file":"router.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/router.ts"],"sourcesContent":["import type { NextStepResult } from \"../contracts/workflow/next-step-result.type\";\nimport type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowContext } from \"../contracts/workflow/workflow-context.type\";\nimport type { WorkflowDefinition } from \"../contracts/workflow/workflow.contract\";\nimport { RoutingError } from \"../errors\";\n\n/**\n * Resolve the next step to run after `step` completes. Tries\n * step-level `nextStep` first, then workflow-level, then falls\n * through (returns `undefined`, engine picks the next declared step).\n *\n * Throws `RoutingError` when either callback throws — routing is\n * authoritative, so a broken router terminates the workflow instead\n * of being retried.\n */\nexport async function resolveNextStep<T>(params: {\n step: StepDefinition;\n definition: WorkflowDefinition<any, T, any, any>;\n ctx: WorkflowContext;\n}): Promise<\"end\" | string | undefined> {\n const { step, definition, ctx } = params;\n\n if (step.nextStep) {\n let outcome: NextStepResult;\n try {\n outcome = await step.nextStep(ctx);\n } catch (err) {\n throw new RoutingError(\n `workflow \"${definition.name}\": step \"${step.name}\" nextStep threw`,\n { stepName: step.name, cause: err },\n );\n }\n const mapped = mapNextStep(outcome);\n if (mapped !== undefined) return mapped;\n }\n\n if (definition.nextStep) {\n let outcome: NextStepResult;\n try {\n outcome = await definition.nextStep(step.name, ctx);\n } catch (err) {\n throw new RoutingError(\n `workflow \"${definition.name}\": workflow-level nextStep threw after \"${step.name}\"`,\n { stepName: step.name, cause: err },\n );\n }\n const mapped = mapNextStep(outcome);\n if (mapped !== undefined) return mapped;\n }\n\n return undefined;\n}\n\nexport function mapNextStep(\n outcome: NextStepResult,\n): \"end\" | string | undefined {\n if (!outcome) return undefined;\n if (\"end\" in outcome && outcome.end === true) return \"end\";\n if (\"goto\" in outcome && typeof outcome.goto === \"string\")\n return outcome.goto;\n return undefined;\n}\n\nexport function nextDeclaredStep<T>(\n definition: WorkflowDefinition<any, T, any, any>,\n currentName: string,\n): string | null {\n const idx = definition.steps.findIndex(s => s.name === currentName);\n if (idx === -1) return null;\n return definition.steps[idx + 1]?.name ?? null;\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,eAAsB,gBAAmB,QAID;CACtC,MAAM,EAAE,MAAM,YAAY,QAAQ;CAElC,IAAI,KAAK,UAAU;EACjB,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,KAAK,SAAS,GAAG;EACnC,SAAS,KAAK;GACZ,MAAM,IAAI,aACR,aAAa,WAAW,KAAK,WAAW,KAAK,KAAK,mBAClD;IAAE,UAAU,KAAK;IAAM,OAAO;GAAI,CACpC;EACF;EACA,MAAM,SAAS,YAAY,OAAO;EAClC,IAAI,WAAW,QAAW,OAAO;CACnC;CAEA,IAAI,WAAW,UAAU;EACvB,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,WAAW,SAAS,KAAK,MAAM,GAAG;EACpD,SAAS,KAAK;GACZ,MAAM,IAAI,aACR,aAAa,WAAW,KAAK,0CAA0C,KAAK,KAAK,IACjF;IAAE,UAAU,KAAK;IAAM,OAAO;GAAI,CACpC;EACF;EACA,MAAM,SAAS,YAAY,OAAO;EAClC,IAAI,WAAW,QAAW,OAAO;CACnC;AAGF;AAEA,SAAgB,YACd,SAC4B;CAC5B,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,SAAS,WAAW,QAAQ,QAAQ,MAAM,OAAO;CACrD,IAAI,UAAU,WAAW,OAAO,QAAQ,SAAS,UAC/C,OAAO,QAAQ;AAEnB;AAEA,SAAgB,iBACd,YACA,aACe;CACf,MAAM,MAAM,WAAW,MAAM,WAAU,MAAK,EAAE,SAAS,WAAW;CAClE,IAAI,QAAQ,IAAI,OAAO;CACvB,OAAO,WAAW,MAAM,MAAM,EAAE,EAAE,QAAQ;AAC5C"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/workflow/run-scoped-emitter.ts
1
+ //#region ../@warlock.js/ai/src/workflow/run-scoped-emitter.ts
2
2
  /**
3
3
  * Bind a factory-scoped `WorkflowEmitter` to one run's identity.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"run-scoped-emitter.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/run-scoped-emitter.ts"],"sourcesContent":["import type { EventIdentity } from \"../contracts/events/event-identity.type\";\nimport type { WorkflowEventMap } from \"../contracts/events/event-map.type\";\nimport type { WorkflowEventHandlers } from \"../contracts/workflow/workflow.contract\";\nimport type { WorkflowEmitter, WorkflowEventSink } from \"./emitter\";\n\n/**\n * Bind a factory-scoped `WorkflowEmitter` to one run's identity.\n *\n * The engine and step-runner emit bare payloads through this sink;\n * it injects `runId` / `rootRunId` once and delegates to the real\n * three-tier emitter. This is the single place workflow run identity\n * is stamped — the alternative (editing every `emitter.emit` call\n * site) would be ~15 scattered edits and easy to miss one.\n *\n * `rootRunId === runId` for a standalone run; nested propagation\n * (a child workflow inheriting an outer run's root) lands in a\n * follow-up.\n *\n * @example\n * // Inside runWorkflow(), once per execution:\n * const emitter = runScopedEmitter(params.emitter, { runId, rootRunId: runId });\n * emitter.emit(\"workflow.starting\", { workflowName, input }, executionHandlers);\n */\nexport function runScopedEmitter(\n emitter: WorkflowEmitter,\n identity: EventIdentity,\n): WorkflowEventSink {\n return {\n emit(event, payload, executionHandlers?: WorkflowEventHandlers) {\n const fullPayload = {\n ...payload,\n ...identity,\n } as WorkflowEventMap[typeof event];\n\n emitter.emit(event, fullPayload, executionHandlers);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,iBACd,SACA,UACmB;CACnB,OAAO,EACL,KAAK,OAAO,SAAS,mBAA2C;EAC9D,MAAM,cAAc;GAClB,GAAG;GACH,GAAG;EACL;EAEA,QAAQ,KAAK,OAAO,aAAa,iBAAiB;CACpD,EACF;AACF"}
1
+ {"version":3,"file":"run-scoped-emitter.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/run-scoped-emitter.ts"],"sourcesContent":["import type { EventIdentity } from \"../contracts/events/event-identity.type\";\nimport type { WorkflowEventMap } from \"../contracts/events/event-map.type\";\nimport type { WorkflowEventHandlers } from \"../contracts/workflow/workflow.contract\";\nimport type { WorkflowEmitter, WorkflowEventSink } from \"./emitter\";\n\n/**\n * Bind a factory-scoped `WorkflowEmitter` to one run's identity.\n *\n * The engine and step-runner emit bare payloads through this sink;\n * it injects `runId` / `rootRunId` once and delegates to the real\n * three-tier emitter. This is the single place workflow run identity\n * is stamped — the alternative (editing every `emitter.emit` call\n * site) would be ~15 scattered edits and easy to miss one.\n *\n * `rootRunId === runId` for a standalone run; nested propagation\n * (a child workflow inheriting an outer run's root) lands in a\n * follow-up.\n *\n * @example\n * // Inside runWorkflow(), once per execution:\n * const emitter = runScopedEmitter(params.emitter, { runId, rootRunId: runId });\n * emitter.emit(\"workflow.starting\", { workflowName, input }, executionHandlers);\n */\nexport function runScopedEmitter(\n emitter: WorkflowEmitter,\n identity: EventIdentity,\n): WorkflowEventSink {\n return {\n emit(event, payload, executionHandlers?: WorkflowEventHandlers) {\n const fullPayload = {\n ...payload,\n ...identity,\n } as WorkflowEventMap[typeof event];\n\n emitter.emit(event, fullPayload, executionHandlers);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,iBACd,SACA,UACmB;CACnB,OAAO,EACL,KAAK,OAAO,SAAS,mBAA2C;EAC9D,MAAM,cAAc;GAClB,GAAG;GACH,GAAG;EACL;EAEA,QAAQ,KAAK,OAAO,aAAa,iBAAiB;CACpD,EACF;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { WorkflowDefinition } from "../contracts/workflow/workflow.contract.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/workflow/signature.d.ts
3
+ //#region ../@warlock.js/ai/src/workflow/signature.d.ts
4
4
  declare function computeSignature<T>(definition: WorkflowDefinition<any, T, any, any>): string;
5
5
  //#endregion
6
6
  export { computeSignature };
@@ -1 +1 @@
1
- {"version":3,"file":"signature.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/signature.ts"],"mappings":";;;iBAoCgB,gBAAA,GAAA,CAAoB,UAAA,EAAY,kBAAkB,MAAM,CAAA"}
1
+ {"version":3,"file":"signature.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/signature.ts"],"mappings":";;;iBAoCgB,gBAAA,IAAoB,UAAA,EAAY,kBAAkB,MAAM,CAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/workflow/signature.ts
1
+ //#region ../@warlock.js/ai/src/workflow/signature.ts
2
2
  function stepFingerprint(step) {
3
3
  const tag = step.parallel ? "parallel" : step.agent ? "agent" : step.run ? "run" : "empty";
4
4
  const agentName = step.agent?.name;
@@ -1 +1 @@
1
- {"version":3,"file":"signature.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/signature.ts"],"sourcesContent":["import type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowDefinition } from \"../contracts/workflow/workflow.contract\";\n\nfunction stepFingerprint(step: StepDefinition): unknown {\n const tag = step.parallel\n ? \"parallel\"\n : step.agent\n ? \"agent\"\n : step.run\n ? \"run\"\n : \"empty\";\n\n const agentName = step.agent?.name;\n\n return {\n n: step.name,\n t: tag,\n a: agentName,\n c: step.parallel?.map(child => stepFingerprint(child)) ?? null,\n };\n}\n\n/**\n * FNV-1a 32-bit hash — deterministic, no crypto dependency.\n */\nfunction hash(input: string): string {\n let h = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n\n return h.toString(16).padStart(8, \"0\");\n}\n\nexport function computeSignature<T>(definition: WorkflowDefinition<any, T, any, any>): string {\n const fingerprint = {\n n: definition.name,\n v: definition.version ?? null,\n s: definition.steps.map(step => stepFingerprint(step)),\n };\n\n return hash(JSON.stringify(fingerprint));\n}\n"],"mappings":";AAGA,SAAS,gBAAgB,MAA+B;CACtD,MAAM,MAAM,KAAK,WACb,aACA,KAAK,QACH,UACA,KAAK,MACH,QACA;CAER,MAAM,YAAY,KAAK,OAAO;CAE9B,OAAO;EACL,GAAG,KAAK;EACR,GAAG;EACH,GAAG;EACH,GAAG,KAAK,UAAU,KAAI,UAAS,gBAAgB,KAAK,CAAC,KAAK;CAC5D;AACF;;;;AAKA,SAAS,KAAK,OAAuB;CACnC,IAAI,IAAI;CAER,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,KAAK,MAAM,WAAW,CAAC;EACvB,IAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,SAAU;CACxE;CAEA,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACvC;AAEA,SAAgB,iBAAoB,YAA0D;CAC5F,MAAM,cAAc;EAClB,GAAG,WAAW;EACd,GAAG,WAAW,WAAW;EACzB,GAAG,WAAW,MAAM,KAAI,SAAQ,gBAAgB,IAAI,CAAC;CACvD;CAEA,OAAO,KAAK,KAAK,UAAU,WAAW,CAAC;AACzC"}
1
+ {"version":3,"file":"signature.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/signature.ts"],"sourcesContent":["import type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowDefinition } from \"../contracts/workflow/workflow.contract\";\n\nfunction stepFingerprint(step: StepDefinition): unknown {\n const tag = step.parallel\n ? \"parallel\"\n : step.agent\n ? \"agent\"\n : step.run\n ? \"run\"\n : \"empty\";\n\n const agentName = step.agent?.name;\n\n return {\n n: step.name,\n t: tag,\n a: agentName,\n c: step.parallel?.map(child => stepFingerprint(child)) ?? null,\n };\n}\n\n/**\n * FNV-1a 32-bit hash — deterministic, no crypto dependency.\n */\nfunction hash(input: string): string {\n let h = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n\n return h.toString(16).padStart(8, \"0\");\n}\n\nexport function computeSignature<T>(definition: WorkflowDefinition<any, T, any, any>): string {\n const fingerprint = {\n n: definition.name,\n v: definition.version ?? null,\n s: definition.steps.map(step => stepFingerprint(step)),\n };\n\n return hash(JSON.stringify(fingerprint));\n}\n"],"mappings":";AAGA,SAAS,gBAAgB,MAA+B;CACtD,MAAM,MAAM,KAAK,WACb,aACA,KAAK,QACH,UACA,KAAK,MACH,QACA;CAER,MAAM,YAAY,KAAK,OAAO;CAE9B,OAAO;EACL,GAAG,KAAK;EACR,GAAG;EACH,GAAG;EACH,GAAG,KAAK,UAAU,KAAI,UAAS,gBAAgB,KAAK,CAAC,KAAK;CAC5D;AACF;;;;AAKA,SAAS,KAAK,OAAuB;CACnC,IAAI,IAAI;CAER,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,KAAK,MAAM,WAAW,CAAC;EACvB,IAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,SAAU;CACxE;CAEA,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AACvC;AAEA,SAAgB,iBAAoB,YAA0D;CAC5F,MAAM,cAAc;EAClB,GAAG,WAAW;EACd,GAAG,WAAW,WAAW;EACzB,GAAG,WAAW,MAAM,KAAI,SAAQ,gBAAgB,IAAI,CAAC;CACvD;CAEA,OAAO,KAAK,KAAK,UAAU,WAAW,CAAC;AACzC"}
@@ -3,7 +3,7 @@ import { WorkflowDriftError } from "../errors/workflow-drift-error.mjs";
3
3
  import "../errors/index.mjs";
4
4
  import { resolveDefaultStore } from "../config.mjs";
5
5
 
6
- //#region ../../@warlock.js/ai/src/workflow/snapshot.ts
6
+ //#region ../@warlock.js/ai/src/workflow/snapshot.ts
7
7
  /**
8
8
  * Resolve the effective snapshot store: the workflow's own
9
9
  * `snapshotStore` field wins; absent that, fall back to the global
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/snapshot.ts"],"sourcesContent":["import { resolveDefaultStore } from \"../config\";\nimport type { StepSnapshot } from \"../contracts/result/step-result.type\";\nimport type { WorkflowSnapshot } from \"../contracts/workflow/workflow-snapshot.type\";\nimport type {\n WorkflowDefinition,\n WorkflowResumeOptions,\n} from \"../contracts/workflow/workflow.contract\";\nimport { WorkflowDriftError, WorkflowError } from \"../errors\";\n\n/**\n * Resolve the effective snapshot store: the workflow's own\n * `snapshotStore` field wins; absent that, fall back to the global\n * default set via `ai.config({ defaultStore })`.\n */\nfunction resolveSnapshotStore<T>(definition: WorkflowDefinition<any, T, any, any>) {\n return definition.snapshotStore ?? resolveDefaultStore();\n}\n\nexport type PersistParams<T> = {\n definition: WorkflowDefinition<any, T, any, any>;\n signature: string;\n runId: string;\n startedAt: string;\n input: unknown;\n state: Record<string, unknown>;\n steps: Record<string, StepSnapshot>;\n next: string | null;\n status: WorkflowSnapshot[\"status\"];\n};\n\nexport type PersistOutcome = { ok: true } | { ok: false; error: unknown };\n\n/**\n * Write the current run's state to the configured `KVStore`. Returns\n * an outcome object instead of throwing so the engine can surface\n * persistence failures via events + logs without aborting the run.\n * Callers decide whether a failed checkpoint is fatal.\n *\n * No-op (returns `{ ok: true }`) when the workflow has no store\n * configured — the common in-memory test case.\n */\nexport async function persistSnapshot<T>(\n params: PersistParams<T>,\n): Promise<PersistOutcome> {\n const store = resolveSnapshotStore(params.definition);\n\n if (!store) return { ok: true };\n\n const snapshot: WorkflowSnapshot = {\n runId: params.runId,\n workflowName: params.definition.name,\n signature: params.signature,\n version: params.definition.version,\n input: params.input,\n state: { ...params.state },\n steps: { ...params.steps },\n next: params.next,\n status: params.status,\n startedAt: params.startedAt,\n savedAt: new Date().toISOString(),\n };\n\n try {\n await store.set(params.runId, snapshot);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err };\n }\n}\n\n/**\n * Load a prior run's snapshot from the store and run the drift\n * check. Throws `WorkflowError` when no snapshot exists, and\n * `WorkflowDriftError` when the stored signature doesn't match the\n * current definition (unless `force` is set).\n */\nexport async function loadSnapshotForResume<T>(params: {\n definition: WorkflowDefinition<any, T, any, any>;\n signature: string;\n runId: string;\n options?: WorkflowResumeOptions;\n}): Promise<WorkflowSnapshot> {\n const store = resolveSnapshotStore(params.definition);\n\n if (!store) {\n throw new WorkflowError(\n `workflow \"${params.definition.name}\" has no store configured — set \\`snapshotStore\\` on the definition or call \\`ai.config({ defaultStore })\\` at boot before calling resume()`,\n );\n }\n\n const snap = (await store.get<WorkflowSnapshot>(params.runId)) ?? null;\n\n if (!snap) {\n throw new WorkflowError(\n `workflow \"${params.definition.name}\": no snapshot for runId \"${params.runId}\"`,\n );\n }\n\n if (!params.options?.force && snap.signature !== params.signature) {\n throw new WorkflowDriftError(\n `workflow \"${params.definition.name}\" signature drift on resume`,\n {\n savedSignature: snap.signature,\n currentSignature: params.signature,\n runId: params.runId,\n },\n );\n }\n\n return snap;\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAS,qBAAwB,YAAkD;CACjF,OAAO,WAAW,iBAAiB,oBAAoB;AACzD;;;;;;;;;;AAyBA,eAAsB,gBACpB,QACyB;CACzB,MAAM,QAAQ,qBAAqB,OAAO,UAAU;CAEpD,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK;CAE9B,MAAM,WAA6B;EACjC,OAAO,OAAO;EACd,cAAc,OAAO,WAAW;EAChC,WAAW,OAAO;EAClB,SAAS,OAAO,WAAW;EAC3B,OAAO,OAAO;EACd,OAAO,EAAE,GAAG,OAAO,MAAM;EACzB,OAAO,EAAE,GAAG,OAAO,MAAM;EACzB,MAAM,OAAO;EACb,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,0BAAS,IAAI,KAAK,GAAE,YAAY;CAClC;CAEA,IAAI;EACF,MAAM,MAAM,IAAI,OAAO,OAAO,QAAQ;EACtC,OAAO,EAAE,IAAI,KAAK;CACpB,SAAS,KAAK;EACZ,OAAO;GAAE,IAAI;GAAO,OAAO;EAAI;CACjC;AACF;;;;;;;AAQA,eAAsB,sBAAyB,QAKjB;CAC5B,MAAM,QAAQ,qBAAqB,OAAO,UAAU;CAEpD,IAAI,CAAC,OACH,MAAM,IAAI,cACR,aAAa,OAAO,WAAW,KAAK,4IACtC;CAGF,MAAM,OAAQ,MAAM,MAAM,IAAsB,OAAO,KAAK,KAAM;CAElE,IAAI,CAAC,MACH,MAAM,IAAI,cACR,aAAa,OAAO,WAAW,KAAK,4BAA4B,OAAO,MAAM,EAC/E;CAGF,IAAI,CAAC,OAAO,SAAS,SAAS,KAAK,cAAc,OAAO,WACtD,MAAM,IAAI,mBACR,aAAa,OAAO,WAAW,KAAK,8BACpC;EACE,gBAAgB,KAAK;EACrB,kBAAkB,OAAO;EACzB,OAAO,OAAO;CAChB,CACF;CAGF,OAAO;AACT"}
1
+ {"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/snapshot.ts"],"sourcesContent":["import { resolveDefaultStore } from \"../config\";\nimport type { StepSnapshot } from \"../contracts/result/step-result.type\";\nimport type { WorkflowSnapshot } from \"../contracts/workflow/workflow-snapshot.type\";\nimport type {\n WorkflowDefinition,\n WorkflowResumeOptions,\n} from \"../contracts/workflow/workflow.contract\";\nimport { WorkflowDriftError, WorkflowError } from \"../errors\";\n\n/**\n * Resolve the effective snapshot store: the workflow's own\n * `snapshotStore` field wins; absent that, fall back to the global\n * default set via `ai.config({ defaultStore })`.\n */\nfunction resolveSnapshotStore<T>(definition: WorkflowDefinition<any, T, any, any>) {\n return definition.snapshotStore ?? resolveDefaultStore();\n}\n\nexport type PersistParams<T> = {\n definition: WorkflowDefinition<any, T, any, any>;\n signature: string;\n runId: string;\n startedAt: string;\n input: unknown;\n state: Record<string, unknown>;\n steps: Record<string, StepSnapshot>;\n next: string | null;\n status: WorkflowSnapshot[\"status\"];\n};\n\nexport type PersistOutcome = { ok: true } | { ok: false; error: unknown };\n\n/**\n * Write the current run's state to the configured `KVStore`. Returns\n * an outcome object instead of throwing so the engine can surface\n * persistence failures via events + logs without aborting the run.\n * Callers decide whether a failed checkpoint is fatal.\n *\n * No-op (returns `{ ok: true }`) when the workflow has no store\n * configured — the common in-memory test case.\n */\nexport async function persistSnapshot<T>(\n params: PersistParams<T>,\n): Promise<PersistOutcome> {\n const store = resolveSnapshotStore(params.definition);\n\n if (!store) return { ok: true };\n\n const snapshot: WorkflowSnapshot = {\n runId: params.runId,\n workflowName: params.definition.name,\n signature: params.signature,\n version: params.definition.version,\n input: params.input,\n state: { ...params.state },\n steps: { ...params.steps },\n next: params.next,\n status: params.status,\n startedAt: params.startedAt,\n savedAt: new Date().toISOString(),\n };\n\n try {\n await store.set(params.runId, snapshot);\n return { ok: true };\n } catch (err) {\n return { ok: false, error: err };\n }\n}\n\n/**\n * Load a prior run's snapshot from the store and run the drift\n * check. Throws `WorkflowError` when no snapshot exists, and\n * `WorkflowDriftError` when the stored signature doesn't match the\n * current definition (unless `force` is set).\n */\nexport async function loadSnapshotForResume<T>(params: {\n definition: WorkflowDefinition<any, T, any, any>;\n signature: string;\n runId: string;\n options?: WorkflowResumeOptions;\n}): Promise<WorkflowSnapshot> {\n const store = resolveSnapshotStore(params.definition);\n\n if (!store) {\n throw new WorkflowError(\n `workflow \"${params.definition.name}\" has no store configured — set \\`snapshotStore\\` on the definition or call \\`ai.config({ defaultStore })\\` at boot before calling resume()`,\n );\n }\n\n const snap = (await store.get<WorkflowSnapshot>(params.runId)) ?? null;\n\n if (!snap) {\n throw new WorkflowError(\n `workflow \"${params.definition.name}\": no snapshot for runId \"${params.runId}\"`,\n );\n }\n\n if (!params.options?.force && snap.signature !== params.signature) {\n throw new WorkflowDriftError(\n `workflow \"${params.definition.name}\" signature drift on resume`,\n {\n savedSignature: snap.signature,\n currentSignature: params.signature,\n runId: params.runId,\n },\n );\n }\n\n return snap;\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAS,qBAAwB,YAAkD;CACjF,OAAO,WAAW,iBAAiB,oBAAoB;AACzD;;;;;;;;;;AAyBA,eAAsB,gBACpB,QACyB;CACzB,MAAM,QAAQ,qBAAqB,OAAO,UAAU;CAEpD,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK;CAE9B,MAAM,WAA6B;EACjC,OAAO,OAAO;EACd,cAAc,OAAO,WAAW;EAChC,WAAW,OAAO;EAClB,SAAS,OAAO,WAAW;EAC3B,OAAO,OAAO;EACd,OAAO,EAAE,GAAG,OAAO,MAAM;EACzB,OAAO,EAAE,GAAG,OAAO,MAAM;EACzB,MAAM,OAAO;EACb,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,0BAAS,IAAI,KAAK,EAAC,CAAC,YAAY;CAClC;CAEA,IAAI;EACF,MAAM,MAAM,IAAI,OAAO,OAAO,QAAQ;EACtC,OAAO,EAAE,IAAI,KAAK;CACpB,SAAS,KAAK;EACZ,OAAO;GAAE,IAAI;GAAO,OAAO;EAAI;CACjC;AACF;;;;;;;AAQA,eAAsB,sBAAyB,QAKjB;CAC5B,MAAM,QAAQ,qBAAqB,OAAO,UAAU;CAEpD,IAAI,CAAC,OACH,MAAM,IAAI,cACR,aAAa,OAAO,WAAW,KAAK,4IACtC;CAGF,MAAM,OAAQ,MAAM,MAAM,IAAsB,OAAO,KAAK,KAAM;CAElE,IAAI,CAAC,MACH,MAAM,IAAI,cACR,aAAa,OAAO,WAAW,KAAK,4BAA4B,OAAO,MAAM,EAC/E;CAGF,IAAI,CAAC,OAAO,SAAS,SAAS,KAAK,cAAc,OAAO,WACtD,MAAM,IAAI,mBACR,aAAa,OAAO,WAAW,KAAK,8BACpC;EACE,gBAAgB,KAAK;EACrB,kBAAkB,OAAO;EACzB,OAAO,OAAO;CAChB,CACF;CAGF,OAAO;AACT"}
@@ -1,7 +1,7 @@
1
1
  import { WorkflowError } from "../errors/workflow-error.mjs";
2
2
  import "../errors/index.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/workflow/state.ts
4
+ //#region ../@warlock.js/ai/src/workflow/state.ts
5
5
  /**
6
6
  * Deep-clone workflow state. Uses `structuredClone` — handles Date,
7
7
  * Map, Set, ArrayBuffer, nested objects, arrays, primitives. Throws
@@ -1 +1 @@
1
- {"version":3,"file":"state.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/state.ts"],"sourcesContent":["import { WorkflowError } from \"../errors\";\n\n/**\n * Deep-clone workflow state. Uses `structuredClone` — handles Date,\n * Map, Set, ArrayBuffer, nested objects, arrays, primitives. Throws\n * a typed `WorkflowError` on older runtimes (pre-Node-17) rather\n * than silently falling back to a JSON round-trip that would drop\n * non-serializable values like Dates without warning.\n *\n * Workflow state should stay serializable anyway (it round-trips\n * through `KVStore` on every checkpoint). If `structuredClone` chokes\n * on a value, that's a bug in the user's state — surface it.\n */\nexport function cloneState<T>(value: T): T {\n if (typeof structuredClone !== \"function\") {\n throw new WorkflowError(\n \"workflow state cloning requires `structuredClone` (Node 17+ or a modern browser)\",\n );\n }\n\n return structuredClone(value);\n}\n\n/**\n * Recursively freeze `value` and every nested plain object / array so\n * consumers of `ctx.steps[x].state` or `report.state` can't mutate\n * historical snapshots. Already-frozen values are skipped.\n */\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") return value;\n if (Object.isFrozen(value)) return value;\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n const child = (value as Record<string, unknown>)[key];\n if (child && typeof child === \"object\") deepFreeze(child);\n }\n\n return Object.freeze(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,SAAgB,WAAc,OAAa;CACzC,IAAI,OAAO,oBAAoB,YAC7B,MAAM,IAAI,cACR,kFACF;CAGF,OAAO,gBAAgB,KAAK;AAC9B;;;;;;AAOA,SAAgB,WAAc,OAAa;CACzC,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,IAAI,OAAO,SAAS,KAAK,GAAG,OAAO;CAEnC,KAAK,MAAM,OAAO,OAAO,KAAK,KAAgC,GAAG;EAC/D,MAAM,QAAS,MAAkC;EACjD,IAAI,SAAS,OAAO,UAAU,UAAU,WAAW,KAAK;CAC1D;CAEA,OAAO,OAAO,OAAO,KAAK;AAC5B"}
1
+ {"version":3,"file":"state.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/state.ts"],"sourcesContent":["import { WorkflowError } from \"../errors\";\n\n/**\n * Deep-clone workflow state. Uses `structuredClone` — handles Date,\n * Map, Set, ArrayBuffer, nested objects, arrays, primitives. Throws\n * a typed `WorkflowError` on older runtimes (pre-Node-17) rather\n * than silently falling back to a JSON round-trip that would drop\n * non-serializable values like Dates without warning.\n *\n * Workflow state should stay serializable anyway (it round-trips\n * through `KVStore` on every checkpoint). If `structuredClone` chokes\n * on a value, that's a bug in the user's state — surface it.\n */\nexport function cloneState<T>(value: T): T {\n if (typeof structuredClone !== \"function\") {\n throw new WorkflowError(\n \"workflow state cloning requires `structuredClone` (Node 17+ or a modern browser)\",\n );\n }\n\n return structuredClone(value);\n}\n\n/**\n * Recursively freeze `value` and every nested plain object / array so\n * consumers of `ctx.steps[x].state` or `report.state` can't mutate\n * historical snapshots. Already-frozen values are skipped.\n */\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") return value;\n if (Object.isFrozen(value)) return value;\n\n for (const key of Object.keys(value as Record<string, unknown>)) {\n const child = (value as Record<string, unknown>)[key];\n if (child && typeof child === \"object\") deepFreeze(child);\n }\n\n return Object.freeze(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,SAAgB,WAAc,OAAa;CACzC,IAAI,OAAO,oBAAoB,YAC7B,MAAM,IAAI,cACR,kFACF;CAGF,OAAO,gBAAgB,KAAK;AAC9B;;;;;;AAOA,SAAgB,WAAc,OAAa;CACzC,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,IAAI,OAAO,SAAS,KAAK,GAAG,OAAO;CAEnC,KAAK,MAAM,OAAO,OAAO,KAAK,KAAgC,GAAG;EAC/D,MAAM,QAAS,MAAkC;EACjD,IAAI,SAAS,OAAO,UAAU,UAAU,WAAW,KAAK;CAC1D;CAEA,OAAO,OAAO,OAAO,KAAK;AAC5B"}
@@ -8,7 +8,7 @@ import { createCancelledError, sleep } from "./cancellation.mjs";
8
8
  import { cloneState, deepFreeze } from "./state.mjs";
9
9
  import { isAbortError, resolveBackoff, resolveRetryConfig } from "./retry.mjs";
10
10
 
11
- //#region ../../@warlock.js/ai/src/workflow/step-runner.ts
11
+ //#region ../@warlock.js/ai/src/workflow/step-runner.ts
12
12
  /**
13
13
  * Narrow an `executionResult` to an `AgentResult` when the step ran
14
14
  * an agent. Custom `run` steps return arbitrary values, so the
@@ -1 +1 @@
1
- {"version":3,"file":"step-runner.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/step-runner.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { Logger } from \"@warlock.js/logger\";\nimport type { AgentResult } from \"../contracts/result/agent-result.type\";\nimport type { AgentReport } from \"../contracts/result/execution-report.type\";\nimport type { AttemptEntry, StepSnapshot } from \"../contracts/result/step-result.type\";\nimport type { Usage } from \"../contracts/result/usage.type\";\nimport type { RetryConfig } from \"../contracts/workflow/retry-config.type\";\nimport type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowContext } from \"../contracts/workflow/workflow-context.type\";\nimport type { WorkflowEventHandlers } from \"../contracts/workflow/workflow.contract\";\nimport {\n AIError,\n SchemaValidationError,\n StepFailedError,\n WorkflowCancelledError,\n WorkflowError,\n} from \"../errors\";\nimport { createCancelledError, sleep } from \"./cancellation\";\nimport type { WorkflowEventSink } from \"./emitter\";\nimport { isAbortError, resolveBackoff, resolveRetryConfig } from \"./retry\";\nimport { cloneState, deepFreeze } from \"./state\";\n\n/**\n * Mutable snapshot used by the step runner — finalized (deep-frozen)\n * by the engine before being written to `ctx.steps` / `report.steps`.\n */\nexport type MutableStepSnapshot = {\n output: unknown;\n skipped: boolean;\n status: \"completed\" | \"skipped\" | \"failed\";\n startedAt: string;\n endedAt: string;\n duration: number;\n attempts: number;\n attemptHistory: AttemptEntry[];\n error?: AIError;\n state: Record<string, unknown>;\n executionResult?: unknown;\n agentReport?: AgentReport;\n agentUsage?: Usage;\n steps?: Record<string, StepSnapshot>;\n};\n\n/**\n * Narrow an `executionResult` to an `AgentResult` when the step ran\n * an agent. Custom `run` steps return arbitrary values, so the\n * `type: \"agent\"` discriminant keeps us honest.\n */\nfunction asAgentResult(result: unknown): AgentResult<unknown> | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n if ((result as { type?: unknown }).type !== \"agent\") return undefined;\n return result as AgentResult<unknown>;\n}\n\nexport type ExecuteStepParams = {\n step: StepDefinition;\n state: Record<string, unknown>;\n emitter: WorkflowEventSink;\n executionHandlers?: WorkflowEventHandlers;\n logger: Logger;\n logModule: string;\n signal?: AbortSignal;\n buildContext: (current?: {\n state: Record<string, unknown>;\n agentResult?: unknown;\n }) => WorkflowContext;\n usage: Usage;\n workflowDefaultRetry?: RetryConfig | false;\n};\n\n/**\n * Drive one step's full lifecycle — skip evaluation, parallel\n * dispatch, retry loop around before → run|agent → output → after.\n * Returns a mutable snapshot; the engine deep-freezes it before\n * exposing.\n */\nexport async function executeStep(params: ExecuteStepParams): Promise<MutableStepSnapshot> {\n const { step, emitter, executionHandlers, logger, logModule, signal } = params;\n const startedAt = new Date().toISOString();\n const stepStartPerf = performance.now();\n\n params.step.on?.starting?.({ step: step.name });\n emitter.emit(\"workflow.step.starting\", { step: step.name }, executionHandlers);\n logger.debug(logModule, \"step.starting\", `${step.name} step starting`, {\n step: step.name,\n });\n\n const stepState: Record<string, unknown> = cloneState(params.state);\n\n // SKIP\n try {\n if (step.skip) {\n const shouldSkip = await step.skip(params.buildContext({ state: stepState }));\n if (shouldSkip) {\n const endedAt = new Date().toISOString();\n const duration = performance.now() - stepStartPerf;\n emitter.emit(\"workflow.step.skipped\", { step: step.name }, executionHandlers);\n logger.debug(logModule, \"step.skipped\", `${step.name} step skipped`, {\n step: step.name,\n });\n\n return {\n output: undefined,\n skipped: true,\n status: \"skipped\",\n startedAt,\n endedAt,\n duration,\n attempts: 0,\n attemptHistory: [],\n state: stepState,\n };\n }\n }\n } catch (err) {\n return buildFailedSnapshot(step, stepState, startedAt, stepStartPerf, 1, [\n failedAttempt(1, err, new Date().toISOString(), performance.now()),\n ]);\n }\n\n // PARALLEL\n if (step.parallel && step.parallel.length > 0) {\n return runParallelStep({\n ...params,\n step,\n stepState,\n startedAt,\n startPerf: stepStartPerf,\n });\n }\n\n const retryConfig = resolveRetryConfig(step, params.workflowDefaultRetry);\n\n const attempts: AttemptEntry[] = [];\n const totalAttempts = Math.max(1, retryConfig.attempts ?? 1);\n let lastError: unknown;\n let executionResult: unknown;\n let output: unknown;\n let succeeded = false;\n\n for (let attempt = 1; attempt <= totalAttempts; attempt++) {\n if (signal?.aborted) throw createCancelledError(signal);\n\n const attemptStart = new Date().toISOString();\n const attemptStartPerf = performance.now();\n try {\n // Fresh deep-clone per attempt — retries restart cleanly.\n const attemptState: Record<string, unknown> = cloneState(params.state);\n\n if (step.before) {\n await step.before(params.buildContext({ state: attemptState }));\n }\n\n if (step.agent) {\n const agentInput = step.input\n ? await step.input(params.buildContext({ state: attemptState }))\n : { prompt: \"\" };\n\n const { prompt, ...agentOpts } = agentInput;\n\n const result = await step.agent.execute(prompt, {\n ...agentOpts,\n signal,\n });\n\n executionResult = result;\n\n if (result.usage) {\n params.usage.input += result.usage.input ?? 0;\n params.usage.output += result.usage.output ?? 0;\n params.usage.total += result.usage.total ?? 0;\n }\n\n if (result.error) throw result.error;\n } else if (step.run) {\n executionResult = await step.run(params.buildContext({ state: attemptState }));\n }\n\n if (step.output) {\n const extracted = await step.output.extract(\n params.buildContext({\n state: attemptState,\n agentResult: executionResult,\n }),\n );\n output = await validateSchema(step.output.schema, extracted);\n } else {\n output = undefined;\n }\n\n if (step.after) {\n await step.after(\n params.buildContext({\n state: attemptState,\n agentResult: executionResult,\n }),\n );\n }\n\n Object.assign(stepState, attemptState);\n\n attempts.push({\n index: attempt,\n startedAt: attemptStart,\n endedAt: new Date().toISOString(),\n duration: performance.now() - attemptStartPerf,\n status: \"success\",\n });\n succeeded = true;\n break;\n } catch (err) {\n if (isAbortError(err) || err instanceof WorkflowCancelledError) {\n throw createCancelledError(signal);\n }\n\n attempts.push({\n index: attempt,\n startedAt: attemptStart,\n endedAt: new Date().toISOString(),\n duration: performance.now() - attemptStartPerf,\n status: \"failed\",\n error: toAIError(err),\n });\n\n lastError = err;\n\n const shouldRetry =\n attempt < totalAttempts &&\n (retryConfig.retryOn ? retryConfig.retryOn(err, attempt) !== false : true);\n\n if (!shouldRetry) break;\n\n emitter.emit(\n \"workflow.step.retrying\",\n {\n step: step.name,\n attempt: attempt + 1,\n totalAttempts,\n lastError: err,\n },\n params.executionHandlers,\n );\n\n step.on?.retrying?.({\n step: step.name,\n attempt: attempt + 1,\n totalAttempts,\n lastError: err,\n });\n\n logger.warn(logModule, \"step.retrying\", `${step.name} step retrying`, {\n step: step.name,\n attempt: attempt + 1,\n });\n\n retryConfig.onRetry?.(attempt + 1, err);\n\n const delay = resolveBackoff(attempt, retryConfig.backoff);\n if (delay > 0) await sleep(delay, signal);\n }\n }\n\n const endedAt = new Date().toISOString();\n const duration = performance.now() - stepStartPerf;\n\n if (!succeeded) {\n const aiError = toAIError(lastError);\n const stepError = new StepFailedError(\n `step \"${step.name}\" failed after ${attempts.length} attempt(s): ${aiError.message}`,\n { stepName: step.name, attempts: attempts.length, cause: aiError },\n );\n\n emitter.emit(\n \"workflow.step.failed\",\n { step: step.name, error: stepError, attempts: attempts.length },\n params.executionHandlers,\n );\n\n step.on?.failed?.({\n step: step.name,\n error: stepError,\n attempts: attempts.length,\n });\n\n logger.error(logModule, \"step.failed\", `${step.name} step failed`, {\n step: step.name,\n attempts: attempts.length,\n code: stepError.code,\n });\n\n const failedAgentResult = asAgentResult(executionResult);\n return {\n output: undefined,\n skipped: false,\n status: \"failed\",\n startedAt,\n endedAt,\n duration,\n attempts: attempts.length,\n attemptHistory: attempts,\n error: stepError,\n state: stepState,\n executionResult:\n executionResult && typeof executionResult === \"object\" ? executionResult : undefined,\n agentReport: failedAgentResult?.report,\n agentUsage: failedAgentResult?.usage,\n };\n }\n\n emitter.emit(\n \"workflow.step.completed\",\n { step: step.name, output, duration },\n params.executionHandlers,\n );\n step.on?.completed?.({ step: step.name, output, duration });\n logger.debug(logModule, \"step.completed\", \"step completed\", {\n step: step.name,\n duration,\n });\n\n const completedAgentResult = asAgentResult(executionResult);\n return {\n output,\n skipped: false,\n status: \"completed\",\n startedAt,\n endedAt,\n duration,\n attempts: attempts.length,\n attemptHistory: attempts,\n state: stepState,\n executionResult:\n executionResult && typeof executionResult === \"object\" ? executionResult : undefined,\n agentReport: completedAgentResult?.report,\n agentUsage: completedAgentResult?.usage,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Parallel runner\n// ---------------------------------------------------------------------------\n\ntype ParallelParams = ExecuteStepParams & {\n stepState: Record<string, unknown>;\n startedAt: string;\n startPerf: number;\n};\n\nasync function runParallelStep(params: ParallelParams): Promise<MutableStepSnapshot> {\n const { step, emitter, executionHandlers, logger, logModule, signal } = params;\n\n const sharedState = params.stepState;\n const childSnapshots: Record<string, StepSnapshot> = {};\n let firstError: AIError | undefined;\n\n const results = await Promise.all(\n (step.parallel ?? []).map(async (child) => {\n const snap = await executeStep({\n step: child,\n state: sharedState,\n emitter,\n executionHandlers,\n logger,\n logModule,\n signal,\n buildContext: params.buildContext,\n usage: params.usage,\n });\n\n Object.assign(sharedState, snap.state);\n return { child, snap };\n }),\n );\n\n for (const { child, snap } of results) {\n childSnapshots[child.name] = finalizeSnapshot(snap);\n if (snap.status === \"failed\" && !firstError && snap.error) {\n firstError = snap.error;\n }\n }\n\n const endedAt = new Date().toISOString();\n const duration = performance.now() - params.startPerf;\n\n let output: unknown;\n\n if (step.output) {\n try {\n const ctx = params.buildContext({ state: sharedState });\n const ctxWithChildren = {\n ...ctx,\n steps: {\n ...ctx.steps,\n [step.name]: {\n ...(childSnapshots as unknown as StepSnapshot),\n steps: childSnapshots,\n status: firstError ? \"failed\" : \"completed\",\n } as StepSnapshot,\n } as Readonly<Record<string, StepSnapshot>>,\n };\n\n const extracted = await step.output.extract(ctxWithChildren);\n output = await validateSchema(step.output.schema, extracted);\n } catch (err) {\n firstError = firstError ?? toAIError(err);\n }\n }\n\n const status: \"completed\" | \"failed\" = firstError ? \"failed\" : \"completed\";\n\n if (status === \"completed\") {\n emitter.emit(\n \"workflow.step.completed\",\n { step: step.name, output, duration },\n executionHandlers,\n );\n step.on?.completed?.({ step: step.name, output, duration });\n } else {\n emitter.emit(\n \"workflow.step.failed\",\n { step: step.name, error: firstError!, attempts: 1 },\n executionHandlers,\n );\n step.on?.failed?.({ step: step.name, error: firstError!, attempts: 1 });\n }\n\n return {\n output,\n skipped: false,\n status,\n startedAt: params.startedAt,\n endedAt,\n duration,\n attempts: 1,\n attemptHistory: [],\n error: firstError,\n state: sharedState,\n steps: childSnapshots,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function finalizeSnapshot(snap: MutableStepSnapshot): StepSnapshot {\n return Object.freeze({\n output: snap.output,\n skipped: snap.skipped,\n status: snap.status,\n startedAt: snap.startedAt,\n endedAt: snap.endedAt,\n duration: snap.duration,\n attempts: snap.attempts,\n attemptHistory: snap.attemptHistory,\n error: snap.error,\n state: deepFreeze(cloneState(snap.state)),\n executionResult: snap.executionResult as StepSnapshot[\"executionResult\"],\n agentReport: snap.agentReport,\n agentUsage: snap.agentUsage,\n steps: snap.steps,\n }) as StepSnapshot;\n}\n\nfunction buildFailedSnapshot(\n step: StepDefinition,\n state: Record<string, unknown>,\n startedAt: string,\n startPerf: number,\n attemptsCount: number,\n attemptHistory: AttemptEntry[],\n): MutableStepSnapshot {\n const endedAt = new Date().toISOString();\n const duration = performance.now() - startPerf;\n const lastErr = attemptHistory[attemptHistory.length - 1]?.error;\n const wrapped = lastErr\n ? new StepFailedError(`step \"${step.name}\" skip threw: ${lastErr.message}`, {\n stepName: step.name,\n attempts: attemptsCount,\n cause: lastErr,\n })\n : new StepFailedError(`step \"${step.name}\" failed`, {\n stepName: step.name,\n attempts: attemptsCount,\n });\n\n return {\n output: undefined,\n skipped: false,\n status: \"failed\",\n startedAt,\n endedAt,\n duration,\n attempts: attemptsCount,\n attemptHistory,\n error: wrapped,\n state,\n };\n}\n\nfunction failedAttempt(\n index: number,\n err: unknown,\n startedAt: string,\n startPerf: number,\n): AttemptEntry {\n return {\n index,\n startedAt,\n endedAt: new Date().toISOString(),\n duration: performance.now() - startPerf,\n status: \"failed\",\n error: toAIError(err),\n };\n}\n\nexport function toAIError(err: unknown): AIError {\n if (err instanceof AIError) return err;\n if (err instanceof Error) return new WorkflowError(err.message, { cause: err });\n return new WorkflowError(String(err));\n}\n\nasync function validateSchema(\n schema: StandardSchemaV1<unknown> | undefined,\n value: unknown,\n): Promise<unknown> {\n if (!schema) return value;\n const result = await schema[\"~standard\"].validate(value);\n\n if (\"issues\" in result && result.issues) {\n throw new SchemaValidationError(\"workflow step output failed schema validation\", {\n issues: result.issues,\n });\n }\n\n return (result as { value: unknown }).value;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgDA,SAAS,cAAc,QAAmD;CACxE,IAAI,CAAC,UAAU,OAAO,WAAW,UAAU,OAAO;CAClD,IAAK,OAA8B,SAAS,SAAS,OAAO;CAC5D,OAAO;AACT;;;;;;;AAwBA,eAAsB,YAAY,QAAyD;CACzF,MAAM,EAAE,MAAM,SAAS,mBAAmB,QAAQ,WAAW,WAAW;CACxE,MAAM,6BAAY,IAAI,KAAK,GAAE,YAAY;CACzC,MAAM,gBAAgB,YAAY,IAAI;CAEtC,OAAO,KAAK,IAAI,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC;CAC9C,QAAQ,KAAK,0BAA0B,EAAE,MAAM,KAAK,KAAK,GAAG,iBAAiB;CAC7E,OAAO,MAAM,WAAW,iBAAiB,GAAG,KAAK,KAAK,iBAAiB,EACrE,MAAM,KAAK,KACb,CAAC;CAED,MAAM,YAAqC,WAAW,OAAO,KAAK;CAGlE,IAAI;EACF,IAAI,KAAK,MAEP;OAAI,MADqB,KAAK,KAAK,OAAO,aAAa,EAAE,OAAO,UAAU,CAAC,CAAC,GAC5D;IACd,MAAM,2BAAU,IAAI,KAAK,GAAE,YAAY;IACvC,MAAM,WAAW,YAAY,IAAI,IAAI;IACrC,QAAQ,KAAK,yBAAyB,EAAE,MAAM,KAAK,KAAK,GAAG,iBAAiB;IAC5E,OAAO,MAAM,WAAW,gBAAgB,GAAG,KAAK,KAAK,gBAAgB,EACnE,MAAM,KAAK,KACb,CAAC;IAED,OAAO;KACL,QAAQ;KACR,SAAS;KACT,QAAQ;KACR;KACA;KACA;KACA,UAAU;KACV,gBAAgB,CAAC;KACjB,OAAO;IACT;GACF;;CAEJ,SAAS,KAAK;EACZ,OAAO,oBAAoB,MAAM,WAAW,WAAW,eAAe,GAAG,CACvE,cAAc,GAAG,sBAAK,IAAI,KAAK,GAAE,YAAY,GAAG,YAAY,IAAI,CAAC,CACnE,CAAC;CACH;CAGA,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAC1C,OAAO,gBAAgB;EACrB,GAAG;EACH;EACA;EACA;EACA,WAAW;CACb,CAAC;CAGH,MAAM,cAAc,mBAAmB,MAAM,OAAO,oBAAoB;CAExE,MAAM,WAA2B,CAAC;CAClC,MAAM,gBAAgB,KAAK,IAAI,GAAG,YAAY,YAAY,CAAC;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,YAAY;CAEhB,KAAK,IAAI,UAAU,GAAG,WAAW,eAAe,WAAW;EACzD,IAAI,QAAQ,SAAS,MAAM,qBAAqB,MAAM;EAEtD,MAAM,gCAAe,IAAI,KAAK,GAAE,YAAY;EAC5C,MAAM,mBAAmB,YAAY,IAAI;EACzC,IAAI;GAEF,MAAM,eAAwC,WAAW,OAAO,KAAK;GAErE,IAAI,KAAK,QACP,MAAM,KAAK,OAAO,OAAO,aAAa,EAAE,OAAO,aAAa,CAAC,CAAC;GAGhE,IAAI,KAAK,OAAO;IAKd,MAAM,EAAE,QAAQ,GAAG,cAJA,KAAK,QACpB,MAAM,KAAK,MAAM,OAAO,aAAa,EAAE,OAAO,aAAa,CAAC,CAAC,IAC7D,EAAE,QAAQ,GAAG;IAIjB,MAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,QAAQ;KAC9C,GAAG;KACH;IACF,CAAC;IAED,kBAAkB;IAElB,IAAI,OAAO,OAAO;KAChB,OAAO,MAAM,SAAS,OAAO,MAAM,SAAS;KAC5C,OAAO,MAAM,UAAU,OAAO,MAAM,UAAU;KAC9C,OAAO,MAAM,SAAS,OAAO,MAAM,SAAS;IAC9C;IAEA,IAAI,OAAO,OAAO,MAAM,OAAO;GACjC,OAAO,IAAI,KAAK,KACd,kBAAkB,MAAM,KAAK,IAAI,OAAO,aAAa,EAAE,OAAO,aAAa,CAAC,CAAC;GAG/E,IAAI,KAAK,QAAQ;IACf,MAAM,YAAY,MAAM,KAAK,OAAO,QAClC,OAAO,aAAa;KAClB,OAAO;KACP,aAAa;IACf,CAAC,CACH;IACA,SAAS,MAAM,eAAe,KAAK,OAAO,QAAQ,SAAS;GAC7D,OACE,SAAS;GAGX,IAAI,KAAK,OACP,MAAM,KAAK,MACT,OAAO,aAAa;IAClB,OAAO;IACP,aAAa;GACf,CAAC,CACH;GAGF,OAAO,OAAO,WAAW,YAAY;GAErC,SAAS,KAAK;IACZ,OAAO;IACP,WAAW;IACX,0BAAS,IAAI,KAAK,GAAE,YAAY;IAChC,UAAU,YAAY,IAAI,IAAI;IAC9B,QAAQ;GACV,CAAC;GACD,YAAY;GACZ;EACF,SAAS,KAAK;GACZ,IAAI,aAAa,GAAG,KAAK,eAAe,wBACtC,MAAM,qBAAqB,MAAM;GAGnC,SAAS,KAAK;IACZ,OAAO;IACP,WAAW;IACX,0BAAS,IAAI,KAAK,GAAE,YAAY;IAChC,UAAU,YAAY,IAAI,IAAI;IAC9B,QAAQ;IACR,OAAO,UAAU,GAAG;GACtB,CAAC;GAED,YAAY;GAMZ,IAAI,EAHF,UAAU,kBACT,YAAY,UAAU,YAAY,QAAQ,KAAK,OAAO,MAAM,QAAQ,QAErD;GAElB,QAAQ,KACN,0BACA;IACE,MAAM,KAAK;IACX,SAAS,UAAU;IACnB;IACA,WAAW;GACb,GACA,OAAO,iBACT;GAEA,KAAK,IAAI,WAAW;IAClB,MAAM,KAAK;IACX,SAAS,UAAU;IACnB;IACA,WAAW;GACb,CAAC;GAED,OAAO,KAAK,WAAW,iBAAiB,GAAG,KAAK,KAAK,iBAAiB;IACpE,MAAM,KAAK;IACX,SAAS,UAAU;GACrB,CAAC;GAED,YAAY,UAAU,UAAU,GAAG,GAAG;GAEtC,MAAM,QAAQ,eAAe,SAAS,YAAY,OAAO;GACzD,IAAI,QAAQ,GAAG,MAAM,MAAM,OAAO,MAAM;EAC1C;CACF;CAEA,MAAM,2BAAU,IAAI,KAAK,GAAE,YAAY;CACvC,MAAM,WAAW,YAAY,IAAI,IAAI;CAErC,IAAI,CAAC,WAAW;EACd,MAAM,UAAU,UAAU,SAAS;EACnC,MAAM,YAAY,IAAI,gBACpB,SAAS,KAAK,KAAK,iBAAiB,SAAS,OAAO,eAAe,QAAQ,WAC3E;GAAE,UAAU,KAAK;GAAM,UAAU,SAAS;GAAQ,OAAO;EAAQ,CACnE;EAEA,QAAQ,KACN,wBACA;GAAE,MAAM,KAAK;GAAM,OAAO;GAAW,UAAU,SAAS;EAAO,GAC/D,OAAO,iBACT;EAEA,KAAK,IAAI,SAAS;GAChB,MAAM,KAAK;GACX,OAAO;GACP,UAAU,SAAS;EACrB,CAAC;EAED,OAAO,MAAM,WAAW,eAAe,GAAG,KAAK,KAAK,eAAe;GACjE,MAAM,KAAK;GACX,UAAU,SAAS;GACnB,MAAM,UAAU;EAClB,CAAC;EAED,MAAM,oBAAoB,cAAc,eAAe;EACvD,OAAO;GACL,QAAQ;GACR,SAAS;GACT,QAAQ;GACR;GACA;GACA;GACA,UAAU,SAAS;GACnB,gBAAgB;GAChB,OAAO;GACP,OAAO;GACP,iBACE,mBAAmB,OAAO,oBAAoB,WAAW,kBAAkB;GAC7E,aAAa,mBAAmB;GAChC,YAAY,mBAAmB;EACjC;CACF;CAEA,QAAQ,KACN,2BACA;EAAE,MAAM,KAAK;EAAM;EAAQ;CAAS,GACpC,OAAO,iBACT;CACA,KAAK,IAAI,YAAY;EAAE,MAAM,KAAK;EAAM;EAAQ;CAAS,CAAC;CAC1D,OAAO,MAAM,WAAW,kBAAkB,kBAAkB;EAC1D,MAAM,KAAK;EACX;CACF,CAAC;CAED,MAAM,uBAAuB,cAAc,eAAe;CAC1D,OAAO;EACL;EACA,SAAS;EACT,QAAQ;EACR;EACA;EACA;EACA,UAAU,SAAS;EACnB,gBAAgB;EAChB,OAAO;EACP,iBACE,mBAAmB,OAAO,oBAAoB,WAAW,kBAAkB;EAC7E,aAAa,sBAAsB;EACnC,YAAY,sBAAsB;CACpC;AACF;AAYA,eAAe,gBAAgB,QAAsD;CACnF,MAAM,EAAE,MAAM,SAAS,mBAAmB,QAAQ,WAAW,WAAW;CAExE,MAAM,cAAc,OAAO;CAC3B,MAAM,iBAA+C,CAAC;CACtD,IAAI;CAEJ,MAAM,UAAU,MAAM,QAAQ,KAC3B,KAAK,YAAY,CAAC,GAAG,IAAI,OAAO,UAAU;EACzC,MAAM,OAAO,MAAM,YAAY;GAC7B,MAAM;GACN,OAAO;GACP;GACA;GACA;GACA;GACA;GACA,cAAc,OAAO;GACrB,OAAO,OAAO;EAChB,CAAC;EAED,OAAO,OAAO,aAAa,KAAK,KAAK;EACrC,OAAO;GAAE;GAAO;EAAK;CACvB,CAAC,CACH;CAEA,KAAK,MAAM,EAAE,OAAO,UAAU,SAAS;EACrC,eAAe,MAAM,QAAQ,iBAAiB,IAAI;EAClD,IAAI,KAAK,WAAW,YAAY,CAAC,cAAc,KAAK,OAClD,aAAa,KAAK;CAEtB;CAEA,MAAM,2BAAU,IAAI,KAAK,GAAE,YAAY;CACvC,MAAM,WAAW,YAAY,IAAI,IAAI,OAAO;CAE5C,IAAI;CAEJ,IAAI,KAAK,QACP,IAAI;EACF,MAAM,MAAM,OAAO,aAAa,EAAE,OAAO,YAAY,CAAC;EACtD,MAAM,kBAAkB;GACtB,GAAG;GACH,OAAO;IACL,GAAG,IAAI;KACN,KAAK,OAAO;KACX,GAAI;KACJ,OAAO;KACP,QAAQ,aAAa,WAAW;IAClC;GACF;EACF;EAEA,MAAM,YAAY,MAAM,KAAK,OAAO,QAAQ,eAAe;EAC3D,SAAS,MAAM,eAAe,KAAK,OAAO,QAAQ,SAAS;CAC7D,SAAS,KAAK;EACZ,aAAa,cAAc,UAAU,GAAG;CAC1C;CAGF,MAAM,SAAiC,aAAa,WAAW;CAE/D,IAAI,WAAW,aAAa;EAC1B,QAAQ,KACN,2BACA;GAAE,MAAM,KAAK;GAAM;GAAQ;EAAS,GACpC,iBACF;EACA,KAAK,IAAI,YAAY;GAAE,MAAM,KAAK;GAAM;GAAQ;EAAS,CAAC;CAC5D,OAAO;EACL,QAAQ,KACN,wBACA;GAAE,MAAM,KAAK;GAAM,OAAO;GAAa,UAAU;EAAE,GACnD,iBACF;EACA,KAAK,IAAI,SAAS;GAAE,MAAM,KAAK;GAAM,OAAO;GAAa,UAAU;EAAE,CAAC;CACxE;CAEA,OAAO;EACL;EACA,SAAS;EACT;EACA,WAAW,OAAO;EAClB;EACA;EACA,UAAU;EACV,gBAAgB,CAAC;EACjB,OAAO;EACP,OAAO;EACP,OAAO;CACT;AACF;AAMA,SAAgB,iBAAiB,MAAyC;CACxE,OAAO,OAAO,OAAO;EACnB,QAAQ,KAAK;EACb,SAAS,KAAK;EACd,QAAQ,KAAK;EACb,WAAW,KAAK;EAChB,SAAS,KAAK;EACd,UAAU,KAAK;EACf,UAAU,KAAK;EACf,gBAAgB,KAAK;EACrB,OAAO,KAAK;EACZ,OAAO,WAAW,WAAW,KAAK,KAAK,CAAC;EACxC,iBAAiB,KAAK;EACtB,aAAa,KAAK;EAClB,YAAY,KAAK;EACjB,OAAO,KAAK;CACd,CAAC;AACH;AAEA,SAAS,oBACP,MACA,OACA,WACA,WACA,eACA,gBACqB;CACrB,MAAM,2BAAU,IAAI,KAAK,GAAE,YAAY;CACvC,MAAM,WAAW,YAAY,IAAI,IAAI;CACrC,MAAM,UAAU,eAAe,eAAe,SAAS,IAAI;CAY3D,OAAO;EACL,QAAQ;EACR,SAAS;EACT,QAAQ;EACR;EACA;EACA;EACA,UAAU;EACV;EACA,OApBc,UACZ,IAAI,gBAAgB,SAAS,KAAK,KAAK,gBAAgB,QAAQ,WAAW;GACxE,UAAU,KAAK;GACf,UAAU;GACV,OAAO;EACT,CAAC,IACD,IAAI,gBAAgB,SAAS,KAAK,KAAK,WAAW;GAChD,UAAU,KAAK;GACf,UAAU;EACZ,CAAC;EAYH;CACF;AACF;AAEA,SAAS,cACP,OACA,KACA,WACA,WACc;CACd,OAAO;EACL;EACA;EACA,0BAAS,IAAI,KAAK,GAAE,YAAY;EAChC,UAAU,YAAY,IAAI,IAAI;EAC9B,QAAQ;EACR,OAAO,UAAU,GAAG;CACtB;AACF;AAEA,SAAgB,UAAU,KAAuB;CAC/C,IAAI,eAAe,SAAS,OAAO;CACnC,IAAI,eAAe,OAAO,OAAO,IAAI,cAAc,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC9E,OAAO,IAAI,cAAc,OAAO,GAAG,CAAC;AACtC;AAEA,eAAe,eACb,QACA,OACkB;CAClB,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,SAAS,MAAM,OAAO,aAAa,SAAS,KAAK;CAEvD,IAAI,YAAY,UAAU,OAAO,QAC/B,MAAM,IAAI,sBAAsB,iDAAiD,EAC/E,QAAQ,OAAO,OACjB,CAAC;CAGH,OAAQ,OAA8B;AACxC"}
1
+ {"version":3,"file":"step-runner.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/step-runner.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { Logger } from \"@warlock.js/logger\";\nimport type { AgentResult } from \"../contracts/result/agent-result.type\";\nimport type { AgentReport } from \"../contracts/result/execution-report.type\";\nimport type { AttemptEntry, StepSnapshot } from \"../contracts/result/step-result.type\";\nimport type { Usage } from \"../contracts/result/usage.type\";\nimport type { RetryConfig } from \"../contracts/workflow/retry-config.type\";\nimport type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport type { WorkflowContext } from \"../contracts/workflow/workflow-context.type\";\nimport type { WorkflowEventHandlers } from \"../contracts/workflow/workflow.contract\";\nimport {\n AIError,\n SchemaValidationError,\n StepFailedError,\n WorkflowCancelledError,\n WorkflowError,\n} from \"../errors\";\nimport { createCancelledError, sleep } from \"./cancellation\";\nimport type { WorkflowEventSink } from \"./emitter\";\nimport { isAbortError, resolveBackoff, resolveRetryConfig } from \"./retry\";\nimport { cloneState, deepFreeze } from \"./state\";\n\n/**\n * Mutable snapshot used by the step runner — finalized (deep-frozen)\n * by the engine before being written to `ctx.steps` / `report.steps`.\n */\nexport type MutableStepSnapshot = {\n output: unknown;\n skipped: boolean;\n status: \"completed\" | \"skipped\" | \"failed\";\n startedAt: string;\n endedAt: string;\n duration: number;\n attempts: number;\n attemptHistory: AttemptEntry[];\n error?: AIError;\n state: Record<string, unknown>;\n executionResult?: unknown;\n agentReport?: AgentReport;\n agentUsage?: Usage;\n steps?: Record<string, StepSnapshot>;\n};\n\n/**\n * Narrow an `executionResult` to an `AgentResult` when the step ran\n * an agent. Custom `run` steps return arbitrary values, so the\n * `type: \"agent\"` discriminant keeps us honest.\n */\nfunction asAgentResult(result: unknown): AgentResult<unknown> | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n if ((result as { type?: unknown }).type !== \"agent\") return undefined;\n return result as AgentResult<unknown>;\n}\n\nexport type ExecuteStepParams = {\n step: StepDefinition;\n state: Record<string, unknown>;\n emitter: WorkflowEventSink;\n executionHandlers?: WorkflowEventHandlers;\n logger: Logger;\n logModule: string;\n signal?: AbortSignal;\n buildContext: (current?: {\n state: Record<string, unknown>;\n agentResult?: unknown;\n }) => WorkflowContext;\n usage: Usage;\n workflowDefaultRetry?: RetryConfig | false;\n};\n\n/**\n * Drive one step's full lifecycle — skip evaluation, parallel\n * dispatch, retry loop around before → run|agent → output → after.\n * Returns a mutable snapshot; the engine deep-freezes it before\n * exposing.\n */\nexport async function executeStep(params: ExecuteStepParams): Promise<MutableStepSnapshot> {\n const { step, emitter, executionHandlers, logger, logModule, signal } = params;\n const startedAt = new Date().toISOString();\n const stepStartPerf = performance.now();\n\n params.step.on?.starting?.({ step: step.name });\n emitter.emit(\"workflow.step.starting\", { step: step.name }, executionHandlers);\n logger.debug(logModule, \"step.starting\", `${step.name} step starting`, {\n step: step.name,\n });\n\n const stepState: Record<string, unknown> = cloneState(params.state);\n\n // SKIP\n try {\n if (step.skip) {\n const shouldSkip = await step.skip(params.buildContext({ state: stepState }));\n if (shouldSkip) {\n const endedAt = new Date().toISOString();\n const duration = performance.now() - stepStartPerf;\n emitter.emit(\"workflow.step.skipped\", { step: step.name }, executionHandlers);\n logger.debug(logModule, \"step.skipped\", `${step.name} step skipped`, {\n step: step.name,\n });\n\n return {\n output: undefined,\n skipped: true,\n status: \"skipped\",\n startedAt,\n endedAt,\n duration,\n attempts: 0,\n attemptHistory: [],\n state: stepState,\n };\n }\n }\n } catch (err) {\n return buildFailedSnapshot(step, stepState, startedAt, stepStartPerf, 1, [\n failedAttempt(1, err, new Date().toISOString(), performance.now()),\n ]);\n }\n\n // PARALLEL\n if (step.parallel && step.parallel.length > 0) {\n return runParallelStep({\n ...params,\n step,\n stepState,\n startedAt,\n startPerf: stepStartPerf,\n });\n }\n\n const retryConfig = resolveRetryConfig(step, params.workflowDefaultRetry);\n\n const attempts: AttemptEntry[] = [];\n const totalAttempts = Math.max(1, retryConfig.attempts ?? 1);\n let lastError: unknown;\n let executionResult: unknown;\n let output: unknown;\n let succeeded = false;\n\n for (let attempt = 1; attempt <= totalAttempts; attempt++) {\n if (signal?.aborted) throw createCancelledError(signal);\n\n const attemptStart = new Date().toISOString();\n const attemptStartPerf = performance.now();\n try {\n // Fresh deep-clone per attempt — retries restart cleanly.\n const attemptState: Record<string, unknown> = cloneState(params.state);\n\n if (step.before) {\n await step.before(params.buildContext({ state: attemptState }));\n }\n\n if (step.agent) {\n const agentInput = step.input\n ? await step.input(params.buildContext({ state: attemptState }))\n : { prompt: \"\" };\n\n const { prompt, ...agentOpts } = agentInput;\n\n const result = await step.agent.execute(prompt, {\n ...agentOpts,\n signal,\n });\n\n executionResult = result;\n\n if (result.usage) {\n params.usage.input += result.usage.input ?? 0;\n params.usage.output += result.usage.output ?? 0;\n params.usage.total += result.usage.total ?? 0;\n }\n\n if (result.error) throw result.error;\n } else if (step.run) {\n executionResult = await step.run(params.buildContext({ state: attemptState }));\n }\n\n if (step.output) {\n const extracted = await step.output.extract(\n params.buildContext({\n state: attemptState,\n agentResult: executionResult,\n }),\n );\n output = await validateSchema(step.output.schema, extracted);\n } else {\n output = undefined;\n }\n\n if (step.after) {\n await step.after(\n params.buildContext({\n state: attemptState,\n agentResult: executionResult,\n }),\n );\n }\n\n Object.assign(stepState, attemptState);\n\n attempts.push({\n index: attempt,\n startedAt: attemptStart,\n endedAt: new Date().toISOString(),\n duration: performance.now() - attemptStartPerf,\n status: \"success\",\n });\n succeeded = true;\n break;\n } catch (err) {\n if (isAbortError(err) || err instanceof WorkflowCancelledError) {\n throw createCancelledError(signal);\n }\n\n attempts.push({\n index: attempt,\n startedAt: attemptStart,\n endedAt: new Date().toISOString(),\n duration: performance.now() - attemptStartPerf,\n status: \"failed\",\n error: toAIError(err),\n });\n\n lastError = err;\n\n const shouldRetry =\n attempt < totalAttempts &&\n (retryConfig.retryOn ? retryConfig.retryOn(err, attempt) !== false : true);\n\n if (!shouldRetry) break;\n\n emitter.emit(\n \"workflow.step.retrying\",\n {\n step: step.name,\n attempt: attempt + 1,\n totalAttempts,\n lastError: err,\n },\n params.executionHandlers,\n );\n\n step.on?.retrying?.({\n step: step.name,\n attempt: attempt + 1,\n totalAttempts,\n lastError: err,\n });\n\n logger.warn(logModule, \"step.retrying\", `${step.name} step retrying`, {\n step: step.name,\n attempt: attempt + 1,\n });\n\n retryConfig.onRetry?.(attempt + 1, err);\n\n const delay = resolveBackoff(attempt, retryConfig.backoff);\n if (delay > 0) await sleep(delay, signal);\n }\n }\n\n const endedAt = new Date().toISOString();\n const duration = performance.now() - stepStartPerf;\n\n if (!succeeded) {\n const aiError = toAIError(lastError);\n const stepError = new StepFailedError(\n `step \"${step.name}\" failed after ${attempts.length} attempt(s): ${aiError.message}`,\n { stepName: step.name, attempts: attempts.length, cause: aiError },\n );\n\n emitter.emit(\n \"workflow.step.failed\",\n { step: step.name, error: stepError, attempts: attempts.length },\n params.executionHandlers,\n );\n\n step.on?.failed?.({\n step: step.name,\n error: stepError,\n attempts: attempts.length,\n });\n\n logger.error(logModule, \"step.failed\", `${step.name} step failed`, {\n step: step.name,\n attempts: attempts.length,\n code: stepError.code,\n });\n\n const failedAgentResult = asAgentResult(executionResult);\n return {\n output: undefined,\n skipped: false,\n status: \"failed\",\n startedAt,\n endedAt,\n duration,\n attempts: attempts.length,\n attemptHistory: attempts,\n error: stepError,\n state: stepState,\n executionResult:\n executionResult && typeof executionResult === \"object\" ? executionResult : undefined,\n agentReport: failedAgentResult?.report,\n agentUsage: failedAgentResult?.usage,\n };\n }\n\n emitter.emit(\n \"workflow.step.completed\",\n { step: step.name, output, duration },\n params.executionHandlers,\n );\n step.on?.completed?.({ step: step.name, output, duration });\n logger.debug(logModule, \"step.completed\", \"step completed\", {\n step: step.name,\n duration,\n });\n\n const completedAgentResult = asAgentResult(executionResult);\n return {\n output,\n skipped: false,\n status: \"completed\",\n startedAt,\n endedAt,\n duration,\n attempts: attempts.length,\n attemptHistory: attempts,\n state: stepState,\n executionResult:\n executionResult && typeof executionResult === \"object\" ? executionResult : undefined,\n agentReport: completedAgentResult?.report,\n agentUsage: completedAgentResult?.usage,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Parallel runner\n// ---------------------------------------------------------------------------\n\ntype ParallelParams = ExecuteStepParams & {\n stepState: Record<string, unknown>;\n startedAt: string;\n startPerf: number;\n};\n\nasync function runParallelStep(params: ParallelParams): Promise<MutableStepSnapshot> {\n const { step, emitter, executionHandlers, logger, logModule, signal } = params;\n\n const sharedState = params.stepState;\n const childSnapshots: Record<string, StepSnapshot> = {};\n let firstError: AIError | undefined;\n\n const results = await Promise.all(\n (step.parallel ?? []).map(async (child) => {\n const snap = await executeStep({\n step: child,\n state: sharedState,\n emitter,\n executionHandlers,\n logger,\n logModule,\n signal,\n buildContext: params.buildContext,\n usage: params.usage,\n });\n\n Object.assign(sharedState, snap.state);\n return { child, snap };\n }),\n );\n\n for (const { child, snap } of results) {\n childSnapshots[child.name] = finalizeSnapshot(snap);\n if (snap.status === \"failed\" && !firstError && snap.error) {\n firstError = snap.error;\n }\n }\n\n const endedAt = new Date().toISOString();\n const duration = performance.now() - params.startPerf;\n\n let output: unknown;\n\n if (step.output) {\n try {\n const ctx = params.buildContext({ state: sharedState });\n const ctxWithChildren = {\n ...ctx,\n steps: {\n ...ctx.steps,\n [step.name]: {\n ...(childSnapshots as unknown as StepSnapshot),\n steps: childSnapshots,\n status: firstError ? \"failed\" : \"completed\",\n } as StepSnapshot,\n } as Readonly<Record<string, StepSnapshot>>,\n };\n\n const extracted = await step.output.extract(ctxWithChildren);\n output = await validateSchema(step.output.schema, extracted);\n } catch (err) {\n firstError = firstError ?? toAIError(err);\n }\n }\n\n const status: \"completed\" | \"failed\" = firstError ? \"failed\" : \"completed\";\n\n if (status === \"completed\") {\n emitter.emit(\n \"workflow.step.completed\",\n { step: step.name, output, duration },\n executionHandlers,\n );\n step.on?.completed?.({ step: step.name, output, duration });\n } else {\n emitter.emit(\n \"workflow.step.failed\",\n { step: step.name, error: firstError!, attempts: 1 },\n executionHandlers,\n );\n step.on?.failed?.({ step: step.name, error: firstError!, attempts: 1 });\n }\n\n return {\n output,\n skipped: false,\n status,\n startedAt: params.startedAt,\n endedAt,\n duration,\n attempts: 1,\n attemptHistory: [],\n error: firstError,\n state: sharedState,\n steps: childSnapshots,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function finalizeSnapshot(snap: MutableStepSnapshot): StepSnapshot {\n return Object.freeze({\n output: snap.output,\n skipped: snap.skipped,\n status: snap.status,\n startedAt: snap.startedAt,\n endedAt: snap.endedAt,\n duration: snap.duration,\n attempts: snap.attempts,\n attemptHistory: snap.attemptHistory,\n error: snap.error,\n state: deepFreeze(cloneState(snap.state)),\n executionResult: snap.executionResult as StepSnapshot[\"executionResult\"],\n agentReport: snap.agentReport,\n agentUsage: snap.agentUsage,\n steps: snap.steps,\n }) as StepSnapshot;\n}\n\nfunction buildFailedSnapshot(\n step: StepDefinition,\n state: Record<string, unknown>,\n startedAt: string,\n startPerf: number,\n attemptsCount: number,\n attemptHistory: AttemptEntry[],\n): MutableStepSnapshot {\n const endedAt = new Date().toISOString();\n const duration = performance.now() - startPerf;\n const lastErr = attemptHistory[attemptHistory.length - 1]?.error;\n const wrapped = lastErr\n ? new StepFailedError(`step \"${step.name}\" skip threw: ${lastErr.message}`, {\n stepName: step.name,\n attempts: attemptsCount,\n cause: lastErr,\n })\n : new StepFailedError(`step \"${step.name}\" failed`, {\n stepName: step.name,\n attempts: attemptsCount,\n });\n\n return {\n output: undefined,\n skipped: false,\n status: \"failed\",\n startedAt,\n endedAt,\n duration,\n attempts: attemptsCount,\n attemptHistory,\n error: wrapped,\n state,\n };\n}\n\nfunction failedAttempt(\n index: number,\n err: unknown,\n startedAt: string,\n startPerf: number,\n): AttemptEntry {\n return {\n index,\n startedAt,\n endedAt: new Date().toISOString(),\n duration: performance.now() - startPerf,\n status: \"failed\",\n error: toAIError(err),\n };\n}\n\nexport function toAIError(err: unknown): AIError {\n if (err instanceof AIError) return err;\n if (err instanceof Error) return new WorkflowError(err.message, { cause: err });\n return new WorkflowError(String(err));\n}\n\nasync function validateSchema(\n schema: StandardSchemaV1<unknown> | undefined,\n value: unknown,\n): Promise<unknown> {\n if (!schema) return value;\n const result = await schema[\"~standard\"].validate(value);\n\n if (\"issues\" in result && result.issues) {\n throw new SchemaValidationError(\"workflow step output failed schema validation\", {\n issues: result.issues,\n });\n }\n\n return (result as { value: unknown }).value;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { StepDefinition } from "../contracts/workflow/step.contract.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/workflow/step.d.ts
3
+ //#region ../@warlock.js/ai/src/workflow/step.d.ts
4
4
  /**
5
5
  * `ai.step(def)` — pass-through factory used for authoring. Returns
6
6
  * the definition object verbatim so the workflow engine can read it
@@ -1 +1 @@
1
- {"version":3,"file":"step.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/step.ts"],"mappings":";;;;;AAeA;;;;;;;;;;iBAAgB,IAAA,4BAEL,MAAA,sCAAA,CAGT,UAAA,EAAY,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,QAAA,IAC1C,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,QAAA"}
1
+ {"version":3,"file":"step.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/step.ts"],"mappings":";;;;;AAeA;;;;;;;;;;iBAAgB,IAAA,4BAEL,MAAA,uCAGT,UAAA,EAAY,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,QAAA,IAC1C,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,QAAA"}
@@ -1,7 +1,7 @@
1
1
  import { WorkflowError } from "../errors/workflow-error.mjs";
2
2
  import "../errors/index.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/workflow/step.ts
4
+ //#region ../@warlock.js/ai/src/workflow/step.ts
5
5
  /**
6
6
  * `ai.step(def)` — pass-through factory used for authoring. Returns
7
7
  * the definition object verbatim so the workflow engine can read it
@@ -1 +1 @@
1
- {"version":3,"file":"step.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/step.ts"],"sourcesContent":["import type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport { WorkflowError } from \"../errors\";\n\n/**\n * `ai.step(def)` — pass-through factory used for authoring. Returns\n * the definition object verbatim so the workflow engine can read it\n * during execution; the factory exists for API symmetry with\n * `ai.workflow()` and to leave room for future validation or\n * metadata annotation.\n *\n * Generics flow from the enclosing `ai.workflow<...>()` call when the\n * step is declared inline inside `steps: [...]`. To author a step\n * outside that context with full typing, pass them explicitly:\n * `ai.step<MyInput, MyState, MyContext>({ ... })`.\n */\nexport function step<\n TInput = unknown,\n TState = Record<string, unknown>,\n TContext = unknown,\n>(\n definition: StepDefinition<TInput, TState, TContext>,\n): StepDefinition<TInput, TState, TContext> {\n validate(definition);\n return definition;\n}\n\nfunction validate<TInput, TState, TContext>(\n def: StepDefinition<TInput, TState, TContext>,\n): void {\n if (!def.name || typeof def.name !== \"string\") {\n throw new WorkflowError(\"ai.step: `name` is required\");\n }\n\n const hasRun = typeof def.run === \"function\";\n const hasAgent = def.agent !== undefined;\n const hasParallel = Array.isArray(def.parallel) && def.parallel.length > 0;\n\n const modes = [hasRun, hasAgent, hasParallel].filter(Boolean).length;\n\n if (modes === 0) {\n throw new WorkflowError(\n `ai.step(\"${def.name}\"): must define exactly one of run | agent | parallel`,\n );\n }\n\n if (modes > 1) {\n throw new WorkflowError(\n `ai.step(\"${def.name}\"): define only one of run | agent | parallel`,\n );\n }\n\n if (hasAgent && typeof def.input !== \"function\") {\n throw new WorkflowError(\n `ai.step(\"${def.name}\"): \\`input(ctx)\\` is required when \\`agent\\` is set`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAgB,KAKd,YAC0C;CAC1C,SAAS,UAAU;CACnB,OAAO;AACT;AAEA,SAAS,SACP,KACM;CACN,IAAI,CAAC,IAAI,QAAQ,OAAO,IAAI,SAAS,UACnC,MAAM,IAAI,cAAc,6BAA6B;CAGvD,MAAM,SAAS,OAAO,IAAI,QAAQ;CAClC,MAAM,WAAW,IAAI,UAAU;CAG/B,MAAM,QAAQ;EAAC;EAAQ;EAFH,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,SAAS,SAAS;CAE7B,EAAE,OAAO,OAAO,EAAE;CAE9D,IAAI,UAAU,GACZ,MAAM,IAAI,cACR,YAAY,IAAI,KAAK,sDACvB;CAGF,IAAI,QAAQ,GACV,MAAM,IAAI,cACR,YAAY,IAAI,KAAK,8CACvB;CAGF,IAAI,YAAY,OAAO,IAAI,UAAU,YACnC,MAAM,IAAI,cACR,YAAY,IAAI,KAAK,qDACvB;AAEJ"}
1
+ {"version":3,"file":"step.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/step.ts"],"sourcesContent":["import type { StepDefinition } from \"../contracts/workflow/step.contract\";\nimport { WorkflowError } from \"../errors\";\n\n/**\n * `ai.step(def)` — pass-through factory used for authoring. Returns\n * the definition object verbatim so the workflow engine can read it\n * during execution; the factory exists for API symmetry with\n * `ai.workflow()` and to leave room for future validation or\n * metadata annotation.\n *\n * Generics flow from the enclosing `ai.workflow<...>()` call when the\n * step is declared inline inside `steps: [...]`. To author a step\n * outside that context with full typing, pass them explicitly:\n * `ai.step<MyInput, MyState, MyContext>({ ... })`.\n */\nexport function step<\n TInput = unknown,\n TState = Record<string, unknown>,\n TContext = unknown,\n>(\n definition: StepDefinition<TInput, TState, TContext>,\n): StepDefinition<TInput, TState, TContext> {\n validate(definition);\n return definition;\n}\n\nfunction validate<TInput, TState, TContext>(\n def: StepDefinition<TInput, TState, TContext>,\n): void {\n if (!def.name || typeof def.name !== \"string\") {\n throw new WorkflowError(\"ai.step: `name` is required\");\n }\n\n const hasRun = typeof def.run === \"function\";\n const hasAgent = def.agent !== undefined;\n const hasParallel = Array.isArray(def.parallel) && def.parallel.length > 0;\n\n const modes = [hasRun, hasAgent, hasParallel].filter(Boolean).length;\n\n if (modes === 0) {\n throw new WorkflowError(\n `ai.step(\"${def.name}\"): must define exactly one of run | agent | parallel`,\n );\n }\n\n if (modes > 1) {\n throw new WorkflowError(\n `ai.step(\"${def.name}\"): define only one of run | agent | parallel`,\n );\n }\n\n if (hasAgent && typeof def.input !== \"function\") {\n throw new WorkflowError(\n `ai.step(\"${def.name}\"): \\`input(ctx)\\` is required when \\`agent\\` is set`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAgB,KAKd,YAC0C;CAC1C,SAAS,UAAU;CACnB,OAAO;AACT;AAEA,SAAS,SACP,KACM;CACN,IAAI,CAAC,IAAI,QAAQ,OAAO,IAAI,SAAS,UACnC,MAAM,IAAI,cAAc,6BAA6B;CAGvD,MAAM,SAAS,OAAO,IAAI,QAAQ;CAClC,MAAM,WAAW,IAAI,UAAU;CAG/B,MAAM,QAAQ;EAAC;EAAQ;EAFH,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,SAAS,SAAS;CAE7B,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;CAE9D,IAAI,UAAU,GACZ,MAAM,IAAI,cACR,YAAY,IAAI,KAAK,sDACvB;CAGF,IAAI,QAAQ,GACV,MAAM,IAAI,cACR,YAAY,IAAI,KAAK,8CACvB;CAGF,IAAI,YAAY,OAAO,IAAI,UAAU,YACnC,MAAM,IAAI,cACR,YAAY,IAAI,KAAK,qDACvB;AAEJ"}
@@ -1,6 +1,6 @@
1
1
  import { WorkflowDefinition, WorkflowInstance } from "../contracts/workflow/workflow.contract.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/workflow/workflow.d.ts
3
+ //#region ../@warlock.js/ai/src/workflow/workflow.d.ts
4
4
  /**
5
5
  * `ai.workflow(def)` — construct a `WorkflowInstance`. Validates the
6
6
  * definition, computes a stable structural signature, and wires up the
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/workflow/workflow.ts"],"mappings":";;;;;AAuBA;;;iBAAgB,QAAA,+CAGL,MAAA,sCAAA,CAGT,UAAA,EAAY,kBAAA,CAAmB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAA,IACvD,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAA"}
1
+ {"version":3,"file":"workflow.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/workflow/workflow.ts"],"mappings":";;;;;AAuBA;;;iBAAgB,QAAA,+CAGL,MAAA,uCAGT,UAAA,EAAY,kBAAA,CAAmB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAA,IACvD,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,QAAA"}
@@ -6,7 +6,7 @@ import { loadSnapshotForResume } from "./snapshot.mjs";
6
6
  import { runWorkflow } from "./engine.mjs";
7
7
  import { computeSignature } from "./signature.mjs";
8
8
 
9
- //#region ../../@warlock.js/ai/src/workflow/workflow.ts
9
+ //#region ../@warlock.js/ai/src/workflow/workflow.ts
10
10
  /**
11
11
  * `ai.workflow(def)` — construct a `WorkflowInstance`. Validates the
12
12
  * definition, computes a stable structural signature, and wires up the
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.mjs","names":["combined"],"sources":["../../../../../../@warlock.js/ai/src/workflow/workflow.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { WorkflowEventMap } from \"../contracts/events/event-map.type\";\nimport type { WorkflowResult } from \"../contracts/result/workflow-result.type\";\nimport type {\n WorkflowDefinition,\n WorkflowEventHandler,\n WorkflowExecuteOptions,\n WorkflowInstance,\n WorkflowResumeOptions,\n WorkflowRunOptions,\n} from \"../contracts/workflow/workflow.contract\";\nimport { WorkflowError } from \"../errors\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { asTool } from \"./as-tool\";\nimport { WorkflowEmitter } from \"./emitter\";\nimport { loadSnapshotForResume, runWorkflow } from \"./engine\";\nimport { computeSignature } from \"./signature\";\n\n/**\n * `ai.workflow(def)` — construct a `WorkflowInstance`. Validates the\n * definition, computes a stable structural signature, and wires up the\n * three-tier event subscription model.\n */\nexport function workflow<\n TInput = unknown,\n TOutput = unknown,\n TState = Record<string, unknown>,\n TContext = unknown,\n>(\n definition: WorkflowDefinition<TInput, TOutput, TState, TContext>,\n): WorkflowInstance<TInput, TOutput, TState, TContext> {\n validate(definition);\n const signature = computeSignature(definition);\n const emitter = new WorkflowEmitter(definition.on);\n\n function execute(\n inputOrOptions: TInput | WorkflowExecuteOptions<TInput, TContext>,\n maybeOptions?: WorkflowRunOptions<TContext>,\n ): Promise<WorkflowResult<TOutput>> {\n const { input, options } = normalizeExecuteArgs<TInput, TContext>(\n inputOrOptions,\n maybeOptions,\n );\n const runId = options?.runId ?? generateRunId();\n return runWorkflow<TOutput>({\n definition,\n signature,\n emitter,\n input,\n context: options?.context,\n runId,\n signal: options?.signal,\n executionHandlers: options?.on,\n sessionId: options?.sessionId,\n });\n }\n\n async function resume(\n runId: string,\n options?: WorkflowResumeOptions<TContext>,\n ): Promise<WorkflowResult<TOutput>> {\n const snapshot = await loadSnapshotForResume({\n definition,\n signature,\n runId,\n options,\n });\n\n return runWorkflow<TOutput>({\n definition,\n signature,\n emitter,\n input: snapshot.input,\n context: options?.context,\n runId,\n signal: options?.signal,\n executionHandlers: options?.on,\n sessionId: options?.sessionId,\n resumeFrom: snapshot,\n });\n }\n\n const instance: WorkflowInstance<TInput, TOutput, TState, TContext> = {\n name: definition.name,\n description: definition.description,\n signature,\n version: definition.version,\n execute,\n resume,\n on<K extends keyof WorkflowEventMap>(event: K, handler: WorkflowEventHandler<K>) {\n return emitter.on(event, handler);\n },\n off<K extends keyof WorkflowEventMap>(event: K, handler: WorkflowEventHandler<K>) {\n emitter.off(event, handler);\n },\n asTool<TToolInput = TInput>(options: {\n description?: string;\n inputSchema: StandardSchemaV1<TToolInput>;\n }): ToolContract<TToolInput, TOutput> {\n return asTool<TInput, TOutput, TToolInput>(instance, options);\n },\n };\n\n return instance;\n}\n\n/**\n * Resolve the overloaded `execute()` call shape. If the caller passed\n * a single plain object with an `input` field, treat it as the\n * combined `WorkflowExecuteOptions`. Otherwise the first arg is the\n * raw workflow input and the second is the run options.\n *\n * Ambiguity note: if your real workflow `input` is itself an object\n * with a top-level `input` key, prefer `execute(rawInput, options)`\n * explicitly — the single-arg detection heuristic would mis-classify\n * it.\n */\nfunction normalizeExecuteArgs<TInput, TContext>(\n inputOrOptions: TInput | WorkflowExecuteOptions<TInput, TContext>,\n maybeOptions: WorkflowRunOptions<TContext> | undefined,\n): { input: TInput; options?: WorkflowRunOptions<TContext> } {\n if (\n maybeOptions === undefined &&\n inputOrOptions !== null &&\n typeof inputOrOptions === \"object\" &&\n \"input\" in (inputOrOptions as object)\n ) {\n const combined = inputOrOptions as WorkflowExecuteOptions<TInput, TContext>;\n const { input, ...options } = combined;\n return { input, options };\n }\n\n return { input: inputOrOptions as TInput, options: maybeOptions };\n}\n\nfunction validate<TInput, TOutput, TState, TContext>(\n definition: WorkflowDefinition<TInput, TOutput, TState, TContext>,\n): void {\n if (!definition.name || typeof definition.name !== \"string\") {\n throw new WorkflowError(\"ai.workflow: `name` is required\");\n }\n\n if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n throw new WorkflowError(`ai.workflow(\"${definition.name}\"): at least one step is required`);\n }\n\n const seen = new Set<string>();\n const walk = (name: string) => {\n if (seen.has(name)) {\n throw new WorkflowError(`ai.workflow(\"${definition.name}\"): duplicate step name \"${name}\"`);\n }\n seen.add(name);\n };\n\n for (const step of definition.steps) {\n walk(step.name);\n\n if (step.parallel) {\n for (const child of step.parallel) {\n walk(child.name);\n }\n }\n }\n}\n\nfunction generateRunId(): string {\n // Non-crypto random — adequate for ephemeral workflow runs.\n return `wf_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,SAAgB,SAMd,YACqD;CACrD,SAAS,UAAU;CACnB,MAAM,YAAY,iBAAiB,UAAU;CAC7C,MAAM,UAAU,IAAI,gBAAgB,WAAW,EAAE;CAEjD,SAAS,QACP,gBACA,cACkC;EAClC,MAAM,EAAE,OAAO,YAAY,qBACzB,gBACA,YACF;EACA,MAAM,QAAQ,SAAS,SAAS,cAAc;EAC9C,OAAO,YAAqB;GAC1B;GACA;GACA;GACA;GACA,SAAS,SAAS;GAClB;GACA,QAAQ,SAAS;GACjB,mBAAmB,SAAS;GAC5B,WAAW,SAAS;EACtB,CAAC;CACH;CAEA,eAAe,OACb,OACA,SACkC;EAClC,MAAM,WAAW,MAAM,sBAAsB;GAC3C;GACA;GACA;GACA;EACF,CAAC;EAED,OAAO,YAAqB;GAC1B;GACA;GACA;GACA,OAAO,SAAS;GAChB,SAAS,SAAS;GAClB;GACA,QAAQ,SAAS;GACjB,mBAAmB,SAAS;GAC5B,WAAW,SAAS;GACpB,YAAY;EACd,CAAC;CACH;CAEA,MAAM,WAAgE;EACpE,MAAM,WAAW;EACjB,aAAa,WAAW;EACxB;EACA,SAAS,WAAW;EACpB;EACA;EACA,GAAqC,OAAU,SAAkC;GAC/E,OAAO,QAAQ,GAAG,OAAO,OAAO;EAClC;EACA,IAAsC,OAAU,SAAkC;GAChF,QAAQ,IAAI,OAAO,OAAO;EAC5B;EACA,OAA4B,SAGU;GACpC,OAAO,OAAoC,UAAU,OAAO;EAC9D;CACF;CAEA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAS,qBACP,gBACA,cAC2D;CAC3D,IACE,iBAAiB,UACjB,mBAAmB,QACnB,OAAO,mBAAmB,YAC1B,WAAY,gBACZ;EAEA,MAAM,EAAE,OAAO,GAAG,YAAYA;EAC9B,OAAO;GAAE;GAAO;EAAQ;CAC1B;CAEA,OAAO;EAAE,OAAO;EAA0B,SAAS;CAAa;AAClE;AAEA,SAAS,SACP,YACM;CACN,IAAI,CAAC,WAAW,QAAQ,OAAO,WAAW,SAAS,UACjD,MAAM,IAAI,cAAc,iCAAiC;CAG3D,IAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW,MAAM,WAAW,GAClE,MAAM,IAAI,cAAc,gBAAgB,WAAW,KAAK,kCAAkC;CAG5F,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,QAAQ,SAAiB;EAC7B,IAAI,KAAK,IAAI,IAAI,GACf,MAAM,IAAI,cAAc,gBAAgB,WAAW,KAAK,2BAA2B,KAAK,EAAE;EAE5F,KAAK,IAAI,IAAI;CACf;CAEA,KAAK,MAAM,QAAQ,WAAW,OAAO;EACnC,KAAK,KAAK,IAAI;EAEd,IAAI,KAAK,UACP,KAAK,MAAM,SAAS,KAAK,UACvB,KAAK,MAAM,IAAI;CAGrB;AACF;AAEA,SAAS,gBAAwB;CAE/B,OAAO,MAAM,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAChF"}
1
+ {"version":3,"file":"workflow.mjs","names":["combined"],"sources":["../../../../../../../@warlock.js/ai/src/workflow/workflow.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { WorkflowEventMap } from \"../contracts/events/event-map.type\";\nimport type { WorkflowResult } from \"../contracts/result/workflow-result.type\";\nimport type {\n WorkflowDefinition,\n WorkflowEventHandler,\n WorkflowExecuteOptions,\n WorkflowInstance,\n WorkflowResumeOptions,\n WorkflowRunOptions,\n} from \"../contracts/workflow/workflow.contract\";\nimport { WorkflowError } from \"../errors\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { asTool } from \"./as-tool\";\nimport { WorkflowEmitter } from \"./emitter\";\nimport { loadSnapshotForResume, runWorkflow } from \"./engine\";\nimport { computeSignature } from \"./signature\";\n\n/**\n * `ai.workflow(def)` — construct a `WorkflowInstance`. Validates the\n * definition, computes a stable structural signature, and wires up the\n * three-tier event subscription model.\n */\nexport function workflow<\n TInput = unknown,\n TOutput = unknown,\n TState = Record<string, unknown>,\n TContext = unknown,\n>(\n definition: WorkflowDefinition<TInput, TOutput, TState, TContext>,\n): WorkflowInstance<TInput, TOutput, TState, TContext> {\n validate(definition);\n const signature = computeSignature(definition);\n const emitter = new WorkflowEmitter(definition.on);\n\n function execute(\n inputOrOptions: TInput | WorkflowExecuteOptions<TInput, TContext>,\n maybeOptions?: WorkflowRunOptions<TContext>,\n ): Promise<WorkflowResult<TOutput>> {\n const { input, options } = normalizeExecuteArgs<TInput, TContext>(\n inputOrOptions,\n maybeOptions,\n );\n const runId = options?.runId ?? generateRunId();\n return runWorkflow<TOutput>({\n definition,\n signature,\n emitter,\n input,\n context: options?.context,\n runId,\n signal: options?.signal,\n executionHandlers: options?.on,\n sessionId: options?.sessionId,\n });\n }\n\n async function resume(\n runId: string,\n options?: WorkflowResumeOptions<TContext>,\n ): Promise<WorkflowResult<TOutput>> {\n const snapshot = await loadSnapshotForResume({\n definition,\n signature,\n runId,\n options,\n });\n\n return runWorkflow<TOutput>({\n definition,\n signature,\n emitter,\n input: snapshot.input,\n context: options?.context,\n runId,\n signal: options?.signal,\n executionHandlers: options?.on,\n sessionId: options?.sessionId,\n resumeFrom: snapshot,\n });\n }\n\n const instance: WorkflowInstance<TInput, TOutput, TState, TContext> = {\n name: definition.name,\n description: definition.description,\n signature,\n version: definition.version,\n execute,\n resume,\n on<K extends keyof WorkflowEventMap>(event: K, handler: WorkflowEventHandler<K>) {\n return emitter.on(event, handler);\n },\n off<K extends keyof WorkflowEventMap>(event: K, handler: WorkflowEventHandler<K>) {\n emitter.off(event, handler);\n },\n asTool<TToolInput = TInput>(options: {\n description?: string;\n inputSchema: StandardSchemaV1<TToolInput>;\n }): ToolContract<TToolInput, TOutput> {\n return asTool<TInput, TOutput, TToolInput>(instance, options);\n },\n };\n\n return instance;\n}\n\n/**\n * Resolve the overloaded `execute()` call shape. If the caller passed\n * a single plain object with an `input` field, treat it as the\n * combined `WorkflowExecuteOptions`. Otherwise the first arg is the\n * raw workflow input and the second is the run options.\n *\n * Ambiguity note: if your real workflow `input` is itself an object\n * with a top-level `input` key, prefer `execute(rawInput, options)`\n * explicitly — the single-arg detection heuristic would mis-classify\n * it.\n */\nfunction normalizeExecuteArgs<TInput, TContext>(\n inputOrOptions: TInput | WorkflowExecuteOptions<TInput, TContext>,\n maybeOptions: WorkflowRunOptions<TContext> | undefined,\n): { input: TInput; options?: WorkflowRunOptions<TContext> } {\n if (\n maybeOptions === undefined &&\n inputOrOptions !== null &&\n typeof inputOrOptions === \"object\" &&\n \"input\" in (inputOrOptions as object)\n ) {\n const combined = inputOrOptions as WorkflowExecuteOptions<TInput, TContext>;\n const { input, ...options } = combined;\n return { input, options };\n }\n\n return { input: inputOrOptions as TInput, options: maybeOptions };\n}\n\nfunction validate<TInput, TOutput, TState, TContext>(\n definition: WorkflowDefinition<TInput, TOutput, TState, TContext>,\n): void {\n if (!definition.name || typeof definition.name !== \"string\") {\n throw new WorkflowError(\"ai.workflow: `name` is required\");\n }\n\n if (!Array.isArray(definition.steps) || definition.steps.length === 0) {\n throw new WorkflowError(`ai.workflow(\"${definition.name}\"): at least one step is required`);\n }\n\n const seen = new Set<string>();\n const walk = (name: string) => {\n if (seen.has(name)) {\n throw new WorkflowError(`ai.workflow(\"${definition.name}\"): duplicate step name \"${name}\"`);\n }\n seen.add(name);\n };\n\n for (const step of definition.steps) {\n walk(step.name);\n\n if (step.parallel) {\n for (const child of step.parallel) {\n walk(child.name);\n }\n }\n }\n}\n\nfunction generateRunId(): string {\n // Non-crypto random — adequate for ephemeral workflow runs.\n return `wf_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,SAAgB,SAMd,YACqD;CACrD,SAAS,UAAU;CACnB,MAAM,YAAY,iBAAiB,UAAU;CAC7C,MAAM,UAAU,IAAI,gBAAgB,WAAW,EAAE;CAEjD,SAAS,QACP,gBACA,cACkC;EAClC,MAAM,EAAE,OAAO,YAAY,qBACzB,gBACA,YACF;EACA,MAAM,QAAQ,SAAS,SAAS,cAAc;EAC9C,OAAO,YAAqB;GAC1B;GACA;GACA;GACA;GACA,SAAS,SAAS;GAClB;GACA,QAAQ,SAAS;GACjB,mBAAmB,SAAS;GAC5B,WAAW,SAAS;EACtB,CAAC;CACH;CAEA,eAAe,OACb,OACA,SACkC;EAClC,MAAM,WAAW,MAAM,sBAAsB;GAC3C;GACA;GACA;GACA;EACF,CAAC;EAED,OAAO,YAAqB;GAC1B;GACA;GACA;GACA,OAAO,SAAS;GAChB,SAAS,SAAS;GAClB;GACA,QAAQ,SAAS;GACjB,mBAAmB,SAAS;GAC5B,WAAW,SAAS;GACpB,YAAY;EACd,CAAC;CACH;CAEA,MAAM,WAAgE;EACpE,MAAM,WAAW;EACjB,aAAa,WAAW;EACxB;EACA,SAAS,WAAW;EACpB;EACA;EACA,GAAqC,OAAU,SAAkC;GAC/E,OAAO,QAAQ,GAAG,OAAO,OAAO;EAClC;EACA,IAAsC,OAAU,SAAkC;GAChF,QAAQ,IAAI,OAAO,OAAO;EAC5B;EACA,OAA4B,SAGU;GACpC,OAAO,OAAoC,UAAU,OAAO;EAC9D;CACF;CAEA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAS,qBACP,gBACA,cAC2D;CAC3D,IACE,iBAAiB,UACjB,mBAAmB,QACnB,OAAO,mBAAmB,YAC1B,WAAY,gBACZ;EAEA,MAAM,EAAE,OAAO,GAAG,YAAYA;EAC9B,OAAO;GAAE;GAAO;EAAQ;CAC1B;CAEA,OAAO;EAAE,OAAO;EAA0B,SAAS;CAAa;AAClE;AAEA,SAAS,SACP,YACM;CACN,IAAI,CAAC,WAAW,QAAQ,OAAO,WAAW,SAAS,UACjD,MAAM,IAAI,cAAc,iCAAiC;CAG3D,IAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,KAAK,WAAW,MAAM,WAAW,GAClE,MAAM,IAAI,cAAc,gBAAgB,WAAW,KAAK,kCAAkC;CAG5F,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,QAAQ,SAAiB;EAC7B,IAAI,KAAK,IAAI,IAAI,GACf,MAAM,IAAI,cAAc,gBAAgB,WAAW,KAAK,2BAA2B,KAAK,EAAE;EAE5F,KAAK,IAAI,IAAI;CACf;CAEA,KAAK,MAAM,QAAQ,WAAW,OAAO;EACnC,KAAK,KAAK,IAAI;EAEd,IAAI,KAAK,UACP,KAAK,MAAM,SAAS,KAAK,UACvB,KAAK,MAAM,IAAI;CAGrB;AACF;AAEA,SAAS,gBAAwB;CAE/B,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE;AAChF"}
package/package.json CHANGED
@@ -15,10 +15,10 @@
15
15
  "@standard-schema/spec": "^1.0.0"
16
16
  },
17
17
  "peerDependencies": {
18
- "@warlock.js/cache": "*",
19
- "@warlock.js/logger": "*"
18
+ "@warlock.js/cache": "4.2.0",
19
+ "@warlock.js/logger": "4.2.0"
20
20
  },
21
- "version": "4.1.14",
21
+ "version": "4.2.0",
22
22
  "main": "./cjs/index.cjs",
23
23
  "module": "./esm/index.mjs",
24
24
  "types": "./esm/index.d.mts",