@juspay/shooter 1.5.0 → 1.6.1

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 (478) hide show
  1. package/README.md +24 -20
  2. package/bin/shooter.cjs +68 -17
  3. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css +1 -0
  4. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.br +0 -0
  5. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.gz +0 -0
  6. package/build/client/_app/immutable/assets/3.DHxQoulp.css +1 -0
  7. package/build/client/_app/immutable/assets/3.DHxQoulp.css.br +0 -0
  8. package/build/client/_app/immutable/assets/3.DHxQoulp.css.gz +0 -0
  9. package/build/client/_app/immutable/assets/{3.DGDHCVnW.css → 4.D5l1JxgO.css} +1 -1
  10. package/build/client/_app/immutable/assets/4.D5l1JxgO.css.br +0 -0
  11. package/build/client/_app/immutable/assets/4.D5l1JxgO.css.gz +0 -0
  12. package/build/client/_app/immutable/assets/5.C5qz-NeI.css +1 -0
  13. package/build/client/_app/immutable/assets/5.C5qz-NeI.css.br +0 -0
  14. package/build/client/_app/immutable/assets/5.C5qz-NeI.css.gz +0 -0
  15. package/build/client/_app/immutable/chunks/1mEchsPO.js +1 -0
  16. package/build/client/_app/immutable/chunks/1mEchsPO.js.br +0 -0
  17. package/build/client/_app/immutable/chunks/1mEchsPO.js.gz +0 -0
  18. package/build/client/_app/immutable/chunks/B7X-vhXI.js +1 -0
  19. package/build/client/_app/immutable/chunks/B7X-vhXI.js.br +0 -0
  20. package/build/client/_app/immutable/chunks/B7X-vhXI.js.gz +0 -0
  21. package/build/client/_app/immutable/chunks/BRkqKgVG.js +1 -0
  22. package/build/client/_app/immutable/chunks/BRkqKgVG.js.br +0 -0
  23. package/build/client/_app/immutable/chunks/BRkqKgVG.js.gz +0 -0
  24. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js +1 -0
  25. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.br +2 -0
  26. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.gz +0 -0
  27. package/build/client/_app/immutable/chunks/CGMJxf7r.js +1 -0
  28. package/build/client/_app/immutable/chunks/CGMJxf7r.js.br +0 -0
  29. package/build/client/_app/immutable/chunks/CGMJxf7r.js.gz +0 -0
  30. package/build/client/_app/immutable/chunks/{CZHsSL_X.js → CJFjKwJ7.js} +1 -1
  31. package/build/client/_app/immutable/chunks/CJFjKwJ7.js.br +0 -0
  32. package/build/client/_app/immutable/chunks/CJFjKwJ7.js.gz +0 -0
  33. package/build/client/_app/immutable/chunks/CNH2HlKj.js +20 -0
  34. package/build/client/_app/immutable/chunks/CNH2HlKj.js.br +0 -0
  35. package/build/client/_app/immutable/chunks/CNH2HlKj.js.gz +0 -0
  36. package/build/client/_app/immutable/chunks/CR6bkGJW.js +6 -0
  37. package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
  38. package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
  39. package/build/client/_app/immutable/chunks/CVtJ6yRM.js +1 -0
  40. package/build/client/_app/immutable/chunks/CVtJ6yRM.js.br +0 -0
  41. package/build/client/_app/immutable/chunks/CVtJ6yRM.js.gz +0 -0
  42. package/build/client/_app/immutable/chunks/{CSoRdFvv.js → CaiJSUi3.js} +1 -1
  43. package/build/client/_app/immutable/chunks/CaiJSUi3.js.br +0 -0
  44. package/build/client/_app/immutable/chunks/CaiJSUi3.js.gz +0 -0
  45. package/build/client/_app/immutable/chunks/{DjsDGxCa.js → CmczWE_d.js} +4 -4
  46. package/build/client/_app/immutable/chunks/CmczWE_d.js.br +0 -0
  47. package/build/client/_app/immutable/chunks/CmczWE_d.js.gz +0 -0
  48. package/build/client/_app/immutable/chunks/CsgHjHGZ.js +1 -0
  49. package/build/client/_app/immutable/chunks/CsgHjHGZ.js.br +0 -0
  50. package/build/client/_app/immutable/chunks/CsgHjHGZ.js.gz +0 -0
  51. package/build/client/_app/immutable/chunks/{UJOiqIYE.js → CtrCjGZT.js} +1 -1
  52. package/build/client/_app/immutable/chunks/CtrCjGZT.js.br +0 -0
  53. package/build/client/_app/immutable/chunks/CtrCjGZT.js.gz +0 -0
  54. package/build/client/_app/immutable/chunks/DDiOVAd8.js +61 -0
  55. package/build/client/_app/immutable/chunks/DDiOVAd8.js.br +0 -0
  56. package/build/client/_app/immutable/chunks/DDiOVAd8.js.gz +0 -0
  57. package/build/client/_app/immutable/chunks/DVl0sebP.js +2 -0
  58. package/build/client/_app/immutable/chunks/DVl0sebP.js.br +0 -0
  59. package/build/client/_app/immutable/chunks/DVl0sebP.js.gz +0 -0
  60. package/build/client/_app/immutable/chunks/{CiF38mQq.js → Dc_Gg2H6.js} +1 -1
  61. package/build/client/_app/immutable/chunks/Dc_Gg2H6.js.br +0 -0
  62. package/build/client/_app/immutable/chunks/Dc_Gg2H6.js.gz +0 -0
  63. package/build/client/_app/immutable/chunks/{CRbaG9cv.js → DlnAjkg1.js} +1 -1
  64. package/build/client/_app/immutable/chunks/DlnAjkg1.js.br +0 -0
  65. package/build/client/_app/immutable/chunks/{CRbaG9cv.js.gz → DlnAjkg1.js.gz} +0 -0
  66. package/build/client/_app/immutable/chunks/YKoRJzXZ.js +3 -0
  67. package/build/client/_app/immutable/chunks/YKoRJzXZ.js.br +0 -0
  68. package/build/client/_app/immutable/chunks/YKoRJzXZ.js.gz +0 -0
  69. package/build/client/_app/immutable/chunks/gQJcRhou.js +1 -0
  70. package/build/client/_app/immutable/chunks/gQJcRhou.js.br +0 -0
  71. package/build/client/_app/immutable/chunks/gQJcRhou.js.gz +0 -0
  72. package/build/client/_app/immutable/chunks/pRcLbE0d.js +1 -0
  73. package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
  74. package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
  75. package/build/client/_app/immutable/entry/app.CFPgQOa8.js +2 -0
  76. package/build/client/_app/immutable/entry/app.CFPgQOa8.js.br +0 -0
  77. package/build/client/_app/immutable/entry/app.CFPgQOa8.js.gz +0 -0
  78. package/build/client/_app/immutable/entry/start.BnJOVqhI.js +1 -0
  79. package/build/client/_app/immutable/entry/start.BnJOVqhI.js.br +2 -0
  80. package/build/client/_app/immutable/entry/start.BnJOVqhI.js.gz +0 -0
  81. package/build/client/_app/immutable/nodes/0.DR-BBF5r.js +1 -0
  82. package/build/client/_app/immutable/nodes/0.DR-BBF5r.js.br +0 -0
  83. package/build/client/_app/immutable/nodes/0.DR-BBF5r.js.gz +0 -0
  84. package/build/client/_app/immutable/nodes/1.CNm6rAwf.js +1 -0
  85. package/build/client/_app/immutable/nodes/1.CNm6rAwf.js.br +0 -0
  86. package/build/client/_app/immutable/nodes/1.CNm6rAwf.js.gz +0 -0
  87. package/build/client/_app/immutable/nodes/2.B08usYzr.js +13 -0
  88. package/build/client/_app/immutable/nodes/2.B08usYzr.js.br +0 -0
  89. package/build/client/_app/immutable/nodes/2.B08usYzr.js.gz +0 -0
  90. package/build/client/_app/immutable/nodes/3.CsY6J5HS.js +9 -0
  91. package/build/client/_app/immutable/nodes/3.CsY6J5HS.js.br +0 -0
  92. package/build/client/_app/immutable/nodes/3.CsY6J5HS.js.gz +0 -0
  93. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js +4 -0
  94. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.br +0 -0
  95. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.gz +0 -0
  96. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js +1 -0
  97. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.br +0 -0
  98. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.gz +0 -0
  99. package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js +1 -0
  100. package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js.br +0 -0
  101. package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js.gz +0 -0
  102. package/build/client/_app/immutable/nodes/{5.DIkXVP4q.js → 7.CCKgiNNk.js} +3 -3
  103. package/build/client/_app/immutable/nodes/7.CCKgiNNk.js.br +0 -0
  104. package/build/client/_app/immutable/nodes/7.CCKgiNNk.js.gz +0 -0
  105. package/build/client/_app/immutable/nodes/8.C7AaheUD.js +2 -0
  106. package/build/client/_app/immutable/nodes/8.C7AaheUD.js.br +0 -0
  107. package/build/client/_app/immutable/nodes/8.C7AaheUD.js.gz +0 -0
  108. package/build/client/_app/immutable/nodes/9.DfL9kMC4.js +2 -0
  109. package/build/client/_app/immutable/nodes/9.DfL9kMC4.js.br +0 -0
  110. package/build/client/_app/immutable/nodes/9.DfL9kMC4.js.gz +0 -0
  111. package/build/client/_app/version.json +1 -1
  112. package/build/client/_app/version.json.br +0 -0
  113. package/build/client/_app/version.json.gz +0 -0
  114. package/build/server/chunks/0-DC2VLooL.js +23 -0
  115. package/build/server/chunks/0-DC2VLooL.js.map +1 -0
  116. package/build/server/chunks/1-XJaf8Jvf.js +9 -0
  117. package/build/server/chunks/{1-D0N7vVhH.js.map → 1-XJaf8Jvf.js.map} +1 -1
  118. package/build/server/chunks/2-D4Cx-1QL.js +21 -0
  119. package/build/server/chunks/2-D4Cx-1QL.js.map +1 -0
  120. package/build/server/chunks/3-CVhIEP-u.js +21 -0
  121. package/build/server/chunks/3-CVhIEP-u.js.map +1 -0
  122. package/build/server/chunks/4-0UE_6Ep-.js +23 -0
  123. package/build/server/chunks/4-0UE_6Ep-.js.map +1 -0
  124. package/build/server/chunks/5-BBIP1PzX.js +24 -0
  125. package/build/server/chunks/5-BBIP1PzX.js.map +1 -0
  126. package/build/server/chunks/6-QFSbzRMP.js +9 -0
  127. package/build/server/chunks/6-QFSbzRMP.js.map +1 -0
  128. package/build/server/chunks/7-CZ_YGjMV.js +9 -0
  129. package/build/server/chunks/7-CZ_YGjMV.js.map +1 -0
  130. package/build/server/chunks/8-Xe2Rugb4.js +9 -0
  131. package/build/server/chunks/8-Xe2Rugb4.js.map +1 -0
  132. package/build/server/chunks/9-IwHpC4SO.js +9 -0
  133. package/build/server/chunks/9-IwHpC4SO.js.map +1 -0
  134. package/build/server/chunks/{Button-Cs1aE6ka.js → Button-WKgiLWZI.js} +4 -9
  135. package/build/server/chunks/Button-WKgiLWZI.js.map +1 -0
  136. package/build/server/chunks/{EmptyState-DDFH1K8g.js → EmptyState-BUBqASsp.js} +3 -3
  137. package/build/server/chunks/{EmptyState-DDFH1K8g.js.map → EmptyState-BUBqASsp.js.map} +1 -1
  138. package/build/server/chunks/{Icon-CEUrotA6.js → Icon-BNBAg85a.js} +3 -3
  139. package/build/server/chunks/Icon-BNBAg85a.js.map +1 -0
  140. package/build/server/chunks/{Shimmer-DB8W1zt6.js → Shimmer-C4uBVwxz.js} +2 -2
  141. package/build/server/chunks/{Shimmer-DB8W1zt6.js.map → Shimmer-C4uBVwxz.js.map} +1 -1
  142. package/build/server/chunks/{_error.svelte-uCOJNxvr.js → _error.svelte-DkIwmECt.js} +5 -5
  143. package/build/server/chunks/{_error.svelte-uCOJNxvr.js.map → _error.svelte-DkIwmECt.js.map} +1 -1
  144. package/build/server/chunks/{_layout.svelte-CtWmEJwe.js → _layout.svelte-DllETxmJ.js} +13 -7
  145. package/build/server/chunks/_layout.svelte-DllETxmJ.js.map +1 -0
  146. package/build/server/chunks/_page.svelte-BZSdLKE_.js +118 -0
  147. package/build/server/chunks/_page.svelte-BZSdLKE_.js.map +1 -0
  148. package/build/server/chunks/{_page.svelte-CxWcQ0Am.js → _page.svelte-Cmuco1mC.js} +84 -199
  149. package/build/server/chunks/_page.svelte-Cmuco1mC.js.map +1 -0
  150. package/build/server/chunks/{_page.svelte-BgevQjq1.js → _page.svelte-Co5sF7W-.js} +12 -11
  151. package/build/server/chunks/{_page.svelte-BgevQjq1.js.map → _page.svelte-Co5sF7W-.js.map} +1 -1
  152. package/build/server/chunks/{_page.svelte-DO4oa_LY.js → _page.svelte-CpL3R-VI.js} +8 -8
  153. package/build/server/chunks/{_page.svelte-DO4oa_LY.js.map → _page.svelte-CpL3R-VI.js.map} +1 -1
  154. package/build/server/chunks/_page.svelte-DDSzYLUs.js +137 -0
  155. package/build/server/chunks/_page.svelte-DDSzYLUs.js.map +1 -0
  156. package/build/server/chunks/_page.svelte-JIkgFUFf.js +26 -0
  157. package/build/server/chunks/_page.svelte-JIkgFUFf.js.map +1 -0
  158. package/build/server/chunks/{_page.svelte-CVq6tRb3.js → _page.svelte-Y9-O5a5w.js} +10 -9
  159. package/build/server/chunks/_page.svelte-Y9-O5a5w.js.map +1 -0
  160. package/build/server/chunks/{_page.svelte-BcZaKdX9.js → _page.svelte-fcX09N4d.js} +9 -9
  161. package/build/server/chunks/{_page.svelte-BcZaKdX9.js.map → _page.svelte-fcX09N4d.js.map} +1 -1
  162. package/build/server/chunks/{_server.ts-DYpJImqd.js → _server.ts-0Xr2fWaq.js} +9 -5
  163. package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +1 -0
  164. package/build/server/chunks/{_server.ts-CTpcLUH8.js → _server.ts-2ixC-X3K.js} +20 -5
  165. package/build/server/chunks/_server.ts-2ixC-X3K.js.map +1 -0
  166. package/build/server/chunks/{_server.ts-CAxsWKvS.js → _server.ts-40c_epk8.js} +20 -4
  167. package/build/server/chunks/_server.ts-40c_epk8.js.map +1 -0
  168. package/build/server/chunks/{_server.ts-WhTJBEJy.js → _server.ts-A9_tRR-K.js} +5 -4
  169. package/build/server/chunks/{_server.ts-WhTJBEJy.js.map → _server.ts-A9_tRR-K.js.map} +1 -1
  170. package/build/server/chunks/_server.ts-BRAzC6W1.js +98 -0
  171. package/build/server/chunks/_server.ts-BRAzC6W1.js.map +1 -0
  172. package/build/server/chunks/{_server.ts-DB_Kg97c.js → _server.ts-BScvgttw.js} +24 -4
  173. package/build/server/chunks/_server.ts-BScvgttw.js.map +1 -0
  174. package/build/server/chunks/{_server.ts-tSpgyl1D.js → _server.ts-Bjbr7glm.js} +4 -3
  175. package/build/server/chunks/_server.ts-Bjbr7glm.js.map +1 -0
  176. package/build/server/chunks/{_server.ts-COu0vNpd.js → _server.ts-BrqaMMAa.js} +7 -6
  177. package/build/server/chunks/_server.ts-BrqaMMAa.js.map +1 -0
  178. package/build/server/chunks/{_server.ts-vekTmWAx.js → _server.ts-BuYyCrnF.js} +6 -4
  179. package/build/server/chunks/_server.ts-BuYyCrnF.js.map +1 -0
  180. package/build/server/chunks/{_server.ts-DYvb9ijZ.js → _server.ts-ByPExYfO.js} +4 -3
  181. package/build/server/chunks/{_server.ts-DYvb9ijZ.js.map → _server.ts-ByPExYfO.js.map} +1 -1
  182. package/build/server/chunks/_server.ts-CjpQ10xh.js +123 -0
  183. package/build/server/chunks/_server.ts-CjpQ10xh.js.map +1 -0
  184. package/build/server/chunks/_server.ts-CyjDrcZN.js +21 -0
  185. package/build/server/chunks/_server.ts-CyjDrcZN.js.map +1 -0
  186. package/build/server/chunks/{_server.ts-DV8zTCF9.js → _server.ts-DOGUMzPx.js} +4 -3
  187. package/build/server/chunks/{_server.ts-DV8zTCF9.js.map → _server.ts-DOGUMzPx.js.map} +1 -1
  188. package/build/server/chunks/_server.ts-DZvfyuNj.js +15 -0
  189. package/build/server/chunks/_server.ts-DZvfyuNj.js.map +1 -0
  190. package/build/server/chunks/{_server.ts-XzT2UHM1.js → _server.ts-DkPPTUPo.js} +4 -3
  191. package/build/server/chunks/{_server.ts-XzT2UHM1.js.map → _server.ts-DkPPTUPo.js.map} +1 -1
  192. package/build/server/chunks/{_server.ts-Deok2y88.js → _server.ts-Ds_SUGC3.js} +184 -90
  193. package/build/server/chunks/_server.ts-Ds_SUGC3.js.map +1 -0
  194. package/build/server/chunks/{_server.ts-Ch-6iOHp.js → _server.ts-G8OeADGj.js} +141 -89
  195. package/build/server/chunks/_server.ts-G8OeADGj.js.map +1 -0
  196. package/build/server/chunks/{auth-DeCdZ83n.js → auth-DuunT7Cg.js} +2 -2
  197. package/build/server/chunks/{auth-DeCdZ83n.js.map → auth-DuunT7Cg.js.map} +1 -1
  198. package/build/server/chunks/{client-BdGHe_hY.js → client-DRtPDkMh.js} +4 -4
  199. package/build/server/chunks/{client-BdGHe_hY.js.map → client-DRtPDkMh.js.map} +1 -1
  200. package/build/server/chunks/client2-bqqmu0b7.js +7 -0
  201. package/build/server/chunks/{client2-CCBGA-2V.js.map → client2-bqqmu0b7.js.map} +1 -1
  202. package/build/server/chunks/close-BGlLztTb.js +192 -0
  203. package/build/server/chunks/close-BGlLztTb.js.map +1 -0
  204. package/build/server/chunks/events-handler-Dm1mNPQP.js +20 -0
  205. package/build/server/chunks/events-handler-Dm1mNPQP.js.map +1 -0
  206. package/build/server/chunks/html-FW6Ia4bL.js +8 -0
  207. package/build/server/chunks/html-FW6Ia4bL.js.map +1 -0
  208. package/build/server/chunks/{shared-server-sSGG17Df.js → index-CoD1IJuy.js} +2 -11
  209. package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
  210. package/build/server/chunks/{index-DwaY1cAm.js → index-DP9bWJrR.js} +2 -2
  211. package/build/server/chunks/{index-DwaY1cAm.js.map → index-DP9bWJrR.js.map} +1 -1
  212. package/build/server/chunks/{index-server-CrDaL06Y.js → index-server-BUmV4MIG.js} +2 -2
  213. package/build/server/chunks/index-server-BUmV4MIG.js.map +1 -0
  214. package/build/server/chunks/index-server2-BJrT0wnA.js +5 -0
  215. package/build/server/chunks/index-server2-BJrT0wnA.js.map +1 -0
  216. package/build/server/chunks/{index2-CgclKpUj.js → index2-D5Y19GKR.js} +2 -2
  217. package/build/server/chunks/index2-D5Y19GKR.js.map +1 -0
  218. package/build/server/chunks/{library-apns-BqJbvSKh.js → library-apns-Cf-E-DhM.js} +5 -2
  219. package/build/server/chunks/library-apns-Cf-E-DhM.js.map +1 -0
  220. package/build/server/chunks/providers-DtstoHQ0.js +17 -0
  221. package/build/server/chunks/providers-DtstoHQ0.js.map +1 -0
  222. package/build/server/chunks/{pty-manager-BQVB7IVj.js → pty-manager-TyMUpDA9.js} +41 -9
  223. package/build/server/chunks/pty-manager-TyMUpDA9.js.map +1 -0
  224. package/build/server/chunks/{root-DDSnEAZv.js → root-CATOR_0t.js} +2 -2
  225. package/build/server/chunks/root-CATOR_0t.js.map +1 -0
  226. package/build/server/chunks/shared-server-DaWdgxVh.js +11 -0
  227. package/build/server/chunks/shared-server-DaWdgxVh.js.map +1 -0
  228. package/build/server/chunks/{state.svelte-hBbXlUak.js → state.svelte-CftllyvC.js} +3 -3
  229. package/build/server/chunks/state.svelte-CftllyvC.js.map +1 -0
  230. package/build/server/chunks/{stores-DHNzYNpX.js → stores-BjL57aOK.js} +4 -4
  231. package/build/server/chunks/{stores-DHNzYNpX.js.map → stores-BjL57aOK.js.map} +1 -1
  232. package/build/server/index.js +173 -6
  233. package/build/server/index.js.map +1 -1
  234. package/build/server/manifest.js +53 -30
  235. package/build/server/manifest.js.map +1 -1
  236. package/package.json +24 -6
  237. package/scripts/dev.mjs +361 -0
  238. package/scripts/install.sh +11 -3
  239. package/scripts/{fix-generated-types.sh → postgen-types.sh} +2 -2
  240. package/scripts/setup.cjs +219 -24
  241. package/scripts/vercel-env-commands.sh +3 -3
  242. package/server.ts +3 -3
  243. package/src/app.html +163 -0
  244. package/src/lib/modules/client/activity/ActivityFeed.svelte +279 -0
  245. package/src/lib/modules/client/activity/index.ts +8 -0
  246. package/src/lib/modules/client/activity/store.svelte.ts +478 -0
  247. package/src/lib/modules/client/activity/summarizer.ts +224 -0
  248. package/src/lib/modules/client/common/Card.svelte +2 -9
  249. package/src/lib/modules/client/common/EmptyState.svelte +2 -20
  250. package/src/lib/modules/client/common/Icon.svelte +3 -7
  251. package/src/lib/modules/client/common/StatusBadge.svelte +2 -4
  252. package/src/lib/modules/client/common/config-guard.ts +22 -2
  253. package/src/lib/modules/client/common/index.ts +1 -1
  254. package/src/lib/modules/client/common/time.ts +27 -9
  255. package/src/lib/modules/client/dashboard/DashboardCard.svelte +374 -0
  256. package/src/lib/modules/client/dashboard/DashboardView.svelte +66 -0
  257. package/src/lib/modules/client/dashboard/index.ts +12 -0
  258. package/src/lib/modules/client/dashboard/store.svelte.ts +663 -0
  259. package/src/lib/modules/client/dashboard/summarizer.ts +205 -0
  260. package/src/lib/modules/client/neurolink/fetch-proxy.ts +70 -0
  261. package/src/lib/modules/client/neurolink/provider-config.ts +111 -0
  262. package/src/lib/modules/client/terminal/ChatView.svelte +46 -43
  263. package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -12
  264. package/src/lib/modules/client/terminal/ConnectionStatus.svelte +3 -6
  265. package/src/lib/modules/client/terminal/LaunchSheet.svelte +10 -21
  266. package/src/lib/modules/client/terminal/QuickKeys.svelte +4 -11
  267. package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +3 -6
  268. package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +5 -7
  269. package/src/lib/modules/client/terminal/xterm-wrapper.ts +27 -47
  270. package/src/lib/modules/server/apn/library-apns.ts +6 -3
  271. package/src/lib/modules/server/apn/notification-history.ts +2 -2
  272. package/src/lib/modules/server/apn/notification-sessions.ts +1 -3
  273. package/src/lib/modules/server/apn/pending-requests.ts +1 -1
  274. package/src/lib/modules/server/apn/types.ts +2 -52
  275. package/src/lib/modules/server/cli/index.ts +1 -30
  276. package/src/lib/modules/server/cli/runner.ts +7 -15
  277. package/src/lib/modules/server/fcm/fcm-service.ts +2 -2
  278. package/src/lib/modules/server/sessions/jsonl-parser.ts +97 -42
  279. package/src/lib/modules/server/sessions/jsonl-reader.ts +144 -76
  280. package/src/lib/modules/server/sessions/opencode-reader.ts +1 -1
  281. package/src/lib/modules/server/sessions/process-detector.ts +72 -31
  282. package/src/lib/modules/server/sessions/types.ts +2 -42
  283. package/src/lib/modules/server/terminal/holder-client.ts +11 -35
  284. package/src/lib/modules/server/terminal/opencode-watcher.ts +16 -24
  285. package/src/lib/modules/server/terminal/pty-manager.ts +40 -45
  286. package/src/lib/modules/server/terminal/session-watcher.ts +15 -17
  287. package/src/lib/modules/server/terminal/terminal-store.ts +1 -1
  288. package/src/lib/modules/server/ws/events-handler.ts +1 -16
  289. package/src/lib/modules/server/ws/keepalive.ts +1 -5
  290. package/src/lib/modules/server/ws/server.ts +1 -1
  291. package/src/lib/modules/server/ws/session-handler.ts +20 -86
  292. package/src/lib/modules/server/ws/terminal-handler.ts +28 -51
  293. package/src/lib/modules/server/ws/ticket-store.ts +1 -1
  294. package/src/lib/modules/shared/providers.ts +21 -0
  295. package/src/lib/types/activity.ts +18 -0
  296. package/src/lib/types/apn.ts +43 -0
  297. package/src/lib/types/cli.ts +39 -0
  298. package/src/lib/types/common.ts +39 -0
  299. package/src/lib/types/dashboard.ts +4 -0
  300. package/src/lib/types/generated/Client.ts +1656 -0
  301. package/src/{generated/types → lib/types/generated}/WsProtocol.ts +344 -2
  302. package/src/lib/types/index.ts +28 -0
  303. package/src/lib/types/neurolink.ts +4 -0
  304. package/src/lib/types/server.ts +93 -0
  305. package/src/lib/types/sessions.ts +59 -0
  306. package/src/lib/types/terminal-client.ts +132 -0
  307. package/src/lib/types/ws.ts +161 -0
  308. package/src/routes/+error.svelte +7 -2
  309. package/src/routes/+layout.server.ts +9 -0
  310. package/src/routes/+layout.svelte +36 -7
  311. package/src/routes/+page.server.ts +7 -0
  312. package/src/routes/+page.svelte +85 -35
  313. package/src/routes/activity/+page.server.ts +7 -0
  314. package/src/routes/activity/+page.svelte +58 -0
  315. package/src/routes/api/health/+server.ts +32 -19
  316. package/src/routes/api/neurolink-proxy/+server.ts +136 -0
  317. package/src/routes/api/notify/+server.ts +190 -87
  318. package/src/routes/api/sessions/+server.ts +1 -1
  319. package/src/routes/api/sessions/connect/+server.ts +10 -6
  320. package/src/routes/api/terminals/+server.ts +20 -1
  321. package/src/routes/api/terminals/[id]/+server.ts +16 -2
  322. package/src/routes/api/webhook/+server.ts +5 -33
  323. package/src/routes/api/ws-ticket/+server.ts +4 -4
  324. package/src/routes/config/+page.server.ts +9 -0
  325. package/src/routes/config/+page.svelte +118 -25
  326. package/src/routes/neurolink/+page.server.ts +10 -0
  327. package/src/routes/neurolink/+page.svelte +331 -0
  328. package/src/routes/project/+page.svelte +17 -12
  329. package/src/routes/session/[id]/+page.svelte +146 -62
  330. package/src/routes/terminals/+page.svelte +2 -2
  331. package/src/routes/terminals/[id]/+page.svelte +99 -88
  332. package/svelte.config.js +1 -3
  333. package/tsconfig.json +1 -0
  334. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +0 -1
  335. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +0 -1
  336. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
  337. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
  338. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
  339. package/build/client/_app/immutable/chunks/B5NAKyil.js +0 -20
  340. package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/B8XegpSE.js +0 -1
  343. package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/B8zoBsv3.js +0 -6
  346. package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
  347. package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
  348. package/build/client/_app/immutable/chunks/BIaXC2t9.js +0 -1
  349. package/build/client/_app/immutable/chunks/BIaXC2t9.js.br +0 -0
  350. package/build/client/_app/immutable/chunks/BIaXC2t9.js.gz +0 -0
  351. package/build/client/_app/immutable/chunks/BOYo8yTr.js +0 -1
  352. package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/Bu1aqm5j.js +0 -1
  355. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
  356. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
  357. package/build/client/_app/immutable/chunks/CQjSATpv.js +0 -61
  358. package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
  359. package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
  360. package/build/client/_app/immutable/chunks/CRbaG9cv.js.br +0 -0
  361. package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
  362. package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
  363. package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/CiF38mQq.js.br +0 -0
  366. package/build/client/_app/immutable/chunks/CiF38mQq.js.gz +0 -0
  367. package/build/client/_app/immutable/chunks/DSU1n5N_.js +0 -1
  368. package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
  370. package/build/client/_app/immutable/chunks/DVkn4r72.js +0 -1
  371. package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
  372. package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
  373. package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
  374. package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
  375. package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
  376. package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
  377. package/build/client/_app/immutable/chunks/r0JawsZc.js +0 -2
  378. package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
  379. package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
  380. package/build/client/_app/immutable/entry/app.CU7KVZja.js +0 -2
  381. package/build/client/_app/immutable/entry/app.CU7KVZja.js.br +0 -0
  382. package/build/client/_app/immutable/entry/app.CU7KVZja.js.gz +0 -0
  383. package/build/client/_app/immutable/entry/start.RAMZY19t.js +0 -1
  384. package/build/client/_app/immutable/entry/start.RAMZY19t.js.br +0 -2
  385. package/build/client/_app/immutable/entry/start.RAMZY19t.js.gz +0 -0
  386. package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js +0 -1
  387. package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js.br +0 -0
  388. package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js.gz +0 -0
  389. package/build/client/_app/immutable/nodes/1.DTmfBFmm.js +0 -1
  390. package/build/client/_app/immutable/nodes/1.DTmfBFmm.js.br +0 -0
  391. package/build/client/_app/immutable/nodes/1.DTmfBFmm.js.gz +0 -0
  392. package/build/client/_app/immutable/nodes/2.Cm269yzt.js +0 -1
  393. package/build/client/_app/immutable/nodes/2.Cm269yzt.js.br +0 -0
  394. package/build/client/_app/immutable/nodes/2.Cm269yzt.js.gz +0 -0
  395. package/build/client/_app/immutable/nodes/3.3yohCM25.js +0 -3
  396. package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
  397. package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
  398. package/build/client/_app/immutable/nodes/4.C25c5hMg.js +0 -1
  399. package/build/client/_app/immutable/nodes/4.C25c5hMg.js.br +0 -0
  400. package/build/client/_app/immutable/nodes/4.C25c5hMg.js.gz +0 -0
  401. package/build/client/_app/immutable/nodes/5.DIkXVP4q.js.br +0 -0
  402. package/build/client/_app/immutable/nodes/5.DIkXVP4q.js.gz +0 -0
  403. package/build/client/_app/immutable/nodes/6.BPL-HzUX.js +0 -2
  404. package/build/client/_app/immutable/nodes/6.BPL-HzUX.js.br +0 -0
  405. package/build/client/_app/immutable/nodes/6.BPL-HzUX.js.gz +0 -0
  406. package/build/client/_app/immutable/nodes/7.IgEqce53.js +0 -2
  407. package/build/client/_app/immutable/nodes/7.IgEqce53.js.br +0 -0
  408. package/build/client/_app/immutable/nodes/7.IgEqce53.js.gz +0 -0
  409. package/build/server/chunks/0-DiORznXb.js +0 -9
  410. package/build/server/chunks/0-DiORznXb.js.map +0 -1
  411. package/build/server/chunks/1-D0N7vVhH.js +0 -9
  412. package/build/server/chunks/2-DfSav7a7.js +0 -9
  413. package/build/server/chunks/2-DfSav7a7.js.map +0 -1
  414. package/build/server/chunks/3-Ck7ewhOX.js +0 -9
  415. package/build/server/chunks/3-Ck7ewhOX.js.map +0 -1
  416. package/build/server/chunks/4-DV5MZUz_.js +0 -9
  417. package/build/server/chunks/4-DV5MZUz_.js.map +0 -1
  418. package/build/server/chunks/5-DJhoAjb0.js +0 -9
  419. package/build/server/chunks/5-DJhoAjb0.js.map +0 -1
  420. package/build/server/chunks/6-Cp8CzYbr.js +0 -9
  421. package/build/server/chunks/6-Cp8CzYbr.js.map +0 -1
  422. package/build/server/chunks/7-BA4xzUj3.js +0 -9
  423. package/build/server/chunks/7-BA4xzUj3.js.map +0 -1
  424. package/build/server/chunks/Button-Cs1aE6ka.js.map +0 -1
  425. package/build/server/chunks/Icon-CEUrotA6.js.map +0 -1
  426. package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +0 -1
  427. package/build/server/chunks/_page.svelte-BdYynOck.js +0 -85
  428. package/build/server/chunks/_page.svelte-BdYynOck.js.map +0 -1
  429. package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +0 -1
  430. package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +0 -1
  431. package/build/server/chunks/_server.ts-BStnNIcq.js +0 -34
  432. package/build/server/chunks/_server.ts-BStnNIcq.js.map +0 -1
  433. package/build/server/chunks/_server.ts-CAxsWKvS.js.map +0 -1
  434. package/build/server/chunks/_server.ts-COu0vNpd.js.map +0 -1
  435. package/build/server/chunks/_server.ts-CTpcLUH8.js.map +0 -1
  436. package/build/server/chunks/_server.ts-Cf84YIaW.js +0 -25
  437. package/build/server/chunks/_server.ts-Cf84YIaW.js.map +0 -1
  438. package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +0 -1
  439. package/build/server/chunks/_server.ts-CtH0dhUp.js +0 -71
  440. package/build/server/chunks/_server.ts-CtH0dhUp.js.map +0 -1
  441. package/build/server/chunks/_server.ts-DB_Kg97c.js.map +0 -1
  442. package/build/server/chunks/_server.ts-DYpJImqd.js.map +0 -1
  443. package/build/server/chunks/_server.ts-Deok2y88.js.map +0 -1
  444. package/build/server/chunks/_server.ts-tSpgyl1D.js.map +0 -1
  445. package/build/server/chunks/_server.ts-vekTmWAx.js.map +0 -1
  446. package/build/server/chunks/client2-CCBGA-2V.js +0 -7
  447. package/build/server/chunks/index-server-CrDaL06Y.js.map +0 -1
  448. package/build/server/chunks/index2-CgclKpUj.js.map +0 -1
  449. package/build/server/chunks/library-apns-BqJbvSKh.js.map +0 -1
  450. package/build/server/chunks/pty-manager-BQVB7IVj.js.map +0 -1
  451. package/build/server/chunks/root-DDSnEAZv.js.map +0 -1
  452. package/build/server/chunks/shared-server-sSGG17Df.js.map +0 -1
  453. package/build/server/chunks/state.svelte-hBbXlUak.js.map +0 -1
  454. package/src/generated/types/Client.ts +0 -589
  455. package/src/lib/types/config.ts +0 -1
  456. /package/build/client/_app/immutable/assets/{4.BFUut--w.css → 6.BFUut--w.css} +0 -0
  457. /package/build/client/_app/immutable/assets/{4.BFUut--w.css.br → 6.BFUut--w.css.br} +0 -0
  458. /package/build/client/_app/immutable/assets/{4.BFUut--w.css.gz → 6.BFUut--w.css.gz} +0 -0
  459. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css → 7.BTOx7yt7.css} +0 -0
  460. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.br → 7.BTOx7yt7.css.br} +0 -0
  461. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.gz → 7.BTOx7yt7.css.gz} +0 -0
  462. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css → 8.eZGZN-BF.css} +0 -0
  463. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.br → 8.eZGZN-BF.css.br} +0 -0
  464. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.gz → 8.eZGZN-BF.css.gz} +0 -0
  465. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css → 9.DwS5ZHBh.css} +0 -0
  466. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.br → 9.DwS5ZHBh.css.br} +0 -0
  467. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.gz → 9.DwS5ZHBh.css.gz} +0 -0
  468. /package/src/{generated/types → lib/types/generated}/API.ts +0 -0
  469. /package/src/{generated/types → lib/types/generated}/APN.ts +0 -0
  470. /package/src/{generated/types → lib/types/generated}/CLI.ts +0 -0
  471. /package/src/{generated/types → lib/types/generated}/Config.ts +0 -0
  472. /package/src/{generated/types → lib/types/generated}/Holder.ts +0 -0
  473. /package/src/{generated/types → lib/types/generated}/JWT.ts +0 -0
  474. /package/src/{generated/types → lib/types/generated}/Notification.ts +0 -0
  475. /package/src/{generated/types → lib/types/generated}/OpenCode.ts +0 -0
  476. /package/src/{generated/types → lib/types/generated}/Sessions.ts +0 -0
  477. /package/src/{generated/types → lib/types/generated}/Terminal.ts +0 -0
  478. /package/src/{generated/types → lib/types/generated}/index.ts +0 -0
