@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,153 @@
1
+ import { createHash } from "node:crypto";
2
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, resolve } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import type { PonchoConfig } from "@poncho-ai/harness";
6
+
7
+ type IntroInput = {
8
+ agentName: string;
9
+ provider: string;
10
+ model: string;
11
+ config: PonchoConfig | undefined;
12
+ };
13
+
14
+ type OnboardingMarkerState = {
15
+ introduced: boolean;
16
+ allowIntro: boolean;
17
+ onboardingVersion: number;
18
+ createdAt: number;
19
+ introducedAt?: number;
20
+ };
21
+
22
+ const ONBOARDING_VERSION = 1;
23
+
24
+ const getStateDirectory = (): string => {
25
+ const cwd = process.cwd();
26
+ const home = homedir();
27
+ const isServerless =
28
+ process.env.VERCEL === "1" ||
29
+ process.env.VERCEL_ENV !== undefined ||
30
+ process.env.VERCEL_URL !== undefined ||
31
+ process.env.AWS_LAMBDA_FUNCTION_NAME !== undefined ||
32
+ process.env.AWS_EXECUTION_ENV?.includes("AWS_Lambda") === true ||
33
+ process.env.LAMBDA_TASK_ROOT !== undefined ||
34
+ process.env.NOW_REGION !== undefined ||
35
+ cwd.startsWith("/var/task") ||
36
+ home.startsWith("/var/task") ||
37
+ process.env.SERVERLESS === "1";
38
+ if (isServerless) {
39
+ return "/tmp/.poncho/state";
40
+ }
41
+ return resolve(homedir(), ".poncho", "state");
42
+ };
43
+
44
+ const summarizeConfig = (config: PonchoConfig | undefined): string[] => {
45
+ const provider = config?.storage?.provider ?? config?.state?.provider ?? "local";
46
+ const memoryEnabled = config?.storage?.memory?.enabled ?? config?.memory?.enabled ?? false;
47
+ const authRequired = config?.auth?.required ?? false;
48
+ const telemetryEnabled = config?.telemetry?.enabled ?? true;
49
+ return [
50
+ `storage: ${provider}`,
51
+ `memory tools: ${memoryEnabled ? "enabled" : "disabled"}`,
52
+ `auth: ${authRequired ? "required" : "not required"}`,
53
+ `telemetry: ${telemetryEnabled ? "enabled" : "disabled"}`,
54
+ ];
55
+ };
56
+
57
+ const getOnboardingMarkerPath = (workingDir: string): string =>
58
+ resolve(
59
+ getStateDirectory(),
60
+ `${basename(workingDir).replace(/[^a-zA-Z0-9_-]+/g, "-") || "project"}-${createHash("sha256")
61
+ .update(workingDir)
62
+ .digest("hex")
63
+ .slice(0, 12)}-onboarding.json`,
64
+ );
65
+
66
+ const readMarker = async (
67
+ workingDir: string,
68
+ ): Promise<OnboardingMarkerState | undefined> => {
69
+ const markerPath = getOnboardingMarkerPath(workingDir);
70
+ try {
71
+ await access(markerPath);
72
+ } catch {
73
+ return undefined;
74
+ }
75
+ try {
76
+ const raw = await readFile(markerPath, "utf8");
77
+ return JSON.parse(raw) as OnboardingMarkerState;
78
+ } catch {
79
+ return undefined;
80
+ }
81
+ };
82
+
83
+ const writeMarker = async (
84
+ workingDir: string,
85
+ state: OnboardingMarkerState,
86
+ ): Promise<void> => {
87
+ const markerPath = getOnboardingMarkerPath(workingDir);
88
+ await mkdir(dirname(markerPath), { recursive: true });
89
+ await writeFile(markerPath, JSON.stringify(state, null, 2), "utf8");
90
+ };
91
+
92
+ export const initializeOnboardingMarker = async (
93
+ workingDir: string,
94
+ options?: { allowIntro?: boolean },
95
+ ): Promise<void> => {
96
+ const current = await readMarker(workingDir);
97
+ if (current) {
98
+ return;
99
+ }
100
+ const allowIntro = options?.allowIntro ?? true;
101
+ await writeMarker(workingDir, {
102
+ introduced: allowIntro ? false : true,
103
+ allowIntro,
104
+ onboardingVersion: ONBOARDING_VERSION,
105
+ createdAt: Date.now(),
106
+ });
107
+ };
108
+
109
+ export const consumeFirstRunIntro = async (
110
+ workingDir: string,
111
+ input: IntroInput,
112
+ ): Promise<string | undefined> => {
113
+ const runtimeEnv = (process.env.PONCHO_ENV ?? process.env.NODE_ENV ?? "").toLowerCase();
114
+ if (runtimeEnv === "production") {
115
+ return undefined;
116
+ }
117
+
118
+ const marker = await readMarker(workingDir);
119
+ if (marker?.allowIntro === false) {
120
+ return undefined;
121
+ }
122
+ const shouldShow = !marker || marker.introduced === false;
123
+ if (!shouldShow) {
124
+ return undefined;
125
+ }
126
+
127
+ await writeMarker(workingDir, {
128
+ introduced: true,
129
+ allowIntro: true,
130
+ onboardingVersion: ONBOARDING_VERSION,
131
+ createdAt: marker?.createdAt ?? Date.now(),
132
+ introducedAt: Date.now(),
133
+ });
134
+
135
+ const summary = summarizeConfig(input.config);
136
+ return [
137
+ `Hi! I'm **${input.agentName}**. I can configure myself directly by chat.\n`,
138
+ `**Current config**`,
139
+ ` Model: ${input.provider}/${input.model}`,
140
+ ` \`\`\`${summary.join(" · ")}\`\`\``,
141
+ "",
142
+ "Feel free to ask me anything when you're ready. I can help you:",
143
+ "",
144
+ "- **Build skills**: Create custom tools and capabilities for this agent",
145
+ "- **Configure the model**: Switch providers (OpenAI, Anthropic, etc.) or models",
146
+ "- **Set up storage**: Use local files, Upstash, or other backends",
147
+ "- **Enable auth**: Add bearer tokens or custom authentication",
148
+ "- **Turn on telemetry**: Track usage with OpenTelemetry/OTLP",
149
+ "- **Add MCP servers**: Connect external tool servers",
150
+ "",
151
+ "Just let me know what you'd like to work on!\n",
152
+ ].join("\n");
153
+ };
@@ -0,0 +1,529 @@
1
+ import { stdin, stdout } from "node:process";
2
+ import { input, password, select } from "@inquirer/prompts";
3
+ import type { PonchoConfig } from "@poncho-ai/harness";
4
+ import {
5
+ ONBOARDING_FIELDS,
6
+ fieldsForScope,
7
+ type OnboardingField,
8
+ } from "@poncho-ai/sdk";
9
+
10
+ // ANSI style helpers
11
+ const C = {
12
+ reset: "\x1b[0m",
13
+ bold: "\x1b[1m",
14
+ dim: "\x1b[2m",
15
+ cyan: "\x1b[36m",
16
+ } as const;
17
+
18
+ const cyan = (s: string): string => `${C.cyan}${s}${C.reset}`;
19
+ const dim = (s: string): string => `${C.dim}${s}${C.reset}`;
20
+ const bold = (s: string): string => `${C.bold}${s}${C.reset}`;
21
+ const INPUT_CARET = "»";
22
+
23
+ type OnboardingAnswers = Record<string, string | number | boolean>;
24
+
25
+ export type InitOnboardingOptions = {
26
+ yes?: boolean;
27
+ interactive?: boolean;
28
+ };
29
+
30
+ export type InitOnboardingResult = {
31
+ answers: OnboardingAnswers;
32
+ config: PonchoConfig;
33
+ envExample: string;
34
+ envFile: string;
35
+ envNeedsUserInput: boolean;
36
+ agentModel: {
37
+ provider: "anthropic" | "openai";
38
+ name: string;
39
+ };
40
+ };
41
+
42
+ type Primitive = string | number | boolean | bigint | symbol | null | undefined;
43
+
44
+ type Join<K extends string, P extends string> = `${K}.${P}`;
45
+ type DotPath<T> = T extends Primitive
46
+ ? never
47
+ : {
48
+ [K in keyof T & string]: NonNullable<T[K]> extends Primitive
49
+ ? K
50
+ : K | Join<K, DotPath<NonNullable<T[K]>>>;
51
+ }[keyof T & string];
52
+
53
+ type PonchoConfigPath = DotPath<PonchoConfig>;
54
+ type RegistryConfigPath = Extract<
55
+ (typeof ONBOARDING_FIELDS)[number],
56
+ { target: "config" }
57
+ >["path"];
58
+ type RegistryConfigPathContract = RegistryConfigPath extends PonchoConfigPath
59
+ ? true
60
+ : never;
61
+ const REGISTRY_CONFIG_PATH_CONTRACT: RegistryConfigPathContract = true;
62
+ void REGISTRY_CONFIG_PATH_CONTRACT;
63
+
64
+ const shouldAskField = (
65
+ field: OnboardingField,
66
+ answers: OnboardingAnswers,
67
+ ): boolean => {
68
+ if (!field.dependsOn) {
69
+ return true;
70
+ }
71
+ const value = answers[field.dependsOn.fieldId];
72
+ if (typeof field.dependsOn.equals !== "undefined") {
73
+ return value === field.dependsOn.equals;
74
+ }
75
+ if (field.dependsOn.oneOf) {
76
+ return field.dependsOn.oneOf.includes(value as string | number | boolean);
77
+ }
78
+ return true;
79
+ };
80
+
81
+ const parsePromptValue = (
82
+ field: OnboardingField,
83
+ answer: string,
84
+ ): string | number | boolean => {
85
+ if (field.kind === "boolean") {
86
+ const normalized = answer.trim().toLowerCase();
87
+ if (normalized === "y" || normalized === "yes" || normalized === "true") {
88
+ return true;
89
+ }
90
+ if (normalized === "n" || normalized === "no" || normalized === "false") {
91
+ return false;
92
+ }
93
+ return Boolean(field.defaultValue);
94
+ }
95
+ if (field.kind === "number") {
96
+ const parsed = Number.parseInt(answer.trim(), 10);
97
+ if (Number.isFinite(parsed)) {
98
+ return parsed;
99
+ }
100
+ return Number(field.defaultValue);
101
+ }
102
+ if (field.kind === "select") {
103
+ const trimmed = answer.trim();
104
+ if (field.options && field.options.some((option) => option.value === trimmed)) {
105
+ return trimmed;
106
+ }
107
+ const asNumber = Number.parseInt(trimmed, 10);
108
+ if (
109
+ Number.isFinite(asNumber) &&
110
+ field.options &&
111
+ asNumber >= 1 &&
112
+ asNumber <= field.options.length
113
+ ) {
114
+ return field.options[asNumber - 1]?.value ?? String(field.defaultValue);
115
+ }
116
+ return String(field.defaultValue);
117
+ }
118
+ const trimmed = answer.trim();
119
+ if (trimmed.length === 0) {
120
+ return String(field.defaultValue);
121
+ }
122
+ return trimmed;
123
+ };
124
+
125
+ const askSecret = async (
126
+ field: OnboardingField,
127
+ ): Promise<string | undefined> => {
128
+ if (!stdin.isTTY) {
129
+ return undefined;
130
+ }
131
+
132
+ const hint = field.placeholder ? dim(` (${field.placeholder})`) : "";
133
+ const message = `${field.prompt}${hint}`;
134
+ const value = await password(
135
+ {
136
+ message,
137
+ // true invisible input while typing/pasting
138
+ mask: false,
139
+ theme: {
140
+ prefix: {
141
+ idle: dim(INPUT_CARET),
142
+ done: dim("✓"),
143
+ },
144
+ style: {
145
+ help: () => "",
146
+ },
147
+ },
148
+ },
149
+ { input: stdin, output: stdout },
150
+ );
151
+ return value ?? "";
152
+ };
153
+
154
+ const askSelectWithArrowKeys = async (
155
+ field: OnboardingField,
156
+ ): Promise<string | undefined> => {
157
+ if (!field.options || field.options.length === 0) {
158
+ return undefined;
159
+ }
160
+ if (!stdin.isTTY) {
161
+ return undefined;
162
+ }
163
+
164
+ const selected = await select(
165
+ {
166
+ message: field.prompt,
167
+ choices: field.options.map((option) => ({
168
+ name: option.label,
169
+ value: option.value,
170
+ })),
171
+ default: String(field.defaultValue),
172
+ theme: {
173
+ prefix: {
174
+ idle: dim(INPUT_CARET),
175
+ done: dim("✓"),
176
+ },
177
+ },
178
+ },
179
+ { input: stdin, output: stdout },
180
+ );
181
+ return selected;
182
+ };
183
+
184
+ const askBooleanWithArrowKeys = async (
185
+ field: OnboardingField,
186
+ ): Promise<string | undefined> => {
187
+ if (!stdin.isTTY) {
188
+ return undefined;
189
+ }
190
+
191
+ const selected = await select(
192
+ {
193
+ message: field.prompt,
194
+ choices: [
195
+ { name: "Yes", value: "true" },
196
+ { name: "No", value: "false" },
197
+ ],
198
+ default: field.defaultValue ? "true" : "false",
199
+ theme: {
200
+ prefix: {
201
+ idle: dim(INPUT_CARET),
202
+ done: dim("✓"),
203
+ },
204
+ },
205
+ },
206
+ { input: stdin, output: stdout },
207
+ );
208
+ return selected;
209
+ };
210
+
211
+ const askTextInput = async (field: OnboardingField): Promise<string | undefined> => {
212
+ if (!stdin.isTTY) {
213
+ return undefined;
214
+ }
215
+ const answer = await input(
216
+ {
217
+ message: field.prompt,
218
+ default: String(field.defaultValue ?? ""),
219
+ theme: {
220
+ prefix: {
221
+ idle: dim(INPUT_CARET),
222
+ done: dim("✓"),
223
+ },
224
+ },
225
+ },
226
+ { input: stdin, output: stdout },
227
+ );
228
+ return answer;
229
+ };
230
+
231
+ const buildDefaultAnswers = (): OnboardingAnswers => {
232
+ const answers: OnboardingAnswers = {};
233
+ for (const field of fieldsForScope("light")) {
234
+ answers[field.id] = field.defaultValue;
235
+ }
236
+ return answers;
237
+ };
238
+
239
+ const askOnboardingQuestions = async (options: InitOnboardingOptions): Promise<OnboardingAnswers> => {
240
+ const answers = buildDefaultAnswers();
241
+ const interactive =
242
+ options.yes === true
243
+ ? false
244
+ : options.interactive ?? (stdin.isTTY === true && stdout.isTTY === true);
245
+ if (!interactive) {
246
+ return answers;
247
+ }
248
+
249
+ stdout.write("\n");
250
+ stdout.write(` ${bold("Poncho")} ${dim("· quick setup")}\n`);
251
+ stdout.write("\n");
252
+ const fields = fieldsForScope("light");
253
+ for (const field of fields) {
254
+ if (!shouldAskField(field, answers)) {
255
+ continue;
256
+ }
257
+ stdout.write("\n");
258
+ let value: string | undefined;
259
+ if (field.secret) {
260
+ value = await askSecret(field);
261
+ } else if (field.kind === "select") {
262
+ value = await askSelectWithArrowKeys(field);
263
+ } else if (field.kind === "boolean") {
264
+ value = await askBooleanWithArrowKeys(field);
265
+ } else {
266
+ value = await askTextInput(field);
267
+ }
268
+ if (!value || value.trim().length === 0) {
269
+ continue;
270
+ }
271
+ answers[field.id] = parsePromptValue(field, value);
272
+ }
273
+ return answers;
274
+ };
275
+
276
+ const getProviderModelName = (provider: string): string =>
277
+ provider === "openai" ? "gpt-4.1" : "claude-opus-4-5";
278
+
279
+ const maybeSet = (
280
+ target: object,
281
+ key: string,
282
+ value: unknown,
283
+ ): void => {
284
+ if (typeof value === "string" && value.trim().length === 0) {
285
+ return;
286
+ }
287
+ if (typeof value === "undefined") {
288
+ return;
289
+ }
290
+ (target as Record<string, unknown>)[key] = value;
291
+ };
292
+
293
+ export const buildConfigFromOnboardingAnswers = (
294
+ answers: OnboardingAnswers,
295
+ ): PonchoConfig => {
296
+ const storageProvider = String(answers["storage.provider"] ?? "local");
297
+ const memoryEnabled = Boolean(answers["storage.memory.enabled"] ?? true);
298
+ const maxRecallConversations = Number(
299
+ answers["storage.memory.maxRecallConversations"] ?? 20,
300
+ );
301
+
302
+ const storage: NonNullable<PonchoConfig["storage"]> = {
303
+ provider: storageProvider as NonNullable<PonchoConfig["storage"]>["provider"],
304
+ memory: {
305
+ enabled: memoryEnabled,
306
+ maxRecallConversations,
307
+ },
308
+ };
309
+ maybeSet(storage, "url", answers["storage.url"]);
310
+ maybeSet(storage, "token", answers["storage.token"]);
311
+ maybeSet(storage, "table", answers["storage.table"]);
312
+ maybeSet(storage, "region", answers["storage.region"]);
313
+
314
+ const authRequired = Boolean(answers["auth.required"] ?? false);
315
+ const authType =
316
+ (answers["auth.type"] as "bearer" | "header" | "custom" | undefined) ?? "bearer";
317
+
318
+ const auth: NonNullable<PonchoConfig["auth"]> = {
319
+ required: authRequired,
320
+ type: authType,
321
+ };
322
+ if (authType === "header") {
323
+ maybeSet(auth, "headerName", answers["auth.headerName"]);
324
+ }
325
+
326
+ const telemetryEnabled = Boolean(answers["telemetry.enabled"] ?? true);
327
+ const telemetry: NonNullable<PonchoConfig["telemetry"]> = {
328
+ enabled: telemetryEnabled,
329
+ };
330
+ maybeSet(telemetry, "otlp", answers["telemetry.otlp"]);
331
+
332
+ return {
333
+ mcp: [],
334
+ auth,
335
+ storage,
336
+ telemetry,
337
+ };
338
+ };
339
+
340
+ export const isDefaultOnboardingConfig = (
341
+ config: PonchoConfig | undefined,
342
+ ): boolean => {
343
+ if (!config) {
344
+ return true;
345
+ }
346
+ const topLevelKeys = Object.keys(config);
347
+ const allowedTopLevel = new Set(["mcp", "auth", "storage", "telemetry"]);
348
+ if (topLevelKeys.some((key) => !allowedTopLevel.has(key))) {
349
+ return false;
350
+ }
351
+ if ((config.mcp ?? []).length > 0) {
352
+ return false;
353
+ }
354
+ const authRequired = config.auth?.required ?? false;
355
+ const authType = config.auth?.type ?? "bearer";
356
+ if (authRequired || authType !== "bearer" || typeof config.auth?.headerName !== "undefined") {
357
+ return false;
358
+ }
359
+ const provider = config.storage?.provider ?? "local";
360
+ if (provider !== "local") {
361
+ return false;
362
+ }
363
+ if (
364
+ typeof config.storage?.url !== "undefined" ||
365
+ typeof config.storage?.token !== "undefined" ||
366
+ typeof config.storage?.table !== "undefined" ||
367
+ typeof config.storage?.region !== "undefined"
368
+ ) {
369
+ return false;
370
+ }
371
+ const memoryEnabled = config.storage?.memory?.enabled ?? true;
372
+ const maxRecallConversations = config.storage?.memory?.maxRecallConversations ?? 20;
373
+ if (!memoryEnabled || maxRecallConversations !== 20) {
374
+ return false;
375
+ }
376
+ const telemetryEnabled = config.telemetry?.enabled ?? true;
377
+ const telemetryHasExtra =
378
+ typeof config.telemetry?.otlp !== "undefined" ||
379
+ typeof config.telemetry?.latitude !== "undefined" ||
380
+ typeof config.telemetry?.handler !== "undefined";
381
+ if (!telemetryEnabled || telemetryHasExtra) {
382
+ return false;
383
+ }
384
+ return true;
385
+ };
386
+
387
+ const collectEnvVars = (answers: OnboardingAnswers): string[] => {
388
+ const envVars = new Set<string>();
389
+ const provider = String(answers["model.provider"] ?? "anthropic");
390
+ if (provider === "openai") {
391
+ envVars.add("OPENAI_API_KEY=sk-...");
392
+ } else {
393
+ envVars.add("ANTHROPIC_API_KEY=sk-ant-...");
394
+ }
395
+ const storageProvider = String(answers["storage.provider"] ?? "local");
396
+ if (storageProvider === "redis") {
397
+ envVars.add("REDIS_URL=redis://localhost:6379");
398
+ }
399
+ if (storageProvider === "upstash") {
400
+ envVars.add("UPSTASH_REDIS_REST_URL=https://...");
401
+ envVars.add("UPSTASH_REDIS_REST_TOKEN=...");
402
+ }
403
+ if (storageProvider === "dynamodb") {
404
+ envVars.add("PONCHO_DYNAMODB_TABLE=poncho-conversations");
405
+ envVars.add("AWS_REGION=us-east-1");
406
+ }
407
+ const authRequired = Boolean(answers["auth.required"] ?? false);
408
+ if (authRequired) {
409
+ envVars.add("PONCHO_AUTH_TOKEN=...");
410
+ }
411
+ return Array.from(envVars);
412
+ };
413
+
414
+ const collectEnvFileLines = (answers: OnboardingAnswers): string[] => {
415
+ const lines: string[] = [
416
+ "# Poncho environment configuration",
417
+ "# Fill in empty values before running `poncho dev` or `poncho run --interactive`.",
418
+ "# Tip: keep secrets in `.env` only (never commit them).",
419
+ "",
420
+ ];
421
+
422
+ const modelProvider = String(answers["model.provider"] ?? "anthropic");
423
+ const modelEnvKey =
424
+ modelProvider === "openai" ? "env.OPENAI_API_KEY" : "env.ANTHROPIC_API_KEY";
425
+ const modelEnvVar =
426
+ modelProvider === "openai" ? "OPENAI_API_KEY" : "ANTHROPIC_API_KEY";
427
+ const modelEnvValue = String(answers[modelEnvKey] ?? "");
428
+ lines.push("# Model");
429
+ if (modelEnvValue.length === 0) {
430
+ lines.push(
431
+ modelProvider === "openai"
432
+ ? "# OpenAI: create an API key at https://platform.openai.com/api-keys"
433
+ : "# Anthropic: create an API key at https://console.anthropic.com/settings/keys",
434
+ );
435
+ }
436
+ lines.push(`${modelEnvVar}=${modelEnvValue}`);
437
+ lines.push("");
438
+
439
+ const authRequired = Boolean(answers["auth.required"] ?? false);
440
+ const authType =
441
+ (answers["auth.type"] as "bearer" | "header" | "custom" | undefined) ?? "bearer";
442
+ const authHeaderName = String(answers["auth.headerName"] ?? "x-poncho-key");
443
+ if (authRequired) {
444
+ lines.push("# Auth (API request authentication)");
445
+ if (authType === "bearer") {
446
+ lines.push("# Requests should include: Authorization: Bearer <token>");
447
+ } else if (authType === "header") {
448
+ lines.push(`# Requests should include: ${authHeaderName}: <token>`);
449
+ } else {
450
+ lines.push("# Custom auth mode: read this token in your auth.validate function.");
451
+ }
452
+ lines.push("PONCHO_AUTH_TOKEN=");
453
+ lines.push("");
454
+ }
455
+
456
+ const storageProvider = String(answers["storage.provider"] ?? "local");
457
+ if (storageProvider === "redis") {
458
+ lines.push("# Storage (Redis)");
459
+ lines.push("# Run local Redis: docker run -p 6379:6379 redis:7");
460
+ lines.push("# Or use a managed Redis URL from your cloud provider.");
461
+ lines.push("REDIS_URL=");
462
+ lines.push("");
463
+ } else if (storageProvider === "upstash") {
464
+ lines.push("# Storage (Upstash)");
465
+ lines.push("# Create a Redis database at https://console.upstash.com/");
466
+ lines.push("# Copy REST URL + REST TOKEN from the Upstash dashboard.");
467
+ lines.push("UPSTASH_REDIS_REST_URL=");
468
+ lines.push("UPSTASH_REDIS_REST_TOKEN=");
469
+ lines.push("");
470
+ } else if (storageProvider === "dynamodb") {
471
+ lines.push("# Storage (DynamoDB)");
472
+ lines.push("# Create a DynamoDB table for Poncho conversation/state storage.");
473
+ lines.push("# Ensure AWS credentials are configured (AWS_PROFILE or access keys).");
474
+ lines.push("PONCHO_DYNAMODB_TABLE=");
475
+ lines.push("AWS_REGION=");
476
+ lines.push("");
477
+ } else if (storageProvider === "local" || storageProvider === "memory") {
478
+ lines.push(
479
+ storageProvider === "local"
480
+ ? "# Storage (Local file): no extra env vars required."
481
+ : "# Storage (In-memory): no extra env vars required, data resets on restart.",
482
+ );
483
+ lines.push("");
484
+ }
485
+
486
+ const telemetryEnabled = Boolean(answers["telemetry.enabled"] ?? true);
487
+ if (telemetryEnabled) {
488
+ lines.push("# Telemetry (optional)");
489
+ lines.push("# Latitude telemetry setup: https://docs.latitude.so/");
490
+ lines.push("# If not using Latitude yet, you can leave these empty.");
491
+ lines.push("LATITUDE_API_KEY=");
492
+ lines.push("LATITUDE_PROJECT_ID=");
493
+ lines.push("LATITUDE_PATH=");
494
+ lines.push("");
495
+ }
496
+
497
+ while (lines.length > 0 && lines[lines.length - 1] === "") {
498
+ lines.pop();
499
+ }
500
+ return lines;
501
+ };
502
+
503
+ export const runInitOnboarding = async (
504
+ options: InitOnboardingOptions,
505
+ ): Promise<InitOnboardingResult> => {
506
+ const answers = await askOnboardingQuestions(options);
507
+ const provider = String(answers["model.provider"] ?? "anthropic");
508
+ const config = buildConfigFromOnboardingAnswers(answers);
509
+ const envExampleLines = collectEnvVars(answers);
510
+ const envFileLines = collectEnvFileLines(answers);
511
+ const envNeedsUserInput = envFileLines.some(
512
+ (line) =>
513
+ line.includes("=") &&
514
+ !line.startsWith("#") &&
515
+ line.endsWith("="),
516
+ );
517
+
518
+ return {
519
+ answers,
520
+ config,
521
+ envExample: `${envExampleLines.join("\n")}\n`,
522
+ envFile: envFileLines.length > 0 ? `${envFileLines.join("\n")}\n` : "",
523
+ envNeedsUserInput,
524
+ agentModel: {
525
+ provider: provider === "openai" ? "openai" : "anthropic",
526
+ name: getProviderModelName(provider),
527
+ },
528
+ };
529
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * This file is no longer used. The interactive CLI now uses plain readline
3
+ * in run-interactive-ink.ts. Kept for reference only.
4
+ */
5
+ export {};