@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,587 @@
1
+ import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ import type { AgentEvent, Message } from "@poncho-ai/sdk";
6
+ import { FileConversationStore, getRequestIp, parseCookies } from "../src/web-ui.js";
7
+ import { buildConfigFromOnboardingAnswers, runInitOnboarding } from "../src/init-onboarding.js";
8
+ import {
9
+ consumeFirstRunIntro,
10
+ initializeOnboardingMarker,
11
+ } from "../src/init-feature-context.js";
12
+
13
+ vi.mock("@poncho-ai/harness", () => ({
14
+ AgentHarness: class MockHarness {
15
+ async initialize(): Promise<void> {}
16
+ listTools(): Array<{ name: string; description: string }> {
17
+ return [{ name: "echo", description: "Echo tool" }];
18
+ }
19
+
20
+ async *run(): AsyncGenerator<{
21
+ type:
22
+ | "run:started"
23
+ | "step:started"
24
+ | "model:chunk"
25
+ | "step:completed"
26
+ | "run:completed";
27
+ [key: string]: unknown;
28
+ }> {
29
+ yield { type: "run:started", runId: "run_test", agentId: "test-agent" };
30
+ yield { type: "step:started", step: 1 };
31
+ yield { type: "model:chunk", content: "hello" };
32
+ yield { type: "step:completed", step: 1, duration: 1 };
33
+ yield {
34
+ type: "run:completed",
35
+ runId: "run_test",
36
+ result: {
37
+ status: "completed",
38
+ response: "hello",
39
+ steps: 1,
40
+ tokens: { input: 1, output: 1, cached: 0 },
41
+ duration: 1,
42
+ },
43
+ };
44
+ }
45
+
46
+ async runToCompletion(input: { task: string; messages?: Message[] }): Promise<{
47
+ runId: string;
48
+ result: {
49
+ status: "completed";
50
+ response: string;
51
+ steps: number;
52
+ tokens: { input: number; output: number; cached: number };
53
+ duration: number;
54
+ };
55
+ events: AgentEvent[];
56
+ messages: Message[];
57
+ }> {
58
+ return {
59
+ runId: "run_test",
60
+ result: {
61
+ status: "completed",
62
+ response: input.task,
63
+ steps: 1,
64
+ tokens: { input: 1, output: 1, cached: 0 },
65
+ duration: 1,
66
+ },
67
+ events: [
68
+ { type: "run:started", runId: "run_test", agentId: "test-agent" },
69
+ {
70
+ type: "run:completed",
71
+ runId: "run_test",
72
+ result: {
73
+ status: "completed",
74
+ response: input.task,
75
+ steps: 1,
76
+ tokens: { input: 1, output: 1, cached: 0 },
77
+ duration: 1,
78
+ },
79
+ },
80
+ ],
81
+ messages: [
82
+ ...(input.messages ?? []),
83
+ { role: "user", content: input.task },
84
+ { role: "assistant", content: input.task },
85
+ ],
86
+ };
87
+ }
88
+ },
89
+ loadPonchoConfig: async () => ({
90
+ auth: { required: false },
91
+ state: { provider: "memory", ttl: 3600 },
92
+ telemetry: { enabled: false },
93
+ }),
94
+ resolveStateConfig: (config: { state?: unknown }) => config.state,
95
+ createStateStore: () => {
96
+ const map = new Map<string, { runId: string; messages: Message[]; updatedAt: number }>();
97
+ return {
98
+ get: async (runId: string) => map.get(runId),
99
+ set: async (state: { runId: string; messages: Message[]; updatedAt: number }) => {
100
+ map.set(state.runId, state);
101
+ },
102
+ delete: async (runId: string) => {
103
+ map.delete(runId);
104
+ },
105
+ };
106
+ },
107
+ createConversationStore: () => {
108
+ const store = new FileConversationStore(process.cwd());
109
+ return {
110
+ list: (ownerId?: string) => store.list(ownerId),
111
+ get: (conversationId: string) => store.get(conversationId),
112
+ create: (ownerId?: string, title?: string) => store.create(ownerId, title),
113
+ update: (conversation: Awaited<ReturnType<FileConversationStore["create"]>>) =>
114
+ store.update(conversation),
115
+ rename: (conversationId: string, title: string) => store.rename(conversationId, title),
116
+ delete: (conversationId: string) => store.delete(conversationId),
117
+ };
118
+ },
119
+ InMemoryStateStore: class {},
120
+ TelemetryEmitter: class {
121
+ async emit(): Promise<void> {}
122
+ },
123
+ }));
124
+
125
+ import {
126
+ buildTarget,
127
+ initProject,
128
+ listTools,
129
+ mcpAdd,
130
+ mcpList,
131
+ mcpRemove,
132
+ runTests,
133
+ startDevServer,
134
+ updateAgentGuidance,
135
+ } from "../src/index.js";
136
+
137
+ describe("cli", () => {
138
+ let tempDir = "";
139
+
140
+ beforeEach(async () => {
141
+ tempDir = await mkdtemp(join(tmpdir(), "poncho-cli-"));
142
+ });
143
+
144
+ it("scaffolds a project with init", async () => {
145
+ await initProject("my-agent", { workingDir: tempDir });
146
+ const agentMarkdown = await readFile(join(tempDir, "my-agent", "AGENT.md"), "utf8");
147
+ const pkgJson = await readFile(join(tempDir, "my-agent", "package.json"), "utf8");
148
+ const skillManifest = await readFile(
149
+ join(tempDir, "my-agent", "skills", "starter", "SKILL.md"),
150
+ "utf8",
151
+ );
152
+ const skillTool = await readFile(
153
+ join(tempDir, "my-agent", "skills", "starter", "scripts", "starter-echo.ts"),
154
+ "utf8",
155
+ );
156
+ const basicTest = await readFile(join(tempDir, "my-agent", "tests", "basic.yaml"), "utf8");
157
+
158
+ expect(agentMarkdown).toContain("name: my-agent");
159
+ expect(pkgJson).toContain('"name": "my-agent"');
160
+ expect(skillManifest).toContain("name: starter-skill");
161
+ expect(skillTool).toContain("export default async function run(input)");
162
+ expect(basicTest).toContain('name: "Basic sanity"');
163
+ });
164
+
165
+ it("builds onboarding config with light defaults", async () => {
166
+ const result = await runInitOnboarding({
167
+ yes: true,
168
+ interactive: false,
169
+ });
170
+ expect(result.config.storage?.provider).toBe("local");
171
+ expect(result.config.telemetry?.enabled).toBe(true);
172
+ expect(result.agentModel.provider).toBe("anthropic");
173
+ });
174
+
175
+ it("supports onboarding scaffold defaults via init options", async () => {
176
+ await initProject("default-agent", {
177
+ workingDir: tempDir,
178
+ onboarding: { yes: true, interactive: false },
179
+ });
180
+ const configFile = await readFile(
181
+ join(tempDir, "default-agent", "poncho.config.js"),
182
+ "utf8",
183
+ );
184
+ expect(configFile).toContain('"storage"');
185
+ expect(configFile).toContain('"memory"');
186
+ expect(configFile).toContain('"auth"');
187
+ });
188
+
189
+ it("creates onboarding marker and emits intro only once", async () => {
190
+ const projectDir = join(tempDir, "intro-agent");
191
+ await mkdir(projectDir, { recursive: true });
192
+ await initializeOnboardingMarker(projectDir);
193
+ const firstIntro = await consumeFirstRunIntro(projectDir, {
194
+ agentName: "IntroAgent",
195
+ provider: "anthropic",
196
+ model: "claude-opus-4-5",
197
+ config: buildConfigFromOnboardingAnswers({
198
+ "model.provider": "anthropic",
199
+ "storage.provider": "local",
200
+ "storage.memory.enabled": true,
201
+ "auth.required": false,
202
+ "telemetry.enabled": true,
203
+ }),
204
+ });
205
+ const secondIntro = await consumeFirstRunIntro(projectDir, {
206
+ agentName: "IntroAgent",
207
+ provider: "anthropic",
208
+ model: "claude-opus-4-5",
209
+ config: undefined,
210
+ });
211
+ expect(firstIntro).toContain("I can configure myself directly by chat");
212
+ expect(secondIntro).toBeUndefined();
213
+ });
214
+
215
+ it("emits intro for interactive init even when config differs from defaults", async () => {
216
+ await initProject("interactive-custom-agent", {
217
+ workingDir: tempDir,
218
+ onboarding: { yes: false, interactive: false },
219
+ });
220
+ const projectDir = join(tempDir, "interactive-custom-agent");
221
+ const intro = await consumeFirstRunIntro(projectDir, {
222
+ agentName: "InteractiveCustomAgent",
223
+ provider: "openai",
224
+ model: "gpt-4.1",
225
+ config: buildConfigFromOnboardingAnswers({
226
+ "model.provider": "openai",
227
+ "storage.provider": "memory",
228
+ "storage.memory.enabled": false,
229
+ "auth.required": true,
230
+ "telemetry.enabled": false,
231
+ }),
232
+ });
233
+ expect(intro).toContain("I can configure myself directly by chat");
234
+ });
235
+
236
+ it("does not emit intro for init defaults created with --yes behavior", async () => {
237
+ await initProject("no-intro-agent", { workingDir: tempDir });
238
+ const projectDir = join(tempDir, "no-intro-agent");
239
+ const intro = await consumeFirstRunIntro(projectDir, {
240
+ agentName: "NoIntroAgent",
241
+ provider: "anthropic",
242
+ model: "claude-opus-4-5",
243
+ config: buildConfigFromOnboardingAnswers({
244
+ "model.provider": "anthropic",
245
+ "storage.provider": "local",
246
+ "storage.memory.enabled": true,
247
+ "auth.required": false,
248
+ "telemetry.enabled": true,
249
+ }),
250
+ });
251
+ expect(intro).toBeUndefined();
252
+ });
253
+
254
+ it("supports smoke flow init -> dev -> api conversation endpoint", async () => {
255
+ await initProject("smoke-agent", { workingDir: tempDir });
256
+ const projectDir = join(tempDir, "smoke-agent");
257
+
258
+ const port = 43000 + Math.floor(Math.random() * 1000);
259
+ const server = await startDevServer(port, { workingDir: projectDir });
260
+
261
+ const health = await fetch(`http://localhost:${port}/health`);
262
+ expect(health.status).toBe(200);
263
+
264
+ const createdConversation = await fetch(`http://localhost:${port}/api/conversations`, {
265
+ method: "POST",
266
+ headers: { "Content-Type": "application/json" },
267
+ body: JSON.stringify({ title: "smoke" }),
268
+ });
269
+ expect(createdConversation.status).toBe(201);
270
+ const createdConversationPayload = (await createdConversation.json()) as {
271
+ conversation: { conversationId: string };
272
+ };
273
+ const conversationId = createdConversationPayload.conversation.conversationId;
274
+
275
+ const streamResponse = await fetch(
276
+ `http://localhost:${port}/api/conversations/${conversationId}/messages`,
277
+ {
278
+ method: "POST",
279
+ headers: { "Content-Type": "application/json" },
280
+ body: JSON.stringify({ message: "hello" }),
281
+ },
282
+ );
283
+ expect(streamResponse.status).toBe(200);
284
+ const streamPayload = await streamResponse.text();
285
+ expect(streamPayload).toContain("event: model:chunk");
286
+
287
+ const getConversation = await fetch(`http://localhost:${port}/api/conversations/${conversationId}`);
288
+ expect(getConversation.status).toBe(200);
289
+ const payload = (await getConversation.json()) as {
290
+ conversation: { messages: Message[] };
291
+ };
292
+ expect(payload.conversation.messages.at(-1)?.content).toBe("hello");
293
+
294
+ const legacyRunSync = await fetch(`http://localhost:${port}/run/sync`, {
295
+ method: "POST",
296
+ headers: { "Content-Type": "application/json" },
297
+ body: JSON.stringify({ task: "legacy" }),
298
+ });
299
+ expect(legacyRunSync.status).toBe(404);
300
+ const legacyContinue = await fetch(`http://localhost:${port}/continue`, {
301
+ method: "POST",
302
+ headers: { "Content-Type": "application/json" },
303
+ body: JSON.stringify({ runId: "run_test", message: "next" }),
304
+ });
305
+ expect(legacyContinue.status).toBe(404);
306
+
307
+ await new Promise<void>((resolveClose, rejectClose) => {
308
+ server.close((error) => {
309
+ if (error) {
310
+ rejectClose(error);
311
+ return;
312
+ }
313
+ resolveClose();
314
+ });
315
+ });
316
+ });
317
+
318
+ it("supports web ui auth and conversation routes", async () => {
319
+ await initProject("webui-agent", { workingDir: tempDir });
320
+ const projectDir = join(tempDir, "webui-agent");
321
+ process.env.AGENT_UI_PASSPHRASE = "very-secret-passphrase";
322
+
323
+ const port = 44000 + Math.floor(Math.random() * 1000);
324
+ const server = await startDevServer(port, { workingDir: projectDir });
325
+ try {
326
+ const sessionState = await fetch(`http://localhost:${port}/api/auth/session`);
327
+ const sessionPayload = (await sessionState.json()) as { authenticated: boolean };
328
+ expect(sessionPayload.authenticated).toBe(false);
329
+
330
+ const login = await fetch(`http://localhost:${port}/api/auth/login`, {
331
+ method: "POST",
332
+ headers: { "Content-Type": "application/json" },
333
+ body: JSON.stringify({ passphrase: "very-secret-passphrase" }),
334
+ });
335
+ expect(login.status).toBe(200);
336
+ const loginPayload = (await login.json()) as { csrfToken: string };
337
+ const setCookieHeader = login.headers.get("set-cookie");
338
+ expect(setCookieHeader).toContain("poncho_session=");
339
+ const cookie = (setCookieHeader ?? "").split(";")[0] ?? "";
340
+
341
+ const conversationCreate = await fetch(`http://localhost:${port}/api/conversations`, {
342
+ method: "POST",
343
+ headers: {
344
+ "Content-Type": "application/json",
345
+ Cookie: cookie,
346
+ "x-csrf-token": loginPayload.csrfToken,
347
+ },
348
+ body: JSON.stringify({ title: "My test conversation" }),
349
+ });
350
+ expect(conversationCreate.status).toBe(201);
351
+ const createdPayload = (await conversationCreate.json()) as {
352
+ conversation: { conversationId: string };
353
+ };
354
+ const conversationId = createdPayload.conversation.conversationId;
355
+
356
+ const streamResponse = await fetch(
357
+ `http://localhost:${port}/api/conversations/${conversationId}/messages`,
358
+ {
359
+ method: "POST",
360
+ headers: {
361
+ "Content-Type": "application/json",
362
+ Cookie: cookie,
363
+ "x-csrf-token": loginPayload.csrfToken,
364
+ },
365
+ body: JSON.stringify({ message: "hello from web ui" }),
366
+ },
367
+ );
368
+ expect(streamResponse.status).toBe(200);
369
+ const streamText = await streamResponse.text();
370
+ expect(streamText).toContain("event: model:chunk");
371
+
372
+ const conversationRead = await fetch(
373
+ `http://localhost:${port}/api/conversations/${conversationId}`,
374
+ {
375
+ headers: {
376
+ Cookie: cookie,
377
+ },
378
+ },
379
+ );
380
+ expect(conversationRead.status).toBe(200);
381
+ const conversationPayload = (await conversationRead.json()) as {
382
+ conversation: { messages: Message[] };
383
+ };
384
+ expect(conversationPayload.conversation.messages.length).toBeGreaterThan(0);
385
+ } finally {
386
+ delete process.env.AGENT_UI_PASSPHRASE;
387
+ await new Promise<void>((resolveClose, rejectClose) => {
388
+ server.close((error) => {
389
+ if (error) {
390
+ rejectClose(error);
391
+ return;
392
+ }
393
+ resolveClose();
394
+ });
395
+ });
396
+ }
397
+ });
398
+
399
+ it("persists conversation data in shared user store", async () => {
400
+ const projectDir = join(tempDir, "store-agent");
401
+ await mkdir(projectDir, { recursive: true });
402
+ const store = new FileConversationStore(projectDir);
403
+
404
+ const created = await store.create("local-owner", "store test");
405
+ expect(created.messages).toHaveLength(0);
406
+
407
+ created.messages = [
408
+ { role: "user", content: "hi" },
409
+ { role: "assistant", content: "hello" },
410
+ ];
411
+ await store.update(created);
412
+
413
+ const listed = await store.list("local-owner");
414
+ expect(listed.length).toBeGreaterThan(0);
415
+ expect(listed[0]?.conversationId).toBe(created.conversationId);
416
+
417
+ const opened = await store.get(created.conversationId);
418
+ expect(opened?.messages.length).toBe(2);
419
+
420
+ const removed = await store.delete(created.conversationId);
421
+ expect(removed).toBe(true);
422
+ });
423
+
424
+ it("parses malformed cookies without throwing", () => {
425
+ const request = {
426
+ headers: {
427
+ cookie: "ok=value; bad=%E0%A4%A",
428
+ },
429
+ } as unknown as import("node:http").IncomingMessage;
430
+ const parsed = parseCookies(request);
431
+ expect(parsed.ok).toBe("value");
432
+ expect(parsed.bad).toBe("%E0%A4%A");
433
+ });
434
+
435
+ it("uses socket remote address for request ip", () => {
436
+ const request = {
437
+ headers: {
438
+ "x-forwarded-for": "1.2.3.4",
439
+ },
440
+ socket: {
441
+ remoteAddress: "127.0.0.1",
442
+ },
443
+ } as unknown as import("node:http").IncomingMessage;
444
+ expect(getRequestIp(request)).toBe("127.0.0.1");
445
+ });
446
+
447
+ it("supports web ui passphrase auth in production mode", async () => {
448
+ await initProject("webui-prod-agent", { workingDir: tempDir });
449
+ const projectDir = join(tempDir, "webui-prod-agent");
450
+ process.env.AGENT_UI_PASSPHRASE = "prod-secret-passphrase";
451
+ process.env.NODE_ENV = "production";
452
+
453
+ const port = 45000 + Math.floor(Math.random() * 1000);
454
+ const server = await startDevServer(port, { workingDir: projectDir });
455
+ try {
456
+ const login = await fetch(`http://localhost:${port}/api/auth/login`, {
457
+ method: "POST",
458
+ headers: { "Content-Type": "application/json" },
459
+ body: JSON.stringify({ passphrase: "prod-secret-passphrase" }),
460
+ });
461
+ expect(login.status).toBe(200);
462
+ const setCookieHeader = login.headers.get("set-cookie") ?? "";
463
+ expect(setCookieHeader).toContain("poncho_session=");
464
+ expect(setCookieHeader).toContain("Secure");
465
+ } finally {
466
+ delete process.env.AGENT_UI_PASSPHRASE;
467
+ delete process.env.NODE_ENV;
468
+ await new Promise<void>((resolveClose, rejectClose) => {
469
+ server.close((error) => {
470
+ if (error) {
471
+ rejectClose(error);
472
+ return;
473
+ }
474
+ resolveClose();
475
+ });
476
+ });
477
+ }
478
+ });
479
+
480
+ it("supports auxiliary commands and config updates", async () => {
481
+ await initProject("aux-agent", { workingDir: tempDir });
482
+ const projectDir = join(tempDir, "aux-agent");
483
+
484
+ await listTools(projectDir);
485
+ await mcpAdd(projectDir, { url: "wss://example.com/mcp", name: "remote-mcp" });
486
+ await mcpList(projectDir);
487
+ await mcpRemove(projectDir, "remote-mcp");
488
+
489
+ await buildTarget(projectDir, "vercel");
490
+ await buildTarget(projectDir, "docker");
491
+ await buildTarget(projectDir, "lambda");
492
+ await buildTarget(projectDir, "fly");
493
+ const vercelConfig = await readFile(
494
+ join(projectDir, ".poncho-build", "vercel", "vercel.json"),
495
+ "utf8",
496
+ );
497
+ const dockerFile = await readFile(
498
+ join(projectDir, ".poncho-build", "docker", "Dockerfile"),
499
+ "utf8",
500
+ );
501
+ const lambdaHandler = await readFile(
502
+ join(projectDir, ".poncho-build", "lambda", "lambda-handler.js"),
503
+ "utf8",
504
+ );
505
+ const flyToml = await readFile(
506
+ join(projectDir, ".poncho-build", "fly", "fly.toml"),
507
+ "utf8",
508
+ );
509
+ expect(vercelConfig).toContain('"functions"');
510
+ expect(vercelConfig).toContain('"routes"');
511
+ expect(vercelConfig).not.toContain('"builds"');
512
+ expect(dockerFile).toContain("CMD [\"node\",\"server.js\"]");
513
+ expect(lambdaHandler).toContain("export const handler");
514
+ expect(flyToml).toContain("internal_port = 3000");
515
+
516
+ const testsDir = join(projectDir, "tests");
517
+ await mkdir(testsDir, { recursive: true });
518
+ await writeFile(
519
+ join(testsDir, "basic.yaml"),
520
+ `tests:\n - name: basic\n task: hello\n expect:\n contains: hello\n`,
521
+ "utf8",
522
+ );
523
+ const result = await runTests(projectDir, join(testsDir, "basic.yaml"));
524
+ expect(result.passed).toBe(1);
525
+ expect(result.failed).toBe(0);
526
+ });
527
+
528
+ it("does not modify AGENT.md when no deprecated embedded guidance exists", async () => {
529
+ const projectDir = join(tempDir, "legacy-agent");
530
+ await mkdir(projectDir, { recursive: true });
531
+ await writeFile(
532
+ join(projectDir, "AGENT.md"),
533
+ `---
534
+ name: legacy-agent
535
+ ---
536
+
537
+ # Legacy Agent
538
+
539
+ Old instructions only.
540
+ `,
541
+ "utf8",
542
+ );
543
+
544
+ const changed = await updateAgentGuidance(projectDir);
545
+ const updated = await readFile(join(projectDir, "AGENT.md"), "utf8");
546
+
547
+ expect(changed).toBe(false);
548
+ expect(updated).toContain("Old instructions only.");
549
+ });
550
+
551
+ it("removes deprecated embedded local guidance sections", async () => {
552
+ const projectDir = join(tempDir, "legacy-agent-guidance");
553
+ await mkdir(projectDir, { recursive: true });
554
+ await writeFile(
555
+ join(projectDir, "AGENT.md"),
556
+ `---
557
+ name: legacy-agent
558
+ ---
559
+
560
+ # Legacy Agent
561
+
562
+ ## Configuration Assistant Context
563
+
564
+ Old local config guidance that should be removed.
565
+
566
+ ## Skill Authoring Guidance
567
+
568
+ Old guidance that should be removed.
569
+
570
+ ## Other Section
571
+
572
+ Keep this section.
573
+ `,
574
+ "utf8",
575
+ );
576
+
577
+ const changed = await updateAgentGuidance(projectDir);
578
+ const updated = await readFile(join(projectDir, "AGENT.md"), "utf8");
579
+
580
+ expect(changed).toBe(true);
581
+ expect(updated).not.toContain("## Configuration Assistant Context");
582
+ expect(updated).not.toContain("## Skill Authoring Guidance");
583
+ expect(updated).not.toContain("Old local config guidance that should be removed.");
584
+ expect(updated).not.toContain("Old guidance that should be removed.");
585
+ expect(updated).toContain("## Other Section");
586
+ });
587
+ });
@@ -0,0 +1,48 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import type { PonchoConfig } from "@poncho-ai/harness";
3
+ import { resolveMemoryConfig, resolveStateConfig } from "@poncho-ai/harness";
4
+ import { ONBOARDING_FIELDS } from "@poncho-ai/sdk";
5
+ import { buildConfigFromOnboardingAnswers } from "../src/init-onboarding.js";
6
+
7
+ type Primitive = string | number | boolean | bigint | symbol | null | undefined;
8
+ type Join<K extends string, P extends string> = `${K}.${P}`;
9
+ type DotPath<T> = T extends Primitive
10
+ ? never
11
+ : {
12
+ [K in keyof T & string]: NonNullable<T[K]> extends Primitive
13
+ ? K
14
+ : K | Join<K, DotPath<NonNullable<T[K]>>>;
15
+ }[keyof T & string];
16
+
17
+ type PonchoConfigPath = DotPath<PonchoConfig>;
18
+ type RegistryConfigPath = Extract<
19
+ (typeof ONBOARDING_FIELDS)[number],
20
+ { target: "config" }
21
+ >["path"];
22
+ type RegistryPathContract = RegistryConfigPath extends PonchoConfigPath ? true : never;
23
+ const REGISTRY_PATH_CONTRACT: RegistryPathContract = true;
24
+ void REGISTRY_PATH_CONTRACT;
25
+
26
+ describe("init onboarding registry contract", () => {
27
+ it("maps generated config into harness state and memory resolvers", () => {
28
+ const config = buildConfigFromOnboardingAnswers({
29
+ "model.provider": "openai",
30
+ "storage.provider": "upstash",
31
+ "storage.url": "https://example.upstash.io",
32
+ "storage.token": "token",
33
+ "storage.memory.enabled": true,
34
+ "storage.memory.maxRecallConversations": 10,
35
+ "auth.required": true,
36
+ "auth.type": "bearer",
37
+ "telemetry.enabled": true,
38
+ "telemetry.otlp": "http://localhost:4318",
39
+ });
40
+ const state = resolveStateConfig(config);
41
+ const memory = resolveMemoryConfig(config);
42
+
43
+ expect(state?.provider).toBe("upstash");
44
+ expect(state?.url).toBe("https://example.upstash.io");
45
+ expect(memory?.enabled).toBe(true);
46
+ expect(memory?.maxRecallConversations).toBe(10);
47
+ });
48
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "outDir": "./dist",
6
+ "jsx": "react-jsx"
7
+ },
8
+ "include": ["src/**/*.ts", "src/**/*.tsx"]
9
+ }