@theokit/sdk 4.24.0 → 4.26.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 (382) hide show
  1. package/dist/a2a/index.cjs +10 -171
  2. package/dist/a2a/index.cjs.map +1 -1
  3. package/dist/a2a/index.js +3 -170
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/agent-factory-registry-UU46BUMU.cjs +16 -0
  6. package/dist/agent-factory-registry-UU46BUMU.cjs.map +1 -0
  7. package/dist/agent-factory-registry-ZVTABLEY.js +3 -0
  8. package/dist/agent-factory-registry-ZVTABLEY.js.map +1 -0
  9. package/dist/auth/index.cjs +63 -367
  10. package/dist/auth/index.cjs.map +1 -1
  11. package/dist/auth/index.js +6 -342
  12. package/dist/auth/index.js.map +1 -1
  13. package/dist/batch-2FSD2UNL.cjs +244 -0
  14. package/dist/batch-2FSD2UNL.cjs.map +1 -0
  15. package/dist/batch-MR2HKYMS.js +241 -0
  16. package/dist/batch-MR2HKYMS.js.map +1 -0
  17. package/dist/chunk-2HRYBRD7.cjs +31 -0
  18. package/dist/chunk-2HRYBRD7.cjs.map +1 -0
  19. package/dist/chunk-2MF3IE2D.cjs +2863 -0
  20. package/dist/chunk-2MF3IE2D.cjs.map +1 -0
  21. package/dist/chunk-2ONFGMBV.js +6 -0
  22. package/dist/chunk-2ONFGMBV.js.map +1 -0
  23. package/dist/chunk-2SFBB54R.js +23 -0
  24. package/dist/chunk-2SFBB54R.js.map +1 -0
  25. package/dist/chunk-2XLKLVVR.js +18 -0
  26. package/dist/chunk-2XLKLVVR.js.map +1 -0
  27. package/dist/chunk-4SXHEZIV.cjs +240 -0
  28. package/dist/chunk-4SXHEZIV.cjs.map +1 -0
  29. package/dist/chunk-4VPXM6UU.js +10 -0
  30. package/dist/chunk-4VPXM6UU.js.map +1 -0
  31. package/dist/chunk-4WL52CXU.cjs +148 -0
  32. package/dist/chunk-4WL52CXU.cjs.map +1 -0
  33. package/dist/chunk-5NBUH3NO.js +39 -0
  34. package/dist/chunk-5NBUH3NO.js.map +1 -0
  35. package/dist/chunk-5PZMMF4H.js +43 -0
  36. package/dist/chunk-5PZMMF4H.js.map +1 -0
  37. package/dist/chunk-6CLRANZA.js +289 -0
  38. package/dist/chunk-6CLRANZA.js.map +1 -0
  39. package/dist/chunk-6JSIEDKL.cjs +121 -0
  40. package/dist/chunk-6JSIEDKL.cjs.map +1 -0
  41. package/dist/chunk-6M4ODB2V.cjs +145 -0
  42. package/dist/chunk-6M4ODB2V.cjs.map +1 -0
  43. package/dist/chunk-6X6ID4MO.js +20 -0
  44. package/dist/chunk-6X6ID4MO.js.map +1 -0
  45. package/dist/chunk-77FOZCOT.js +165 -0
  46. package/dist/chunk-77FOZCOT.js.map +1 -0
  47. package/dist/chunk-7AD3ZTZL.js +25 -0
  48. package/dist/chunk-7AD3ZTZL.js.map +1 -0
  49. package/dist/chunk-7GFX45DD.js +57 -0
  50. package/dist/chunk-7GFX45DD.js.map +1 -0
  51. package/dist/chunk-7S7KKUO6.cjs +45 -0
  52. package/dist/chunk-7S7KKUO6.cjs.map +1 -0
  53. package/dist/chunk-7W7ZWMLQ.js +99 -0
  54. package/dist/chunk-7W7ZWMLQ.js.map +1 -0
  55. package/dist/chunk-A44COQJJ.cjs +353 -0
  56. package/dist/chunk-A44COQJJ.cjs.map +1 -0
  57. package/dist/chunk-AKSBP7OO.js +185 -0
  58. package/dist/chunk-AKSBP7OO.js.map +1 -0
  59. package/dist/chunk-ANIZEWTU.cjs +196 -0
  60. package/dist/chunk-ANIZEWTU.cjs.map +1 -0
  61. package/dist/chunk-BEURCLDV.cjs +139 -0
  62. package/dist/chunk-BEURCLDV.cjs.map +1 -0
  63. package/dist/chunk-BFWPZMG7.js +379 -0
  64. package/dist/chunk-BFWPZMG7.js.map +1 -0
  65. package/dist/chunk-BUUUWQMB.cjs +34 -0
  66. package/dist/chunk-BUUUWQMB.cjs.map +1 -0
  67. package/dist/chunk-BV2MWEMV.cjs +26 -0
  68. package/dist/chunk-BV2MWEMV.cjs.map +1 -0
  69. package/dist/chunk-BWT67BI4.cjs +268 -0
  70. package/dist/chunk-BWT67BI4.cjs.map +1 -0
  71. package/dist/chunk-BXV2QUIC.js +191 -0
  72. package/dist/chunk-BXV2QUIC.js.map +1 -0
  73. package/dist/chunk-C6Y6CWYD.cjs +44 -0
  74. package/dist/chunk-C6Y6CWYD.cjs.map +1 -0
  75. package/dist/chunk-C7PICHRF.cjs +68 -0
  76. package/dist/chunk-C7PICHRF.cjs.map +1 -0
  77. package/dist/chunk-CAH3G4IS.js +13 -0
  78. package/dist/chunk-CAH3G4IS.js.map +1 -0
  79. package/dist/chunk-D42XHI4O.cjs +565 -0
  80. package/dist/chunk-D42XHI4O.cjs.map +1 -0
  81. package/dist/chunk-DGRZNMTU.js +104 -0
  82. package/dist/chunk-DGRZNMTU.js.map +1 -0
  83. package/dist/chunk-DUK5WMKJ.js +71 -0
  84. package/dist/chunk-DUK5WMKJ.js.map +1 -0
  85. package/dist/chunk-EEZ7CFMM.js +14 -0
  86. package/dist/chunk-EEZ7CFMM.js.map +1 -0
  87. package/dist/chunk-EPYZOCOL.cjs +82 -0
  88. package/dist/chunk-EPYZOCOL.cjs.map +1 -0
  89. package/dist/chunk-EVADEGM7.cjs +168 -0
  90. package/dist/chunk-EVADEGM7.cjs.map +1 -0
  91. package/dist/chunk-FD2UT76F.js +3 -0
  92. package/dist/chunk-FD2UT76F.js.map +1 -0
  93. package/dist/chunk-FV3YEMQ7.js +179 -0
  94. package/dist/chunk-FV3YEMQ7.js.map +1 -0
  95. package/dist/chunk-G2F67XUR.cjs +184 -0
  96. package/dist/chunk-G2F67XUR.cjs.map +1 -0
  97. package/dist/chunk-G6GO6BXD.js +994 -0
  98. package/dist/chunk-G6GO6BXD.js.map +1 -0
  99. package/dist/chunk-GIW4L6HY.cjs +27 -0
  100. package/dist/chunk-GIW4L6HY.cjs.map +1 -0
  101. package/dist/chunk-GJAGKFTR.js +74 -0
  102. package/dist/chunk-GJAGKFTR.js.map +1 -0
  103. package/dist/chunk-HFPGOTVF.cjs +324 -0
  104. package/dist/chunk-HFPGOTVF.cjs.map +1 -0
  105. package/dist/chunk-HRA3CPGG.js +486 -0
  106. package/dist/chunk-HRA3CPGG.js.map +1 -0
  107. package/dist/chunk-HZQEDNF6.js +66 -0
  108. package/dist/chunk-HZQEDNF6.js.map +1 -0
  109. package/dist/chunk-IT3PWBW4.cjs +19 -0
  110. package/dist/chunk-IT3PWBW4.cjs.map +1 -0
  111. package/dist/chunk-JD74LN7R.cjs +171 -0
  112. package/dist/chunk-JD74LN7R.cjs.map +1 -0
  113. package/dist/chunk-JTFYYKDT.js +135 -0
  114. package/dist/chunk-JTFYYKDT.js.map +1 -0
  115. package/dist/chunk-K2BQQ445.js +30 -0
  116. package/dist/chunk-K2BQQ445.js.map +1 -0
  117. package/dist/chunk-KAP4GJHO.js +546 -0
  118. package/dist/chunk-KAP4GJHO.js.map +1 -0
  119. package/dist/chunk-KDNBTPY2.js +458 -0
  120. package/dist/chunk-KDNBTPY2.js.map +1 -0
  121. package/dist/chunk-KIO7QFIV.cjs +223 -0
  122. package/dist/chunk-KIO7QFIV.cjs.map +1 -0
  123. package/dist/chunk-KSKU6JY6.cjs +71 -0
  124. package/dist/chunk-KSKU6JY6.cjs.map +1 -0
  125. package/dist/chunk-LSLPF6OI.cjs +192 -0
  126. package/dist/chunk-LSLPF6OI.cjs.map +1 -0
  127. package/dist/chunk-LU7VALW5.js +312 -0
  128. package/dist/chunk-LU7VALW5.js.map +1 -0
  129. package/dist/chunk-LUSXDZPV.cjs +296 -0
  130. package/dist/chunk-LUSXDZPV.cjs.map +1 -0
  131. package/dist/chunk-M72RJVPC.js +69 -0
  132. package/dist/chunk-M72RJVPC.js.map +1 -0
  133. package/dist/chunk-MQLCZ4HJ.cjs +1010 -0
  134. package/dist/chunk-MQLCZ4HJ.cjs.map +1 -0
  135. package/dist/chunk-MUUQ2WFJ.cjs +4 -0
  136. package/dist/chunk-MUUQ2WFJ.cjs.map +1 -0
  137. package/dist/chunk-MZ5ZRORA.cjs +496 -0
  138. package/dist/chunk-MZ5ZRORA.cjs.map +1 -0
  139. package/dist/chunk-N24XBYNX.cjs +140 -0
  140. package/dist/chunk-N24XBYNX.cjs.map +1 -0
  141. package/dist/chunk-NINIJCHU.cjs +23 -0
  142. package/dist/chunk-NINIJCHU.cjs.map +1 -0
  143. package/dist/chunk-NRSH7RJY.js +2841 -0
  144. package/dist/chunk-NRSH7RJY.js.map +1 -0
  145. package/dist/chunk-OIYQBUW4.cjs +111 -0
  146. package/dist/chunk-OIYQBUW4.cjs.map +1 -0
  147. package/dist/chunk-PNVDQL5Y.cjs +15 -0
  148. package/dist/chunk-PNVDQL5Y.cjs.map +1 -0
  149. package/dist/chunk-POQT2OIF.js +214 -0
  150. package/dist/chunk-POQT2OIF.js.map +1 -0
  151. package/dist/chunk-PSJN532Q.js +10573 -0
  152. package/dist/chunk-PSJN532Q.js.map +1 -0
  153. package/dist/chunk-QUTUJ6P6.cjs +76 -0
  154. package/dist/chunk-QUTUJ6P6.cjs.map +1 -0
  155. package/dist/chunk-R43CNCES.cjs +460 -0
  156. package/dist/chunk-R43CNCES.cjs.map +1 -0
  157. package/dist/chunk-S2BBRVQX.js +68 -0
  158. package/dist/chunk-S2BBRVQX.js.map +1 -0
  159. package/dist/chunk-S5RCBTSF.js +145 -0
  160. package/dist/chunk-S5RCBTSF.js.map +1 -0
  161. package/dist/chunk-S7OEXQMI.cjs +136 -0
  162. package/dist/chunk-S7OEXQMI.cjs.map +1 -0
  163. package/dist/chunk-SKWVAQAY.js +129 -0
  164. package/dist/chunk-SKWVAQAY.js.map +1 -0
  165. package/dist/chunk-SQLZ7ONU.js +152 -0
  166. package/dist/chunk-SQLZ7ONU.js.map +1 -0
  167. package/dist/chunk-TIZ4TS5V.cjs +72 -0
  168. package/dist/chunk-TIZ4TS5V.cjs.map +1 -0
  169. package/dist/chunk-TQKCU7CL.js +142 -0
  170. package/dist/chunk-TQKCU7CL.js.map +1 -0
  171. package/dist/chunk-U54XCYG3.js +116 -0
  172. package/dist/chunk-U54XCYG3.js.map +1 -0
  173. package/dist/chunk-U6QGZHPN.js +29 -0
  174. package/dist/chunk-U6QGZHPN.js.map +1 -0
  175. package/dist/chunk-UCFONJBG.js +79 -0
  176. package/dist/chunk-UCFONJBG.js.map +1 -0
  177. package/dist/chunk-UJ7IQJAG.js +141 -0
  178. package/dist/chunk-UJ7IQJAG.js.map +1 -0
  179. package/dist/chunk-UVNG67DG.js +253 -0
  180. package/dist/chunk-UVNG67DG.js.map +1 -0
  181. package/dist/chunk-V4XRLPEF.js +25 -0
  182. package/dist/chunk-V4XRLPEF.js.map +1 -0
  183. package/dist/chunk-VJ26EKGJ.cjs +28 -0
  184. package/dist/chunk-VJ26EKGJ.cjs.map +1 -0
  185. package/dist/chunk-VK7MAV65.cjs +90 -0
  186. package/dist/chunk-VK7MAV65.cjs.map +1 -0
  187. package/dist/chunk-VYCKUKPA.cjs +106 -0
  188. package/dist/chunk-VYCKUKPA.cjs.map +1 -0
  189. package/dist/chunk-VYHJZVL5.cjs +29 -0
  190. package/dist/chunk-VYHJZVL5.cjs.map +1 -0
  191. package/dist/chunk-WA3FO4R7.js +155 -0
  192. package/dist/chunk-WA3FO4R7.js.map +1 -0
  193. package/dist/chunk-WJVHMTKB.cjs +12 -0
  194. package/dist/chunk-WJVHMTKB.cjs.map +1 -0
  195. package/dist/chunk-WLKFWQSJ.js +333 -0
  196. package/dist/chunk-WLKFWQSJ.js.map +1 -0
  197. package/dist/chunk-WPZTYOUX.cjs +59 -0
  198. package/dist/chunk-WPZTYOUX.cjs.map +1 -0
  199. package/dist/chunk-X2FR4OIT.js +27 -0
  200. package/dist/chunk-X2FR4OIT.js.map +1 -0
  201. package/dist/chunk-XIG2IE3L.js +134 -0
  202. package/dist/chunk-XIG2IE3L.js.map +1 -0
  203. package/dist/chunk-YLQQX5W2.cjs +20 -0
  204. package/dist/chunk-YLQQX5W2.cjs.map +1 -0
  205. package/dist/chunk-YPEPCZHF.cjs +147 -0
  206. package/dist/chunk-YPEPCZHF.cjs.map +1 -0
  207. package/dist/chunk-YPQF26X7.cjs +8 -0
  208. package/dist/chunk-YPQF26X7.cjs.map +1 -0
  209. package/dist/chunk-YU6KON2I.cjs +160 -0
  210. package/dist/chunk-YU6KON2I.cjs.map +1 -0
  211. package/dist/chunk-Z2OC3UIW.cjs +388 -0
  212. package/dist/chunk-Z2OC3UIW.cjs.map +1 -0
  213. package/dist/chunk-ZUBIEQJF.cjs +10590 -0
  214. package/dist/chunk-ZUBIEQJF.cjs.map +1 -0
  215. package/dist/chunk-ZZWTY3RX.js +230 -0
  216. package/dist/chunk-ZZWTY3RX.js.map +1 -0
  217. package/dist/compact-session-OO2GD76G.js +17 -0
  218. package/dist/compact-session-OO2GD76G.js.map +1 -0
  219. package/dist/compact-session-OO7NVWPB.cjs +54 -0
  220. package/dist/compact-session-OO7NVWPB.cjs.map +1 -0
  221. package/dist/compaction.cjs +54 -303
  222. package/dist/compaction.cjs.map +1 -1
  223. package/dist/compaction.js +3 -292
  224. package/dist/compaction.js.map +1 -1
  225. package/dist/concurrency.cjs +9 -81
  226. package/dist/concurrency.cjs.map +1 -1
  227. package/dist/concurrency.js +5 -80
  228. package/dist/concurrency.js.map +1 -1
  229. package/dist/context-GWANQLX4.js +5 -0
  230. package/dist/context-GWANQLX4.js.map +1 -0
  231. package/dist/context-KNWVTZSY.cjs +22 -0
  232. package/dist/context-KNWVTZSY.cjs.map +1 -0
  233. package/dist/{cron-x3muPNgg.d.cts → cron-D0JKR-yX.d.cts} +2 -1
  234. package/dist/{cron-B_NkE_VM.d.ts → cron-DivRaEmN.d.ts} +2 -1
  235. package/dist/cron.cjs +44 -20676
  236. package/dist/cron.cjs.map +1 -1
  237. package/dist/cron.d.cts +1 -1
  238. package/dist/cron.d.ts +1 -1
  239. package/dist/cron.js +38 -20676
  240. package/dist/cron.js.map +1 -1
  241. package/dist/errors.cjs +78 -470
  242. package/dist/errors.cjs.map +1 -1
  243. package/dist/errors.d.ts +3 -424
  244. package/dist/errors.js +2 -455
  245. package/dist/errors.js.map +1 -1
  246. package/dist/eval.cjs +72 -20411
  247. package/dist/eval.cjs.map +1 -1
  248. package/dist/eval.js +59 -20402
  249. package/dist/eval.js.map +1 -1
  250. package/dist/executor-ORJS5GV2.js +981 -0
  251. package/dist/executor-ORJS5GV2.js.map +1 -0
  252. package/dist/executor-Y4MKPIUD.cjs +985 -0
  253. package/dist/executor-Y4MKPIUD.cjs.map +1 -0
  254. package/dist/filesystem/index.cjs +7 -112
  255. package/dist/filesystem/index.cjs.map +1 -1
  256. package/dist/filesystem/index.js +4 -109
  257. package/dist/filesystem/index.js.map +1 -1
  258. package/dist/fork-agent-RSV4E3EA.js +61 -0
  259. package/dist/fork-agent-RSV4E3EA.js.map +1 -0
  260. package/dist/fork-agent-Y2IK2RYU.cjs +64 -0
  261. package/dist/fork-agent-Y2IK2RYU.cjs.map +1 -0
  262. package/dist/fs-session-store-KAUQYSGI.cjs +17 -0
  263. package/dist/fs-session-store-KAUQYSGI.cjs.map +1 -0
  264. package/dist/fs-session-store-ZKB5NN37.js +8 -0
  265. package/dist/fs-session-store-ZKB5NN37.js.map +1 -0
  266. package/dist/generate-object-H3RNAM6S.cjs +20 -0
  267. package/dist/generate-object-H3RNAM6S.cjs.map +1 -0
  268. package/dist/generate-object-YJPDV5BS.js +7 -0
  269. package/dist/generate-object-YJPDV5BS.js.map +1 -0
  270. package/dist/index-manager-CB6I7XFQ.cjs +19 -0
  271. package/dist/index-manager-CB6I7XFQ.cjs.map +1 -0
  272. package/dist/index-manager-L27Q3QAC.js +10 -0
  273. package/dist/index-manager-L27Q3QAC.js.map +1 -0
  274. package/dist/index.cjs +371 -22888
  275. package/dist/index.cjs.map +1 -1
  276. package/dist/index.d.cts +16 -21
  277. package/dist/index.d.ts +16 -21
  278. package/dist/index.js +92 -22713
  279. package/dist/index.js.map +1 -1
  280. package/dist/inject-session-6MJUSGZP.cjs +27 -0
  281. package/dist/inject-session-6MJUSGZP.cjs.map +1 -0
  282. package/dist/inject-session-KOFHS5K3.js +25 -0
  283. package/dist/inject-session-KOFHS5K3.js.map +1 -0
  284. package/dist/internal/judge/judge-call.d.ts +32 -19
  285. package/dist/internal/persistence/index.cjs +93 -508
  286. package/dist/internal/persistence/index.cjs.map +1 -1
  287. package/dist/internal/persistence/index.js +11 -489
  288. package/dist/internal/persistence/index.js.map +1 -1
  289. package/dist/internal/security/index.cjs +44 -361
  290. package/dist/internal/security/index.cjs.map +1 -1
  291. package/dist/internal/security/index.js +4 -355
  292. package/dist/internal/security/index.js.map +1 -1
  293. package/dist/judge-call-CEQ3FYYD.js +126 -0
  294. package/dist/judge-call-CEQ3FYYD.js.map +1 -0
  295. package/dist/judge-call-QG4WZ7F3.cjs +130 -0
  296. package/dist/judge-call-QG4WZ7F3.cjs.map +1 -0
  297. package/dist/models.cjs +24 -919
  298. package/dist/models.cjs.map +1 -1
  299. package/dist/models.js +11 -907
  300. package/dist/models.js.map +1 -1
  301. package/dist/oauth-transaction-store-7CKHPQRN.cjs +32 -0
  302. package/dist/oauth-transaction-store-7CKHPQRN.cjs.map +1 -0
  303. package/dist/oauth-transaction-store-W74I6EFD.js +3 -0
  304. package/dist/oauth-transaction-store-W74I6EFD.js.map +1 -0
  305. package/dist/path-safety.cjs +31 -200
  306. package/dist/path-safety.cjs.map +1 -1
  307. package/dist/path-safety.js +3 -197
  308. package/dist/path-safety.js.map +1 -1
  309. package/dist/persistence.cjs +73 -393
  310. package/dist/persistence.cjs.map +1 -1
  311. package/dist/persistence.js +9 -381
  312. package/dist/persistence.js.map +1 -1
  313. package/dist/project.cjs +8 -112
  314. package/dist/project.cjs.map +1 -1
  315. package/dist/project.js +6 -110
  316. package/dist/project.js.map +1 -1
  317. package/dist/registry-34IWWDQQ.js +9 -0
  318. package/dist/registry-34IWWDQQ.js.map +1 -0
  319. package/dist/registry-APYDISL6.cjs +46 -0
  320. package/dist/registry-APYDISL6.cjs.map +1 -0
  321. package/dist/retry.cjs +7 -87
  322. package/dist/retry.cjs.map +1 -1
  323. package/dist/retry.js +3 -90
  324. package/dist/retry.js.map +1 -1
  325. package/dist/run-to-completion-J73I6IY4.cjs +48 -0
  326. package/dist/run-to-completion-J73I6IY4.cjs.map +1 -0
  327. package/dist/run-to-completion-JDPIUKSH.js +3 -0
  328. package/dist/run-to-completion-JDPIUKSH.js.map +1 -0
  329. package/dist/run-until-PNO3QQLI.cjs +180 -0
  330. package/dist/run-until-PNO3QQLI.cjs.map +1 -0
  331. package/dist/run-until-XLHEHRQM.js +177 -0
  332. package/dist/run-until-XLHEHRQM.js.map +1 -0
  333. package/dist/sandbox/index.cjs +35 -337
  334. package/dist/sandbox/index.cjs.map +1 -1
  335. package/dist/sandbox/index.js +7 -323
  336. package/dist/sandbox/index.js.map +1 -1
  337. package/dist/sanitize/index.cjs +5 -112
  338. package/dist/sanitize/index.cjs.map +1 -1
  339. package/dist/sanitize/index.js +1 -114
  340. package/dist/sanitize/index.js.map +1 -1
  341. package/dist/server/auth/index.cjs +35 -175
  342. package/dist/server/auth/index.cjs.map +1 -1
  343. package/dist/server/auth/index.js +7 -161
  344. package/dist/server/auth/index.js.map +1 -1
  345. package/dist/server/errors-envelope.cjs +17 -328
  346. package/dist/server/errors-envelope.cjs.map +1 -1
  347. package/dist/server/errors-envelope.js +4 -317
  348. package/dist/server/errors-envelope.js.map +1 -1
  349. package/dist/session-transcript-LPNZR3YS.cjs +46 -0
  350. package/dist/session-transcript-LPNZR3YS.cjs.map +1 -0
  351. package/dist/session-transcript-T7LGJUGW.js +5 -0
  352. package/dist/session-transcript-T7LGJUGW.js.map +1 -0
  353. package/dist/skills.cjs +12 -280
  354. package/dist/skills.cjs.map +1 -1
  355. package/dist/skills.js +4 -282
  356. package/dist/skills.js.map +1 -1
  357. package/dist/stream-object-QEQJJDTI.cjs +20 -0
  358. package/dist/stream-object-QEQJJDTI.cjs.map +1 -0
  359. package/dist/stream-object-WUQSSRY2.js +7 -0
  360. package/dist/stream-object-WUQSSRY2.js.map +1 -0
  361. package/dist/stream-to-completion-DFJ5T3BK.js +30 -0
  362. package/dist/stream-to-completion-DFJ5T3BK.js.map +1 -0
  363. package/dist/stream-to-completion-H2MHISSK.cjs +32 -0
  364. package/dist/stream-to-completion-H2MHISSK.cjs.map +1 -0
  365. package/dist/subagents.cjs +2 -8
  366. package/dist/subagents.cjs.map +1 -1
  367. package/dist/subagents.js +1 -7
  368. package/dist/subagents.js.map +1 -1
  369. package/dist/subscription/index.cjs +4 -17
  370. package/dist/subscription/index.cjs.map +1 -1
  371. package/dist/subscription/index.js +3 -16
  372. package/dist/subscription/index.js.map +1 -1
  373. package/dist/task-store.cjs +16 -258
  374. package/dist/task-store.cjs.map +1 -1
  375. package/dist/task-store.js +4 -259
  376. package/dist/task-store.js.map +1 -1
  377. package/dist/types/goal-events.d.ts +2 -1
  378. package/dist/workflow.cjs +71 -2797
  379. package/dist/workflow.cjs.map +1 -1
  380. package/dist/workflow.js +8 -2812
  381. package/dist/workflow.js.map +1 -1
  382. package/package.json +1 -1
