@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/workflow/ctx.ts","../src/internal/workflow/error-shape.ts","../src/internal/workflow/executor-helpers.ts","../src/internal/workflow/run-id.ts","../src/internal/workflow/single-flight.ts","../src/internal/workflow/retry-policy.ts","../src/internal/workflow/step-agent.ts","../src/internal/workflow/step-branch.ts","../src/internal/workflow/step-dowhile.ts","../src/internal/workflow/step-fn.ts","../src/internal/workflow/step-foreach.ts","../src/internal/workflow/step-parallel.ts","../src/internal/workflow/step-sleep.ts","../src/internal/workflow/telemetry.ts","../src/internal/workflow/executor.ts"],"names":["WorkflowStateError","WorkflowAlreadyRunningError","UnsupportedRunOperationError","redactSecrets","WorkflowMaxIterationsExceededError","WorkflowCompensateNotImplementedError","createSemaphore","outputs","settled","WorkflowParallelError","getTracer","noopSpan","WorkflowOutputError","WorkflowInputError","getSnapshotStoreFor","WorkflowSnapshotNotFoundError","WorkflowResumeStepNotFoundError"],"mappings":";;;;;;;;;;AAWO,IAAM,yBAAA,GAAN,cAAwC,KAAA,CAAM;AAAA,EAEnD,YAA4B,OAAA,EAAmB;AAC7C,IAAA,KAAA,CAAM,wBAAwB,CAAA;AADJ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAE5B;AAAA,EAF4B,OAAA;AAAA,EADV,IAAA,GAAO,2BAAA;AAI3B,CAAA;AAQO,SAAS,eAAA,CACd,KAAA,EACA,MAAA,EACA,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK;AAAA,MACH,KAAA,EAAO,CAAC,GAAA,EAAK,KAAA,KAAU,KAAK,OAAA,EAAS,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,MACtD,IAAA,EAAM,CAAC,GAAA,EAAK,KAAA,KAAU,KAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,KAAK,CAAA;AAAA,MACpD,IAAA,EAAM,CAAC,GAAA,EAAK,KAAA,KAAU,KAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,KAAK;AAAA,KACtD;AAAA,IACA,OAAA,EAAS,OAAO,OAAA,KAAsB;AACpC,MAAA,MAAM,IAAI,0BAA0B,OAAO,CAAA;AAAA,IAC7C,CAAA;AAAA;AAAA;AAAA,IAGA,IAAI,KAAA,GAAiB;AACnB,MAAA,OAAO,MAAM,QAAA,EAAS;AAAA,IACxB,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,IAAA,KAAwB,KAAA,CAAM,SAAS,IAAI;AAAA,GACxD;AACF;AAEA,SAAS,IAAA,CACP,KAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA,CAAA,CAAA;AAC9B,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,IAAI,UAAU,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,SAC7C,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,KAAK,CAAA;AAAA,EAClC,CAAA,MAAO;AACL,IAAA,IAAI,KAAA,KAAU,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,SACtC,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAAA,EAC3B;AACF;AAMO,SAAS,kBAAkB,OAAA,EAA8D;AAC9F,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAwB,MAAM,MAAS,CAAA;AACrE,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAI,iBAAgB,CAAE,MAAA;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAC,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,IAAA,CAAK,KAAA,CAAM,EAAE,MAAM,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;;;AC3EO,SAAS,WAAW,GAAA,EAAiD;AAC1E,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,IAAI,OAAA,EAAQ;AAAA,EAChD;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAA,CAAO,GAAG,CAAA,EAAE;AAC/C;;;ACWO,SAAS,YAAgB,MAAA,EAA6C;AAC3E,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,KAAA;AAAA,IACX,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAA,EAAS,KAAK,GAAA,EAAI;AAAA,IAClB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,GAAI,OAAO,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,GAAI,EAAC;AAAA,IAC/D,GAAI,OAAO,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI;AAAC,GAC9D;AACF;AAEO,SAAS,QAAA,CACd,IAAA,EACA,KAAA,EACA,SAAA,EACA,aACA,MAAA,EACgB;AAChB,EAAA,OAAO,WAAA,CAAe;AAAA,IACpB,KAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA,EAAQ,WAAA;AAAA,IACR,WAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAc,SAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,SAAS,CAAA;AAAE,GAC1E,CAAA;AACH;AAMO,SAAS,sBAAA,CACd,QACA,KAAA,EACoB;AACpB,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AAIN,IAAA,OAAO,gHAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,MAAA;AAC3B,EAAA,OAAO,OAAO,KAAA,CAAM,MAAA,CACjB,IAAI,CAAC,KAAA,KAAU,GAAG,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtE,KAAK,IAAI,CAAA;AACd;AAGO,SAAS,mBAAA,CAAoB,SAA0B,OAAA,EAAmC;AAC/F,EAAA,IAAI,OAAA,GAAU,OAAA;AACd,EAAA,OAAO;AAAA,IACL,UAAU,MAAM,OAAA;AAAA,IAChB,QAAA,EAAU,CAAC,IAAA,KAAkB;AAC3B,MAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAC/D,MAAA,IAAI,WAAW,MAAA,EAAW,MAAM,IAAIA,oCAAA,CAAmB,OAAA,CAAQ,MAAM,MAAM,CAAA;AAC3E,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,GACF;AACF;;;AC/EO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,CAAA,IAAA,EAAO,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC5E;;;ACSA,IAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,SAAS,GAAA,CAAI,YAAoB,KAAA,EAAuB;AACtD,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC/B;AAOO,SAAS,mBAAA,CACd,UAAA,EACA,KAAA,EACA,YAAA,EACgB;AAChB,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,EAAY,KAAK,CAAA;AAC/B,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG;AACnB,IAAA,MAAM,IAAIC,6CAAA,CAA4B,YAAA,EAAc,KAAK,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,EAAE,UAAA,EAAY,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,SAAS,MAAM;AACb,MAAA,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,IACnB;AAAA,GACF;AACF;;;ACpCA,IAAM,qBAAA,GAAwB,CAAC,YAAA,EAAc,+BAAA,EAAiC,oBAAoB,CAAA;AAUlG,SAAS,wBAAwB,MAAA,EAAoC;AACnE,EAAA,OAAO;AAAA,IACL,KAAK,MAAA,CAAO,WAAA;AAAA,IACZ,IAAA,EAAM,OAAO,gBAAA,IAAoB,GAAA;AAAA,IACjC,IAAA,EAAM,OAAO,kBAAA,IAAsB,CAAA;AAAA,IACnC,GAAA,EAAK,OAAO,gBAAA,IAAoB,GAAA;AAAA,IAChC,YAAA,EAAc,IAAI,GAAA,CAAI,MAAA,CAAO,sBAAsB,qBAAqB;AAAA,GAC1E;AACF;AAEA,SAAS,eAAe,MAAA,EAA2B;AACjD,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,IAAI,YAAA,CAAa,MAAA,CAAO,OAAO,MAAA,IAAU,SAAS,GAAG,YAAY,CAAA;AAAA,EACzE;AACF;AAEA,SAAS,aAAA,CAAc,GAAA,EAAc,OAAA,EAAiB,GAAA,EAA6B;AACjF,EAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,IAAA,GAAO,OAAA;AAClD,EAAA,OAAO,IAAI,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,YAAY,GAAA,CAAI,GAAA;AAC1D;AAEA,eAAe,OAAA,CACb,EAAA,EACA,OAAA,EACA,GAAA,EACA,MAAA,EAC6D;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,EAAG;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAQ;AAAA,EACpC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,aAAA,CAAc,GAAA,EAAK,OAAA,EAAS,GAAG,GAAG,MAAM,GAAA;AAC5C,IAAA,MAAM,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,IAAA,KAAS,OAAA,GAAU,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,CAAA,EAAG,MAAM,CAAA;AACpF,IAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AAAA,EACzB;AACF;AAEA,eAAsB,SAAA,CACpB,EAAA,EACA,MAAA,EACA,MAAA,EACyC;AACzC,EAAA,MAAM,GAAA,GAAM,wBAAwB,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,IAAW,GAAA,CAAI,GAAA,EAAK,WAAW,CAAA,EAAG;AACtD,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,EAAA,EAAI,OAAA,EAAS,KAAK,MAAM,CAAA;AACrD,IAAA,IAAI,OAAA,IAAW,QAAQ,OAAO,MAAA;AAAA,EAChC;AAEA,EAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAClE;AAEA,eAAsB,cAAA,CAAe,IAAY,MAAA,EAAoC;AACnF,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,IAAI,YAAA,CAAa,MAAA,CAAO,OAAO,MAAA,IAAU,SAAS,GAAG,YAAY,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,OAAA,EAAQ;AACR,MAAA,OAAA,EAAQ;AAAA,IACV,GAAG,EAAE,CAAA;AACL,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,aAAa,MAAA,CAAO,MAAA,CAAO,UAAU,SAAS,CAAA,EAAG,YAAY,CAAC,CAAA;AAAA,IAC3E,CAAA;AACA,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;;;AC5EA,eAAsB,YAAA,CACpB,IAAA,EACA,KAAA,EACA,GAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,OAAA;AAC3B,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC5D,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,UAAA;AAAA,QACL,IAAIC,8CAAA;AAAA,UACF,CAAA,oEAAA,EACa,OAAO,CAAA,SAAA,EAAY,IAAA,CAAK,EAAE,CAAA,CAAA,CAAA;AAAA,UACvC;AAAA;AACF;AACF,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GACE,OAAO,KAAK,cAAA,KAAmB,QAAA,GAAW,KAAK,cAAA,GAAiB,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,EAC7F,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,WAAW,GAAG;AAAA,KACvB;AAAA,EACF;AACA,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,EAAG;AACrD,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,UAAA;AAAA,QACL,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,EAAE,CAAA,6CAAA,CAA+C;AAAA;AAChF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,YAA6B;AAExC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,MAC3B,MAAA;AAAA,MACA,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAO,GAAI;AAAA,KACxD;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,EAAK;AAC9B,IAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,MAAA,OAAO,OAAO,MAAA,IAAU,EAAA;AAAA,IAC1B;AACA,IAAA,IAAI,MAAA,CAAO,WAAW,OAAA,EAAS;AAC7B,MAAA,MAAO,MAAA,CAA6B,KAAA,IAAS,IAAI,KAAA,CAAM,oBAAoB,CAAA;AAAA,IAC7E;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7D,CAAA;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAO,QAAA,EAAS,GACtB,KAAK,KAAA,KAAU,KAAA,CAAA,GACX,MAAM,SAAA,CAAU,IAAA,EAAM,KAAK,KAAA,EAAO,GAAA,CAAI,MAAM,CAAA,GAC5C,EAAE,OAAO,MAAM,IAAA,EAAK,EAAG,QAAA,EAAU,CAAA,EAAE;AACzC,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,SAAS,GAAA,EAAK;AAEZ,IAAA,IAAI,GAAA,YAAe,2BAA2B,MAAM,GAAA;AACpD,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,WAAW,GAAG;AAAA,KACvB;AAAA,EACF;AACF;;;AC1FA,eAAsB,cACpB,IAAA,EACA,KAAA,EACA,GAAA,EACA,OAAA,EACA,iBACA,QAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,EAAG;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC9B,IAAA,MAAM,CAAC,SAAA,EAAW,MAAM,CAAA,GAAI,IAAA;AAE5B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAClD,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,OAAA,CAAQ,IAAA;AAAA,QACNC,+BAAA;AAAA,UACE,sBAAsB,IAAA,CAAK,EAAE,CAAA,YAAA,EAAe,CAAC,iCAAiC,OAAO,CAAA;AAAA;AACvF,OACF;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,CAAA,GAAI,MAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAO,GAAA,EAAK,OAAA,EAAS,iBAAiB,QAAQ,CAAA;AACvF,MAAA,OAAO;AAAA,QACL,GAAG,CAAA;AAAA,QACH,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,IAAA,MAAM,CAAA,GAAI,MAAM,gBAAA,CAAiB,IAAA,CAAK,UAAU,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,eAAA,EAAiB,QAAQ,CAAA;AAC9F,IAAA,OAAO;AAAA,MACL,GAAG,CAAA;AAAA,MACH,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KAC3B;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,eAAe,iBACb,MAAA,EACA,KAAA,EACA,GAAA,EACA,OAAA,EACA,iBACA,QAAA,EACqB;AACrB,EAAA,IAAI,GAAA,GAAe,KAAA;AACnB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,IAAI,MAAM,QAAA,CAAS,OAAO,GAAA,EAAK,GAAA,EAAK,SAAS,eAAe,CAAA;AAClE,IAAA,YAAA,GAAe,CAAA,CAAE,QAAA;AACjB,IAAA,IAAI,CAAA,CAAE,WAAW,QAAA,EAAU;AACzB,MAAA,OAAO;AAAA,QACL,QAAQ,KAAA,CAAM,EAAA;AAAA,QACd,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,OAAO,CAAA,CAAE,KAAA,IAAS,WAAW,IAAI,KAAA,CAAM,0BAA0B,CAAC;AAAA,OACpE;AAAA,IACF;AACA,IAAA,GAAA,GAAM,CAAA,CAAE,MAAA;AAAA,EACV;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,YAAA;AAAA,IACV,UAAA,EAAY,CAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,GACV;AACF;;;AC7FA,eAAsB,eACpB,IAAA,EACA,KAAA,EACA,GAAA,EACA,OAAA,EACA,iBACA,QAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAK,aAAA,IAAiB,GAAA;AACtC,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,OAAO,UAAA,CAAW,IAAIC,qDAAmC,IAAA,CAAK,EAAA,EAAI,OAAO,CAAC;AAAA,OAC5E;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,GAAA,EAAK,GAAA,EAAK,SAAS,eAAe,CAAA;AACtE,IAAA,IAAI,CAAA,CAAE,WAAW,QAAA,EAAU;AACzB,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,UAAU,CAAA,GAAI,CAAA;AAAA,QACd,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,OAAO,CAAA,CAAE;AAAA,OACX;AAAA,IACF;AACA,IAAA,GAAA,GAAM,CAAA,CAAE,MAAA;AACR,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI;AACF,MAAA,cAAA,GAAiB,MAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,MAAA,CAAO,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IAC5D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,KAAA,EAAO,WAAW,GAAG;AAAA,OACvB;AAAA,IACF;AACA,IAAA,IAAI,CAAC,cAAA,EAAgB;AAAA,EACvB;AACA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,GACV;AACF;;;AC5DA,SAAS,cAAA,CACP,MAAA,EACA,QAAA,EACA,SAAA,EACA,GAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA;AAAA,IACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,KAAA,EAAO,WAAW,GAAG;AAAA,GACvB;AACF;AAEA,SAAS,QAAA,CAAS,QAAwD,KAAA,EAAyB;AACjG,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAClB,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,aAAA,CACb,IAAA,EACA,KAAA,EACA,GAAA,EAC+C;AAC/C,EAAA,MAAM,IAAA,GAAO,YAA8B,IAAA,CAAK,EAAA,CAAG,OAAO,GAAG,CAAA;AAC7D,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW,OAAO,UAAU,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,MAAM,CAAA;AAC3E,EAAA,OAAO,EAAE,KAAA,EAAO,MAAM,IAAA,EAAK,EAAG,UAAU,CAAA,EAAE;AAC5C;AAEA,eAAsB,SAAA,CACpB,IAAA,EACA,KAAA,EACA,GAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,IAAA,OAAO,cAAA;AAAA,MACL,IAAA,CAAK,EAAA;AAAA,MACL,CAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAIC,uDAAA,CAAsC,IAAA,CAAK,EAAE;AAAA,KACnD;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,EAClC,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,WAAW,GAAG,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAO,QAAA,EAAS,GAAI,MAAM,aAAA,CAAc,IAAA,EAAM,OAAO,GAAG,CAAA;AAChE,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO,cAAA,CAAe,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,WAAW,GAAG,CAAA;AAAA,IACzD;AACA,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,2BAA2B,MAAM,GAAA;AACpD,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,EAAA,EAAI,CAAA,EAAG,WAAW,GAAG,CAAA;AAAA,EAClD;AACF;;;ACpEA,eAAsB,eACpB,IAAA,EACA,MAAA,EACA,GAAA,EACA,OAAA,EACA,iBACA,QAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,KAAK,YAAY,CAAA;AAC/E,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,UAAA;AAAA,QACL,IAAI,KAAA;AAAA,UACF,CAAA,sBAAA,EAAyB,KAAK,YAAY,CAAA,iKAAA;AAAA;AAG5C;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,YAAA,CAAa,MAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,UAAA;AAAA,QACL,IAAI,KAAA;AAAA,UACF,CAAA,sBAAA,EAAyB,IAAA,CAAK,YAAY,CAAA,4BAAA,EAA+B,OAAO,KAAK,CAAA,CAAA;AAAA;AACvF;AACF,KACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,QAAQ;AAAC,KACX;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,CAAA;AACxC,EAAA,MAAM,GAAA,GAAMC,iCAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAC5E,EAAA,MAAM,WAAoB,EAAC;AAC3B,EAAA,MAAM,OAAA,GAAqB,IAAI,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAEjD,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,EAAM,GAAA,KAAQ;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,OAAA,EAAQ;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,IAAA,EAAM,GAAA,EAAK,SAAS,eAAe,CAAA;AACvE,QAAA,IAAI,CAAA,CAAE,WAAW,QAAA,EAAU;AACzB,UAAA,QAAA,CAAS,IAAA,CAAK,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,SAAA,EAAY,CAAA,CAAE,KAAA,EAAO,OAAA,IAAW,SAAS,CAAA,CAAE,CAAC,CAAA;AAAA,QACzF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAG,IAAI,CAAA,CAAE,MAAA;AAAA,QACnB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,UAAA;AAAA,QACL,IAAI,eAAe,QAAA,EAAU,CAAA,SAAA,EAAY,KAAK,EAAE,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,CAAA,WAAA,CAAa;AAAA;AACvF,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,GACV;AACF;;;ACnFA,eAAsB,gBACpB,IAAA,EACA,KAAA,EACA,GAAA,EACA,OAAA,EACA,kBACA,QAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,WAAA,IAAe,WAAA;AACnC,EAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,MAAA;AAGlC,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,QAAQ;AAAC,KACX;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,WAAA;AACxC,EAAA,MAAM,GAAA,GAAMA,iCAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,WAAA,EAAa,WAAW,CAAC,CAAC,CAAA;AAG3E,EAAA,MAAM,YAAA,GAAe,MAAA,KAAW,WAAA,GAAc,IAAI,iBAAgB,GAAI,MAAA;AACtE,EAAA,MAAM,YAAA,GACJ,WAAW,WAAA,GAAc,YAAA,CAAa,IAAI,MAAA,EAAQ,YAAA,CAAc,MAAM,CAAA,GAAI,GAAA,CAAI,MAAA;AAIhF,EAAA,MAAM,oBAAoB,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,QAAQ,SAAA,KAAc;AACvE,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,OAAA,EAAQ;AAClC,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAA;AAAA,QACX,MAAA;AAAA,QACA,KAAA;AAAA,QACA,EAAE,GAAG,GAAA,EAAK,MAAA,EAAQ,YAAA,EAAa;AAAA,QAC/B,OAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,IAAI;AACF,MAAA,MAAMC,QAAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,WAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,MAAA,EAAQA;AAAA,OACV;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,YAAA,EAAc,MAAM,GAAG,CAAA;AAEvB,MAAA,MAAMC,QAAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,iBAAiB,CAAA;AAC1D,MAAA,MAAM,MAAA,GAASA,SACZ,MAAA,CAAO,CAAC,MAAkC,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CACjE,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,MAAA,YAAkB,KAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,MAAM,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAE,CAAA;AAClF,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,OAAO,UAAA,CAAW,IAAIC,wCAAsB,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,QAC5D,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,iBAAiB,CAAA;AAC1D,EAAA,MAAM,UAAU,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,CAAA,KAC3B,CAAA,CAAE,WAAW,WAAA,GACT,EAAE,IAAI,IAAA,EAAe,KAAA,EAAO,EAAE,KAAA,EAAM,GACpC,EAAE,EAAA,EAAI,KAAA,EAAgB,OAAO,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAAE,GACxD;AACA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,GACV;AACF;AAEA,eAAe,UACb,MAAA,EACA,KAAA,EACA,GAAA,EACA,OAAA,EACA,UACA,SAAA,EACkB;AAClB,EAAA,IAAI,GAAA,GAAe,KAAA;AACnB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,KAAA,EAAO,KAAK,GAAA,EAAK,OAAA,EAAS,EAAE,CAAA;AACrD,IAAA,IAAI,CAAA,CAAE,WAAW,QAAA,EAAU;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,SAAS,CAAA,OAAA,EAAU,KAAA,CAAM,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,KAAA,EAAO,OAAA,IAAW,SAAS,CAAA;AAAA,OAC1F;AAAA,IACF;AACA,IAAA,GAAA,GAAM,CAAA,CAAE,MAAA;AAAA,EACV;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CAAa,GAAgB,CAAA,EAA6B;AACjE,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,EAAA,IAAI,CAAA,CAAE,SAAS,OAAO,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,EAAA,MAAM,QAAA,GAAW,MAAY,IAAA,CAAK,KAAA,CAAM,EAAE,MAAM,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,MAAY,IAAA,CAAK,KAAA,CAAM,EAAE,MAAM,CAAA;AAChD,EAAA,CAAA,CAAE,iBAAiB,OAAA,EAAS,QAAA,EAAU,EAAE,IAAA,EAAM,MAAM,CAAA;AACpD,EAAA,CAAA,CAAE,iBAAiB,OAAA,EAAS,QAAA,EAAU,EAAE,IAAA,EAAM,MAAM,CAAA;AACpD,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;;;ACvJA,eAAsB,YAAA,CACpB,IAAA,EACA,KAAA,EACA,GAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,GAAA,CAAI,MAAM,CAAA;AAChD,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,MAAA,EAAQ;AAAA;AAAA,KACV;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACzB,KAAA,EAAO,WAAW,GAAG;AAAA,KACvB;AAAA,EACF;AACF;;;ACtBA,IAAM,WAAA,GAAc,uBAAA;AAEb,SAAS,qBAAqB,IAAA,EAAyD;AAC5F,EAAA,MAAM,MAAA,GAASC,4BAAU,WAAW,CAAA;AACpC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAOC,0BAAA;AACjC,EAAA,OAAO,MAAA,CAAO,UAAU,cAAA,EAAgB;AAAA,IACtC,UAAA,EAAY;AAAA,MACV,iBAAiB,IAAA,CAAK,YAAA;AAAA,MACtB,mBAAmB,IAAA,CAAK;AAAA;AAC1B,GACD,CAAA;AACH;AAEO,SAAS,sBAAsB,IAAA,EAIzB;AACX,EAAA,MAAM,MAAA,GAASD,4BAAU,WAAW,CAAA;AACpC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAOC,0BAAA;AACjC,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI;AAAA,IACtD,UAAA,EAAY;AAAA,MACV,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,aAAa,IAAA,CAAK,IAAA;AAAA,MAClB,gBAAgB,IAAA,CAAK;AAAA;AACvB,GACD,CAAA;AACH;;;ACSA,eAAe,aAAA,CACb,KACA,GAAA,EAY4B;AAC5B,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,CAAa;AAAA,MACjB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAA,EAAc,IAAI,OAAA,CAAQ,IAAA;AAAA,MAC1B,aAAA,EAAe,IAAI,IAAA,CAAK,EAAA;AAAA,MACxB,kBAAkB,GAAA,CAAI,OAAA;AAAA,MACtB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,kBAAkB,GAAA,CAAI,GAAA;AAAA,MACtB,KAAA,EAAO,IAAI,OAAA,CAAQ,KAAA;AAAA;AAAA,MACnB,SAAS,GAAA,CAAI;AAAA,KACd,CAAA;AAAA,EACH,SAAS,OAAA,EAAS;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,YAAA,CAAa,aAAA,EAAe,QAAQ,CAAA;AACjD,IAAA,GAAA,CAAI,SAAS,GAAA,EAAI;AACjB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,KAAK,WAAA,CAAe;AAAA,QAClB,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAA,EAAQ,QAAA;AAAA,QACR,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,KAAA,EAAO,WAAW,OAAO;AAAA,OAC1B;AAAA,KACH;AAAA,EACF;AACA,EAAA,GAAA,CAAI,QAAA,CAAS,YAAA,CAAa,aAAA,EAAe,WAAW,CAAA;AACpD,EAAA,GAAA,CAAI,SAAS,GAAA,EAAI;AACjB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,KAAK,WAAA,CAAe;AAAA,MAClB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAA,EAAQ,WAAA;AAAA,MACR,WAAA,EAAa;AAAA,QACX,GAAG,GAAA,CAAI,WAAA;AAAA,QACP;AAAA,UACE,MAAA,EAAQ,IAAI,IAAA,CAAK,EAAA;AAAA,UACjB,IAAA,EAAM,IAAI,IAAA,CAAK,IAAA;AAAA,UACf,MAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,CAAA;AAAA,UACV,UAAA,EAAY,CAAA;AAAA,UACZ,MAAA,EAAQ;AAAA;AACV,OACF;AAAA,MACA,WAAW,GAAA,CAAI;AAAA,KAChB;AAAA,GACH;AACF;AAEA,eAAe,WAAc,IAAA,EAS+D;AAC1F,EAAA,MAAM,WAAW,qBAAA,CAAsB;AAAA,IACrC,MAAA,EAAQ,KAAK,IAAA,CAAK,EAAA;AAAA,IAClB,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,IAChB,OAAA,EAAS;AAAA,GACV,CAAA;AACD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAAA,EAC3F,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,eAAe,yBAAA,EAA2B;AAC5C,MAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAiB,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA;AACpF,MAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,IAC9C;AACA,IAAA,MAAA,GAAS;AAAA,MACP,MAAA,EAAQ,KAAK,IAAA,CAAK,EAAA;AAAA,MAClB,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,MAChB,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,CAAA;AAAA,MACZ,KAAA,EAAO,WAAW,GAAG;AAAA,KACvB;AAAA,EACF;AACA,EAAA,QAAA,CAAS,YAAA,CAAa,aAAA,EAAe,MAAA,CAAO,MAAM,CAAA;AAClD,EAAA,QAAA,CAAS,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,QAAQ,CAAA;AACtD,EAAA,QAAA,CAAS,GAAA,EAAI;AACb,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAC9B;AAiBA,SAAS,iBAAA,CACP,OAAA,EACA,IAAA,EACA,IAAA,EACA,WAAA,EACkD;AAClD,EAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAI/B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAA,KAAW,WAAA,EAAa;AACtC,MAAA,WAAA,GAAc,EAAE,IAAA,EAAM,oBAAA,EAAsB,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,EAAI;AAAA,EACjC;AACA,EAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AACpC,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACtC,IAAA,WAAA,GAAc;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,KAAA,EAAO,QAAQ,MAAA,CAAO,KAAA,IAAS,EAAE,IAAA,EAAM,mBAAA,EAAqB,SAAS,aAAA;AAAc,KACpF,CAAA;AACD,IAAA,OAAO;AAAA,MACL,UAAU,WAAA,CAAgB;AAAA,QACxB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,QAAA;AAAA,QACR,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAA,EAAO,QAAQ,MAAA,CAAO;AAAA,OACvB;AAAA,KACH;AAAA,EACF;AACA,EAAA,WAAA,GAAc,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA,EAAQ,IAAA,CAAK,IAAI,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,CAAA;AACxF,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAO;AACtC;AAEA,eAAe,aAAiB,MAAA,EAA8C;AAC5E,EAAA,MAAM,EAAE,SAAS,KAAA,EAAO,GAAA,EAAK,OAAO,SAAA,EAAW,MAAA,EAAQ,aAAY,GAAI,MAAA;AAEvE,EAAA,MAAM,cAA4B,CAAC,GAAI,MAAA,CAAO,kBAAA,IAAsB,EAAG,CAAA;AACvE,EAAA,MAAM,OAAO,EAAE,WAAA,EAAa,OAAO,IAAA,EAAM,OAAA,CAAQ,MAAM,SAAA,EAAU;AACjE,EAAA,IAAI,MAAe,MAAA,CAAO,KAAA;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,MAAA,CAAO,SAAS,OAAO,QAAA,CAAa,QAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,MAAM,CAAA;AAC3F,IAAA,WAAA,GAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAe;AAAA,MACnC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd;AAAA,KACD,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAsB,OAAA,EAAS,IAAA,EAAM,MAAM,WAAW,CAAA;AACtE,IAAA,IAAI,UAAA,IAAc,OAAA,EAAS,OAAO,OAAA,CAAQ,QAAA;AAC1C,IAAA,GAAA,GAAM,OAAA,CAAQ,GAAA;AAAA,EAChB;AAEA,EAAA,MAAM,YAAA,GAAe,sBAAA,CAAuB,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAA;AACrE,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,OAAO,WAAA,CAAgB;AAAA,MACrB,KAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAA,EAAQ,QAAA;AAAA,MACR,WAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAO,UAAA,CAAW,IAAIC,sCAAoB,OAAA,CAAQ,IAAA,EAAM,YAAY,CAAC;AAAA,KACtE,CAAA;AAAA,EACH;AACA,EAAA,WAAA,GAAc,EAAE,IAAA,EAAM,oBAAA,EAAsB,CAAA;AAC5C,EAAA,OAAO,WAAA,CAAgB;AAAA,IACrB,KAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,GAAA;AAAA,IACR,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAaA,eAAsB,eAAA,CACpB,OAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EAC+B;AAC/B,EAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,SAAA,EAAU;AAC1C,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA,OAAA,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,UAAA,EAAY,KAAA,EAAO,QAAQ,IAAI,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,OAAA,EAAS,MAAA,EAAQ,OAAO,MAAM,CAAA;AAC5D,EAAA,MAAM,UAAU,oBAAA,CAAqB,EAAE,cAAc,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAE1E,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,OAAA,CAAQ,YAAA,CAAa,mBAAmB,WAAW,CAAA;AACnD,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,OAAO,SAAkB,OAAA,CAAQ,IAAA,EAAM,OAAO,SAAA,EAAW,IAAI,MAAM,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA;AAEjB,EAAA,MAAM,cACJ,QAAA,EAAU,aAAA,KAAkB,MAAA,GAAY,QAAA,CAAS,gBAAgB,OAAA,CAAQ,YAAA;AAC3E,EAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAChE,EAAA,MAAM,GAAA,GAAmB,eAAA,CAAgB,KAAA,EAAO,MAAA,EAAQ,eAAe,CAAA;AACvE,EAAA,IAAI;AAEF,IAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,OAAA,CAAQ,WAAA,EAAa,KAAK,CAAA;AACrE,IAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC7B,MAAA,OAAO,WAAA,CAAqB;AAAA,QAC1B,KAAA;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAA,EAAQ,QAAA;AAAA,QACR,aAAa,EAAC;AAAA,QACd,SAAA;AAAA,QACA,OAAO,UAAA,CAAW,IAAIC,qCAAmB,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAC;AAAA,OACpE,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,cACJ,WAAA,KAAgB,KAAA,CAAA,GACZ,uBAAuB,OAAA,CAAQ,WAAA,EAAa,WAAW,CAAA,GACvD,KAAA,CAAA;AACN,IAAA,IAAI,gBAAgB,KAAA,CAAA,EAAW;AAC7B,MAAA,OAAO,WAAA,CAAqB;AAAA,QAC1B,KAAA;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,MAAA,EAAQ,QAAA;AAAA,QACR,aAAa,EAAC;AAAA,QACd,SAAA;AAAA,QACA,OAAO,UAAA,CAAW,IAAIb,qCAAmB,OAAA,CAAQ,IAAA,EAAM,WAAW,CAAC;AAAA,OACpE,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAM,YAAA,CAAsB;AAAA,MACjC,OAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAI,UAAU,kBAAA,KAAuB,KAAA,CAAA,GACjC,EAAE,kBAAA,EAAoB,QAAA,CAAS,kBAAA,EAAmB,GAClD,EAAC;AAAA,MACL,GAAI,UAAU,WAAA,KAAgB,KAAA,CAAA,GAAY,EAAE,WAAA,EAAa,QAAA,CAAS,WAAA,EAAY,GAAI;AAAC,KACpF,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,IAAA,MAAA,CAAO,OAAA,EAAQ;AAAA,EACjB;AACF;AAKA,eAAsB,YAAA,CACpB,IAAA,EACA,KAAA,EACA,GAAA,EACA,SACA,eAAA,EACqB;AACrB,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,IAAA;AACH,MAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAAA,IACnC,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAAA,IACtC,KAAK,UAAA;AACH,MAAA,OAAO,gBAAgB,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,iBAAiB,YAAY,CAAA;AAAA,IACjF,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,iBAAiB,YAAY,CAAA;AAAA,IAC/E,KAAK,SAAA;AACH,MAAA,OAAO,eAAe,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,iBAAiB,YAAY,CAAA;AAAA,IAChF,KAAK,SAAA;AACH,MAAA,OAAO,eAAe,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,OAAA,EAAS,iBAAiB,YAAY,CAAA;AAAA,IAChF,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAAA,IACtC,KAAK,SAAA;AAEH,MAAA,MAAM,IAAI,0BAA0B,MAAS,CAAA;AAAA,IAC/C,SAAS;AACP,MAAA,MAAM,WAAA,GAAqB,IAAA;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAuB,WAAA,CAAqB,IAAI,CAAA,CAAE,CAAA;AAAA,IACpE;AAAA;AAEJ;AAcA,eAAe,aAAa,CAAA,EAAkC;AAC5D,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,cAAA,EAAgB,CAAA;AAAA;AAAA,IAChB,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,cAAc,CAAA,CAAE,YAAA;AAAA,IAChB,eAAe,CAAA,CAAE,aAAA;AAAA,IACjB,kBAAkB,CAAA,CAAE,gBAAA;AAAA,IACpB,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,kBAAkB,CAAA,CAAE,gBAAA;AAAA,IACpB,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA,IAClD,WAAA,EAAa,KAAK,GAAA;AAAI,GACxB;AACA,EAAA,MAAM,KAAA,GAAQc,qCAAA,CAAoB,CAAA,CAAE,OAAO,CAAA;AAC3C,EAAA,MAAM,KAAA,CAAM,KAAK,QAAQ,CAAA;AAC3B;AAIA,eAAsB,eAAmB,IAAA,EAAuD;AAO9F,EAAA,MAAM,aAAa,IAAA,CAAK,QAAA;AAKxB,EAAA,MAAM,UAAU,UAAA,CAAW,SAAA;AAC3B,EAAA,MAAM,QAAQ,UAAA,CAAW,OAAA;AACzB,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW;AAChD,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,KAAA,GAAQA,sCAAoB,OAAO,CAAA;AACzC,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AAC5C,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,MAAM,IAAIC,+CAAA,CAA8B,IAAA,CAAK,KAAK,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,SAAS,aAAa,CAAA;AACtE,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,IAAIC,iDAAA,CAAgC,QAAA,CAAS,aAAA,EAAe,SAAS,YAAY,CAAA;AAAA,EACzF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,OAAO,CAAA;AACjC,EAAA,IACE,gBAAgB,MAAA,IAChB,WAAA,CAAY,SAAS,SAAA,IACrB,WAAA,CAAY,kBAAkB,MAAA,EAC9B;AACA,IAAA,WAAA,CAAY,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9C;AAOA,EAAA,MAAM,cAAc,IAAA,CAAK,OAAA,KAAY,MAAA,GAAY,IAAA,CAAK,UAAU,QAAA,CAAS,gBAAA;AACzE,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA;AAG9C,EAAA,MAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAE7B,EAAA,OAAO,eAAA,CAA6B,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa;AAAA,IACxE,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK,KAAA;AAAA;AAAA,IAEZ,oBAAoB,QAAA,CAAS,WAAA;AAAA;AAAA;AAAA,IAG7B,GAAI,SAAS,KAAA,KAAU,MAAA,GAAY,EAAE,aAAA,EAAe,QAAA,CAAS,KAAA,EAAM,GAAI;AAAC,GACtD,CAAA;AACtB","file":"executor-Y4MKPIUD.cjs","sourcesContent":["/**\n * Build the `StepContext` passed to every step.fn. The `suspend` method\n * throws a `WorkflowSuspendedSentinel` (defined here) that the executor\n * catches to persist a snapshot (D236).\n *\n * @internal\n */\n\nimport type { StepContext } from \"../../types/workflow.js\";\n\n/** Sentinel thrown by `ctx.suspend()`; only the executor catches it. */\nexport class WorkflowSuspendedSentinel extends Error {\n override readonly name = \"WorkflowSuspendedSentinel\";\n constructor(public readonly payload?: unknown) {\n super(\"__workflow_suspended__\");\n }\n}\n\n/** SE29 — the per-run shared-state seam wired into `StepContext.state`/`setState`. */\nexport interface StateController {\n getState: () => unknown;\n setState: (next: unknown) => void;\n}\n\nexport function makeStepContext(\n runId: string,\n signal: AbortSignal,\n state: StateController,\n): StepContext {\n return {\n runId,\n signal,\n log: {\n debug: (msg, attrs) => emit(\"debug\", runId, msg, attrs),\n info: (msg, attrs) => emit(\"info\", runId, msg, attrs),\n warn: (msg, attrs) => emit(\"warn\", runId, msg, attrs),\n },\n suspend: async (payload?: unknown) => {\n throw new WorkflowSuspendedSentinel(payload);\n },\n // SE29 — read reflects the current shared state; write goes through the\n // controller (which validates against `stateSchema`).\n get state(): unknown {\n return state.getState();\n },\n setState: (next: unknown): void => state.setState(next),\n };\n}\n\nfunction emit(\n level: \"debug\" | \"info\" | \"warn\",\n runId: string,\n msg: string,\n attrs?: Record<string, unknown>,\n): void {\n const tag = `[workflow ${runId}]`;\n if (attrs !== undefined) {\n if (level === \"warn\") console.warn(tag, msg, attrs);\n else console.log(tag, msg, attrs);\n } else {\n if (level === \"warn\") console.warn(tag, msg);\n else console.log(tag, msg);\n }\n}\n\n/**\n * Combine the caller-supplied signal with the flight signal so abort on\n * either side cancels the workflow run.\n */\nexport function combineSignals(...signals: ReadonlyArray<AbortSignal | undefined>): AbortSignal {\n const valid = signals.filter((s): s is AbortSignal => s !== undefined);\n if (valid.length === 0) return new AbortController().signal;\n if (valid.length === 1) return valid[0]!;\n const ctrl = new AbortController();\n for (const s of valid) {\n if (s.aborted) {\n ctrl.abort(s.reason);\n break;\n }\n s.addEventListener(\"abort\", () => ctrl.abort(s.reason), { once: true });\n }\n return ctrl.signal;\n}\n","/**\n * Helper to normalize unknown thrown values to `{ name, message }` shape\n * for use in `StepResult.error` / `WorkflowRun.error`.\n *\n * @internal\n */\n\nexport function errToShape(err: unknown): { name: string; message: string } {\n if (err instanceof Error) {\n return { name: err.name, message: err.message };\n }\n return { name: \"Error\", message: String(err) };\n}\n","/**\n * Pure helpers extracted from the workflow executor (G8 focus): run assembly,\n * abort, whole-workflow schema validation (SE27), and the shared-state\n * controller (SE29). No executor-internal dependencies — safe to import both ways.\n *\n * @internal\n */\n\nimport type { ZodType } from \"zod\";\nimport type { StepResult, WorkflowOptions, WorkflowRun } from \"../../types/workflow.js\";\nimport { WorkflowStateError } from \"../../types/workflow.js\";\nimport type { StateController } from \"./ctx.js\";\n\nexport interface AssembleParams<TO> {\n runId: string;\n name: string;\n status: WorkflowRun[\"status\"];\n stepResults: ReadonlyArray<StepResult>;\n startedAt: number;\n output?: TO;\n error?: { name: string; message: string };\n}\n\nexport function assembleRun<TO>(params: AssembleParams<TO>): WorkflowRun<TO> {\n return {\n id: params.runId,\n name: params.name,\n status: params.status,\n startedAt: params.startedAt,\n endedAt: Date.now(),\n stepResults: params.stepResults,\n ...(params.output !== undefined ? { output: params.output } : {}),\n ...(params.error !== undefined ? { error: params.error } : {}),\n };\n}\n\nexport function abortRun<T>(\n name: string,\n runId: string,\n startedAt: number,\n stepResults: StepResult[],\n signal: AbortSignal,\n): WorkflowRun<T> {\n return assembleRun<T>({\n runId,\n name,\n status: \"cancelled\",\n stepResults,\n startedAt,\n error: { name: \"AbortError\", message: String(signal.reason ?? \"Aborted\") },\n });\n}\n\n/**\n * SE27 — validate a value against a whole-workflow schema. Returns a compact\n * issues string on failure, `undefined` when the schema is absent or matches.\n */\nexport function validateWorkflowSchema(\n schema: ZodType | undefined,\n value: unknown,\n): string | undefined {\n if (schema === undefined) return undefined;\n let parsed: ReturnType<ZodType[\"safeParse\"]>;\n try {\n parsed = schema.safeParse(value);\n } catch {\n // A schema with an async refinement throws synchronously from safeParse\n // (\"Encountered Promise during synchronous parse\"). Surface it as a\n // validation issue (→ status:\"failed\") instead of escaping run() (never-throw).\n return \"schema uses async refinements, which whole-workflow validation does not support (use a synchronous Zod schema)\";\n }\n if (parsed.success) return undefined;\n return parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n}\n\n/** SE29 — the per-run shared-state holder; `setState` validates against `stateSchema`. */\nexport function makeStateController(options: WorkflowOptions, initial: unknown): StateController {\n let current = initial;\n return {\n getState: () => current,\n setState: (next: unknown) => {\n const issues = validateWorkflowSchema(options.stateSchema, next);\n if (issues !== undefined) throw new WorkflowStateError(options.name, issues);\n current = next;\n },\n };\n}\n","/**\n * Generate a short, deterministic workflow run identifier.\n *\n * Format: `wfr-<8 hex chars>`. Used for span keys, snapshot filenames, and\n * single-flight registry keys.\n *\n * @internal\n */\n\nexport function mintRunId(): string {\n return `wfr-${globalThis.crypto.randomUUID().replace(/-/g, \"\").slice(0, 8)}`;\n}\n","/**\n * Single-flight registry for in-flight workflow runs (ADR D242).\n *\n * Key = `${workflowId}:${runId}`. Throws `WorkflowAlreadyRunningError` on\n * duplicate. Process crash auto-releases (in-memory map). Pattern mirrors\n * `internal/eval/single-flight.ts` (D213).\n *\n * EC-5 absorbed: lock uses `workflowId` (minted at `.commit()`), not the\n * user-supplied `name`, so two `Workflow` instances sharing a name don't\n * collide on each other's locks.\n *\n * @internal\n */\n\nimport { WorkflowAlreadyRunningError } from \"../../types/workflow.js\";\n\ninterface Flight {\n controller: AbortController;\n}\n\nconst registry = new Map<string, Flight>();\n\nfunction key(workflowId: string, runId: string): string {\n return `${workflowId}:${runId}`;\n}\n\nexport interface AcquiredFlight {\n signal: AbortSignal;\n release: () => void;\n}\n\nexport function acquireSingleFlight(\n workflowId: string,\n runId: string,\n workflowName: string,\n): AcquiredFlight {\n const k = key(workflowId, runId);\n if (registry.has(k)) {\n throw new WorkflowAlreadyRunningError(workflowName, runId);\n }\n const controller = new AbortController();\n registry.set(k, { controller });\n return {\n signal: controller.signal,\n release: () => {\n registry.delete(k);\n },\n };\n}\n","/**\n * Retry wrapper with exponential backoff (ADR D237).\n *\n * `withRetry(fn, policy, signal)` retries on throw until success or\n * `maxAttempts` reached. Aborts mid-backoff when signal fires.\n * Non-retryable errors (by name) propagate immediately.\n *\n * @internal\n */\n\nimport type { RetryPolicy } from \"../../types/workflow.js\";\n\nconst DEFAULT_NON_RETRYABLE = [\"AbortError\", \"WorkflowSnapshotNotFoundError\", \"ConfigurationError\"];\n\ninterface BackoffConfig {\n init: number;\n coef: number;\n cap: number;\n nonRetryable: Set<string>;\n max: number;\n}\n\nfunction backoffConfigFromPolicy(policy: RetryPolicy): BackoffConfig {\n return {\n max: policy.maxAttempts,\n init: policy.initialBackoffMs ?? 1000,\n coef: policy.backoffCoefficient ?? 2.0,\n cap: policy.maximumBackoffMs ?? 30_000,\n nonRetryable: new Set(policy.nonRetryableErrors ?? DEFAULT_NON_RETRYABLE),\n };\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new DOMException(String(signal.reason ?? \"Aborted\"), \"AbortError\");\n }\n}\n\nfunction shouldRethrow(err: unknown, attempt: number, cfg: BackoffConfig): boolean {\n const errName = err instanceof Error ? err.name : \"Error\";\n return cfg.nonRetryable.has(errName) || attempt === cfg.max;\n}\n\nasync function tryOnce<T>(\n fn: () => Promise<T>,\n attempt: number,\n cfg: BackoffConfig,\n signal: AbortSignal,\n): Promise<{ value: T; attempts: number } | { kind: \"retry\" }> {\n try {\n const value = await fn();\n return { value, attempts: attempt };\n } catch (err) {\n if (shouldRethrow(err, attempt, cfg)) throw err;\n await abortableSleep(Math.min(cfg.init * cfg.coef ** (attempt - 1), cfg.cap), signal);\n return { kind: \"retry\" };\n }\n}\n\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n policy: RetryPolicy,\n signal: AbortSignal,\n): Promise<{ value: T; attempts: number }> {\n const cfg = backoffConfigFromPolicy(policy);\n for (let attempt = 1; attempt <= cfg.max; attempt += 1) {\n throwIfAborted(signal);\n const result = await tryOnce(fn, attempt, cfg, signal);\n if (\"value\" in result) return result;\n }\n // Unreachable: tryOnce throws on the final attempt when shouldRethrow returns true.\n throw new Error(\"withRetry: exhausted attempts without throwing\");\n}\n\nexport async function abortableSleep(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) {\n throw new DOMException(String(signal.reason ?? \"Aborted\"), \"AbortError\");\n }\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n cleanup();\n reject(new DOMException(String(signal.reason ?? \"Aborted\"), \"AbortError\"));\n };\n const cleanup = (): void => {\n signal.removeEventListener(\"abort\", onAbort);\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","/**\n * Execute an `AgentStep` — render the prompt template, call `agent.send`,\n * wait for completion, return the result text as step output (ADR D244,\n * D245).\n *\n * Cloud guard: agents marked as `CloudAgent` throw `UnsupportedRunOperationError`\n * (workflows are local-only in v1).\n *\n * @internal\n */\n\nimport { UnsupportedRunOperationError } from \"../../errors.js\";\nimport type { AgentStep, StepContext, StepResult } from \"../../types/workflow.js\";\nimport { WorkflowSuspendedSentinel } from \"./ctx.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport { withRetry } from \"./retry-policy.js\";\n\nexport async function runAgentStep(\n step: AgentStep,\n input: unknown,\n ctx: StepContext,\n): Promise<StepResult> {\n const startedAt = Date.now();\n // D244: cloud guard — workflows are LocalAgent-only in v1.\n const agentId = step.agent.agentId;\n if (typeof agentId === \"string\" && agentId.startsWith(\"bc-\")) {\n return {\n stepId: step.id,\n kind: \"agent\",\n status: \"failed\",\n attempts: 0,\n durationMs: Date.now() - startedAt,\n error: errToShape(\n new UnsupportedRunOperationError(\n \"Workflow agent steps not supported on CloudAgent yet (D244).\" +\n ` agent=\"${agentId}\", step=\"${step.id}\"`,\n \"workflow\",\n ),\n ),\n };\n }\n\n let prompt: string;\n try {\n prompt =\n typeof step.promptTemplate === \"string\" ? step.promptTemplate : step.promptTemplate(input);\n } catch (err) {\n return {\n stepId: step.id,\n kind: \"agent\",\n status: \"failed\",\n attempts: 0,\n durationMs: Date.now() - startedAt,\n error: errToShape(err),\n };\n }\n if (typeof prompt !== \"string\" || prompt.length === 0) {\n return {\n stepId: step.id,\n kind: \"agent\",\n status: \"failed\",\n attempts: 0,\n durationMs: Date.now() - startedAt,\n error: errToShape(\n new Error(`agentStep \"${step.id}\": rendered prompt must be a non-empty string`),\n ),\n };\n }\n\n const exec = async (): Promise<string> => {\n // SE3 — forward the step's provenance onto the agent's turn (metadata-only).\n const run = await step.agent.send(\n prompt,\n step.origin !== undefined ? { origin: step.origin } : undefined,\n );\n const result = await run.wait();\n if (result.status === \"finished\") {\n return result.result ?? \"\";\n }\n if (result.status === \"error\") {\n throw (result as { error?: Error }).error ?? new Error(\"agent.send errored\");\n }\n throw new Error(`Unexpected agent status: ${result.status}`);\n };\n\n try {\n const { value, attempts } =\n step.retry !== undefined\n ? await withRetry(exec, step.retry, ctx.signal)\n : { value: await exec(), attempts: 1 };\n return {\n stepId: step.id,\n kind: \"agent\",\n status: \"completed\",\n attempts,\n durationMs: Date.now() - startedAt,\n output: value,\n };\n } catch (err) {\n // Re-throw suspend sentinel so the executor can persist a snapshot.\n if (err instanceof WorkflowSuspendedSentinel) throw err;\n return {\n stepId: step.id,\n kind: \"agent\",\n status: \"failed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n error: errToShape(err),\n };\n }\n}\n","/**\n * Execute a `BranchStep` — first-match-wins predicates + optional fallback.\n *\n * EC-2 absorbed: predicates that THROW are treated as \"no match\" + stderr\n * warn — user-code bugs in predicates don't take down the whole workflow.\n *\n * @internal\n */\n\nimport type {\n BranchStep,\n Step,\n StepContext,\n StepResult,\n WorkflowOptions,\n} from \"../../types/workflow.js\";\nimport { redactSecrets } from \"../security/redact.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport type { DispatchFn } from \"./step-parallel.js\";\n\nexport async function runBranchStep(\n step: BranchStep,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n prevStepResults: ReadonlyArray<StepResult>,\n dispatch: DispatchFn,\n): Promise<StepResult> {\n const startedAt = Date.now();\n\n for (let i = 0; i < step.predicates.length; i += 1) {\n const pair = step.predicates[i]!;\n const [predicate, branch] = pair;\n // EC-2: predicate throw → warn + treat as no-match.\n let matched = false;\n try {\n matched = await Promise.resolve(predicate(input));\n } catch (err) {\n const errText = err instanceof Error ? err.message : String(err);\n console.warn(\n redactSecrets(\n `[workflow] branch \"${step.id}\" predicate ${i} threw, treating as no-match: ${errText}`,\n ),\n );\n }\n if (matched) {\n const r = await runInnerSequence(branch, input, ctx, options, prevStepResults, dispatch);\n return {\n ...r,\n stepId: step.id,\n kind: \"branch\",\n durationMs: Date.now() - startedAt,\n };\n }\n }\n\n if (step.fallback !== undefined) {\n const r = await runInnerSequence(step.fallback, input, ctx, options, prevStepResults, dispatch);\n return {\n ...r,\n stepId: step.id,\n kind: \"branch\",\n durationMs: Date.now() - startedAt,\n };\n }\n\n // No match, no fallback → pass input through unchanged.\n return {\n stepId: step.id,\n kind: \"branch\",\n status: \"skipped\",\n attempts: 0,\n durationMs: Date.now() - startedAt,\n output: input,\n };\n}\n\nasync function runInnerSequence(\n branch: ReadonlyArray<Step>,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n prevStepResults: ReadonlyArray<StepResult>,\n dispatch: DispatchFn,\n): Promise<StepResult> {\n let acc: unknown = input;\n let lastAttempts = 1;\n for (const inner of branch) {\n const r = await dispatch(inner, acc, ctx, options, prevStepResults);\n lastAttempts = r.attempts;\n if (r.status === \"failed\") {\n return {\n stepId: inner.id,\n kind: \"branch\",\n status: \"failed\",\n attempts: r.attempts,\n durationMs: 0,\n error: r.error ?? errToShape(new Error(\"branch inner step failed\")),\n };\n }\n acc = r.output;\n }\n return {\n stepId: \"__branch-completed__\",\n kind: \"branch\",\n status: \"completed\",\n attempts: lastAttempts,\n durationMs: 0,\n output: acc,\n };\n}\n","/**\n * Execute a `DowhileStep` — loop the inner step until `condFn` returns\n * false or `maxIterations` is reached (default 100).\n *\n * @internal\n */\n\nimport type {\n DowhileStep,\n StepContext,\n StepResult,\n WorkflowOptions,\n} from \"../../types/workflow.js\";\nimport { WorkflowMaxIterationsExceededError } from \"../../types/workflow.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport type { DispatchFn } from \"./step-parallel.js\";\n\nexport async function runDowhileStep(\n step: DowhileStep,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n prevStepResults: ReadonlyArray<StepResult>,\n dispatch: DispatchFn,\n): Promise<StepResult> {\n const startedAt = Date.now();\n const maxIter = step.maxIterations ?? 100;\n let acc = input;\n let i = 0;\n while (true) {\n if (i >= maxIter) {\n return {\n stepId: step.id,\n kind: \"dowhile\",\n status: \"failed\",\n attempts: i,\n durationMs: Date.now() - startedAt,\n error: errToShape(new WorkflowMaxIterationsExceededError(step.id, maxIter)),\n };\n }\n const r = await dispatch(step.step, acc, ctx, options, prevStepResults);\n if (r.status === \"failed\") {\n return {\n stepId: step.id,\n kind: \"dowhile\",\n status: \"failed\",\n attempts: i + 1,\n durationMs: Date.now() - startedAt,\n error: r.error,\n };\n }\n acc = r.output;\n i += 1;\n let shouldContinue = false;\n try {\n shouldContinue = await Promise.resolve(step.condFn(acc, i));\n } catch (err) {\n return {\n stepId: step.id,\n kind: \"dowhile\",\n status: \"failed\",\n attempts: i,\n durationMs: Date.now() - startedAt,\n error: errToShape(err),\n };\n }\n if (!shouldContinue) break;\n }\n return {\n stepId: step.id,\n kind: \"dowhile\",\n status: \"completed\",\n attempts: i,\n durationMs: Date.now() - startedAt,\n output: acc,\n };\n}\n","/**\n * Execute a `FnStep` — call the user-supplied function with `input` + `ctx`.\n * Wraps in `withRetry` if a retry policy is set (D237).\n *\n * Validates input/output via Zod when schemas are supplied. EC-4 / D229\n * pattern: empty/undefined input parses as `{}` only when schema is defined.\n *\n * @internal\n */\n\nimport type { FnStep, StepContext, StepResult } from \"../../types/workflow.js\";\nimport { WorkflowCompensateNotImplementedError } from \"../../types/workflow.js\";\nimport { WorkflowSuspendedSentinel } from \"./ctx.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport { withRetry } from \"./retry-policy.js\";\n\nfunction failedFnResult(\n stepId: string,\n attempts: number,\n startedAt: number,\n err: unknown,\n): StepResult {\n return {\n stepId,\n kind: \"fn\",\n status: \"failed\",\n attempts,\n durationMs: Date.now() - startedAt,\n error: errToShape(err),\n };\n}\n\nfunction validate(schema: { parse: (v: unknown) => unknown } | undefined, value: unknown): unknown {\n if (schema === undefined) return undefined;\n schema.parse(value);\n return undefined;\n}\n\nasync function execWithRetry(\n step: FnStep,\n input: unknown,\n ctx: StepContext,\n): Promise<{ value: unknown; attempts: number }> {\n const exec = async (): Promise<unknown> => step.fn(input, ctx);\n if (step.retry !== undefined) return withRetry(exec, step.retry, ctx.signal);\n return { value: await exec(), attempts: 1 };\n}\n\nexport async function runFnStep(\n step: FnStep,\n input: unknown,\n ctx: StepContext,\n): Promise<StepResult> {\n const startedAt = Date.now();\n // D238: saga engine not implemented in v1 — surface intent loudly.\n if (step.compensate !== undefined) {\n return failedFnResult(\n step.id,\n 0,\n startedAt,\n new WorkflowCompensateNotImplementedError(step.id),\n );\n }\n try {\n validate(step.inputSchema, input);\n } catch (err) {\n return failedFnResult(step.id, 0, startedAt, err);\n }\n\n try {\n const { value, attempts } = await execWithRetry(step, input, ctx);\n try {\n validate(step.outputSchema, value);\n } catch (err) {\n return failedFnResult(step.id, attempts, startedAt, err);\n }\n return {\n stepId: step.id,\n kind: \"fn\",\n status: \"completed\",\n attempts,\n durationMs: Date.now() - startedAt,\n output: value,\n };\n } catch (err) {\n if (err instanceof WorkflowSuspendedSentinel) throw err;\n return failedFnResult(step.id, 1, startedAt, err);\n }\n}\n","/**\n * Execute a `ForeachStep` — map a step over the output of an upstream step.\n *\n * EC-7 absorbed: `iterableFrom` MUST reference a top-level step (one of\n * `prevStepResults`). Inner steps from inside `.parallel` / `.branch` /\n * `.foreach` are not reachable.\n *\n * @internal\n */\n\nimport type {\n ForeachStep,\n StepContext,\n StepResult,\n WorkflowOptions,\n} from \"../../types/workflow.js\";\nimport { createSemaphore } from \"../runtime/concurrency/async-semaphore.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport type { DispatchFn } from \"./step-parallel.js\";\n\nexport async function runForeachStep(\n step: ForeachStep,\n _input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n prevStepResults: ReadonlyArray<StepResult>,\n dispatch: DispatchFn,\n): Promise<StepResult> {\n const startedAt = Date.now();\n\n // EC-7: top-level step lookup only.\n const sourceResult = prevStepResults.find((r) => r.stepId === step.iterableFrom);\n if (sourceResult === undefined) {\n return {\n stepId: step.id,\n kind: \"foreach\",\n status: \"failed\",\n attempts: 0,\n durationMs: Date.now() - startedAt,\n error: errToShape(\n new Error(\n `foreach.iterableFrom \"${step.iterableFrom}\" not found in top-level steps. ` +\n `It must reference an earlier top-level step ID — nested step IDs inside ` +\n `parallel/branch/foreach blocks are not visible here.`,\n ),\n ),\n };\n }\n\n const items = sourceResult.output;\n if (!Array.isArray(items)) {\n return {\n stepId: step.id,\n kind: \"foreach\",\n status: \"failed\",\n attempts: 0,\n durationMs: Date.now() - startedAt,\n error: errToShape(\n new Error(\n `foreach.iterableFrom \"${step.iterableFrom}\" output must be Array, got ${typeof items}.`,\n ),\n ),\n };\n }\n\n if (items.length === 0) {\n return {\n stepId: step.id,\n kind: \"foreach\",\n status: \"completed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n output: [],\n };\n }\n\n const concurrency = step.concurrency ?? 4;\n const sem = createSemaphore(Math.max(1, Math.min(concurrency, items.length)));\n const failures: Error[] = [];\n const outputs: unknown[] = new Array(items.length);\n\n await Promise.all(\n items.map(async (item, idx) => {\n const release = await sem.acquire();\n try {\n const r = await dispatch(step.step, item, ctx, options, prevStepResults);\n if (r.status === \"failed\") {\n failures.push(new Error(`foreach item ${idx} failed: ${r.error?.message ?? \"unknown\"}`));\n } else {\n outputs[idx] = r.output;\n }\n } finally {\n release();\n }\n }),\n );\n\n if (failures.length > 0) {\n return {\n stepId: step.id,\n kind: \"foreach\",\n status: \"failed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n error: errToShape(\n new AggregateError(failures, `foreach \"${step.id}\" had ${failures.length} failure(s)`),\n ),\n };\n }\n\n return {\n stepId: step.id,\n kind: \"foreach\",\n status: \"completed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n output: outputs,\n };\n}\n","/**\n * Execute a `ParallelStep` — run N branches concurrently.\n *\n * - `errorPolicy: \"fail-fast\"` (default): first branch error aborts the rest\n * via a derived AbortSignal; `WorkflowParallelError` aggregates failures.\n * - `errorPolicy: \"collect\"`: all branches complete; output is array of\n * `{ ok: true, value } | { ok: false, error }`.\n *\n * Concurrency: bounded by `step.concurrency ?? branches.length` (D240). All\n * branches run inside the same `AsyncSemaphore`.\n *\n * EC-6 absorbed: empty `branches[]` returns `output: []` without error.\n *\n * @internal\n */\n\nimport type {\n ParallelStep,\n Step,\n StepContext,\n StepResult,\n WorkflowOptions,\n} from \"../../types/workflow.js\";\nimport { WorkflowParallelError } from \"../../types/workflow.js\";\nimport { createSemaphore } from \"../runtime/concurrency/async-semaphore.js\";\nimport { errToShape } from \"./error-shape.js\";\n\nexport type DispatchFn = (\n step: Step,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n prevStepResults: ReadonlyArray<StepResult>,\n) => Promise<StepResult>;\n\nexport async function runParallelStep(\n step: ParallelStep,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n _prevStepResults: ReadonlyArray<StepResult>,\n dispatch: DispatchFn,\n): Promise<StepResult> {\n const startedAt = Date.now();\n const policy = step.errorPolicy ?? \"fail-fast\";\n const branchCount = step.branches.length;\n\n // EC-6: empty branches → empty output, no error.\n if (branchCount === 0) {\n return {\n stepId: step.id,\n kind: \"parallel\",\n status: \"completed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n output: [],\n };\n }\n\n const concurrency = step.concurrency ?? branchCount;\n const sem = createSemaphore(Math.max(1, Math.min(concurrency, branchCount)));\n\n // Derived signal for fail-fast: aborts on first branch failure.\n const failFastCtrl = policy === \"fail-fast\" ? new AbortController() : undefined;\n const branchSignal =\n policy === \"fail-fast\" ? mergeSignals(ctx.signal, failFastCtrl!.signal) : ctx.signal;\n\n // Gate each branch through the semaphore — acquire BEFORE running so the\n // permit cap is honored. (Eager-start would defeat concurrency limits.)\n const semBranchPromises = step.branches.map(async (branch, branchIdx) => {\n const release = await sem.acquire();\n try {\n return await runBranch(\n branch,\n input,\n { ...ctx, signal: branchSignal },\n options,\n dispatch,\n branchIdx,\n );\n } finally {\n release();\n }\n });\n\n if (policy === \"fail-fast\") {\n try {\n const outputs = await Promise.all(semBranchPromises);\n return {\n stepId: step.id,\n kind: \"parallel\",\n status: \"completed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n output: outputs,\n };\n } catch (err) {\n failFastCtrl?.abort(err);\n // Collect any settled rejections so the aggregate has all errors.\n const settled = await Promise.allSettled(semBranchPromises);\n const errors = settled\n .filter((s): s is PromiseRejectedResult => s.status === \"rejected\")\n .map((s) => (s.reason instanceof Error ? s.reason : new Error(String(s.reason))));\n return {\n stepId: step.id,\n kind: \"parallel\",\n status: \"failed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n error: errToShape(new WorkflowParallelError(errors, step.id)),\n output: undefined,\n };\n }\n }\n\n // collect mode\n const settled = await Promise.allSettled(semBranchPromises);\n const outputs = settled.map((s) =>\n s.status === \"fulfilled\"\n ? { ok: true as const, value: s.value }\n : { ok: false as const, error: errToShape(s.reason) },\n );\n return {\n stepId: step.id,\n kind: \"parallel\",\n status: \"completed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n output: outputs,\n };\n}\n\nasync function runBranch(\n branch: ReadonlyArray<Step>,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n dispatch: DispatchFn,\n branchIdx: number,\n): Promise<unknown> {\n let acc: unknown = input;\n for (const inner of branch) {\n const r = await dispatch(inner, acc, ctx, options, []);\n if (r.status === \"failed\") {\n throw new Error(\n `parallel branch ${branchIdx} step \"${inner.id}\" failed: ${r.error?.message ?? \"unknown\"}`,\n );\n }\n acc = r.output;\n }\n return acc;\n}\n\nfunction mergeSignals(a: AbortSignal, b: AbortSignal): AbortSignal {\n if (a.aborted) return a;\n if (b.aborted) return b;\n const ctrl = new AbortController();\n const onAbortA = (): void => ctrl.abort(a.reason);\n const onAbortB = (): void => ctrl.abort(b.reason);\n a.addEventListener(\"abort\", onAbortA, { once: true });\n b.addEventListener(\"abort\", onAbortB, { once: true });\n return ctrl.signal;\n}\n","/**\n * Execute a `SleepStep` — pause for `durationMs`. Aborts mid-sleep\n * when the signal fires (D245).\n *\n * @internal\n */\n\nimport type { SleepStep, StepContext, StepResult } from \"../../types/workflow.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport { abortableSleep } from \"./retry-policy.js\";\n\nexport async function runSleepStep(\n step: SleepStep,\n input: unknown,\n ctx: StepContext,\n): Promise<StepResult> {\n const startedAt = Date.now();\n try {\n await abortableSleep(step.durationMs, ctx.signal);\n return {\n stepId: step.id,\n kind: \"sleep\",\n status: \"completed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n output: input, // sleep is a pass-through\n };\n } catch (err) {\n return {\n stepId: step.id,\n kind: \"sleep\",\n status: \"failed\",\n attempts: 1,\n durationMs: Date.now() - startedAt,\n error: errToShape(err),\n };\n }\n}\n","/**\n * OTel telemetry for workflows (ADR D241).\n *\n * Spans:\n * - `workflow.run` — root span per `Workflow.run` invocation\n * - `workflow.step.<id>` — child span per step (retry attempts share the kind)\n *\n * Attributes:\n * - `workflow.name`, `workflow.run_id`, `step.kind`, `step.status`, `step.attempts`\n *\n * @internal\n */\n\nimport { getTracer, noopSpan, type SpanLike } from \"../telemetry/tracer-loader.js\";\n\nconst TRACER_NAME = \"@theokit/sdk/workflow\";\n\nexport function startWorkflowRunSpan(info: { workflowName: string; runId: string }): SpanLike {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return noopSpan;\n return tracer.startSpan(\"workflow.run\", {\n attributes: {\n \"workflow.name\": info.workflowName,\n \"workflow.run_id\": info.runId,\n },\n });\n}\n\nexport function startWorkflowStepSpan(info: {\n stepId: string;\n kind: string;\n attempt: number;\n}): SpanLike {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return noopSpan;\n return tracer.startSpan(`workflow.step.${info.stepId}`, {\n attributes: {\n \"step.id\": info.stepId,\n \"step.kind\": info.kind,\n \"step.attempt\": info.attempt,\n },\n });\n}\n","/**\n * Workflow executor (ADRs D230-D248).\n *\n * Walks `steps[]` sequentially, dispatching to per-kind handlers. Handles\n * suspend (sentinel pattern; D236), single-flight (D242), abort signal\n * boundaries (D245), and snapshot persistence opt-in (D235).\n *\n * @internal\n */\n\nimport {\n type Step,\n type StepContext,\n type StepResult,\n type WorkflowEvent,\n WorkflowInputError,\n type WorkflowOptions,\n WorkflowOutputError,\n type WorkflowResumeOptions,\n WorkflowResumeStepNotFoundError,\n type WorkflowRun,\n type WorkflowRunOptions,\n type WorkflowSnapshot,\n WorkflowSnapshotNotFoundError,\n WorkflowStateError,\n} from \"../../types/workflow.js\";\nimport { combineSignals, makeStepContext, WorkflowSuspendedSentinel } from \"./ctx.js\";\nimport { errToShape } from \"./error-shape.js\";\nimport {\n abortRun,\n assembleRun,\n makeStateController,\n validateWorkflowSchema,\n} from \"./executor-helpers.js\";\nimport { mintRunId } from \"./run-id.js\";\nimport { acquireSingleFlight } from \"./single-flight.js\";\nimport { getSnapshotStoreFor } from \"./snapshot-store.js\";\nimport { runAgentStep } from \"./step-agent.js\";\nimport { runBranchStep } from \"./step-branch.js\";\nimport { runDowhileStep } from \"./step-dowhile.js\";\nimport { runFnStep } from \"./step-fn.js\";\nimport { runForeachStep } from \"./step-foreach.js\";\nimport { runParallelStep } from \"./step-parallel.js\";\nimport { runSleepStep } from \"./step-sleep.js\";\nimport { startWorkflowRunSpan, startWorkflowStepSpan } from \"./telemetry.js\";\n\ninterface SuspendOutcome<T> {\n kind: \"suspended\" | \"failed\";\n run: WorkflowRun<T>;\n}\n\nasync function handleSuspend<T>(\n err: WorkflowSuspendedSentinel,\n ctx: {\n runId: string;\n name: string;\n step: Step;\n stepResults: StepResult[];\n acc: unknown;\n options: WorkflowOptions;\n startedAt: number;\n stepSpan: ReturnType<typeof startWorkflowStepSpan>;\n /** SE29 — the StepContext, read for its current shared `state`. */\n stepCtx: StepContext;\n },\n): Promise<SuspendOutcome<T>> {\n try {\n await saveSnapshot({\n runId: ctx.runId,\n workflowName: ctx.options.name,\n currentStepId: ctx.step.id,\n suspendedPayload: err.payload,\n stepResults: ctx.stepResults,\n accumulatedInput: ctx.acc,\n state: ctx.stepCtx.state, // SE29 — capture the shared state at suspend\n options: ctx.options,\n });\n } catch (snapErr) {\n ctx.stepSpan.setAttribute(\"step.status\", \"failed\");\n ctx.stepSpan.end();\n return {\n kind: \"failed\",\n run: assembleRun<T>({\n runId: ctx.runId,\n name: ctx.name,\n status: \"failed\",\n stepResults: ctx.stepResults,\n startedAt: ctx.startedAt,\n error: errToShape(snapErr),\n }),\n };\n }\n ctx.stepSpan.setAttribute(\"step.status\", \"suspended\");\n ctx.stepSpan.end();\n return {\n kind: \"suspended\",\n run: assembleRun<T>({\n runId: ctx.runId,\n name: ctx.name,\n status: \"suspended\",\n stepResults: [\n ...ctx.stepResults,\n {\n stepId: ctx.step.id,\n kind: ctx.step.kind,\n status: \"suspended\",\n attempts: 1,\n durationMs: 0,\n output: undefined,\n },\n ],\n startedAt: ctx.startedAt,\n }),\n };\n}\n\nasync function runOneStep<T>(args: {\n step: Step;\n acc: unknown;\n ctx: StepContext;\n options: WorkflowOptions;\n stepResults: StepResult[];\n runId: string;\n name: string;\n startedAt: number;\n}): Promise<{ kind: \"ok\"; result: StepResult } | { kind: \"terminal\"; run: WorkflowRun<T> }> {\n const stepSpan = startWorkflowStepSpan({\n stepId: args.step.id,\n kind: args.step.kind,\n attempt: 1,\n });\n let result: StepResult;\n try {\n result = await dispatchStep(args.step, args.acc, args.ctx, args.options, args.stepResults);\n } catch (err) {\n if (err instanceof WorkflowSuspendedSentinel) {\n const outcome = await handleSuspend<T>(err, { ...args, stepSpan, stepCtx: args.ctx });\n return { kind: \"terminal\", run: outcome.run };\n }\n result = {\n stepId: args.step.id,\n kind: args.step.kind,\n status: \"failed\",\n attempts: 1,\n durationMs: 0,\n error: errToShape(err),\n };\n }\n stepSpan.setAttribute(\"step.status\", result.status);\n stepSpan.setAttribute(\"step.attempts\", result.attempts);\n stepSpan.end();\n return { kind: \"ok\", result };\n}\n\ninterface LoopParams {\n options: WorkflowOptions;\n steps: ReadonlyArray<Step>;\n input: unknown;\n ctx: StepContext;\n runId: string;\n startedAt: number;\n signal: AbortSignal;\n /** M3 #62 — prior step outputs restored on resume (else resume is lossy). */\n initialStepResults?: ReadonlyArray<StepResult>;\n /** SE28 — sink for step-level stream events (top-level steps). */\n onStepEvent?: (event: WorkflowEvent) => void;\n}\n\n/** Emit events + branch on one step's outcome. Returns a terminal run, or the new acc. */\nfunction handleStepOutcome<TO>(\n outcome: { kind: \"ok\"; result: StepResult } | { kind: \"terminal\"; run: WorkflowRun<TO> },\n step: Step,\n loop: { stepResults: StepResult[]; runId: string; name: string; startedAt: number },\n onStepEvent?: (event: WorkflowEvent) => void,\n): { terminal: WorkflowRun<TO> } | { acc: unknown } {\n if (outcome.kind === \"terminal\") {\n // A snapshot-SAVE failure also returns terminal (status \"failed\") — only emit\n // workflow_suspended when the run actually suspended (else the consumer would\n // resume a run with no snapshot). A failed terminal has no event; read `result`.\n if (outcome.run.status === \"suspended\") {\n onStepEvent?.({ type: \"workflow_suspended\", stepId: step.id });\n }\n return { terminal: outcome.run };\n }\n loop.stepResults.push(outcome.result);\n if (outcome.result.status === \"failed\") {\n onStepEvent?.({\n type: \"step_failed\",\n stepId: step.id,\n error: outcome.result.error ?? { name: \"WorkflowStepError\", message: \"step failed\" },\n });\n return {\n terminal: assembleRun<TO>({\n runId: loop.runId,\n name: loop.name,\n status: \"failed\",\n stepResults: loop.stepResults,\n startedAt: loop.startedAt,\n error: outcome.result.error,\n }),\n };\n }\n onStepEvent?.({ type: \"step_completed\", stepId: step.id, output: outcome.result.output });\n return { acc: outcome.result.output };\n}\n\nasync function runStepsLoop<TO>(params: LoopParams): Promise<WorkflowRun<TO>> {\n const { options, steps, ctx, runId, startedAt, signal, onStepEvent } = params;\n // M3 #62 — seed with prior step outputs so a resumed workflow is not lossy.\n const stepResults: StepResult[] = [...(params.initialStepResults ?? [])];\n const loop = { stepResults, runId, name: options.name, startedAt };\n let acc: unknown = params.input;\n for (const step of steps) {\n if (signal.aborted) return abortRun<TO>(options.name, runId, startedAt, stepResults, signal);\n onStepEvent?.({ type: \"step_started\", stepId: step.id });\n const outcome = await runOneStep<TO>({\n step,\n acc,\n ctx,\n options,\n stepResults,\n runId,\n name: options.name,\n startedAt,\n });\n const handled = handleStepOutcome<TO>(outcome, step, loop, onStepEvent);\n if (\"terminal\" in handled) return handled.terminal;\n acc = handled.acc;\n }\n // SE27 — validate the whole-workflow output only on the terminal completed path.\n const outputIssues = validateWorkflowSchema(options.outputSchema, acc);\n if (outputIssues !== undefined) {\n return assembleRun<TO>({\n runId,\n name: options.name,\n status: \"failed\",\n stepResults,\n startedAt,\n error: errToShape(new WorkflowOutputError(options.name, outputIssues)),\n });\n }\n onStepEvent?.({ type: \"workflow_completed\" });\n return assembleRun<TO>({\n runId,\n name: options.name,\n status: \"completed\",\n output: acc as TO,\n stepResults,\n startedAt,\n });\n}\n\n/** M3 #62 — internal-only resume seam: prior step outputs are NOT on the public\n * WorkflowRunOptions (a consumer must not inject fabricated results into a fresh run);\n * resumeWorkflow sets them via this cast. */\ntype InternalRunOpts = WorkflowRunOptions & {\n readonly initialStepResults?: ReadonlyArray<StepResult>;\n /** SE28 — internal step-event sink threaded by `Workflow.stream()`. */\n readonly onStepEvent?: (event: WorkflowEvent) => void;\n /** SE29 — shared state restored from a snapshot on resume. */\n readonly restoredState?: unknown;\n};\n\nexport async function executeWorkflow<TInput, TOutput>(\n options: WorkflowOptions,\n steps: ReadonlyArray<Step>,\n input: TInput,\n runOpts?: WorkflowRunOptions,\n): Promise<WorkflowRun<TOutput>> {\n const runId = runOpts?.runId ?? mintRunId();\n const workflowId = options.workflowId ?? `wf-anon`;\n const flight = acquireSingleFlight(workflowId, runId, options.name);\n const startedAt = Date.now();\n const signal = combineSignals(runOpts?.signal, flight.signal);\n const runSpan = startWorkflowRunSpan({ workflowName: options.name, runId });\n\n if (signal.aborted) {\n flight.release();\n runSpan.setAttribute(\"workflow.status\", \"cancelled\");\n runSpan.end();\n return abortRun<TOutput>(options.name, runId, startedAt, [], signal);\n }\n\n const internal = runOpts as InternalRunOpts | undefined;\n // SE29 — seed shared state from the resume snapshot (if any) else initialState.\n const seededState =\n internal?.restoredState !== undefined ? internal.restoredState : options.initialState;\n const stateController = makeStateController(options, seededState);\n const ctx: StepContext = makeStepContext(runId, signal, stateController);\n try {\n // SE27 — validate the whole-workflow input BEFORE any step runs (fail-fast).\n const inputIssues = validateWorkflowSchema(options.inputSchema, input);\n if (inputIssues !== undefined) {\n return assembleRun<TOutput>({\n runId,\n name: options.name,\n status: \"failed\",\n stepResults: [],\n startedAt,\n error: errToShape(new WorkflowInputError(options.name, inputIssues)),\n });\n }\n // SE29 — validate the seeded state (fail-fast) before any step reads it.\n const stateIssues =\n seededState !== undefined\n ? validateWorkflowSchema(options.stateSchema, seededState)\n : undefined;\n if (stateIssues !== undefined) {\n return assembleRun<TOutput>({\n runId,\n name: options.name,\n status: \"failed\",\n stepResults: [],\n startedAt,\n error: errToShape(new WorkflowStateError(options.name, stateIssues)),\n });\n }\n return await runStepsLoop<TOutput>({\n options,\n steps,\n input,\n ctx,\n runId,\n startedAt,\n signal,\n ...(internal?.initialStepResults !== undefined\n ? { initialStepResults: internal.initialStepResults }\n : {}),\n ...(internal?.onStepEvent !== undefined ? { onStepEvent: internal.onStepEvent } : {}),\n });\n } finally {\n runSpan.end();\n flight.release();\n }\n}\n\n/**\n * Dispatch single step to the right handler. Exhaustive over `step.kind`.\n */\nexport async function dispatchStep(\n step: Step,\n input: unknown,\n ctx: StepContext,\n options: WorkflowOptions,\n prevStepResults: ReadonlyArray<StepResult>,\n): Promise<StepResult> {\n switch (step.kind) {\n case \"fn\":\n return runFnStep(step, input, ctx);\n case \"agent\":\n return runAgentStep(step, input, ctx);\n case \"parallel\":\n return runParallelStep(step, input, ctx, options, prevStepResults, dispatchStep);\n case \"branch\":\n return runBranchStep(step, input, ctx, options, prevStepResults, dispatchStep);\n case \"foreach\":\n return runForeachStep(step, input, ctx, options, prevStepResults, dispatchStep);\n case \"dowhile\":\n return runDowhileStep(step, input, ctx, options, prevStepResults, dispatchStep);\n case \"sleep\":\n return runSleepStep(step, input, ctx);\n case \"suspend\":\n // Standalone suspend: throw sentinel so executor catches.\n throw new WorkflowSuspendedSentinel(undefined);\n default: {\n const _exhaustive: never = step;\n throw new Error(`Unknown step kind: ${(_exhaustive as Step).kind}`);\n }\n }\n}\n\ninterface SnapshotParams {\n runId: string;\n workflowName: string;\n currentStepId: string;\n suspendedPayload?: unknown;\n stepResults: ReadonlyArray<StepResult>;\n accumulatedInput: unknown;\n /** SE29 — shared state captured at suspend. */\n state: unknown;\n options: WorkflowOptions;\n}\n\nasync function saveSnapshot(p: SnapshotParams): Promise<void> {\n const snapshot: WorkflowSnapshot = {\n _schemaVersion: 2, // SE29 — carries `state`\n runId: p.runId,\n workflowName: p.workflowName,\n currentStepId: p.currentStepId,\n suspendedPayload: p.suspendedPayload,\n stepResults: p.stepResults,\n accumulatedInput: p.accumulatedInput,\n ...(p.state !== undefined ? { state: p.state } : {}),\n suspendedAt: Date.now(),\n };\n const store = getSnapshotStoreFor(p.options);\n await store.save(snapshot);\n}\n\n/* ─── Resume ─── */\n\nexport async function resumeWorkflow<TO>(opts: WorkflowResumeOptions): Promise<WorkflowRun<TO>> {\n // We need access to the workflow's internal options/steps. The public\n // resume API hands us a `workflow` reference exposing `.run` only — for\n // v1 we accept the user re-running the same workflow with the snapshot's\n // accumulated input + payload merged. Full resume-from-step support\n // would require exposing `__steps` and `__options`; v1 ships a simpler\n // \"re-run from input\" semantics gated by snapshot lookup.\n const wfInternal = opts.workflow as {\n __options?: WorkflowOptions;\n __steps?: ReadonlyArray<Step>;\n run: (input: unknown, runOpts?: WorkflowRunOptions) => Promise<WorkflowRun<TO>>;\n };\n const options = wfInternal.__options;\n const steps = wfInternal.__steps;\n if (options === undefined || steps === undefined) {\n throw new Error(\"Workflow.resume requires an instance from Workflow.create().commit()\");\n }\n const store = getSnapshotStoreFor(options);\n const snapshot = await store.load(opts.runId);\n if (snapshot === undefined) {\n throw new WorkflowSnapshotNotFoundError(opts.runId);\n }\n // EC-8: verify the currentStepId exists in the supplied workflow.\n const stepIdx = steps.findIndex((s) => s.id === snapshot.currentStepId);\n if (stepIdx < 0) {\n throw new WorkflowResumeStepNotFoundError(snapshot.currentStepId, snapshot.workflowName);\n }\n\n // Validate payload if the suspend step declared a schema.\n const suspendStep = steps[stepIdx];\n if (\n suspendStep !== undefined &&\n suspendStep.kind === \"suspend\" &&\n suspendStep.payloadSchema !== undefined\n ) {\n suspendStep.payloadSchema.parse(opts.payload);\n }\n\n // For v1: continue from stepIdx + 1 with `payload` (if any) as the new\n // accumulated input. This is intentionally simpler than full state\n // restoration; the snapshot's `accumulatedInput` is preserved for\n // observability but the resume input is determined by the caller's\n // payload (or the snapshot's accumulator if payload is undefined).\n const resumeInput = opts.payload !== undefined ? opts.payload : snapshot.accumulatedInput;\n const remainingSteps = steps.slice(stepIdx + 1);\n\n // Drop snapshot once we begin (single-shot semantics).\n await store.delete(opts.runId);\n\n return executeWorkflow<unknown, TO>(options, remainingSteps, resumeInput, {\n signal: opts.signal,\n runId: opts.runId,\n // M3 #62 — restore prior step outputs so the resumed run is not lossy (internal seam).\n initialStepResults: snapshot.stepResults,\n // SE29 — restore shared state (v2 snapshot). A v1 snapshot has no `state` →\n // executeWorkflow falls back to `options.initialState`.\n ...(snapshot.state !== undefined ? { restoredState: snapshot.state } : {}),\n } as InternalRunOpts);\n}\n"]}
@@ -1,115 +1,10 @@
1
1
  'use strict';