package/scripts/setup.cjs CHANGED
@@ -10,7 +10,6 @@ const crypto = require('crypto');
10
10
  const fs = require('fs');
11
11
  const path = require('path');
12
12
 
13
-
14
13
  // ── ANSI helpers ─────────────────────────────────────────────────────
15
14
  const C = {
16
15
  reset: '\x1b[0m',
@@ -52,10 +51,28 @@ function escapeForDoubleQuotedShell(s) {
52
51
  return s.replace(/[\\"$`]/g, '\\$&');
53
52
  }
54
53
 
55
- // ── Secure key generator ─────────────────────────────────────────────
56
- // Produces a 256-bit random hex key (64 characters).
57
- function generateSecureKey() {
58
- return crypto.randomBytes(32).toString('hex');
54
+ // ── API key generator ────────────────────────────────────────────────
55
+ // Produces a readable key: <machinename><4 random hex chars>
56
+ // e.g. "sachinsharma567f"
57
+ // Easy to recognise, type, and remember — still unique per install.
58
+ function generateApiKey() {
59
+ const os = require('os');
60
+ // Take only the letters-only leading portion of the hostname — strips
61
+ // device serial suffixes like HCW39CV9MH which always contain digits.
62
+ const name =
63
+ os
64
+ .hostname()
65
+ .toLowerCase()
66
+ .replace(/\.local$/, '') // strip macOS .local suffix
67
+ .replace(/[^a-z0-9]/g, ' ') // turn separators into spaces
68
+ .trim()
69
+ .split(' ')
70
+ .filter((p) => /^[a-z]+$/.test(p)) // keep only pure-letter segments
71
+ .join('')
72
+ .slice(0, 20) || 'shooter';
73
+
74
+ const suffix = crypto.randomBytes(16).toString('hex'); // 128 bits of entropy
75
+ return `${name}-${suffix}`;
59
76
  }
60
77
 
61
78
  // ── Globals ──────────────────────────────────────────────────────────
@@ -67,6 +84,52 @@ const PUSH_MODE = process.argv.includes('--push');
67
84
 
68
85
  let rl; // readline interface — created in main()
69
86
 
87
+ // ── AI Provider Registry ─────────────────────────────────────────────
88
+ const PROVIDER_REGISTRY = [
89
+ {
90
+ envKeys: ['GOOGLE_AI_API_KEY'],
91
+ hint: 'Get free at https://aistudio.google.com/apikey',
92
+ id: 'google-ai',
93
+ label: 'Google AI (Gemini)',
94
+ },
95
+ {
96
+ envKeys: ['ANTHROPIC_API_KEY'],
97
+ hint: 'Get at https://console.anthropic.com',
98
+ id: 'anthropic',
99
+ label: 'Anthropic (Claude)',
100
+ },
101
+ {
102
+ envKeys: ['OPENAI_API_KEY'],
103
+ hint: 'Get at https://platform.openai.com/api-keys',
104
+ id: 'openai',
105
+ label: 'OpenAI (GPT)',
106
+ },
107
+ {
108
+ envKeys: ['MISTRAL_API_KEY'],
109
+ hint: 'Get at https://console.mistral.ai',
110
+ id: 'mistral',
111
+ label: 'Mistral',
112
+ },
113
+ {
114
+ extraKeys: ['LITELLM_MODEL'],
115
+ envKeys: ['LITELLM_API_KEY', 'LITELLM_BASE_URL'],
116
+ hint: 'Local OpenAI-compatible proxy',
117
+ id: 'litellm',
118
+ label: 'LiteLLM (local)',
119
+ },
120
+ ];
121
+
122
+ const AI_ENV_KEYS = [
123
+ 'ANTHROPIC_API_KEY',
124
+ 'GOOGLE_AI_API_KEY',
125
+ 'LITELLM_API_KEY',
126
+ 'LITELLM_BASE_URL',
127
+ 'LITELLM_MODEL',
128
+ 'MISTRAL_API_KEY',
129
+ 'NEUROLINK_PROVIDER',
130
+ 'OPENAI_API_KEY',
131
+ ];
132
+
70
133
  // ── Auto-incrementing step counter ──────────────────────────────────
71
134
  let _stepNum = 0;
72
135
  let _totalSteps = 5;
@@ -200,6 +263,83 @@ function validateEmail(email) {
200
263
  return null;
201
264
  }
202
265
 
266
+ // ── Collect AI Provider Config ───────────────────────────────────────
267
+ async function collectAIConfig(config) {
268
+ step('AI-Powered Features (Optional)');
269
+ console.log('');
270
+ console.log(' Shooter uses NeuroLink to generate AI summaries of your coding sessions.');
271
+ console.log(' You can configure one or more AI providers.');
272
+ console.log('');
273
+
274
+ if (AUTO_MODE) {
275
+ console.log(dim(' Skipping AI provider configuration in --auto mode.'));
276
+ console.log('');
277
+ return;
278
+ }
279
+
280
+ const wantAI = await confirm('Configure AI providers?');
281
+ if (!wantAI) {
282
+ console.log(' Skipped — summaries will use basic text fallback.');
283
+ return;
284
+ }
285
+
286
+ console.log('');
287
+ console.log(' Available providers:');
288
+ PROVIDER_REGISTRY.forEach((p, i) => {
289
+ console.log(` ${i + 1}. ${p.label}`);
290
+ });
291
+ console.log(` ${PROVIDER_REGISTRY.length + 1}. Skip`);
292
+ console.log('');
293
+
294
+ let configureMore = true;
295
+ while (configureMore) {
296
+ const choice = await askRequired(
297
+ `Choose provider (1-${PROVIDER_REGISTRY.length + 1})`,
298
+ (val) => {
299
+ const n = parseInt(val, 10);
300
+ return n >= 1 && n <= PROVIDER_REGISTRY.length + 1
301
+ ? null
302
+ : `Enter a number 1-${PROVIDER_REGISTRY.length + 1}`;
303
+ }
304
+ );
305
+
306
+ const idx = parseInt(choice, 10) - 1;
307
+ if (idx >= PROVIDER_REGISTRY.length) {
308
+ break;
309
+ }
310
+
311
+ const provider = PROVIDER_REGISTRY[idx];
312
+ console.log(` ${provider.hint}`);
313
+
314
+ for (const envKey of provider.envKeys) {
315
+ const value = await askRequired(`${envKey}`, (val) =>
316
+ val.length > 10 ? null : 'Key seems too short'
317
+ );
318
+ config[envKey] = value;
319
+ }
320
+
321
+ // Extra optional keys (e.g., LITELLM_MODEL)
322
+ if (provider.extraKeys) {
323
+ for (const envKey of provider.extraKeys) {
324
+ const value = await ask(`${envKey} (Enter to skip)`);
325
+ if (value) {
326
+ config[envKey] = value;
327
+ }
328
+ }
329
+ }
330
+
331
+ // Set as preferred provider if first one configured
332
+ if (!config.NEUROLINK_PROVIDER) {
333
+ config.NEUROLINK_PROVIDER = provider.id;
334
+ }
335
+
336
+ console.log(` ✓ ${provider.label} configured`);
337
+ console.log('');
338
+
339
+ configureMore = await confirm('Configure another provider?');
340
+ }
341
+ }
342
+
203
343
  // ── Collect configuration ────────────────────────────────────────────
204
344
 
205
345
  // ── Collect push notification config (separate flow) ────────────────
@@ -214,13 +354,10 @@ async function collectPushConfig(config) {
214
354
 
215
355
  // APNs key (.p8) — accept file path or pasted content, with retry on invalid input
216
356
  async function askForP8Key() {
217
- const apnsKeyInput = await askRequired(
218
- ` APNS_KEY (.p8 file path or paste key): `,
219
- (val) => {
220
- if (!val) return 'APNs key is required.';
221
- return null;
222
- }
223
- );
357
+ const apnsKeyInput = await askRequired(` APNS_KEY (.p8 file path or paste key): `, (val) => {
358
+ if (!val) return 'APNs key is required.';
359
+ return null;
360
+ });
224
361
 
225
362
  let key;
226
363
 
@@ -239,7 +376,9 @@ async function collectPushConfig(config) {
239
376
  } else {
240
377
  // Might be a partial path or multiline paste — try multiline
241
378
  console.log(yellow(' Input does not look like a file path or key.'));
242
- console.log(dim(' Paste the full .p8 key contents (press Enter on empty line to finish):'));
379
+ console.log(
380
+ dim(' Paste the full .p8 key contents (press Enter on empty line to finish):')
381
+ );
243
382
  const lines = [apnsKeyInput];
244
383
  while (true) {
245
384
  const line = await ask('');
@@ -325,7 +464,9 @@ async function collectPushConfig(config) {
325
464
  }
326
465
 
327
466
  if (!config.fcmPrivateKey.includes('BEGIN')) {
328
- console.log(yellow(' Warning: Key does not look like a PEM private key. Continuing anyway.'));
467
+ console.log(
468
+ yellow(' Warning: Key does not look like a PEM private key. Continuing anyway.')
469
+ );
329
470
  }
330
471
  console.log('');
331
472
 
@@ -339,6 +480,25 @@ async function collectPushConfig(config) {
339
480
  console.log('');
340
481
  }
341
482
 
483
+ // ── Load existing AI config from .env (preserve during re-run) ──────────
484
+
485
+ function loadExistingAIConfig(config) {
486
+ if (!fs.existsSync(DOT_ENV_PATH)) return;
487
+ const existing = fs.readFileSync(DOT_ENV_PATH, 'utf-8');
488
+
489
+ const get = (key) => {
490
+ const m = existing.match(new RegExp(`^${key}=["']?(.+?)["']?$`, 'm'));
491
+ return m ? m[1] : '';
492
+ };
493
+
494
+ for (const key of AI_ENV_KEYS) {
495
+ const value = get(key);
496
+ if (value) {
497
+ config[key] = value;
498
+ }
499
+ }
500
+ }
501
+
342
502
  // ── Load existing push config from .env (preserve during non-push setup) ──
343
503
 
344
504
  function loadExistingPushConfig(config) {
@@ -408,20 +568,29 @@ async function collectConfig() {
408
568
  const maskedKey = mask(config.apiKey);
409
569
  console.log(green(` Existing API key preserved: ${maskedKey}`));
410
570
  loadExistingPushConfig(config);
571
+ loadExistingAIConfig(config); // Load existing AI config in auto mode
411
572
  if (config.wantIos || config.wantAndroid) {
412
573
  console.log(green(' Existing push config preserved.'));
413
574
  } else {
414
- console.log(dim(' Push notifications not configured (add later with "shooter setup --push")'));
575
+ console.log(
576
+ dim(' Push notifications not configured (add later with "shooter setup --push")')
577
+ );
578
+ }
579
+ if (config.NEUROLINK_PROVIDER) {
580
+ console.log(green(' Existing AI config preserved.'));
581
+ } else {
582
+ console.log(dim(' AI providers not configured (add later with "shooter setup")'));
415
583
  }
416
584
  console.log('');
417
585
  return config;
418
586
  }
419
587
  }
420
588
 
421
- config.apiKey = generateSecureKey();
589
+ config.apiKey = generateApiKey(); // Changed to generateApiKey()
422
590
  const maskedKey = mask(config.apiKey);
423
591
  console.log(green(` API key generated: ${maskedKey}`));
424
592
  console.log(dim(' Push notifications not configured (add later with "shooter setup --push")'));
593
+ console.log(dim(' AI providers not configured (add later with "shooter setup")'));
425
594
  console.log('');
426
595
  return config;
427
596
  }
@@ -432,7 +601,7 @@ async function collectConfig() {
432
601
  if (apiKeyAnswer) {
433
602
  config.apiKey = apiKeyAnswer;
434
603
  } else {
435
- config.apiKey = generateSecureKey();
604
+ config.apiKey = generateApiKey(); // Changed to generateApiKey()
436
605
  const maskedKey = mask(config.apiKey);
437
606
  console.log(green(` Generated API key: ${maskedKey}`));
438
607
  console.log(dim(' (Saved to ~/.shooter/.env)'));
@@ -460,6 +629,10 @@ async function collectConfig() {
460
629
  console.log('');
461
630
  }
462
631
 
632
+ // ── AI Providers ───────────────────────────────────────────────────
633
+ loadExistingAIConfig(config);
634
+ await collectAIConfig(config);
635
+
463
636
  return config;
464
637
  }
465
638
 
@@ -471,7 +644,7 @@ function buildEnvContent(config) {
471
644
  `# ${new Date().toISOString()}`,
472
645
  '',
473
646
  '# Authentication',
474
- `API_KEY="${escapeForDoubleQuotedShell(config.apiKey)}"`,
647
+ `API_KEY=${config.apiKey}`,
475
648
  '',
476
649
  ];
477
650
 
@@ -531,6 +704,17 @@ function buildEnvContent(config) {
531
704
  }
532
705
  lines.push('');
533
706
 
707
+ // AI / NeuroLink — preserve existing AI keys across re-runs
708
+ lines.push('# AI / NeuroLink');
709
+ for (const key of AI_ENV_KEYS) {
710
+ if (config[key]) {
711
+ lines.push(`${key}=${config[key]}`);
712
+ } else {
713
+ lines.push(`# ${key}=`);
714
+ }
715
+ }
716
+ lines.push('');
717
+
534
718
  // Server
535
719
  lines.push('# Server');
536
720
  lines.push('# PORT=54007');
@@ -605,9 +789,9 @@ async function main() {
605
789
  rl.close();
606
790
  });
607
791
 
608
- // Reset step counter; push mode adds one extra step
792
+ // Reset step counter; push mode adds one extra step, AI step adds another
609
793
  _stepNum = 0;
610
- _totalSteps = (PUSH_MODE && !AUTO_MODE) ? 6 : 5;
794
+ _totalSteps = AUTO_MODE ? 5 : PUSH_MODE ? 7 : 6;
611
795
 
612
796
  printBanner();
613
797
 
@@ -641,14 +825,19 @@ async function main() {
641
825
  if (!cloudflaredAvailable) {
642
826
  console.log(yellow(' cloudflared not found.'));
643
827
  console.log(dim(' Install it to get a public URL for your phone:'));
644
- console.log(dim(' https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/'));
828
+ console.log(
829
+ dim(
830
+ ' https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/'
831
+ )
832
+ );
645
833
  console.log('');
646
834
  console.log(dim(' Once installed, run:'));
647
835
  console.log(cyan(' cloudflared tunnel --url http://localhost:54007'));
648
836
  console.log('');
649
837
  } else {
650
838
  const port = process.env.PORT || 54007;
651
- const startTunnel = AUTO_MODE || await confirm(' Start a Cloudflare Tunnel now to get your public URL?');
839
+ const startTunnel =
840
+ AUTO_MODE || (await confirm(' Start a Cloudflare Tunnel now to get your public URL?'));
652
841
  if (startTunnel) {
653
842
  console.log(dim('\n Starting tunnel... (this may take a few seconds)\n'));
654
843
  await new Promise((resolve) => {
@@ -665,7 +854,11 @@ async function main() {
665
854
  console.log(green(' Tunnel URL (use this on your phone):'));
666
855
  console.log(`\n ${C.bold}${C.cyan}${match[0]}${C.reset}\n`);
667
856
  console.log(dim(' Keep this terminal session open to maintain the tunnel.'));
668
- console.log(dim(' For a persistent tunnel, see: https://developers.cloudflare.com/cloudflare-one/'));
857
+ console.log(
858
+ dim(
859
+ ' For a persistent tunnel, see: https://developers.cloudflare.com/cloudflare-one/'
860
+ )
861
+ );
669
862
  console.log('');
670
863
  resolve();
671
864
  }
@@ -722,7 +915,9 @@ async function main() {
722
915
  if (!config.wantIos && !config.wantAndroid) {
723
916
  console.log(bold(' Optional add-ons:'));
724
917
  console.log(` ${dim('Push notifications:')} ${cyan('shooter setup --push')}`);
725
- console.log(` ${dim('Cloudflare Tunnel:')} ${cyan('shooter start')} ${dim('(auto-starts tunnel)')}`);
918
+ console.log(
919
+ ` ${dim('Cloudflare Tunnel:')} ${cyan('shooter start')} ${dim('(auto-starts tunnel)')}`
920
+ );
726
921
  console.log('');
727
922
  } else {
728
923
  const platforms = [];
@@ -29,9 +29,9 @@ echo "vercel env add APNS_BUNDLE_ID"
29
29
  echo "# Enter: YOUR_BUNDLE_ID_HERE (from .env file)"
30
30
  echo ""
31
31
 
32
- echo "# 5. APNs Private Key (Base64)"
33
- echo "vercel env add APNS_KEY_BASE64"
34
- echo "# Enter: YOUR_BASE64_APNS_KEY_HERE (extract from .env between BEGIN/END PRIVATE KEY)"
32
+ echo "# 5. APNs Private Key"
33
+ echo "vercel env add APNS_KEY"
34
+ echo "# Enter: YOUR_APNS_KEY_HERE (.p8 file contents, including BEGIN/END PRIVATE KEY lines)"
35
35
  echo ""
36
36
 
37
37
  echo "# 6. Device Token (Optional)"
package/server.ts CHANGED
@@ -5,14 +5,14 @@
5
5
  // Load .env before any other imports so all modules see populated process.env.
6
6
  import './src/lib/env.js';
7
7
 
8
+ import type { ConversationMessage } from '$lib/types';
9
+
8
10
  import { existsSync } from 'fs';
9
11
  import { createServer, type Server } from 'http';
10
12
  import { dirname, join } from 'path';
11
13
  import { fileURLToPath } from 'url';
12
14
  import { type WebSocket, WebSocketServer } from 'ws';
13
15
 
14
- import type { ConversationMessage } from './src/lib/modules/server/sessions/types.js';
15
-
16
16
  // ── Build guard ─────────────────────────────────────────────────────────
17
17
  // Fail fast with a clear message instead of a cryptic ERR_MODULE_NOT_FOUND.
18
18
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -87,7 +87,7 @@ const sessionWatcherAdapter = {
87
87
 
88
88
  if (!process.env.API_KEY) {
89
89
  console.warn(
90
- `\n⚠ WARNING: API_KEY is not set. Authenticated API routes will return 401.\n Run 'shooter setup' to configure, or set API_KEY in your environment.\n`,
90
+ `\n⚠ WARNING: API_KEY is not set. Authenticated API routes will return 401.\n Run 'shooter setup' to configure, or set API_KEY in your environment.\n`
91
91
  );
92
92
  }
93
93
 
package/src/app.html CHANGED
@@ -20,6 +20,169 @@
20
20
  %sveltekit.head%
21
21
  </head>
22
22
  <body data-sveltekit-preload-data="hover">
23
+ <script>
24
+ // Global shims for NeuroLink browser SDK — must run before any module code
25
+ (function () {
26
+ var noop = function () {};
27
+ if (typeof globalThis.process === 'undefined') {
28
+ var p = {
29
+ env: {},
30
+ version: 'v24.0.0',
31
+ platform: 'browser',
32
+ argv: [],
33
+ pid: 1,
34
+ cwd: function () {
35
+ return '/';
36
+ },
37
+ exit: noop,
38
+ on: function () {
39
+ return p;
40
+ },
41
+ off: function () {
42
+ return p;
43
+ },
44
+ once: function () {
45
+ return p;
46
+ },
47
+ emit: function () {
48
+ return false;
49
+ },
50
+ removeListener: function () {
51
+ return p;
52
+ },
53
+ addListener: function () {
54
+ return p;
55
+ },
56
+ stdout: {
57
+ write: function () {
58
+ return true;
59
+ },
60
+ on: noop,
61
+ },
62
+ stderr: {
63
+ write: function () {
64
+ return true;
65
+ },
66
+ on: noop,
67
+ },
68
+ stdin: { on: noop },
69
+ nextTick: function (fn) {
70
+ setTimeout(fn, 0);
71
+ },
72
+ hrtime: Object.assign(
73
+ function (t) {
74
+ var n = performance.now() * 1e6;
75
+ var s = Math.floor(n / 1e9);
76
+ var ns = Math.floor(n % 1e9);
77
+ if (!t) return [s, ns];
78
+ var ds = s - t[0];
79
+ var dns = ns - t[1];
80
+ if (dns < 0) {
81
+ ds -= 1;
82
+ dns += 1e9;
83
+ }
84
+ return [ds, dns];
85
+ },
86
+ {
87
+ bigint: function () {
88
+ return BigInt(Math.floor(performance.now() * 1e6));
89
+ },
90
+ }
91
+ ),
92
+ memoryUsage: function () {
93
+ return { rss: 0, heapTotal: 0, heapUsed: 0, external: 0, arrayBuffers: 0 };
94
+ },
95
+ cpuUsage: function () {
96
+ return { user: 0, system: 0 };
97
+ },
98
+ versions: { browser: '1.0.0', node: '24.0.0', v8: '0', modules: '0' },
99
+ release: { name: 'browser' },
100
+ uptime: function () {
101
+ return performance.now() / 1000;
102
+ },
103
+ title: 'browser',
104
+ execPath: '/',
105
+ execArgv: [],
106
+ features: {},
107
+ config: {},
108
+ kill: noop,
109
+ abort: noop,
110
+ };
111
+ globalThis.process = new Proxy(p, {
112
+ get: function (t, k) {
113
+ return k in t ? t[k] : noop;
114
+ },
115
+ });
116
+ }
117
+ if (typeof globalThis.Buffer === 'undefined') {
118
+ function B() {}
119
+ B.from = function (d, e) {
120
+ if (typeof d === 'string') {
121
+ if (e === 'base64') {
122
+ var b = atob(d);
123
+ var u = new Uint8Array(b.length);
124
+ for (var i = 0; i < b.length; i++) u[i] = b.charCodeAt(i);
125
+ return u;
126
+ }
127
+ return new TextEncoder().encode(d);
128
+ }
129
+ return new Uint8Array(d);
130
+ };
131
+ B.alloc = function (n) {
132
+ return new Uint8Array(n);
133
+ };
134
+ B.isBuffer = function (o) {
135
+ return o instanceof Uint8Array;
136
+ };
137
+ B.concat = function (l) {
138
+ var t = 0;
139
+ for (var i = 0; i < l.length; i++) t += l[i].length;
140
+ var r = new Uint8Array(t);
141
+ var o = 0;
142
+ for (var i = 0; i < l.length; i++) {
143
+ r.set(l[i], o);
144
+ o += l[i].length;
145
+ }
146
+ return r;
147
+ };
148
+ B.byteLength = function (s) {
149
+ return new TextEncoder().encode(s).length;
150
+ };
151
+ globalThis.Buffer = B;
152
+ }
153
+ if (typeof globalThis.global === 'undefined') globalThis.global = globalThis;
154
+ var oST = globalThis.setTimeout.bind(globalThis),
155
+ oSI = globalThis.setInterval.bind(globalThis),
156
+ oCT = globalThis.clearTimeout.bind(globalThis),
157
+ oCI = globalThis.clearInterval.bind(globalThis);
158
+ function wT(id) {
159
+ return {
160
+ valueOf: function () {
161
+ return id;
162
+ },
163
+ ref: function () {
164
+ return this;
165
+ },
166
+ unref: function () {
167
+ return this;
168
+ },
169
+ _id: id,
170
+ };
171
+ }
172
+ globalThis.setTimeout = function () {
173
+ return wT(oST.apply(null, arguments));
174
+ };
175
+ globalThis.setInterval = function () {
176
+ return wT(oSI.apply(null, arguments));
177
+ };
178
+ globalThis.clearTimeout = function (t) {
179
+ oCT(t && t._id !== undefined ? t._id : t);
180
+ };
181
+ globalThis.clearInterval = function (t) {
182
+ oCI(t && t._id !== undefined ? t._id : t);
183
+ };
184
+ })();
185
+ </script>
23
186
  <div style="display: contents">%sveltekit.body%</div>
24
187
  </body>
25
188
  </html>