package/dist/workflow.js CHANGED
@@ -1,2814 +1,10 @@
1
- import { randomUUID, randomBytes } from 'crypto';
2
- import { readFile, unlink, mkdir, open, rename, statfs, readdir } from 'fs/promises';
3
- import { join, dirname } from 'path';
4
- import { createRequire } from 'module';
5
- import { mkdirSync, readdirSync } from 'fs';
6
- import { AsyncLocalStorage } from 'async_hooks';
7
- import { z, toJSONSchema } from 'zod';
8
-
9
- var __defProp = Object.defineProperty;
10
- var __getOwnPropNames = Object.getOwnPropertyNames;
11
- var __esm = (fn2, res) => function __init() {
12
- return fn2 && (res = (0, fn2[__getOwnPropNames(fn2)[0]])(fn2 = 0)), res;
13
- };
14
- var __export = (target, all) => {
15
- for (var name in all)
16
- __defProp(target, name, { get: all[name], enumerable: true });
17
- };
18
-
19
- // src/internal/security/redact.ts
20
- function readEnvOnce() {
21
- const raw = process.env.THEOKIT_REDACT_SECRETS;
22
- if (raw === void 0) return true;
23
- return ["1", "true", "yes", "on"].includes(raw.toLowerCase());
24
- }
25
- function maskToken(token) {
26
- if (token.length < 18) return "***";
27
- return `${token.slice(0, 6)}...${token.slice(-4)}`;
28
- }
29
- function coerceToString(value) {
30
- if (typeof value === "string") return value;
31
- if (value === null || value === void 0) return null;
32
- if (typeof value === "object") {
33
- try {
34
- const s = JSON.stringify(value);
35
- return s === void 0 ? null : s;
36
- } catch {
37
- return "[unredactable: circular]";
38
- }
39
- }
40
- return String(value);
41
- }
42
- function redactSecrets(text, opts) {
43
- const coerced = coerceToString(text);
44
- if (coerced === null) return "";
45
- if (!REDACT_ENABLED) return coerced;
46
- let s = coerced;
47
- for (const re of BUILTIN_PATTERNS) {
48
- s = s.replace(re, (m) => maskToken(m));
49
- }
50
- for (const re of _extraPatterns) {
51
- s = s.replace(re, (m) => maskToken(m));
52
- }
53
- {
54
- s = s.replace(BEARER_PATTERN, (_, prefix) => `${prefix}***`);
55
- s = s.replace(PARAM_PATTERN, (whole, prefix, value) => {
56
- if (MASK_SHAPE.test(value)) return whole;
57
- return `${prefix}***`;
58
- });
59
- }
60
- return s;
61
- }
62
- var REDACT_ENABLED, warnedOptOut, BUILTIN_PATTERNS, BEARER_PATTERN, PARAM_PATTERN, _extraPatterns, MASK_SHAPE;
63
- var init_redact = __esm({
64
- "src/internal/security/redact.ts"() {
65
- REDACT_ENABLED = readEnvOnce();
66
- warnedOptOut = false;
67
- if (!REDACT_ENABLED && !warnedOptOut) {
68
- process.stderr.write(
69
- "[theokit-sdk] Secret redaction is DISABLED via THEOKIT_REDACT_SECRETS. Credentials may leak into errors, telemetry, logs, transcripts.\n"
70
- );
71
- warnedOptOut = true;
72
- }
73
- BUILTIN_PATTERNS = [
74
- // T5.4: 30+ vendor prefixes (was 12 pre-T5.4). Order matters — more
75
- // specific prefixes precede generic ones (e.g., sk-ant-admin01 before
76
- // sk-ant-, sk-proj- before sk-). PEM block deliberately first so its
77
- // multi-line span runs before any per-line patterns can fire.
78
- /-----BEGIN[ ]+(?:RSA |EC |DSA |OPENSSH |ENCRYPTED |)PRIVATE KEY-----[\s\S]+?-----END[ ]+(?:RSA |EC |DSA |OPENSSH |ENCRYPTED |)PRIVATE KEY-----/g,
79
- // JWT — exact 3-segment base64url. Dotted; the body floor of 4 chars per
80
- // segment matches the minimum legal payload while skipping `a.b.c` noise.
81
- /eyJ[A-Za-z0-9_-]{4,}\.eyJ[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{4,}/g,
82
- // Azure Storage SAS — match the sig= component (URL-encoded base64).
83
- /(?<=[?&]sig=)[A-Za-z0-9%+/]{20,}/g,
84
- // Anthropic
85
- /sk-ant-admin01-[A-Za-z0-9_-]{10,}/g,
86
- // Anthropic admin keys (must precede sk-ant-)
87
- /sk-ant-[A-Za-z0-9_-]{10,}/g,
88
- // Anthropic regular
89
- // OpenAI family + clones (sk- generic must come AFTER all sk-foo- variants)
90
- /sk-proj-[A-Za-z0-9_-]{10,}/g,
91
- // OpenAI project key (must precede sk- generic)
92
- /sk-[A-Za-z0-9_-]{10,}/g,
93
- // OpenAI / OpenRouter / DeepInfra / Together / DeepSeek
94
- // Provider prefixes (alphabetized for maintainability)
95
- /AIza[A-Za-z0-9_-]{35}/g,
96
- // Google API key
97
- /AKIA[A-Z0-9]{16}/g,
98
- // AWS access key
99
- /fw_[A-Za-z0-9]{20,}/g,
100
- // Fireworks
101
- /glpat-[A-Za-z0-9_-]{20}/g,
102
- // GitLab PAT
103
- /ghp_[A-Za-z0-9]{36}/g,
104
- // GitHub PAT classic
105
- /github_pat_[A-Za-z0-9_]{82}/g,
106
- // GitHub PAT fine-grained
107
- /gsk_[A-Za-z0-9]{20,}/g,
108
- // Groq
109
- /hf_[A-Za-z0-9]{20,}/g,
110
- // HuggingFace
111
- /\bpa-[A-Za-z0-9_-]{20,}/g,
112
- // Voyage AI (word-boundary to skip CSS / kebab IDs)
113
- /pcsk_[A-Za-z0-9_-]{20,}/g,
114
- // Pinecone
115
- /pplx-[A-Za-z0-9_-]{20,}/g,
116
- // Perplexity
117
- /r8_[A-Za-z0-9_-]{20,}/g,
118
- // Replicate
119
- /rk_live_[A-Za-z0-9]{20,}/g,
120
- // Stripe restricted
121
- /sk_live_[A-Za-z0-9]{20,}/g,
122
- // Stripe secret
123
- /sntrys_[A-Za-z0-9]{40,}/g,
124
- // Sentry user auth
125
- /xai-[A-Za-z0-9_-]{20,}/g,
126
- // xAI (Grok)
127
- /xox[bpasr]-[A-Za-z0-9-]{10,}/g,
128
- //Slack tokens
129
- // Additional unique-prefix tokens with low false-positive risk
130
- /npm_[A-Za-z0-9]{36}/g,
131
- // npm access token
132
- /SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}/g,
133
- // SendGrid
134
- /\bSK[A-Za-z0-9]{32}\b/g,
135
- // Twilio API SID (word-boundary to skip CSS class noise)
136
- /\bkey-[a-f0-9]{32}\b/g,
137
- // Mailgun (hex-only narrows false positives)
138
- /MT[A-Za-z0-9_-]{23}\.[A-Za-z0-9_-]{6}\.[A-Za-z0-9_-]{27}/g,
139
- // Discord bot
140
- /\b(?:sdk|mob)-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\b/g
141
- // LaunchDarkly
142
- ];
143
- BEARER_PATTERN = /\b(Bearer\s+)([A-Za-z0-9_\-.+/=]{8,})/g;
144
- PARAM_PATTERN = /(\b(?:access_token|api_key|api-key|client_secret|credential|credentials|id_token|jwt|password|private_key|refresh_token|secret|service_account|session_token|token|x-api-key)\b["']?\s*[:=]\s*["']?)([A-Za-z0-9_\-.+/]+)/gi;
145
- _extraPatterns = [];
146
- MASK_SHAPE = /^.{6}\.\.\..{4}$/s;
147
- }
148
- });
149
-
150
- // src/errors.ts
151
- var TheokitAgentError, ConfigurationError, UnsupportedRunOperationError, InvalidTaskIdError, TaskNotFoundError;
152
- var init_errors = __esm({
153
- "src/errors.ts"() {
154
- TheokitAgentError = class extends Error {
155
- name = "TheokitAgentError";
156
- isRetryable;
157
- code;
158
- protoErrorCode;
159
- metadata;
160
- constructor(message, options = {}) {
161
- super(message, options.cause !== void 0 ? { cause: options.cause } : void 0);
162
- this.isRetryable = options.isRetryable ?? false;
163
- if (options.code !== void 0) this.code = options.code;
164
- if (options.protoErrorCode !== void 0) this.protoErrorCode = options.protoErrorCode;
165
- if (options.metadata !== void 0) this.metadata = options.metadata;
166
- }
167
- };
168
- ConfigurationError = class extends TheokitAgentError {
169
- name = "ConfigurationError";
170
- constructor(message, options = {}) {
171
- super(message, { ...options, isRetryable: false });
172
- }
173
- };
174
- UnsupportedRunOperationError = class extends TheokitAgentError {
175
- name = "UnsupportedRunOperationError";
176
- operation;
177
- constructor(message, operation, options = {}) {
178
- super(message, {
179
- ...options,
180
- isRetryable: false,
181
- code: options.code ?? "unsupported_run_operation"
182
- });
183
- this.operation = operation;
184
- }
185
- };
186
- InvalidTaskIdError = class extends TheokitAgentError {
187
- name = "InvalidTaskIdError";
188
- taskId;
189
- constructor(message, taskId, options = {}) {
190
- super(message, {
191
- ...options,
192
- isRetryable: false,
193
- code: "invalid_task_id"
194
- });
195
- this.taskId = taskId;
196
- }
197
- };
198
- TaskNotFoundError = class extends TheokitAgentError {
199
- name = "TaskNotFoundError";
200
- taskId;
201
- constructor(taskId, options = {}) {
202
- super(`Task not found: ${taskId}`, {
203
- ...options,
204
- isRetryable: false,
205
- code: "task_not_found"
206
- });
207
- this.taskId = taskId;
208
- }
209
- };
210
- }
211
- });
212
-
213
- // src/types/workflow.ts
214
- var WorkflowDuplicateStepIdError, WorkflowInputError, WorkflowOutputError, WorkflowStateError, WorkflowNestedError, WorkflowAlreadyRunningError, WorkflowSnapshotNotFoundError, WorkflowMaxIterationsExceededError, WorkflowNotSerializableError, WorkflowResumeStepNotFoundError, WorkflowParallelError, WorkflowCompensateNotImplementedError;
215
- var init_workflow = __esm({
216
- "src/types/workflow.ts"() {
217
- WorkflowDuplicateStepIdError = class extends Error {
218
- constructor(stepId) {
219
- super(`Duplicate step id "${stepId}" in workflow.`);
220
- this.stepId = stepId;
221
- }
222
- stepId;
223
- name = "WorkflowDuplicateStepIdError";
224
- };
225
- WorkflowInputError = class extends Error {
226
- constructor(workflowName, detail) {
227
- super(`Workflow "${workflowName}" input failed schema validation: ${detail}`);
228
- this.workflowName = workflowName;
229
- this.detail = detail;
230
- }
231
- workflowName;
232
- detail;
233
- name = "WorkflowInputError";
234
- };
235
- WorkflowOutputError = class extends Error {
236
- constructor(workflowName, detail) {
237
- super(`Workflow "${workflowName}" output failed schema validation: ${detail}`);
238
- this.workflowName = workflowName;
239
- this.detail = detail;
240
- }
241
- workflowName;
242
- detail;
243
- name = "WorkflowOutputError";
244
- };
245
- WorkflowStateError = class extends Error {
246
- constructor(workflowName, detail) {
247
- super(`Workflow "${workflowName}" state failed schema validation: ${detail}`);
248
- this.workflowName = workflowName;
249
- this.detail = detail;
250
- }
251
- workflowName;
252
- detail;
253
- name = "WorkflowStateError";
254
- };
255
- WorkflowNestedError = class extends Error {
256
- constructor(stepId, childName, childStatus, childError) {
257
- super(
258
- `Nested workflow "${childName}" (step "${stepId}") ended with status "${childStatus}"${childStatus === "suspended" ? " \u2014 nested suspend/resume is not supported in v1 (use a top-level suspend)" : ""}${childError ? `: ${childError.name}: ${childError.message}` : ""}`,
259
- // Reconstruct a synthetic Error from the serialized child-error shape so
260
- // debuggers surface the nested cause chain — the original Error instance is
261
- // lost at the WorkflowRun serialization boundary, so this is the best
262
- // achievable without changing the run protocol.
263
- childError ? { cause: Object.assign(new Error(childError.message), { name: childError.name }) } : void 0
264
- );
265
- this.stepId = stepId;
266
- this.childName = childName;
267
- this.childStatus = childStatus;
268
- this.childError = childError;
269
- }
270
- stepId;
271
- childName;
272
- childStatus;
273
- childError;
274
- name = "WorkflowNestedError";
275
- };
276
- WorkflowAlreadyRunningError = class extends Error {
277
- constructor(workflowName, runId) {
278
- super(`Workflow "${workflowName}" run "${runId}" already in-flight.`);
279
- this.workflowName = workflowName;
280
- this.runId = runId;
281
- }
282
- workflowName;
283
- runId;
284
- name = "WorkflowAlreadyRunningError";
285
- };
286
- WorkflowSnapshotNotFoundError = class extends Error {
287
- constructor(runId) {
288
- super(`No snapshot found for runId "${runId}". Configure persistence to enable resume.`);
289
- this.runId = runId;
290
- }
291
- runId;
292
- name = "WorkflowSnapshotNotFoundError";
293
- };
294
- WorkflowMaxIterationsExceededError = class extends Error {
295
- constructor(stepId, maxIterations) {
296
- super(`Step "${stepId}" exceeded max iterations (${maxIterations}).`);
297
- this.stepId = stepId;
298
- this.maxIterations = maxIterations;
299
- }
300
- stepId;
301
- maxIterations;
302
- name = "WorkflowMaxIterationsExceededError";
303
- };
304
- WorkflowNotSerializableError = class extends Error {
305
- constructor(stepId, underlying) {
306
- super(
307
- `Workflow snapshot at step "${stepId}" failed to serialize as JSON: ${underlying.message}. Persisted snapshots support only JSON-serializable values (no BigInt, no circular refs, no class instances with cycles).`
308
- );
309
- this.stepId = stepId;
310
- this.underlying = underlying;
311
- }
312
- stepId;
313
- underlying;
314
- name = "WorkflowNotSerializableError";
315
- };
316
- WorkflowResumeStepNotFoundError = class extends Error {
317
- constructor(stepId, workflowName) {
318
- super(
319
- `Cannot resume: step "${stepId}" not found in workflow "${workflowName}". The Workflow definition diverged from the snapshot.`
320
- );
321
- this.stepId = stepId;
322
- this.workflowName = workflowName;
323
- }
324
- stepId;
325
- workflowName;
326
- name = "WorkflowResumeStepNotFoundError";
327
- };
328
- WorkflowParallelError = class extends AggregateError {
329
- constructor(errors, stepId) {
330
- super(errors, `${errors.length} branch(es) failed in parallel step "${stepId}".`);
331
- this.stepId = stepId;
332
- }
333
- stepId;
334
- name = "WorkflowParallelError";
335
- };
336
- WorkflowCompensateNotImplementedError = class extends Error {
337
- constructor(stepId) {
338
- super(
339
- `Step "${stepId}" defines compensate, but saga engine is deferred to v1.2. Remove compensate or implement rollback manually.`
340
- );
341
- this.stepId = stepId;
342
- }
343
- stepId;
344
- name = "WorkflowCompensateNotImplementedError";
345
- };
346
- }
347
- });
348
- function detectNetworkFsName(typeMagic) {
349
- return NETWORK_FS_MAGIC.get(typeMagic) ?? null;
350
- }
351
- async function warnOnNetworkFsOnce(dirPath, label) {
352
- const key2 = `${dirPath}\0${label}`;
353
- if (warnedNfsDirs.has(key2)) return;
354
- warnedNfsDirs.add(key2);
355
- try {
356
- const info = await statfs(dirPath);
357
- const fsName = detectNetworkFsName(info.type);
358
- if (fsName === null) return;
359
- process.stderr.write(
360
- `[theokit-sdk] ${label}: detected network fs (${fsName}) at ${dirPath} \u2014 rename() atomicity guarantees may be weaker than expected.
361
- `
362
- );
363
- } catch {
364
- }
365
- }
366
- async function replaceFileAtomic(filePath, content) {
367
- await warnOnNetworkFsOnce(dirname(filePath), "atomic-write");
368
- const suffix = randomBytes(8).toString("hex");
369
- const tmp = `${filePath}.${process.pid}.${suffix}.tmp`;
370
- const handle = await open(tmp, "w", 384);
371
- try {
372
- await handle.writeFile(content, "utf8");
373
- await handle.sync();
374
- } finally {
375
- await handle.close();
376
- }
377
- try {
378
- await rename(tmp, filePath);
379
- } catch (cause) {
380
- await unlink(tmp).catch(() => void 0);
381
- throw cause;
382
- }
383
- }
384
- async function atomicWriteText(filePath, content) {
385
- await mkdir(dirname(filePath), { recursive: true });
386
- await replaceFileAtomic(filePath, content);
387
- }
388
- var NETWORK_FS_MAGIC, warnedNfsDirs;
389
- var init_atomic_write = __esm({
390
- "src/internal/persistence/atomic-write.ts"() {
391
- NETWORK_FS_MAGIC = /* @__PURE__ */ new Map([
392
- [26985, "nfs"],
393
- [20859, "smb"],
394
- [4283649346, "cifs"],
395
- [1702057286, "fuse"]
396
- ]);
397
- warnedNfsDirs = /* @__PURE__ */ new Set();
398
- }
399
- });
400
- function getSnapshotStoreFor(options) {
401
- if (options.persistence?.backend === "json") {
402
- const dir = options.persistence.dir;
403
- let store = jsonStores.get(dir);
404
- if (store === void 0) {
405
- store = new JsonFileWorkflowSnapshotStore(dir);
406
- jsonStores.set(dir, store);
407
- }
408
- return store;
409
- }
410
- return memoryStore;
411
- }
412
- function __resetSnapshotStoresForTests() {
413
- jsonStores.clear();
414
- memoryStore.map.clear();
415
- }
416
- var InMemoryWorkflowSnapshotStore, JsonFileWorkflowSnapshotStore, memoryStore, jsonStores;
417
- var init_snapshot_store = __esm({
418
- "src/internal/workflow/snapshot-store.ts"() {
419
- init_workflow();
420
- init_atomic_write();
421
- InMemoryWorkflowSnapshotStore = class {
422
- map = /* @__PURE__ */ new Map();
423
- async save(snapshot) {
424
- try {
425
- JSON.stringify(snapshot);
426
- } catch (err) {
427
- throw new WorkflowNotSerializableError(
428
- snapshot.currentStepId,
429
- err instanceof Error ? err : new Error(String(err))
430
- );
431
- }
432
- this.map.set(snapshot.runId, snapshot);
433
- }
434
- async load(runId) {
435
- return this.map.get(runId);
436
- }
437
- async delete(runId) {
438
- this.map.delete(runId);
439
- }
440
- async list(workflowName) {
441
- return [...this.map.values()].filter((s) => workflowName === void 0 || s.workflowName === workflowName).map((s) => ({
442
- runId: s.runId,
443
- workflowName: s.workflowName,
444
- suspendedAt: s.suspendedAt
445
- }));
446
- }
447
- };
448
- JsonFileWorkflowSnapshotStore = class {
449
- constructor(dir) {
450
- this.dir = dir;
451
- }
452
- dir;
453
- filePath(runId) {
454
- return join(this.dir, `${runId}.json`);
455
- }
456
- async save(snapshot) {
457
- let serialized;
458
- try {
459
- serialized = JSON.stringify(snapshot);
460
- } catch (err) {
461
- throw new WorkflowNotSerializableError(
462
- snapshot.currentStepId,
463
- err instanceof Error ? err : new Error(String(err))
464
- );
465
- }
466
- await mkdir(this.dir, { recursive: true });
467
- await atomicWriteText(this.filePath(snapshot.runId), serialized);
468
- }
469
- async load(runId) {
470
- try {
471
- const raw = await readFile(this.filePath(runId), "utf8");
472
- return JSON.parse(raw);
473
- } catch (err) {
474
- if (err.code === "ENOENT") return void 0;
475
- throw err;
476
- }
477
- }
478
- async delete(runId) {
479
- try {
480
- await (await import('fs/promises')).unlink(this.filePath(runId));
481
- } catch (err) {
482
- if (err.code !== "ENOENT") throw err;
483
- }
484
- }
485
- async readEntriesOrEmpty() {
486
- try {
487
- return await readdir(this.dir);
488
- } catch (err) {
489
- if (err.code === "ENOENT") return [];
490
- throw err;
491
- }
492
- }
493
- async readSnapshotSafe(file) {
494
- try {
495
- const raw = await readFile(join(this.dir, file), "utf8");
496
- return JSON.parse(raw);
497
- } catch {
498
- return void 0;
499
- }
500
- }
501
- async list(workflowName) {
502
- const entries = await this.readEntriesOrEmpty();
503
- const results = [];
504
- for (const file of entries) {
505
- if (!file.endsWith(".json")) continue;
506
- const snap = await this.readSnapshotSafe(file);
507
- if (snap === void 0) continue;
508
- if (workflowName !== void 0 && snap.workflowName !== workflowName) continue;
509
- results.push({
510
- runId: snap.runId,
511
- workflowName: snap.workflowName,
512
- suspendedAt: snap.suspendedAt
513
- });
514
- }
515
- return results;
516
- }
517
- };
518
- memoryStore = new InMemoryWorkflowSnapshotStore();
519
- jsonStores = /* @__PURE__ */ new Map();
520
- }
521
- });
522
-
523
- // src/internal/workflow/ctx.ts
524
- function makeStepContext(runId, signal, state2) {
525
- return {
526
- runId,
527
- signal,
528
- log: {
529
- debug: (msg, attrs) => emit("debug", runId, msg, attrs),
530
- info: (msg, attrs) => emit("info", runId, msg, attrs),
531
- warn: (msg, attrs) => emit("warn", runId, msg, attrs)
532
- },
533
- suspend: async (payload) => {
534
- throw new WorkflowSuspendedSentinel(payload);
535
- },
536
- // SE29 — read reflects the current shared state; write goes through the
537
- // controller (which validates against `stateSchema`).
538
- get state() {
539
- return state2.getState();
540
- },
541
- setState: (next) => state2.setState(next)
542
- };
543
- }
544
- function emit(level, runId, msg, attrs) {
545
- const tag = `[workflow ${runId}]`;
546
- if (attrs !== void 0) {
547
- if (level === "warn") console.warn(tag, msg, attrs);
548
- else console.log(tag, msg, attrs);
549
- } else {
550
- if (level === "warn") console.warn(tag, msg);
551
- else console.log(tag, msg);
552
- }
553
- }
554
- function combineSignals(...signals) {
555
- const valid = signals.filter((s) => s !== void 0);
556
- if (valid.length === 0) return new AbortController().signal;
557
- if (valid.length === 1) return valid[0];
558
- const ctrl = new AbortController();
559
- for (const s of valid) {
560
- if (s.aborted) {
561
- ctrl.abort(s.reason);
562
- break;
563
- }
564
- s.addEventListener("abort", () => ctrl.abort(s.reason), { once: true });
565
- }
566
- return ctrl.signal;
567
- }
568
- var WorkflowSuspendedSentinel;
569
- var init_ctx = __esm({
570
- "src/internal/workflow/ctx.ts"() {
571
- WorkflowSuspendedSentinel = class extends Error {
572
- constructor(payload) {
573
- super("__workflow_suspended__");
574
- this.payload = payload;
575
- }
576
- payload;
577
- name = "WorkflowSuspendedSentinel";
578
- };
579
- }
580
- });
581
-
582
- // src/internal/workflow/error-shape.ts
583
- function errToShape(err) {
584
- if (err instanceof Error) {
585
- return { name: err.name, message: err.message };
586
- }
587
- return { name: "Error", message: String(err) };
588
- }
589
- var init_error_shape = __esm({
590
- "src/internal/workflow/error-shape.ts"() {
591
- }
592
- });
593
-
594
- // src/internal/workflow/executor-helpers.ts
595
- function assembleRun(params) {
596
- return {
597
- id: params.runId,
598
- name: params.name,
599
- status: params.status,
600
- startedAt: params.startedAt,
601
- endedAt: Date.now(),
602
- stepResults: params.stepResults,
603
- ...params.output !== void 0 ? { output: params.output } : {},
604
- ...params.error !== void 0 ? { error: params.error } : {}
605
- };
606
- }
607
- function abortRun(name, runId, startedAt, stepResults, signal) {
608
- return assembleRun({
609
- runId,
610
- name,
611
- status: "cancelled",
612
- stepResults,
613
- startedAt,
614
- error: { name: "AbortError", message: String(signal.reason ?? "Aborted") }
615
- });
616
- }
617
- function validateWorkflowSchema(schema, value) {
618
- if (schema === void 0) return void 0;
619
- let parsed;
620
- try {
621
- parsed = schema.safeParse(value);
622
- } catch {
623
- return "schema uses async refinements, which whole-workflow validation does not support (use a synchronous Zod schema)";
624
- }
625
- if (parsed.success) return void 0;
626
- return parsed.error.issues.map((issue) => `${issue.path.join(".") || "(root)"}: ${issue.message}`).join("; ");
627
- }
628
- function makeStateController(options, initial) {
629
- let current = initial;
630
- return {
631
- getState: () => current,
632
- setState: (next) => {
633
- const issues = validateWorkflowSchema(options.stateSchema, next);
634
- if (issues !== void 0) throw new WorkflowStateError(options.name, issues);
635
- current = next;
636
- }
637
- };
638
- }
639
- var init_executor_helpers = __esm({
640
- "src/internal/workflow/executor-helpers.ts"() {
641
- init_workflow();
642
- }
643
- });
644
-
645
- // src/internal/workflow/run-id.ts
646
- function mintRunId() {
647
- return `wfr-${globalThis.crypto.randomUUID().replace(/-/g, "").slice(0, 8)}`;
648
- }
649
- var init_run_id = __esm({
650
- "src/internal/workflow/run-id.ts"() {
651
- }
652
- });
653
-
654
- // src/internal/workflow/single-flight.ts
655
- function key(workflowId, runId) {
656
- return `${workflowId}:${runId}`;
657
- }
658
- function acquireSingleFlight(workflowId, runId, workflowName) {
659
- const k = key(workflowId, runId);
660
- if (registry.has(k)) {
661
- throw new WorkflowAlreadyRunningError(workflowName, runId);
662
- }
663
- const controller = new AbortController();
664
- registry.set(k, { controller });
665
- return {
666
- signal: controller.signal,
667
- release: () => {
668
- registry.delete(k);
669
- }
670
- };
671
- }
672
- var registry;
673
- var init_single_flight = __esm({
674
- "src/internal/workflow/single-flight.ts"() {
675
- init_workflow();
676
- registry = /* @__PURE__ */ new Map();
677
- }
678
- });
679
-
680
- // src/internal/workflow/retry-policy.ts
681
- function backoffConfigFromPolicy(policy) {
682
- return {
683
- max: policy.maxAttempts,
684
- init: policy.initialBackoffMs ?? 1e3,
685
- coef: policy.backoffCoefficient ?? 2,
686
- cap: policy.maximumBackoffMs ?? 3e4,
687
- nonRetryable: new Set(policy.nonRetryableErrors ?? DEFAULT_NON_RETRYABLE)
688
- };
689
- }
690
- function throwIfAborted(signal) {
691
- if (signal.aborted) {
692
- throw new DOMException(String(signal.reason ?? "Aborted"), "AbortError");
693
- }
694
- }
695
- function shouldRethrow(err, attempt, cfg) {
696
- const errName = err instanceof Error ? err.name : "Error";
697
- return cfg.nonRetryable.has(errName) || attempt === cfg.max;
698
- }
699
- async function tryOnce(fn2, attempt, cfg, signal) {
700
- try {
701
- const value = await fn2();
702
- return { value, attempts: attempt };
703
- } catch (err) {
704
- if (shouldRethrow(err, attempt, cfg)) throw err;
705
- await abortableSleep(Math.min(cfg.init * cfg.coef ** (attempt - 1), cfg.cap), signal);
706
- return { kind: "retry" };
707
- }
708
- }
709
- async function withRetry(fn2, policy, signal) {
710
- const cfg = backoffConfigFromPolicy(policy);
711
- for (let attempt = 1; attempt <= cfg.max; attempt += 1) {
712
- throwIfAborted(signal);
713
- const result = await tryOnce(fn2, attempt, cfg, signal);
714
- if ("value" in result) return result;
715
- }
716
- throw new Error("withRetry: exhausted attempts without throwing");
717
- }
718
- async function abortableSleep(ms, signal) {
719
- if (signal.aborted) {
720
- throw new DOMException(String(signal.reason ?? "Aborted"), "AbortError");
721
- }
722
- return new Promise((resolve2, reject) => {
723
- const timer = setTimeout(() => {
724
- cleanup();
725
- resolve2();
726
- }, ms);
727
- const onAbort = () => {
728
- clearTimeout(timer);
729
- cleanup();
730
- reject(new DOMException(String(signal.reason ?? "Aborted"), "AbortError"));
731
- };
732
- const cleanup = () => {
733
- signal.removeEventListener("abort", onAbort);
734
- };
735
- signal.addEventListener("abort", onAbort, { once: true });
736
- });
737
- }
738
- var DEFAULT_NON_RETRYABLE;
739
- var init_retry_policy = __esm({
740
- "src/internal/workflow/retry-policy.ts"() {
741
- DEFAULT_NON_RETRYABLE = ["AbortError", "WorkflowSnapshotNotFoundError", "ConfigurationError"];
742
- }
743
- });
744
-
745
- // src/internal/workflow/step-agent.ts
746
- async function runAgentStep(step, input, ctx) {
747
- const startedAt = Date.now();
748
- const agentId = step.agent.agentId;
749
- if (typeof agentId === "string" && agentId.startsWith("bc-")) {
750
- return {
751
- stepId: step.id,
752
- kind: "agent",
753
- status: "failed",
754
- attempts: 0,
755
- durationMs: Date.now() - startedAt,
756
- error: errToShape(
757
- new UnsupportedRunOperationError(
758
- `Workflow agent steps not supported on CloudAgent yet (D244). agent="${agentId}", step="${step.id}"`,
759
- "workflow"
760
- )
761
- )
762
- };
763
- }
764
- let prompt;
765
- try {
766
- prompt = typeof step.promptTemplate === "string" ? step.promptTemplate : step.promptTemplate(input);
767
- } catch (err) {
768
- return {
769
- stepId: step.id,
770
- kind: "agent",
771
- status: "failed",
772
- attempts: 0,
773
- durationMs: Date.now() - startedAt,
774
- error: errToShape(err)
775
- };
776
- }
777
- if (typeof prompt !== "string" || prompt.length === 0) {
778
- return {
779
- stepId: step.id,
780
- kind: "agent",
781
- status: "failed",
782
- attempts: 0,
783
- durationMs: Date.now() - startedAt,
784
- error: errToShape(
785
- new Error(`agentStep "${step.id}": rendered prompt must be a non-empty string`)
786
- )
787
- };
788
- }
789
- const exec = async () => {
790
- const run = await step.agent.send(
791
- prompt,
792
- step.origin !== void 0 ? { origin: step.origin } : void 0
793
- );
794
- const result = await run.wait();
795
- if (result.status === "finished") {
796
- return result.result ?? "";
797
- }
798
- if (result.status === "error") {
799
- throw result.error ?? new Error("agent.send errored");
800
- }
801
- throw new Error(`Unexpected agent status: ${result.status}`);
802
- };
803
- try {
804
- const { value, attempts } = step.retry !== void 0 ? await withRetry(exec, step.retry, ctx.signal) : { value: await exec(), attempts: 1 };
805
- return {
806
- stepId: step.id,
807
- kind: "agent",
808
- status: "completed",
809
- attempts,
810
- durationMs: Date.now() - startedAt,
811
- output: value
812
- };
813
- } catch (err) {
814
- if (err instanceof WorkflowSuspendedSentinel) throw err;
815
- return {
816
- stepId: step.id,
817
- kind: "agent",
818
- status: "failed",
819
- attempts: 1,
820
- durationMs: Date.now() - startedAt,
821
- error: errToShape(err)
822
- };
823
- }
824
- }
825
- var init_step_agent = __esm({
826
- "src/internal/workflow/step-agent.ts"() {
827
- init_errors();
828
- init_ctx();
829
- init_error_shape();
830
- init_retry_policy();
831
- }
832
- });
833
-
834
- // src/internal/workflow/step-branch.ts
835
- async function runBranchStep(step, input, ctx, options, prevStepResults, dispatch) {
836
- const startedAt = Date.now();
837
- for (let i = 0; i < step.predicates.length; i += 1) {
838
- const pair = step.predicates[i];
839
- const [predicate, branch] = pair;
840
- let matched = false;
841
- try {
842
- matched = await Promise.resolve(predicate(input));
843
- } catch (err) {
844
- const errText = err instanceof Error ? err.message : String(err);
845
- console.warn(
846
- redactSecrets(
847
- `[workflow] branch "${step.id}" predicate ${i} threw, treating as no-match: ${errText}`
848
- )
849
- );
850
- }
851
- if (matched) {
852
- const r = await runInnerSequence(branch, input, ctx, options, prevStepResults, dispatch);
853
- return {
854
- ...r,
855
- stepId: step.id,
856
- kind: "branch",
857
- durationMs: Date.now() - startedAt
858
- };
859
- }
860
- }
861
- if (step.fallback !== void 0) {
862
- const r = await runInnerSequence(step.fallback, input, ctx, options, prevStepResults, dispatch);
863
- return {
864
- ...r,
865
- stepId: step.id,
866
- kind: "branch",
867
- durationMs: Date.now() - startedAt
868
- };
869
- }
870
- return {
871
- stepId: step.id,
872
- kind: "branch",
873
- status: "skipped",
874
- attempts: 0,
875
- durationMs: Date.now() - startedAt,
876
- output: input
877
- };
878
- }
879
- async function runInnerSequence(branch, input, ctx, options, prevStepResults, dispatch) {
880
- let acc = input;
881
- let lastAttempts = 1;
882
- for (const inner of branch) {
883
- const r = await dispatch(inner, acc, ctx, options, prevStepResults);
884
- lastAttempts = r.attempts;
885
- if (r.status === "failed") {
886
- return {
887
- stepId: inner.id,
888
- kind: "branch",
889
- status: "failed",
890
- attempts: r.attempts,
891
- durationMs: 0,
892
- error: r.error ?? errToShape(new Error("branch inner step failed"))
893
- };
894
- }
895
- acc = r.output;
896
- }
897
- return {
898
- stepId: "__branch-completed__",
899
- kind: "branch",
900
- status: "completed",
901
- attempts: lastAttempts,
902
- durationMs: 0,
903
- output: acc
904
- };
905
- }
906
- var init_step_branch = __esm({
907
- "src/internal/workflow/step-branch.ts"() {
908
- init_redact();
909
- init_error_shape();
910
- }
911
- });
912
-
913
- // src/internal/workflow/step-dowhile.ts
914
- async function runDowhileStep(step, input, ctx, options, prevStepResults, dispatch) {
915
- const startedAt = Date.now();
916
- const maxIter = step.maxIterations ?? 100;
917
- let acc = input;
918
- let i = 0;
919
- while (true) {
920
- if (i >= maxIter) {
921
- return {
922
- stepId: step.id,
923
- kind: "dowhile",
924
- status: "failed",
925
- attempts: i,
926
- durationMs: Date.now() - startedAt,
927
- error: errToShape(new WorkflowMaxIterationsExceededError(step.id, maxIter))
928
- };
929
- }
930
- const r = await dispatch(step.step, acc, ctx, options, prevStepResults);
931
- if (r.status === "failed") {
932
- return {
933
- stepId: step.id,
934
- kind: "dowhile",
935
- status: "failed",
936
- attempts: i + 1,
937
- durationMs: Date.now() - startedAt,
938
- error: r.error
939
- };
940
- }
941
- acc = r.output;
942
- i += 1;
943
- let shouldContinue = false;
944
- try {
945
- shouldContinue = await Promise.resolve(step.condFn(acc, i));
946
- } catch (err) {
947
- return {
948
- stepId: step.id,
949
- kind: "dowhile",
950
- status: "failed",
951
- attempts: i,
952
- durationMs: Date.now() - startedAt,
953
- error: errToShape(err)
954
- };
955
- }
956
- if (!shouldContinue) break;
957
- }
958
- return {
959
- stepId: step.id,
960
- kind: "dowhile",
961
- status: "completed",
962
- attempts: i,
963
- durationMs: Date.now() - startedAt,
964
- output: acc
965
- };
966
- }
967
- var init_step_dowhile = __esm({
968
- "src/internal/workflow/step-dowhile.ts"() {
969
- init_workflow();
970
- init_error_shape();
971
- }
972
- });
973
-
974
- // src/internal/workflow/step-fn.ts
975
- function failedFnResult(stepId, attempts, startedAt, err) {
976
- return {
977
- stepId,
978
- kind: "fn",
979
- status: "failed",
980
- attempts,
981
- durationMs: Date.now() - startedAt,
982
- error: errToShape(err)
983
- };
984
- }
985
- function validate(schema, value) {
986
- if (schema === void 0) return void 0;
987
- schema.parse(value);
988
- return void 0;
989
- }
990
- async function execWithRetry(step, input, ctx) {
991
- const exec = async () => step.fn(input, ctx);
992
- if (step.retry !== void 0) return withRetry(exec, step.retry, ctx.signal);
993
- return { value: await exec(), attempts: 1 };
994
- }
995
- async function runFnStep(step, input, ctx) {
996
- const startedAt = Date.now();
997
- if (step.compensate !== void 0) {
998
- return failedFnResult(
999
- step.id,
1000
- 0,
1001
- startedAt,
1002
- new WorkflowCompensateNotImplementedError(step.id)
1003
- );
1004
- }
1005
- try {
1006
- validate(step.inputSchema, input);
1007
- } catch (err) {
1008
- return failedFnResult(step.id, 0, startedAt, err);
1009
- }
1010
- try {
1011
- const { value, attempts } = await execWithRetry(step, input, ctx);
1012
- try {
1013
- validate(step.outputSchema, value);
1014
- } catch (err) {
1015
- return failedFnResult(step.id, attempts, startedAt, err);
1016
- }
1017
- return {
1018
- stepId: step.id,
1019
- kind: "fn",
1020
- status: "completed",
1021
- attempts,
1022
- durationMs: Date.now() - startedAt,
1023
- output: value
1024
- };
1025
- } catch (err) {
1026
- if (err instanceof WorkflowSuspendedSentinel) throw err;
1027
- return failedFnResult(step.id, 1, startedAt, err);
1028
- }
1029
- }
1030
- var init_step_fn = __esm({
1031
- "src/internal/workflow/step-fn.ts"() {
1032
- init_workflow();
1033
- init_ctx();
1034
- init_error_shape();
1035
- init_retry_policy();
1036
- }
1037
- });
1038
-
1039
- // src/internal/runtime/concurrency/async-semaphore.ts
1040
- function createSemaphore(permits) {
1041
- if (!Number.isInteger(permits) || permits < 1) {
1042
- throw new ConfigurationError(
1043
- `async-semaphore: permits must be a positive integer, got ${permits}`,
1044
- { code: "invalid_concurrency" }
1045
- );
1046
- }
1047
- let active = 0;
1048
- const queue = [];
1049
- function tryGrant() {
1050
- if (active < permits && queue.length > 0) {
1051
- const resolve2 = queue.shift();
1052
- if (resolve2 !== void 0) {
1053
- active += 1;
1054
- resolve2();
1055
- }
1056
- }
1057
- }
1058
- return {
1059
- inFlight: () => active,
1060
- pending: () => queue.length + active,
1061
- async acquire() {
1062
- await new Promise((resolve2) => {
1063
- queue.push(resolve2);
1064
- tryGrant();
1065
- });
1066
- let released = false;
1067
- return () => {
1068
- if (released) return;
1069
- released = true;
1070
- active -= 1;
1071
- tryGrant();
1072
- };
1073
- }
1074
- };
1075
- }
1076
- var init_async_semaphore = __esm({
1077
- "src/internal/runtime/concurrency/async-semaphore.ts"() {
1078
- init_errors();
1079
- }
1080
- });
1081
-
1082
- // src/internal/workflow/step-foreach.ts
1083
- async function runForeachStep(step, _input, ctx, options, prevStepResults, dispatch) {
1084
- const startedAt = Date.now();
1085
- const sourceResult = prevStepResults.find((r) => r.stepId === step.iterableFrom);
1086
- if (sourceResult === void 0) {
1087
- return {
1088
- stepId: step.id,
1089
- kind: "foreach",
1090
- status: "failed",
1091
- attempts: 0,
1092
- durationMs: Date.now() - startedAt,
1093
- error: errToShape(
1094
- new Error(
1095
- `foreach.iterableFrom "${step.iterableFrom}" not found in top-level steps. It must reference an earlier top-level step ID \u2014 nested step IDs inside parallel/branch/foreach blocks are not visible here.`
1096
- )
1097
- )
1098
- };
1099
- }
1100
- const items = sourceResult.output;
1101
- if (!Array.isArray(items)) {
1102
- return {
1103
- stepId: step.id,
1104
- kind: "foreach",
1105
- status: "failed",
1106
- attempts: 0,
1107
- durationMs: Date.now() - startedAt,
1108
- error: errToShape(
1109
- new Error(
1110
- `foreach.iterableFrom "${step.iterableFrom}" output must be Array, got ${typeof items}.`
1111
- )
1112
- )
1113
- };
1114
- }
1115
- if (items.length === 0) {
1116
- return {
1117
- stepId: step.id,
1118
- kind: "foreach",
1119
- status: "completed",
1120
- attempts: 1,
1121
- durationMs: Date.now() - startedAt,
1122
- output: []
1123
- };
1124
- }
1125
- const concurrency = step.concurrency ?? 4;
1126
- const sem = createSemaphore(Math.max(1, Math.min(concurrency, items.length)));
1127
- const failures = [];
1128
- const outputs = new Array(items.length);
1129
- await Promise.all(
1130
- items.map(async (item, idx) => {
1131
- const release = await sem.acquire();
1132
- try {
1133
- const r = await dispatch(step.step, item, ctx, options, prevStepResults);
1134
- if (r.status === "failed") {
1135
- failures.push(new Error(`foreach item ${idx} failed: ${r.error?.message ?? "unknown"}`));
1136
- } else {
1137
- outputs[idx] = r.output;
1138
- }
1139
- } finally {
1140
- release();
1141
- }
1142
- })
1143
- );
1144
- if (failures.length > 0) {
1145
- return {
1146
- stepId: step.id,
1147
- kind: "foreach",
1148
- status: "failed",
1149
- attempts: 1,
1150
- durationMs: Date.now() - startedAt,
1151
- error: errToShape(
1152
- new AggregateError(failures, `foreach "${step.id}" had ${failures.length} failure(s)`)
1153
- )
1154
- };
1155
- }
1156
- return {
1157
- stepId: step.id,
1158
- kind: "foreach",
1159
- status: "completed",
1160
- attempts: 1,
1161
- durationMs: Date.now() - startedAt,
1162
- output: outputs
1163
- };
1164
- }
1165
- var init_step_foreach = __esm({
1166
- "src/internal/workflow/step-foreach.ts"() {
1167
- init_async_semaphore();
1168
- init_error_shape();
1169
- }
1170
- });
1171
-
1172
- // src/internal/workflow/step-parallel.ts
1173
- async function runParallelStep(step, input, ctx, options, _prevStepResults, dispatch) {
1174
- const startedAt = Date.now();
1175
- const policy = step.errorPolicy ?? "fail-fast";
1176
- const branchCount = step.branches.length;
1177
- if (branchCount === 0) {
1178
- return {
1179
- stepId: step.id,
1180
- kind: "parallel",
1181
- status: "completed",
1182
- attempts: 1,
1183
- durationMs: Date.now() - startedAt,
1184
- output: []
1185
- };
1186
- }
1187
- const concurrency = step.concurrency ?? branchCount;
1188
- const sem = createSemaphore(Math.max(1, Math.min(concurrency, branchCount)));
1189
- const failFastCtrl = policy === "fail-fast" ? new AbortController() : void 0;
1190
- const branchSignal = policy === "fail-fast" ? mergeSignals(ctx.signal, failFastCtrl.signal) : ctx.signal;
1191
- const semBranchPromises = step.branches.map(async (branch, branchIdx) => {
1192
- const release = await sem.acquire();
1193
- try {
1194
- return await runBranch(
1195
- branch,
1196
- input,
1197
- { ...ctx, signal: branchSignal },
1198
- options,
1199
- dispatch,
1200
- branchIdx
1201
- );
1202
- } finally {
1203
- release();
1204
- }
1205
- });
1206
- if (policy === "fail-fast") {
1207
- try {
1208
- const outputs2 = await Promise.all(semBranchPromises);
1209
- return {
1210
- stepId: step.id,
1211
- kind: "parallel",
1212
- status: "completed",
1213
- attempts: 1,
1214
- durationMs: Date.now() - startedAt,
1215
- output: outputs2
1216
- };
1217
- } catch (err) {
1218
- failFastCtrl?.abort(err);
1219
- const settled2 = await Promise.allSettled(semBranchPromises);
1220
- const errors = settled2.filter((s) => s.status === "rejected").map((s) => s.reason instanceof Error ? s.reason : new Error(String(s.reason)));
1221
- return {
1222
- stepId: step.id,
1223
- kind: "parallel",
1224
- status: "failed",
1225
- attempts: 1,
1226
- durationMs: Date.now() - startedAt,
1227
- error: errToShape(new WorkflowParallelError(errors, step.id)),
1228
- output: void 0
1229
- };
1230
- }
1231
- }
1232
- const settled = await Promise.allSettled(semBranchPromises);
1233
- const outputs = settled.map(
1234
- (s) => s.status === "fulfilled" ? { ok: true, value: s.value } : { ok: false, error: errToShape(s.reason) }
1235
- );
1236
- return {
1237
- stepId: step.id,
1238
- kind: "parallel",
1239
- status: "completed",
1240
- attempts: 1,
1241
- durationMs: Date.now() - startedAt,
1242
- output: outputs
1243
- };
1244
- }
1245
- async function runBranch(branch, input, ctx, options, dispatch, branchIdx) {
1246
- let acc = input;
1247
- for (const inner of branch) {
1248
- const r = await dispatch(inner, acc, ctx, options, []);
1249
- if (r.status === "failed") {
1250
- throw new Error(
1251
- `parallel branch ${branchIdx} step "${inner.id}" failed: ${r.error?.message ?? "unknown"}`
1252
- );
1253
- }
1254
- acc = r.output;
1255
- }
1256
- return acc;
1257
- }
1258
- function mergeSignals(a, b) {
1259
- if (a.aborted) return a;
1260
- if (b.aborted) return b;
1261
- const ctrl = new AbortController();
1262
- const onAbortA = () => ctrl.abort(a.reason);
1263
- const onAbortB = () => ctrl.abort(b.reason);
1264
- a.addEventListener("abort", onAbortA, { once: true });
1265
- b.addEventListener("abort", onAbortB, { once: true });
1266
- return ctrl.signal;
1267
- }
1268
- var init_step_parallel = __esm({
1269
- "src/internal/workflow/step-parallel.ts"() {
1270
- init_workflow();
1271
- init_async_semaphore();
1272
- init_error_shape();
1273
- }
1274
- });
1275
-
1276
- // src/internal/workflow/step-sleep.ts
1277
- async function runSleepStep(step, input, ctx) {
1278
- const startedAt = Date.now();
1279
- try {
1280
- await abortableSleep(step.durationMs, ctx.signal);
1281
- return {
1282
- stepId: step.id,
1283
- kind: "sleep",
1284
- status: "completed",
1285
- attempts: 1,
1286
- durationMs: Date.now() - startedAt,
1287
- output: input
1288
- // sleep is a pass-through
1289
- };
1290
- } catch (err) {
1291
- return {
1292
- stepId: step.id,
1293
- kind: "sleep",
1294
- status: "failed",
1295
- attempts: 1,
1296
- durationMs: Date.now() - startedAt,
1297
- error: errToShape(err)
1298
- };
1299
- }
1300
- }
1301
- var init_step_sleep = __esm({
1302
- "src/internal/workflow/step-sleep.ts"() {
1303
- init_error_shape();
1304
- init_retry_policy();
1305
- }
1306
- });
1307
- function getTracer(name, version = "1.0.0") {
1308
- const cached = tracerCache.get(name);
1309
- if (cached !== void 0) return cached.tracer ?? void 0;
1310
- try {
1311
- const r = createRequire(import.meta.url);
1312
- const otel = r("@opentelemetry/api");
1313
- if (otel.trace?.getTracer === void 0) {
1314
- tracerCache.set(name, { tracer: null });
1315
- return void 0;
1316
- }
1317
- const tracer = otel.trace.getTracer(name, version);
1318
- tracerCache.set(name, { tracer });
1319
- return tracer;
1320
- } catch {
1321
- tracerCache.set(name, { tracer: null });
1322
- return void 0;
1323
- }
1324
- }
1325
- var noopSpan, tracerCache;
1326
- var init_tracer_loader = __esm({
1327
- "src/internal/telemetry/tracer-loader.ts"() {
1328
- noopSpan = {
1329
- setAttribute: () => noopSpan,
1330
- end: () => void 0
1331
- };
1332
- tracerCache = /* @__PURE__ */ new Map();
1333
- }
1334
- });
1335
-
1336
- // src/internal/workflow/telemetry.ts
1337
- function startWorkflowRunSpan(info) {
1338
- const tracer = getTracer(TRACER_NAME);
1339
- if (tracer === void 0) return noopSpan;
1340
- return tracer.startSpan("workflow.run", {
1341
- attributes: {
1342
- "workflow.name": info.workflowName,
1343
- "workflow.run_id": info.runId
1344
- }
1345
- });
1346
- }
1347
- function startWorkflowStepSpan(info) {
1348
- const tracer = getTracer(TRACER_NAME);
1349
- if (tracer === void 0) return noopSpan;
1350
- return tracer.startSpan(`workflow.step.${info.stepId}`, {
1351
- attributes: {
1352
- "step.id": info.stepId,
1353
- "step.kind": info.kind,
1354
- "step.attempt": info.attempt
1355
- }
1356
- });
1357
- }
1358
- var TRACER_NAME;
1359
- var init_telemetry = __esm({
1360
- "src/internal/workflow/telemetry.ts"() {
1361
- init_tracer_loader();
1362
- TRACER_NAME = "@theokit/sdk/workflow";
1363
- }
1364
- });
1365
-
1366
- // src/internal/workflow/executor.ts
1367
- var executor_exports = {};
1368
- __export(executor_exports, {
1369
- dispatchStep: () => dispatchStep,
1370
- executeWorkflow: () => executeWorkflow,
1371
- resumeWorkflow: () => resumeWorkflow
1372
- });
1373
- async function handleSuspend(err, ctx) {
1374
- try {
1375
- await saveSnapshot({
1376
- runId: ctx.runId,
1377
- workflowName: ctx.options.name,
1378
- currentStepId: ctx.step.id,
1379
- suspendedPayload: err.payload,
1380
- stepResults: ctx.stepResults,
1381
- accumulatedInput: ctx.acc,
1382
- state: ctx.stepCtx.state,
1383
- // SE29 — capture the shared state at suspend
1384
- options: ctx.options
1385
- });
1386
- } catch (snapErr) {
1387
- ctx.stepSpan.setAttribute("step.status", "failed");
1388
- ctx.stepSpan.end();
1389
- return {
1390
- kind: "failed",
1391
- run: assembleRun({
1392
- runId: ctx.runId,
1393
- name: ctx.name,
1394
- status: "failed",
1395
- stepResults: ctx.stepResults,
1396
- startedAt: ctx.startedAt,
1397
- error: errToShape(snapErr)
1398
- })
1399
- };
1400
- }
1401
- ctx.stepSpan.setAttribute("step.status", "suspended");
1402
- ctx.stepSpan.end();
1403
- return {
1404
- kind: "suspended",
1405
- run: assembleRun({
1406
- runId: ctx.runId,
1407
- name: ctx.name,
1408
- status: "suspended",
1409
- stepResults: [
1410
- ...ctx.stepResults,
1411
- {
1412
- stepId: ctx.step.id,
1413
- kind: ctx.step.kind,
1414
- status: "suspended",
1415
- attempts: 1,
1416
- durationMs: 0,
1417
- output: void 0
1418
- }
1419
- ],
1420
- startedAt: ctx.startedAt
1421
- })
1422
- };
1423
- }
1424
- async function runOneStep(args) {
1425
- const stepSpan = startWorkflowStepSpan({
1426
- stepId: args.step.id,
1427
- kind: args.step.kind,
1428
- attempt: 1
1429
- });
1430
- let result;
1431
- try {
1432
- result = await dispatchStep(args.step, args.acc, args.ctx, args.options, args.stepResults);
1433
- } catch (err) {
1434
- if (err instanceof WorkflowSuspendedSentinel) {
1435
- const outcome = await handleSuspend(err, { ...args, stepSpan, stepCtx: args.ctx });
1436
- return { kind: "terminal", run: outcome.run };
1437
- }
1438
- result = {
1439
- stepId: args.step.id,
1440
- kind: args.step.kind,
1441
- status: "failed",
1442
- attempts: 1,
1443
- durationMs: 0,
1444
- error: errToShape(err)
1445
- };
1446
- }
1447
- stepSpan.setAttribute("step.status", result.status);
1448
- stepSpan.setAttribute("step.attempts", result.attempts);
1449
- stepSpan.end();
1450
- return { kind: "ok", result };
1451
- }
1452
- function handleStepOutcome(outcome, step, loop, onStepEvent) {
1453
- if (outcome.kind === "terminal") {
1454
- if (outcome.run.status === "suspended") {
1455
- onStepEvent?.({ type: "workflow_suspended", stepId: step.id });
1456
- }
1457
- return { terminal: outcome.run };
1458
- }
1459
- loop.stepResults.push(outcome.result);
1460
- if (outcome.result.status === "failed") {
1461
- onStepEvent?.({
1462
- type: "step_failed",
1463
- stepId: step.id,
1464
- error: outcome.result.error ?? { name: "WorkflowStepError", message: "step failed" }
1465
- });
1466
- return {
1467
- terminal: assembleRun({
1468
- runId: loop.runId,
1469
- name: loop.name,
1470
- status: "failed",
1471
- stepResults: loop.stepResults,
1472
- startedAt: loop.startedAt,
1473
- error: outcome.result.error
1474
- })
1475
- };
1476
- }
1477
- onStepEvent?.({ type: "step_completed", stepId: step.id, output: outcome.result.output });
1478
- return { acc: outcome.result.output };
1479
- }
1480
- async function runStepsLoop(params) {
1481
- const { options, steps, ctx, runId, startedAt, signal, onStepEvent } = params;
1482
- const stepResults = [...params.initialStepResults ?? []];
1483
- const loop = { stepResults, runId, name: options.name, startedAt };
1484
- let acc = params.input;
1485
- for (const step of steps) {
1486
- if (signal.aborted) return abortRun(options.name, runId, startedAt, stepResults, signal);
1487
- onStepEvent?.({ type: "step_started", stepId: step.id });
1488
- const outcome = await runOneStep({
1489
- step,
1490
- acc,
1491
- ctx,
1492
- options,
1493
- stepResults,
1494
- runId,
1495
- name: options.name,
1496
- startedAt
1497
- });
1498
- const handled = handleStepOutcome(outcome, step, loop, onStepEvent);
1499
- if ("terminal" in handled) return handled.terminal;
1500
- acc = handled.acc;
1501
- }
1502
- const outputIssues = validateWorkflowSchema(options.outputSchema, acc);
1503
- if (outputIssues !== void 0) {
1504
- return assembleRun({
1505
- runId,
1506
- name: options.name,
1507
- status: "failed",
1508
- stepResults,
1509
- startedAt,
1510
- error: errToShape(new WorkflowOutputError(options.name, outputIssues))
1511
- });
1512
- }
1513
- onStepEvent?.({ type: "workflow_completed" });
1514
- return assembleRun({
1515
- runId,
1516
- name: options.name,
1517
- status: "completed",
1518
- output: acc,
1519
- stepResults,
1520
- startedAt
1521
- });
1522
- }
1523
- async function executeWorkflow(options, steps, input, runOpts) {
1524
- const runId = runOpts?.runId ?? mintRunId();
1525
- const workflowId = options.workflowId ?? `wf-anon`;
1526
- const flight = acquireSingleFlight(workflowId, runId, options.name);
1527
- const startedAt = Date.now();
1528
- const signal = combineSignals(runOpts?.signal, flight.signal);
1529
- const runSpan = startWorkflowRunSpan({ workflowName: options.name, runId });
1530
- if (signal.aborted) {
1531
- flight.release();
1532
- runSpan.setAttribute("workflow.status", "cancelled");
1533
- runSpan.end();
1534
- return abortRun(options.name, runId, startedAt, [], signal);
1535
- }
1536
- const internal = runOpts;
1537
- const seededState = internal?.restoredState !== void 0 ? internal.restoredState : options.initialState;
1538
- const stateController = makeStateController(options, seededState);
1539
- const ctx = makeStepContext(runId, signal, stateController);
1540
- try {
1541
- const inputIssues = validateWorkflowSchema(options.inputSchema, input);
1542
- if (inputIssues !== void 0) {
1543
- return assembleRun({
1544
- runId,
1545
- name: options.name,
1546
- status: "failed",
1547
- stepResults: [],
1548
- startedAt,
1549
- error: errToShape(new WorkflowInputError(options.name, inputIssues))
1550
- });
1551
- }
1552
- const stateIssues = seededState !== void 0 ? validateWorkflowSchema(options.stateSchema, seededState) : void 0;
1553
- if (stateIssues !== void 0) {
1554
- return assembleRun({
1555
- runId,
1556
- name: options.name,
1557
- status: "failed",
1558
- stepResults: [],
1559
- startedAt,
1560
- error: errToShape(new WorkflowStateError(options.name, stateIssues))
1561
- });
1562
- }
1563
- return await runStepsLoop({
1564
- options,
1565
- steps,
1566
- input,
1567
- ctx,
1568
- runId,
1569
- startedAt,
1570
- signal,
1571
- ...internal?.initialStepResults !== void 0 ? { initialStepResults: internal.initialStepResults } : {},
1572
- ...internal?.onStepEvent !== void 0 ? { onStepEvent: internal.onStepEvent } : {}
1573
- });
1574
- } finally {
1575
- runSpan.end();
1576
- flight.release();
1577
- }
1578
- }
1579
- async function dispatchStep(step, input, ctx, options, prevStepResults) {
1580
- switch (step.kind) {
1581
- case "fn":
1582
- return runFnStep(step, input, ctx);
1583
- case "agent":
1584
- return runAgentStep(step, input, ctx);
1585
- case "parallel":
1586
- return runParallelStep(step, input, ctx, options, prevStepResults, dispatchStep);
1587
- case "branch":
1588
- return runBranchStep(step, input, ctx, options, prevStepResults, dispatchStep);
1589
- case "foreach":
1590
- return runForeachStep(step, input, ctx, options, prevStepResults, dispatchStep);
1591
- case "dowhile":
1592
- return runDowhileStep(step, input, ctx, options, prevStepResults, dispatchStep);
1593
- case "sleep":
1594
- return runSleepStep(step, input, ctx);
1595
- case "suspend":
1596
- throw new WorkflowSuspendedSentinel(void 0);
1597
- default: {
1598
- const _exhaustive = step;
1599
- throw new Error(`Unknown step kind: ${_exhaustive.kind}`);
1600
- }
1601
- }
1602
- }
1603
- async function saveSnapshot(p) {
1604
- const snapshot = {
1605
- _schemaVersion: 2,
1606
- // SE29 — carries `state`
1607
- runId: p.runId,
1608
- workflowName: p.workflowName,
1609
- currentStepId: p.currentStepId,
1610
- suspendedPayload: p.suspendedPayload,
1611
- stepResults: p.stepResults,
1612
- accumulatedInput: p.accumulatedInput,
1613
- ...p.state !== void 0 ? { state: p.state } : {},
1614
- suspendedAt: Date.now()
1615
- };
1616
- const store = getSnapshotStoreFor(p.options);
1617
- await store.save(snapshot);
1618
- }
1619
- async function resumeWorkflow(opts) {
1620
- const wfInternal = opts.workflow;
1621
- const options = wfInternal.__options;
1622
- const steps = wfInternal.__steps;
1623
- if (options === void 0 || steps === void 0) {
1624
- throw new Error("Workflow.resume requires an instance from Workflow.create().commit()");
1625
- }
1626
- const store = getSnapshotStoreFor(options);
1627
- const snapshot = await store.load(opts.runId);
1628
- if (snapshot === void 0) {
1629
- throw new WorkflowSnapshotNotFoundError(opts.runId);
1630
- }
1631
- const stepIdx = steps.findIndex((s) => s.id === snapshot.currentStepId);
1632
- if (stepIdx < 0) {
1633
- throw new WorkflowResumeStepNotFoundError(snapshot.currentStepId, snapshot.workflowName);
1634
- }
1635
- const suspendStep = steps[stepIdx];
1636
- if (suspendStep !== void 0 && suspendStep.kind === "suspend" && suspendStep.payloadSchema !== void 0) {
1637
- suspendStep.payloadSchema.parse(opts.payload);
1638
- }
1639
- const resumeInput = opts.payload !== void 0 ? opts.payload : snapshot.accumulatedInput;
1640
- const remainingSteps = steps.slice(stepIdx + 1);
1641
- await store.delete(opts.runId);
1642
- return executeWorkflow(options, remainingSteps, resumeInput, {
1643
- signal: opts.signal,
1644
- runId: opts.runId,
1645
- // M3 #62 — restore prior step outputs so the resumed run is not lossy (internal seam).
1646
- initialStepResults: snapshot.stepResults,
1647
- // SE29 — restore shared state (v2 snapshot). A v1 snapshot has no `state` →
1648
- // executeWorkflow falls back to `options.initialState`.
1649
- ...snapshot.state !== void 0 ? { restoredState: snapshot.state } : {}
1650
- });
1651
- }
1652
- var init_executor = __esm({
1653
- "src/internal/workflow/executor.ts"() {
1654
- init_workflow();
1655
- init_ctx();
1656
- init_error_shape();
1657
- init_executor_helpers();
1658
- init_run_id();
1659
- init_single_flight();
1660
- init_snapshot_store();
1661
- init_step_agent();
1662
- init_step_branch();
1663
- init_step_dowhile();
1664
- init_step_fn();
1665
- init_step_foreach();
1666
- init_step_parallel();
1667
- init_step_sleep();
1668
- init_telemetry();
1669
- }
1670
- });
1671
-
1672
- // src/types/run-events.ts
1673
- function emitRunEvent(sink, event) {
1674
- if (sink === void 0) return;
1675
- try {
1676
- sink(event);
1677
- } catch {
1678
- }
1679
- }
1680
- var init_run_events = __esm({
1681
- "src/types/run-events.ts"() {
1682
- }
1683
- });
1684
-
1685
- // src/types/task.ts
1686
- function isValidTaskId(id, allowReserved) {
1687
- if (!TASK_ID_GRAMMAR.test(id)) return false;
1688
- if (allowReserved) return true;
1689
- for (const prefix of RESERVED_PREFIXES) {
1690
- if (id.startsWith(prefix)) return false;
1691
- }
1692
- return true;
1693
- }
1694
- var TASK_ID_GRAMMAR, RESERVED_PREFIXES;
1695
- var init_task = __esm({
1696
- "src/types/task.ts"() {
1697
- TASK_ID_GRAMMAR = /^[a-z0-9][a-z0-9_-]*$/;
1698
- RESERVED_PREFIXES = ["wf-", "b-", "cron-"];
1699
- }
1700
- });
1701
-
1702
- // src/internal/task/ring-buffer.ts
1703
- var RingBuffer;
1704
- var init_ring_buffer = __esm({
1705
- "src/internal/task/ring-buffer.ts"() {
1706
- RingBuffer = class {
1707
- constructor(cap) {
1708
- this.cap = cap;
1709
- if (!Number.isInteger(cap) || cap < 1) {
1710
- throw new Error(`RingBuffer capacity must be a positive integer, got ${cap}`);
1711
- }
1712
- }
1713
- cap;
1714
- buf = [];
1715
- truncated = false;
1716
- push(item) {
1717
- if (this.buf.length >= this.cap) {
1718
- this.buf.shift();
1719
- this.truncated = true;
1720
- }
1721
- this.buf.push(item);
1722
- }
1723
- drain() {
1724
- return { items: this.buf.slice(), truncated: this.truncated };
1725
- }
1726
- size() {
1727
- return this.buf.length;
1728
- }
1729
- wasTruncated() {
1730
- return this.truncated;
1731
- }
1732
- };
1733
- }
1734
- });
1735
- function assertValidIdForStore(id) {
1736
- if (!isValidTaskId(
1737
- id,
1738
- /* allowReserved */
1739
- true
1740
- )) {
1741
- throw new InvalidTaskIdError(`store rejects invalid task id: ${id}`, id);
1742
- }
1743
- }
1744
- function terminalTimestamp(h) {
1745
- if (h.state === "finished") return h.finishedAt;
1746
- if (h.state === "error") return h.erroredAt;
1747
- if (h.state === "cancelled") return h.cancelledAt;
1748
- return void 0;
1749
- }
1750
- function isTerminal(state2) {
1751
- return state2 === "finished" || state2 === "error" || state2 === "cancelled";
1752
- }
1753
- function matchesState(h, filter) {
1754
- if (filter.state === void 0) return true;
1755
- const states = Array.isArray(filter.state) ? filter.state : [filter.state];
1756
- return states.includes(h.state);
1757
- }
1758
- function matchesKind(h, filter) {
1759
- if (filter.kind === void 0) return true;
1760
- const kinds = Array.isArray(filter.kind) ? filter.kind : [filter.kind];
1761
- return kinds.includes(h.kind);
1762
- }
1763
- function matchesTime(h, filter) {
1764
- if (filter.submittedAfter !== void 0 && h.submittedAt <= filter.submittedAfter) return false;
1765
- if (filter.submittedBefore !== void 0 && h.submittedAt >= filter.submittedBefore) return false;
1766
- return true;
1767
- }
1768
- function matchesFilter(h, filter) {
1769
- return matchesState(h, filter) && matchesKind(h, filter) && matchesTime(h, filter);
1770
- }
1771
- function applyFilter(values, filter) {
1772
- const limit = filter.limit ?? DEFAULT_LIST_LIMIT;
1773
- const out = [];
1774
- for (const h of values) {
1775
- if (matchesFilter(h, filter)) {
1776
- out.push(h);
1777
- if (out.length >= limit) break;
1778
- }
1779
- }
1780
- return out;
1781
- }
1782
- function getTaskStoreFor(options) {
1783
- if (options.backend === "memory") return new InMemoryTaskStore();
1784
- return new JsonFileTaskStore(options.dir);
1785
- }
1786
- var JSON_LOAD_CAP, DEFAULT_LIST_LIMIT, InMemoryTaskStore, JsonFileTaskStore;
1787
- var init_store = __esm({
1788
- "src/internal/task/store.ts"() {
1789
- init_errors();
1790
- init_task();
1791
- init_atomic_write();
1792
- JSON_LOAD_CAP = 256;
1793
- DEFAULT_LIST_LIMIT = 100;
1794
- InMemoryTaskStore = class {
1795
- map = /* @__PURE__ */ new Map();
1796
- async insert(handle) {
1797
- assertValidIdForStore(handle.id);
1798
- this.map.set(handle.id, handle);
1799
- }
1800
- async update(id, mutate) {
1801
- assertValidIdForStore(id);
1802
- const existing = this.map.get(id);
1803
- if (existing === void 0) return void 0;
1804
- const next = mutate(existing);
1805
- this.map.set(id, next);
1806
- return next;
1807
- }
1808
- async get(id) {
1809
- assertValidIdForStore(id);
1810
- return this.map.get(id);
1811
- }
1812
- async list(filter) {
1813
- return applyFilter(this.map.values(), filter);
1814
- }
1815
- async delete(id) {
1816
- assertValidIdForStore(id);
1817
- return this.map.delete(id);
1818
- }
1819
- async evictTerminalOlderThan(epochMs) {
1820
- let count = 0;
1821
- for (const [id, h] of this.map.entries()) {
1822
- if (!isTerminal(h.state)) continue;
1823
- const ts = terminalTimestamp(h);
1824
- if (ts !== void 0 && ts < epochMs) {
1825
- this.map.delete(id);
1826
- count++;
1827
- }
1828
- }
1829
- return count;
1830
- }
1831
- };
1832
- JsonFileTaskStore = class {
1833
- constructor(dir) {
1834
- this.dir = dir;
1835
- try {
1836
- mkdirSync(dir, { recursive: true });
1837
- } catch (err) {
1838
- if (err.code !== "EEXIST") throw err;
1839
- }
1840
- }
1841
- dir;
1842
- filePath(id) {
1843
- return join(this.dir, `${id}.json`);
1844
- }
1845
- async insert(handle) {
1846
- assertValidIdForStore(handle.id);
1847
- await atomicWriteText(this.filePath(handle.id), JSON.stringify(handle));
1848
- }
1849
- async update(id, mutate) {
1850
- assertValidIdForStore(id);
1851
- const existing = await this.get(id);
1852
- if (existing === void 0) return void 0;
1853
- const next = mutate(existing);
1854
- await atomicWriteText(this.filePath(id), JSON.stringify(next));
1855
- return next;
1856
- }
1857
- async get(id) {
1858
- assertValidIdForStore(id);
1859
- try {
1860
- const raw = await readFile(this.filePath(id), "utf8");
1861
- return JSON.parse(raw);
1862
- } catch (err) {
1863
- const code = err.code;
1864
- if (code === "ENOENT") return void 0;
1865
- process.stderr.write(`[task-store] failed to read ${id}: ${err.message}
1866
- `);
1867
- return void 0;
1868
- }
1869
- }
1870
- async list(filter) {
1871
- let entries;
1872
- try {
1873
- entries = readdirSync(this.dir);
1874
- } catch (err) {
1875
- if (err.code === "ENOENT") return [];
1876
- throw err;
1877
- }
1878
- const candidates = entries.filter((name) => name.endsWith(".json") && !name.includes(".tmp")).slice(0, JSON_LOAD_CAP);
1879
- const loaded = await Promise.all(
1880
- candidates.map(async (name) => {
1881
- const id = name.slice(0, -".json".length);
1882
- if (!isValidTaskId(id, true)) return void 0;
1883
- return this.get(id);
1884
- })
1885
- );
1886
- const handles = loaded.filter((h) => h !== void 0);
1887
- return applyFilter(handles, filter);
1888
- }
1889
- async delete(id) {
1890
- assertValidIdForStore(id);
1891
- try {
1892
- await unlink(this.filePath(id));
1893
- return true;
1894
- } catch (err) {
1895
- if (err.code === "ENOENT") return false;
1896
- throw err;
1897
- }
1898
- }
1899
- async evictTerminalOlderThan(epochMs) {
1900
- const handles = await this.list({ state: ["finished", "error", "cancelled"], limit: 256 });
1901
- let count = 0;
1902
- for (const h of handles) {
1903
- const ts = terminalTimestamp(h);
1904
- if (ts !== void 0 && ts < epochMs) {
1905
- if (await this.delete(h.id)) count++;
1906
- }
1907
- }
1908
- return count;
1909
- }
1910
- };
1911
- }
1912
- });
1913
-
1914
- // src/internal/task/subscribe.ts
1915
- function isTerminalEvent(event) {
1916
- return event.type === "finished" || event.type === "errored" || event.type === "cancelled";
1917
- }
1918
- function drainBuffered(buffer) {
1919
- const { items, truncated } = buffer.drain();
1920
- const queue = items.slice();
1921
- if (truncated && queue.length > 0) {
1922
- const first = queue[0];
1923
- if (first !== void 0 && first.type === "submitted") {
1924
- queue[0] = { ...first, truncated: true };
1925
- }
1926
- }
1927
- return queue;
1928
- }
1929
- function buildSubscribe(deps) {
1930
- return function subscribe2(id) {
1931
- if (!isValidTaskId(id, true)) throw new TaskNotFoundError(id);
1932
- const buffer = deps.getBuffer(id);
1933
- if (buffer === void 0) throw new TaskNotFoundError(id);
1934
- return {
1935
- [Symbol.asyncIterator]() {
1936
- return new TaskIterator(buffer, id, deps);
1937
- }
1938
- };
1939
- };
1940
- }
1941
- var TaskIterator;
1942
- var init_subscribe = __esm({
1943
- "src/internal/task/subscribe.ts"() {
1944
- init_errors();
1945
- init_task();
1946
- TaskIterator = class {
1947
- constructor(buffer, id, deps) {
1948
- this.id = id;
1949
- this.deps = deps;
1950
- this.queue = drainBuffered(buffer);
1951
- this.callback = (e) => this.deliver(e);
1952
- deps.getOrCreateSubscriberSet(id).add(this.callback);
1953
- }
1954
- id;
1955
- deps;
1956
- queue;
1957
- pendingResolve;
1958
- done = false;
1959
- callback;
1960
- deliver(e) {
1961
- if (this.done) return;
1962
- if (this.pendingResolve !== void 0) {
1963
- const r = this.pendingResolve;
1964
- this.pendingResolve = void 0;
1965
- r({ value: e, done: false });
1966
- } else {
1967
- this.queue.push(e);
1968
- }
1969
- }
1970
- cleanup() {
1971
- if (this.done) return;
1972
- this.done = true;
1973
- this.deps.removeSubscriber(this.id, this.callback);
1974
- if (this.pendingResolve !== void 0) {
1975
- const r = this.pendingResolve;
1976
- this.pendingResolve = void 0;
1977
- r({ value: void 0, done: true });
1978
- }
1979
- }
1980
- dequeue() {
1981
- const event = this.queue.shift();
1982
- if (event === void 0) return void 0;
1983
- if (isTerminalEvent(event)) queueMicrotask(() => this.cleanup());
1984
- return { value: event, done: false };
1985
- }
1986
- next() {
1987
- if (this.done) return Promise.resolve({ value: void 0, done: true });
1988
- const queued = this.dequeue();
1989
- if (queued !== void 0) return Promise.resolve(queued);
1990
- return new Promise((resolve2) => {
1991
- this.pendingResolve = resolve2;
1992
- });
1993
- }
1994
- return() {
1995
- this.cleanup();
1996
- return Promise.resolve({ value: void 0, done: true });
1997
- }
1998
- };
1999
- }
2000
- });
2001
-
2002
- // src/internal/task/task-run-event-bridge.ts
2003
- function taskEventToRunEvent(event, taskId, kind) {
2004
- switch (event.type) {
2005
- case "started":
2006
- return { type: "task_started", taskId, description: kind };
2007
- case "progress":
2008
- return { type: "task_updated", taskId, status: "progress" };
2009
- case "finished":
2010
- return { type: "task_completed", taskId, status: "completed" };
2011
- case "errored":
2012
- return { type: "task_completed", taskId, status: "failed" };
2013
- case "cancelled":
2014
- return { type: "task_completed", taskId, status: "stopped" };
2015
- default:
2016
- return void 0;
2017
- }
2018
- }
2019
- var init_task_run_event_bridge = __esm({
2020
- "src/internal/task/task-run-event-bridge.ts"() {
2021
- }
2022
- });
2023
-
2024
- // src/internal/task/telemetry.ts
2025
- function startTaskSubmitSpan(info) {
2026
- const tracer = getTracer(TRACER_NAME2);
2027
- if (tracer === void 0) return noopSpan;
2028
- return tracer.startSpan("task.submit", {
2029
- attributes: {
2030
- "task.id": info.taskId,
2031
- "task.kind": info.kind
2032
- }
2033
- });
2034
- }
2035
- function startTaskTransitionSpan(info) {
2036
- const tracer = getTracer(TRACER_NAME2);
2037
- if (tracer === void 0) return noopSpan;
2038
- return tracer.startSpan("task.transition", {
2039
- attributes: {
2040
- "task.id": info.taskId,
2041
- "task.state.from": info.from,
2042
- "task.state.to": info.to
2043
- }
2044
- });
2045
- }
2046
- function startTaskCancelSpan(info) {
2047
- const tracer = getTracer(TRACER_NAME2);
2048
- if (tracer === void 0) return noopSpan;
2049
- return tracer.startSpan("task.cancel", {
2050
- attributes: {
2051
- "task.id": info.taskId,
2052
- "task.cancel.via": info.via,
2053
- ...info.reason !== void 0 ? { "task.cancel.reason": info.reason } : {}
2054
- }
2055
- });
2056
- }
2057
- var TRACER_NAME2;
2058
- var init_telemetry2 = __esm({
2059
- "src/internal/task/telemetry.ts"() {
2060
- init_tracer_loader();
2061
- TRACER_NAME2 = "@theokit/sdk/task";
2062
- }
2063
- });
2064
-
2065
- // src/internal/task/registry.ts
2066
- var registry_exports = {};
2067
- __export(registry_exports, {
2068
- __getSubscribersCountForTests: () => __getSubscribersCountForTests,
2069
- __resetTaskRegistryForTests: () => __resetTaskRegistryForTests,
2070
- cancel: () => cancel,
2071
- configure: () => configure,
2072
- get: () => get,
2073
- list: () => list,
2074
- submit: () => submit,
2075
- subscribe: () => subscribe
2076
- });
2077
- function buildState(opts) {
2078
- const store = opts.store === void 0 ? new InMemoryTaskStore() : getTaskStoreFor(opts.store);
2079
- return {
2080
- store,
2081
- semaphore: createSemaphore(opts.maxConcurrent ?? DEFAULT_CONCURRENCY),
2082
- aborters: /* @__PURE__ */ new Map(),
2083
- buffers: /* @__PURE__ */ new Map(),
2084
- subscribers: /* @__PURE__ */ new Map(),
2085
- retentionMs: opts.retentionMs ?? DEFAULT_RETENTION_MS,
2086
- firstSubmitSeen: false
2087
- };
2088
- }
2089
- function __resetTaskRegistryForTests() {
2090
- if (state.evictTimer !== void 0) clearInterval(state.evictTimer);
2091
- state = buildState({});
2092
- }
2093
- function __getSubscribersCountForTests(taskId) {
2094
- return state.subscribers.get(taskId)?.size ?? 0;
2095
- }
2096
- function configure(opts) {
2097
- if (state.firstSubmitSeen) {
2098
- process.stderr.write(
2099
- "[task] configure() ignored \u2014 registry already in use; reset via __resetTaskRegistryForTests()\n"
2100
- );
2101
- return;
2102
- }
2103
- if (state.evictTimer !== void 0) clearInterval(state.evictTimer);
2104
- state = buildState(opts);
2105
- }
2106
- function emitToSubscribers(taskId, event) {
2107
- const buffer = state.buffers.get(taskId);
2108
- if (buffer !== void 0) buffer.push(event);
2109
- const subs = state.subscribers.get(taskId);
2110
- if (subs === void 0) return;
2111
- for (const cb of subs) {
2112
- try {
2113
- cb(event);
2114
- } catch (err) {
2115
- process.stderr.write(`[task] subscriber threw: ${err.message}
2116
- `);
2117
- }
2118
- }
2119
- }
2120
- async function safeUpdate(taskId, mutate) {
2121
- try {
2122
- return await state.store.update(taskId, mutate);
2123
- } catch (err) {
2124
- process.stderr.write(`[task] store.update failed for ${taskId}: ${err.message}
2125
- `);
2126
- return void 0;
2127
- }
2128
- }
2129
- function startEvictTimerIfNeeded() {
2130
- if (state.evictTimer !== void 0) return;
2131
- state.evictTimer = setInterval(() => {
2132
- const cutoff = Date.now() - state.retentionMs;
2133
- void state.store.evictTerminalOlderThan(cutoff).then((count) => {
2134
- if (count === 0) return;
2135
- for (const id of state.buffers.keys()) {
2136
- void state.store.get(id).then((h) => {
2137
- if (h === void 0) {
2138
- state.buffers.delete(id);
2139
- state.subscribers.delete(id);
2140
- state.aborters.delete(id);
2141
- }
2142
- });
2143
- }
2144
- }).catch(() => {
2145
- });
2146
- }, EVICTION_INTERVAL_MS).unref();
2147
- }
2148
- function buildSubmittedEvent(handle) {
2149
- return {
2150
- type: "submitted",
2151
- taskId: handle.id,
2152
- kind: handle.kind,
2153
- submittedAt: handle.submittedAt,
2154
- ...handle.meta !== void 0 ? { meta: handle.meta } : {}
2155
- };
2156
- }
2157
- async function shortCircuitAborted(handle, signal) {
2158
- const cancelled = {
2159
- ...handle,
2160
- state: "cancelled",
2161
- cancelledAt: Date.now()
2162
- };
2163
- await state.store.insert(cancelled);
2164
- state.buffers.set(handle.id, new RingBuffer(RING_CAP));
2165
- emitToSubscribers(handle.id, buildSubmittedEvent(cancelled));
2166
- emitToSubscribers(handle.id, {
2167
- type: "cancelled",
2168
- taskId: handle.id,
2169
- cancelledAt: cancelled.cancelledAt ?? Date.now(),
2170
- reason: signal.reason instanceof Error ? signal.reason.message : "pre-aborted"
2171
- });
2172
- return cancelled;
2173
- }
2174
- async function transition(taskId, next, patch) {
2175
- const before = await state.store.get(taskId);
2176
- const span = startTaskTransitionSpan({
2177
- taskId,
2178
- from: before?.state ?? "unknown",
2179
- to: next
2180
- });
2181
- try {
2182
- await safeUpdate(taskId, (h) => ({ ...h, state: next, ...patch }));
2183
- } finally {
2184
- span.end();
2185
- }
2186
- }
2187
- async function buildAndInsertQueued(internal, resolvedId) {
2188
- const submittedAt = Date.now();
2189
- const handle = {
2190
- id: resolvedId,
2191
- kind: internal.kind,
2192
- state: "queued",
2193
- submittedAt,
2194
- ...internal.meta !== void 0 ? { meta: internal.meta } : {}
2195
- };
2196
- await state.store.insert(handle);
2197
- state.buffers.set(resolvedId, new RingBuffer(RING_CAP));
2198
- emitToSubscribers(resolvedId, buildSubmittedEvent(handle));
2199
- return handle;
2200
- }
2201
- function resolveIdInternal(internal) {
2202
- if (internal.id === void 0) return randomUUID();
2203
- if (!isValidTaskId(internal.id, internal.allowReservedPrefix ?? false)) {
2204
- throw new InvalidTaskIdError(`invalid task id: ${internal.id}`, internal.id);
2205
- }
2206
- return internal.id;
2207
- }
2208
- async function runWorkAndFinalize(taskId, aborter, work) {
2209
- const ctx = {
2210
- signal: aborter.signal,
2211
- emit(payload) {
2212
- void checkCancelRequestedAt(taskId, aborter);
2213
- emitToSubscribers(taskId, {
2214
- type: "progress",
2215
- taskId,
2216
- at: Date.now(),
2217
- payload
2218
- });
2219
- }
2220
- };
2221
- try {
2222
- const result = await reentryAls.run(true, () => Promise.resolve().then(() => work(ctx)));
2223
- if (aborter.signal.aborted) {
2224
- const cancelledAt = Date.now();
2225
- await transition(taskId, "cancelled", { cancelledAt });
2226
- emitToSubscribers(taskId, { type: "cancelled", taskId, cancelledAt });
2227
- return;
2228
- }
2229
- const finishedAt = Date.now();
2230
- await transition(taskId, "finished", { finishedAt, result });
2231
- emitToSubscribers(taskId, { type: "finished", taskId, finishedAt, result });
2232
- } catch (err) {
2233
- if (aborter.signal.aborted) {
2234
- const cancelledAt = Date.now();
2235
- await transition(taskId, "cancelled", { cancelledAt });
2236
- emitToSubscribers(taskId, { type: "cancelled", taskId, cancelledAt });
2237
- return;
2238
- }
2239
- const erroredAt = Date.now();
2240
- const error = err instanceof Error ? { code: err.code ?? "work_threw", message: err.message } : { code: "work_threw", message: String(err) };
2241
- await transition(taskId, "error", { erroredAt, error });
2242
- emitToSubscribers(taskId, { type: "errored", taskId, erroredAt, error });
2243
- }
2244
- }
2245
- async function checkCancelRequestedAt(taskId, aborter) {
2246
- if (aborter.signal.aborted) return;
2247
- try {
2248
- const handle = await state.store.get(taskId);
2249
- if (handle?.cancelRequested === true) {
2250
- aborter.abort("cancelRequested");
2251
- }
2252
- } catch {
2253
- }
2254
- }
2255
- async function acquireSlot() {
2256
- if (reentryAls.getStore() === true) {
2257
- return () => {
2258
- };
2259
- }
2260
- return state.semaphore.acquire();
2261
- }
2262
- async function submit(internal) {
2263
- state.firstSubmitSeen = true;
2264
- startEvictTimerIfNeeded();
2265
- const resolvedId = resolveIdInternal(internal);
2266
- if (internal.onRunEvent !== void 0) {
2267
- const sink = internal.onRunEvent;
2268
- const kind = internal.kind;
2269
- const subs = state.subscribers.get(resolvedId) ?? /* @__PURE__ */ new Set();
2270
- subs.add((e) => {
2271
- const runEvent = taskEventToRunEvent(e, resolvedId, kind);
2272
- if (runEvent !== void 0) emitRunEvent(sink, runEvent);
2273
- });
2274
- state.subscribers.set(resolvedId, subs);
2275
- }
2276
- const submitSpan = startTaskSubmitSpan({ taskId: resolvedId, kind: internal.kind });
2277
- const existing = await state.store.get(resolvedId);
2278
- if (existing !== void 0) {
2279
- submitSpan.end();
2280
- return existing;
2281
- }
2282
- const queuedHandle = await buildAndInsertQueued(internal, resolvedId);
2283
- submitSpan.end();
2284
- if (internal.signal?.aborted === true) {
2285
- return shortCircuitAborted(queuedHandle, internal.signal);
2286
- }
2287
- const aborter = new AbortController();
2288
- state.aborters.set(resolvedId, aborter);
2289
- if (internal.signal !== void 0) {
2290
- internal.signal.addEventListener("abort", () => aborter.abort(internal.signal?.reason), {
2291
- once: true
2292
- });
2293
- }
2294
- const release = await acquireSlot();
2295
- void (async () => {
2296
- try {
2297
- await checkCancelRequestedAt(resolvedId, aborter);
2298
- if (aborter.signal.aborted) {
2299
- const cancelledAt = Date.now();
2300
- await transition(resolvedId, "cancelled", { cancelledAt });
2301
- emitToSubscribers(resolvedId, { type: "cancelled", taskId: resolvedId, cancelledAt });
2302
- return;
2303
- }
2304
- const startedAt = Date.now();
2305
- await transition(resolvedId, "running", { startedAt });
2306
- emitToSubscribers(resolvedId, { type: "started", taskId: resolvedId, startedAt });
2307
- await runWorkAndFinalize(resolvedId, aborter, internal.work);
2308
- } finally {
2309
- release();
2310
- state.aborters.delete(resolvedId);
2311
- }
2312
- })();
2313
- return queuedHandle;
2314
- }
2315
- async function list(filter = {}) {
2316
- return state.store.list(filter);
2317
- }
2318
- async function get(id) {
2319
- if (!isValidTaskId(id, true)) return void 0;
2320
- return state.store.get(id);
2321
- }
2322
- async function cancel(id, reason) {
2323
- if (!isValidTaskId(id, true)) return { cancelled: false, alreadyTerminal: false };
2324
- const handle = await state.store.get(id);
2325
- if (handle === void 0) return { cancelled: false, alreadyTerminal: false };
2326
- if (handle.state === "finished" || handle.state === "error" || handle.state === "cancelled") {
2327
- return { cancelled: false, alreadyTerminal: true };
2328
- }
2329
- const span = startTaskCancelSpan({
2330
- taskId: id,
2331
- ...reason !== void 0 ? { reason } : {},
2332
- via: "api"
2333
- });
2334
- try {
2335
- return await cancelInternal(id, handle.state, reason);
2336
- } finally {
2337
- span.end();
2338
- }
2339
- }
2340
- async function cancelInternal(id, currentState, reason) {
2341
- if (currentState === "queued") {
2342
- const cancelledAt = Date.now();
2343
- await transition(id, "cancelled", { cancelledAt });
2344
- emitToSubscribers(id, {
2345
- type: "cancelled",
2346
- taskId: id,
2347
- cancelledAt,
2348
- ...reason !== void 0 ? { reason } : {}
2349
- });
2350
- state.aborters.delete(id);
2351
- return { cancelled: true, alreadyTerminal: false };
2352
- }
2353
- const aborter = state.aborters.get(id);
2354
- if (aborter !== void 0) aborter.abort(reason ?? "cancelled");
2355
- return { cancelled: true, alreadyTerminal: false };
2356
- }
2357
- var DEFAULT_CONCURRENCY, DEFAULT_RETENTION_MS, EVICTION_INTERVAL_MS, RING_CAP, reentryAls, state, subscribe;
2358
- var init_registry = __esm({
2359
- "src/internal/task/registry.ts"() {
2360
- init_errors();
2361
- init_run_events();
2362
- init_task();
2363
- init_async_semaphore();
2364
- init_ring_buffer();
2365
- init_store();
2366
- init_subscribe();
2367
- init_task_run_event_bridge();
2368
- init_telemetry2();
2369
- DEFAULT_CONCURRENCY = 8;
2370
- DEFAULT_RETENTION_MS = 60 * 60 * 1e3;
2371
- EVICTION_INTERVAL_MS = 5 * 60 * 1e3;
2372
- RING_CAP = 64;
2373
- reentryAls = new AsyncLocalStorage();
2374
- state = buildState({});
2375
- subscribe = buildSubscribe({
2376
- getBuffer: (id) => state.buffers.get(id),
2377
- getOrCreateSubscriberSet: (id) => {
2378
- let subs = state.subscribers.get(id);
2379
- if (subs === void 0) {
2380
- subs = /* @__PURE__ */ new Set();
2381
- state.subscribers.set(id, subs);
2382
- }
2383
- return subs;
2384
- },
2385
- removeSubscriber: (id, cb) => {
2386
- const set = state.subscribers.get(id);
2387
- set?.delete(cb);
2388
- if (set !== void 0 && set.size === 0) state.subscribers.delete(id);
2389
- }
2390
- });
2391
- }
2392
- });
2393
- var PersistenceSchema = z.object({
2394
- backend: z.enum(["memory", "json"]),
2395
- dir: z.string().optional()
2396
- }).refine((p) => p.backend !== "json" || typeof p.dir === "string" && p.dir.length > 0, {
2397
- message: 'persistence.dir is required when backend = "json"'
2398
- }).optional();
2399
-
2400
- // src/internal/security/path-guard.ts
2401
- init_errors();
2402
- var PathTraversalError = class extends ConfigurationError {
2403
- name = "PathTraversalError";
2404
- constructor(input, resolvedPath) {
2405
- super(`Path traversal attempt: ${input} \u2192 ${resolvedPath}`, {
2406
- code: "path_traversal"
2407
- });
2408
- }
2409
- };
2410
- function rejectNulAndControlChars(input, role) {
2411
- for (let i = 0; i < input.length; i++) {
2412
- const code = input.charCodeAt(i);
2413
- if (code === 0 || code >= 1 && code <= 31 || code === 127) {
2414
- const label = code === 0 ? "<nul-byte>" : `<control-char-0x${code.toString(16)}>`;
2415
- throw new PathTraversalError(`${role}: ${input}`, label);
2416
- }
2417
- }
2418
- }
2419
- var IDENTIFIER_PATTERN = /^[a-z0-9][a-z0-9\-_]*$/i;
2420
- function sanitizeIdentifier(input, options) {
2421
- const maxLen = options?.maxLen;
2422
- if (input.length === 0 || input.length > maxLen) {
2423
- throw new ConfigurationError(`Identifier length out of range (1-${maxLen}): "${input}"`, {
2424
- code: "invalid_identifier"
2425
- });
2426
- }
2427
- rejectNulAndControlChars(input, "identifier");
2428
- if (!IDENTIFIER_PATTERN.test(input)) {
2429
- throw new ConfigurationError(`Identifier contains invalid characters: "${input}"`, {
2430
- code: "invalid_identifier"
2431
- });
2432
- }
2433
- return input.toLowerCase();
2434
- }
2435
-
2436
- // src/internal/workflow/event-stream.ts
2437
- function createEventStream() {
2438
- const buffer = [];
2439
- const waiters = [];
2440
- let ended = false;
2441
- const stream = {
2442
- push(event) {
2443
- if (ended) return;
2444
- const waiter = waiters.shift();
2445
- if (waiter !== void 0) waiter({ value: event, done: false });
2446
- else buffer.push(event);
2447
- },
2448
- end() {
2449
- if (ended) return;
2450
- ended = true;
2451
- for (const waiter of waiters.splice(0)) waiter({ value: void 0, done: true });
2452
- },
2453
- next() {
2454
- const buffered = buffer.shift();
2455
- if (buffered !== void 0) return Promise.resolve({ value: buffered, done: false });
2456
- if (ended) return Promise.resolve({ value: void 0, done: true });
2457
- return new Promise((resolve2) => waiters.push(resolve2));
2458
- },
2459
- // `for await` calls return() on break/throw — close early so events stop
2460
- // buffering in memory for a consumer that stopped iterating.
2461
- return() {
2462
- stream.end();
2463
- buffer.length = 0;
2464
- return Promise.resolve({ value: void 0, done: true });
2465
- },
2466
- [Symbol.asyncIterator]() {
2467
- return stream;
2468
- }
2469
- };
2470
- return stream;
2471
- }
2472
- function toJsonSchema(schema, options = { unrepresentable: "any" }) {
2473
- return toJSONSchema(schema, options);
2474
- }
2475
-
2476
- // src/workflow.ts
2477
- init_workflow();
2478
- init_snapshot_store();
2479
- init_workflow();
2480
- var RetryPolicySchema = z.object({
2481
- // EC-3 absorbed: maxAttempts MUST be a finite int in [1, 20].
2482
- maxAttempts: z.number().int("retry.maxAttempts must be integer").min(1, "retry.maxAttempts must be >= 1").max(20, "retry.maxAttempts must be <= 20"),
2483
- initialBackoffMs: z.number().int().min(0).optional(),
2484
- backoffCoefficient: z.number().min(1).optional(),
2485
- maximumBackoffMs: z.number().int().min(0).optional(),
2486
- nonRetryableErrors: z.array(z.string()).optional()
2487
- });
2488
- var WorkflowOptionsSchema = z.object({
2489
- name: z.string().min(1).max(128),
2490
- persistence: PersistenceSchema,
2491
- // SE27 — declared so a future `new WorkflowBuilder(parsed)` refactor cannot
2492
- // silently drop them (create() passes the ORIGINAL options today, but the
2493
- // schema is also the documentation of the shape).
2494
- inputSchema: z.custom().optional(),
2495
- outputSchema: z.custom().optional()
2496
- });
2497
- var WorkflowBuilder = class {
2498
- /** @internal */
2499
- constructor(options) {
2500
- this.options = options;
2501
- }
2502
- options;
2503
- _steps = [];
2504
- _committed = false;
2505
- /** @internal — only the executor reads this. */
2506
- get __steps() {
2507
- return this._steps;
2508
- }
2509
- // biome-ignore lint/suspicious/noThenProperty: D233 locks the a peer framework-style `.then(step)` builder DSL. The method is fluent, never awaited.
2510
- then(step) {
2511
- this.assertNotCommitted();
2512
- validateStepId(step.id);
2513
- this._steps.push(step);
2514
- return this;
2515
- }
2516
- parallel(branches, opts) {
2517
- this.assertNotCommitted();
2518
- const id = opts?.id ?? `parallel_${this._steps.length}`;
2519
- validateStepId(id);
2520
- for (const branch of branches) {
2521
- for (const inner of branch) validateStepId(inner.id);
2522
- }
2523
- const step = {
2524
- kind: "parallel",
2525
- id,
2526
- branches,
2527
- ...opts?.concurrency !== void 0 ? { concurrency: opts.concurrency } : {},
2528
- ...opts?.errorPolicy !== void 0 ? { errorPolicy: opts.errorPolicy } : {}
2529
- };
2530
- this._steps.push(step);
2531
- return this;
2532
- }
2533
- branch(predicates, opts) {
2534
- this.assertNotCommitted();
2535
- const id = opts?.id ?? `branch_${this._steps.length}`;
2536
- validateStepId(id);
2537
- const step = {
2538
- kind: "branch",
2539
- id,
2540
- predicates,
2541
- ...opts?.fallback !== void 0 ? { fallback: opts.fallback } : {}
2542
- };
2543
- this._steps.push(step);
2544
- return this;
2545
- }
2546
- foreach(iterableFrom, step, opts) {
2547
- this.assertNotCommitted();
2548
- const id = opts?.id ?? `foreach_${this._steps.length}`;
2549
- validateStepId(id);
2550
- validateStepId(iterableFrom);
2551
- validateStepId(step.id);
2552
- const node = {
2553
- kind: "foreach",
2554
- id,
2555
- iterableFrom,
2556
- step,
2557
- ...opts?.concurrency !== void 0 ? { concurrency: opts.concurrency } : {}
2558
- };
2559
- this._steps.push(node);
2560
- return this;
2561
- }
2562
- dowhile(step, condFn, opts) {
2563
- this.assertNotCommitted();
2564
- const id = opts?.id ?? `dowhile_${this._steps.length}`;
2565
- validateStepId(id);
2566
- validateStepId(step.id);
2567
- const node = {
2568
- kind: "dowhile",
2569
- id,
2570
- step,
2571
- condFn,
2572
- ...opts?.maxIterations !== void 0 ? { maxIterations: opts.maxIterations } : {}
2573
- };
2574
- this._steps.push(node);
2575
- return this;
2576
- }
2577
- sleep(durationMs, id) {
2578
- this.assertNotCommitted();
2579
- const stepId = id ?? `sleep_${this._steps.length}`;
2580
- validateStepId(stepId);
2581
- if (!Number.isFinite(durationMs) || durationMs < 0) {
2582
- throw new Error(`sleep durationMs must be finite non-negative: ${durationMs}`);
2583
- }
2584
- const step = { kind: "sleep", id: stepId, durationMs };
2585
- this._steps.push(step);
2586
- return this;
2587
- }
2588
- suspend(opts) {
2589
- this.assertNotCommitted();
2590
- const id = opts?.id ?? `suspend_${this._steps.length}`;
2591
- validateStepId(id);
2592
- const step = {
2593
- kind: "suspend",
2594
- id,
2595
- ...opts?.payloadSchema !== void 0 ? { payloadSchema: opts.payloadSchema } : {}
2596
- };
2597
- this._steps.push(step);
2598
- return this;
2599
- }
2600
- commit() {
2601
- this.assertNotCommitted();
2602
- this.validateUniqueIds();
2603
- this._committed = true;
2604
- const workflowId = `wf-${mintShortId()}`;
2605
- return new Workflow({ ...this.options, workflowId }, [...this._steps]);
2606
- }
2607
- validateUniqueIds() {
2608
- const seen = /* @__PURE__ */ new Set();
2609
- walkStepsValidating(this._steps, seen);
2610
- }
2611
- assertNotCommitted() {
2612
- if (this._committed) {
2613
- throw new Error("Workflow already committed; create a fresh Workflow.create(...) call.");
2614
- }
2615
- }
2616
- };
2617
- var Workflow = class {
2618
- /** @internal */
2619
- constructor(_options, _steps) {
2620
- this._options = _options;
2621
- this._steps = _steps;
2622
- }
2623
- _options;
2624
- _steps;
2625
- /** @internal — only the executor reads these. */
2626
- get __options() {
2627
- return this._options;
2628
- }
2629
- /** @internal */
2630
- get __steps() {
2631
- return this._steps;
2632
- }
2633
- /**
2634
- * Construct a workflow builder. Validate options via Zod and return a
2635
- * `WorkflowBuilder` for fluent chaining. Call `.commit()` to obtain the
2636
- * immutable `Workflow`.
2637
- */
2638
- static create(options) {
2639
- WorkflowOptionsSchema.parse(options);
2640
- return new WorkflowBuilder(options);
2641
- }
2642
- /**
2643
- * Run this workflow with the given input. Returns a populated
2644
- * `WorkflowRun`. Errors inside a step DO NOT throw — they propagate via
2645
- * `run.status === "failed"`.
2646
- */
2647
- async run(input, opts) {
2648
- const { executeWorkflow: executeWorkflow2 } = await Promise.resolve().then(() => (init_executor(), executor_exports));
2649
- const result = await executeWorkflow2(this._options, this._steps, input, opts);
2650
- if (opts?.task !== void 0) {
2651
- const { submit: taskSubmit } = await Promise.resolve().then(() => (init_registry(), registry_exports));
2652
- const taskOpts = opts.task === true ? {} : opts.task;
2653
- const id = taskOpts.id ?? `wf-${result.id}`;
2654
- await taskSubmit({
2655
- kind: "workflow",
2656
- work: async (ctx) => {
2657
- ctx.emit({ status: result.status, runId: result.id });
2658
- return { status: result.status, runId: result.id, output: result.output };
2659
- },
2660
- id,
2661
- meta: {
2662
- workflowName: this._options.name,
2663
- runId: result.id,
2664
- status: result.status,
2665
- ...taskOpts.meta ?? {}
2666
- },
2667
- allowReservedPrefix: true
2668
- });
2669
- }
2670
- return result;
2671
- }
2672
- /**
2673
- * SE28 — run the workflow and STREAM step-level events as they happen. Returns
2674
- * an async iterator of {@link WorkflowEvent}s (`step_started` / `step_completed`
2675
- * / `step_failed` / `workflow_suspended` / `workflow_completed`, top-level
2676
- * steps) plus a `result` promise resolving to the same terminal
2677
- * {@link WorkflowRun} `run()` returns. Iterate for progress; await `result` for
2678
- * the outcome. The stream ends when the run terminates.
2679
- *
2680
- * `result` is the AUTHORITATIVE terminal status. Not every terminal state has a
2681
- * closing event: a step failure emits `step_failed`, but an `outputSchema`
2682
- * rejection (SE27) or an abort ends the stream WITHOUT `workflow_completed` —
2683
- * always `await result` to read the final `status`. Consuming order is free:
2684
- * awaiting `result` without draining, or draining without awaiting `result`,
2685
- * both work (breaking out of `for await` stops the buffering early).
2686
- */
2687
- stream(input, opts) {
2688
- const queue = createEventStream();
2689
- const result = (async () => {
2690
- const { executeWorkflow: executeWorkflow2 } = await Promise.resolve().then(() => (init_executor(), executor_exports));
2691
- try {
2692
- return await executeWorkflow2(this._options, this._steps, input, {
2693
- ...opts,
2694
- onStepEvent: (event) => queue.push(event)
2695
- });
2696
- } finally {
2697
- queue.end();
2698
- }
2699
- })();
2700
- return Object.assign(queue, { result });
2701
- }
2702
- /**
2703
- * Resume a suspended workflow from its snapshot. Throws
2704
- * `WorkflowSnapshotNotFoundError` if `runId` is unknown.
2705
- */
2706
- static async resume(opts) {
2707
- const { resumeWorkflow: resumeWorkflow2 } = await Promise.resolve().then(() => (init_executor(), executor_exports));
2708
- return resumeWorkflow2(opts);
2709
- }
2710
- };
2711
- function fn(id, step, opts) {
2712
- validateStepId(id);
2713
- if (opts?.retry !== void 0) RetryPolicySchema.parse(opts.retry);
2714
- return {
2715
- kind: "fn",
2716
- id,
2717
- fn: step,
2718
- ...opts?.inputSchema !== void 0 ? { inputSchema: opts.inputSchema } : {},
2719
- ...opts?.outputSchema !== void 0 ? { outputSchema: opts.outputSchema } : {},
2720
- ...opts?.retry !== void 0 ? { retry: opts.retry } : {}
2721
- };
2722
- }
2723
- function agentStep(id, agent, promptTemplate, opts) {
2724
- validateStepId(id);
2725
- if (opts?.retry !== void 0) RetryPolicySchema.parse(opts.retry);
2726
- return {
2727
- kind: "agent",
2728
- id,
2729
- agent,
2730
- promptTemplate,
2731
- ...opts?.retry !== void 0 ? { retry: opts.retry } : {},
2732
- // SE3 — carry the turn's provenance down to `agent.send()` (metadata-only).
2733
- ...opts?.origin !== void 0 ? { origin: opts.origin } : {}
2734
- };
2735
- }
2736
- function workflowStep(child, opts) {
2737
- const id = opts?.id ?? `workflow_${child.__options.name}`;
2738
- validateStepId(id);
2739
- return {
2740
- kind: "fn",
2741
- id,
2742
- fn: async (input, ctx) => {
2743
- const run = await child.run(input, { signal: ctx.signal });
2744
- if (run.status === "completed") return run.output;
2745
- throw new WorkflowNestedError(id, child.__options.name, run.status, run.error);
2746
- }
2747
- };
2748
- }
2749
- function cloneWorkflow(wf, opts) {
2750
- return new Workflow(
2751
- { ...wf.__options, name: opts.id, workflowId: `wf-${mintShortId()}` },
2752
- [...wf.__steps]
2753
- );
2754
- }
2755
- var WorkflowToolError = class extends Error {
2756
- constructor(toolName, workflowStatus, workflowError) {
2757
- super(
2758
- `workflowAsTool("${toolName}"): workflow ${workflowStatus}${workflowError ? `: ${workflowError.message}` : ""}`
2759
- );
2760
- this.toolName = toolName;
2761
- this.workflowStatus = workflowStatus;
2762
- this.workflowError = workflowError;
2763
- this.name = "WorkflowToolError";
2764
- }
2765
- toolName;
2766
- workflowStatus;
2767
- workflowError;
2768
- code = "workflow_tool_failed";
2769
- };
2770
- function workflowAsTool(workflow, spec) {
2771
- const inputSchema = toJsonSchema(spec.inputSchema, { unrepresentable: "any" });
2772
- return {
2773
- name: spec.name,
2774
- description: spec.description,
2775
- inputSchema,
2776
- handler: async (rawInput) => {
2777
- const parsed = spec.inputSchema.parse(rawInput);
2778
- const run = await workflow.run(parsed);
2779
- if (run.status !== "completed") {
2780
- throw new WorkflowToolError(spec.name, run.status, run.error);
2781
- }
2782
- const output = run.output;
2783
- return typeof output === "string" ? output : JSON.stringify(output ?? null);
2784
- }
2785
- };
2786
- }
2787
- function validateStepId(id) {
2788
- sanitizeIdentifier(id, { maxLen: 64 });
2789
- }
2790
- function mintShortId() {
2791
- return globalThis.crypto.randomUUID().replace(/-/g, "").slice(0, 8);
2792
- }
2793
- function nestedStepsOf(s) {
2794
- if (s.kind === "parallel") return s.branches;
2795
- if (s.kind === "branch") {
2796
- const groups = s.predicates.map(([, branch]) => branch);
2797
- return s.fallback !== void 0 ? [...groups, s.fallback] : groups;
2798
- }
2799
- if (s.kind === "foreach" || s.kind === "dowhile") return [[s.step]];
2800
- return [];
2801
- }
2802
- function walkStepsValidating(steps, seen) {
2803
- for (const s of steps) {
2804
- if (seen.has(s.id)) throw new WorkflowDuplicateStepIdError(s.id);
2805
- seen.add(s.id);
2806
- for (const nested of nestedStepsOf(s)) {
2807
- walkStepsValidating(nested, seen);
2808
- }
2809
- }
2810
- }
2811
-
2812
- export { Workflow, WorkflowAlreadyRunningError, WorkflowBuilder, WorkflowCompensateNotImplementedError, WorkflowDuplicateStepIdError, WorkflowInputError, WorkflowMaxIterationsExceededError, WorkflowNestedError, WorkflowNotSerializableError, WorkflowOutputError, WorkflowParallelError, WorkflowResumeStepNotFoundError, WorkflowSnapshotNotFoundError, WorkflowStateError, WorkflowToolError, __resetSnapshotStoresForTests, agentStep, cloneWorkflow, fn, workflowAsTool, workflowStep };
1
+ export { Workflow, WorkflowBuilder, WorkflowToolError, agentStep, cloneWorkflow, fn, workflowAsTool, workflowStep } from './chunk-BFWPZMG7.js';
2
+ export { WorkflowAlreadyRunningError, WorkflowCompensateNotImplementedError, WorkflowDuplicateStepIdError, WorkflowInputError, WorkflowMaxIterationsExceededError, WorkflowNestedError, WorkflowNotSerializableError, WorkflowOutputError, WorkflowParallelError, WorkflowResumeStepNotFoundError, WorkflowSnapshotNotFoundError, WorkflowStateError, __resetSnapshotStoresForTests } from './chunk-UVNG67DG.js';
3
+ import './chunk-CAH3G4IS.js';
4
+ import './chunk-4VPXM6UU.js';
5
+ import './chunk-POQT2OIF.js';
6
+ import './chunk-S2BBRVQX.js';
7
+ import './chunk-WLKFWQSJ.js';
8
+ import './chunk-JTFYYKDT.js';
2813
9
  //# sourceMappingURL=workflow.js.map
2814
10
  //# sourceMappingURL=workflow.js.map