agentix-cli 0.50.0 → 0.51.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 (248) hide show
  1. package/apps/mac-voice/Sources/AgentXVoice/AgentClient.swift +67 -14
  2. package/apps/mac-voice/Sources/AgentXVoice/Config.swift +20 -3
  3. package/apps/mac-voice/Sources/AgentXVoice/Panel.swift +24 -31
  4. package/apps/mac-voice/Sources/AgentXVoice/Speech.swift +16 -2
  5. package/apps/mac-voice/Sources/AgentXVoice/StatusMenu.swift +173 -0
  6. package/apps/mac-voice/Sources/AgentXVoice/main.swift +62 -15
  7. package/dist/{App-KE4SURSS.js → App-QVNQ5BQK.js} +2 -2
  8. package/dist/{ChatApp-NNHIKXO2.js → ChatApp-CC57XC23.js} +2 -2
  9. package/dist/agent-ILH6ANOM.js +2 -0
  10. package/dist/{article-fields-L4D2BOGY.js → article-fields-PITN4NHA.js} +2 -2
  11. package/dist/{article-quality-44ONVGLN.js → article-quality-JFJMZWFQ.js} +2 -2
  12. package/dist/{audit-4245CX6P.js → audit-CMJ2TZ3K.js} +2 -2
  13. package/dist/{backfill-MTD2B62I.js → backfill-7TCF4SHG.js} +2 -2
  14. package/dist/{board-dashboard-RUOASCSQ.js → board-dashboard-XPPBRPQE.js} +117 -117
  15. package/dist/board-dashboard-XPPBRPQE.js.map +1 -0
  16. package/dist/{builtin-B67DMJ3M.js → builtin-W6KNX7RS.js} +2 -2
  17. package/dist/calibration-MCCVYGZQ.js +2 -0
  18. package/dist/{chunk-3SCPRYJB.js → chunk-2AXFYDWF.js} +2 -2
  19. package/dist/{chunk-4TITGMPX.js → chunk-2KQTE4XI.js} +2 -2
  20. package/dist/{chunk-QDE75R4U.js → chunk-6HAZ6YWI.js} +2 -2
  21. package/dist/{chunk-F4HZTZHW.js → chunk-72SZI2UW.js} +2 -2
  22. package/dist/{chunk-L2WSPY6S.js → chunk-7I7IEX4S.js} +2 -2
  23. package/dist/{chunk-OTW5MPFT.js → chunk-CAA546XN.js} +2 -2
  24. package/dist/{chunk-5XQCGPQJ.js → chunk-F7WY24UZ.js} +2 -2
  25. package/dist/{chunk-ZTEU5JVQ.js → chunk-FCPTN6NF.js} +2 -2
  26. package/dist/{chunk-AJONZWLT.js → chunk-FX3D7YON.js} +2 -2
  27. package/dist/{chunk-5ALS7SVV.js → chunk-H2TWRZC2.js} +2 -2
  28. package/dist/{chunk-WPMX3VGI.js → chunk-J3SOEFRE.js} +2 -2
  29. package/dist/{chunk-4NBWF4TL.js → chunk-JQR3NTHI.js} +2 -2
  30. package/dist/{chunk-OUZ7YVQZ.js → chunk-KFALP5NO.js} +2 -2
  31. package/dist/{chunk-Y6I3BYWV.js → chunk-LBMZP7TG.js} +95 -95
  32. package/dist/chunk-LBMZP7TG.js.map +1 -0
  33. package/dist/{chunk-WQLBJ2O5.js → chunk-PSDCRZZM.js} +6 -6
  34. package/dist/chunk-QIJLFPWE.js +2 -0
  35. package/dist/{chunk-PZCTCCC5.js → chunk-QP6XNTBB.js} +2 -2
  36. package/dist/{chunk-BH3GTCZ6.js → chunk-RGDKHYY2.js} +2 -2
  37. package/dist/{chunk-JVNFRS26.js → chunk-ROCUOXCW.js} +2 -2
  38. package/dist/{chunk-FULEQYM6.js → chunk-S7CVSKOX.js} +2 -2
  39. package/dist/chunk-S7CVSKOX.js.map +1 -0
  40. package/dist/{chunk-K33GIBSE.js → chunk-SIU6STB2.js} +2 -2
  41. package/dist/{chunk-P2ZYT5D6.js → chunk-SRCXUZM2.js} +5 -5
  42. package/dist/{chunk-P2ZYT5D6.js.map → chunk-SRCXUZM2.js.map} +1 -1
  43. package/dist/{chunk-LCIREYTD.js → chunk-SZJMS7K4.js} +2 -2
  44. package/dist/{chunk-AJ5RMU7X.js → chunk-TFVUOC2C.js} +2 -2
  45. package/dist/chunk-U67EG5IF.js +19 -0
  46. package/dist/chunk-U67EG5IF.js.map +1 -0
  47. package/dist/{chunk-BYD55JXH.js → chunk-UBRMOTBH.js} +181 -180
  48. package/dist/chunk-UBRMOTBH.js.map +1 -0
  49. package/dist/chunk-V7XZN3MQ.js +123 -0
  50. package/dist/chunk-V7XZN3MQ.js.map +1 -0
  51. package/dist/{chunk-NLZD2QKF.js → chunk-VMS3HVTT.js} +2 -2
  52. package/dist/{chunk-TUNQFPVA.js → chunk-WCMQRSVU.js} +2 -2
  53. package/dist/{chunk-OHA3J5ZV.js → chunk-WDQ3BPFS.js} +2 -2
  54. package/dist/{chunk-6VKCUMCN.js → chunk-WKTFP3SK.js} +2 -2
  55. package/dist/{chunk-Q7C3X3R6.js → chunk-WP6KLXTP.js} +2 -2
  56. package/dist/{chunk-IXUEJBHD.js → chunk-XZTR5MBJ.js} +2 -2
  57. package/dist/{chunk-W5C2GDNC.js → chunk-Y57CULGE.js} +2 -2
  58. package/dist/chunk-YE2BUU3Z.js +28 -0
  59. package/dist/chunk-YE2BUU3Z.js.map +1 -0
  60. package/dist/{chunk-TTL37CS5.js → chunk-YEV6W34S.js} +55 -55
  61. package/dist/{chunk-TTL37CS5.js.map → chunk-YEV6W34S.js.map} +1 -1
  62. package/dist/cli.js +1 -1
  63. package/dist/client-I7GAAM3T.js +2 -0
  64. package/dist/{compaction-PIZINFHR.js → compaction-NWPBPWY2.js} +4 -4
  65. package/dist/{config-R47ITLIY.js → config-TVW7UCKG.js} +2 -2
  66. package/dist/config-mutator-JHM53P5A.js +2 -0
  67. package/dist/{conflict-detector-ZPOT3M2C.js → conflict-detector-KS7OSS45.js} +2 -2
  68. package/dist/{context-planner-FJMU5WAT.js → context-planner-LJT5IKH6.js} +3 -3
  69. package/dist/debug-FTAGG7MN.js +2 -0
  70. package/dist/{discover-D4VVRNAI.js → discover-7YFQNYLC.js} +2 -2
  71. package/dist/doctor-CXFMV6PT.js +2 -0
  72. package/dist/{editor-chat-MOMQHMO4.js → editor-chat-V24MXQIB.js} +2 -2
  73. package/dist/{entry-triage-LK34TSQD.js → entry-triage-LZWMMLLN.js} +2 -2
  74. package/dist/{facts-YVEJOM7O.js → facts-4YPSHIXJ.js} +2 -2
  75. package/dist/{failure-candidates-ARRMFXRY.js → failure-candidates-RIXA3Y6D.js} +2 -2
  76. package/dist/heal-HVYQD3EZ.js +2 -0
  77. package/dist/index.d.ts +256 -6
  78. package/dist/index.js +2 -2
  79. package/dist/{ingest-whatsapp-NS4OWDOU.js → ingest-whatsapp-4POCTRTP.js} +2 -2
  80. package/dist/loader-EVHZ2R73.js +2 -0
  81. package/dist/loader-KKMG24O5.js +2 -0
  82. package/dist/memory-extract-MGGXIZTE.js +2 -0
  83. package/dist/{migrate-v2-V4WN2VVM.js → migrate-v2-5VGHWPBW.js} +2 -2
  84. package/dist/{ntfy-X7EPB3TG.js → ntfy-ZY2NPGBA.js} +2 -2
  85. package/dist/processes-CMTMB7LG.js +2 -0
  86. package/dist/program-ZCFMO4ZD.js +2 -0
  87. package/dist/{projects-api-QE6L65SK.js → projects-api-E337EQNV.js} +2 -2
  88. package/dist/{projects-mutate-MY7JTLSZ.js → projects-mutate-S5MY7V3V.js} +2 -2
  89. package/dist/promote-4T64VW5K.js +2 -0
  90. package/dist/proposals-O4B5LD5T.js +2 -0
  91. package/dist/providers-NRPX2FHP.js +2 -0
  92. package/dist/query-6IKL52WT.js +2 -0
  93. package/dist/{questions-4B4KSPXG.js → questions-2V2VGIT4.js} +2 -2
  94. package/dist/recipes-423CIPZ3.js +2 -0
  95. package/dist/registry-E4QUXHMQ.js +2 -0
  96. package/dist/{request-planner-PEAYYXAP.js → request-planner-BRLDCYU5.js} +2 -2
  97. package/dist/{review-candidates-W7NIHNAI.js → review-candidates-QWW5PDUU.js} +2 -2
  98. package/dist/{review-store-B4YE3EFK.js → review-store-PW3OBGZQ.js} +2 -2
  99. package/dist/{rotation-memo-QEO3COFH.js → rotation-memo-453FXKHQ.js} +2 -2
  100. package/dist/routing-DP6S7OJL.js +2 -0
  101. package/dist/runner-56G3N7M4.js +2 -0
  102. package/dist/schedule-tool-TPJ6GR47.js +2 -0
  103. package/dist/scheduler-7QPG6OTY.js +2 -0
  104. package/dist/seat-3KUNRM5Z.js +2 -0
  105. package/dist/{select-4XYRIZ5L.js → select-ILXHYJGD.js} +2 -2
  106. package/dist/shutdown-ZAF7RW25.js +2 -0
  107. package/dist/store-TWQPEM5V.js +2 -0
  108. package/dist/{subagent-2SJHSSJS.js → subagent-XY5N7TUU.js} +2 -2
  109. package/dist/{surface-usage-V2BX4SBD.js → surface-usage-HVVP22SA.js} +2 -2
  110. package/dist/timers-KK7GF77Y.js +2 -0
  111. package/dist/{tool-PAQ47HV2.js → tool-SF3BCY55.js} +2 -2
  112. package/dist/{triage-backtest-JNO7RKX7.js → triage-backtest-DLKYJSEB.js} +2 -2
  113. package/dist/types-DO3KLIBS.js +2 -0
  114. package/dist/types-S6NHM5C3.js +2 -0
  115. package/dist/{whatsapp-state-6D6FHHD2.js → whatsapp-state-LB3R32BK.js} +2 -2
  116. package/dist/wiki-WETANN3W.js +2 -0
  117. package/dist/{workspace-setup-G6KGWPHY.js → workspace-setup-42ARC42I.js} +2 -2
  118. package/package.json +1 -1
  119. package/dist/agent-RY7Z3IYY.js +0 -2
  120. package/dist/board-dashboard-RUOASCSQ.js.map +0 -1
  121. package/dist/calibration-ILS5OI44.js +0 -2
  122. package/dist/chunk-B5XHX44Y.js +0 -123
  123. package/dist/chunk-B5XHX44Y.js.map +0 -1
  124. package/dist/chunk-BYD55JXH.js.map +0 -1
  125. package/dist/chunk-EMI3VJLH.js +0 -28
  126. package/dist/chunk-EMI3VJLH.js.map +0 -1
  127. package/dist/chunk-FIOB3MEX.js +0 -2
  128. package/dist/chunk-FULEQYM6.js.map +0 -1
  129. package/dist/chunk-N2XXKFJ6.js +0 -19
  130. package/dist/chunk-N2XXKFJ6.js.map +0 -1
  131. package/dist/chunk-Y6I3BYWV.js.map +0 -1
  132. package/dist/client-JZTH46N2.js +0 -2
  133. package/dist/config-mutator-T6JGXJ26.js +0 -2
  134. package/dist/debug-3MEUO2P2.js +0 -2
  135. package/dist/doctor-2DMGAWMW.js +0 -2
  136. package/dist/heal-FVLBHYP7.js +0 -2
  137. package/dist/loader-4ZGTK7LD.js +0 -2
  138. package/dist/loader-BOKE5M5S.js +0 -2
  139. package/dist/memory-extract-OWTI6MN5.js +0 -2
  140. package/dist/processes-KUJJ7XE7.js +0 -2
  141. package/dist/program-KY5ZYPFN.js +0 -2
  142. package/dist/promote-57YNOVXV.js +0 -2
  143. package/dist/proposals-TX2HBBYV.js +0 -2
  144. package/dist/providers-KO2DODIO.js +0 -2
  145. package/dist/query-ZT7WXY2F.js +0 -2
  146. package/dist/recipes-7S4MC5OJ.js +0 -2
  147. package/dist/registry-LLAFJJN4.js +0 -2
  148. package/dist/routing-7LCO7UJ7.js +0 -2
  149. package/dist/runner-YRBVNYTY.js +0 -2
  150. package/dist/schedule-tool-ZD3VBUBW.js +0 -2
  151. package/dist/scheduler-GC3FQKXY.js +0 -2
  152. package/dist/seat-HR6QMAR2.js +0 -2
  153. package/dist/shutdown-6GCMKYAD.js +0 -2
  154. package/dist/store-MCOA6N4F.js +0 -2
  155. package/dist/timers-PCB4ZIBD.js +0 -2
  156. package/dist/types-H5ENIUIT.js +0 -2
  157. package/dist/types-OIFU3KSQ.js +0 -2
  158. package/dist/wiki-EREMPSAE.js +0 -2
  159. /package/dist/{App-KE4SURSS.js.map → App-QVNQ5BQK.js.map} +0 -0
  160. /package/dist/{ChatApp-NNHIKXO2.js.map → ChatApp-CC57XC23.js.map} +0 -0
  161. /package/dist/{agent-RY7Z3IYY.js.map → agent-ILH6ANOM.js.map} +0 -0
  162. /package/dist/{article-fields-L4D2BOGY.js.map → article-fields-PITN4NHA.js.map} +0 -0
  163. /package/dist/{article-quality-44ONVGLN.js.map → article-quality-JFJMZWFQ.js.map} +0 -0
  164. /package/dist/{audit-4245CX6P.js.map → audit-CMJ2TZ3K.js.map} +0 -0
  165. /package/dist/{backfill-MTD2B62I.js.map → backfill-7TCF4SHG.js.map} +0 -0
  166. /package/dist/{builtin-B67DMJ3M.js.map → builtin-W6KNX7RS.js.map} +0 -0
  167. /package/dist/{calibration-ILS5OI44.js.map → calibration-MCCVYGZQ.js.map} +0 -0
  168. /package/dist/{chunk-3SCPRYJB.js.map → chunk-2AXFYDWF.js.map} +0 -0
  169. /package/dist/{chunk-4TITGMPX.js.map → chunk-2KQTE4XI.js.map} +0 -0
  170. /package/dist/{chunk-QDE75R4U.js.map → chunk-6HAZ6YWI.js.map} +0 -0
  171. /package/dist/{chunk-F4HZTZHW.js.map → chunk-72SZI2UW.js.map} +0 -0
  172. /package/dist/{chunk-L2WSPY6S.js.map → chunk-7I7IEX4S.js.map} +0 -0
  173. /package/dist/{chunk-OTW5MPFT.js.map → chunk-CAA546XN.js.map} +0 -0
  174. /package/dist/{chunk-5XQCGPQJ.js.map → chunk-F7WY24UZ.js.map} +0 -0
  175. /package/dist/{chunk-ZTEU5JVQ.js.map → chunk-FCPTN6NF.js.map} +0 -0
  176. /package/dist/{chunk-AJONZWLT.js.map → chunk-FX3D7YON.js.map} +0 -0
  177. /package/dist/{chunk-5ALS7SVV.js.map → chunk-H2TWRZC2.js.map} +0 -0
  178. /package/dist/{chunk-WPMX3VGI.js.map → chunk-J3SOEFRE.js.map} +0 -0
  179. /package/dist/{chunk-4NBWF4TL.js.map → chunk-JQR3NTHI.js.map} +0 -0
  180. /package/dist/{chunk-OUZ7YVQZ.js.map → chunk-KFALP5NO.js.map} +0 -0
  181. /package/dist/{chunk-WQLBJ2O5.js.map → chunk-PSDCRZZM.js.map} +0 -0
  182. /package/dist/{chunk-FIOB3MEX.js.map → chunk-QIJLFPWE.js.map} +0 -0
  183. /package/dist/{chunk-PZCTCCC5.js.map → chunk-QP6XNTBB.js.map} +0 -0
  184. /package/dist/{chunk-BH3GTCZ6.js.map → chunk-RGDKHYY2.js.map} +0 -0
  185. /package/dist/{chunk-JVNFRS26.js.map → chunk-ROCUOXCW.js.map} +0 -0
  186. /package/dist/{chunk-K33GIBSE.js.map → chunk-SIU6STB2.js.map} +0 -0
  187. /package/dist/{chunk-LCIREYTD.js.map → chunk-SZJMS7K4.js.map} +0 -0
  188. /package/dist/{chunk-AJ5RMU7X.js.map → chunk-TFVUOC2C.js.map} +0 -0
  189. /package/dist/{chunk-NLZD2QKF.js.map → chunk-VMS3HVTT.js.map} +0 -0
  190. /package/dist/{chunk-TUNQFPVA.js.map → chunk-WCMQRSVU.js.map} +0 -0
  191. /package/dist/{chunk-OHA3J5ZV.js.map → chunk-WDQ3BPFS.js.map} +0 -0
  192. /package/dist/{chunk-6VKCUMCN.js.map → chunk-WKTFP3SK.js.map} +0 -0
  193. /package/dist/{chunk-Q7C3X3R6.js.map → chunk-WP6KLXTP.js.map} +0 -0
  194. /package/dist/{chunk-IXUEJBHD.js.map → chunk-XZTR5MBJ.js.map} +0 -0
  195. /package/dist/{chunk-W5C2GDNC.js.map → chunk-Y57CULGE.js.map} +0 -0
  196. /package/dist/{client-JZTH46N2.js.map → client-I7GAAM3T.js.map} +0 -0
  197. /package/dist/{compaction-PIZINFHR.js.map → compaction-NWPBPWY2.js.map} +0 -0
  198. /package/dist/{config-R47ITLIY.js.map → config-TVW7UCKG.js.map} +0 -0
  199. /package/dist/{config-mutator-T6JGXJ26.js.map → config-mutator-JHM53P5A.js.map} +0 -0
  200. /package/dist/{conflict-detector-ZPOT3M2C.js.map → conflict-detector-KS7OSS45.js.map} +0 -0
  201. /package/dist/{context-planner-FJMU5WAT.js.map → context-planner-LJT5IKH6.js.map} +0 -0
  202. /package/dist/{debug-3MEUO2P2.js.map → debug-FTAGG7MN.js.map} +0 -0
  203. /package/dist/{discover-D4VVRNAI.js.map → discover-7YFQNYLC.js.map} +0 -0
  204. /package/dist/{doctor-2DMGAWMW.js.map → doctor-CXFMV6PT.js.map} +0 -0
  205. /package/dist/{editor-chat-MOMQHMO4.js.map → editor-chat-V24MXQIB.js.map} +0 -0
  206. /package/dist/{entry-triage-LK34TSQD.js.map → entry-triage-LZWMMLLN.js.map} +0 -0
  207. /package/dist/{facts-YVEJOM7O.js.map → facts-4YPSHIXJ.js.map} +0 -0
  208. /package/dist/{failure-candidates-ARRMFXRY.js.map → failure-candidates-RIXA3Y6D.js.map} +0 -0
  209. /package/dist/{heal-FVLBHYP7.js.map → heal-HVYQD3EZ.js.map} +0 -0
  210. /package/dist/{ingest-whatsapp-NS4OWDOU.js.map → ingest-whatsapp-4POCTRTP.js.map} +0 -0
  211. /package/dist/{loader-4ZGTK7LD.js.map → loader-EVHZ2R73.js.map} +0 -0
  212. /package/dist/{loader-BOKE5M5S.js.map → loader-KKMG24O5.js.map} +0 -0
  213. /package/dist/{memory-extract-OWTI6MN5.js.map → memory-extract-MGGXIZTE.js.map} +0 -0
  214. /package/dist/{migrate-v2-V4WN2VVM.js.map → migrate-v2-5VGHWPBW.js.map} +0 -0
  215. /package/dist/{ntfy-X7EPB3TG.js.map → ntfy-ZY2NPGBA.js.map} +0 -0
  216. /package/dist/{processes-KUJJ7XE7.js.map → processes-CMTMB7LG.js.map} +0 -0
  217. /package/dist/{program-KY5ZYPFN.js.map → program-ZCFMO4ZD.js.map} +0 -0
  218. /package/dist/{projects-api-QE6L65SK.js.map → projects-api-E337EQNV.js.map} +0 -0
  219. /package/dist/{projects-mutate-MY7JTLSZ.js.map → projects-mutate-S5MY7V3V.js.map} +0 -0
  220. /package/dist/{promote-57YNOVXV.js.map → promote-4T64VW5K.js.map} +0 -0
  221. /package/dist/{proposals-TX2HBBYV.js.map → proposals-O4B5LD5T.js.map} +0 -0
  222. /package/dist/{providers-KO2DODIO.js.map → providers-NRPX2FHP.js.map} +0 -0
  223. /package/dist/{query-ZT7WXY2F.js.map → query-6IKL52WT.js.map} +0 -0
  224. /package/dist/{questions-4B4KSPXG.js.map → questions-2V2VGIT4.js.map} +0 -0
  225. /package/dist/{recipes-7S4MC5OJ.js.map → recipes-423CIPZ3.js.map} +0 -0
  226. /package/dist/{registry-LLAFJJN4.js.map → registry-E4QUXHMQ.js.map} +0 -0
  227. /package/dist/{request-planner-PEAYYXAP.js.map → request-planner-BRLDCYU5.js.map} +0 -0
  228. /package/dist/{review-candidates-W7NIHNAI.js.map → review-candidates-QWW5PDUU.js.map} +0 -0
  229. /package/dist/{review-store-B4YE3EFK.js.map → review-store-PW3OBGZQ.js.map} +0 -0
  230. /package/dist/{rotation-memo-QEO3COFH.js.map → rotation-memo-453FXKHQ.js.map} +0 -0
  231. /package/dist/{routing-7LCO7UJ7.js.map → routing-DP6S7OJL.js.map} +0 -0
  232. /package/dist/{runner-YRBVNYTY.js.map → runner-56G3N7M4.js.map} +0 -0
  233. /package/dist/{schedule-tool-ZD3VBUBW.js.map → schedule-tool-TPJ6GR47.js.map} +0 -0
  234. /package/dist/{scheduler-GC3FQKXY.js.map → scheduler-7QPG6OTY.js.map} +0 -0
  235. /package/dist/{seat-HR6QMAR2.js.map → seat-3KUNRM5Z.js.map} +0 -0
  236. /package/dist/{select-4XYRIZ5L.js.map → select-ILXHYJGD.js.map} +0 -0
  237. /package/dist/{shutdown-6GCMKYAD.js.map → shutdown-ZAF7RW25.js.map} +0 -0
  238. /package/dist/{store-MCOA6N4F.js.map → store-TWQPEM5V.js.map} +0 -0
  239. /package/dist/{subagent-2SJHSSJS.js.map → subagent-XY5N7TUU.js.map} +0 -0
  240. /package/dist/{surface-usage-V2BX4SBD.js.map → surface-usage-HVVP22SA.js.map} +0 -0
  241. /package/dist/{timers-PCB4ZIBD.js.map → timers-KK7GF77Y.js.map} +0 -0
  242. /package/dist/{tool-PAQ47HV2.js.map → tool-SF3BCY55.js.map} +0 -0
  243. /package/dist/{triage-backtest-JNO7RKX7.js.map → triage-backtest-DLKYJSEB.js.map} +0 -0
  244. /package/dist/{types-H5ENIUIT.js.map → types-DO3KLIBS.js.map} +0 -0
  245. /package/dist/{types-OIFU3KSQ.js.map → types-S6NHM5C3.js.map} +0 -0
  246. /package/dist/{whatsapp-state-6D6FHHD2.js.map → whatsapp-state-LB3R32BK.js.map} +0 -0
  247. /package/dist/{wiki-EREMPSAE.js.map → wiki-WETANN3W.js.map} +0 -0
  248. /package/dist/{workspace-setup-G6KGWPHY.js.map → workspace-setup-42ARC42I.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import{a as G,b as _e}from"./chunk-L2WSPY6S.js";import{b as N}from"./chunk-FIOB3MEX.js";import{existsSync as oe,readFileSync as de,writeFileSync as ke,mkdirSync as Ae}from"fs";import E from"path";import me from"os";import B from"chalk";import I from"prompts";function S(){if(!oe(ne))return null;try{let a=JSON.parse(de(ne,"utf8"));return a.provider&&a.authType&&a.token&&a.model?a:null}catch{return null}}function we(a){oe(te)||Ae(te,{recursive:!0}),ke(ne,JSON.stringify(a,null,2),"utf8")}function L(a){if(a?.trim()){let p=a.startsWith("sk-ant-oat")?"oauth":"api-key";return{token:a.trim(),authType:p}}let e=process.env.ANTHROPIC_OAUTH_TOKEN;if(e?.trim())return{token:e.trim(),authType:"oauth"};let t=process.env.CLAUDE_CODE_OAUTH_TOKEN;if(t?.trim())return{token:t.trim(),authType:"oauth"};let r=process.env.ANTHROPIC_API_KEY;if(r?.trim())return{token:r.trim(),authType:"api-key"};let n=S();if(n)return{token:n.token,authType:n.authType};let o=me.homedir(),l=[E.join(o,".openclaw","agents","main","agent","auth-profiles.json"),E.join(o,".openclaw","auth-profiles.json"),E.join(o,".openclaw","credentials","oauth.json"),E.join(o,".claude","oauth.json"),E.join(o,".config","claude","oauth.json"),E.join(o,".config","anthropic","oauth.json")];for(let p of l){let m=xe(p);if(m)return{token:m,authType:"oauth"}}return null}function xe(a){if(!oe(a))return"";try{let e=JSON.parse(de(a,"utf8"));if(e.profiles){let t="";for(let[r,n]of Object.entries(e.profiles))if(r.startsWith("anthropic")){if(n.type==="oauth"&&n.access){if(n.expires&&Date.now()>n.expires)continue;return n.access}n.type==="token"&&n.token&&(t=n.token)}if(t)return t}return e.anthropic?.access?e.anthropic.access:e.anthropic?.token?e.anthropic.token:""}catch{return""}}async function be(){let a=process.env.ANTHROPIC_API_KEY;if(a?.trim()){let r=a.slice(0,10)+"..."+a.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use existing ANTHROPIC_API_KEY (env, ${r})?`,initial:!0});if(n)return{token:a.trim(),authType:"api-key"}}let e=S();if(e?.authType==="api-key"&&e.token){let r=e.token.slice(0,10)+"..."+e.token.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use stored API key (${r})?`,initial:!0});if(n)return{token:e.token,authType:"api-key"}}let{apiKey:t}=await I({type:"password",name:"apiKey",message:"Enter Anthropic API key",validate:r=>r.startsWith("sk-ant-api")?r.length<40?"API key seems too short":!0:"API key must start with sk-ant-api"});return t?{token:t,authType:"api-key"}:null}async function ve(){G.break();let a=46,e="Run `claude setup-token` in your terminal.",t="Then paste the generated token below.";console.log(` ${B.cyan("Anthropic setup-token")} ${"\u2500".repeat(a-21-1)}\u256E`),console.log(` ${" ".repeat(a)}\u2502`),console.log(` ${e}${" ".repeat(a-e.length)}\u2502`),console.log(` ${t}${" ".repeat(a-t.length)}\u2502`),console.log(` ${" ".repeat(a)}\u2502`),console.log(` ${"\u2500".repeat(a)}\u256F`),G.break();let{token:r}=await I({type:"password",name:"token",message:"Paste Anthropic setup-token",validate:o=>o.trim()?o.length<40?"Token seems too short":!0:"Token is required"});if(!r)return null;let{tokenName:n}=await I({type:"text",name:"tokenName",message:"Token name (blank = default)"});return{token:r,authType:"oauth"}}async function Re(){for(;;){let{provider:a}=await I({type:"select",name:"provider",message:"Model/auth provider",choices:[{title:"Anthropic",value:"anthropic",description:"setup-token + API key"}]});if(a===void 0)return null;let{method:e}=await I({type:"select",name:"method",message:"Anthropic auth method",choices:[{title:"Anthropic token (paste setup-token)",value:"setup-token",description:"run `claude setup-token` elsewhere, then paste the token here"},{title:"Anthropic API key",value:"api-key"},{title:B.dim("Back"),value:"back"}]});if(e===void 0)return null;if(e!=="back")return e==="api-key"?be():e==="setup-token"?ve():null}}async function Oe(){let a=S(),e=re.map(r=>({title:r.label,value:r.id,description:r.hint+(a?.model===r.id?" \xB7 current":"")}));if(a?.model){let r=re.find(o=>o.id===a.model),n=r?r.label:a.model;e.unshift({title:`Keep current (${n})`,value:a.model,description:"no change"})}let{modelId:t}=await I({type:"select",name:"modelId",message:"Default model",choices:e});return t||null}async function Te(){let a=await Re();if(!a)return null;let e=await Oe();if(!e)return null;let t={provider:a.authType==="oauth"?"claude-code":"claude",authType:a.authType,token:a.token,model:e};return we(t),G.break(),G.success("Configuration saved to ~/.agentx/auth.json"),console.log(` Provider: ${B.bold("anthropic")} (${t.authType})`),console.log(` Model: ${B.bold(re.find(r=>r.id===t.model)?.label||t.model)}`),t}async function Ue(a){return L(a)?!0:(G.warn("No AI credentials configured."),G.break(),await Te()!==null)}var te,ne,re,H=N(()=>{"use strict";_e();te=E.join(me.homedir(),".agentx"),ne=E.join(te,"auth.json");re=[{id:"claude-sonnet-4-20250514",label:"anthropic/claude-sonnet-4",hint:"Claude Sonnet 4 \xB7 ctx 200k \xB7 recommended"},{id:"claude-opus-4-20250514",label:"anthropic/claude-opus-4-5",hint:"Claude Opus 4.5 \xB7 ctx 200k \xB7 reasoning"},{id:"claude-haiku-4-20250514",label:"anthropic/claude-haiku-4",hint:"Claude Haiku 4 \xB7 ctx 200k \xB7 fast"}]});function Pe(a){return(a?Y.filter(t=>a.includes(t.name)):Y).map(({name:t,description:r,input_schema:n})=>({name:t,description:r,input_schema:n}))}function M(){return Pe(["create_files","ask_user"])}function Le(){let a=Y.filter(t=>t.name!=="create_files"&&t.name!=="ask_user");if(a.length===0)return"";let e=["# Available Capabilities","In addition to generating files, you have the following capabilities:",""];for(let t of a)e.push(`## ${t.name}`),e.push(t.description),e.push("");return e.join(`
1
+ import{a as G,b as _e}from"./chunk-7I7IEX4S.js";import{a as N}from"./chunk-QIJLFPWE.js";import{existsSync as oe,readFileSync as de,writeFileSync as ke,mkdirSync as Ae}from"fs";import E from"path";import me from"os";import B from"chalk";import I from"prompts";function S(){if(!oe(ne))return null;try{let a=JSON.parse(de(ne,"utf8"));return a.provider&&a.authType&&a.token&&a.model?a:null}catch{return null}}function we(a){oe(te)||Ae(te,{recursive:!0}),ke(ne,JSON.stringify(a,null,2),"utf8")}function L(a){if(a?.trim()){let p=a.startsWith("sk-ant-oat")?"oauth":"api-key";return{token:a.trim(),authType:p}}let e=process.env.ANTHROPIC_OAUTH_TOKEN;if(e?.trim())return{token:e.trim(),authType:"oauth"};let t=process.env.CLAUDE_CODE_OAUTH_TOKEN;if(t?.trim())return{token:t.trim(),authType:"oauth"};let r=process.env.ANTHROPIC_API_KEY;if(r?.trim())return{token:r.trim(),authType:"api-key"};let n=S();if(n)return{token:n.token,authType:n.authType};let o=me.homedir(),l=[E.join(o,".openclaw","agents","main","agent","auth-profiles.json"),E.join(o,".openclaw","auth-profiles.json"),E.join(o,".openclaw","credentials","oauth.json"),E.join(o,".claude","oauth.json"),E.join(o,".config","claude","oauth.json"),E.join(o,".config","anthropic","oauth.json")];for(let p of l){let m=xe(p);if(m)return{token:m,authType:"oauth"}}return null}function xe(a){if(!oe(a))return"";try{let e=JSON.parse(de(a,"utf8"));if(e.profiles){let t="";for(let[r,n]of Object.entries(e.profiles))if(r.startsWith("anthropic")){if(n.type==="oauth"&&n.access){if(n.expires&&Date.now()>n.expires)continue;return n.access}n.type==="token"&&n.token&&(t=n.token)}if(t)return t}return e.anthropic?.access?e.anthropic.access:e.anthropic?.token?e.anthropic.token:""}catch{return""}}async function be(){let a=process.env.ANTHROPIC_API_KEY;if(a?.trim()){let r=a.slice(0,10)+"..."+a.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use existing ANTHROPIC_API_KEY (env, ${r})?`,initial:!0});if(n)return{token:a.trim(),authType:"api-key"}}let e=S();if(e?.authType==="api-key"&&e.token){let r=e.token.slice(0,10)+"..."+e.token.slice(-4),{useExisting:n}=await I({type:"confirm",name:"useExisting",message:`Use stored API key (${r})?`,initial:!0});if(n)return{token:e.token,authType:"api-key"}}let{apiKey:t}=await I({type:"password",name:"apiKey",message:"Enter Anthropic API key",validate:r=>r.startsWith("sk-ant-api")?r.length<40?"API key seems too short":!0:"API key must start with sk-ant-api"});return t?{token:t,authType:"api-key"}:null}async function ve(){G.break();let a=46,e="Run `claude setup-token` in your terminal.",t="Then paste the generated token below.";console.log(` ${B.cyan("Anthropic setup-token")} ${"\u2500".repeat(a-21-1)}\u256E`),console.log(` ${" ".repeat(a)}\u2502`),console.log(` ${e}${" ".repeat(a-e.length)}\u2502`),console.log(` ${t}${" ".repeat(a-t.length)}\u2502`),console.log(` ${" ".repeat(a)}\u2502`),console.log(` ${"\u2500".repeat(a)}\u256F`),G.break();let{token:r}=await I({type:"password",name:"token",message:"Paste Anthropic setup-token",validate:o=>o.trim()?o.length<40?"Token seems too short":!0:"Token is required"});if(!r)return null;let{tokenName:n}=await I({type:"text",name:"tokenName",message:"Token name (blank = default)"});return{token:r,authType:"oauth"}}async function Re(){for(;;){let{provider:a}=await I({type:"select",name:"provider",message:"Model/auth provider",choices:[{title:"Anthropic",value:"anthropic",description:"setup-token + API key"}]});if(a===void 0)return null;let{method:e}=await I({type:"select",name:"method",message:"Anthropic auth method",choices:[{title:"Anthropic token (paste setup-token)",value:"setup-token",description:"run `claude setup-token` elsewhere, then paste the token here"},{title:"Anthropic API key",value:"api-key"},{title:B.dim("Back"),value:"back"}]});if(e===void 0)return null;if(e!=="back")return e==="api-key"?be():e==="setup-token"?ve():null}}async function Oe(){let a=S(),e=re.map(r=>({title:r.label,value:r.id,description:r.hint+(a?.model===r.id?" \xB7 current":"")}));if(a?.model){let r=re.find(o=>o.id===a.model),n=r?r.label:a.model;e.unshift({title:`Keep current (${n})`,value:a.model,description:"no change"})}let{modelId:t}=await I({type:"select",name:"modelId",message:"Default model",choices:e});return t||null}async function Te(){let a=await Re();if(!a)return null;let e=await Oe();if(!e)return null;let t={provider:a.authType==="oauth"?"claude-code":"claude",authType:a.authType,token:a.token,model:e};return we(t),G.break(),G.success("Configuration saved to ~/.agentx/auth.json"),console.log(` Provider: ${B.bold("anthropic")} (${t.authType})`),console.log(` Model: ${B.bold(re.find(r=>r.id===t.model)?.label||t.model)}`),t}async function Ue(a){return L(a)?!0:(G.warn("No AI credentials configured."),G.break(),await Te()!==null)}var te,ne,re,H=N(()=>{"use strict";_e();te=E.join(me.homedir(),".agentx"),ne=E.join(te,"auth.json");re=[{id:"claude-sonnet-4-20250514",label:"anthropic/claude-sonnet-4",hint:"Claude Sonnet 4 \xB7 ctx 200k \xB7 recommended"},{id:"claude-opus-4-20250514",label:"anthropic/claude-opus-4-5",hint:"Claude Opus 4.5 \xB7 ctx 200k \xB7 reasoning"},{id:"claude-haiku-4-20250514",label:"anthropic/claude-haiku-4",hint:"Claude Haiku 4 \xB7 ctx 200k \xB7 fast"}]});function Pe(a){return(a?Y.filter(t=>a.includes(t.name)):Y).map(({name:t,description:r,input_schema:n})=>({name:t,description:r,input_schema:n}))}function M(){return Pe(["create_files","ask_user"])}function Le(){let a=Y.filter(t=>t.name!=="create_files"&&t.name!=="ask_user");if(a.length===0)return"";let e=["# Available Capabilities","In addition to generating files, you have the following capabilities:",""];for(let t of a)e.push(`## ${t.name}`),e.push(t.description),e.push("");return e.join(`
2
2
  `)}var Y,qe,W=N(()=>{"use strict";Y=[{name:"create_files",description:"Create one or more files as output. Use this when you need to generate code, documents, configs, or any file-based output.",input_schema:{type:"object",properties:{files:{type:"array",items:{type:"object",properties:{path:{type:"string",description:"Relative file path from project root (e.g., src/components/Button.tsx)"},content:{type:"string",description:"The full content of the file"},language:{type:"string",description:"Programming language or file type"},description:{type:"string",description:"Brief description of what this file does"}},required:["path","content"]}},summary:{type:"string",description:"Brief summary of all generated files"}},required:["files"]},permission:"file-write"},{name:"ask_user",description:"Ask the user a clarifying question when you need more information to proceed. Use this when the request is ambiguous or you need to confirm important decisions.",input_schema:{type:"object",properties:{question:{type:"string",description:"The question to ask the user"},options:{type:"array",items:{type:"string"},description:"Optional list of choices for the user"}},required:["question"]},permission:"none"},{name:"read_file",description:"Read the contents of a file. Use this to inspect existing code, understand patterns, check implementations, or gather context before generating code.",input_schema:{type:"object",properties:{path:{type:"string",description:"Relative file path from project root"},max_lines:{type:"number",description:"Maximum number of lines to read. Defaults to 500. Use for large files."}},required:["path"]},permission:"file-read"},{name:"search_files",description:"Search for files matching a pattern and optionally search their content with a regex. Use this to find relevant code, understand project structure, or locate specific patterns.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Glob pattern to match files (e.g., 'src/**/*.ts', '*.json')"},content_regex:{type:"string",description:"Optional regex to search within matched files. Returns matching lines."},max_results:{type:"number",description:"Maximum number of results to return. Default: 50."}},required:["pattern"]},permission:"none"},{name:"list_directory",description:"List files and directories at a given path. Use this to explore project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Relative directory path from project root. Defaults to '.' (root)."},recursive:{type:"boolean",description:"List recursively. Default: false."},max_depth:{type:"number",description:"Maximum depth for recursive listing. Default: 3."}}},permission:"none"},{name:"run_command",description:"Execute a shell command. Use this to run build tools, test commands, linters, or inspect the environment. Commands run in the project root directory.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute"},timeout:{type:"number",description:"Timeout in milliseconds. Default: 30000 (30 seconds)."}},required:["command"]},permission:"command"},{name:"edit_file",description:"Apply search-and-replace edits to an existing file. Use this for targeted modifications to existing code rather than rewriting entire files.",input_schema:{type:"object",properties:{path:{type:"string",description:"Relative file path from project root"},edits:{type:"array",items:{type:"object",properties:{old_text:{type:"string",description:"The exact text to find in the file"},new_text:{type:"string",description:"The replacement text"}},required:["old_text","new_text"]},description:"List of search/replace pairs to apply in order"}},required:["path","edits"]},permission:"file-write"},{name:"spawn_agent",description:"Spawn a sub-agent to handle a task in the background. The sub-agent runs in its own session and returns results. Use this for parallel research, long-running tasks, or delegating work to a specialized agent.",input_schema:{type:"object",properties:{agent_id:{type:"string",description:"The ID of the agent to spawn (must be a registered agent)"},prompt:{type:"string",description:"The task description for the sub-agent"},timeout_seconds:{type:"number",description:"Maximum time to wait for completion in seconds. Default: 300 (5 minutes)."}},required:["agent_id","prompt"]},permission:"none"}];qe=Y.map(a=>a.name)});function X(a){return!a||a.length<Se?a:[{type:"text",text:a,cache_control:{type:"ephemeral"}}]}var V,z,Se,q,se=N(()=>{"use strict";H();W();V="claude-sonnet-4-20250514",z=8192,Se=4*1024;q=class{name="claude";apiKey;authType="api-key";constructor(e){if(this.apiKey=e||process.env.ANTHROPIC_API_KEY||"",!this.apiKey){let t=L();t&&(this.apiKey=t.token,this.authType=t.authType)}if(!this.apiKey)throw new Error("Anthropic API key required. Run `agentx model` to configure, set ANTHROPIC_API_KEY, or pass --api-key.")}async generate(e,t){let r=t?.model||V,n=t?.maxTokens||z,o=e.find(c=>c.role==="system"),l=e.filter(c=>c.role!=="system").map(c=>({role:c.role,content:c.content})),p={model:r,max_tokens:n,messages:l,tools:M()};o&&(p.system=X(o.content)),t?.temperature!==void 0&&(p.temperature=t.temperature);let m=await this.callApi(p,t);return this.parseResponse(m)}async generateRaw(e,t,r,n){let o=n?.model||V,l=n?.maxTokens||z,p={model:o,max_tokens:l,system:X(t),messages:e,tools:r};n?.temperature!==void 0&&(p.temperature=n.temperature),n?.toolChoice&&(p.tool_choice={type:"tool",name:n.toolChoice.name});let m=await this.callApi(p,n);return{content:m.content.map(g=>g.type==="text"?{type:"text",text:g.text||""}:g.type==="tool_use"?{type:"tool_use",id:g.id||"",name:g.name||"",input:g.input||{}}:{type:"text",text:""}),stop_reason:m.stop_reason,usage:m.usage}}async*stream(e,t){let r=t?.model||V,n=t?.maxTokens||z,o=e.find(f=>f.role==="system"),l=e.filter(f=>f.role!=="system").map(f=>({role:f.role,content:f.content})),p={model:r,max_tokens:n,messages:l,stream:!0,tools:M()};o&&(p.system=X(o.content));let m=this.buildHeaders(),c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:m,body:JSON.stringify(p),signal:t?.abortSignal});if(!c.ok){let f=await c.text();yield{type:"error",error:`Anthropic API error (${c.status}): ${f}`};return}let g=c.body?.getReader();if(!g){yield{type:"error",error:"No response body"};return}let _=new TextDecoder,d="",h=[],w="",A,b=0,s=null,y=f=>{let R=(f||"").trim();if(!R||R.includes("```"))return;let T=R.replace(/\r\n/g,`
3
3
  `).split(`
4
4
  `),x=T.slice(Math.max(0,T.length-20)),u=x.join(`
@@ -51,4 +51,4 @@ Options: ${y.options.join(", ")}`))}catch{}}yield{type:"done",result:{content:_,
51
51
  `:"")+c.summary)):m.function.name==="ask_user"&&typeof c.question=="string"&&(l=c.question,Array.isArray(c.options)&&c.options.length&&(l+=`
52
52
  Options: ${c.options.join(", ")}`))}let p=e.usage;return{content:o,files:n,followUp:l,tokensUsed:p?(p.prompt_tokens||0)+(p.completion_tokens||0):void 0}}parseRawResponse(e){let t=e.choices?.[0],r=t?.message,n=[];r?.reasoning_content&&n.push({type:"reasoning",text:r.reasoning_content}),r?.content&&n.push({type:"text",text:r.content});for(let p of r?.tool_calls||[]){let m={};try{m=p.function.arguments?JSON.parse(p.function.arguments):{}}catch{}n.push({type:"tool_use",id:p.id,name:p.function.name,input:m})}let o="end_turn";switch(t?.finish_reason){case"tool_calls":case"function_call":o="tool_use";break;case"length":o="max_tokens";break;case"stop":case null:case void 0:default:o="end_turn"}let l=e.usage;return{content:n,stop_reason:o,usage:{input_tokens:l?.prompt_tokens||0,output_tokens:l?.completion_tokens||0}}}legacyToolsAsOpenAI(){return M().map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema}}))}}});import{readFileSync as Ee}from"fs";function Ie(){let a=process.env.AGENTX_DEMO_SCRIPT;if(!a)return{steps:[],fallback:ue};try{let e=JSON.parse(Ee(a,"utf-8"));return{steps:Array.isArray(e.steps)?e.steps:[],fallback:e.fallback||ue}}catch(e){return{steps:[],fallback:{reply:`Demo script unreadable (${e.message}) \u2014 check AGENTX_DEMO_SCRIPT.`}}}}function U(a){for(let e=a.length-1;e>=0;e--){if(a[e].role!=="user")continue;let t=a[e].content;if(typeof t=="string")return t;if(Array.isArray(t))return t.map(r=>r?.type==="text"?r.text:r?.type==="tool_result"?r.content:"").filter(Boolean).join(`
53
53
  `)}return""}function C(a,e){return new Promise((t,r)=>{if(e?.aborted)return r(new Error("aborted"));let n=setTimeout(t,a);e?.addEventListener("abort",()=>{clearTimeout(n),r(new Error("aborted"))},{once:!0})})}function Q(a){return a.match(/\S+\s*/g)||[a]}var ue,F,Z,ge=N(()=>{"use strict";ue={reply:"This is demo mode \u2014 I answer from a script, not a live model. Run `agentx setup` to connect a real provider."};F=a=>Math.max(1,Math.round(a.length/4)),Z=class{name="demo";script;constructor(){this.script=Ie()}pick(e){let t,r=-1;for(let o of this.script.steps)try{let l=new RegExp(o.match,"ig"),p,m=-1;for(;(p=l.exec(e))!==null;)m=p.index,p.index===l.lastIndex&&l.lastIndex++;m>r&&(r=m,t=o)}catch{}if(t)return{reply:t.reply,thinking:t.thinking,delayMs:t.delayMs??700,chunkMs:t.chunkMs??35};let n=this.script.fallback||ue;return{reply:n.reply,thinking:n.thinking,delayMs:n.delayMs??700,chunkMs:n.chunkMs??35}}async generate(e,t){let r=this.pick(U(e));return await C(r.delayMs,t?.abortSignal),{content:r.reply,files:[],tokensUsed:F(r.reply)}}async*stream(e,t){let r=this.pick(U(e));if(await C(r.delayMs,t?.abortSignal),r.thinking)for(let n of Q(r.thinking))yield{type:"thinking_delta",text:n},await C(r.chunkMs,t?.abortSignal);for(let n of Q(r.reply))yield{type:"text_delta",text:n},await C(r.chunkMs,t?.abortSignal);yield{type:"done",result:{content:r.reply,files:[],tokensUsed:F(r.reply)}}}async generateRaw(e,t,r,n){let o=this.pick(U(e));return await C(o.delayMs,n?.abortSignal),{content:[{type:"text",text:o.reply}],stop_reason:"end_turn",usage:{input_tokens:F(U(e)),output_tokens:F(o.reply)}}}async*generateRawStream(e,t,r,n){let o=this.pick(U(e));if(await C(o.delayMs,n?.abortSignal),o.thinking)for(let l of Q(o.thinking))yield{type:"thinking_delta",text:l},await C(o.chunkMs,n?.abortSignal);for(let l of Q(o.reply))yield{type:"text_delta",text:l},await C(o.chunkMs,n?.abortSignal);yield{type:"raw_result",result:{content:[{type:"text",text:o.reply}],stop_reason:"end_turn",usage:{input_tokens:F(U(e)),output_tokens:F(o.reply)}}}}}});function it(a="claude-code",e,t={}){let r=a;if(a==="claude-code"&&!e){let n=S();n&&(r=n.provider)}switch(r){case"claude-code":return new J;case"claude":return new q(e);case"openai":return new D(e,void 0,{thinking:t.thinking});case"deepseek":return new D(e||process.env[he.envKey]||process.env.OPENAI_API_KEY,he.baseUrl,{thinking:t.thinking});case"demo":return new Z;case"ollama":throw new Error("Ollama provider coming soon. Workaround: set provider to 'openai' with OPENAI_BASE_URL=http://localhost:11434/v1 (Ollama exposes an OpenAI-compatible endpoint). Or contribute at github.com/anis-marrouchi/agentx");default:throw new Error(`Unknown provider: ${r}. Supported: claude-code, claude, openai, deepseek`)}}var he,Me=N(()=>{se();ae();pe();ge();H();se();ae();pe();he={baseUrl:"https://api.deepseek.com/v1",envKey:"DEEPSEEK_API_KEY"}});export{S as a,we as b,L as c,Te as d,Ue as e,H as f,Pe as g,M as h,Le as i,qe as j,W as k,q as l,J as m,D as n,it as o,Me as p};
54
- //# sourceMappingURL=chunk-LCIREYTD.js.map
54
+ //# sourceMappingURL=chunk-SZJMS7K4.js.map
@@ -1,2 +1,2 @@
1
- import{a as c,b as d,f as u}from"./chunk-F4HZTZHW.js";u();var f="wiki-rerank",k=30,p=900;function b(t){let r=t.excerptChars??p;return{query:t.query,candidates:t.candidates.map(e=>({id:e.id,title:e.title,tags:e.tags?.length?e.tags.join(", "):null,excerpt:l(e.excerpt,r)}))}}function w(t){let r={};for(let e of t)r[e.id]=e.title;return{best:d(r,"Which candidate answers the query?"),answerable:c("Do any of the candidates answer the query?")}}function x(t,r){let e=t.best,s={};for(let n of r)s[n.id]=e.probabilities[n.id]??0;let o=new Map(r.map((n,a)=>[n.id,a]));return{ranked:[...r.map(n=>n.id)].sort((n,a)=>{let i=s[a]-s[n];return i!==0?i:(o.get(n)??0)-(o.get(a)??0)}),scores:s,answerable:t.answerable.noul,confidence:e.confidence}}function l(t,r){let e=String(t??"").replace(/\s+/g," ").trim();return e.length>r?e.slice(0,r):e}export{f as a,k as b,b as c,w as d,x as e};
2
- //# sourceMappingURL=chunk-AJ5RMU7X.js.map
1
+ import{a as c,b as d,f as u}from"./chunk-72SZI2UW.js";u();var f="wiki-rerank",k=30,p=900;function b(t){let r=t.excerptChars??p;return{query:t.query,candidates:t.candidates.map(e=>({id:e.id,title:e.title,tags:e.tags?.length?e.tags.join(", "):null,excerpt:l(e.excerpt,r)}))}}function w(t){let r={};for(let e of t)r[e.id]=e.title;return{best:d(r,"Which candidate answers the query?"),answerable:c("Do any of the candidates answer the query?")}}function x(t,r){let e=t.best,s={};for(let n of r)s[n.id]=e.probabilities[n.id]??0;let o=new Map(r.map((n,a)=>[n.id,a]));return{ranked:[...r.map(n=>n.id)].sort((n,a)=>{let i=s[a]-s[n];return i!==0?i:(o.get(n)??0)-(o.get(a)??0)}),scores:s,answerable:t.answerable.noul,confidence:e.confidence}}function l(t,r){let e=String(t??"").replace(/\s+/g," ").trim();return e.length>r?e.slice(0,r):e}export{f as a,k as b,b as c,w as d,x as e};
2
+ //# sourceMappingURL=chunk-TFVUOC2C.js.map
@@ -0,0 +1,19 @@
1
+ import{a as ee}from"./chunk-N6EWZGIX.js";import{b as Ce,c as Me}from"./chunk-WP6KLXTP.js";import{b as Oe,e as We,f as je,i as Ee,k as Fe,l as De,q as _e}from"./chunk-V7XZN3MQ.js";import{b as oe}from"./chunk-AFRHKA7B.js";import{a as xe,b as te,c as ne,d as Ne,e as re}from"./chunk-HRBKSZ34.js";import{v as Te,w as Tt}from"./chunk-JQR3NTHI.js";import{b as Pe,f as Pt}from"./chunk-72SZI2UW.js";import{c as Re,d as $e}from"./chunk-QOYAX2FT.js";import{existsSync as xt,mkdirSync as Le,readFileSync as Nt,writeFileSync as Ot,renameSync as Wt}from"fs";import{resolve as He,dirname as jt}from"path";var Ue=class{filePath;log;constructor(e={}){let t=e.baseDir??He(process.cwd(),".agentx");this.filePath=He(t,"handover.json"),this.log=e.log??console.error.bind(console,"[handover]"),Le(t,{recursive:!0})}key(e,t,n){return`${e}::${t}::${n||"-"}`}load(){if(!xt(this.filePath))return{version:1,overrides:{}};try{let e=Nt(this.filePath,"utf-8"),t=JSON.parse(e);return!t||typeof t!="object"?{version:1,overrides:{}}:(t.overrides||(t.overrides={}),t)}catch(e){return this.log(`load failed, starting empty: ${e?.message||e}`),{version:1,overrides:{}}}}save(e){Le(jt(this.filePath),{recursive:!0});let t=`${this.filePath}.tmp-${process.pid}`;Ot(t,JSON.stringify(e,null,2)),Wt(t,this.filePath)}get(e,t,n){let i=this.load().overrides[this.key(e,t,n)];if(i&&!(i.expiresAt&&Date.parse(i.expiresAt)<Date.now()))return i}set(e){if(!e.channel||!e.chatId||!e.toAgent)throw new Error("channel, chatId and toAgent are required");let t=this.load(),n={...e,createdAt:e.createdAt??new Date().toISOString()};return t.overrides[this.key(n.channel,n.chatId,n.accountId)]=n,this.save(t),n}remove(e,t,n){let o=this.load(),i=this.key(e,t,n);return i in o.overrides?(delete o.overrides[i],this.save(o),!0):!1}consumeSummary(e,t,n){let o=this.load(),i=o.overrides[this.key(e,t,n)];if(!i||!i.summary||i.summaryConsumedAt)return;let s=i.summary;return i.summaryConsumedAt=new Date().toISOString(),this.save(o),s}listActive(){let e=this.load(),t=Date.now();return Object.values(e.overrides).filter(n=>!n.expiresAt||Date.parse(n.expiresAt)>=t)}listByAgent(e){let t=this.listActive();return{incoming:t.filter(n=>n.toAgent===e),outgoing:t.filter(n=>n.fromAgent===e)}}};import{readFileSync as Et,writeFileSync as ie,appendFileSync as Ft,mkdirSync as Dt,existsSync as Ke}from"fs";import{resolve as se}from"path";var Be=200,Ct=7,ze=class{memoryDir;constructor(e=process.cwd()){this.memoryDir=se(e,".agentx/memory"),Ke(this.memoryDir)||Dt(this.memoryDir,{recursive:!0})}filePath(e){return se(this.memoryDir,`${e}.jsonl`)}addMemory(e,t){if(t.category==="secret"||te(t.content))return!1;let n=t.source.trust??xe(t.source.channel),o=t.review??Ne(n),i={...t,source:{...t.source,trust:n},...o?{review:o}:{},id:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,createdAt:new Date().toISOString()};return Ft(this.filePath(e),JSON.stringify(i)+`
2
+ `),!0}getAll(e){let t=this.filePath(e);if(!Ke(t))return[];try{return Et(t,"utf-8").split(`
3
+ `).filter(o=>o.trim()).map(o=>{try{return JSON.parse(o)}catch{return null}}).filter(o=>o!==null)}catch{return[]}}findRelevant(e,t,n=8){let o=this.getAll(t).filter(re);if(o.length===0)return[];let i=o.map(f=>`${f.keywords.join(" ")} ${f.content}`),s=se(this.memoryDir,`${t}_bm25_cache.json`),a=$e(i,s),d=Re(e,a),c=new Map(d.map(f=>[f.docIndex,f.score])),p=o.map((f,h)=>{let m=c.get(h)??0;return f.category==="commitment"&&(m+=1),{memory:f,score:m}}).filter(f=>f.score>0);if(p.length===0)return o.slice(-n);let g=p.sort((f,h)=>h.score-f.score).slice(0,n).map(f=>f.memory);if(g.length>0)try{this.recordAccess(t,g.map(f=>f.id))}catch{}return g}buildContext(e){let t=this.contextLines(e).map(n=>n.line);return t.length===0?"":["[Agent Memory \u2014 persistent facts from past conversations]",...t,"[End Memory]"].join(`
4
+ `)}contextFacts(e){return this.contextLines(e).map(t=>t.fact)}contextLines(e){let t=[],n=57;for(let o of e){let s=!o.source.chatId.startsWith("-")&&/^\d+$/.test(o.source.chatId)?"DM":o.source.chatId,a=`- [${o.category}] ${o.content} (${s}, ${o.source.date})`;if(n+a.length>2400)break;t.push({fact:o,line:a}),n+=a.length}return t}recordAccess(e,t){if(t.length===0)return;let n=this.getAll(e),o=new Set(t),i=!1;for(let s of n)if(o.has(s.id)){s.accessCount=(s.accessCount||0)+1,s.lastAccessed=new Date().toISOString();let a=s.intervalDays||1;s.intervalDays=Math.min(a*2,30),s.nextReview=new Date(Date.now()+s.intervalDays*864e5).toISOString(),i=!0}i&&ie(this.filePath(e),n.map(s=>JSON.stringify(s)).join(`
5
+ `)+`
6
+ `)}getDueForReview(e,t=5){let n=this.getAll(e).filter(re),o=Date.now();return n.filter(i=>i.category==="task-state"?!1:i.nextReview?new Date(i.nextReview).getTime()<=o:!0).sort((i,s)=>!i.nextReview&&s.nextReview?-1:i.nextReview&&!s.nextReview?1:i.nextReview&&s.nextReview?new Date(i.nextReview).getTime()-new Date(s.nextReview).getTime():(i.accessCount||0)-(s.accessCount||0)).slice(0,t)}buildRecallContext(e){let t=this.getDueForReview(e,5);if(t.length===0)return"";let n=["[Memory Recall \u2014 facts due for review, verify they are still accurate]"];for(let o of t){let i=Math.round((Date.now()-new Date(o.createdAt).getTime())/864e5);n.push(`- [${o.category}] ${o.content} (${i}d old, accessed ${o.accessCount||0}x)`)}return n.push("[If any fact is outdated, note the correction. Otherwise, acknowledge recall.]"),n.join(`
7
+ `)}held(e){return this.getAll(e).filter(t=>t.review==="held"||t.review===void 0&&ne(t)==="external")}review(e,t,n,o="operator"){let i=this.getAll(e),s=i.find(a=>a.id===t);return s?(s.review=n,s.reviewedBy=o,s.reviewedAt=new Date().toISOString(),this.rewrite(e,i),!0):!1}scrubSecrets(e,t=!1){let n=this.getAll(e),o=n.filter(s=>s.category!=="secret"&&!te(s.content)),i=n.length-o.length;return t&&i>0&&this.rewrite(e,o),i}trustSummary(e){let t={};for(let n of this.getAll(e)){let o=`${ne(n)}${n.review?`/${n.review}`:""}`;t[o]=(t[o]??0)+1}return t}rewrite(e,t){ie(this.filePath(e),t.map(n=>JSON.stringify(n)).join(`
8
+ `)+(t.length?`
9
+ `:""))}hasSimilar(e,t){let n=this.getAll(e),i=t.toLowerCase().split(/\s+/).filter(s=>s.length>3);return n.some(s=>{let a=s.content.toLowerCase();return i.filter(c=>a.includes(c)).length>=i.length*.7})}prune(e){let t=this.getAll(e);if(t.length===0)return;let n=Date.now(),o=Ct*24*60*60*1e3;t=t.filter(s=>s.category==="task-state"&&s.expiresAt?new Date(s.expiresAt).getTime()>n:s.category==="task-state"&&!s.expiresAt?n-new Date(s.createdAt).getTime()<o:!0),t.length>Be&&(t=t.slice(-Be));let i=this.filePath(e);ie(i,t.map(s=>JSON.stringify(s)).join(`
10
+ `)+`
11
+ `)}};import{existsSync as I,mkdirSync as rn,readdirSync as U,readFileSync as K,unlinkSync as B,writeFileSync as ce}from"fs";import{resolve as R,relative as ue}from"path";import{z as u}from"zod";var Mt=u.enum(["trigger.channel","trigger.manual","trigger.cron","trigger.hook","trigger.form","agent","transform","classify","branch","gateway.parallel","rule","action.send","action.createIssue","action.setLabel","action.readLabel","action.react","action.editMessage","action.logTime","action.callHTTP","action.run","action.builtin","subProcess","signal.emit","signal.wait","timer.boundary","checkpoint","end"]),_t=u.enum(["equals","contains","matches","exists"]),Lt=u.object({kind:_t,params:u.record(u.unknown()).default({})}),Je=u.object({maxAttempts:u.number().int().min(1).max(10).default(1),backoffMs:u.number().int().min(0).max(6e4).default(1e3)}).default({maxAttempts:1,backoffMs:1e3}),Ye=u.object({id:u.string().min(1).regex(/^[a-zA-Z_][a-zA-Z0-9_-]*$/,"node id must be identifier-safe"),type:Mt,config:u.record(u.unknown()).default({}),retry:Je,position:u.object({x:u.number(),y:u.number()}).optional()}),Ge=u.object({from:u.string(),fromPort:u.string().optional(),to:u.string(),toPort:u.string().optional(),label:u.string().optional()}),qe=u.union([u.string(),u.date().transform(r=>r.toISOString())]),$=u.object({id:u.string().regex(/^[a-z0-9][a-z0-9_-]*$/,"workflow id must be lower-kebab"),version:u.literal(2).default(2),title:u.string().min(1),description:u.string().optional(),status:u.enum(["draft","review","active","deprecated"]).default("active"),tags:u.array(u.string()).default([]),project:u.string().optional(),entity:u.string().optional(),intentPath:u.array(u.string()).default([]),generatedFrom:u.string().optional(),sourceTaskIds:u.array(u.string()).default([]),confidence:u.number().min(0).max(1).optional(),workflowVersion:u.string().optional(),ownerAgent:u.string().optional(),lastMatchedAt:u.string().optional(),matchCount:u.number().int().min(0).default(0),state:u.enum(["active","disabled","quarantined"]).default("active"),priority:u.number().int().default(0),fanOut:u.boolean().default(!1),nodes:u.array(Ye).refine(r=>r.length>0,{message:"workflow must have at least one node"}),edges:u.array(Ge).default([]),envAllow:u.array(u.string()).default([]),retention:u.object({maxRuns:u.number().int().positive().default(500),maxDays:u.number().int().positive().default(90)}).default({maxRuns:500,maxDays:90}),maxChildDepth:u.number().int().positive().default(5),mesh:u.object({allowRemote:u.boolean().default(!1),peers:u.array(u.string()).optional()}).default({allowRemote:!1}),created:qe.optional(),updated:qe.optional()});function ae(r){let e=[],t=new Map(r.nodes.map(s=>[s.id,s])),n=r.nodes.filter(s=>s.type.startsWith("trigger."));n.length===0&&e.push("workflow must have exactly one trigger.* node (found 0)"),n.length>1&&e.push(`workflow has ${n.length} trigger.* nodes; v1 supports exactly one`);for(let s of r.edges)t.has(s.from)||e.push(`edge references missing node: from="${s.from}"`),t.has(s.to)||e.push(`edge references missing node: to="${s.to}"`);let o=n[0];if(o){let s=new Map;for(let c of r.edges)s.has(c.from)||s.set(c.from,[]),s.get(c.from).push(c.to);let a=new Set,d=[o.id];for(;d.length;){let c=d.pop();if(!a.has(c)){a.add(c);for(let l of s.get(c)??[])d.push(l)}}for(let c of r.nodes)a.has(c.id)||e.push(`node "${c.id}" is unreachable from trigger "${o.id}"`);r.nodes.some(c=>a.has(c.id)&&Ht(c.type))||e.push("no reachable `end`, `checkpoint`, `subProcess`, `signal.wait`, or `timer.boundary` node \u2014 the run cannot terminate or pause")}for(let s of r.nodes){if(s.type!=="branch"&&s.type!=="rule")continue;let a=s.type==="branch"?s.config.cases??[]:(s.config.rules??[]).filter(p=>typeof p.to=="string"),d=s.type==="branch"?s.config.default:s.config.default?.to,c=new Set(a.map(p=>p.to));d&&c.add(d);let l=r.edges.filter(p=>p.from===s.id);for(let p of l){let g=p.fromPort??"";c.has(g)||e.push(`${s.type} "${s.id}" has outgoing edge with port "${g}" not declared in cases or default`)}}let i=Kt(r);for(let s of i)e.push(`cycle without agent/checkpoint: ${s.join(" -> ")}`);return e}function Ht(r){return r==="end"||r==="checkpoint"||r==="subProcess"||r==="signal.wait"||r==="timer.boundary"}function Ut(r){return r==="agent"||r==="checkpoint"||r==="subProcess"||r==="signal.wait"||r==="timer.boundary"}function Kt(r){let e=new Map;for(let a of r.edges)e.has(a.from)||e.set(a.from,[]),e.get(a.from).push(a.to);let t=new Map(r.nodes.map(a=>[a.id,a])),n=[],o=new Map,i=[],s=a=>{if(o.get(a)===1){let d=i.indexOf(a);if(d>=0){let c=i.slice(d).concat(a);c.some(p=>{let g=t.get(p)?.type;return g?Ut(g):!1})||n.push(c)}return}if(o.get(a)!==2){o.set(a,1),i.push(a);for(let d of e.get(a)??[])s(d);i.pop(),o.set(a,2)}};for(let a of r.nodes)o.get(a.id)!==2&&s(a.id);return n}var Ve=u.enum(["running","paused","completed","failed","canceled"]),Bt=u.enum(["ok","failed","timeout","skipped","paused","resumed"]),zt=u.object({at:u.string(),nodeId:u.string(),inputKeys:u.array(u.string()).default([]),status:Bt,output:u.record(u.unknown()).optional(),idempotencyKey:u.string(),note:u.string().optional()}),qt=u.object({backend:u.string(),id:u.string()}),Jt=u.discriminatedUnion("kind",[u.object({kind:u.literal("checkpoint"),nodeId:u.string(),checkpointName:u.string(),resumeMatch:u.record(u.unknown()).default({})}),u.object({kind:u.literal("subProcess"),nodeId:u.string(),childRunId:u.string(),childWorkflowId:u.string()}),u.object({kind:u.literal("signalWait"),nodeId:u.string(),signalName:u.string(),match:u.record(u.unknown()).default({}),scope:u.enum(["workflow","global"]).default("workflow")}),u.object({kind:u.literal("timerWait"),nodeId:u.string(),fireAt:u.string()})]),Yt=u.object({id:u.string(),workflowId:u.string(),workflowVersion:u.literal(2),homeNode:u.string(),status:Ve,pausedAt:Jt.optional(),context:u.record(u.record(u.unknown())).default({}),pending:u.array(u.string()).default([]),joinCounters:u.record(u.array(u.string())).default({}),entityRef:qt,history:u.array(zt).default([]),parentRunId:u.string().nullable().default(null),parentNodeId:u.string().nullable().default(null),rootRunId:u.string().nullable().default(null),depth:u.number().int().min(0).default(0),eventRootId:u.string().optional(),createdAt:u.string(),updatedAt:u.string()});import Xe from"js-yaml";var Gt=new Set(["branch","gateway.parallel","rule","signal.wait","subProcess","timer.boundary","checkpoint"]),v=class extends Error{constructor(t,n){super(t);this.mark=n;this.name="WorkflowYamlError"}};function L(r,e={}){if(!r||r.trim()==="")throw new v(`${P(e)}empty file \u2014 workflow YAML must contain at least an id, version, title, and one node.`);let t;try{t=Xe.loadAll(r)}catch(o){let i=o?.mark;throw new v(`${P(e)}YAML parse error: ${o?.reason??o?.message??o}`+(i?` (line ${i.line+1}, column ${i.column+1})`:""),i)}if(t.length===0||t.length===1&&t[0]==null)throw new v(`${P(e)}YAML produced no document.`);if(t.length>1)throw new v(`${P(e)}multi-document YAML is not supported in v1; one workflow per file.`);let n=t[0];if(typeof n!="object"||n===null||Array.isArray(n)){let o=Array.isArray(n)?"array":typeof n;throw new v(`${P(e)}top-level YAML must be a mapping (got ${o}).`)}return Qe(n,e)}function Qe(r,e={}){if(!("flow"in r))return r;let t=r.flow;if(t==null){let p={...r};return delete p.flow,p}if(!Array.isArray(t))throw new v(`${P(e)}flow must be an array of node ids (got ${typeof t}).`);for(let p of t)if(typeof p!="string")throw new v(`${P(e)}flow entries must be strings (got ${typeof p}).`);let n=t,o=Array.isArray(r.nodes)?r.nodes:[],i=new Map;for(let p of o)p&&typeof p=="object"&&typeof p.id=="string"&&typeof p.type=="string"&&i.set(p.id,p.type);for(let p of n){if(!i.has(p))throw new v(`${P(e)}flow references unknown node "${p}".`);let g=i.get(p);if(Gt.has(g))throw new v(`${P(e)}flow cannot include ${g} node "${p}"; use explicit edges for ${g} nodes.`)}let s=[];for(let p=0;p<n.length-1;p++)s.push({from:n[p],to:n[p+1]});let a=Array.isArray(r.edges)?r.edges:[],d=new Set,c=[];for(let p of a){if(!p||typeof p!="object")continue;let g=Ze(p.from,p.fromPort,p.to);g&&!d.has(g)?(d.add(g),c.push(p)):g||c.push(p)}for(let p of s){let g=Ze(p.from,void 0,p.to);g&&!d.has(g)&&(d.add(g),c.push(p))}let l={...r,edges:c};return delete l.flow,l}function Ze(r,e,t){return typeof r!="string"||typeof t!="string"?null:`${r}::${typeof e=="string"?e:""}::${t}`}function P(r){return r.filePath?`${r.filePath}: `:""}function Vt(r){return Xe.dump(r,{noRefs:!0,lineWidth:100,sortKeys:!1})}import{Document as Zt,isMap as H,isSeq as Xt,isScalar as et,parseDocument as Qt}from"yaml";function tt(r,e){let t=Qt(r);if(!t.contents||!H(t.contents)){let n=new Zt(e);return t.commentBefore&&(n.commentBefore=t.commentBefore),String(n)}return de(t,t.contents,e),String(t)}function de(r,e,t){let n=Object.keys(t),o=new Set(n),i=new Map;for(let a of e.items){let d=nn(a);d!==null&&i.set(d,a)}let s=[];for(let a of n){let d=t[a],c=i.get(a);c?(en(r,c,d),s.push(c)):s.push(r.createPair(a,d))}e.items=s}function en(r,e,t){let n=e.value;if(t==null){e.value=r.createNode(null);return}if(typeof t!="object"){e.value=r.createNode(t);return}if(Array.isArray(t)){Xt(n)?tn(r,n,t):e.value=r.createNode(t);return}H(n)?de(r,n,t):e.value=r.createNode(t)}function tn(r,e,t){if(!(t.length>0&&t.every(s=>s&&typeof s=="object"&&typeof s.id=="string"))){let s=r.createNode(t);e.items=s.items;return}let o=new Map;for(let s of e.items)if(H(s)){let a=s.get("id",!0);et(a)&&typeof a.value=="string"&&o.set(a.value,s)}let i=[];for(let s of t){let a=s.id,d=o.get(a);d&&H(d)?(de(r,d,s),i.push(d)):i.push(r.createNode(s))}e.items=i}function nn(r){let e=r.key;return et(e)&&typeof e.value=="string"?e.value:typeof e=="string"?e:null}var le=class{baseDir;constructor(e={}){this.baseDir=e.baseDir??R(process.cwd(),".agentx/workflows"),rn(this.baseDir,{recursive:!0})}pathFor(e){return this.pathForJson(e)}pathForJson(e){return R(this.baseDir,`${e}.json`)}pathForYaml(e){return R(this.baseDir,`${e}.yaml`)}isWorkflowFile(e){return e.startsWith("_")?!1:e.endsWith(".json")||e.endsWith(".yaml")||e.endsWith(".yml")}idFromFilename(e){return e.replace(/\.(json|ya?ml)$/,"")}readAndParse(e){let t=R(this.baseDir,e),n=K(t,"utf-8");return e.endsWith(".json")?JSON.parse(n):L(n,{filePath:e})}list(){if(!I(this.baseDir))return[];let e=new Map;for(let n of U(this.baseDir,{withFileTypes:!0})){if(!n.isFile()||!this.isWorkflowFile(n.name))continue;let o=this.idFromFilename(n.name),i=e.get(o)??[];i.push(n.name),e.set(o,i)}let t=[];for(let[,n]of e)if(!(n.length>1))try{let o=this.readAndParse(n[0]),i=$.safeParse(o);i.success&&t.push(i.data)}catch{}return t.sort((n,o)=>n.id.localeCompare(o.id))}validateAll(){let e=[];if(!I(this.baseDir))return e;let t=new Map;for(let n of U(this.baseDir,{withFileTypes:!0})){if(!n.isFile()||!this.isWorkflowFile(n.name))continue;let o=this.idFromFilename(n.name),i=t.get(o)??[];i.push(n.name),t.set(o,i)}for(let[n,o]of t){if(o.length>1){let p=[...o].sort();for(let g of p)e.push({id:n,path:ue(this.baseDir,R(this.baseDir,g)),issues:[`duplicate workflow id "${n}" \u2014 found ${p.join(" and ")}; delete one to disambiguate`],isValid:!1});continue}let i=o[0],s=R(this.baseDir,i),a=ue(this.baseDir,s),d;try{d=this.readAndParse(i)}catch(p){let g=p instanceof v?p.message:`parse error: ${p?.message??p}`;e.push({id:n,path:a,issues:[g],isValid:!1});continue}let c=$.safeParse(d);if(!c.success){let p=c.error.issues.map(g=>`${g.path.join(".")||"<root>"}: ${g.message}`);e.push({id:String(d?.id??n),path:a,issues:p,isValid:!1});continue}let l=ae(c.data);e.push({workflow:c.data,issues:l,isValid:l.length===0})}return e}get(e){let t=this.pathForJson(e),n=this.pathForYaml(e),o=R(this.baseDir,`${e}.yml`),i=I(t),s=I(n)||I(o);if(i&&s)return null;if(i)try{let d=JSON.parse(K(t,"utf-8")),c=$.safeParse(d);return c.success?c.data:null}catch{return null}let a=I(n)?n:I(o)?o:null;if(a)try{let d=K(a,"utf-8"),c=L(d,{filePath:ue(this.baseDir,a)}),l=$.safeParse(c);return l.success?l.data:null}catch{return null}if(!I(this.baseDir))return null;for(let d of U(this.baseDir,{withFileTypes:!0}))if(!(!d.isFile()||!this.isWorkflowFile(d.name)||this.idFromFilename(d.name)===e))try{let l=this.readAndParse(d.name),p=$.safeParse(l);if(p.success&&p.data.id===e)return p.data}catch{}return null}save(e,t={}){let n=new Date().toISOString().slice(0,10),o=$.parse({...e,created:e.created||n,updated:n}),i=this.pathForYaml(o.id),s=R(this.baseDir,`${o.id}.yml`),a=I(i)?i:I(s)?s:null;if(!a&&I(this.baseDir)){for(let d of U(this.baseDir,{withFileTypes:!0}))if(!(!d.isFile()||!this.isWorkflowFile(d.name))&&!d.name.endsWith(".json"))try{let c=this.readAndParse(d.name),l=$.safeParse(c);if(l.success&&l.data.id===o.id){a=R(this.baseDir,d.name);break}}catch{}}if(a&&t.convertFromYaml)return B(a),ce(this.pathForJson(o.id),JSON.stringify(o,null,2)+`
12
+ `),o;if(a){let d=K(a,"utf-8");try{let c=tt(d,o);return ce(a,c),o}catch(c){let l=new Error(`yaml round-trip failed for "${o.id}" at ${a}: ${c?.message??c}`);throw l.yamlPath=a,l}}return ce(this.pathForJson(o.id),JSON.stringify(o,null,2)+`
13
+ `),o}delete(e){let t=this.pathForJson(e),n=this.pathForYaml(e),o=R(this.baseDir,`${e}.yml`),i=!1;return I(t)&&(B(t),i=!0),I(n)&&(B(n),i=!0),I(o)&&(B(o),i=!0),i}};import{createHash as on,randomUUID as sn}from"crypto";import{appendFileSync as nt,existsSync as j,mkdirSync as rt,readdirSync as ot,readFileSync as pe,statSync as it,unlinkSync as st,writeFileSync as an}from"fs";import{resolve as W}from"path";function dn(r){return r.replace(/[^a-zA-Z0-9._:#@-]/g,"_").slice(0,200)}function x(r,e,t){return on("sha1").update(`${r}|${e}|${t}`).digest("hex").slice(0,16)}var fe=class{baseDir;runsDir;indexDir;nodeId;constructor(e){this.baseDir=e.baseDir??W(process.cwd(),".agentx/workflows"),this.runsDir=W(this.baseDir,"_runs"),this.indexDir=W(this.baseDir,"_index"),this.nodeId=e.nodeId,rt(this.runsDir,{recursive:!0}),rt(this.indexDir,{recursive:!0})}runPath(e){return W(this.runsDir,`${e}.jsonl`)}indexPath(e){return W(this.indexDir,`${e.backend}__${dn(e.id)}.json`)}create(e){let t=new Date().toISOString(),n=sn(),o={id:n,workflowId:e.workflowId,workflowVersion:2,homeNode:this.nodeId,status:"running",pausedAt:void 0,context:e.initialContext??{},pending:e.initialPending,entityRef:e.entityRef,history:[],parentRunId:e.parentRunId??null,parentNodeId:e.parentNodeId??null,rootRunId:e.rootRunId??n,depth:e.depth??0,eventRootId:e.eventRootId??We()?.rootId,joinCounters:{},createdAt:t,updatedAt:t};return this.appendSnapshot(o),this.writeIndex(e.entityRef,o.id),o}get(e){let t=this.runPath(e);if(!j(t))return null;let n=pe(t,"utf-8").trim();if(!n)return null;let o=null;for(let i of n.split(`
14
+ `)){let s;try{s=JSON.parse(i)}catch{continue}if(s.v===2){if(s.kind==="snapshot")o=s.run;else if(s.kind==="exec"&&o&&o.id===s.runId){let a=o;o={...a,history:[...a.history,s.entry],pending:s.pending,status:s.status??a.status,pausedAt:s.pausedAt===null?void 0:s.pausedAt??a.pausedAt,context:s.context??a.context,joinCounters:s.joinCounters??a.joinCounters,updatedAt:s.entry.at}}}}return o}getActiveByEntity(e){let t=this.indexPath(e);if(!j(t))return null;try{return JSON.parse(pe(t,"utf-8")).runId}catch{return null}}getHomeNodeByEntity(e){let t=this.indexPath(e);if(!j(t))return null;try{return JSON.parse(pe(t,"utf-8")).homeNode}catch{return null}}recordExecution(e){let t=this.get(e.runId);if(!t)return null;if(t.history.some(i=>i.idempotencyKey===e.entry.idempotencyKey))return t;let n={v:2,kind:"exec",runId:e.runId,entry:e.entry,pending:e.nextPending,status:e.status,pausedAt:e.pausedAt===null?null:e.pausedAt,context:e.context,joinCounters:e.joinCounters};nt(this.runPath(e.runId),JSON.stringify(n)+`
15
+ `);let o=e.status??t.status;return o==="completed"||o==="failed"||o==="canceled"?this.clearIndex(t.entityRef):this.writeIndex(t.entityRef,t.id),this.get(e.runId)}setStatus(e,t){let n=this.get(e);if(!n)return null;let o={...n,status:t,updatedAt:new Date().toISOString()};return this.appendSnapshot(o),t!=="running"&&t!=="paused"&&this.clearIndex(o.entityRef),o}list(e={}){if(!j(this.runsDir))return[];let t=ot(this.runsDir).filter(o=>o.endsWith(".jsonl")).map(o=>({name:o,mtime:it(W(this.runsDir,o)).mtimeMs})).sort((o,i)=>i.mtime-o.mtime),n=[];for(let o of t){let i=this.get(o.name.replace(/\.jsonl$/,""));if(i&&!(e.workflowId&&i.workflowId!==e.workflowId)&&(n.push(i),e.limit&&n.length>=e.limit))break}return n}prune(e){if(!j(this.runsDir))return 0;let t=Date.now()-e.maxDays*24*60*60*1e3,n=[];for(let i of ot(this.runsDir)){if(!i.endsWith(".jsonl"))continue;let s=W(this.runsDir,i),a=it(s).mtimeMs,d=this.get(i.replace(/\.jsonl$/,""));d&&(d.status==="running"||d.status==="paused"||n.push({file:s,run:d,mtime:a}))}n.sort((i,s)=>s.mtime-i.mtime);let o=0;for(let i=0;i<n.length;i++){let s=n[i],a=s.mtime<t,d=i>=e.maxRuns;if(a||d)try{st(s.file),o++}catch{}}return o}appendSnapshot(e){let t={v:2,kind:"snapshot",run:e};nt(this.runPath(e.id),JSON.stringify(t)+`
16
+ `)}writeIndex(e,t){an(this.indexPath(e),JSON.stringify({runId:t,homeNode:this.nodeId,updatedAt:new Date().toISOString()},null,2)+`
17
+ `)}clearIndex(e){let t=this.indexPath(e);if(j(t))try{st(t)}catch{}}};import{existsSync as at,mkdirSync as cn,readFileSync as un,unlinkSync as ln,writeFileSync as pn}from"fs";import{resolve as ge}from"path";import{z as E}from"zod";var dt=E.object({version:E.literal(1),nodes:E.record(E.object({x:E.number(),y:E.number()}))}),me=class{baseDir;layoutsDir;constructor(e={}){this.baseDir=e.baseDir??ge(process.cwd(),".agentx/workflows"),this.layoutsDir=ge(this.baseDir,"_layouts"),cn(this.layoutsDir,{recursive:!0})}pathFor(e){let t=e.replace(/[^a-zA-Z0-9._-]/g,"_");return ge(this.layoutsDir,`${t}.json`)}get(e){let t=this.pathFor(e);if(!at(t))return null;try{let n=dt.safeParse(JSON.parse(un(t,"utf-8")));return n.success?n.data:null}catch{return null}}save(e,t){let n=dt.parse(t);return pn(this.pathFor(e),JSON.stringify(n,null,2)+`
18
+ `),n}sync(e,t){let n=this.get(e);if(!n)return null;let o={};for(let s of t)n.nodes[s]&&(o[s]=n.nodes[s]);let i={version:1,nodes:o};return this.save(e,i)}delete(e){let t=this.pathFor(e);return at(t)?(ln(t),!0):!1}};function ct(r){return new Set(r.toLowerCase().replace(/[^a-z0-9\s]/g," ").split(/\s+/).filter(e=>e.length>3))}function fn(r,e){if(r.size===0||e.size===0)return 0;let t=0;for(let n of r)e.has(n)&&t++;return t/Math.max(r.size,e.size)}function gn(r,e){let t=ct(r.message),n=e.filter(i=>i.state==="active"&&(i.status??"active")==="active"),o=null;for(let i of n){let s=0,a=[];if(i.ownerAgent&&i.ownerAgent===r.agentId&&(s+=.25,a.push("owner-agent")),r.channel&&i.tags.includes(r.channel)&&(s+=.15,a.push("channel-tag")),r.intentPath?.length&&i.intentPath.length){let p=r.intentPath.filter((g,f)=>i.intentPath[f]===g).length;p>0&&(s+=Math.min(.3,p*.1),a.push("intent-path"))}let d=[i.id,i.title,i.description??"",...i.tags].join(" "),c=fn(t,ct(d));c>0&&(s+=Math.min(.35,c),a.push("text-similarity")),(i.matchCount??0)>0&&(s+=Math.min(.1,i.matchCount*.01),a.push("prior-matches"));let l=Math.max(0,Math.min(1,s));(!o||l>o.confidence)&&(o={workflow:i,confidence:l,reasons:a})}return o&&o.confidence>0?o:null}function he(r){let{workflow:e,fromNodeId:t,selectedPort:n}=r,o=e.nodes.find(a=>a.id===t);if(!o)return{nextPending:[]};let i=e.edges.filter(a=>a.from===t);return{nextPending:(o.type==="branch"?i.filter(a=>(a.fromPort??"")===(n??"")):i).map(a=>a.to)}}function we(r,e){let t=r.config.cases??[],n=r.config.default??"";for(let o of t)if(mn(o.when,e))return o.to;return n}function mn(r,e){let t=r.params??{},n=String(t.path??""),o=z(e,n);switch(r.kind){case"equals":return o===t.value;case"contains":return typeof o=="string"?o.includes(String(t.value??"")):Array.isArray(o)?o.some(i=>i===t.value):!1;case"matches":{if(typeof o!="string")return!1;try{return new RegExp(String(t.regex??"")).test(o)}catch{return!1}}case"exists":return o!=null&&o!=="";default:return!1}}function z(r,e){if(!e)return;let t=e.split("."),n=r;for(let o of t){if(n==null||typeof n!="object")return;n=n[o]}return n}function q(r){let e=r.nodes.find(n=>n.type.startsWith("trigger."));if(!e)return null;let t=r.edges.filter(n=>n.from===e.id).map(n=>n.to);return{triggerId:e.id,pending:t}}function N(r,e){return r.nodes.find(t=>t.id===e)}Pt();Tt();function hn(r,e,t){let n=r.split(".");if(n[0]==="env"){if(n.length!==2)return"";let i=n[1];if(!t.has(i))return"";let s=process.env[i];return typeof s=="string"?s:""}let o=e;for(let i of n){if(o==null||typeof o!="object")return"";o=o[i]}return o==null?"":typeof o=="object"?JSON.stringify(o):String(o)}function S(r,e,t={}){let n=new Set(t.envAllow||[]);return r.replace(/\{\{\s*([a-zA-Z_][a-zA-Z0-9_.-]*)\s*\}\}/g,(o,i)=>hn(i,e,n))}function b(r,e,t={}){let n={};for(let[o,i]of Object.entries(r))typeof i=="string"?n[o]=S(i,e,t):Array.isArray(i)?n[o]=i.map(s=>typeof s=="string"?S(s,e,t):s):i&&typeof i=="object"?n[o]=b(i,e,t):n[o]=i;return n}var ut="workflow-classify",J="unsure",lt=async r=>{let e=r.node.config,t=r.run.context,n={envAllow:r.workflow.envAllow},o=S(String(e.input??""),t,n).trim();if(!o)return{error:`classify node "${r.node.id}" missing config.input`};let i=e.labels,s=Array.isArray(i)?Object.fromEntries(i.map(m=>[String(m),null])):typeof i=="object"&&i?Object.fromEntries(Object.entries(i).map(([m,y])=>[m,y==null?null:String(y)])):{},a=Object.keys(s);if(a.length<2)return{error:`classify node "${r.node.id}" needs at least two labels`};if(a.includes(J))return{error:`classify node "${r.node.id}": "${J}" is reserved for the low-confidence port`};let d=typeof e.minConfidence=="number"?e.minConfidence:.7,c=e.instructions?S(String(e.instructions),t,n):void 0,l={input:o};if(e.state&&typeof e.state=="object")for(let[m,y]of Object.entries(e.state)){let w=typeof y=="string"?S(y,t,n):y;(w===null||["string","number","boolean"].includes(typeof w))&&(l[m]=w)}let p=await Te(ut,l,{label:Pe(s,c)},{features:{workflow:r.workflow.id,node:r.node.id}});if(!p)return{error:`classify node "${r.node.id}": decision seat unavailable (set decisions.seats.${ut}.mode)`};let g=p.answers.label,f=g.confidence>=d,h=f?g.choice:J;return r.log(`[node:${r.node.id}] classify \u2192 ${g.choice} (${g.confidence.toFixed(2)})${f?"":` \u2014 below ${d}, routing to ${J}`}`),{output:{result:g.choice,label:g.choice,confidence:g.confidence,probabilities:g.probabilities,unsure:!f,port:h},port:h}};var ye=class{active=new Map;waiters=new Map;async acquire(e,t){let n=this.active.get(e)??0;if(n<t){this.active.set(e,n+1);return}return new Promise(o=>{let i=this.waiters.get(e)??[];i.push({resolve:()=>{this.active.set(e,(this.active.get(e)??0)+1),o()}}),this.waiters.set(e,i)})}release(e){let t=this.active.get(e)??0;this.active.set(e,Math.max(0,t-1));let n=this.waiters.get(e);n&&n.length>0&&n.shift().resolve()}stats(e){return{active:this.active.get(e)??0,waiting:this.waiters.get(e)?.length??0}}},Y=new ye;function pt(r,e){return`${r}:${e}`}var F=async r=>({output:r.run.context[r.node.id]??{}}),wn=async r=>{let e=r.node.config,t=String(e.agentId??""),n=String(e.prompt??"");if(!t)return{error:`agent node "${r.node.id}" missing config.agentId`};let o=S(n,r.run.context,{envAllow:r.workflow.envAllow}),i=typeof e.timeoutMinutes=="number"?e.timeoutMinutes:void 0,s=e.autonomy===void 0||e.autonomy===null?void 0:String(e.autonomy);if(s!==void 0&&s!=="report"&&s!=="propose"&&s!=="act")return{error:`agent node "${r.node.id}" has invalid autonomy "${s}" (expected report, propose or act)`};let a=typeof e.maxConcurrent=="number"&&e.maxConcurrent>0?e.maxConcurrent:null,d=a?pt(r.workflow.id,r.node.id):null;if(d&&a){let l=Y.stats(d);l.active>=a&&r.log(`[node:${r.node.id}] gated: ${l.active} active (cap ${a}), ${l.waiting+1} waiting`),await Y.acquire(d,a)}let c=Date.now();try{let l=await r.agents.execute({agentId:t,message:o,workflowRunId:r.run.id,timeoutMinutes:i,...s?{autonomy:s}:{}}),p=Date.now()-c;if(l.error){let h=l.errorKind??"unknown";return r.log(`[node:${r.node.id}] agent "${t}" failed (${h}): ${l.error}`),{error:`[${h}] ${l.error}`}}let f=String(e.resultParser??"acme-result-token")==="json"?Hn(l.content):gt(l.content);return{output:{reply:l.content,result:f.result,json:f.json,taskId:l.taskId,durationMs:p,...l.autonomyBlocks?.length?{autonomyBlocks:l.autonomyBlocks}:{}}}}catch(l){return r.log(`[node:${r.node.id}] agent "${t}" threw: ${l.message}`),{error:l.message}}finally{d&&Y.release(d)}},yn=async r=>{let e=we(r.node,r.run.context);return e?{output:{port:e},port:e}:(r.log(`[node:${r.node.id}] branch matched no case and no default port`),{output:{port:null}})},kn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??""),n=String(e.chatId??""),o=String(e.text??"");if(!t||!n){let a=String(r.node.config.chatId??""),d=String(r.node.config.channel??""),c=[];return t||c.push(`channel config="${d}" rendered=""`),n||c.push(`chatId config="${a}" rendered=""`),(/\{\{\s*env\./.test(a)||/\{\{\s*env\./.test(d))&&c.push("(env.* templates only resolve for names listed in workflow.envAllow and actually set in process.env)"),{error:`action.send "${r.node.id}" needs channel + chatId \u2014 ${c.join("; ")}`}}let i=be(r,e.accountId),s=r.channels[t];if(s?.send)try{return{output:{messageId:await s.send({channel:t,chatId:n,text:o,...i?{accountId:i}:{}})??null}}}catch(a){return{error:`action.send failed: ${a.message}`}}if(r.forwardChannelSend)try{return{output:{messageId:(await r.forwardChannelSend({channel:t,chatId:n,text:o,accountId:i})).messageId,viaMesh:!0}}}catch(a){return r.log(`[node:${r.node.id}] mesh-forward of "${t}" send failed: ${a.message}`),{error:`action.send via mesh failed: ${a.message}`}}return r.log(`[node:${r.node.id}] adapter "${t}" not available locally and no mesh forwarder`),{error:`channel "${t}" not available (no local adapter, no mesh route)`}},bn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.project??""),o=String(e.title??""),i=String(e.description??""),s=Array.isArray(e.labels)?e.labels.map(String):[],a=Array.isArray(e.assignees)?e.assignees.map(String):[];if(!n||!o)return{error:`action.createIssue "${r.node.id}" needs project + title`};let d=ve(r),c=r.channels[t];if(!c?.createIssue)return{error:`channel "${t}" does not support createIssue`};try{let l=await c.createIssue({project:n,title:o,description:i,labels:s,assignees:a,agentId:d});return l?{output:{issue:{iid:l.iid,url:l.url,webUrl:l.url}}}:{error:"createIssue returned null (see adapter log)"}}catch(l){return{error:`action.createIssue failed: ${l.message}`}}},vn=async()=>({output:{}}),In=async r=>{let e=r.node.config,t=String(e.name??r.node.id),n=e.waitFor??{},o=e.resumeMatch??{};return{paused:!0,pausedAt:{kind:"checkpoint",nodeId:r.node.id,checkpointName:t,resumeMatch:{...n,...o}}}},Sn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.project??""),o=String(e.iid??""),i=Array.isArray(e.add)?e.add.map(String):[],s=Array.isArray(e.remove)?e.remove.map(String):[];if(!n||!o)return{error:`action.setLabel "${r.node.id}" needs project + iid (try {{trigger.project}} / {{trigger.issue.iid}})`};if(i.length===0&&s.length===0)return{output:{skipped:!0,reason:"no labels to add or remove"}};let a=r.channels[t];if(!a?.setLabels)return{error:`channel "${t}" does not support setLabels`};let d=ve(r),c=e.kind==="merge_request"?"merge_request":"issue";return{output:{labels:await a.setLabels({project:n,kind:c,iid:o,add:i,remove:s,agentId:d})??[],add:i,remove:s}}},An=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.project??""),o=String(e.iid??"");if(!n||!o)return{error:`action.readLabel "${r.node.id}" needs project + iid`};let i=r.channels[t];if(!i?.getLabels)return{error:`channel "${t}" does not support getLabels`};let s=e.kind==="merge_request"?"merge_request":"issue";return{output:{labels:await i.getLabels({project:n,kind:s,iid:o})??[]}}},Rn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??""),n=String(e.chatId??""),o=String(e.messageId??""),i=String(e.emoji??"\u{1F440}");if(!t||!n||!o)return{error:`action.react "${r.node.id}" needs channel + chatId + messageId`};let s=be(r,e.accountId),a=r.channels[t];if(!a?.react)return{error:`channel "${t}" does not support react`};try{return await a.react(n,o,i,s),{output:{emoji:i}}}catch(d){return{error:`action.react failed: ${d.message}`}}},$n=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??""),n=String(e.chatId??""),o=String(e.messageId??""),i=String(e.text??""),s=e.parseMode?String(e.parseMode):void 0;if(!t||!n||!o||!i)return{error:`action.editMessage "${r.node.id}" needs channel + chatId + messageId + text`};let a=be(r,e.accountId),d=r.channels[t];if(!d?.editMessage)return{error:`channel "${t}" does not support editMessage`};try{return{output:{edited:await d.editMessage(n,o,i,s,a)}}}catch(c){return{error:`action.editMessage failed: ${c.message}`}}},Pn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.channel??"gitlab"),n=String(e.chatId??""),o=Number(e.durationMs??0);if(!n||!o)return{error:`action.logTime "${r.node.id}" needs chatId + durationMs`};let i=r.channels[t];if(!i?.logTimeSpent)return{error:`channel "${t}" does not support logTimeSpent`};let s=ve(r);try{return await i.logTimeSpent(n,o,s),{output:{durationMs:o}}}catch(a){return{error:`action.logTime failed: ${a.message}`}}},Tn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.url??"");if(!t)return{error:`action.callHTTP "${r.node.id}" needs url`};let n=String(e.method??"POST").toUpperCase(),o=e.headers&&typeof e.headers=="object"?e.headers:{"Content-Type":"application/json"},i;e.body!==void 0&&(i=typeof e.body=="string"?e.body:JSON.stringify(e.body));try{let s=await fetch(t,{method:n,headers:o,body:i}),a=await s.text(),d=a;try{d=JSON.parse(a)}catch{}return{output:{ok:s.ok,status:s.status,body:d}}}catch(s){return{error:`action.callHTTP failed: ${s.message}`}}},xn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.actionId??e.id??"");if(!t)return{error:`action.run "${r.node.id}" needs actionId`};let n=e.inputs&&typeof e.inputs=="object"?e.inputs:{},{ActionStore:o}=await import("./store-TWQPEM5V.js"),{runAction:i}=await import("./runner-56G3N7M4.js"),s=new o().get(t);if(!s)return{error:`action.run "${r.node.id}": no action "${t}" in registry`};try{let a=await i(s,n),d={ok:a.ok,output:a.output,status:a.status,durationMs:a.durationMs};return a.errors!==void 0&&(d.errors=a.errors),a.ok?{output:d}:{output:d,error:`action "${t}" failed (status=${a.status})`}}catch(a){return{error:`action.run failed: ${a.message}`}}},Nn=async r=>{let e=b(r.node.config,r.run.context,{envAllow:r.workflow.envAllow}),t=String(e.name??"");if(!t)return{error:`action.builtin "${r.node.id}" needs a "name" (e.g. "http.fetch")`};let n=e.input&&typeof e.input=="object"?e.input:{},{runBuiltin:o,getBuiltin:i}=await import("./builtin-W6KNX7RS.js");if(!i(t))return{error:`action.builtin "${r.node.id}": unknown built-in "${t}"`};try{return{output:await o(t,n)}}catch(s){let a=s?.name==="ZodError"?`validation: ${s.message}`:s?.message||String(s);return{error:`action.builtin "${t}" failed: ${a}`}}},On=async r=>{let e=r.node.config,t=r.run.context;return typeof e.path=="string"&&e.path?{output:{value:z(t,e.path)}}:e.template&&typeof e.template=="object"?{output:b(e.template,t,{envAllow:r.workflow.envAllow})}:{output:{}}};function Wn(r){if(r!=null){if(typeof r=="number")return new Date(Date.now()+r*6e4).toISOString();if(typeof r=="object"&&r&&"minutes"in r){let e=Number(r.minutes);if(Number.isFinite(e))return new Date(Date.now()+e*6e4).toISOString()}if(typeof r=="string"){let e=/^P(?:([0-9]+)D)?(?:T(?:([0-9]+)H)?(?:([0-9]+)M)?(?:([0-9]+)S)?)?$/.exec(r);if(e){let t=Number(e[1]??0),n=Number(e[2]??0),o=Number(e[3]??0),i=Number(e[4]??0),s=((t*24+n)*60+o)*6e4+i*1e3;if(s>0)return new Date(Date.now()+s).toISOString()}}}}var jn=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=String(t.workflowId??"");if(!n)return{error:`subProcess "${r.node.id}" missing config.workflowId`};let o=r.run.depth??0,i=r.workflow.maxChildDepth??5;if(o+1>=i)return{error:`max child workflow depth ${i} exceeded at ${r.workflow.id} \u2192 ${n} (parent depth ${o})`};let s=e.inputMap,a={};if(s==="*")a={...r.run.context};else if(s&&typeof s=="object")for(let[d,c]of Object.entries(s))c&&typeof c=="object"&&!Array.isArray(c)?a[d]=b(c,r.run.context,{envAllow:r.workflow.envAllow}):typeof c=="string"&&(a[d]={value:S(c,r.run.context,{envAllow:r.workflow.envAllow})});return{paused:!0,pausedAt:{kind:"subProcess",nodeId:r.node.id,childRunId:"",childWorkflowId:n},spawnChild:{workflowId:n,input:a}}},En=F,Fn=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=String(t.name??"");if(!n)return{error:`signal.emit "${r.node.id}" missing config.name`};let o=t.scope==="global"?"global":"workflow",i=t.payload&&typeof t.payload=="object"?t.payload:{};return{output:{emittedAt:new Date().toISOString(),name:n,scope:o,payload:i},emitSignal:{name:n,scope:o,payload:i}}},Dn=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=String(t.name??"");if(!n)return{error:`signal.wait "${r.node.id}" missing config.name`};let o=t.scope==="global"?"global":"workflow",i=e.match&&typeof e.match=="object"?e.match:{};return{paused:!0,pausedAt:{kind:"signalWait",nodeId:r.node.id,signalName:n,match:i,scope:o}}},Cn=async r=>{let e=r.node.config,t=b(e,r.run.context,{envAllow:r.workflow.envAllow}),n=Wn(t.after??e.after);return n?{paused:!0,pausedAt:{kind:"timerWait",nodeId:r.node.id,fireAt:n}}:{error:`timer.boundary "${r.node.id}" needs config.after (duration or minutes)`}},Mn=async()=>({output:{}}),_n=async r=>{let e=r.node.config,n=(Array.isArray(e.inputs)?e.inputs:[]).map(s=>typeof s=="string"?S(s,r.run.context,{envAllow:r.workflow.envAllow}):s),o=Array.isArray(e.rules)?e.rules:[];for(let s of o){let a=Array.isArray(s.when)?s.when:[];if(a.length!==n.length)continue;let d=!0;for(let c=0;c<a.length;c++)if(!Ln(a[c],n[c])){d=!1;break}if(d)return{output:{...s.output??{},matchedPort:s.to??""},port:s.to}}let i=e.default;return{output:{...i?.output??{},matchedPort:i?.to??""},port:i?.to}};function Ln(r,e){if(r==null||r==="*")return!0;let t=String(r),n=typeof e=="number"?e:String(e??""),o=/^(>=|<=|>|<)\s*(-?\d+(?:\.\d+)?)$/.exec(t);if(o){let i=o[1],s=Number(o[2]),a=typeof n=="number"?n:Number(n);if(Number.isNaN(a))return!1;switch(i){case">":return a>s;case"<":return a<s;case">=":return a>=s;case"<=":return a<=s}}if(t.startsWith("!="))return String(n)!==t.slice(2);if(t.startsWith("/")&&t.endsWith("/")&&t.length>2)try{return new RegExp(t.slice(1,-1)).test(String(n))}catch{return!1}return String(n)===t}var ft={"trigger.channel":F,"trigger.manual":F,"trigger.cron":F,"trigger.hook":F,"trigger.form":En,agent:wn,classify:lt,branch:yn,transform:On,"gateway.parallel":Mn,rule:_n,"action.send":kn,"action.createIssue":bn,"action.setLabel":Sn,"action.readLabel":An,"action.react":Rn,"action.editMessage":$n,"action.logTime":Pn,"action.callHTTP":Tn,"action.run":xn,"action.builtin":Nn,subProcess:jn,"signal.emit":Fn,"signal.wait":Dn,"timer.boundary":Cn,checkpoint:In,end:vn};function ke(r){return ft[r]}function be(r,e){if(typeof e=="string"&&e)return e;let t=r.workflow.nodes.find(i=>i.type.startsWith("trigger."));if(!t)return;let o=r.run.context[t.id]?.accountId;return typeof o=="string"&&o?o:void 0}function ve(r){for(let e=r.run.history.length-1;e>=0;e--){let t=r.run.history[e],n=r.workflow.nodes.find(o=>o.id===t.nodeId);if(n?.type==="agent")return n.config.agentId??void 0}}function gt(r){if(!r)return{};let e=r.match(/\bRESULT:\s*([a-z][a-z0-9_-]*)/i);if(e)return{result:e[1].toLowerCase()};let t=r.match(/\[(APPROVED|REJECTED|CHANGES[-_]REQUESTED|DONE|FAILED|SKIPPED)\]/i);return t?{result:t[1].toLowerCase().replace("_","-")}:{}}function Hn(r){let{result:e}=gt(r);if(!r)return{result:e};let t=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(!t)return{result:e};try{return{result:e,json:JSON.parse(t[1])}}catch{return{result:e}}}var D=class{handlers=new Set;subscribe(e){return this.handlers.add(e),()=>this.handlers.delete(e)}emit(e){for(let t of this.handlers)try{Promise.resolve(t(e)).catch(()=>{})}catch{}}};function G(r,e){if(r.name!==e.name||r.scope==="workflow"&&r.workflowId!==e.workflowId)return!1;for(let[t,n]of Object.entries(r.match??{}))if(!(n===void 0||n===""||n==="*")&&e.payload[t]!==n)return!1;return!0}function Un(r,e,t=Date.now){return{ts:t(),source:"workflow",sourceEventId:`${r.workflowId}:${r.eventId}`,project:r.project,subject:`workflow:${r.workflowId}:entity:${r.entityRef.backend}:${r.entityRef.id}`,intent:`workflow.${r.triggerSource}`,rawJson:e}}function Kn(r){return r.claimed&&r.runId?{agentId:`workflow-run:${r.runId}`,outcome:"dispatched",reason:r.reason??"claimed"}:r.claimed&&!r.runId?{agentId:null,outcome:"halted",reason:r.reason??"claimed-but-no-run"}:{agentId:null,outcome:"halted",reason:r.reason??"not-claimed"}}function Bn(r){return{decidedBy:"workflow-dispatcher",decide:()=>({agentId:r.agentId,outcome:r.outcome==="deduped"?"halted":r.outcome,reason:r.outcome==="deduped"?`legacy-dedup: ${r.reason??""}`.trim():r.reason??null})}}function mt(r,e,t,n,o=Date.now){let i=Un(e,t,o),s=Kn(n),a=Bn(s),d=Fe(r,i,a,o);return De(r,"workflow",d,s,o),d}var zn=4e3,qn=8,Ie=class{store;runs;nodeId;forwarder;channels;agents;log;timers;signals;events;ackTypingTimers=new Map;commitChains=new Map;constructor(e){this.store=e.store,this.runs=e.runs,this.nodeId=e.nodeId,this.forwarder=e.forwarder,this.channels=e.channels,this.agents=e.agents,this.log=e.log??(()=>{}),this.timers=e.timers??new oe({log:t=>this.log(t)}),this.signals=e.signals??new D,this.events=e.events,this.timers.onFire(t=>this.resumeFromTimer(t)),this.signals.subscribe(t=>this.resumeFromSignal(t))}emitRunEvent(e){if(this.events)try{this.events.publish({kind:"run",runId:e.runId,workflowId:e.workflowId,nodeId:e.nodeId,phase:e.phase,status:e.status,note:e.note,homeNode:e.homeNode,rootId:e.rootId})}catch{}}async commit(e,t){let o=(this.commitChains.get(e)??Promise.resolve()).then(()=>t(),()=>t());return this.commitChains.set(e,o.then(()=>{},()=>{})),o}emitSignal(e){let t={name:e.name,scope:e.scope??"global",workflowId:e.workflowId??"",payload:e.payload??{},emittedAt:new Date().toISOString()};if(this.signals.emit(t),this.events)try{this.events.publish({kind:"signal",name:t.name,scope:t.scope,workflowId:t.workflowId||void 0,payload:t.payload})}catch{}return t}async resumeFromSignal(e){let t=this.runs.list({limit:500});for(let n of t){if(n.status!=="paused"||!n.pausedAt||n.pausedAt.kind!=="signalWait")continue;let o={name:n.pausedAt.signalName,scope:n.pausedAt.scope,workflowId:n.workflowId,match:n.pausedAt.match??{}};if(!G(o,e))continue;let i=this.store.list().find(s=>s.id===n.workflowId);i&&(await this.commit(n.id,()=>{let s=this.runs.get(n.id);if(!s||s.status!=="paused"||!s.pausedAt||s.pausedAt.kind!=="signalWait"||!G({name:s.pausedAt.signalName,scope:s.pausedAt.scope,workflowId:s.workflowId,match:s.pausedAt.match??{}},e))return;let a=N(i,s.pausedAt.nodeId),d=a?i.edges.filter(l=>l.from===a.id).map(l=>l.to):[],c={receivedAt:new Date().toISOString(),name:e.name,payload:e.payload};this.runs.recordExecution({runId:s.id,entry:{at:c.receivedAt,nodeId:s.pausedAt.nodeId,inputKeys:[],status:"resumed",output:c,idempotencyKey:x(s.id,s.pausedAt.nodeId,`signal:${e.name}:${e.emittedAt}`)},nextPending:d,status:"running",pausedAt:null,context:{...s.context,[s.pausedAt.nodeId]:c}}),this.log(`[workflow:${i.id}] run ${s.id} resumed from signal "${e.name}"`),this.emitRunEvent({runId:s.id,workflowId:i.id,nodeId:s.pausedAt.nodeId,phase:"resumed",status:"running",note:`signal:${e.name}`,rootId:s.eventRootId})}),this.walk(i,n.id,`signal:${e.name}`).catch(s=>this.log(`[workflow:${i.id}] walk-after-signal failed: ${s.message}`)))}}async resumeFromTimer(e){let t=this.store.list().find(n=>n.id===(this.runs.get(e.runId)?.workflowId??""));t&&(await this.commit(e.runId,()=>{let n=this.runs.get(e.runId);if(!n||n.status!=="paused"||!n.pausedAt||n.pausedAt.kind!=="timerWait"||n.pausedAt.nodeId!==e.nodeId)return;let o=N(t,e.nodeId),i=o?t.edges.filter(d=>d.from===o.id).map(d=>d.to):[],s=new Date().toISOString(),a={firedAt:s,scheduledFor:e.fireAt};this.runs.recordExecution({runId:n.id,entry:{at:s,nodeId:e.nodeId,inputKeys:[],status:"resumed",output:a,idempotencyKey:x(n.id,e.nodeId,`timer:${e.id}`)},nextPending:i,status:"running",pausedAt:null,context:{...n.context,[e.nodeId]:a}}),this.log(`[workflow:${t.id}] run ${n.id} resumed from timer "${e.nodeId}" (fired ${s})`),this.emitRunEvent({runId:n.id,workflowId:t.id,nodeId:e.nodeId,phase:"resumed",status:"running",note:`timer:${e.id}`,rootId:n.eventRootId})}),this.walk(t,e.runId,`timer:${e.id}`).catch(n=>this.log(`[workflow:${t.id}] walk-after-timer failed: ${n.message}`)))}async dispatchWorkflow(e){let t=this.store.list().find(s=>s.id===e.workflowId);if(!t)return this.log(`[workflows] dispatchWorkflow: workflow "${e.workflowId}" not found`),{claimed:!1,run:null};let o=t.nodes.find(s=>s.type.startsWith("trigger."))?.config??{},i={source:e.trigger?.source??o.source??"hook",project:e.trigger?.project,repo:e.trigger?.repo,chat:e.trigger?.chat,labels:e.trigger?.labels};return this.dispatchOne(t,e.entityRef,e.event,i)}startChannelAck(e,t){let n=String(t.channel??""),o=String(t.chatId??"");if(!n||!o)return;let i=this.channels[n];if(!i)return;let s=typeof t.accountId=="string"?t.accountId:void 0,a=t.event,d=typeof a?.id=="string"?a.id:a?.id!=null?String(a.id):void 0;if(d&&i.react)try{Promise.resolve(i.react(o,d,"\u{1F440}",s)).catch(()=>{})}catch{}if(this.ackTypingTimers.has(e)||!i.sendTyping)return;let c=()=>{try{Promise.resolve(i.sendTyping(o,s)).catch(()=>{})}catch{}};c();let l=setInterval(c,zn);this.ackTypingTimers.set(e,l)}stopChannelAck(e){let t=this.ackTypingTimers.get(e);t&&(clearInterval(t),this.ackTypingTimers.delete(e))}async dispatch(e){let t=this.matchByTrigger(e.trigger,e.fromRemote),o=t.some(a=>a.fanOut)?t:t.slice(0,1),i=[],s=[];for(let a of o){let d=await this.dispatchOne(a,e.entityRef,e.event,e.trigger);d.claimed&&i.push(a),d.run&&s.push(d.run)}return!e.fromRemote&&this.forwarder?.broadcastTrigger&&Promise.resolve(this.forwarder.broadcastTrigger({trigger:e.trigger,entityRef:e.entityRef,event:e.event})).catch(a=>this.log(`[mesh-broadcast] ${a?.message??a}`)),{claimed:i,runs:s}}matchByTrigger(e,t){let n=this.store.list(),o=[];for(let i of n){if(i.state&&i.state!=="active")continue;if(t){if(!i.mesh?.allowRemote)continue;let c=i.mesh.peers;if(c&&c.length>0&&!c.includes(t.peer))continue}let s=i.nodes.find(c=>c.type.startsWith("trigger."));if(!s)continue;let a=s.config;if(a.source!==e.source||i.project&&e.project&&i.project!==e.project)continue;let d=a.filter;if(d){if(d.project&&d.project!=="*"&&d.project!==e.project||d.repo&&d.repo!=="*"&&d.repo!==e.repo||d.chat&&d.chat!=="*"&&V(e.source,d.chat)!==V(e.source,e.chat))continue;if(d.labels?.length){let c=new Set(e.labels??[]);if(!d.labels.some(p=>c.has(p)))continue}}o.push(i)}return o.sort((i,s)=>s.priority-i.priority||i.id.localeCompare(s.id))}async dispatchOne(e,t,n,o){let i=await this.dispatchOneLegacy(e,t,n,o);if(Ee("workflow")!=="off")try{mt(Oe(),{workflowId:e.id,eventId:n.id,triggerSource:o.source,project:o.project??null,entityRef:t},JSON.stringify({event:n,trigger:o,entityRef:t}),{claimed:i.claimed,runId:i.run?.id??null})}catch(s){this.log(`[ledger] workflow ${e.id} run ${i.run?.id??"?"} record failed: ${s?.message??s}`)}return i}async dispatchOneLegacy(e,t,n,o){let i=this.runs.getActiveByEntity(t),s=i?this.runs.getHomeNodeByEntity(t):null;if(i&&s&&s!==this.nodeId){if(!this.forwarder)return this.log(`[workflow:${e.id}] run ${i} home'd on "${s}" but no forwarder \u2014 dropping`),{claimed:!1,run:null};try{await this.forwarder.forwardTransition(s,{workflowId:e.id,event:n,entityRef:t})}catch(d){this.log(`[workflow:${e.id}] forward to "${s}" failed: ${d.message}`)}return{claimed:!0,run:null}}let a=i?this.runs.get(i):null;if(a)if(a.status==="paused"&&a.pausedAt){if(a.pausedAt.kind!=="checkpoint")return this.log(`[workflow:${e.id}] run ${a.id} paused on ${a.pausedAt.kind} \u2014 channel event bypasses workflow`),{claimed:!1,run:null};if(!Yn(a.pausedAt.resumeMatch,o,n))return this.log(`[workflow:${e.id}] run ${a.id} paused but event doesn't match resumeMatch \u2014 dropping`),{claimed:!1,run:null};let d=N(e,a.pausedAt.nodeId),c=d?e.edges.filter(h=>h.from===d.id).map(h=>h.to):[],l={at:new Date().toISOString(),nodeId:a.pausedAt.nodeId,inputKeys:[],status:"resumed",output:{event:n.payload},idempotencyKey:x(a.id,a.pausedAt.nodeId,`resume:${n.id}`)},p={...a.context,[a.pausedAt.nodeId]:{event:n.payload}},g=a.pausedAt.checkpointName,f=this.runs.recordExecution({runId:a.id,entry:l,nextPending:c,status:"running",pausedAt:null,context:p});f&&(a=f),this.log(`[workflow:${e.id}] run ${a.id} resumed from checkpoint "${g}"`),o.source.endsWith("-message")&&this.startChannelAck(a.id,n.payload)}else return a.status==="running"?(this.log(`[workflow:${e.id}] run ${a.id} already running; dropping concurrent event ${n.id}`),{claimed:!0,run:null}):(this.log(`[workflow:${e.id}] run ${a.id} is ${a.status}; dropping event ${n.id}`),{claimed:!1,run:null});else{let d=q(e);if(!d)return this.log(`[workflow:${e.id}] no trigger node found`),{claimed:!1,run:null};a=this.runs.create({workflowId:e.id,initialPending:d.pending,entityRef:t,initialContext:{[d.triggerId]:n.payload}}),this.log(`[workflow:${e.id}] run ${a.id} created from trigger "${d.triggerId}" for ${t.id}`),this.emitRunEvent({runId:a.id,workflowId:e.id,phase:"created",status:a.status,homeNode:a.homeNode,rootId:a.eventRootId}),o.source.endsWith("-message")&&this.startChannelAck(a.id,n.payload)}return this.walk(e,a.id,n.id),{claimed:!0,run:a}}async walk(e,t,n){let o=this.runs.get(t)?.eventRootId,i=()=>this.walkInner(e,t,n);try{await(o?je({rootId:o},i):i())}finally{this.stopChannelAck(t)}}async walkInner(e,t,n){let o=this.runs.get(t);if(o)for(;o.status==="running"&&o.pending.length>0;){let i=o.pending.slice(0,qn);await Promise.allSettled(i.map(a=>this.executeNodeAndCommit(e,t,a,n)));let s=this.runs.get(t);if(!s||(o=s,o.status!=="running"))return}}async executeNodeAndCommit(e,t,n,o){let i=x(t,n,o),s=await this.commit(t,()=>{let m=this.runs.get(t);if(!m)return{kind:"done"};if(m.status!=="running")return{kind:"done"};let y=N(e,n);if(!y)return this.log(`[workflow:${e.id}] missing node "${n}" \u2014 marking run failed`),this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:n,inputKeys:[],status:"failed",idempotencyKey:i,note:"node definition missing from workflow"},nextPending:m.pending.filter(A=>A!==n),status:"failed"}),{kind:"done"};let w=ke(y.type);return w?m.history.some(A=>A.idempotencyKey===i)?(this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:n,inputKeys:[],status:"skipped",idempotencyKey:i+"_dedup",note:"duplicate execution dropped"},nextPending:m.pending.filter(A=>A!==n)}),{kind:"done"}):{kind:"go",run:m,node:y,handler:w}:(this.log(`[workflow:${e.id}] no handler for node type "${y.type}"`),this.runs.recordExecution({runId:t,entry:{at:new Date().toISOString(),nodeId:n,inputKeys:[],status:"failed",idempotencyKey:i,note:`no handler for node type "${y.type}"`},nextPending:m.pending.filter(A=>A!==n),status:"failed"}),{kind:"done"})});if(s.kind==="done")return;let{run:a,node:d,handler:c}=s,l=e.edges.filter(m=>m.to===n).map(m=>m.from),p;if(d.type!=="agent"){let m=ee();if(m)try{p=Ce(m,{agentId:`workflow:${d.type}`,channel:"workflow",chatId:`${e.id}:${n}`,workflowRunId:t,workflowId:e.id,workflowNodeId:n,messagePreview:`${d.type} ${n}`})}catch{}}let g=d.retry??{maxAttempts:1,backoffMs:1e3},f={error:"retry-loop did not run"},h=0;for(;h<g.maxAttempts;){h++;try{f=await c({workflow:e,run:a,node:d,channels:this.channels,agents:this.agents,forwardChannelSend:this.forwarder?.forwardChannelSend?.bind(this.forwarder),log:this.log})}catch(m){this.log(`[workflow:${e.id}] handler "${d.type}" threw: ${m.message}`),f={error:m.message}}if(!f.error||f.paused)break;if(h<g.maxAttempts){let m=g.backoffMs*Math.pow(2,h-1);this.log(`[workflow:${e.id}] node "${n}" failed (attempt ${h}/${g.maxAttempts}): ${f.error.slice(0,120)} \u2014 retrying in ${m}ms`),await new Promise(y=>setTimeout(y,m))}}if(p){let m=ee();if(m)try{Me(m,p,{status:f.error?"error":"ok",error:f.error??null})}catch{}}await this.commit(t,async()=>{let m=this.runs.get(t);if(!m)return;let y=new Date().toISOString(),w=m.pending.filter(k=>k!==n);if(f.error){let k=m.status==="running"?"failed":void 0;this.runs.recordExecution({runId:t,entry:{at:y,nodeId:n,inputKeys:l,status:"failed",idempotencyKey:i,note:f.error.slice(0,200)},nextPending:w,status:k}),this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:"failed",status:k??m.status,note:f.error.slice(0,200)});return}if(f.paused&&f.pausedAt){let k=f.pausedAt,T=null;if(f.spawnChild&&k.kind==="subProcess"){if(T=await this.spawnChild({parent:m,parentNodeId:n,childWorkflowId:f.spawnChild.workflowId,input:f.spawnChild.input}),!T){this.runs.recordExecution({runId:t,entry:{at:y,nodeId:n,inputKeys:l,status:"failed",idempotencyKey:i,note:`subProcess: child workflow "${f.spawnChild.workflowId}" not found`},nextPending:w,status:"failed"});return}k={...k,childRunId:T.id}}if(this.runs.recordExecution({runId:t,entry:{at:y,nodeId:n,inputKeys:l,status:"paused",idempotencyKey:i},nextPending:w,status:"paused",pausedAt:k}),this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:"paused",status:"paused",note:k.kind}),T&&this.kickChildWalk(T),k.kind==="timerWait")try{this.timers.schedule({runId:t,workflowId:e.id,nodeId:k.nodeId,fireAt:k.fireAt,cancelKey:`${t}:${k.nodeId}`})}catch(Ae){this.log(`[workflow:${e.id}] timer schedule failed: ${Ae.message}`)}return}let A=f.output??{},vt={...m.context,[n]:A},{nextPending:It}=he({workflow:e,fromNodeId:n,selectedPort:f.port}),Q=[],C={...m.joinCounters??{}};for(let k of It){let T=N(e,k);if(!(T?.type==="gateway.parallel"&&String(T.config?.mode??"fanOut")==="join")){Q.push(k);continue}let _=C[k]??[];_.includes(n)||_.push(n),C[k]=_;let Rt=e.edges.filter($t=>$t.to===k).length;_.length>=Rt&&(Q.push(k),delete C[k])}let St=[...w,...Q],M=d.type==="end",At=m.status==="running"?M?String(d.config.status??"completed"):"running":void 0,O=this.runs.recordExecution({runId:t,entry:{at:y,nodeId:n,inputKeys:l,status:"ok",output:A,idempotencyKey:i},nextPending:M?[]:St,status:At,context:vt,joinCounters:C});this.emitRunEvent({runId:t,workflowId:e.id,nodeId:n,phase:M?"completed":"ok",status:O?.status??m.status}),f.emitSignal&&this.emitSignal({name:f.emitSignal.name,scope:f.emitSignal.scope,workflowId:e.id,payload:f.emitSignal.payload}),M&&O&&O.parentRunId&&O.parentNodeId&&this.resumeParent({parentRunId:O.parentRunId,parentNodeId:O.parentNodeId,childRun:O}).catch(k=>this.log(`[workflow:${e.id}] resumeParent failed: ${k.message}`))})}async spawnChild(e){let t=this.store.list().find(a=>a.id===e.childWorkflowId);if(!t)return null;let n=q(t);if(!n)return this.log(`[workflow:${t.id}] no trigger node \u2014 cannot spawn as child`),null;let o={...e.input};o[n.triggerId]={...o[n.triggerId]??{},parentRunId:e.parent.id,parentNodeId:e.parentNodeId};let i={backend:"agentx-internal",id:`subprocess:${e.parent.id}:${e.parentNodeId}`},s=this.runs.create({workflowId:t.id,initialPending:n.pending,entityRef:i,initialContext:o,parentRunId:e.parent.id,parentNodeId:e.parentNodeId,rootRunId:e.parent.rootRunId??e.parent.id,depth:(e.parent.depth??0)+1});return this.log(`[workflow:${t.id}] child run ${s.id} spawned from ${e.parent.id}/${e.parentNodeId} (depth ${s.depth})`),s}kickChildWalk(e){let t=this.store.list().find(n=>n.id===e.workflowId);t&&this.walk(t,e.id,`spawn:${e.parentRunId}:${e.parentNodeId}`).catch(n=>this.log(`[workflow:${t.id}] child walk failed: ${n.message}`))}async resumeParent(e){let t=this.runs.get(e.parentRunId);if(!t)return;let n=this.store.list().find(o=>o.id===t.workflowId);n&&(await this.commit(e.parentRunId,()=>{let o=this.runs.get(e.parentRunId);if(!o||o.status!=="paused"||!o.pausedAt||o.pausedAt.kind!=="subProcess"||o.pausedAt.nodeId!==e.parentNodeId||o.pausedAt.childRunId!==e.childRun.id)return;let i=N(n,e.parentNodeId),s=i?n.edges.filter(d=>d.from===i.id).map(d=>d.to):[],a={childRunId:e.childRun.id,status:e.childRun.status,output:Jn(e.childRun)};this.runs.recordExecution({runId:o.id,entry:{at:new Date().toISOString(),nodeId:e.parentNodeId,inputKeys:[],status:"resumed",output:a,idempotencyKey:x(o.id,e.parentNodeId,`child:${e.childRun.id}`)},nextPending:s,status:"running",pausedAt:null,context:{...o.context,[e.parentNodeId]:a}}),this.log(`[workflow:${n.id}] parent run ${o.id} resumed from subProcess child ${e.childRun.id}`),this.emitRunEvent({runId:o.id,workflowId:n.id,nodeId:e.parentNodeId,phase:"resumed",status:"running",note:`child:${e.childRun.id}`,rootId:o.eventRootId})}),this.walk(n,e.parentRunId,`child:${e.childRun.id}`))}};function Jn(r){for(let e=r.history.length-1;e>=0;e--){let t=r.history[e];if(t.status==="ok"&&t.output&&Object.keys(t.output).length>0)return t.output}return{}}function Yn(r,e,t){let n=i=>{let s=r[i];if(s===void 0||s===""||s==="*")return!0;if(Array.isArray(s)){let a=new Set(e.labels??[]);return s.some(d=>a.has(String(d)))}return i==="chat"?V(e.source,String(s))===V(e.source,e.chat):e[i]===s};if(!n("source")||!n("project")||!n("repo")||!n("chat"))return!1;let o=r.eventIdLike;return!(typeof o=="string"&&o&&!t.id.includes(o))}function V(r,e){return e==null?"":r==="whatsapp-message"?e.replace(/@s\.whatsapp\.net$|@g\.us$/i,"").replace(/[\s+()]/g,""):e}function Gn(r){return{"pre:channel-message":async e=>{let t=e.msg;if(!t)return{};let n=Vn(t.channel);if(!n)return{};let o=t.group?.id??t.sender.id,i={backend:t.channel,id:`${t.channel}:${o}`},{claimed:s}=await r.dispatch({trigger:{source:n,chat:o},entityRef:i,event:{id:`${t.channel}:${t.accountId}:${t.id}`,payload:Zn(t)}});return s.length===0?{}:s.every(d=>d.nodes.find(l=>l.type.startsWith("trigger."))?.config?.passthrough===!0)?{}:{blocked:!0,message:`handled by workflow${s.length>1?"s":""}: ${s.map(d=>d.id).join(", ")}`}},"on:gitlab-issue":async e=>{let t=e.project,n=e.iid,o=e.issueEvent;if(!t||n===void 0)return{};let i=Array.isArray(o?.object_attributes?.labels)?o.object_attributes.labels.map(d=>typeof d=="string"?d:d?.title).filter(Boolean):o?.labels?.map(d=>d?.title)??[],s=o?.assignees??o?.object_attributes?.assignee_ids??[],a={backend:"gitlab",id:`${t}#${n}`};return await r.dispatch({trigger:{source:"gitlab-issue",project:t,labels:i},entityRef:a,event:{id:`gitlab-issue:${t}:${n}:${o?.object_attributes?.updated_at||o?.object_attributes?.action||"evt"}`,payload:{issue:{iid:n,title:o?.object_attributes?.title,description:o?.object_attributes?.description,url:o?.object_attributes?.url,action:o?.object_attributes?.action,labels:i,assignees:s},project:t,channel:"gitlab",chatId:`${t}:issue:${n}`}}}),{}},"on:gitlab-mr":async e=>{let t=e.project,n=e.iid,o=e.mrEvent;if(!t||n===void 0)return{};let i=Array.isArray(e.labels)?e.labels:Array.isArray(o?.object_attributes?.labels)?o.object_attributes.labels.map(c=>typeof c=="string"?c:c?.title).filter(Boolean):[],s=o?.assignees??o?.object_attributes?.assignee_ids??[],a=o?.reviewers??[],d={backend:"gitlab",id:`${t}!${n}`};return await r.dispatch({trigger:{source:"gitlab-mr",project:t,labels:i},entityRef:d,event:{id:`gitlab-mr:${t}:${n}:${o?.object_attributes?.updated_at||o?.object_attributes?.action||"evt"}`,payload:{mr:{iid:n,title:e.title,description:e.description,url:e.url,action:e.action,state:e.state,source_branch:e.source_branch,target_branch:e.target_branch,labels:i,assignees:s,reviewers:a},project:t,channel:"gitlab",chatId:`${t}:merge_request:${n}`,iid:n,title:e.title,description:e.description,url:e.url,action:e.action,state:e.state,source_branch:e.source_branch,target_branch:e.target_branch,labels:i}}}),{}},"on:gitlab-note":async e=>{let t=e.project,n=e.noteId,o=e.noteableType,i=e.noteableIid,s=e.text,a=e.authorUsername,d=e.mentions??[];if(!t||!n||!o||!i)return{};let c=o==="merge_request"?{backend:"gitlab",id:`${t}!${i}`}:{backend:"gitlab",id:`${t}#${i}`};return await r.dispatch({trigger:{source:"gitlab-note",project:t},entityRef:c,event:{id:`gitlab-note:${t}:${o}:${i}:${n}`,payload:{note:{id:n,text:s,author:a,mentions:d,noteableType:o,noteableIid:i,noteableTitle:e.noteableTitle},project:t,channel:"gitlab",chatId:`${t}:${o}:${i}`,noteId:n,noteableType:o,noteableIid:i,text:s,author:a,mentions:d}}}),{}},"on:gitlab-pipeline":async e=>{let t=e.project,n=e.pipelineId,o=e.status,i=e.ref;if(!t||!o)return{};let a=e.raw?.merge_request?.iid;if(!a)return{};let d={backend:"gitlab",id:`${t}!${a}`};return await r.dispatch({trigger:{source:"gitlab-pipeline",project:t},entityRef:d,event:{id:`gitlab-pipeline:${t}:${n}:${o}`,payload:{pipeline:{id:n,status:o,ref:i},project:t,channel:"gitlab",chatId:`${t}:merge_request:${a}`}}}),{}}}}function Vn(r){switch(r){case"telegram":return"telegram-message";case"whatsapp":return"whatsapp-message";case"discord":return"discord-message";case"slack":return"slack-message";default:return null}}function Zn(r){let e=r.group?.id??r.sender.id;return{channel:r.channel,chatId:e,accountId:r.accountId,text:r.text,fromJid:r.sender.id,sender:{id:r.sender.id,name:r.sender.name,username:r.sender.username},contact:r.channelMeta?.facts?{facts:r.channelMeta.facts}:void 0,group:r.group?{id:r.group.id,name:r.group.name}:void 0,channelMeta:r.channelMeta,replyTo:r.replyTo,replyToText:r.replyToText,media:r.media,event:{id:r.id,timestamp:r.timestamp?.toISOString?.()??new Date().toISOString()}}}var Z=r=>r.trim().toLowerCase().replace(/^@/,"");function Xn(r){let e=typeof r.author=="string"?r.author:typeof r.authorUsername=="string"?r.authorUsername:void 0;if(e)return Z(e);let n=r.payload?.sender?.login;return typeof n=="string"&&n?Z(n):void 0}function Qn(r,e){let t=typeof e.project=="string"?e.project:"";if(r==="on:gitlab-issue"||r==="on:gitlab-mr")return!t||e.iid==null?void 0:`gitlab:${t}${r==="on:gitlab-issue"?"#":"!"}${String(e.iid)}`;if(r==="on:gitlab-note"){let n=e.noteableIid!=null?String(e.noteableIid):"",o=typeof e.noteableType=="string"?e.noteableType:"";return!t||!n||!o?void 0:`gitlab:${t}${o==="issue"?"#":"!"}${n}`}if(r==="on:github-issue"||r==="on:github-pr"){let n=e.payload??{},o=typeof e.repo=="string"?e.repo:n.repository?.full_name,i=e.number??n.issue?.number??n.pull_request?.number;return typeof o!="string"||!o||i==null?void 0:`github:${o}#${String(i)}`}}function er(r){let e=new Set;for(let t of r.nodes){let n=t.type==="agent"?t.config.agentId:void 0;typeof n=="string"&&n&&e.add(n)}return[...e]}var X=class{constructor(e=2e3){this.maxKeys=e}fires=new Map;tryFire(e,t,n,o=Date.now()){let i=(this.fires.get(e)??[]).filter(s=>o-s<n);if(i.length>=t)return this.fires.set(e,i),!1;for(i.push(o),this.fires.delete(e),this.fires.set(e,i);this.fires.size>this.maxKeys;){let s=this.fires.keys().next().value;if(s===void 0)break;this.fires.delete(s)}return!0}get size(){return this.fires.size}};function Se(r,e,t){let n=r.logged??(r.logged=new Set);n.has(e)||(n.add(e),r.log(t))}function ht(r,e,t,n,o){let i=Xn(t);if(i&&Array.isArray(n?.ignoreAuthors)&&n.ignoreAuthors.length>0&&n.ignoreAuthors.map(Z).includes(i))return{skip:!0,reason:"ignored-author",detail:`author @${i} is in filter.ignoreAuthors`};if(n?.skipSelfAuthored===!0){let a=er(r),d=typeof t.authorAgent=="string"?t.authorAgent:void 0;if(d&&a.includes(d))return{skip:!0,reason:"self-authored",detail:`author @${i??"?"} is agent "${d}" which this workflow runs`};if(i){let c=new Set(a.flatMap(l=>(o.forgeUsernames?.(l)??[]).map(Z)));if(c.has(i))return{skip:!0,reason:"self-authored",detail:`author @${i} is this workflow's own bot identity`};a.length===0?Se(o,`noagents:${r.id}`,`[workflows] ${r.id} has no agent node \u2014 self-authored skip can't resolve a bot identity; only filter.ignoreAuthors applies`):c.size===0&&!("authorAgent"in t)&&Se(o,`noident:${r.id}:${e}`,`[workflows] ${r.id} no forge username known for agent(s) ${a.join(", ")} on ${e} \u2014 self-authored skip inactive; only filter.ignoreAuthors applies`)}}let s=n?.maxFiresPerTarget;if(s&&typeof s.count=="number"&&s.count>0){let a=Qn(e,t);if(a){let d=typeof s.windowMinutes=="number"&&s.windowMinutes>0?s.windowMinutes:60,c=o.now?.()??Date.now();if(!o.fireWindow.tryFire(`${r.id}|${a}`,s.count,d*6e4,c))return{skip:!0,reason:"chain-limit",detail:`${a} already fired ${s.count}x within ${d}m (filter.maxFiresPerTarget)`}}else Se(o,`notarget:${r.id}:${e}`,`[workflows] ${r.id} filter.maxFiresPerTarget has no target key for ${e} \u2014 limit not applied`)}return{skip:!1}}function tr(r){let e=r.store.list(),t={fireWindow:new X,log:r.log,forgeUsernames:r.forgeUsernames,logged:new Set},n=0,o=0;for(let i of e){if(i.state&&i.state!=="active"){r.log(`[workflows] ${i.id} state=${i.state} \u2014 skipping trigger registration`);continue}let s=i.nodes.find(a=>a.type.startsWith("trigger."));if(s){if(s.type==="trigger.cron"){let a=s.config;if(!a.spec){r.log(`[workflows] ${i.id} trigger.cron missing config.spec \u2014 skipping`);continue}rr({workflowId:i.id,triggerNodeId:s.id,spec:a.spec,timezone:a.timezone??"UTC"},r.dispatcher,r.log),n++}else if(s.type==="trigger.hook"){let a=s.config;if(!a.event||!a.event.startsWith("on:")){r.log(`[workflows] ${i.id} trigger.hook config.event must start with "on:" \u2014 skipping`);continue}r.hooks.registerHandler(a.event,`workflows:${i.id}`,async d=>{try{let c=typeof d.project=="string"?d.project:void 0;if(i.project&&c&&i.project!==c)return{};if(a.filter){if(Array.isArray(a.filter.topic)&&a.filter.topic.length>0){let h=typeof d.topic=="string"?d.topic.toLowerCase():void 0;if(!h||!a.filter.topic.map(m=>m.toLowerCase()).includes(h))return{}}if(Array.isArray(a.filter.action)&&a.filter.action.length>0){let h=typeof d.action=="string"?d.action:void 0;if(!h||!a.filter.action.includes(h))return{}}if(Array.isArray(a.filter.mentions)&&a.filter.mentions.length>0){let h=Array.isArray(d.mentions)?d.mentions.map(w=>w.toLowerCase().replace(/^@/,"")):[];if(!a.filter.mentions.map(w=>w.toLowerCase().replace(/^@/,"")).some(w=>h.includes(w)))return{}}if(Array.isArray(a.filter.noteableType)&&a.filter.noteableType.length>0){let h=typeof d.noteableType=="string"?d.noteableType.toLowerCase():void 0,m=a.filter.noteableType.map(y=>y.toLowerCase());if(!h||!m.includes(h))return{}}if(Array.isArray(a.filter.assigneesAdded)&&a.filter.assigneesAdded.length>0){let h=Array.isArray(d.assigneesAdded)?d.assigneesAdded.map(w=>w.toLowerCase().replace(/^@/,"")):[];if(!a.filter.assigneesAdded.map(w=>w.toLowerCase().replace(/^@/,"")).some(w=>h.includes(w)))return{}}if(Array.isArray(a.filter.reviewersAdded)&&a.filter.reviewersAdded.length>0){let h=Array.isArray(d.reviewersAdded)?d.reviewersAdded.map(w=>w.toLowerCase().replace(/^@/,"")):[];if(!a.filter.reviewersAdded.map(w=>w.toLowerCase().replace(/^@/,"")).some(w=>h.includes(w)))return{}}if(Array.isArray(a.filter.labelsAdded)&&a.filter.labelsAdded.length>0){let h=Array.isArray(d.labelsAdded)?d.labelsAdded.map(w=>w.toLowerCase()):[];if(!a.filter.labelsAdded.map(w=>w.toLowerCase()).some(w=>h.includes(w)))return{}}}let l=ht(i,a.event,d,a.filter,t);if(l.skip){if(r.log(`[workflows] ${i.id} skipping ${a.event} (${l.reason}): ${l.detail}`),a.passthrough)return{};let h=d.__workflowClaimed;return{modified:{__workflowClaimed:[...Array.isArray(h)?h:[],i.id]}}}let p=nr(i.id,a.event,d);if(await r.dispatcher.dispatchWorkflow({workflowId:i.id,entityRef:{backend:"hook",id:p},event:{id:`hook:${a.event}:${Date.now().toString(36)}`,payload:{hookEvent:a.event,...d}}}),a.passthrough)return{};let g=d.__workflowClaimed;return{modified:{__workflowClaimed:[...Array.isArray(g)?g:[],i.id]}}}catch(c){return r.log(`[workflows] ${i.id} hook dispatch failed: ${c.message}`),{}}},60),o++}}}return{cronTimers:n,hookSubscribers:o}}function nr(r,e,t){let n=typeof t.project=="string"?t.project:"",o=t.iid!=null?String(t.iid):"";if(e==="on:gitlab-issue"&&n&&o)return`${r}:${e}:${n}#${o}`;if(e==="on:gitlab-mr"&&n&&o)return`${r}:${e}:${n}!${o}`;if(e==="on:gitlab-pipeline"&&n){let i=t.pipelineId!=null?String(t.pipelineId):"";if(i)return`${r}:${e}:${n}@pipeline:${i}`}return`${r}:${e}:${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function rr(r,e,t){let n=()=>{let o;try{o=_e(r.spec,new Date,r.timezone)}catch(s){t(`[workflows] ${r.workflowId} cron spec invalid: ${s.message}`);return}let i=Math.max(1e3,o.getTime()-Date.now());setTimeout(()=>{(async()=>{let s=`cron:${r.workflowId}:${o.toISOString()}`;try{await e.dispatchWorkflow({workflowId:r.workflowId,trigger:{source:"cron"},entityRef:{backend:"cron",id:`${r.workflowId}@${o.toISOString()}`},event:{id:s,payload:{now:o.toISOString(),spec:r.spec,workflowId:r.workflowId}}})}catch(a){t(`[workflows] ${r.workflowId} cron dispatch failed: ${a.message}`)}finally{n()}})()},i)};n()}function wt(r){return r.nodes.find(n=>n.type.startsWith("trigger."))?.config?.inputSchema??null}function yt(r,e){if(!r||!e?.properties)return{};let t=r.match(/^([^:]+\/[^:]+):([^:]+):(.+)$/);if(!t)return{};let[,n,o,i]=t,s={};if(e.properties.project&&(s.project=n),o==="push"){let a=i.match(/^refs\/heads\/(.+)$/);a&&e.properties.ref&&(s.ref=a[1])}else{let a=Number(i);Number.isFinite(a)&&(e.properties.id&&(s.id=a),e.properties.iid&&(s.iid=a),e.properties.mrId&&(s.mrId=a),e.properties.issueId&&(s.issueId=a),e.properties.prId&&(s.prId=a))}return s}function kt(r,e){if(!r?.properties)return e;let t={...e};for(let[n,o]of Object.entries(r.properties))t[n]===void 0&&o&&"default"in o&&(t[n]=o.default);return t}function bt(r,e){return!r?.required||!Array.isArray(r.required)?[]:r.required.filter(t=>{let n=e[t];return n===void 0||n===""||n===null})}function ir(r,e){let t=wt(r);if(!t?.properties){let d={};for(let[c,l]of Object.entries(e))l!==void 0&&(d[c]=l);return{inputs:d,missing:[],filledFrom:{passthrough:Object.keys(d),chatId:[],defaults:[]}}}let n={};for(let d of["message","agentId","channel","chatId","senderId","senderUsername"])t.properties[d]&&e[d]!==void 0&&(n[d]=e[d]);let o=yt(e.chatId,t),i={...n,...o},s={...i};i=kt(t,i);let a=Object.keys(i).filter(d=>s[d]===void 0&&i[d]!==void 0);return{inputs:i,missing:bt(t,i),filledFrom:{passthrough:Object.keys(n),chatId:Object.keys(o),defaults:a}}}export{Ue as a,ze as b,$ as c,ae as d,v as e,L as f,Vt as g,le as h,fe as i,me as j,Ie as k,Gn as l,tr as m,gn as n,ir as o};
19
+ //# sourceMappingURL=chunk-U67EG5IF.js.map