2
2
 
3
+ var chunkKIO7QFIV_cjs = require('../chunk-KIO7QFIV.cjs');
4
+ require('../chunk-A44COQJJ.cjs');
5
+ require('../chunk-BEURCLDV.cjs');
3
6
  var promises = require('fs/promises');
4
7
  var path = require('path');
5
- require('crypto');
6
- var fs = require('fs');
7
-
8
- // src/filesystem/local-filesystem.ts
9
-
10
- // src/errors.ts
11
- var TheokitAgentError = class extends Error {
12
- name = "TheokitAgentError";
13
- isRetryable;
14
- code;
15
- protoErrorCode;
16
- metadata;
17
- constructor(message, options = {}) {
18
- super(message, options.cause !== void 0 ? { cause: options.cause } : void 0);
19
- this.isRetryable = options.isRetryable ?? false;
20
- if (options.code !== void 0) this.code = options.code;
21
- if (options.protoErrorCode !== void 0) this.protoErrorCode = options.protoErrorCode;
22
- if (options.metadata !== void 0) this.metadata = options.metadata;
23
- }
24
- };
25
- var ConfigurationError = class extends TheokitAgentError {
26
- name = "ConfigurationError";
27
- constructor(message, options = {}) {
28
- super(message, { ...options, isRetryable: false });
29
- }
30
- };
31
-
32
- // src/internal/security/path-guard.ts
33
- var PathTraversalError = class extends ConfigurationError {
34
- name = "PathTraversalError";
35
- constructor(input, resolvedPath) {
36
- super(`Path traversal attempt: ${input} \u2192 ${resolvedPath}`, {
37
- code: "path_traversal"
38
- });
39
- }
40
- };
41
- function isInside(target, base) {
42
- if (target === base) return true;
43
- const prefix = base.endsWith(path.sep) ? base : base + path.sep;
44
- return target.startsWith(prefix);
45
- }
46
- function safePathJoin(base, ...parts) {
47
- if (base === "") {
48
- throw new Error("safePathJoin: base must be non-empty");
49
- }
50
- rejectNulAndControlChars(base, "base");
51
- for (const part of parts) {
52
- rejectNulAndControlChars(part, "path segment");
53
- }
54
- const baseResolved = path.resolve(base);
55
- const target = path.resolve(base, ...parts);
56
- if (!isInside(target, baseResolved)) {
57
- throw new PathTraversalError(parts.join("/"), target);
58
- }
59
- return target;
60
- }
61
- function rejectNulAndControlChars(input, role) {
62
- for (let i = 0; i < input.length; i++) {
63
- const code = input.charCodeAt(i);
64
- if (code === 0 || code >= 1 && code <= 31 || code === 127) {
65
- const label = code === 0 ? "<nul-byte>" : `<control-char-0x${code.toString(16)}>`;
66
- throw new PathTraversalError(`${role}: ${input}`, label);
67
- }
68
- }
69
- }
70
- function assertNoSymlinkEscape(path$1, base) {
71
- rejectNulAndControlChars(path$1, "path");
72
- rejectNulAndControlChars(base, "base");
73
- let baseResolved;
74
- try {
75
- baseResolved = fs.realpathSync(base);
76
- } catch {
77
- baseResolved = path.resolve(base);
78
- }
79
- const resolved = realpathOfDeepestExisting(path$1);
80
- if (resolved === void 0) return;
81
- if (!isInside(resolved, baseResolved)) {
82
- throw new PathTraversalError(`symlink ${path$1}`, resolved);
83
- }
84
- }
85
- function realpathOfDeepestExisting(path$1) {
86
- try {
87
- return fs.realpathSync(path$1);
88
- } catch {
89
- }
90
- try {
91
- const stat = fs.lstatSync(path$1);
92
- if (stat.isSymbolicLink()) {
93
- const target = fs.readlinkSync(path$1);
94
- const parentReal = realpathOfDeepestExisting(path.dirname(path$1));
95
- const parentBase = parentReal ?? path.dirname(path$1);
96
- return path.resolve(parentBase, target);
97
- }
98
- } catch {
99
- }
100
- let cursor = path.dirname(path$1);
101
- let suffix = path$1.slice(cursor.length);
102
- while (cursor !== path.dirname(cursor)) {
103
- try {
104
- const real = fs.realpathSync(cursor);
105
- return path.resolve(real, `.${suffix}`);
106
- } catch {
107
- suffix = path$1.slice(path.dirname(cursor).length);
108
- cursor = path.dirname(cursor);
109
- }
110
- }
111
- return void 0;
112
- }
113
8
 
