@poncho-ai/cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/.turbo/turbo-build.log +19 -0
  2. package/.turbo/turbo-test.log +389 -0
  3. package/CHANGELOG.md +17 -0
  4. package/LICENSE +21 -0
  5. package/dist/chunk-22OMLQUR.js +1249 -0
  6. package/dist/chunk-24JFN5RM.js +1887 -0
  7. package/dist/chunk-24TAT3US.js +2137 -0
  8. package/dist/chunk-26YBLT7G.js +997 -0
  9. package/dist/chunk-2EJIC6UW.js +1893 -0
  10. package/dist/chunk-2JNCF37R.js +1156 -0
  11. package/dist/chunk-2LVMUHJX.js +1874 -0
  12. package/dist/chunk-2OVSD65B.js +1269 -0
  13. package/dist/chunk-2RQ45LI6.js +1251 -0
  14. package/dist/chunk-2SMIRDLI.js +1854 -0
  15. package/dist/chunk-2UXPHBFI.js +1862 -0
  16. package/dist/chunk-2VFM7SSZ.js +1135 -0
  17. package/dist/chunk-2ZAUADNG.js +1456 -0
  18. package/dist/chunk-2ZNUT5WA.js +1862 -0
  19. package/dist/chunk-33ZQ7WTP.js +1834 -0
  20. package/dist/chunk-34ARQX3O.js +1156 -0
  21. package/dist/chunk-3BEWSRFW.js +1893 -0
  22. package/dist/chunk-3DVE5AG6.js +1862 -0
  23. package/dist/chunk-3KE6MHO6.js +1608 -0
  24. package/dist/chunk-3MOLPB7Z.js +997 -0
  25. package/dist/chunk-3OZZOYAZ.js +1884 -0
  26. package/dist/chunk-3VJYNZEF.js +2181 -0
  27. package/dist/chunk-3W27LOUH.js +997 -0
  28. package/dist/chunk-3WMAW74D.js +1163 -0
  29. package/dist/chunk-3Z4AHBPF.js +1569 -0
  30. package/dist/chunk-43NK6MB4.js +1977 -0
  31. package/dist/chunk-4E5M2IGA.js +1300 -0
  32. package/dist/chunk-4FVI4LVI.js +1862 -0
  33. package/dist/chunk-4GNQQJUP.js +1156 -0
  34. package/dist/chunk-4PGZFTVC.js +1234 -0
  35. package/dist/chunk-4QE2HDNC.js +1355 -0
  36. package/dist/chunk-4S2EL4ED.js +1135 -0
  37. package/dist/chunk-536SSOJ3.js +1797 -0
  38. package/dist/chunk-5CNEGIC5.js +997 -0
  39. package/dist/chunk-5CWN43YL.js +1147 -0
  40. package/dist/chunk-5HZCYTUZ.js +997 -0
  41. package/dist/chunk-5ICNG6RX.js +1885 -0
  42. package/dist/chunk-5OUIRXMN.js +997 -0
  43. package/dist/chunk-5T34JOWH.js +1460 -0
  44. package/dist/chunk-5XBAIQX3.js +1862 -0
  45. package/dist/chunk-65AIX3CS.js +1441 -0
  46. package/dist/chunk-67NBW4NG.js +1355 -0
  47. package/dist/chunk-6AFIL35M.js +1414 -0
  48. package/dist/chunk-6B3XMBKA.js +1716 -0
  49. package/dist/chunk-6CEJO4OM.js +1242 -0
  50. package/dist/chunk-6DQZUP3B.js +1460 -0
  51. package/dist/chunk-6ET624OE.js +1441 -0
  52. package/dist/chunk-6I7WFMAU.js +1862 -0
  53. package/dist/chunk-6MOKAYCL.js +1449 -0
  54. package/dist/chunk-6RFUALWB.js +1845 -0
  55. package/dist/chunk-73E57JUS.js +1231 -0
  56. package/dist/chunk-73SU7GT4.js +816 -0
  57. package/dist/chunk-74IRETUF.js +997 -0
  58. package/dist/chunk-77BYFMUN.js +1924 -0
  59. package/dist/chunk-7DAC2XE5.js +1460 -0
  60. package/dist/chunk-7GBQ4YSB.js +1024 -0
  61. package/dist/chunk-7TOJGUQ5.js +1803 -0
  62. package/dist/chunk-7W7KPLEG.js +1163 -0
  63. package/dist/chunk-7Y7ZXEN2.js +817 -0
  64. package/dist/chunk-A5WKH7H2.js +852 -0
  65. package/dist/chunk-A775UYQB.js +1886 -0
  66. package/dist/chunk-AC4OGTSK.js +1313 -0
  67. package/dist/chunk-ACCRUQ6J.js +1271 -0
  68. package/dist/chunk-AEAZZFTT.js +1886 -0
  69. package/dist/chunk-AIAC5Z55.js +1147 -0
  70. package/dist/chunk-AN34PI2R.js +1238 -0
  71. package/dist/chunk-APIA7MHJ.js +1355 -0
  72. package/dist/chunk-AQGIIT7R.js +1347 -0
  73. package/dist/chunk-ATXKV2NH.js +2111 -0
  74. package/dist/chunk-AVBKQZYR.js +1010 -0
  75. package/dist/chunk-AWIXDCZF.js +1329 -0
  76. package/dist/chunk-AXFHQBKT.js +2128 -0
  77. package/dist/chunk-AYDSTU4P.js +1156 -0
  78. package/dist/chunk-AZ35PK7E.js +1271 -0
  79. package/dist/chunk-BE6HB4IO.js +2155 -0
  80. package/dist/chunk-BIX2FI3S.js +1625 -0
  81. package/dist/chunk-BPPM5YPG.js +997 -0
  82. package/dist/chunk-BRCIVYKE.js +1420 -0
  83. package/dist/chunk-BRK2KKTF.js +1236 -0
  84. package/dist/chunk-BU7R2TVT.js +1862 -0
  85. package/dist/chunk-BXJQ4G5F.js +1901 -0
  86. package/dist/chunk-C3KTCROR.js +1128 -0
  87. package/dist/chunk-C42IGDJW.js +1032 -0
  88. package/dist/chunk-CBRPO2FE.js +1886 -0
  89. package/dist/chunk-CDNITKC6.js +1163 -0
  90. package/dist/chunk-CDVWUDFM.js +1389 -0
  91. package/dist/chunk-CH2IE453.js +1147 -0
  92. package/dist/chunk-CIHC46FS.js +1010 -0
  93. package/dist/chunk-CIYO754K.js +1687 -0
  94. package/dist/chunk-CJFNJ7U3.js +918 -0
  95. package/dist/chunk-CJN66CJY.js +1024 -0
  96. package/dist/chunk-CLJFTDJQ.js +1667 -0
  97. package/dist/chunk-CLNCOQNI.js +997 -0
  98. package/dist/chunk-CN4AUQL4.js +1460 -0
  99. package/dist/chunk-CQYGUBY6.js +1854 -0
  100. package/dist/chunk-CRJUMKVB.js +1862 -0
  101. package/dist/chunk-CZHUYI2J.js +997 -0
  102. package/dist/chunk-DIBSIWSR.js +1256 -0
  103. package/dist/chunk-DJGC3R4O.js +1836 -0
  104. package/dist/chunk-DJR2PEAQ.js +1884 -0
  105. package/dist/chunk-DKE7NWBK.js +1862 -0
  106. package/dist/chunk-DXYDN2OS.js +1147 -0
  107. package/dist/chunk-DZ3FEUJ7.js +1147 -0
  108. package/dist/chunk-EC47SFY3.js +1113 -0
  109. package/dist/chunk-ECAALEAK.js +1239 -0
  110. package/dist/chunk-ECEYIAQZ.js +997 -0
  111. package/dist/chunk-EKX7AV7O.js +1024 -0
  112. package/dist/chunk-EN6CTYUN.js +634 -0
  113. package/dist/chunk-EXCH47WX.js +1460 -0
  114. package/dist/chunk-EY2JOCTM.js +1862 -0
  115. package/dist/chunk-EYHB3LTH.js +1818 -0
  116. package/dist/chunk-F2AC5PKU.js +1446 -0
  117. package/dist/chunk-F5RCUJ62.js +1156 -0
  118. package/dist/chunk-F6OM65VA.js +1460 -0
  119. package/dist/chunk-FAEJ5CQU.js +997 -0
  120. package/dist/chunk-FB7X4KBF.js +1460 -0
  121. package/dist/chunk-FBSEEW3H.js +1862 -0
  122. package/dist/chunk-FBYY3TE5.js +1862 -0
  123. package/dist/chunk-FEA3GBGG.js +997 -0
  124. package/dist/chunk-FHPRGTOJ.js +1131 -0
  125. package/dist/chunk-FLAY6YWY.js +1389 -0
  126. package/dist/chunk-FNXIVJ3B.js +997 -0
  127. package/dist/chunk-FWRVG7RM.js +2160 -0
  128. package/dist/chunk-G47UW452.js +916 -0
  129. package/dist/chunk-G6V5O5AV.js +997 -0
  130. package/dist/chunk-GACQBIOO.js +1613 -0
  131. package/dist/chunk-GBFHLBWT.js +881 -0
  132. package/dist/chunk-GLJLTQMZ.js +997 -0
  133. package/dist/chunk-GN7DDBAT.js +1872 -0
  134. package/dist/chunk-GPTI42MM.js +1355 -0
  135. package/dist/chunk-GPXGCPVY.js +1834 -0
  136. package/dist/chunk-GRASQSCU.js +1886 -0
  137. package/dist/chunk-GU2WWG5C.js +1314 -0
  138. package/dist/chunk-GW3SAYT3.js +1679 -0
  139. package/dist/chunk-GZ4F2VI5.js +1447 -0
  140. package/dist/chunk-GZYXND4U.js +1322 -0
  141. package/dist/chunk-H27BRPVI.js +1862 -0
  142. package/dist/chunk-H4JRTOW7.js +1862 -0
  143. package/dist/chunk-HDS72SRU.js +1138 -0
  144. package/dist/chunk-HEUGSUL5.js +757 -0
  145. package/dist/chunk-HMZN5GPS.js +1024 -0
  146. package/dist/chunk-HN5SVGQO.js +1163 -0
  147. package/dist/chunk-HN6VQ5FI.js +242 -0
  148. package/dist/chunk-HNTQ66EL.js +2054 -0
  149. package/dist/chunk-HSDL3YK5.js +1134 -0
  150. package/dist/chunk-HVMIMERW.js +997 -0
  151. package/dist/chunk-HVWCQS2B.js +1834 -0
  152. package/dist/chunk-HVYMSOXQ.js +2156 -0
  153. package/dist/chunk-HYQITTK3.js +1862 -0
  154. package/dist/chunk-I4CCYPAI.js +1239 -0
  155. package/dist/chunk-IDG3X4UL.js +1229 -0
  156. package/dist/chunk-IDVRTQJ3.js +1514 -0
  157. package/dist/chunk-IEER23NN.js +1862 -0
  158. package/dist/chunk-IKLRYA4W.js +785 -0
  159. package/dist/chunk-IQBUSFBY.js +1270 -0
  160. package/dist/chunk-IUXQDZIR.js +1862 -0
  161. package/dist/chunk-IV74RJFV.js +1862 -0
  162. package/dist/chunk-IVEMIXXO.js +1854 -0
  163. package/dist/chunk-J4PNCGSP.js +1460 -0
  164. package/dist/chunk-J7ULLJUI.js +1862 -0
  165. package/dist/chunk-J7WHTBOM.js +983 -0
  166. package/dist/chunk-JBN6D7EG.js +1757 -0
  167. package/dist/chunk-JDKSD54C.js +1366 -0
  168. package/dist/chunk-JGWTOS7A.js +1507 -0
  169. package/dist/chunk-JHJ6FMSI.js +1804 -0
  170. package/dist/chunk-JJSHCP32.js +1282 -0
  171. package/dist/chunk-JLMAMC3V.js +1625 -0
  172. package/dist/chunk-JMTF7VV5.js +1919 -0
  173. package/dist/chunk-JO56GKTV.js +1133 -0
  174. package/dist/chunk-JRN3P6CS.js +1441 -0
  175. package/dist/chunk-JTKPRRSM.js +1024 -0
  176. package/dist/chunk-JVTFCTGO.js +1868 -0
  177. package/dist/chunk-JXH452LK.js +956 -0
  178. package/dist/chunk-K4SW5SP4.js +1147 -0
  179. package/dist/chunk-KANVHOQK.js +1880 -0
  180. package/dist/chunk-KBJZJWPZ.js +1143 -0
  181. package/dist/chunk-KFC4ZVRH.js +1798 -0
  182. package/dist/chunk-KHG6MSLS.js +1885 -0
  183. package/dist/chunk-KJJE6V5N.js +1886 -0
  184. package/dist/chunk-KKLEILZP.js +1868 -0
  185. package/dist/chunk-KW5QXXEN.js +1641 -0
  186. package/dist/chunk-KWMTK4N7.js +1147 -0
  187. package/dist/chunk-KYOW6LIV.js +1231 -0
  188. package/dist/chunk-KYWIUH3M.js +1355 -0
  189. package/dist/chunk-KZEA3HJL.js +1833 -0
  190. package/dist/chunk-L3KONBJE.js +1355 -0
  191. package/dist/chunk-L47B3OMM.js +1156 -0
  192. package/dist/chunk-LCQFWI6S.js +997 -0
  193. package/dist/chunk-LFIUZUI5.js +1138 -0
  194. package/dist/chunk-LHSLPQR4.js +1854 -0
  195. package/dist/chunk-LJGVAOFP.js +647 -0
  196. package/dist/chunk-LKJDYQPA.js +1687 -0
  197. package/dist/chunk-LOY6PWTR.js +1336 -0
  198. package/dist/chunk-LPFN3GNV.js +1147 -0
  199. package/dist/chunk-LPM7AN7S.js +1147 -0
  200. package/dist/chunk-LU6ES63L.js +1249 -0
  201. package/dist/chunk-M73DE7AU.js +1389 -0
  202. package/dist/chunk-M7OJ52WK.js +1448 -0
  203. package/dist/chunk-MCSM3DAE.js +1024 -0
  204. package/dist/chunk-MEP7OYUL.js +1417 -0
  205. package/dist/chunk-MFH6MVWX.js +1441 -0
  206. package/dist/chunk-MIHU3TFJ.js +1156 -0
  207. package/dist/chunk-MIU5FMSV.js +1329 -0
  208. package/dist/chunk-MJQMHH7Z.js +1976 -0
  209. package/dist/chunk-MLR2HUUY.js +1255 -0
  210. package/dist/chunk-MSBZHMUV.js +997 -0
  211. package/dist/chunk-MV4DZQRB.js +1163 -0
  212. package/dist/chunk-MWBLZDYK.js +1854 -0
  213. package/dist/chunk-N2MEPDSA.js +675 -0
  214. package/dist/chunk-N36ATUZM.js +1863 -0
  215. package/dist/chunk-NEHLM4WN.js +1610 -0
  216. package/dist/chunk-NHOJZ7FZ.js +1138 -0
  217. package/dist/chunk-NLPQBHHH.js +1282 -0
  218. package/dist/chunk-NMY3FWV7.js +1236 -0
  219. package/dist/chunk-NN2WDNCO.js +1138 -0
  220. package/dist/chunk-NNC7LH2Y.js +1258 -0
  221. package/dist/chunk-NQRWXPJ5.js +1275 -0
  222. package/dist/chunk-NR3G3D6Q.js +1238 -0
  223. package/dist/chunk-NRUAFOL3.js +2121 -0
  224. package/dist/chunk-NSCG7F6H.js +1862 -0
  225. package/dist/chunk-NXHVG7ZI.js +1113 -0
  226. package/dist/chunk-NYKPTBXA.js +1258 -0
  227. package/dist/chunk-O4AE4MFX.js +920 -0
  228. package/dist/chunk-O7GTMG3C.js +1467 -0
  229. package/dist/chunk-OBUP5UIM.js +997 -0
  230. package/dist/chunk-ONI2DTTL.js +1156 -0
  231. package/dist/chunk-OQHLTSVD.js +1776 -0
  232. package/dist/chunk-OVV6SHTA.js +997 -0
  233. package/dist/chunk-PAPAMVNI.js +1156 -0
  234. package/dist/chunk-PH7OXFMJ.js +997 -0
  235. package/dist/chunk-PHFLPSZU.js +1608 -0
  236. package/dist/chunk-PTVSK5DV.js +1854 -0
  237. package/dist/chunk-PUHWX6PD.js +1156 -0
  238. package/dist/chunk-PYDU2HN2.js +1803 -0
  239. package/dist/chunk-Q2AMIXBY.js +1250 -0
  240. package/dist/chunk-Q2EARVB7.js +1414 -0
  241. package/dist/chunk-Q4HFSYSN.js +1024 -0
  242. package/dist/chunk-Q65PNALY.js +1024 -0
  243. package/dist/chunk-QBQNHCYH.js +1791 -0
  244. package/dist/chunk-QGI55HK3.js +1433 -0
  245. package/dist/chunk-QIAODEAT.js +1862 -0
  246. package/dist/chunk-QLRJ2X3B.js +1800 -0
  247. package/dist/chunk-QTLVBIBL.js +1147 -0
  248. package/dist/chunk-QUPLQ7O4.js +1862 -0
  249. package/dist/chunk-QZGUSWLN.js +1415 -0
  250. package/dist/chunk-R7N3T7YR.js +1130 -0
  251. package/dist/chunk-RFS3GC46.js +239 -0
  252. package/dist/chunk-RJA7HIQO.js +1823 -0
  253. package/dist/chunk-RJLU3F7G.js +1156 -0
  254. package/dist/chunk-RLBXW5AY.js +1156 -0
  255. package/dist/chunk-RMKHLIMU.js +1147 -0
  256. package/dist/chunk-RS7F3BLO.js +1255 -0
  257. package/dist/chunk-RYLDHQQT.js +997 -0
  258. package/dist/chunk-RYYTEAQ7.js +1147 -0
  259. package/dist/chunk-S2KNKYQJ.js +1815 -0
  260. package/dist/chunk-S5R5IZJH.js +2056 -0
  261. package/dist/chunk-S5S7OBDZ.js +1355 -0
  262. package/dist/chunk-S6YKNJQG.js +1868 -0
  263. package/dist/chunk-SBDVWSWM.js +1251 -0
  264. package/dist/chunk-SBXSREFV.js +1237 -0
  265. package/dist/chunk-SDZJV47M.js +1238 -0
  266. package/dist/chunk-SMBILO75.js +1024 -0
  267. package/dist/chunk-SUSLSP3P.js +1456 -0
  268. package/dist/chunk-T4GPZ2AG.js +1128 -0
  269. package/dist/chunk-TA7EDJXT.js +1460 -0
  270. package/dist/chunk-TAW2ISST.js +1024 -0
  271. package/dist/chunk-TB6KKWS2.js +1138 -0
  272. package/dist/chunk-TBZCEX5O.js +1355 -0
  273. package/dist/chunk-TDOPKFNW.js +756 -0
  274. package/dist/chunk-TGY3JSDQ.js +1460 -0
  275. package/dist/chunk-THOIGUSY.js +666 -0
  276. package/dist/chunk-TLSGQKLO.js +1836 -0
  277. package/dist/chunk-TQ2QEU3G.js +1460 -0
  278. package/dist/chunk-TRJODOZM.js +1232 -0
  279. package/dist/chunk-TSBMRYLQ.js +1717 -0
  280. package/dist/chunk-TUL3R6KB.js +1024 -0
  281. package/dist/chunk-TWCD6YPP.js +2129 -0
  282. package/dist/chunk-TWQDGVLI.js +1323 -0
  283. package/dist/chunk-TZQLWQTW.js +769 -0
  284. package/dist/chunk-U22K555L.js +1803 -0
  285. package/dist/chunk-U3VXLQTW.js +1707 -0
  286. package/dist/chunk-U5QM4SRB.js +2054 -0
  287. package/dist/chunk-UCZLOOAW.js +997 -0
  288. package/dist/chunk-UDA2OZLK.js +1242 -0
  289. package/dist/chunk-UDASJ4IC.js +1355 -0
  290. package/dist/chunk-UGU2KSOQ.js +1113 -0
  291. package/dist/chunk-UJHB3CLA.js +1130 -0
  292. package/dist/chunk-UNUTAECX.js +1238 -0
  293. package/dist/chunk-UUUJVWXA.js +1806 -0
  294. package/dist/chunk-UV4WM7Q5.js +2039 -0
  295. package/dist/chunk-UXPGPOQ3.js +2113 -0
  296. package/dist/chunk-UYVWNYFB.js +1434 -0
  297. package/dist/chunk-UYWI4MPU.js +1460 -0
  298. package/dist/chunk-V2FNBN3P.js +997 -0
  299. package/dist/chunk-V6CF5XXG.js +1862 -0
  300. package/dist/chunk-V6UUV2SZ.js +1156 -0
  301. package/dist/chunk-VARTDMWQ.js +1862 -0
  302. package/dist/chunk-VC7ZYKMP.js +1156 -0
  303. package/dist/chunk-VCJNX77B.js +2038 -0
  304. package/dist/chunk-VDE2I72J.js +650 -0
  305. package/dist/chunk-VEO7FKEL.js +1156 -0
  306. package/dist/chunk-VIJYIU7E.js +2124 -0
  307. package/dist/chunk-VJX4WETG.js +1136 -0
  308. package/dist/chunk-VO3QDFU2.js +1276 -0
  309. package/dist/chunk-VOX2Q2V2.js +1933 -0
  310. package/dist/chunk-W7J5XM2X.js +1862 -0
  311. package/dist/chunk-WONM6P4N.js +1862 -0
  312. package/dist/chunk-WW576PYD.js +1862 -0
  313. package/dist/chunk-XCZCCA2D.js +997 -0
  314. package/dist/chunk-XHQOG4X6.js +1871 -0
  315. package/dist/chunk-XIYLHBWA.js +1163 -0
  316. package/dist/chunk-XKZ6XWSE.js +1907 -0
  317. package/dist/chunk-XLHKOBSF.js +1815 -0
  318. package/dist/chunk-XMMFUBB5.js +1270 -0
  319. package/dist/chunk-XQLK777K.js +1442 -0
  320. package/dist/chunk-XRN47M65.js +997 -0
  321. package/dist/chunk-XVBKUEXA.js +1441 -0
  322. package/dist/chunk-XY4ISIAV.js +1639 -0
  323. package/dist/chunk-Y2SOII6F.js +1156 -0
  324. package/dist/chunk-Y5TJU6YZ.js +1163 -0
  325. package/dist/chunk-YBPCMSUU.js +1147 -0
  326. package/dist/chunk-YDAZ3YZT.js +1004 -0
  327. package/dist/chunk-YH2QPUWO.js +1621 -0
  328. package/dist/chunk-YJX4O5CY.js +1355 -0
  329. package/dist/chunk-YNJMS3VK.js +997 -0
  330. package/dist/chunk-YNRZMOC3.js +997 -0
  331. package/dist/chunk-YNUF5JNP.js +1163 -0
  332. package/dist/chunk-YO7TJ6SG.js +2135 -0
  333. package/dist/chunk-YTUUFYVS.js +1842 -0
  334. package/dist/chunk-YXCOG54V.js +997 -0
  335. package/dist/chunk-Z7V254BA.js +1432 -0
  336. package/dist/chunk-ZBHRR3RS.js +1256 -0
  337. package/dist/chunk-ZM47X5PT.js +1236 -0
  338. package/dist/chunk-ZO6JUCLC.js +917 -0
  339. package/dist/chunk-ZOF4ERNI.js +2039 -0
  340. package/dist/chunk-ZOTRZN3T.js +1238 -0
  341. package/dist/chunk-ZPBA4JGE.js +1234 -0
  342. package/dist/chunk-ZTKGRHNV.js +1138 -0
  343. package/dist/chunk-ZW2JM2OY.js +997 -0
  344. package/dist/chunk-ZXYHUC7C.js +1722 -0
  345. package/dist/cli.d.ts +1 -0
  346. package/dist/cli.js +8 -0
  347. package/dist/index.d.ts +47 -0
  348. package/dist/index.js +37 -0
  349. package/dist/run-interactive-ink-2CDKFV6C.js +783 -0
  350. package/dist/run-interactive-ink-2JULLCIS.js +461 -0
  351. package/dist/run-interactive-ink-2KIHEGXT.js +451 -0
  352. package/dist/run-interactive-ink-2LX2NZRL.js +737 -0
  353. package/dist/run-interactive-ink-2OH6AV3C.js +756 -0
  354. package/dist/run-interactive-ink-2PLJ5XST.js +423 -0
  355. package/dist/run-interactive-ink-2ZI75VMK.js +462 -0
  356. package/dist/run-interactive-ink-3BHGPZ4B.js +423 -0
  357. package/dist/run-interactive-ink-3IUV3456.js +777 -0
  358. package/dist/run-interactive-ink-3QZK5PWY.js +168 -0
  359. package/dist/run-interactive-ink-3VLL4FNN.js +423 -0
  360. package/dist/run-interactive-ink-47Y2KAFZ.js +668 -0
  361. package/dist/run-interactive-ink-4CBTS636.js +423 -0
  362. package/dist/run-interactive-ink-4CHDJRAK.js +423 -0
  363. package/dist/run-interactive-ink-4E6GM5ST.js +423 -0
  364. package/dist/run-interactive-ink-4EKHIHGU.js +462 -0
  365. package/dist/run-interactive-ink-4NO7O233.js +744 -0
  366. package/dist/run-interactive-ink-55IZU2EZ.js +741 -0
  367. package/dist/run-interactive-ink-5A7BER6J.js +423 -0
  368. package/dist/run-interactive-ink-5NEFKF3R.js +423 -0
  369. package/dist/run-interactive-ink-5TCBH3Z4.js +462 -0
  370. package/dist/run-interactive-ink-5WOLWMGH.js +747 -0
  371. package/dist/run-interactive-ink-66JFIG2P.js +462 -0
  372. package/dist/run-interactive-ink-6R77DKEV.js +744 -0
  373. package/dist/run-interactive-ink-7B6HI7XT.js +679 -0
  374. package/dist/run-interactive-ink-7ICZH4E3.js +423 -0
  375. package/dist/run-interactive-ink-7LWBJYQE.js +423 -0
  376. package/dist/run-interactive-ink-7Y7MVKPA.js +438 -0
  377. package/dist/run-interactive-ink-A264MR35.js +423 -0
  378. package/dist/run-interactive-ink-A3NCKFFM.js +423 -0
  379. package/dist/run-interactive-ink-A4FBMTZ5.js +563 -0
  380. package/dist/run-interactive-ink-A7YPXRXR.js +462 -0
  381. package/dist/run-interactive-ink-AAER2EXR.js +451 -0
  382. package/dist/run-interactive-ink-ADVQJ2GF.js +423 -0
  383. package/dist/run-interactive-ink-ALV34HZF.js +451 -0
  384. package/dist/run-interactive-ink-ARDK3CO6.js +462 -0
  385. package/dist/run-interactive-ink-AVMVDBQK.js +462 -0
  386. package/dist/run-interactive-ink-AWV7ZOTC.js +423 -0
  387. package/dist/run-interactive-ink-AWZLJJLH.js +423 -0
  388. package/dist/run-interactive-ink-B25V52JO.js +462 -0
  389. package/dist/run-interactive-ink-BC6RGDCH.js +451 -0
  390. package/dist/run-interactive-ink-BMWLPUEU.js +451 -0
  391. package/dist/run-interactive-ink-BRT2MMN6.js +423 -0
  392. package/dist/run-interactive-ink-CB42OWV4.js +572 -0
  393. package/dist/run-interactive-ink-COZSBQND.js +777 -0
  394. package/dist/run-interactive-ink-CQFV44HM.js +451 -0
  395. package/dist/run-interactive-ink-CQMG45KQ.js +462 -0
  396. package/dist/run-interactive-ink-CQP3B7JM.js +669 -0
  397. package/dist/run-interactive-ink-CUCLNJCF.js +451 -0
  398. package/dist/run-interactive-ink-DEEZYQK5.js +423 -0
  399. package/dist/run-interactive-ink-DF5P6WZX.js +423 -0
  400. package/dist/run-interactive-ink-DFITKRY4.js +423 -0
  401. package/dist/run-interactive-ink-DG6TTEQQ.js +462 -0
  402. package/dist/run-interactive-ink-DH7ECECB.js +438 -0
  403. package/dist/run-interactive-ink-DMTUJHP6.js +423 -0
  404. package/dist/run-interactive-ink-DNSBSWLT.js +451 -0
  405. package/dist/run-interactive-ink-DV3TZEM3.js +742 -0
  406. package/dist/run-interactive-ink-E4AYCUDK.js +451 -0
  407. package/dist/run-interactive-ink-E4GPBTSL.js +462 -0
  408. package/dist/run-interactive-ink-ECVTPOIE.js +462 -0
  409. package/dist/run-interactive-ink-ELPCCGT3.js +423 -0
  410. package/dist/run-interactive-ink-ELWVRJZS.js +451 -0
  411. package/dist/run-interactive-ink-ENBMPAV7.js +462 -0
  412. package/dist/run-interactive-ink-EOVWUC3C.js +451 -0
  413. package/dist/run-interactive-ink-EVHWEXM4.js +451 -0
  414. package/dist/run-interactive-ink-F7SBCWE3.js +423 -0
  415. package/dist/run-interactive-ink-FCHXZ3JW.js +423 -0
  416. package/dist/run-interactive-ink-G27WWB5V.js +423 -0
  417. package/dist/run-interactive-ink-GDFTNYRC.js +462 -0
  418. package/dist/run-interactive-ink-GHGZAYSM.js +533 -0
  419. package/dist/run-interactive-ink-GK4IVHVT.js +684 -0
  420. package/dist/run-interactive-ink-GNCZNR6W.js +423 -0
  421. package/dist/run-interactive-ink-GQ53M5SW.js +605 -0
  422. package/dist/run-interactive-ink-GT7R7X2P.js +762 -0
  423. package/dist/run-interactive-ink-GWZTEIEZ.js +462 -0
  424. package/dist/run-interactive-ink-HA45VNUD.js +703 -0
  425. package/dist/run-interactive-ink-HB44RGFJ.js +423 -0
  426. package/dist/run-interactive-ink-HCVGKG23.js +462 -0
  427. package/dist/run-interactive-ink-HYKJ4PZ3.js +462 -0
  428. package/dist/run-interactive-ink-IGEBXARA.js +423 -0
  429. package/dist/run-interactive-ink-IGU7UVL5.js +462 -0
  430. package/dist/run-interactive-ink-JNVKOJRV.js +462 -0
  431. package/dist/run-interactive-ink-JYON5JQQ.js +461 -0
  432. package/dist/run-interactive-ink-K47CRELE.js +423 -0
  433. package/dist/run-interactive-ink-KCHMEHVH.js +547 -0
  434. package/dist/run-interactive-ink-KEB6ENSZ.js +423 -0
  435. package/dist/run-interactive-ink-KEWSKPTE.js +451 -0
  436. package/dist/run-interactive-ink-KJUHMADH.js +423 -0
  437. package/dist/run-interactive-ink-KW5NPJ32.js +423 -0
  438. package/dist/run-interactive-ink-L3EDWKF6.js +687 -0
  439. package/dist/run-interactive-ink-L4BCC6WG.js +462 -0
  440. package/dist/run-interactive-ink-LQPEZ6PR.js +520 -0
  441. package/dist/run-interactive-ink-LQXS5GMO.js +253 -0
  442. package/dist/run-interactive-ink-M4SOBC5E.js +817 -0
  443. package/dist/run-interactive-ink-MJGAQA2R.js +423 -0
  444. package/dist/run-interactive-ink-MPJB6PCJ.js +451 -0
  445. package/dist/run-interactive-ink-MXWZBG3F.js +461 -0
  446. package/dist/run-interactive-ink-N4XIVCWV.js +562 -0
  447. package/dist/run-interactive-ink-ND3PWHDU.js +462 -0
  448. package/dist/run-interactive-ink-NJTAWS3L.js +462 -0
  449. package/dist/run-interactive-ink-OBWWSIZ5.js +423 -0
  450. package/dist/run-interactive-ink-OD7YJBYI.js +423 -0
  451. package/dist/run-interactive-ink-OE23JGIN.js +451 -0
  452. package/dist/run-interactive-ink-OJ4EUMR5.js +462 -0
  453. package/dist/run-interactive-ink-OOC74RCY.js +423 -0
  454. package/dist/run-interactive-ink-P2PHTOX6.js +462 -0
  455. package/dist/run-interactive-ink-PE3XWCVU.js +423 -0
  456. package/dist/run-interactive-ink-PJBWWQF3.js +423 -0
  457. package/dist/run-interactive-ink-PLLZW6BV.js +678 -0
  458. package/dist/run-interactive-ink-PTXNQZ57.js +451 -0
  459. package/dist/run-interactive-ink-PWN5Q6T6.js +423 -0
  460. package/dist/run-interactive-ink-PZK4RD77.js +423 -0
  461. package/dist/run-interactive-ink-QBSXVTCG.js +462 -0
  462. package/dist/run-interactive-ink-QHOQB55Q.js +727 -0
  463. package/dist/run-interactive-ink-QIAC6ZMT.js +451 -0
  464. package/dist/run-interactive-ink-QLLGPIUL.js +462 -0
  465. package/dist/run-interactive-ink-R5W3ZEMY.js +818 -0
  466. package/dist/run-interactive-ink-RHDW3EHS.js +462 -0
  467. package/dist/run-interactive-ink-RLRKPNTS.js +668 -0
  468. package/dist/run-interactive-ink-RORQKBWV.js +425 -0
  469. package/dist/run-interactive-ink-RS6OZ66I.js +423 -0
  470. package/dist/run-interactive-ink-RVGRYBNQ.js +684 -0
  471. package/dist/run-interactive-ink-S35BKUZB.js +423 -0
  472. package/dist/run-interactive-ink-SS6RAQDE.js +423 -0
  473. package/dist/run-interactive-ink-SVP37E33.js +451 -0
  474. package/dist/run-interactive-ink-T53KH7FU.js +423 -0
  475. package/dist/run-interactive-ink-TCQUCJVS.js +423 -0
  476. package/dist/run-interactive-ink-TLUBKTTN.js +423 -0
  477. package/dist/run-interactive-ink-U2BAAHUU.js +438 -0
  478. package/dist/run-interactive-ink-U2KXGJ5S.js +451 -0
  479. package/dist/run-interactive-ink-U73PEMAO.js +423 -0
  480. package/dist/run-interactive-ink-UFTOTXIX.js +669 -0
  481. package/dist/run-interactive-ink-UJNQ54ZU.js +451 -0
  482. package/dist/run-interactive-ink-V63D5IV5.js +423 -0
  483. package/dist/run-interactive-ink-VLBITT4H.js +451 -0
  484. package/dist/run-interactive-ink-VSAX3XFR.js +462 -0
  485. package/dist/run-interactive-ink-WBJOY622.js +729 -0
  486. package/dist/run-interactive-ink-WERR64KP.js +451 -0
  487. package/dist/run-interactive-ink-WHTQ5OV6.js +732 -0
  488. package/dist/run-interactive-ink-WJBK4XIO.js +423 -0
  489. package/dist/run-interactive-ink-WQLCJ34D.js +462 -0
  490. package/dist/run-interactive-ink-WRKQJIAG.js +733 -0
  491. package/dist/run-interactive-ink-XG3P25DM.js +423 -0
  492. package/dist/run-interactive-ink-XPVJ22HP.js +462 -0
  493. package/dist/run-interactive-ink-XS5I2CGI.js +423 -0
  494. package/dist/run-interactive-ink-XVK7DXPB.js +785 -0
  495. package/dist/run-interactive-ink-YB3USTSB.js +706 -0
  496. package/dist/run-interactive-ink-YCBRQCG2.js +423 -0
  497. package/dist/run-interactive-ink-YOPSMTYJ.js +423 -0
  498. package/dist/run-interactive-ink-YYPCL65X.js +665 -0
  499. package/dist/run-interactive-ink-YYZT5L4Z.js +462 -0
  500. package/dist/run-interactive-ink-ZBPYRTJK.js +462 -0
  501. package/dist/run-interactive-ink-ZCCKFR2A.js +451 -0
  502. package/dist/run-interactive-ink-ZKYQ4CJW.js +423 -0
  503. package/dist/run-interactive-ink-ZMO2352Q.js +685 -0
  504. package/dist/run-interactive-ink-ZTDQ773P.js +423 -0
  505. package/dist/run-interactive-ink-ZWH74XDY.js +674 -0
  506. package/package.json +50 -0
  507. package/src/cli.ts +4 -0
  508. package/src/index.ts +1800 -0
  509. package/src/init-feature-context.ts +153 -0
  510. package/src/init-onboarding.ts +529 -0
  511. package/src/interactive-ink.tsx +5 -0
  512. package/src/run-interactive-ink.ts +618 -0
  513. package/src/web-ui.ts +1975 -0
  514. package/test/cli.test.ts +587 -0
  515. package/test/init-onboarding.contract.test.ts +48 -0
  516. package/tsconfig.json +9 -0