114
9
  // src/filesystem/types.ts
115
10
  var FilesystemSecurityError = class extends Error {
@@ -271,17 +166,17 @@ var LocalFilesystem = class extends FilesystemBackend {
271
166
  resolve(path) {
272
167
  let abs;
273
168
  try {
274
- abs = safePathJoin(this._basePath, path);
169
+ abs = chunkKIO7QFIV_cjs.safePathJoin(this._basePath, path);
275
170
  } catch (err) {
276
- if (err instanceof PathTraversalError) {
171
+ if (err instanceof chunkKIO7QFIV_cjs.PathTraversalError) {
277
172
  throw new FilesystemSecurityError(`Path escapes basePath: ${path}`);
278
173
  }
279
174
  throw err;
280
175
  }
281
176
  try {
282
- assertNoSymlinkEscape(abs, this._basePath);
177
+ chunkKIO7QFIV_cjs.assertNoSymlinkEscape(abs, this._basePath);
283
178
  } catch (err) {
284
- if (err instanceof PathTraversalError) {
179
+ if (err instanceof chunkKIO7QFIV_cjs.PathTraversalError) {
285
180
  throw new FilesystemSecurityError(`Path escapes basePath via symlink: ${path}`);
286
181
  }
287
182
  throw err;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/errors.ts","../../src/internal/security/path-guard.ts","../../src/filesystem/types.ts","../../src/filesystem/local-filesystem.ts"],"names":["sep","resolve","path","realpathSync","lstatSync","readlinkSync","dirname","fsReadFile","mkdir","fsWriteFile","readdir","fsStat"],"mappings":"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","file":"index.cjs","sourcesContent":["import { defaultRetriableForCode } from \"./internal/runtime/retry/default-retriable.js\";\nimport { redactSecrets } from \"./internal/security/redact.js\";\nimport type { RunOperation } from \"./types/run.js\";\n\n/**\n * Finite, machine-readable error codes for provider-originated errors\n * (ADR D66). Consumers can `switch (err.metadata?.code)` exhaustively\n * — adding a new variant is an explicit decision + test coverage.\n *\n * @public\n */\nexport type ErrorCode =\n | \"rate_limit\"\n | \"auth_failed\"\n | \"invalid_request\"\n | \"timeout\"\n | \"server_error\"\n | \"context_too_long\"\n | \"content_filtered\"\n | \"model_unavailable\"\n | \"network\"\n | \"quota_exceeded\"\n | \"unknown\";\n\n/**\n * Codes used by {@link AgentRunError} (Production-Readiness #3, ADR D311).\n *\n * Superset of {@link ErrorCode} extended with codes that do NOT originate\n * from a provider HTTP response:\n *\n * - `quota_exceeded` — billing limit hit (provider 402 or signalled error)\n * - `tool_runtime_error` — custom tool handler threw inside dispatch\n * - `aborted` — caller's `AbortSignal` fired (Phase 4)\n * - `invalid_model` — model id rejected by provider (400 \"model not found\")\n * - `safety_blocked` — provider safety filter blocked req or resp\n * - `provider_unreachable` — DNS/TCP/timeout/5xx at transport boundary\n *\n * The `& {}` tail keeps the literal-union ergonomics (autocomplete) while\n * accepting any string for forward compatibility with constructor calls\n * that pass arbitrary code values (legacy callers).\n *\n * @public\n */\n/**\n * T1.1 — closed literal union for `AgentRunError.code`. The previous\n * `(string & {})` escape hatch let arbitrary strings slip into the type\n * surface and defeated exhaustive `switch (code)` discrimination. This is\n * the canonical closed form. `AgentRunErrorCode` is re-aliased below for\n * source-level back-compat.\n *\n * Adding a new code: append the literal here AND audit every `switch (err.code)`\n * in callers. Type-checker enforces the audit via the `default: assertNever(code)`\n * convention.\n *\n * @public\n */\nexport type KnownAgentRunErrorCode =\n | ErrorCode\n | \"quota_exceeded\"\n | \"tool_runtime_error\"\n | \"aborted\"\n | \"invalid_model\"\n | \"safety_blocked\"\n | \"provider_unreachable\";\n\n/**\n * Back-compat alias of {@link KnownAgentRunErrorCode}. Pre-T1.1 callers that\n * imported `AgentRunErrorCode` keep working; new code SHOULD prefer\n * `KnownAgentRunErrorCode` to make the closed-union intent explicit.\n *\n * @public\n */\nexport type AgentRunErrorCode = KnownAgentRunErrorCode;\n\n/** Snapshot of every known code at runtime — used by the boundary coercer. */\nconst KNOWN_AGENT_RUN_ERROR_CODES = new Set<string>([\n \"rate_limit\",\n \"auth_failed\",\n \"invalid_request\",\n \"timeout\",\n \"server_error\",\n \"context_too_long\",\n \"content_filtered\",\n \"model_unavailable\",\n \"network\",\n \"unknown\",\n \"quota_exceeded\",\n \"tool_runtime_error\",\n \"aborted\",\n \"invalid_model\",\n \"safety_blocked\",\n \"provider_unreachable\",\n]);\n\n/**\n * T1.1 boundary helper — coerce an arbitrary string (typically arriving from\n * a downstream `RunErrorDetail.code` or a deserialized cloud response) into a\n * `KnownAgentRunErrorCode`. Unknown strings collapse to `\"unknown\"` so the\n * closed type contract holds without forcing every caller to switch.\n *\n * @internal\n */\nexport function coerceToKnownAgentRunErrorCode(code: string | undefined): KnownAgentRunErrorCode {\n if (code !== undefined && KNOWN_AGENT_RUN_ERROR_CODES.has(code)) {\n return code as KnownAgentRunErrorCode;\n }\n return \"unknown\";\n}\n\n/**\n * Structured context for errors that originated from a provider HTTP\n * call (ADR D65). Lets callers retry with the right backoff (`retryAfter`),\n * surface actionable diagnostics (`provider`, `endpoint`), and inspect the\n * raw response body when needed (`raw`, capped at ~2KB by the mapper).\n *\n * @public\n */\nexport interface ErrorMetadata {\n /** Provider canonical name (e.g., `\"anthropic\"`, `\"openai\"`, `\"openrouter\"`, `\"gemini\"`). */\n provider: string;\n /** HTTP endpoint that failed (e.g., `\"/v1/messages\"`, `\"/v1/chat/completions\"`). */\n endpoint: string;\n /** Machine-readable error code (finite enum). */\n code: ErrorCode;\n /** HTTP status code if applicable. */\n statusCode?: number;\n /** Seconds to wait before retry, per provider's `retry-after` header (numeric form only). */\n retryAfter?: number;\n /** Raw response body for debugging (truncated to ~2KB by the mapper). */\n raw?: unknown;\n}\n\n/**\n * Base class for all errors thrown by `@theokit/sdk`.\n *\n * Use `isRetryable` to drive retry/backoff logic. `code` and `protoErrorCode`\n * are populated for server-originated errors when available. `metadata`\n * (ADR D65) carries structured `{ provider, endpoint, code, ... }` when\n * the error originated from a provider HTTP call.\n *\n * @public\n */\nexport class TheokitAgentError extends Error {\n override readonly name: string = \"TheokitAgentError\";\n readonly isRetryable: boolean;\n readonly code?: string;\n readonly protoErrorCode?: string;\n readonly metadata?: ErrorMetadata;\n\n constructor(\n message: string,\n options: {\n isRetryable?: boolean;\n code?: string;\n protoErrorCode?: string;\n cause?: unknown;\n metadata?: ErrorMetadata;\n } = {},\n ) {\n super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.isRetryable = options.isRetryable ?? false;\n if (options.code !== undefined) this.code = options.code;\n if (options.protoErrorCode !== undefined) this.protoErrorCode = options.protoErrorCode;\n if (options.metadata !== undefined) this.metadata = options.metadata;\n }\n}\n\n/**\n * Invalid API key, not logged in, insufficient permissions.\n *\n * @public\n */\nexport class AuthenticationError extends TheokitAgentError {\n override readonly name: string = \"AuthenticationError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: false });\n }\n}\n\n/**\n * Too many requests or usage limits exceeded.\n *\n * @public\n */\nexport class RateLimitError extends TheokitAgentError {\n override readonly name: string = \"RateLimitError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: true });\n }\n}\n\n/**\n * Invalid model, bad request parameters, malformed options.\n *\n * @public\n */\nexport class ConfigurationError extends TheokitAgentError {\n override readonly name: string = \"ConfigurationError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: false });\n }\n}\n\n/**\n * Thrown when creating a cloud agent for a repo whose SCM provider is not\n * connected. Use `helpUrl` to point the user at the right reconnect flow.\n *\n * @public\n */\nexport class IntegrationNotConnectedError extends ConfigurationError {\n override readonly name: string = \"IntegrationNotConnectedError\";\n readonly provider: string;\n readonly helpUrl: string;\n\n constructor(\n message: string,\n options: {\n provider: string;\n helpUrl: string;\n code?: string;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, options);\n this.provider = options.provider;\n this.helpUrl = options.helpUrl;\n }\n}\n\n/**\n * Service unavailable, timeout, transport-level failure.\n *\n * @public\n */\nexport class NetworkError extends TheokitAgentError {\n override readonly name: string = \"NetworkError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: true });\n }\n}\n\n/**\n * Catch-all for unclassified server or runtime errors.\n *\n * @public\n */\nexport class UnknownAgentError extends TheokitAgentError {\n override readonly name: string = \"UnknownAgentError\";\n\n constructor(\n message: string,\n options: { code?: string; cause?: unknown; metadata?: ErrorMetadata } = {},\n ) {\n super(message, { ...options, isRetryable: false });\n }\n}\n\n/**\n * Thrown by `Agent.prompt` (and helpers that go through `run.wait()`) when\n * the option `{ throwOnError: true }` is set and the run terminates with\n * `status: 'error'`. Carries the structured `RunResult.error` fields so\n * callers can `catch` once and branch on `code` / `provider` instead of\n * unwrapping the run.\n *\n * Extends {@link TheokitAgentError} per ADR D65 — no new hierarchy.\n *\n * @example\n * try {\n * await Agent.prompt(msg, { apiKey, model, throwOnError: true });\n * } catch (err) {\n * if (err instanceof AgentRunError && err.code === 'auth_failed') {\n * // bad key\n * }\n * }\n *\n * @public\n */\nexport class AgentRunError extends TheokitAgentError {\n override readonly name: string = \"AgentRunError\";\n readonly provider?: string;\n readonly raw?: string;\n /** Provider's request id (`x-request-id` / `request-id` header). Useful for support tickets. */\n readonly requestId?: string;\n /** SDK conversation id this error was raised inside. */\n readonly conversationId?: string;\n\n constructor(\n message: string,\n options: {\n code: AgentRunErrorCode;\n provider?: string;\n raw?: string;\n requestId?: string;\n conversationId?: string;\n retriable?: boolean;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, {\n code: options.code,\n cause: options.cause,\n metadata: options.metadata,\n // D311: most AgentRunErrors are not retriable (auth, validation, abort).\n // Provider mappers (D314) override per-status — explicit `retriable` wins\n // over the implicit default when supplied.\n isRetryable: options.retriable ?? defaultRetriableForCode(options.code),\n });\n if (options.provider !== undefined) this.provider = options.provider;\n if (options.raw !== undefined) this.raw = options.raw;\n if (options.requestId !== undefined) this.requestId = options.requestId;\n if (options.conversationId !== undefined) this.conversationId = options.conversationId;\n }\n\n /**\n * Production-Readiness #3 (ADR D311): alias for `isRetryable` exposed as\n * `retriable` to match the handoff contract. Future v2 will deprecate\n * `isRetryable` in favor of this.\n */\n get retriable(): boolean {\n return this.isRetryable;\n }\n\n /**\n * D312: provider's `Retry-After` header in **milliseconds**. Mappers store\n * the header value (seconds) in `metadata.retryAfter`; this getter\n * multiplies by 1000 so the result composes with `Date.now()`/`setTimeout`.\n *\n * Returns `undefined` when no hint was provided. `0` is a legitimate value\n * — use `=== undefined` check rather than truthy check.\n */\n get retryAfterMs(): number | undefined {\n if (this.metadata?.retryAfter === undefined) return undefined;\n return this.metadata.retryAfter * 1000;\n }\n\n /**\n * D313 + T1.5: alias for `metadata.raw`. Provider response body for\n * debugging. T1.5 wraps the value in `redactSecrets` at the getter\n * boundary so secret-shaped substrings (`sk-...`, Bearer JWTs, etc.) are\n * stripped before reaching the caller. Available but NEVER serialized\n * into `.message` (anti-leak invariant).\n */\n get providerError(): unknown {\n const raw = this.metadata?.raw;\n if (raw === undefined) return undefined;\n if (typeof raw === \"string\") return redactSecrets(raw);\n // Non-string raw (object/buffer) — stringify then redact.\n try {\n return redactSecrets(JSON.stringify(raw));\n } catch {\n return redactSecrets(String(raw));\n }\n }\n\n /**\n * T1.5 — sanitized JSON form. `metadata.raw` is OMITTED by default; opt\n * in via `THEOKIT_DEBUG_RAW_ERRORS=1` to surface the (redacted) raw\n * payload for diagnostics. Every other field stays accessible.\n *\n * The single env-var gate is read each call so operators can toggle at\n * runtime without restarting the process.\n */\n toJSON(): Record<string, unknown> {\n const json: Record<string, unknown> = {\n name: this.name,\n message: this.message,\n isRetryable: this.isRetryable,\n };\n addOptionalFields(json, this);\n const safeMeta = sanitizeMetadata(this.metadata);\n if (safeMeta !== undefined) json.metadata = safeMeta;\n return json;\n }\n}\n\nfunction addOptionalFields(json: Record<string, unknown>, err: AgentRunError): void {\n if (err.code !== undefined) json.code = err.code;\n if (err.provider !== undefined) json.provider = err.provider;\n if (err.requestId !== undefined) json.requestId = err.requestId;\n if (err.conversationId !== undefined) json.conversationId = err.conversationId;\n if (err.raw !== undefined) json.raw = redactSecrets(err.raw);\n}\n\nfunction sanitizeMetadata(meta: ErrorMetadata | undefined): ErrorMetadata | undefined {\n if (meta === undefined) return undefined;\n const { raw, ...rest } = meta;\n const debugRaw = process.env.THEOKIT_DEBUG_RAW_ERRORS === \"1\";\n if (debugRaw && raw !== undefined) {\n const redactedRaw =\n typeof raw === \"string\" ? redactSecrets(raw) : redactSecrets(safeStringify(raw));\n return { ...rest, raw: redactedRaw } as ErrorMetadata;\n }\n return rest as ErrorMetadata;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Is this error transient (worth retrying)?\n *\n * Returns the SDK's own retryability verdict: every {@link TheokitAgentError}\n * subclass computes `isRetryable` at construction (rate-limit / network /\n * credential-pool-exhausted are retryable; auth / configuration / unsupported\n * are not), so this predicate is a single source of truth rather than a\n * re-derivation. Non-SDK errors return `false` conservatively — wrap a foreign\n * error in the appropriate SDK error first if you want it considered transient.\n * It never inspects `err.message`.\n *\n * @example\n * try {\n * await agent.send(message, { throwOnError: true });\n * } catch (err) {\n * if (isTransientError(err)) return retryWithBackoff();\n * throw err;\n * }\n *\n * @public\n */\nexport function isTransientError(err: unknown): boolean {\n return err instanceof TheokitAgentError && err.isRetryable === true;\n}\n\n/**\n * Thrown when a {@link Run} or agent operation is not available on the current\n * runtime. Check first with `run.supports(operation)`.\n *\n * Extends {@link TheokitAgentError} (so error-catching code that branches on\n * `instanceof TheokitAgentError` continues to work) but is never retryable —\n * an unsupported operation will not become supported on retry.\n *\n * @public\n */\nexport class UnsupportedRunOperationError extends TheokitAgentError {\n override readonly name: string = \"UnsupportedRunOperationError\";\n readonly operation: RunOperation;\n\n constructor(\n message: string,\n operation: RunOperation,\n options: { code?: string; cause?: unknown } = {},\n ) {\n super(message, {\n ...options,\n isRetryable: false,\n code: options.code ?? \"unsupported_run_operation\",\n });\n this.operation = operation;\n }\n}\n\n/**\n * Thrown when every credential in a per-provider pool is in cooldown\n * and no healthy key is available (ADR D133). The caller's\n * {@link import(\"./internal/llm/fallback-client.js\").FallbackLlmClient}\n * catches this and tries the next provider in the fallback chain.\n *\n * `metadata.nextRetryAt` (epoch ms) tells callers when the soonest\n * pool entry resumes — useful for manual retry scheduling.\n *\n * @public\n */\nexport class CredentialPoolExhaustedError extends TheokitAgentError {\n override readonly name: string = \"CredentialPoolExhaustedError\";\n readonly provider: string;\n readonly nextRetryAt: number | undefined;\n\n constructor(\n message: string,\n options: {\n provider: string;\n nextRetryAt?: number;\n code?: string;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, {\n ...options,\n isRetryable: true,\n code: options.code ?? \"credential_pool_exhausted\",\n });\n this.provider = options.provider;\n this.nextRetryAt = options.nextRetryAt;\n }\n}\n\n/**\n * Finite error codes specific to memory adapter operations (ADR D141).\n *\n * @public\n */\nexport type MemoryAdapterErrorCode =\n | \"auth_failed\"\n | \"rate_limited\"\n | \"not_found\"\n | \"network\"\n | \"invalid_input\"\n | \"unknown\";\n\n/**\n * Error raised by `@theokit-memory-*` adapters. Carries `adapterId`\n * so callers can branch on which provider failed (ADR D141).\n *\n * @public\n */\nexport class MemoryAdapterError extends TheokitAgentError {\n override readonly name: string = \"MemoryAdapterError\";\n readonly adapterId: string;\n\n constructor(\n message: string,\n options: {\n adapterId: string;\n code: MemoryAdapterErrorCode;\n cause?: unknown;\n metadata?: ErrorMetadata;\n },\n ) {\n super(message, {\n isRetryable: options.code === \"rate_limited\" || options.code === \"network\",\n code: options.code,\n ...(options.cause !== undefined ? { cause: options.cause } : {}),\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n });\n this.adapterId = options.adapterId;\n }\n}\n\n/**\n * Thrown when a user-supplied task ID violates the grammar\n * `^[a-z0-9][a-z0-9_-]*$` (D368) OR starts with a reserved adapter\n * prefix (`wf-` / `b-` / `cron-`, EC-5).\n *\n * @public\n */\nexport class InvalidTaskIdError extends TheokitAgentError {\n override readonly name: string = \"InvalidTaskIdError\";\n readonly taskId: string;\n\n constructor(message: string, taskId: string, options: { cause?: unknown } = {}) {\n super(message, {\n ...options,\n isRetryable: false,\n code: \"invalid_task_id\",\n });\n this.taskId = taskId;\n }\n}\n\n/**\n * Thrown when `Task.subscribe(id)` is called for a task that has been\n * evicted, never submitted, or evicted after retention (D373).\n *\n * @public\n */\nexport class TaskNotFoundError extends TheokitAgentError {\n override readonly name: string = \"TaskNotFoundError\";\n readonly taskId: string;\n\n constructor(taskId: string, options: { cause?: unknown } = {}) {\n super(`Task not found: ${taskId}`, {\n ...options,\n isRetryable: false,\n code: \"task_not_found\",\n });\n this.taskId = taskId;\n }\n}\n\n/**\n * Thrown when `CloudAgent` is asked to wrap a task (D370). Cloud\n * task observability is deferred until Theo PaaS GA.\n *\n * @public\n */\nexport class UnsupportedTaskOperationError extends TheokitAgentError {\n override readonly name: string = \"UnsupportedTaskOperationError\";\n readonly operation: string;\n\n constructor(operation: string, options: { cause?: unknown } = {}) {\n super(\n `Task operation \"${operation}\" is not supported on CloudAgent (pre-release; see ADR D370)`,\n {\n ...options,\n isRetryable: false,\n code: \"task_op_unsupported\",\n },\n );\n this.operation = operation;\n }\n}\n\n/**\n * Thrown by `Budget` enforcement (ADR D386) when a `mode: \"block\"`\n * budget would be exceeded by the upcoming LLM call. Caller pega\n * tipado para retry-after-window-reset or surface to the user.\n *\n * @public\n */\nexport class BudgetExceededError extends TheokitAgentError {\n override readonly name: string = \"BudgetExceededError\";\n readonly budgetName: string;\n readonly window: import(\"./types/budget.js\").BudgetWindow;\n readonly spentUsd: number;\n readonly limitUsd: number;\n readonly mode: import(\"./types/budget.js\").BudgetMode;\n\n constructor(args: {\n budgetName: string;\n window: import(\"./types/budget.js\").BudgetWindow;\n spentUsd: number;\n limitUsd: number;\n mode: import(\"./types/budget.js\").BudgetMode;\n cause?: unknown;\n }) {\n super(\n `Budget \"${args.budgetName}\" exceeded for window ${args.window}: spent $${args.spentUsd.toFixed(4)} > limit $${args.limitUsd.toFixed(4)}`,\n {\n ...(args.cause !== undefined ? { cause: args.cause } : {}),\n isRetryable: false,\n code: \"budget_exceeded\",\n },\n );\n this.budgetName = args.budgetName;\n this.window = args.window;\n this.spentUsd = args.spentUsd;\n this.limitUsd = args.limitUsd;\n this.mode = args.mode;\n }\n}\n\n/**\n * Thrown when `CloudAgent.send({ budget })` is invoked (D388). Cloud\n * budget surface waits for Theo PaaS GA.\n *\n * @public\n */\n/**\n * T1.6 — Thrown when a consumer calls `agent.send()` or any method\n * on an agent that has already been `dispose()`d. Pre-T1.6 this was\n * a generic `new Error(\"Agent has been disposed\")` — consumers\n * couldn't catch it without string-matching the message.\n *\n * @public\n */\nexport class AgentDisposedError extends TheokitAgentError {\n override readonly name: string = \"AgentDisposedError\";\n readonly agentId: string;\n\n constructor(agentId: string) {\n super(`Agent \"${agentId}\" has been disposed. Create a new agent or use Agent.resume().`, {\n isRetryable: false,\n code: \"agent_disposed\",\n });\n this.agentId = agentId;\n }\n}\n\nexport class UnsupportedBudgetOperationError extends TheokitAgentError {\n override readonly name: string = \"UnsupportedBudgetOperationError\";\n readonly operation: string;\n\n constructor(operation: string, options: { cause?: unknown } = {}) {\n super(\n `Budget operation \"${operation}\" is not supported on CloudAgent (pre-release; see ADR D388)`,\n {\n ...options,\n isRetryable: false,\n code: \"budget_op_unsupported\",\n },\n );\n this.operation = operation;\n }\n}\n","/**\n * Canonical path-guard module (ADRs D79-D81).\n *\n * Three primitives + one typed error:\n * - `safePathJoin(base, ...parts)` — resolve THEN prefix-check (ADR D80).\n * - `assertNoSymlinkEscape(path, base)` — `realpathSync` resolves entire\n * symlink chain (EC-1 fix; Hermes v0.2 #386, #61).\n * - `sanitizeIdentifier(input, { maxLen })` — strict grammar\n * `^[a-z0-9][a-z0-9-_]*$` (ADR D81; case-insensitive on input,\n * lowercase on output).\n * - `PathTraversalError` — extends ConfigurationError with code\n * `path_traversal` (ADR D65: no new hierarchy).\n *\n * Wire at all sites where user input becomes a path. CI lint gate\n * `tests/lint/no-unguarded-path-input.test.ts` prevents regression\n * (ADR D85).\n *\n * @internal\n */\n\nimport { createHash } from \"node:crypto\";\nimport { lstatSync, readlinkSync, realpathSync, type Stats } from \"node:fs\";\nimport { dirname, resolve, sep } from \"node:path\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\n/**\n * Thrown when a path operation would escape its allowed base directory.\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @internal\n */\nexport class PathTraversalError extends ConfigurationError {\n override readonly name: string = \"PathTraversalError\";\n\n constructor(input: string, resolvedPath: string) {\n super(`Path traversal attempt: ${input} → ${resolvedPath}`, {\n code: \"path_traversal\",\n });\n }\n}\n\n/**\n * Thrown when an agent tool is asked to read or write a sensitive path\n * that the blocklist forbids (`.env`, `.git/`, `node_modules/`, `.theo/`,\n * lock files). Distinct from `PathTraversalError` because the path is\n * lexically inside the project — it is just sensitive.\n *\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @public\n */\nexport class ForbiddenPathError extends ConfigurationError {\n override readonly name: string = \"ForbiddenPathError\";\n\n constructor(path: string) {\n super(\n `Path '${path}' is in the sensitive-file blocklist (.env, .git/, node_modules/, .theo/, lock files)`,\n {\n code: \"forbidden_path\",\n },\n );\n }\n}\n\n/**\n * Is `target` the same as `base`, or strictly under it?\n *\n * The prefix must not double the separator. `resolve` strips a trailing `sep` from every base\n * EXCEPT the filesystem root, where `resolve(sep) === sep`; there `base + sep` would be `//`, which\n * no absolute path starts with, so a root base rejected EVERY path (#149). Only the root takes that\n * branch — for any other base the prefix is unchanged, so containment is not weakened.\n *\n * Both containment checks in this module go through here: they had the same defect and were fixed\n * one at a time, which is exactly how the two drifted apart in the first place.\n *\n * Both arguments MUST already be resolved absolute paths.\n */\nfunction isInside(target: string, base: string): boolean {\n if (target === base) return true;\n const prefix = base.endsWith(sep) ? base : base + sep;\n return target.startsWith(prefix);\n}\n\n/**\n * Join `base` with `...parts` and ensure the resolved absolute path stays\n * under `base`. Resolves FIRST, then prefix-checks (ADR D80) — prevents\n * normalized-escape bypasses like `subdir/.\\\\./bar`.\n *\n * Returns the safe absolute path. Throws `PathTraversalError` if escape.\n *\n * @internal\n */\nexport function safePathJoin(base: string, ...parts: string[]): string {\n if (base === \"\") {\n throw new Error(\"safePathJoin: base must be non-empty\");\n }\n // T5.5 — NUL byte + C0/DEL control char rejection at the boundary.\n // Apply before path resolution so a malicious input never reaches\n // `resolve` (which on some platforms behaved unexpectedly with NUL\n // and in N-API callers historically silently truncated).\n rejectNulAndControlChars(base, \"base\");\n for (const part of parts) {\n rejectNulAndControlChars(part, \"path segment\");\n }\n const baseResolved = resolve(base);\n const target = resolve(base, ...parts);\n if (!isInside(target, baseResolved)) {\n throw new PathTraversalError(parts.join(\"/\"), target);\n }\n return target;\n}\n\n/**\n * T5.5 — Reject NUL (`\\x00`) and C0/DEL control characters\n * (`\\x01-\\x1F`, `\\x7F`) in any path-shaped or identifier-shaped input.\n * Centralizes the check so every public path-guard / sanitize entrypoint\n * shares the same defense.\n *\n * Throws `PathTraversalError` (the same shape as other path-shape\n * rejections) so callers don't need to learn a new error class.\n *\n * @internal\n */\nfunction rejectNulAndControlChars(input: string, role: string): void {\n for (let i = 0; i < input.length; i++) {\n const code = input.charCodeAt(i);\n if (code === 0x00 || (code >= 0x01 && code <= 0x1f) || code === 0x7f) {\n const label = code === 0x00 ? \"<nul-byte>\" : `<control-char-0x${code.toString(16)}>`;\n throw new PathTraversalError(`${role}: ${input}`, label);\n }\n }\n}\n\n/**\n * Assert that `path` — including every directory component in the chain —\n * stays under `base` after symlink resolution. No-op when nothing on the\n * path exists yet.\n *\n * Two-bug history:\n * 1. **EC-1** (original fix, kept): a multi-level symlink chain A → B → C\n * must be resolved end-to-end. `realpathSync` does this in 1 syscall.\n * 2. **Defence-in-depth** (added v1.x): the previous implementation only\n * called `lstatSync(path)` on the terminal component. If an INTERMEDIATE\n * directory was a symlink (`base/inner-symlink → /outside`), `lstat` on\n * `base/inner-symlink/file.txt` followed the symlink and reported the\n * regular file — escape went undetected. Fix: walk up to the nearest\n * existing ancestor and `realpath` THAT, then re-attach the suffix and\n * check the result against the canonical base.\n *\n * @internal\n */\nexport function assertNoSymlinkEscape(path: string, base: string): void {\n // T5.5 — reject NUL / control chars before any FS call (a NUL byte\n // in the path used to silently truncate at the C boundary on legacy\n // libc — defense in depth even on modern Node).\n rejectNulAndControlChars(path, \"path\");\n rejectNulAndControlChars(base, \"base\");\n // Canonical base — symlinks in the base path itself are absorbed once here.\n let baseResolved: string;\n try {\n baseResolved = realpathSync(base);\n } catch {\n // base doesn't exist as a real directory yet — fall back to lexical resolve.\n baseResolved = resolve(base);\n }\n\n // Find the deepest ancestor of `path` that exists, then realpath it.\n // Anything from there onward is \"not yet on disk\" and contributes only\n // its lexical suffix. This covers three cases:\n // - path exists (regular file or symlink at any depth) → realpath the full path\n // - path doesn't exist but intermediate dir is a symlink → realpath the ancestor\n // - nothing on the path exists → no escape risk (return)\n const resolved = realpathOfDeepestExisting(path);\n if (resolved === undefined) return; // path has no existing prefix — nothing to attack\n\n if (!isInside(resolved, baseResolved)) {\n throw new PathTraversalError(`symlink ${path}`, resolved);\n }\n}\n\n/**\n * Find the deepest ancestor of `path` that exists on disk, resolve all\n * symlinks in that ancestor via `realpathSync`, and re-attach the\n * lexical suffix. Returns `undefined` when no ancestor exists.\n *\n * Handles dangling symlinks: if the terminal IS a symlink but its target\n * is missing, we still detect escape via `readlinkSync` + parent resolve.\n */\nfunction realpathOfDeepestExisting(path: string): string | undefined {\n // First try the full path — the common case.\n try {\n return realpathSync(path);\n } catch {\n // Not resolvable. Two sub-cases.\n }\n\n // Sub-case A: terminal is a dangling symlink.\n try {\n const stat: Stats = lstatSync(path);\n if (stat.isSymbolicLink()) {\n const target = readlinkSync(path);\n // Resolve target relative to the REAL parent dir, so intermediate\n // symlinks in the parent chain are absorbed.\n const parentReal = realpathOfDeepestExisting(dirname(path));\n const parentBase = parentReal ?? dirname(path);\n return resolve(parentBase, target);\n }\n } catch {\n // lstat failed too — terminal doesn't exist at all.\n }\n\n // Sub-case B: walk up to the nearest existing ancestor, then re-attach\n // the suffix lexically.\n let cursor = dirname(path);\n let suffix = path.slice(cursor.length);\n while (cursor !== dirname(cursor)) {\n try {\n const real = realpathSync(cursor);\n // Reconstruct: ancestor's realpath + remaining (still-lexical) suffix\n return resolve(real, `.${suffix}`);\n } catch {\n suffix = path.slice(dirname(cursor).length);\n cursor = dirname(cursor);\n }\n }\n // Reached filesystem root without finding any existing ancestor.\n return undefined;\n}\n\nconst LOCK_FILES = new Set([\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\", \"bun.lockb\"]);\n\n// T5.6 — top-level credential dot-dirs / dot-files. Matching against\n// the FIRST path segment (lowercase). Adding any entry here costs a\n// CHANGELOG note + an explicit case-fold test (entries are lowercased\n// at module load).\nconst SENSITIVE_FIRST_SEGMENTS = new Set([\n \".ssh\",\n \".aws\",\n \".docker\",\n \".kube\",\n \".npmrc\",\n \".netrc\",\n \".pgpass\",\n]);\n\n// T5.6 — credential basenames blocked at ANY depth (lowercase). Catches\n// the developer-laptop case where an agent recurses into a subdir.\nconst SENSITIVE_BASENAMES = new Set([\n \"id_rsa\",\n \"id_ed25519\",\n \"id_ecdsa\",\n \"id_dsa\",\n \"authorized_keys\",\n \"known_hosts\",\n \".npmrc\",\n \".netrc\",\n \".pgpass\",\n]);\n\n// T5.6 — extension suffixes blocked at ANY depth (lowercase). Covers\n// the entire `*.pem` / `*.key` private-material family.\nconst SENSITIVE_SUFFIXES = [\".pem\", \".key\", \".p12\", \".pfx\"];\n\n/**\n * Decide whether a project-relative path points to a known-sensitive file\n * that a coding agent must not read or write.\n *\n * Universal blocklist (works for any agent operating on a project tree):\n *\n * - `.env`, `.env.<anything>` — except `.env.example` (template safe to read)\n * - `.git/` — version control internals\n * - `node_modules/` — dependency cache (changes don't belong to the user)\n * - `.theo/` — TheoKit build artefacts / state\n * - Lock files at any depth: `pnpm-lock.yaml`, `package-lock.json`,\n * `yarn.lock`, `bun.lockb`\n *\n * Operates on path segments (forward-slash normalized). Cross-platform safe.\n *\n * Use together with `safePathJoin` + `assertNoSymlinkEscape`: the former two\n * defeat traversal, this one defeats reading a file that is lexically inside\n * the project but should not be agent-visible.\n *\n * @public\n */\nexport function isForbiddenPath(input: string): boolean {\n // T5.6 — lowercase normalization defeats case-only bypass on\n // case-insensitive filesystems (Windows/macOS-default) where `.ENV`\n // and `.env` map to the same inode but a case-sensitive string\n // check passes the former.\n const normalized = input.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\").toLowerCase();\n if (normalized.length === 0) return false;\n\n const segments = normalized.split(\"/\").filter((s) => s.length > 0);\n if (segments.length === 0) return false;\n\n if (isForbiddenFirstSegment(segments[0]!)) return true;\n if (isForbiddenBasename(segments[segments.length - 1]!)) return true;\n return false;\n}\n\nfunction isForbiddenFirstSegment(first: string): boolean {\n // .env.example is explicitly allowlisted (template safe to read)\n if (first === \".env.example\") return false;\n if (first === \".env\") return true;\n if (/^\\.env\\./.test(first)) return true;\n if (first === \".git\" || first === \"node_modules\" || first === \".theo\") return true;\n return SENSITIVE_FIRST_SEGMENTS.has(first);\n}\n\nfunction isForbiddenBasename(basename: string): boolean {\n if (LOCK_FILES.has(basename)) return true;\n if (SENSITIVE_BASENAMES.has(basename)) return true;\n for (const suffix of SENSITIVE_SUFFIXES) {\n if (basename.endsWith(suffix)) return true;\n }\n return false;\n}\n\nconst IDENTIFIER_PATTERN = /^[a-z0-9][a-z0-9\\-_]*$/i;\n\n/**\n * Validate that `input` is a safe path component (skill name, agent ID,\n * namespace, etc.) and return its lowercase form. Strict grammar\n * `^[a-z0-9][a-z0-9-_]*$` rejects path separators, dots, null bytes,\n * whitespace, unicode invisible chars, and any leading `-`/`_`.\n *\n * @param input - User-supplied identifier candidate.\n * @param options.maxLen - Maximum allowed length (default 64).\n * @returns Lowercase form of `input`.\n * @throws `ConfigurationError` with code `invalid_identifier` on rejection.\n *\n * @internal\n */\n/**\n * T1.4 — validate a relative artifact path string BEFORE it is used to look\n * up a fixture or to fetch from PaaS. Rejects every well-known traversal\n * vector at the boundary, throwing `PathTraversalError`.\n *\n * Vectors rejected:\n * - classic `..` parent-directory traversal (any segment).\n * - backslash separators (Windows-style `..\\\\windows`).\n * - URL-encoded `%2e%2e` / `%2E%2E` (double-decoded traversal).\n * - NUL byte injection (`\\x00`).\n * - Windows drive letter prefix (`C:`, `D:\\\\...`).\n * - Home-tilde expansion (`~/`, `~root/...`).\n * - Absolute paths starting with `/`.\n *\n * Does NOT touch the filesystem — the call is shape-only. Live symlink\n * traversal protection happens via `assertNoSymlinkEscape` at the FS-resolve\n * boundary.\n *\n * @param input - Caller-supplied artifact path.\n * @throws `PathTraversalError` on any rejection.\n *\n * @internal\n */\nexport function validateArtifactPath(input: string): void {\n rejectKnownPrefixVectors(input);\n const normalized = decodeAndNormalize(input);\n rejectParentTraversal(input, normalized);\n}\n\nfunction rejectKnownPrefixVectors(input: string): void {\n if (input.includes(\"\\x00\")) {\n throw new PathTraversalError(input, \"<nul-byte>\");\n }\n if (input.startsWith(\"/\") || input.startsWith(\"~\")) {\n throw new PathTraversalError(input, input);\n }\n if (/^[A-Za-z]:[\\\\/]?/.test(input)) {\n throw new PathTraversalError(input, input);\n }\n}\n\nfunction decodeAndNormalize(input: string): string {\n // URL-encoded traversal — 2 passes catches `%252e%252e`.\n // Malformed sequences (decodeURIComponent throws) are themselves a rejection.\n let decoded = input;\n for (let i = 0; i < 2; i += 1) {\n try {\n const next = decodeURIComponent(decoded);\n if (next === decoded) break;\n decoded = next;\n } catch {\n throw new PathTraversalError(input, \"<malformed-url-encoding>\");\n }\n }\n // Normalize backslash to forward slash before segment-walking.\n return decoded.replace(/\\\\/g, \"/\");\n}\n\nfunction rejectParentTraversal(input: string, normalized: string): void {\n for (const segment of normalized.split(\"/\")) {\n if (segment === \"..\" || segment === \"..%00\") {\n throw new PathTraversalError(input, normalized);\n }\n }\n // Defense in depth: literal `..` anywhere in the normalized string.\n if (normalized.includes(\"..\")) {\n throw new PathTraversalError(input, normalized);\n }\n}\n\nexport function sanitizeIdentifier(input: string, options?: { maxLen?: number }): string {\n const maxLen = options?.maxLen ?? 64;\n if (input.length === 0 || input.length > maxLen) {\n throw new ConfigurationError(`Identifier length out of range (1-${maxLen}): \"${input}\"`, {\n code: \"invalid_identifier\",\n });\n }\n // T5.5 — explicit NUL / control char rejection ahead of the generic\n // pattern check. The IDENTIFIER_PATTERN regex already excludes these\n // (they are not in `[a-z0-9\\-_]`), but routing them through the same\n // helper used by safePathJoin gives operators a precise diagnostic\n // (\"nul-byte\" / \"control-char-0x..\") instead of the generic\n // \"invalid characters\" message — making prompt-injection traces\n // legible per Inquebrável Rule 3.\n rejectNulAndControlChars(input, \"identifier\");\n if (!IDENTIFIER_PATTERN.test(input)) {\n throw new ConfigurationError(`Identifier contains invalid characters: \"${input}\"`, {\n code: \"invalid_identifier\",\n });\n }\n return input.toLowerCase();\n}\n\n/**\n * Convert ANY opaque id (agent id, run id, conversation id, namespace, email,\n * arbitrary string) into a deterministic, filesystem-safe filename component.\n *\n * Unlike {@link sanitizeIdentifier} (which THROWS on non-conforming input),\n * this is a total function: it NEVER throws on a non-empty string. It returns\n * the lowercased id verbatim when it already matches the safe grammar\n * `^[a-z0-9][a-z0-9-_]*$` and fits `maxLen` (so UUIDs, hashes, and slugs stay\n * human-readable), otherwise a deterministic `h-<16 hex>` sha256 token\n * (collision-resistant and always a valid filename). The output charset is\n * always `[a-z0-9_-]`, safe as a literal path segment on every filesystem.\n *\n * @param id - any opaque identifier (must be a non-empty string)\n * @param options.maxLen - max length for the passthrough branch (default 128).\n * Ids longer than this are hashed; the hash token itself is always short.\n * @throws ConfigurationError (code `invalid_filename_id`) only on empty input.\n *\n * @example\n * safeFilenameForId(\"550e8400-e29b-41d4-a716-446655440000\") // passthrough\n * safeFilenameForId(\"user@example.com\") // \"h-<16hex>\"\n *\n * @internal — public via `@theokit/sdk/path-safety`\n */\nexport function safeFilenameForId(id: string, options?: { maxLen?: number }): string {\n if (id.length === 0) {\n throw new ConfigurationError(\"Filename id must be a non-empty string\", {\n code: \"invalid_filename_id\",\n });\n }\n const maxLen = options?.maxLen ?? 128;\n const lower = id.toLowerCase();\n if (lower.length <= maxLen && IDENTIFIER_PATTERN.test(lower)) {\n return lower;\n }\n return `h-${createHash(\"sha256\").update(id).digest(\"hex\").slice(0, 16)}`;\n}\n","/**\n * Filesystem backend protocol — a pluggable file *storage* provider for agent\n * tools, the storage-side twin of {@link SandboxBackend} (execution-side).\n *\n * SE31 (a peer framework Workspaces comparison). Mirrors `SandboxBackend`'s shape: a small\n * set of abstract methods (`readFile` / `writeFile` / `stat` / `list`) with\n * `exists()` derived on the base class, a boundary `basePath`, a `readOnly`\n * flag, and typed errors. Unlike `SandboxBackend` (whose file ops shell out via\n * `execute`, requiring command execution and giving NO structured `stat`), a\n * `FilesystemBackend` serves a *filesystem-only* workspace with no sandbox and\n * exposes a real `stat().mtimeMs` — the primitive SE32's read-before-write\n * safety compares against. See ADR 0011.\n *\n * New backends (S3, GCS, in-memory) implement the four abstract methods; higher\n * level helpers derive on the base. This is the backend *seam* — it does NOT\n * ship agent-facing tools nor a bundled workspace (bring-your-own-tools stands).\n *\n * @public\n */\n\n/** Structured file metadata. `mtimeMs` is the read-before-write oracle (SE32). */\nexport interface FileStat {\n readonly size: number;\n readonly mtimeMs: number;\n readonly isFile: boolean;\n readonly isDirectory: boolean;\n}\n\n/** Options a write may carry. SE32 adds `expectedMtime` (stale-write guard). */\nexport interface WriteFileOptions {\n /**\n * SE32 — when set, the write fails with {@link StaleFileError} if the file's\n * current `mtimeMs` differs (someone changed it since it was last read).\n */\n readonly expectedMtime?: number;\n}\n\nexport interface FilesystemConfig {\n /** Boundary root. Every path is resolved within it; escapes are rejected. */\n readonly basePath?: string;\n /** When true, every write throws {@link FilesystemReadOnlyError}. */\n readonly readOnly?: boolean;\n}\n\n/** A path escaped the backend's `basePath` (traversal or symlink). */\nexport class FilesystemSecurityError extends Error {\n readonly code = \"filesystem_security\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemSecurityError\";\n }\n}\n\n/** A write was attempted on a read-only backend. */\nexport class FilesystemReadOnlyError extends Error {\n readonly code = \"filesystem_readonly\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemReadOnlyError\";\n }\n}\n\n/** A read/stat targeted a path that does not exist. */\nexport class FileNotFoundError extends Error {\n readonly code = \"filesystem_not_found\" as const;\n constructor(public readonly path: string) {\n super(`File not found: ${path}`);\n this.name = \"FileNotFoundError\";\n }\n}\n\n/**\n * A filesystem I/O operation failed for a reason other than not-found /\n * read-only / stale / security (e.g. `ENOTDIR` — a path component is a file, or\n * `EACCES` / `ENOSPC`). Carries the original error as `cause` so no raw,\n * untyped Node `SystemError` ever escapes the backend (Unbreakable Rule 8).\n */\nexport class FilesystemError extends Error {\n readonly code = \"filesystem_io\" as const;\n constructor(\n public readonly path: string,\n cause: unknown,\n ) {\n super(\n `Filesystem operation failed on \"${path}\": ${(cause as { message?: string })?.message ?? cause}`,\n {\n cause,\n },\n );\n this.name = \"FilesystemError\";\n }\n}\n\n/**\n * SE32 — a write's `expectedMtime` did not match the file's current mtime: the\n * file changed since it was last read, so the write would silently clobber.\n */\nexport class StaleFileError extends Error {\n readonly code = \"filesystem_stale\" as const;\n constructor(\n public readonly path: string,\n public readonly expectedMtime: number,\n public readonly actualMtime: number,\n ) {\n super(\n `Stale write to \"${path}\": expected mtime ${expectedMtime}, found ${actualMtime} ` +\n `(file changed since last read — re-read before writing)`,\n );\n this.name = \"StaleFileError\";\n }\n}\n\n/**\n * Pluggable filesystem backend. Implement the four abstract methods; `exists()`\n * and the `readOnly`/`basePath` accessors derive on the base class.\n *\n * @public\n */\nexport abstract class FilesystemBackend {\n protected readonly _basePath: string;\n protected readonly _readOnly: boolean;\n\n constructor(config: FilesystemConfig = {}) {\n this._basePath = config.basePath ?? process.cwd();\n this._readOnly = config.readOnly ?? false;\n }\n\n /** Read a boundary-relative file as UTF-8. Throws {@link FileNotFoundError}. */\n abstract readFile(path: string): Promise<string>;\n\n /**\n * Write UTF-8 content to a boundary-relative path (creating parents). Returns\n * the new {@link FileStat}. Throws {@link FilesystemReadOnlyError} on a\n * read-only backend and {@link StaleFileError} when `opts.expectedMtime`\n * mismatches (SE32).\n */\n abstract writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat>;\n\n /** Structured metadata for a path. Throws {@link FileNotFoundError}. */\n abstract stat(path: string): Promise<FileStat>;\n\n /** Directory entry names (not recursive). Throws {@link FileNotFoundError}. */\n abstract list(path: string): Promise<string[]>;\n\n /** Derived — true iff `stat(path)` resolves (absent ⇒ false). */\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (err) {\n if (err instanceof FileNotFoundError) return false;\n throw err;\n }\n }\n\n /** Throw {@link FilesystemReadOnlyError} when the backend is read-only. */\n protected assertWritable(): void {\n if (this._readOnly) {\n throw new FilesystemReadOnlyError(`Filesystem is read-only (basePath: ${this._basePath})`);\n }\n }\n\n get readOnly(): boolean {\n return this._readOnly;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n}\n\n/**\n * A backend OR a per-request resolver of one. A resolver runs at tool-execution\n * time (the request scope), so multi-tenant / multi-role agents get a distinct\n * root or permission set per request without a shared mutable backend.\n *\n * @public\n */\nexport type FilesystemProvider<Ctx = unknown> =\n | FilesystemBackend\n | ((ctx: Ctx) => FilesystemBackend | Promise<FilesystemBackend>);\n\n/** Resolve a {@link FilesystemProvider} to a concrete backend for `ctx`. */\nexport async function resolveFilesystem<Ctx>(\n provider: FilesystemProvider<Ctx>,\n ctx: Ctx,\n): Promise<FilesystemBackend> {\n return provider instanceof FilesystemBackend ? provider : provider(ctx);\n}\n","/**\n * LocalFilesystem — a {@link FilesystemBackend} over the local process\n * filesystem (`node:fs/promises`), boundary-enforced against `basePath`.\n *\n * **This is NOT an isolation boundary** (same OS, same user). Its safety\n * affordances are path-boundary enforcement (traversal + symlink escape,\n * reusing the core `internal/security/path-guard` primitives) and the optional\n * `readOnly` flag. For untrusted code, run it inside a container/VM sandbox.\n *\n * The check-then-use gap between `assertNoSymlinkEscape` and the subsequent\n * `fs` call is a known TOCTOU: a local attacker could atomically swap an\n * in-boundary symlink after the check. Closing it needs `O_NOFOLLOW`, which\n * Node's `fs/promises` does not expose — accepted for same-user local contexts.\n *\n * SE31 (a peer framework Workspaces comparison). See ADR 0011.\n *\n * @public\n */\n\nimport {\n readFile as fsReadFile,\n stat as fsStat,\n writeFile as fsWriteFile,\n mkdir,\n readdir,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport {\n assertNoSymlinkEscape,\n PathTraversalError,\n safePathJoin,\n} from \"../internal/security/path-guard.js\";\nimport {\n FileNotFoundError,\n type FileStat,\n FilesystemBackend,\n type FilesystemConfig,\n FilesystemError,\n FilesystemSecurityError,\n StaleFileError,\n type WriteFileOptions,\n} from \"./types.js\";\n\nexport class LocalFilesystem extends FilesystemBackend {\n constructor(config: FilesystemConfig = {}) {\n super(config);\n }\n\n async readFile(path: string): Promise<string> {\n const abs = this.resolve(path);\n try {\n return await fsReadFile(abs, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n async writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat> {\n // Security boundary FIRST (a traversal path on a read-only backend must\n // report the security error, not the read-only one — fail-clear).\n const abs = this.resolve(path);\n this.assertWritable();\n // SE32 — stale-write guard: if the caller passed the mtime it last read,\n // reject when the file changed underneath it (never a silent clobber).\n if (opts?.expectedMtime !== undefined) {\n await this.assertNotStale(path, abs, opts.expectedMtime);\n }\n try {\n await mkdir(dirname(abs), { recursive: true });\n await fsWriteFile(abs, content, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n return this.statAbs(abs, path);\n }\n\n async stat(path: string): Promise<FileStat> {\n const abs = this.resolve(path);\n return this.statAbs(abs, path);\n }\n\n async list(path: string): Promise<string[]> {\n const abs = this.resolve(path);\n try {\n return await readdir(abs);\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n private async statAbs(abs: string, relPath: string): Promise<FileStat> {\n try {\n const s = await fsStat(abs);\n return {\n size: s.size,\n mtimeMs: s.mtimeMs,\n isFile: s.isFile(),\n isDirectory: s.isDirectory(),\n };\n } catch (err) {\n throw this.mapError(err, relPath);\n }\n }\n\n /** SE32 — compare the on-disk mtime against the caller's expected value. */\n private async assertNotStale(relPath: string, abs: string, expectedMtime: number): Promise<void> {\n let current: number | undefined;\n try {\n current = (await fsStat(abs)).mtimeMs;\n } catch (err) {\n // A brand-new file (does not exist yet) cannot be stale — allow the write.\n if ((err as { code?: string }).code === \"ENOENT\") return;\n throw this.mapError(err, relPath);\n }\n if (current !== expectedMtime) {\n throw new StaleFileError(relPath, expectedMtime, current);\n }\n }\n\n /**\n * Resolve a boundary-relative path to an absolute one, rejecting lexical\n * traversal (`..`, absolute, NUL) and symlink escape — both reusing the core\n * path-guard primitives, remapped to {@link FilesystemSecurityError}.\n */\n private resolve(path: string): string {\n let abs: string;\n try {\n abs = safePathJoin(this._basePath, path);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath: ${path}`);\n }\n throw err;\n }\n try {\n assertNoSymlinkEscape(abs, this._basePath);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath via symlink: ${path}`);\n }\n throw err;\n }\n return abs;\n }\n\n private mapError(err: unknown, path: string): Error {\n if (\n err instanceof FilesystemSecurityError ||\n err instanceof FilesystemError ||\n err instanceof FileNotFoundError ||\n err instanceof StaleFileError\n ) {\n return err;\n }\n if ((err as { code?: string }).code === \"ENOENT\") return new FileNotFoundError(path);\n // ENOTDIR (a path component is a file), EACCES, ENOSPC, … — never leak a\n // raw untyped Node SystemError (Rule 8); wrap with the original as cause.\n return new FilesystemError(path, err);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/filesystem/types.ts","../../src/filesystem/local-filesystem.ts"],"names":["fsReadFile","path","mkdir","dirname","fsWriteFile","readdir","fsStat","safePathJoin","PathTraversalError","assertNoSymlinkEscape"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Filesystem backend protocol — a pluggable file *storage* provider for agent\n * tools, the storage-side twin of {@link SandboxBackend} (execution-side).\n *\n * SE31 (a peer framework Workspaces comparison). Mirrors `SandboxBackend`'s shape: a small\n * set of abstract methods (`readFile` / `writeFile` / `stat` / `list`) with\n * `exists()` derived on the base class, a boundary `basePath`, a `readOnly`\n * flag, and typed errors. Unlike `SandboxBackend` (whose file ops shell out via\n * `execute`, requiring command execution and giving NO structured `stat`), a\n * `FilesystemBackend` serves a *filesystem-only* workspace with no sandbox and\n * exposes a real `stat().mtimeMs` — the primitive SE32's read-before-write\n * safety compares against. See ADR 0011.\n *\n * New backends (S3, GCS, in-memory) implement the four abstract methods; higher\n * level helpers derive on the base. This is the backend *seam* — it does NOT\n * ship agent-facing tools nor a bundled workspace (bring-your-own-tools stands).\n *\n * @public\n */\n\n/** Structured file metadata. `mtimeMs` is the read-before-write oracle (SE32). */\nexport interface FileStat {\n readonly size: number;\n readonly mtimeMs: number;\n readonly isFile: boolean;\n readonly isDirectory: boolean;\n}\n\n/** Options a write may carry. SE32 adds `expectedMtime` (stale-write guard). */\nexport interface WriteFileOptions {\n /**\n * SE32 — when set, the write fails with {@link StaleFileError} if the file's\n * current `mtimeMs` differs (someone changed it since it was last read).\n */\n readonly expectedMtime?: number;\n}\n\nexport interface FilesystemConfig {\n /** Boundary root. Every path is resolved within it; escapes are rejected. */\n readonly basePath?: string;\n /** When true, every write throws {@link FilesystemReadOnlyError}. */\n readonly readOnly?: boolean;\n}\n\n/** A path escaped the backend's `basePath` (traversal or symlink). */\nexport class FilesystemSecurityError extends Error {\n readonly code = \"filesystem_security\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemSecurityError\";\n }\n}\n\n/** A write was attempted on a read-only backend. */\nexport class FilesystemReadOnlyError extends Error {\n readonly code = \"filesystem_readonly\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemReadOnlyError\";\n }\n}\n\n/** A read/stat targeted a path that does not exist. */\nexport class FileNotFoundError extends Error {\n readonly code = \"filesystem_not_found\" as const;\n constructor(public readonly path: string) {\n super(`File not found: ${path}`);\n this.name = \"FileNotFoundError\";\n }\n}\n\n/**\n * A filesystem I/O operation failed for a reason other than not-found /\n * read-only / stale / security (e.g. `ENOTDIR` — a path component is a file, or\n * `EACCES` / `ENOSPC`). Carries the original error as `cause` so no raw,\n * untyped Node `SystemError` ever escapes the backend (Unbreakable Rule 8).\n */\nexport class FilesystemError extends Error {\n readonly code = \"filesystem_io\" as const;\n constructor(\n public readonly path: string,\n cause: unknown,\n ) {\n super(\n `Filesystem operation failed on \"${path}\": ${(cause as { message?: string })?.message ?? cause}`,\n {\n cause,\n },\n );\n this.name = \"FilesystemError\";\n }\n}\n\n/**\n * SE32 — a write's `expectedMtime` did not match the file's current mtime: the\n * file changed since it was last read, so the write would silently clobber.\n */\nexport class StaleFileError extends Error {\n readonly code = \"filesystem_stale\" as const;\n constructor(\n public readonly path: string,\n public readonly expectedMtime: number,\n public readonly actualMtime: number,\n ) {\n super(\n `Stale write to \"${path}\": expected mtime ${expectedMtime}, found ${actualMtime} ` +\n `(file changed since last read — re-read before writing)`,\n );\n this.name = \"StaleFileError\";\n }\n}\n\n/**\n * Pluggable filesystem backend. Implement the four abstract methods; `exists()`\n * and the `readOnly`/`basePath` accessors derive on the base class.\n *\n * @public\n */\nexport abstract class FilesystemBackend {\n protected readonly _basePath: string;\n protected readonly _readOnly: boolean;\n\n constructor(config: FilesystemConfig = {}) {\n this._basePath = config.basePath ?? process.cwd();\n this._readOnly = config.readOnly ?? false;\n }\n\n /** Read a boundary-relative file as UTF-8. Throws {@link FileNotFoundError}. */\n abstract readFile(path: string): Promise<string>;\n\n /**\n * Write UTF-8 content to a boundary-relative path (creating parents). Returns\n * the new {@link FileStat}. Throws {@link FilesystemReadOnlyError} on a\n * read-only backend and {@link StaleFileError} when `opts.expectedMtime`\n * mismatches (SE32).\n */\n abstract writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat>;\n\n /** Structured metadata for a path. Throws {@link FileNotFoundError}. */\n abstract stat(path: string): Promise<FileStat>;\n\n /** Directory entry names (not recursive). Throws {@link FileNotFoundError}. */\n abstract list(path: string): Promise<string[]>;\n\n /** Derived — true iff `stat(path)` resolves (absent ⇒ false). */\n async exists(path: string): Promise<boolean> {\n try {\n await this.stat(path);\n return true;\n } catch (err) {\n if (err instanceof FileNotFoundError) return false;\n throw err;\n }\n }\n\n /** Throw {@link FilesystemReadOnlyError} when the backend is read-only. */\n protected assertWritable(): void {\n if (this._readOnly) {\n throw new FilesystemReadOnlyError(`Filesystem is read-only (basePath: ${this._basePath})`);\n }\n }\n\n get readOnly(): boolean {\n return this._readOnly;\n }\n\n get basePath(): string {\n return this._basePath;\n }\n}\n\n/**\n * A backend OR a per-request resolver of one. A resolver runs at tool-execution\n * time (the request scope), so multi-tenant / multi-role agents get a distinct\n * root or permission set per request without a shared mutable backend.\n *\n * @public\n */\nexport type FilesystemProvider<Ctx = unknown> =\n | FilesystemBackend\n | ((ctx: Ctx) => FilesystemBackend | Promise<FilesystemBackend>);\n\n/** Resolve a {@link FilesystemProvider} to a concrete backend for `ctx`. */\nexport async function resolveFilesystem<Ctx>(\n provider: FilesystemProvider<Ctx>,\n ctx: Ctx,\n): Promise<FilesystemBackend> {\n return provider instanceof FilesystemBackend ? provider : provider(ctx);\n}\n","/**\n * LocalFilesystem — a {@link FilesystemBackend} over the local process\n * filesystem (`node:fs/promises`), boundary-enforced against `basePath`.\n *\n * **This is NOT an isolation boundary** (same OS, same user). Its safety\n * affordances are path-boundary enforcement (traversal + symlink escape,\n * reusing the core `internal/security/path-guard` primitives) and the optional\n * `readOnly` flag. For untrusted code, run it inside a container/VM sandbox.\n *\n * The check-then-use gap between `assertNoSymlinkEscape` and the subsequent\n * `fs` call is a known TOCTOU: a local attacker could atomically swap an\n * in-boundary symlink after the check. Closing it needs `O_NOFOLLOW`, which\n * Node's `fs/promises` does not expose — accepted for same-user local contexts.\n *\n * SE31 (a peer framework Workspaces comparison). See ADR 0011.\n *\n * @public\n */\n\nimport {\n readFile as fsReadFile,\n stat as fsStat,\n writeFile as fsWriteFile,\n mkdir,\n readdir,\n} from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport {\n assertNoSymlinkEscape,\n PathTraversalError,\n safePathJoin,\n} from \"../internal/security/path-guard.js\";\nimport {\n FileNotFoundError,\n type FileStat,\n FilesystemBackend,\n type FilesystemConfig,\n FilesystemError,\n FilesystemSecurityError,\n StaleFileError,\n type WriteFileOptions,\n} from \"./types.js\";\n\nexport class LocalFilesystem extends FilesystemBackend {\n constructor(config: FilesystemConfig = {}) {\n super(config);\n }\n\n async readFile(path: string): Promise<string> {\n const abs = this.resolve(path);\n try {\n return await fsReadFile(abs, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n async writeFile(path: string, content: string, opts?: WriteFileOptions): Promise<FileStat> {\n // Security boundary FIRST (a traversal path on a read-only backend must\n // report the security error, not the read-only one — fail-clear).\n const abs = this.resolve(path);\n this.assertWritable();\n // SE32 — stale-write guard: if the caller passed the mtime it last read,\n // reject when the file changed underneath it (never a silent clobber).\n if (opts?.expectedMtime !== undefined) {\n await this.assertNotStale(path, abs, opts.expectedMtime);\n }\n try {\n await mkdir(dirname(abs), { recursive: true });\n await fsWriteFile(abs, content, \"utf-8\");\n } catch (err) {\n throw this.mapError(err, path);\n }\n return this.statAbs(abs, path);\n }\n\n async stat(path: string): Promise<FileStat> {\n const abs = this.resolve(path);\n return this.statAbs(abs, path);\n }\n\n async list(path: string): Promise<string[]> {\n const abs = this.resolve(path);\n try {\n return await readdir(abs);\n } catch (err) {\n throw this.mapError(err, path);\n }\n }\n\n private async statAbs(abs: string, relPath: string): Promise<FileStat> {\n try {\n const s = await fsStat(abs);\n return {\n size: s.size,\n mtimeMs: s.mtimeMs,\n isFile: s.isFile(),\n isDirectory: s.isDirectory(),\n };\n } catch (err) {\n throw this.mapError(err, relPath);\n }\n }\n\n /** SE32 — compare the on-disk mtime against the caller's expected value. */\n private async assertNotStale(relPath: string, abs: string, expectedMtime: number): Promise<void> {\n let current: number | undefined;\n try {\n current = (await fsStat(abs)).mtimeMs;\n } catch (err) {\n // A brand-new file (does not exist yet) cannot be stale — allow the write.\n if ((err as { code?: string }).code === \"ENOENT\") return;\n throw this.mapError(err, relPath);\n }\n if (current !== expectedMtime) {\n throw new StaleFileError(relPath, expectedMtime, current);\n }\n }\n\n /**\n * Resolve a boundary-relative path to an absolute one, rejecting lexical\n * traversal (`..`, absolute, NUL) and symlink escape — both reusing the core\n * path-guard primitives, remapped to {@link FilesystemSecurityError}.\n */\n private resolve(path: string): string {\n let abs: string;\n try {\n abs = safePathJoin(this._basePath, path);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath: ${path}`);\n }\n throw err;\n }\n try {\n assertNoSymlinkEscape(abs, this._basePath);\n } catch (err) {\n if (err instanceof PathTraversalError) {\n throw new FilesystemSecurityError(`Path escapes basePath via symlink: ${path}`);\n }\n throw err;\n }\n return abs;\n }\n\n private mapError(err: unknown, path: string): Error {\n if (\n err instanceof FilesystemSecurityError ||\n err instanceof FilesystemError ||\n err instanceof FileNotFoundError ||\n err instanceof StaleFileError\n ) {\n return err;\n }\n if ((err as { code?: string }).code === \"ENOENT\") return new FileNotFoundError(path);\n // ENOTDIR (a path component is a file), EACCES, ENOSPC, … — never leak a\n // raw untyped Node SystemError (Rule 8); wrap with the original as cause.\n return new FilesystemError(path, err);\n }\n}\n"]}