@@ -0,0 +1,1446 @@
1
+ import {
2
+ LoginRateLimiter,
3
+ SessionStore,
4
+ buildOnboardingFeatureGuidance,
5
+ consumeFirstRunIntro,
6
+ getRequestIp,
7
+ inferConversationTitle,
8
+ initializeOnboardingMarker,
9
+ isDefaultOnboardingConfig,
10
+ parseCookies,
11
+ renderIconSvg,
12
+ renderManifest,
13
+ renderServiceWorker,
14
+ renderWebUiHtml,
15
+ runInitOnboarding,
16
+ setCookie,
17
+ verifyPassphrase
18
+ } from "./chunk-UV4WM7Q5.js";
19
+
20
+ // src/index.ts
21
+ import { spawn } from "child_process";
22
+ import { access, cp, mkdir, readFile, writeFile } from "fs/promises";
23
+ import { existsSync } from "fs";
24
+ import {
25
+ createServer
26
+ } from "http";
27
+ import { dirname, relative, resolve } from "path";
28
+ import { createRequire } from "module";
29
+ import { fileURLToPath } from "url";
30
+ import {
31
+ AgentHarness,
32
+ TelemetryEmitter,
33
+ createConversationStore,
34
+ loadAgentlConfig,
35
+ resolveStateConfig
36
+ } from "@agentl/harness";
37
+ import { Command } from "commander";
38
+ import dotenv from "dotenv";
39
+ import YAML from "yaml";
40
+ var __dirname = dirname(fileURLToPath(import.meta.url));
41
+ var require2 = createRequire(import.meta.url);
42
+ var writeJson = (response, statusCode, payload) => {
43
+ response.writeHead(statusCode, { "Content-Type": "application/json" });
44
+ response.end(JSON.stringify(payload));
45
+ };
46
+ var writeHtml = (response, statusCode, payload) => {
47
+ response.writeHead(statusCode, { "Content-Type": "text/html; charset=utf-8" });
48
+ response.end(payload);
49
+ };
50
+ var readRequestBody = async (request) => {
51
+ const chunks = [];
52
+ for await (const chunk of request) {
53
+ chunks.push(Buffer.from(chunk));
54
+ }
55
+ const body = Buffer.concat(chunks).toString("utf8");
56
+ return body.length > 0 ? JSON.parse(body) : {};
57
+ };
58
+ var resolveHarnessEnvironment = () => {
59
+ const value = (process.env.AGENTL_ENV ?? process.env.NODE_ENV ?? "development").toLowerCase();
60
+ if (value === "production" || value === "staging") {
61
+ return value;
62
+ }
63
+ return "development";
64
+ };
65
+ var listenOnAvailablePort = async (server, preferredPort) => await new Promise((resolveListen, rejectListen) => {
66
+ let currentPort = preferredPort;
67
+ const tryListen = () => {
68
+ const onListening = () => {
69
+ server.off("error", onError);
70
+ const address = server.address();
71
+ if (address && typeof address === "object" && typeof address.port === "number") {
72
+ resolveListen(address.port);
73
+ return;
74
+ }
75
+ resolveListen(currentPort);
76
+ };
77
+ const onError = (error) => {
78
+ server.off("listening", onListening);
79
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "EADDRINUSE") {
80
+ currentPort += 1;
81
+ if (currentPort > 65535) {
82
+ rejectListen(
83
+ new Error(
84
+ "No available ports found from the requested port up to 65535."
85
+ )
86
+ );
87
+ return;
88
+ }
89
+ setImmediate(tryListen);
90
+ return;
91
+ }
92
+ rejectListen(error);
93
+ };
94
+ server.once("listening", onListening);
95
+ server.once("error", onError);
96
+ server.listen(currentPort);
97
+ };
98
+ tryListen();
99
+ });
100
+ var parseParams = (values) => {
101
+ const params = {};
102
+ for (const value of values) {
103
+ const [key, ...rest] = value.split("=");
104
+ if (!key) {
105
+ continue;
106
+ }
107
+ params[key] = rest.join("=");
108
+ }
109
+ return params;
110
+ };
111
+ var AGENT_SKILL_GUIDANCE = `## Skill Authoring Guidance
112
+
113
+ When asked to create or update a skill:
114
+
115
+ 1. Inspect current skills under \`skills/\` first (\`list_directory\`, \`read_file\`).
116
+ 2. Decide skill type before writing files:
117
+ - **Instruction skill (no tool code)** for summarization, rewriting, classification, translation, planning, and other pure language tasks.
118
+ - **Tool-backed skill** only when external I/O, deterministic transforms, side effects, or integrations are required.
119
+ 3. If creating a tool-backed skill, create/update:
120
+ - \`skills/<skill-name>/SKILL.md\`
121
+ - \`skills/<skill-name>/tools/<tool-name>.ts\`
122
+ 4. Keep tool names and schemas explicit and stable.
123
+ 5. Never create placeholder tool handlers for tasks the model can already do directly.
124
+ 6. After writing files, verify by listing/reading the created paths.
125
+ 7. Ask the user to run \`agentl tools\` to confirm the new tool is discovered (when tools were added).
126
+
127
+ Skill file conventions:
128
+ - \`SKILL.md\` frontmatter should include \`name\`, \`description\`, and \`tools\`.
129
+ - Tool modules should export a default tool definition object with:
130
+ - \`name\`
131
+ - \`description\`
132
+ - \`inputSchema\`
133
+ - \`handler\``;
134
+ var AGENT_TEMPLATE = (name, options) => `---
135
+ name: ${name}
136
+ description: A helpful AgentL assistant
137
+ model:
138
+ provider: ${options.modelProvider}
139
+ name: ${options.modelName}
140
+ temperature: 0.2
141
+ limits:
142
+ maxSteps: 50
143
+ timeout: 300
144
+ ---
145
+
146
+ # {{name}}
147
+
148
+ You are **{{name}}**, a helpful assistant built with AgentL.
149
+
150
+ Working directory: {{runtime.workingDir}}
151
+ Environment: {{runtime.environment}}
152
+
153
+ ## Task Guidance
154
+
155
+ - Use tools when needed
156
+ - Explain your reasoning clearly
157
+ - Ask clarifying questions when requirements are ambiguous
158
+ - Never claim a file/tool change unless the corresponding tool call actually succeeded
159
+
160
+ ## Default Capabilities in a Fresh Project
161
+
162
+ - Built-in tools: \`list_directory\` and \`read_file\`
163
+ - \`write_file\` is available in development, and disabled by default in production
164
+ - A starter local skill is included (\`starter-echo\`)
165
+ - Bash/shell commands are **not** available unless you install and enable a shell tool/skill
166
+ - Git operations are only available if a git-capable tool/skill is configured
167
+
168
+ ${buildOnboardingFeatureGuidance()}
169
+
170
+ ${AGENT_SKILL_GUIDANCE}
171
+ `;
172
+ var resolveLocalPackagesRoot = () => {
173
+ const candidate = resolve(__dirname, "..", "..", "harness", "package.json");
174
+ if (existsSync(candidate)) {
175
+ return resolve(__dirname, "..", "..");
176
+ }
177
+ return null;
178
+ };
179
+ var resolveCoreDeps = (projectDir) => {
180
+ const packagesRoot = resolveLocalPackagesRoot();
181
+ if (packagesRoot) {
182
+ const harnessAbs = resolve(packagesRoot, "harness");
183
+ const sdkAbs = resolve(packagesRoot, "sdk");
184
+ return {
185
+ harness: `link:${relative(projectDir, harnessAbs)}`,
186
+ sdk: `link:${relative(projectDir, sdkAbs)}`
187
+ };
188
+ }
189
+ return { harness: "^0.1.0", sdk: "^0.1.0" };
190
+ };
191
+ var PACKAGE_TEMPLATE = (name, projectDir) => {
192
+ const deps = resolveCoreDeps(projectDir);
193
+ return JSON.stringify(
194
+ {
195
+ name,
196
+ private: true,
197
+ type: "module",
198
+ dependencies: {
199
+ "@agentl/harness": deps.harness,
200
+ "@agentl/sdk": deps.sdk
201
+ }
202
+ },
203
+ null,
204
+ 2
205
+ );
206
+ };
207
+ var README_TEMPLATE = (name) => `# ${name}
208
+
209
+ An AI agent built with [AgentL](https://github.com/latitude-dev/agentl).
210
+
211
+ ## Setup
212
+
213
+ \`\`\`bash
214
+ npm install
215
+ cp .env.example .env
216
+ # Edit .env and add your Anthropic API key
217
+ \`\`\`
218
+
219
+ ## Development
220
+
221
+ \`\`\`bash
222
+ agentl dev
223
+ \`\`\`
224
+
225
+ Opens a local server at \`http://localhost:3000\` with a chat UI and API.
226
+
227
+ ## Usage
228
+
229
+ \`\`\`bash
230
+ # Run a one-off task
231
+ agentl run "Your task here"
232
+
233
+ # Interactive REPL
234
+ agentl run --interactive
235
+
236
+ # Run tests
237
+ agentl test
238
+ \`\`\`
239
+
240
+ ## Project Structure
241
+
242
+ \`\`\`
243
+ ${name}/
244
+ \u251C\u2500\u2500 AGENT.md # Agent definition and system prompt
245
+ \u251C\u2500\u2500 agentl.config.js # Configuration (MCP servers, auth, etc.)
246
+ \u251C\u2500\u2500 package.json # Dependencies
247
+ \u251C\u2500\u2500 .env.example # Environment variables template
248
+ \u251C\u2500\u2500 tests/
249
+ \u2502 \u2514\u2500\u2500 basic.yaml # Test suite
250
+ \u2514\u2500\u2500 skills/
251
+ \u2514\u2500\u2500 starter/
252
+ \u251C\u2500\u2500 SKILL.md
253
+ \u2514\u2500\u2500 tools/
254
+ \u2514\u2500\u2500 starter-echo.ts
255
+ \`\`\`
256
+
257
+ ## Deployment
258
+
259
+ \`\`\`bash
260
+ # Build for Vercel
261
+ agentl build vercel
262
+ cd .agentl-build/vercel && vercel deploy --prod
263
+
264
+ # Build for Docker
265
+ agentl build docker
266
+ docker build -t ${name} .
267
+ \`\`\`
268
+
269
+ See the [AgentL docs](https://github.com/latitude-dev/agentl) for more.
270
+ `;
271
+ var ENV_TEMPLATE = "ANTHROPIC_API_KEY=sk-ant-...\n";
272
+ var GITIGNORE_TEMPLATE = ".env\nnode_modules\ndist\n.agentl-build\n.agentl/\ninteractive-session.json\n";
273
+ var VERCEL_RUNTIME_DEPENDENCIES = {
274
+ "@anthropic-ai/sdk": "^0.74.0",
275
+ "@aws-sdk/client-dynamodb": "^3.988.0",
276
+ "@latitude-data/telemetry": "^2.0.2",
277
+ commander: "^12.0.0",
278
+ dotenv: "^16.4.0",
279
+ jiti: "^2.6.1",
280
+ mustache: "^4.2.0",
281
+ openai: "^6.3.0",
282
+ redis: "^5.10.0",
283
+ ws: "^8.18.0",
284
+ yaml: "^2.8.1"
285
+ };
286
+ var TEST_TEMPLATE = `tests:
287
+ - name: "Basic sanity"
288
+ task: "What is 2 + 2?"
289
+ expect:
290
+ contains: "4"
291
+ `;
292
+ var SKILL_TEMPLATE = `---
293
+ name: starter-skill
294
+ version: 1.0.0
295
+ description: Starter local skill template
296
+ tools:
297
+ - starter-echo
298
+ ---
299
+
300
+ # Starter Skill
301
+
302
+ This is a starter local skill created by \`agentl init\`.
303
+
304
+ ## Authoring Notes
305
+
306
+ - Keep the \`tools\` frontmatter list in sync with actual tool module names.
307
+ - Prefer narrow, explicit schemas for predictable tool calling.
308
+ - After edits, run \`agentl tools\` to confirm discovery.
309
+ `;
310
+ var SKILL_TOOL_TEMPLATE = `export default {
311
+ name: "starter-echo",
312
+ description: "Echoes a message for testing local skill wiring",
313
+ inputSchema: {
314
+ type: "object",
315
+ properties: {
316
+ message: { type: "string", description: "Message to echo" }
317
+ },
318
+ required: ["message"]
319
+ },
320
+ async handler(input) {
321
+ return { echoed: input.message };
322
+ }
323
+ };
324
+ `;
325
+ var ensureFile = async (path, content) => {
326
+ await mkdir(dirname(path), { recursive: true });
327
+ await writeFile(path, content, { encoding: "utf8", flag: "wx" });
328
+ };
329
+ var copyIfExists = async (sourcePath, destinationPath) => {
330
+ try {
331
+ await access(sourcePath);
332
+ } catch {
333
+ return;
334
+ }
335
+ await mkdir(dirname(destinationPath), { recursive: true });
336
+ await cp(sourcePath, destinationPath, { recursive: true });
337
+ };
338
+ var resolveCliEntrypoint = async () => {
339
+ const sourceEntrypoint = resolve(packageRoot, "src", "index.ts");
340
+ try {
341
+ await access(sourceEntrypoint);
342
+ return sourceEntrypoint;
343
+ } catch {
344
+ return resolve(packageRoot, "dist", "index.js");
345
+ }
346
+ };
347
+ var buildVercelHandlerBundle = async (outDir) => {
348
+ const { build: esbuild } = await import("esbuild");
349
+ const cliEntrypoint = await resolveCliEntrypoint();
350
+ const tempEntry = resolve(outDir, "api", "_entry.js");
351
+ await writeFile(
352
+ tempEntry,
353
+ `import { createRequestHandler } from ${JSON.stringify(cliEntrypoint)};
354
+ let handlerPromise;
355
+ export default async function handler(req, res) {
356
+ try {
357
+ if (!handlerPromise) {
358
+ handlerPromise = createRequestHandler({ workingDir: process.cwd() });
359
+ }
360
+ const requestHandler = await handlerPromise;
361
+ await requestHandler(req, res);
362
+ } catch (error) {
363
+ console.error("Handler error:", error);
364
+ if (!res.headersSent) {
365
+ res.writeHead(500, { "Content-Type": "application/json" });
366
+ res.end(JSON.stringify({ error: "Internal server error", message: error?.message || "Unknown error" }));
367
+ }
368
+ }
369
+ }
370
+ `,
371
+ "utf8"
372
+ );
373
+ await esbuild({
374
+ entryPoints: [tempEntry],
375
+ bundle: true,
376
+ platform: "node",
377
+ format: "esm",
378
+ target: "node20",
379
+ outfile: resolve(outDir, "api", "index.js"),
380
+ sourcemap: false,
381
+ legalComments: "none",
382
+ external: [
383
+ ...Object.keys(VERCEL_RUNTIME_DEPENDENCIES),
384
+ "@anthropic-ai/sdk/*",
385
+ "child_process",
386
+ "fs",
387
+ "fs/promises",
388
+ "http",
389
+ "https",
390
+ "path",
391
+ "module",
392
+ "url",
393
+ "readline",
394
+ "readline/promises",
395
+ "crypto",
396
+ "stream",
397
+ "events",
398
+ "util",
399
+ "os",
400
+ "zlib",
401
+ "net",
402
+ "tls",
403
+ "dns",
404
+ "assert",
405
+ "buffer",
406
+ "timers",
407
+ "timers/promises",
408
+ "node:child_process",
409
+ "node:fs",
410
+ "node:fs/promises",
411
+ "node:http",
412
+ "node:https",
413
+ "node:path",
414
+ "node:module",
415
+ "node:url",
416
+ "node:readline",
417
+ "node:readline/promises",
418
+ "node:crypto",
419
+ "node:stream",
420
+ "node:events",
421
+ "node:util",
422
+ "node:os",
423
+ "node:zlib",
424
+ "node:net",
425
+ "node:tls",
426
+ "node:dns",
427
+ "node:assert",
428
+ "node:buffer",
429
+ "node:timers",
430
+ "node:timers/promises"
431
+ ]
432
+ });
433
+ };
434
+ var renderConfigFile = (config) => `export default ${JSON.stringify(config, null, 2)}
435
+ `;
436
+ var writeConfigFile = async (workingDir, config) => {
437
+ const serialized = renderConfigFile(config);
438
+ await writeFile(resolve(workingDir, "agentl.config.js"), serialized, "utf8");
439
+ };
440
+ var gitInit = (cwd) => new Promise((resolve2) => {
441
+ const child = spawn("git", ["init"], { cwd, stdio: "ignore" });
442
+ child.on("error", () => resolve2(false));
443
+ child.on("close", (code) => resolve2(code === 0));
444
+ });
445
+ var initProject = async (projectName, options) => {
446
+ const baseDir = options?.workingDir ?? process.cwd();
447
+ const projectDir = resolve(baseDir, projectName);
448
+ await mkdir(projectDir, { recursive: true });
449
+ const onboardingOptions = options?.onboarding ?? {
450
+ mode: "light",
451
+ yes: true,
452
+ interactive: false
453
+ };
454
+ const onboarding = await runInitOnboarding(onboardingOptions);
455
+ await ensureFile(
456
+ resolve(projectDir, "AGENT.md"),
457
+ AGENT_TEMPLATE(projectName, {
458
+ modelProvider: onboarding.agentModel.provider,
459
+ modelName: onboarding.agentModel.name
460
+ })
461
+ );
462
+ await ensureFile(resolve(projectDir, "agentl.config.js"), renderConfigFile(onboarding.config));
463
+ await ensureFile(resolve(projectDir, "package.json"), PACKAGE_TEMPLATE(projectName, projectDir));
464
+ await ensureFile(resolve(projectDir, "README.md"), README_TEMPLATE(projectName));
465
+ await ensureFile(
466
+ resolve(projectDir, ".env.example"),
467
+ options?.envExampleOverride ?? onboarding.envExample ?? ENV_TEMPLATE
468
+ );
469
+ await ensureFile(resolve(projectDir, ".gitignore"), GITIGNORE_TEMPLATE);
470
+ await ensureFile(resolve(projectDir, "tests", "basic.yaml"), TEST_TEMPLATE);
471
+ await ensureFile(resolve(projectDir, "skills", "starter", "SKILL.md"), SKILL_TEMPLATE);
472
+ await ensureFile(
473
+ resolve(projectDir, "skills", "starter", "tools", "starter-echo.ts"),
474
+ SKILL_TOOL_TEMPLATE
475
+ );
476
+ await initializeOnboardingMarker(projectDir, {
477
+ allowIntro: !(onboardingOptions.yes ?? false) && isDefaultOnboardingConfig(onboarding.config)
478
+ });
479
+ try {
480
+ await runPnpmInstall(projectDir);
481
+ } catch {
482
+ process.stdout.write(
483
+ "Warning: could not install dependencies. Run `pnpm install` manually.\n"
484
+ );
485
+ }
486
+ const gitOk = await gitInit(projectDir);
487
+ if (gitOk) {
488
+ process.stdout.write(`Initialized git repository
489
+ `);
490
+ }
491
+ process.stdout.write(`Initialized AgentL project at ${projectDir}
492
+ `);
493
+ process.stdout.write("Next steps:\n");
494
+ process.stdout.write(`1) cd ${projectName}
495
+ `);
496
+ process.stdout.write("2) Choose one way to start:\n");
497
+ process.stdout.write(" - Web UI mode:\n");
498
+ process.stdout.write(" agentl dev\n");
499
+ process.stdout.write(" - CLI interactive mode:\n");
500
+ process.stdout.write(" agentl run --interactive\n");
501
+ process.stdout.write(
502
+ "On first eligible interactive session, the agent introduces available features and how to configure them by chat.\n"
503
+ );
504
+ };
505
+ var updateAgentGuidance = async (workingDir) => {
506
+ const agentPath = resolve(workingDir, "AGENT.md");
507
+ const content = await readFile(agentPath, "utf8");
508
+ const guidanceSectionPattern = /## Skill Authoring Guidance[\s\S]*?(?=\n## |\n# |$)/;
509
+ const normalized = content.replace(/\s+$/g, "");
510
+ const hasGuidance = guidanceSectionPattern.test(normalized);
511
+ const updated = hasGuidance ? normalized.replace(guidanceSectionPattern, AGENT_SKILL_GUIDANCE) : `${normalized}
512
+
513
+ ${AGENT_SKILL_GUIDANCE}
514
+ `;
515
+ if (updated === normalized) {
516
+ process.stdout.write("AGENT.md guidance is already up to date.\n");
517
+ return false;
518
+ }
519
+ await writeFile(agentPath, updated, "utf8");
520
+ process.stdout.write("Updated AGENT.md with latest skill authoring guidance.\n");
521
+ return true;
522
+ };
523
+ var formatSseEvent = (event) => `event: ${event.type}
524
+ data: ${JSON.stringify(event)}
525
+
526
+ `;
527
+ var createRequestHandler = async (options) => {
528
+ const workingDir = options?.workingDir ?? process.cwd();
529
+ dotenv.config({ path: resolve(workingDir, ".env") });
530
+ const config = await loadAgentlConfig(workingDir);
531
+ let agentName = "Agent";
532
+ let agentModelProvider = "anthropic";
533
+ let agentModelName = "claude-opus-4-5";
534
+ try {
535
+ const agentMd = await readFile(resolve(workingDir, "AGENT.md"), "utf8");
536
+ const nameMatch = agentMd.match(/^name:\s*(.+)$/m);
537
+ const providerMatch = agentMd.match(/^\s{2}provider:\s*(.+)$/m);
538
+ const modelMatch = agentMd.match(/^\s{2}name:\s*(.+)$/m);
539
+ if (nameMatch?.[1]) {
540
+ agentName = nameMatch[1].trim().replace(/^["']|["']$/g, "");
541
+ }
542
+ if (providerMatch?.[1]) {
543
+ agentModelProvider = providerMatch[1].trim().replace(/^["']|["']$/g, "");
544
+ }
545
+ if (modelMatch?.[1]) {
546
+ agentModelName = modelMatch[1].trim().replace(/^["']|["']$/g, "");
547
+ }
548
+ } catch {
549
+ }
550
+ const harness = new AgentHarness({ workingDir });
551
+ await harness.initialize();
552
+ const telemetry = new TelemetryEmitter(config?.telemetry);
553
+ const conversationStore = createConversationStore(resolveStateConfig(config), { workingDir });
554
+ const sessionStore = new SessionStore();
555
+ const loginRateLimiter = new LoginRateLimiter();
556
+ const passphrase = process.env.AGENT_UI_PASSPHRASE ?? "";
557
+ const isProduction = resolveHarnessEnvironment() === "production";
558
+ const requireUiAuth = passphrase.length > 0;
559
+ const secureCookies = isProduction;
560
+ return async (request, response) => {
561
+ if (!request.url || !request.method) {
562
+ writeJson(response, 404, { error: "Not found" });
563
+ return;
564
+ }
565
+ const [pathname] = request.url.split("?");
566
+ if (request.method === "GET" && (pathname === "/" || pathname.startsWith("/c/"))) {
567
+ writeHtml(response, 200, renderWebUiHtml({ agentName }));
568
+ return;
569
+ }
570
+ if (pathname === "/manifest.json" && request.method === "GET") {
571
+ response.writeHead(200, { "Content-Type": "application/manifest+json" });
572
+ response.end(renderManifest({ agentName }));
573
+ return;
574
+ }
575
+ if (pathname === "/sw.js" && request.method === "GET") {
576
+ response.writeHead(200, {
577
+ "Content-Type": "application/javascript",
578
+ "Service-Worker-Allowed": "/"
579
+ });
580
+ response.end(renderServiceWorker());
581
+ return;
582
+ }
583
+ if (pathname === "/icon.svg" && request.method === "GET") {
584
+ response.writeHead(200, { "Content-Type": "image/svg+xml" });
585
+ response.end(renderIconSvg({ agentName }));
586
+ return;
587
+ }
588
+ if ((pathname === "/icon-192.png" || pathname === "/icon-512.png") && request.method === "GET") {
589
+ response.writeHead(302, { Location: "/icon.svg" });
590
+ response.end();
591
+ return;
592
+ }
593
+ if (pathname === "/health" && request.method === "GET") {
594
+ writeJson(response, 200, { status: "ok" });
595
+ return;
596
+ }
597
+ const cookies = parseCookies(request);
598
+ const sessionId = cookies.agentl_session;
599
+ const session = sessionId ? sessionStore.get(sessionId) : void 0;
600
+ const ownerId = session?.ownerId ?? "local-owner";
601
+ const requiresCsrfValidation = request.method !== "GET" && request.method !== "HEAD" && request.method !== "OPTIONS";
602
+ if (pathname === "/api/auth/session" && request.method === "GET") {
603
+ if (!requireUiAuth) {
604
+ writeJson(response, 200, { authenticated: true, csrfToken: "" });
605
+ return;
606
+ }
607
+ if (!session) {
608
+ writeJson(response, 200, { authenticated: false });
609
+ return;
610
+ }
611
+ writeJson(response, 200, {
612
+ authenticated: true,
613
+ sessionId: session.sessionId,
614
+ ownerId: session.ownerId,
615
+ csrfToken: session.csrfToken
616
+ });
617
+ return;
618
+ }
619
+ if (pathname === "/api/auth/login" && request.method === "POST") {
620
+ if (!requireUiAuth) {
621
+ writeJson(response, 200, { authenticated: true, csrfToken: "" });
622
+ return;
623
+ }
624
+ const ip = getRequestIp(request);
625
+ const canAttempt = loginRateLimiter.canAttempt(ip);
626
+ if (!canAttempt.allowed) {
627
+ writeJson(response, 429, {
628
+ code: "AUTH_RATE_LIMIT",
629
+ message: "Too many failed login attempts. Try again later.",
630
+ retryAfterSeconds: canAttempt.retryAfterSeconds
631
+ });
632
+ return;
633
+ }
634
+ const body = await readRequestBody(request);
635
+ const provided = body.passphrase ?? "";
636
+ if (!verifyPassphrase(provided, passphrase)) {
637
+ const failure = loginRateLimiter.registerFailure(ip);
638
+ writeJson(response, 401, {
639
+ code: "AUTH_ERROR",
640
+ message: "Invalid passphrase",
641
+ retryAfterSeconds: failure.retryAfterSeconds
642
+ });
643
+ return;
644
+ }
645
+ loginRateLimiter.registerSuccess(ip);
646
+ const createdSession = sessionStore.create(ownerId);
647
+ setCookie(response, "agentl_session", createdSession.sessionId, {
648
+ httpOnly: true,
649
+ secure: secureCookies,
650
+ sameSite: "Lax",
651
+ path: "/",
652
+ maxAge: 60 * 60 * 8
653
+ });
654
+ writeJson(response, 200, {
655
+ authenticated: true,
656
+ csrfToken: createdSession.csrfToken
657
+ });
658
+ return;
659
+ }
660
+ if (pathname === "/api/auth/logout" && request.method === "POST") {
661
+ if (session?.sessionId) {
662
+ sessionStore.delete(session.sessionId);
663
+ }
664
+ setCookie(response, "agentl_session", "", {
665
+ httpOnly: true,
666
+ secure: secureCookies,
667
+ sameSite: "Lax",
668
+ path: "/",
669
+ maxAge: 0
670
+ });
671
+ writeJson(response, 200, { ok: true });
672
+ return;
673
+ }
674
+ if (pathname.startsWith("/api/")) {
675
+ if (requireUiAuth && !session) {
676
+ writeJson(response, 401, {
677
+ code: "AUTH_ERROR",
678
+ message: "Authentication required"
679
+ });
680
+ return;
681
+ }
682
+ if (requireUiAuth && requiresCsrfValidation && pathname !== "/api/auth/login" && request.headers["x-csrf-token"] !== session?.csrfToken) {
683
+ writeJson(response, 403, {
684
+ code: "CSRF_ERROR",
685
+ message: "Invalid CSRF token"
686
+ });
687
+ return;
688
+ }
689
+ }
690
+ if (pathname === "/api/conversations" && request.method === "GET") {
691
+ const conversations = await conversationStore.list(ownerId);
692
+ writeJson(response, 200, {
693
+ conversations: conversations.map((conversation) => ({
694
+ conversationId: conversation.conversationId,
695
+ title: conversation.title,
696
+ runtimeRunId: conversation.runtimeRunId,
697
+ ownerId: conversation.ownerId,
698
+ tenantId: conversation.tenantId,
699
+ createdAt: conversation.createdAt,
700
+ updatedAt: conversation.updatedAt,
701
+ messageCount: conversation.messages.length
702
+ }))
703
+ });
704
+ return;
705
+ }
706
+ if (pathname === "/api/conversations" && request.method === "POST") {
707
+ const body = await readRequestBody(request);
708
+ const conversation = await conversationStore.create(ownerId, body.title);
709
+ const introMessage = await consumeFirstRunIntro(workingDir, {
710
+ agentName,
711
+ provider: agentModelProvider,
712
+ model: agentModelName,
713
+ config
714
+ });
715
+ if (introMessage) {
716
+ conversation.messages = [{ role: "assistant", content: introMessage }];
717
+ await conversationStore.update(conversation);
718
+ }
719
+ writeJson(response, 201, { conversation });
720
+ return;
721
+ }
722
+ const conversationPathMatch = pathname.match(/^\/api\/conversations\/([^/]+)$/);
723
+ if (conversationPathMatch) {
724
+ const conversationId = decodeURIComponent(conversationPathMatch[1] ?? "");
725
+ const conversation = await conversationStore.get(conversationId);
726
+ if (!conversation || conversation.ownerId !== ownerId) {
727
+ writeJson(response, 404, {
728
+ code: "CONVERSATION_NOT_FOUND",
729
+ message: "Conversation not found"
730
+ });
731
+ return;
732
+ }
733
+ if (request.method === "GET") {
734
+ writeJson(response, 200, { conversation });
735
+ return;
736
+ }
737
+ if (request.method === "PATCH") {
738
+ const body = await readRequestBody(request);
739
+ if (!body.title || body.title.trim().length === 0) {
740
+ writeJson(response, 400, {
741
+ code: "VALIDATION_ERROR",
742
+ message: "title is required"
743
+ });
744
+ return;
745
+ }
746
+ const updated = await conversationStore.rename(conversationId, body.title);
747
+ writeJson(response, 200, { conversation: updated });
748
+ return;
749
+ }
750
+ if (request.method === "DELETE") {
751
+ await conversationStore.delete(conversationId);
752
+ writeJson(response, 200, { ok: true });
753
+ return;
754
+ }
755
+ }
756
+ const conversationMessageMatch = pathname.match(/^\/api\/conversations\/([^/]+)\/messages$/);
757
+ if (conversationMessageMatch && request.method === "POST") {
758
+ const conversationId = decodeURIComponent(conversationMessageMatch[1] ?? "");
759
+ const conversation = await conversationStore.get(conversationId);
760
+ if (!conversation || conversation.ownerId !== ownerId) {
761
+ writeJson(response, 404, {
762
+ code: "CONVERSATION_NOT_FOUND",
763
+ message: "Conversation not found"
764
+ });
765
+ return;
766
+ }
767
+ const body = await readRequestBody(request);
768
+ const messageText = body.message?.trim() ?? "";
769
+ if (!messageText) {
770
+ writeJson(response, 400, {
771
+ code: "VALIDATION_ERROR",
772
+ message: "message is required"
773
+ });
774
+ return;
775
+ }
776
+ if (conversation.messages.length === 0 && (conversation.title === "New conversation" || conversation.title.trim().length === 0)) {
777
+ conversation.title = inferConversationTitle(messageText);
778
+ }
779
+ response.writeHead(200, {
780
+ "Content-Type": "text/event-stream",
781
+ "Cache-Control": "no-cache",
782
+ Connection: "keep-alive"
783
+ });
784
+ let latestRunId = conversation.runtimeRunId ?? "";
785
+ let assistantResponse = "";
786
+ const toolTimeline = [];
787
+ try {
788
+ const recallCorpus = (await conversationStore.list(ownerId)).filter((item) => item.conversationId !== conversationId).slice(0, 20).map((item) => ({
789
+ conversationId: item.conversationId,
790
+ title: item.title,
791
+ updatedAt: item.updatedAt,
792
+ content: item.messages.slice(-6).map((message) => `${message.role}: ${message.content}`).join("\n").slice(0, 2e3)
793
+ })).filter((item) => item.content.length > 0);
794
+ for await (const event of harness.run({
795
+ task: messageText,
796
+ parameters: {
797
+ ...body.parameters ?? {},
798
+ __conversationRecallCorpus: recallCorpus,
799
+ __activeConversationId: conversationId
800
+ },
801
+ messages: conversation.messages
802
+ })) {
803
+ if (event.type === "run:started") {
804
+ latestRunId = event.runId;
805
+ }
806
+ if (event.type === "model:chunk") {
807
+ assistantResponse += event.content;
808
+ }
809
+ if (event.type === "tool:started") {
810
+ toolTimeline.push(`- start \`${event.tool}\``);
811
+ }
812
+ if (event.type === "tool:completed") {
813
+ toolTimeline.push(`- done \`${event.tool}\` (${event.duration}ms)`);
814
+ }
815
+ if (event.type === "tool:error") {
816
+ toolTimeline.push(`- error \`${event.tool}\`: ${event.error}`);
817
+ }
818
+ if (event.type === "tool:approval:required") {
819
+ toolTimeline.push(`- approval required \`${event.tool}\``);
820
+ }
821
+ if (event.type === "tool:approval:granted") {
822
+ toolTimeline.push(`- approval granted (${event.approvalId})`);
823
+ }
824
+ if (event.type === "tool:approval:denied") {
825
+ toolTimeline.push(`- approval denied (${event.approvalId})`);
826
+ }
827
+ if (event.type === "run:completed" && assistantResponse.length === 0 && event.result.response) {
828
+ assistantResponse = event.result.response;
829
+ }
830
+ await telemetry.emit(event);
831
+ response.write(formatSseEvent(event));
832
+ }
833
+ conversation.messages = [
834
+ ...conversation.messages,
835
+ { role: "user", content: messageText },
836
+ {
837
+ role: "assistant",
838
+ content: assistantResponse,
839
+ metadata: toolTimeline.length > 0 ? { toolActivity: toolTimeline } : void 0
840
+ }
841
+ ];
842
+ conversation.runtimeRunId = latestRunId || conversation.runtimeRunId;
843
+ conversation.updatedAt = Date.now();
844
+ await conversationStore.update(conversation);
845
+ } catch (error) {
846
+ response.write(
847
+ formatSseEvent({
848
+ type: "run:error",
849
+ runId: latestRunId || "run_unknown",
850
+ error: {
851
+ code: "RUN_ERROR",
852
+ message: error instanceof Error ? error.message : "Unknown error"
853
+ }
854
+ })
855
+ );
856
+ } finally {
857
+ response.end();
858
+ }
859
+ return;
860
+ }
861
+ writeJson(response, 404, { error: "Not found" });
862
+ };
863
+ };
864
+ var startDevServer = async (port, options) => {
865
+ const handler = await createRequestHandler(options);
866
+ const server = createServer(handler);
867
+ const actualPort = await listenOnAvailablePort(server, port);
868
+ if (actualPort !== port) {
869
+ process.stdout.write(`Port ${port} is in use, switched to ${actualPort}.
870
+ `);
871
+ }
872
+ process.stdout.write(`AgentL dev server running at http://localhost:${actualPort}
873
+ `);
874
+ const shutdown = () => {
875
+ server.close();
876
+ server.closeAllConnections?.();
877
+ process.exit(0);
878
+ };
879
+ process.on("SIGINT", shutdown);
880
+ process.on("SIGTERM", shutdown);
881
+ return server;
882
+ };
883
+ var runOnce = async (task, options) => {
884
+ const workingDir = options.workingDir ?? process.cwd();
885
+ dotenv.config({ path: resolve(workingDir, ".env") });
886
+ const config = await loadAgentlConfig(workingDir);
887
+ const harness = new AgentHarness({ workingDir });
888
+ const telemetry = new TelemetryEmitter(config?.telemetry);
889
+ await harness.initialize();
890
+ const fileBlobs = await Promise.all(
891
+ options.filePaths.map(async (path) => {
892
+ const content = await readFile(resolve(workingDir, path), "utf8");
893
+ return `# File: ${path}
894
+ ${content}`;
895
+ })
896
+ );
897
+ const input = {
898
+ task: fileBlobs.length > 0 ? `${task}
899
+
900
+ ${fileBlobs.join("\n\n")}` : task,
901
+ parameters: options.params
902
+ };
903
+ if (options.json) {
904
+ const output = await harness.runToCompletion(input);
905
+ for (const event of output.events) {
906
+ await telemetry.emit(event);
907
+ }
908
+ process.stdout.write(`${JSON.stringify(output, null, 2)}
909
+ `);
910
+ return;
911
+ }
912
+ for await (const event of harness.run(input)) {
913
+ await telemetry.emit(event);
914
+ if (event.type === "model:chunk") {
915
+ process.stdout.write(event.content);
916
+ }
917
+ if (event.type === "run:error") {
918
+ process.stderr.write(`
919
+ Error: ${event.error.message}
920
+ `);
921
+ }
922
+ if (event.type === "run:completed") {
923
+ process.stdout.write("\n");
924
+ }
925
+ }
926
+ };
927
+ var runInteractive = async (workingDir, params) => {
928
+ dotenv.config({ path: resolve(workingDir, ".env") });
929
+ const config = await loadAgentlConfig(workingDir);
930
+ let pendingApproval = null;
931
+ let onApprovalRequest = null;
932
+ const approvalHandler = async (request) => {
933
+ return new Promise((resolveApproval) => {
934
+ const req = {
935
+ tool: request.tool,
936
+ input: request.input,
937
+ approvalId: request.approvalId,
938
+ resolve: resolveApproval
939
+ };
940
+ pendingApproval = req;
941
+ if (onApprovalRequest) {
942
+ onApprovalRequest(req);
943
+ }
944
+ });
945
+ };
946
+ const harness = new AgentHarness({
947
+ workingDir,
948
+ environment: resolveHarnessEnvironment(),
949
+ approvalHandler
950
+ });
951
+ await harness.initialize();
952
+ try {
953
+ const { runInteractiveInk } = await import("./run-interactive-ink-CUCLNJCF.js");
954
+ await runInteractiveInk({
955
+ harness,
956
+ params,
957
+ workingDir,
958
+ config,
959
+ conversationStore: createConversationStore(resolveStateConfig(config), { workingDir }),
960
+ onSetApprovalCallback: (cb) => {
961
+ onApprovalRequest = cb;
962
+ if (pendingApproval) {
963
+ cb(pendingApproval);
964
+ }
965
+ }
966
+ });
967
+ } finally {
968
+ await harness.shutdown();
969
+ }
970
+ };
971
+ var listTools = async (workingDir) => {
972
+ dotenv.config({ path: resolve(workingDir, ".env") });
973
+ const harness = new AgentHarness({ workingDir });
974
+ await harness.initialize();
975
+ const tools = harness.listTools();
976
+ if (tools.length === 0) {
977
+ process.stdout.write("No tools registered.\n");
978
+ return;
979
+ }
980
+ process.stdout.write("Available tools:\n");
981
+ for (const tool of tools) {
982
+ process.stdout.write(`- ${tool.name}: ${tool.description}
983
+ `);
984
+ }
985
+ };
986
+ var runPnpmInstall = async (workingDir) => await new Promise((resolveInstall, rejectInstall) => {
987
+ const child = spawn("pnpm", ["install"], {
988
+ cwd: workingDir,
989
+ stdio: "inherit",
990
+ env: process.env
991
+ });
992
+ child.on("exit", (code) => {
993
+ if (code === 0) {
994
+ resolveInstall();
995
+ return;
996
+ }
997
+ rejectInstall(new Error(`pnpm install failed with exit code ${code ?? -1}`));
998
+ });
999
+ });
1000
+ var runInstallCommand = async (workingDir, packageNameOrPath) => await new Promise((resolveInstall, rejectInstall) => {
1001
+ const child = spawn("pnpm", ["add", packageNameOrPath], {
1002
+ cwd: workingDir,
1003
+ stdio: "inherit",
1004
+ env: process.env
1005
+ });
1006
+ child.on("exit", (code) => {
1007
+ if (code === 0) {
1008
+ resolveInstall();
1009
+ return;
1010
+ }
1011
+ rejectInstall(new Error(`pnpm add failed with exit code ${code ?? -1}`));
1012
+ });
1013
+ });
1014
+ var resolveInstalledPackageName = (packageNameOrPath) => {
1015
+ if (packageNameOrPath.startsWith(".") || packageNameOrPath.startsWith("/")) {
1016
+ return null;
1017
+ }
1018
+ if (packageNameOrPath.startsWith("@")) {
1019
+ return packageNameOrPath;
1020
+ }
1021
+ if (packageNameOrPath.includes("/")) {
1022
+ return packageNameOrPath.split("/").pop() ?? packageNameOrPath;
1023
+ }
1024
+ return packageNameOrPath;
1025
+ };
1026
+ var resolveSkillRoot = (workingDir, packageNameOrPath) => {
1027
+ if (packageNameOrPath.startsWith(".") || packageNameOrPath.startsWith("/")) {
1028
+ return resolve(workingDir, packageNameOrPath);
1029
+ }
1030
+ const moduleName = resolveInstalledPackageName(packageNameOrPath) ?? packageNameOrPath;
1031
+ try {
1032
+ const packageJsonPath = require2.resolve(`${moduleName}/package.json`, {
1033
+ paths: [workingDir]
1034
+ });
1035
+ return resolve(packageJsonPath, "..");
1036
+ } catch {
1037
+ const candidate = resolve(workingDir, "node_modules", moduleName);
1038
+ if (existsSync(candidate)) {
1039
+ return candidate;
1040
+ }
1041
+ throw new Error(
1042
+ `Could not locate installed package "${moduleName}" in ${workingDir}`
1043
+ );
1044
+ }
1045
+ };
1046
+ var findSkillManifest = async (dir, depth = 2) => {
1047
+ try {
1048
+ await access(resolve(dir, "SKILL.md"));
1049
+ return true;
1050
+ } catch {
1051
+ }
1052
+ if (depth <= 0) return false;
1053
+ try {
1054
+ const { readdir } = await import("fs/promises");
1055
+ const entries = await readdir(dir, { withFileTypes: true });
1056
+ for (const entry of entries) {
1057
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules") {
1058
+ const found = await findSkillManifest(resolve(dir, entry.name), depth - 1);
1059
+ if (found) return true;
1060
+ }
1061
+ }
1062
+ } catch {
1063
+ }
1064
+ return false;
1065
+ };
1066
+ var validateSkillPackage = async (workingDir, packageNameOrPath) => {
1067
+ const skillRoot = resolveSkillRoot(workingDir, packageNameOrPath);
1068
+ const hasSkill = await findSkillManifest(skillRoot);
1069
+ if (!hasSkill) {
1070
+ throw new Error(`Skill validation failed: no SKILL.md found in ${skillRoot}`);
1071
+ }
1072
+ };
1073
+ var addSkill = async (workingDir, packageNameOrPath) => {
1074
+ await runInstallCommand(workingDir, packageNameOrPath);
1075
+ await validateSkillPackage(workingDir, packageNameOrPath);
1076
+ process.stdout.write(`Added skill: ${packageNameOrPath}
1077
+ `);
1078
+ };
1079
+ var runTests = async (workingDir, filePath) => {
1080
+ dotenv.config({ path: resolve(workingDir, ".env") });
1081
+ const testFilePath = filePath ?? resolve(workingDir, "tests", "basic.yaml");
1082
+ const content = await readFile(testFilePath, "utf8");
1083
+ const parsed = YAML.parse(content);
1084
+ const tests = parsed.tests ?? [];
1085
+ const harness = new AgentHarness({ workingDir });
1086
+ await harness.initialize();
1087
+ let passed = 0;
1088
+ let failed = 0;
1089
+ for (const testCase of tests) {
1090
+ try {
1091
+ const output = await harness.runToCompletion({ task: testCase.task });
1092
+ const response = output.result.response ?? "";
1093
+ const events = output.events;
1094
+ const expectation = testCase.expect ?? {};
1095
+ const checks = [];
1096
+ if (expectation.contains) {
1097
+ checks.push(response.includes(expectation.contains));
1098
+ }
1099
+ if (typeof expectation.maxSteps === "number") {
1100
+ checks.push(output.result.steps <= expectation.maxSteps);
1101
+ }
1102
+ if (typeof expectation.maxTokens === "number") {
1103
+ checks.push(
1104
+ output.result.tokens.input + output.result.tokens.output <= expectation.maxTokens
1105
+ );
1106
+ }
1107
+ if (expectation.refusal) {
1108
+ checks.push(
1109
+ response.toLowerCase().includes("can't") || response.toLowerCase().includes("cannot")
1110
+ );
1111
+ }
1112
+ if (expectation.toolCalled) {
1113
+ checks.push(
1114
+ events.some(
1115
+ (event) => event.type === "tool:started" && event.tool === expectation.toolCalled
1116
+ )
1117
+ );
1118
+ }
1119
+ const ok = checks.length === 0 ? output.result.status === "completed" : checks.every(Boolean);
1120
+ if (ok) {
1121
+ passed += 1;
1122
+ process.stdout.write(`PASS ${testCase.name}
1123
+ `);
1124
+ } else {
1125
+ failed += 1;
1126
+ process.stdout.write(`FAIL ${testCase.name}
1127
+ `);
1128
+ }
1129
+ } catch (error) {
1130
+ failed += 1;
1131
+ process.stdout.write(
1132
+ `FAIL ${testCase.name} (${error instanceof Error ? error.message : "Unknown test error"})
1133
+ `
1134
+ );
1135
+ }
1136
+ }
1137
+ process.stdout.write(`
1138
+ Test summary: ${passed} passed, ${failed} failed
1139
+ `);
1140
+ return { passed, failed };
1141
+ };
1142
+ var buildTarget = async (workingDir, target) => {
1143
+ const outDir = resolve(workingDir, ".agentl-build", target);
1144
+ await mkdir(outDir, { recursive: true });
1145
+ const serverEntrypoint = `import { startDevServer } from "agentl";
1146
+
1147
+ const port = Number.parseInt(process.env.PORT ?? "3000", 10);
1148
+ await startDevServer(Number.isNaN(port) ? 3000 : port, { workingDir: process.cwd() });
1149
+ `;
1150
+ const runtimePackageJson = JSON.stringify(
1151
+ {
1152
+ name: "agentl-runtime-bundle",
1153
+ private: true,
1154
+ type: "module",
1155
+ scripts: {
1156
+ start: "node server.js"
1157
+ },
1158
+ dependencies: {
1159
+ agentl: "^0.1.0"
1160
+ }
1161
+ },
1162
+ null,
1163
+ 2
1164
+ );
1165
+ if (target === "vercel") {
1166
+ await mkdir(resolve(outDir, "api"), { recursive: true });
1167
+ await copyIfExists(resolve(workingDir, "AGENT.md"), resolve(outDir, "AGENT.md"));
1168
+ await copyIfExists(
1169
+ resolve(workingDir, "agentl.config.js"),
1170
+ resolve(outDir, "agentl.config.js")
1171
+ );
1172
+ await copyIfExists(resolve(workingDir, "skills"), resolve(outDir, "skills"));
1173
+ await copyIfExists(resolve(workingDir, "tests"), resolve(outDir, "tests"));
1174
+ await writeFile(
1175
+ resolve(outDir, "vercel.json"),
1176
+ JSON.stringify(
1177
+ {
1178
+ version: 2,
1179
+ builds: [
1180
+ {
1181
+ src: "api/index.js",
1182
+ use: "@vercel/node@3.2.24",
1183
+ config: {
1184
+ includeFiles: [
1185
+ "AGENT.md",
1186
+ "agentl.config.js",
1187
+ "skills/**",
1188
+ "tests/**"
1189
+ ],
1190
+ supportsResponseStreaming: true
1191
+ }
1192
+ }
1193
+ ],
1194
+ routes: [{ src: "/(.*)", dest: "/api/index.js" }]
1195
+ },
1196
+ null,
1197
+ 2
1198
+ ),
1199
+ "utf8"
1200
+ );
1201
+ await buildVercelHandlerBundle(outDir);
1202
+ await writeFile(
1203
+ resolve(outDir, "package.json"),
1204
+ JSON.stringify(
1205
+ {
1206
+ private: true,
1207
+ type: "module",
1208
+ engines: {
1209
+ node: "20.x"
1210
+ },
1211
+ dependencies: VERCEL_RUNTIME_DEPENDENCIES
1212
+ },
1213
+ null,
1214
+ 2
1215
+ ),
1216
+ "utf8"
1217
+ );
1218
+ } else if (target === "docker") {
1219
+ await writeFile(
1220
+ resolve(outDir, "Dockerfile"),
1221
+ `FROM node:20-slim
1222
+ WORKDIR /app
1223
+ COPY package.json package.json
1224
+ COPY AGENT.md AGENT.md
1225
+ COPY agentl.config.js agentl.config.js
1226
+ COPY skills skills
1227
+ COPY tests tests
1228
+ COPY .env.example .env.example
1229
+ RUN corepack enable && npm install -g agentl
1230
+ COPY server.js server.js
1231
+ EXPOSE 3000
1232
+ CMD ["node","server.js"]
1233
+ `,
1234
+ "utf8"
1235
+ );
1236
+ await writeFile(resolve(outDir, "server.js"), serverEntrypoint, "utf8");
1237
+ await writeFile(resolve(outDir, "package.json"), runtimePackageJson, "utf8");
1238
+ } else if (target === "lambda") {
1239
+ await writeFile(
1240
+ resolve(outDir, "lambda-handler.js"),
1241
+ `import { startDevServer } from "agentl";
1242
+ let serverPromise;
1243
+ export const handler = async (event = {}) => {
1244
+ if (!serverPromise) {
1245
+ serverPromise = startDevServer(0, { workingDir: process.cwd() });
1246
+ }
1247
+ const body = JSON.stringify({
1248
+ status: "ready",
1249
+ route: event.rawPath ?? event.path ?? "/",
1250
+ });
1251
+ return { statusCode: 200, headers: { "content-type": "application/json" }, body };
1252
+ };
1253
+ `,
1254
+ "utf8"
1255
+ );
1256
+ await writeFile(resolve(outDir, "package.json"), runtimePackageJson, "utf8");
1257
+ } else if (target === "fly") {
1258
+ await writeFile(
1259
+ resolve(outDir, "fly.toml"),
1260
+ `app = "agentl-app"
1261
+ [env]
1262
+ PORT = "3000"
1263
+ [http_service]
1264
+ internal_port = 3000
1265
+ force_https = true
1266
+ auto_start_machines = true
1267
+ auto_stop_machines = "stop"
1268
+ min_machines_running = 0
1269
+ `,
1270
+ "utf8"
1271
+ );
1272
+ await writeFile(
1273
+ resolve(outDir, "Dockerfile"),
1274
+ `FROM node:20-slim
1275
+ WORKDIR /app
1276
+ COPY package.json package.json
1277
+ COPY AGENT.md AGENT.md
1278
+ COPY agentl.config.js agentl.config.js
1279
+ COPY skills skills
1280
+ COPY tests tests
1281
+ RUN npm install -g agentl
1282
+ COPY server.js server.js
1283
+ EXPOSE 3000
1284
+ CMD ["node","server.js"]
1285
+ `,
1286
+ "utf8"
1287
+ );
1288
+ await writeFile(resolve(outDir, "server.js"), serverEntrypoint, "utf8");
1289
+ await writeFile(resolve(outDir, "package.json"), runtimePackageJson, "utf8");
1290
+ } else {
1291
+ throw new Error(`Unsupported build target: ${target}`);
1292
+ }
1293
+ process.stdout.write(`Build artifacts generated at ${outDir}
1294
+ `);
1295
+ };
1296
+ var normalizeMcpName = (entry) => entry.name ?? entry.url ?? `mcp_${Date.now()}`;
1297
+ var mcpAdd = async (workingDir, options) => {
1298
+ const config = await loadAgentlConfig(workingDir) ?? { mcp: [] };
1299
+ const mcp = [...config.mcp ?? []];
1300
+ if (!options.url) {
1301
+ throw new Error("Remote MCP only: provide --url for a remote MCP server.");
1302
+ }
1303
+ mcp.push({
1304
+ name: options.name ?? normalizeMcpName({ url: options.url }),
1305
+ url: options.url,
1306
+ env: options.envVars ?? []
1307
+ });
1308
+ await writeConfigFile(workingDir, { ...config, mcp });
1309
+ process.stdout.write("MCP server added.\n");
1310
+ };
1311
+ var mcpList = async (workingDir) => {
1312
+ const config = await loadAgentlConfig(workingDir);
1313
+ const mcp = config?.mcp ?? [];
1314
+ if (mcp.length === 0) {
1315
+ process.stdout.write("No MCP servers configured.\n");
1316
+ return;
1317
+ }
1318
+ process.stdout.write("Configured MCP servers:\n");
1319
+ for (const entry of mcp) {
1320
+ process.stdout.write(`- ${entry.name ?? entry.url} (remote: ${entry.url})
1321
+ `);
1322
+ }
1323
+ };
1324
+ var mcpRemove = async (workingDir, name) => {
1325
+ const config = await loadAgentlConfig(workingDir) ?? { mcp: [] };
1326
+ const before = config.mcp ?? [];
1327
+ const filtered = before.filter((entry) => normalizeMcpName(entry) !== name);
1328
+ await writeConfigFile(workingDir, { ...config, mcp: filtered });
1329
+ process.stdout.write(`Removed MCP server: ${name}
1330
+ `);
1331
+ };
1332
+ var buildCli = () => {
1333
+ const program = new Command();
1334
+ program.name("agentl").description("CLI for building and running AgentL agents").version("0.1.0");
1335
+ program.command("init").argument("<name>", "project name").option("--configure", "run full onboarding setup", false).option("--yes", "accept defaults and skip prompts", false).description("Scaffold a new AgentL project").action(async (name, options) => {
1336
+ await initProject(name, {
1337
+ onboarding: {
1338
+ mode: options.configure ? "full" : "light",
1339
+ yes: options.yes,
1340
+ interactive: !options.yes && process.stdin.isTTY === true && process.stdout.isTTY === true
1341
+ }
1342
+ });
1343
+ });
1344
+ program.command("dev").description("Run local development server").option("--port <port>", "server port", "3000").action(async (options) => {
1345
+ const port = Number.parseInt(options.port, 10);
1346
+ await startDevServer(Number.isNaN(port) ? 3e3 : port);
1347
+ });
1348
+ program.command("run").argument("[task]", "task to run").description("Execute the agent once").option("--param <keyValue>", "parameter key=value", (value, all) => {
1349
+ all.push(value);
1350
+ return all;
1351
+ }, []).option("--file <path>", "include file contents", (value, all) => {
1352
+ all.push(value);
1353
+ return all;
1354
+ }, []).option("--json", "output json", false).option("--interactive", "run in interactive mode", false).action(
1355
+ async (task, options) => {
1356
+ const params = parseParams(options.param);
1357
+ if (options.interactive) {
1358
+ await runInteractive(process.cwd(), params);
1359
+ return;
1360
+ }
1361
+ if (!task) {
1362
+ throw new Error("Task is required unless --interactive is used.");
1363
+ }
1364
+ await runOnce(task, {
1365
+ params,
1366
+ json: options.json,
1367
+ filePaths: options.file
1368
+ });
1369
+ }
1370
+ );
1371
+ program.command("tools").description("List all tools available to the agent").action(async () => {
1372
+ await listTools(process.cwd());
1373
+ });
1374
+ program.command("add").argument("<packageOrPath>", "skill package name/path").description("Add a skill package and validate SKILL.md").action(async (packageOrPath) => {
1375
+ await addSkill(process.cwd(), packageOrPath);
1376
+ });
1377
+ program.command("update-agent").description("Backfill latest default guidance into AGENT.md").action(async () => {
1378
+ await updateAgentGuidance(process.cwd());
1379
+ });
1380
+ program.command("test").argument("[file]", "test file path (yaml)").description("Run yaml-defined agent tests").action(async (file) => {
1381
+ const testFile = file ? resolve(process.cwd(), file) : void 0;
1382
+ const result = await runTests(process.cwd(), testFile);
1383
+ if (result.failed > 0) {
1384
+ process.exitCode = 1;
1385
+ }
1386
+ });
1387
+ program.command("build").argument("<target>", "vercel|docker|lambda|fly").description("Generate build artifacts for deployment target").action(async (target) => {
1388
+ await buildTarget(process.cwd(), target);
1389
+ });
1390
+ const mcpCommand = program.command("mcp").description("Manage MCP servers");
1391
+ mcpCommand.command("add").requiredOption("--url <url>", "remote MCP url").option("--name <name>", "server name").option("--env <name>", "env variable (repeatable)", (value, all) => {
1392
+ all.push(value);
1393
+ return all;
1394
+ }, []).action(
1395
+ async (options) => {
1396
+ await mcpAdd(process.cwd(), {
1397
+ url: options.url,
1398
+ name: options.name,
1399
+ envVars: options.env
1400
+ });
1401
+ }
1402
+ );
1403
+ mcpCommand.command("list").description("List configured MCP servers").action(async () => {
1404
+ await mcpList(process.cwd());
1405
+ });
1406
+ mcpCommand.command("remove").argument("<name>", "server name").description("Remove an MCP server by name").action(async (name) => {
1407
+ await mcpRemove(process.cwd(), name);
1408
+ });
1409
+ return program;
1410
+ };
1411
+ var main = async (argv = process.argv) => {
1412
+ try {
1413
+ await buildCli().parseAsync(argv);
1414
+ } catch (error) {
1415
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "EADDRINUSE") {
1416
+ const message = "Port is already in use. Try `agentl dev --port 3001` or stop the process using port 3000.";
1417
+ process.stderr.write(`${message}
1418
+ `);
1419
+ process.exitCode = 1;
1420
+ return;
1421
+ }
1422
+ process.stderr.write(`${error instanceof Error ? error.message : "Unknown CLI error"}
1423
+ `);
1424
+ process.exitCode = 1;
1425
+ }
1426
+ };
1427
+ var packageRoot = resolve(__dirname, "..");
1428
+
1429
+ export {
1430
+ initProject,
1431
+ updateAgentGuidance,
1432
+ createRequestHandler,
1433
+ startDevServer,
1434
+ runOnce,
1435
+ runInteractive,
1436
+ listTools,
1437
+ addSkill,
1438
+ runTests,
1439
+ buildTarget,
1440
+ mcpAdd,
1441
+ mcpList,
1442
+ mcpRemove,
1443
+ buildCli,
1444
+ main,
1445
+ packageRoot
1446
+ };