@juspay/shooter 1.4.0 → 1.6.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 (480) hide show
  1. package/.claude/hooks/notifier.cjs +15 -1
  2. package/README.md +132 -36
  3. package/bin/shooter.cjs +98 -29
  4. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css +1 -0
  5. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/3.DHxQoulp.css +1 -0
  8. package/build/client/_app/immutable/assets/3.DHxQoulp.css.br +0 -0
  9. package/build/client/_app/immutable/assets/3.DHxQoulp.css.gz +0 -0
  10. package/build/client/_app/immutable/assets/{3.DGDHCVnW.css → 4.D5l1JxgO.css} +1 -1
  11. package/build/client/_app/immutable/assets/4.D5l1JxgO.css.br +0 -0
  12. package/build/client/_app/immutable/assets/4.D5l1JxgO.css.gz +0 -0
  13. package/build/client/_app/immutable/assets/5.C5qz-NeI.css +1 -0
  14. package/build/client/_app/immutable/assets/5.C5qz-NeI.css.br +0 -0
  15. package/build/client/_app/immutable/assets/5.C5qz-NeI.css.gz +0 -0
  16. package/build/client/_app/immutable/chunks/1mEchsPO.js +1 -0
  17. package/build/client/_app/immutable/chunks/1mEchsPO.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/1mEchsPO.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/B7X-vhXI.js +1 -0
  20. package/build/client/_app/immutable/chunks/B7X-vhXI.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/B7X-vhXI.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BRkqKgVG.js +1 -0
  23. package/build/client/_app/immutable/chunks/BRkqKgVG.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BRkqKgVG.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js +1 -0
  26. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.br +2 -0
  27. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/CGMJxf7r.js +1 -0
  29. package/build/client/_app/immutable/chunks/CGMJxf7r.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/CGMJxf7r.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/{CZHsSL_X.js → CJFjKwJ7.js} +1 -1
  32. package/build/client/_app/immutable/chunks/CJFjKwJ7.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/CJFjKwJ7.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/CNH2HlKj.js +20 -0
  35. package/build/client/_app/immutable/chunks/CNH2HlKj.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/CNH2HlKj.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/CR6bkGJW.js +6 -0
  38. package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/CVtJ6yRM.js +1 -0
  41. package/build/client/_app/immutable/chunks/CVtJ6yRM.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/CVtJ6yRM.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{CSoRdFvv.js → CaiJSUi3.js} +1 -1
  44. package/build/client/_app/immutable/chunks/CaiJSUi3.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/CaiJSUi3.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/{DjsDGxCa.js → CmczWE_d.js} +4 -4
  47. package/build/client/_app/immutable/chunks/CmczWE_d.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/CmczWE_d.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/{CDVSripB.js → CqfYvnci.js} +1 -1
  50. package/build/client/_app/immutable/chunks/CqfYvnci.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/CqfYvnci.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/CsgHjHGZ.js +1 -0
  53. package/build/client/_app/immutable/chunks/CsgHjHGZ.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/CsgHjHGZ.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/{UJOiqIYE.js → CtrCjGZT.js} +1 -1
  56. package/build/client/_app/immutable/chunks/CtrCjGZT.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/CtrCjGZT.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/DDiOVAd8.js +61 -0
  59. package/build/client/_app/immutable/chunks/DDiOVAd8.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/DDiOVAd8.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/DVl0sebP.js +2 -0
  62. package/build/client/_app/immutable/chunks/DVl0sebP.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/DVl0sebP.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/EhLZwqfu.js +3 -0
  65. package/build/client/_app/immutable/chunks/EhLZwqfu.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/EhLZwqfu.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/gQJcRhou.js +1 -0
  68. package/build/client/_app/immutable/chunks/gQJcRhou.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/gQJcRhou.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/pRcLbE0d.js +1 -0
  71. package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/{CF4lQ45j.js → y_g-KC7l.js} +1 -1
  74. package/build/client/_app/immutable/chunks/y_g-KC7l.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/y_g-KC7l.js.gz +0 -0
  76. package/build/client/_app/immutable/entry/app.zJvbFXsj.js +2 -0
  77. package/build/client/_app/immutable/entry/app.zJvbFXsj.js.br +0 -0
  78. package/build/client/_app/immutable/entry/app.zJvbFXsj.js.gz +0 -0
  79. package/build/client/_app/immutable/entry/start.B2Jf5iFd.js +1 -0
  80. package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.br +2 -0
  81. package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.gz +0 -0
  82. package/build/client/_app/immutable/nodes/0.B_E4j3MX.js +1 -0
  83. package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.br +0 -0
  84. package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.gz +0 -0
  85. package/build/client/_app/immutable/nodes/1.B0oFqb8X.js +1 -0
  86. package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.br +0 -0
  87. package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.gz +0 -0
  88. package/build/client/_app/immutable/nodes/2.Bqul0XyM.js +13 -0
  89. package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.br +0 -0
  90. package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.gz +0 -0
  91. package/build/client/_app/immutable/nodes/3.CTqUQKSN.js +9 -0
  92. package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.br +0 -0
  93. package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.gz +0 -0
  94. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js +4 -0
  95. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.br +0 -0
  96. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.gz +0 -0
  97. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js +1 -0
  98. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.br +0 -0
  99. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.gz +0 -0
  100. package/build/client/_app/immutable/nodes/6.BvjUfHnH.js +1 -0
  101. package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.br +0 -0
  102. package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.gz +0 -0
  103. package/build/client/_app/immutable/nodes/{5.g3R-QfIW.js → 7.5K7Od8ba.js} +3 -3
  104. package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.br +0 -0
  105. package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.gz +0 -0
  106. package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js +2 -0
  107. package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.br +0 -0
  108. package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.gz +0 -0
  109. package/build/client/_app/immutable/nodes/9.1fMlGdqv.js +2 -0
  110. package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.br +0 -0
  111. package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.gz +0 -0
  112. package/build/client/_app/version.json +1 -1
  113. package/build/client/_app/version.json.br +0 -0
  114. package/build/client/_app/version.json.gz +0 -0
  115. package/build/server/chunks/0-e1fgD9Mi.js +23 -0
  116. package/build/server/chunks/0-e1fgD9Mi.js.map +1 -0
  117. package/build/server/chunks/1-D2_XVthm.js +9 -0
  118. package/build/server/chunks/{1-BV7u1xGo.js.map → 1-D2_XVthm.js.map} +1 -1
  119. package/build/server/chunks/2-DADX86JZ.js +21 -0
  120. package/build/server/chunks/2-DADX86JZ.js.map +1 -0
  121. package/build/server/chunks/3-CHacdiCg.js +21 -0
  122. package/build/server/chunks/3-CHacdiCg.js.map +1 -0
  123. package/build/server/chunks/4-0UE_6Ep-.js +23 -0
  124. package/build/server/chunks/4-0UE_6Ep-.js.map +1 -0
  125. package/build/server/chunks/5-BBIP1PzX.js +24 -0
  126. package/build/server/chunks/5-BBIP1PzX.js.map +1 -0
  127. package/build/server/chunks/6-CWLNQu6F.js +9 -0
  128. package/build/server/chunks/6-CWLNQu6F.js.map +1 -0
  129. package/build/server/chunks/7-DmQ3B8uy.js +9 -0
  130. package/build/server/chunks/7-DmQ3B8uy.js.map +1 -0
  131. package/build/server/chunks/8-CnFVjQtZ.js +9 -0
  132. package/build/server/chunks/8-CnFVjQtZ.js.map +1 -0
  133. package/build/server/chunks/9-Dw7-P6aF.js +9 -0
  134. package/build/server/chunks/9-Dw7-P6aF.js.map +1 -0
  135. package/build/server/chunks/{Button-Cs1aE6ka.js → Button-WKgiLWZI.js} +4 -9
  136. package/build/server/chunks/Button-WKgiLWZI.js.map +1 -0
  137. package/build/server/chunks/{EmptyState-DDFH1K8g.js → EmptyState-BUBqASsp.js} +3 -3
  138. package/build/server/chunks/{EmptyState-DDFH1K8g.js.map → EmptyState-BUBqASsp.js.map} +1 -1
  139. package/build/server/chunks/{Icon-CEUrotA6.js → Icon-BNBAg85a.js} +3 -3
  140. package/build/server/chunks/Icon-BNBAg85a.js.map +1 -0
  141. package/build/server/chunks/{Shimmer-DB8W1zt6.js → Shimmer-C4uBVwxz.js} +2 -2
  142. package/build/server/chunks/{Shimmer-DB8W1zt6.js.map → Shimmer-C4uBVwxz.js.map} +1 -1
  143. package/build/server/chunks/{_error.svelte-uCOJNxvr.js → _error.svelte-DkIwmECt.js} +5 -5
  144. package/build/server/chunks/{_error.svelte-uCOJNxvr.js.map → _error.svelte-DkIwmECt.js.map} +1 -1
  145. package/build/server/chunks/{_layout.svelte-CtWmEJwe.js → _layout.svelte-DllETxmJ.js} +13 -7
  146. package/build/server/chunks/_layout.svelte-DllETxmJ.js.map +1 -0
  147. package/build/server/chunks/_page.svelte-BZSdLKE_.js +118 -0
  148. package/build/server/chunks/_page.svelte-BZSdLKE_.js.map +1 -0
  149. package/build/server/chunks/{_page.svelte-CxWcQ0Am.js → _page.svelte-Cmuco1mC.js} +84 -199
  150. package/build/server/chunks/_page.svelte-Cmuco1mC.js.map +1 -0
  151. package/build/server/chunks/{_page.svelte-BgevQjq1.js → _page.svelte-Co5sF7W-.js} +12 -11
  152. package/build/server/chunks/{_page.svelte-BgevQjq1.js.map → _page.svelte-Co5sF7W-.js.map} +1 -1
  153. package/build/server/chunks/{_page.svelte-DO4oa_LY.js → _page.svelte-CpL3R-VI.js} +8 -8
  154. package/build/server/chunks/{_page.svelte-DO4oa_LY.js.map → _page.svelte-CpL3R-VI.js.map} +1 -1
  155. package/build/server/chunks/_page.svelte-DDSzYLUs.js +137 -0
  156. package/build/server/chunks/_page.svelte-DDSzYLUs.js.map +1 -0
  157. package/build/server/chunks/_page.svelte-JIkgFUFf.js +26 -0
  158. package/build/server/chunks/_page.svelte-JIkgFUFf.js.map +1 -0
  159. package/build/server/chunks/{_page.svelte-CVq6tRb3.js → _page.svelte-Y9-O5a5w.js} +10 -9
  160. package/build/server/chunks/_page.svelte-Y9-O5a5w.js.map +1 -0
  161. package/build/server/chunks/{_page.svelte-BcZaKdX9.js → _page.svelte-fcX09N4d.js} +9 -9
  162. package/build/server/chunks/{_page.svelte-BcZaKdX9.js.map → _page.svelte-fcX09N4d.js.map} +1 -1
  163. package/build/server/chunks/{_server.ts-DYpJImqd.js → _server.ts-0Xr2fWaq.js} +9 -5
  164. package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +1 -0
  165. package/build/server/chunks/{_server.ts-CTpcLUH8.js → _server.ts-2ixC-X3K.js} +20 -5
  166. package/build/server/chunks/_server.ts-2ixC-X3K.js.map +1 -0
  167. package/build/server/chunks/{_server.ts-CAxsWKvS.js → _server.ts-40c_epk8.js} +20 -4
  168. package/build/server/chunks/_server.ts-40c_epk8.js.map +1 -0
  169. package/build/server/chunks/{_server.ts-WhTJBEJy.js → _server.ts-A9_tRR-K.js} +5 -4
  170. package/build/server/chunks/{_server.ts-WhTJBEJy.js.map → _server.ts-A9_tRR-K.js.map} +1 -1
  171. package/build/server/chunks/_server.ts-BRAzC6W1.js +98 -0
  172. package/build/server/chunks/_server.ts-BRAzC6W1.js.map +1 -0
  173. package/build/server/chunks/{_server.ts-DB_Kg97c.js → _server.ts-BScvgttw.js} +24 -4
  174. package/build/server/chunks/_server.ts-BScvgttw.js.map +1 -0
  175. package/build/server/chunks/{_server.ts-Ch-6iOHp.js → _server.ts-B__YN2kX.js} +121 -87
  176. package/build/server/chunks/_server.ts-B__YN2kX.js.map +1 -0
  177. package/build/server/chunks/{_server.ts-tSpgyl1D.js → _server.ts-Bjbr7glm.js} +4 -3
  178. package/build/server/chunks/_server.ts-Bjbr7glm.js.map +1 -0
  179. package/build/server/chunks/{_server.ts-COu0vNpd.js → _server.ts-BrqaMMAa.js} +7 -6
  180. package/build/server/chunks/_server.ts-BrqaMMAa.js.map +1 -0
  181. package/build/server/chunks/{_server.ts-vekTmWAx.js → _server.ts-BuYyCrnF.js} +6 -4
  182. package/build/server/chunks/_server.ts-BuYyCrnF.js.map +1 -0
  183. package/build/server/chunks/{_server.ts-Deok2y88.js → _server.ts-ByIrRtCx.js} +132 -76
  184. package/build/server/chunks/_server.ts-ByIrRtCx.js.map +1 -0
  185. package/build/server/chunks/{_server.ts-DYvb9ijZ.js → _server.ts-ByPExYfO.js} +4 -3
  186. package/build/server/chunks/{_server.ts-DYvb9ijZ.js.map → _server.ts-ByPExYfO.js.map} +1 -1
  187. package/build/server/chunks/_server.ts-CjpQ10xh.js +123 -0
  188. package/build/server/chunks/_server.ts-CjpQ10xh.js.map +1 -0
  189. package/build/server/chunks/_server.ts-CyjDrcZN.js +21 -0
  190. package/build/server/chunks/_server.ts-CyjDrcZN.js.map +1 -0
  191. package/build/server/chunks/{_server.ts-DV8zTCF9.js → _server.ts-DOGUMzPx.js} +4 -3
  192. package/build/server/chunks/{_server.ts-DV8zTCF9.js.map → _server.ts-DOGUMzPx.js.map} +1 -1
  193. package/build/server/chunks/_server.ts-DZvfyuNj.js +15 -0
  194. package/build/server/chunks/_server.ts-DZvfyuNj.js.map +1 -0
  195. package/build/server/chunks/{_server.ts-XzT2UHM1.js → _server.ts-DkPPTUPo.js} +4 -3
  196. package/build/server/chunks/{_server.ts-XzT2UHM1.js.map → _server.ts-DkPPTUPo.js.map} +1 -1
  197. package/build/server/chunks/{auth-DeCdZ83n.js → auth-DuunT7Cg.js} +2 -2
  198. package/build/server/chunks/{auth-DeCdZ83n.js.map → auth-DuunT7Cg.js.map} +1 -1
  199. package/build/server/chunks/{client-BdGHe_hY.js → client-DRtPDkMh.js} +4 -4
  200. package/build/server/chunks/{client-BdGHe_hY.js.map → client-DRtPDkMh.js.map} +1 -1
  201. package/build/server/chunks/client2-bqqmu0b7.js +7 -0
  202. package/build/server/chunks/{client2-CCBGA-2V.js.map → client2-bqqmu0b7.js.map} +1 -1
  203. package/build/server/chunks/close-BGlLztTb.js +192 -0
  204. package/build/server/chunks/close-BGlLztTb.js.map +1 -0
  205. package/build/server/chunks/events-handler-Dm1mNPQP.js +20 -0
  206. package/build/server/chunks/events-handler-Dm1mNPQP.js.map +1 -0
  207. package/build/server/chunks/html-FW6Ia4bL.js +8 -0
  208. package/build/server/chunks/html-FW6Ia4bL.js.map +1 -0
  209. package/build/server/chunks/{shared-server-sSGG17Df.js → index-CoD1IJuy.js} +2 -11
  210. package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
  211. package/build/server/chunks/{index-DwaY1cAm.js → index-DP9bWJrR.js} +2 -2
  212. package/build/server/chunks/{index-DwaY1cAm.js.map → index-DP9bWJrR.js.map} +1 -1
  213. package/build/server/chunks/{index-server-CrDaL06Y.js → index-server-BUmV4MIG.js} +2 -2
  214. package/build/server/chunks/index-server-BUmV4MIG.js.map +1 -0
  215. package/build/server/chunks/index-server2-BJrT0wnA.js +5 -0
  216. package/build/server/chunks/index-server2-BJrT0wnA.js.map +1 -0
  217. package/build/server/chunks/{index2-CgclKpUj.js → index2-D5Y19GKR.js} +2 -2
  218. package/build/server/chunks/index2-D5Y19GKR.js.map +1 -0
  219. package/build/server/chunks/{library-apns-BqJbvSKh.js → library-apns-Cf-E-DhM.js} +5 -2
  220. package/build/server/chunks/library-apns-Cf-E-DhM.js.map +1 -0
  221. package/build/server/chunks/providers-DtstoHQ0.js +17 -0
  222. package/build/server/chunks/providers-DtstoHQ0.js.map +1 -0
  223. package/build/server/chunks/{pty-manager-BQVB7IVj.js → pty-manager-TyMUpDA9.js} +41 -9
  224. package/build/server/chunks/pty-manager-TyMUpDA9.js.map +1 -0
  225. package/build/server/chunks/{root-DDSnEAZv.js → root-CATOR_0t.js} +2 -2
  226. package/build/server/chunks/root-CATOR_0t.js.map +1 -0
  227. package/build/server/chunks/shared-server-DaWdgxVh.js +11 -0
  228. package/build/server/chunks/shared-server-DaWdgxVh.js.map +1 -0
  229. package/build/server/chunks/{state.svelte-hBbXlUak.js → state.svelte-CftllyvC.js} +3 -3
  230. package/build/server/chunks/state.svelte-CftllyvC.js.map +1 -0
  231. package/build/server/chunks/{stores-DHNzYNpX.js → stores-BjL57aOK.js} +4 -4
  232. package/build/server/chunks/{stores-DHNzYNpX.js.map → stores-BjL57aOK.js.map} +1 -1
  233. package/build/server/index.js +173 -6
  234. package/build/server/index.js.map +1 -1
  235. package/build/server/manifest.js +53 -30
  236. package/build/server/manifest.js.map +1 -1
  237. package/package.json +28 -7
  238. package/scripts/dev.mjs +361 -0
  239. package/scripts/install.sh +133 -73
  240. package/scripts/{fix-generated-types.sh → postgen-types.sh} +2 -2
  241. package/scripts/setup.cjs +440 -244
  242. package/scripts/vercel-env-commands.sh +3 -3
  243. package/server.ts +3 -3
  244. package/src/app.html +163 -0
  245. package/src/lib/modules/client/activity/ActivityFeed.svelte +279 -0
  246. package/src/lib/modules/client/activity/index.ts +8 -0
  247. package/src/lib/modules/client/activity/store.svelte.ts +478 -0
  248. package/src/lib/modules/client/activity/summarizer.ts +224 -0
  249. package/src/lib/modules/client/common/Card.svelte +2 -9
  250. package/src/lib/modules/client/common/EmptyState.svelte +2 -20
  251. package/src/lib/modules/client/common/Icon.svelte +3 -7
  252. package/src/lib/modules/client/common/StatusBadge.svelte +2 -4
  253. package/src/lib/modules/client/common/config-guard.ts +22 -2
  254. package/src/lib/modules/client/common/index.ts +1 -1
  255. package/src/lib/modules/client/common/time.ts +27 -9
  256. package/src/lib/modules/client/dashboard/DashboardCard.svelte +374 -0
  257. package/src/lib/modules/client/dashboard/DashboardView.svelte +66 -0
  258. package/src/lib/modules/client/dashboard/index.ts +12 -0
  259. package/src/lib/modules/client/dashboard/store.svelte.ts +663 -0
  260. package/src/lib/modules/client/dashboard/summarizer.ts +205 -0
  261. package/src/lib/modules/client/neurolink/fetch-proxy.ts +70 -0
  262. package/src/lib/modules/client/neurolink/provider-config.ts +111 -0
  263. package/src/lib/modules/client/terminal/ChatView.svelte +46 -43
  264. package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -12
  265. package/src/lib/modules/client/terminal/ConnectionStatus.svelte +3 -6
  266. package/src/lib/modules/client/terminal/LaunchSheet.svelte +10 -21
  267. package/src/lib/modules/client/terminal/QuickKeys.svelte +4 -11
  268. package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +3 -6
  269. package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +5 -7
  270. package/src/lib/modules/client/terminal/xterm-wrapper.ts +27 -47
  271. package/src/lib/modules/server/apn/library-apns.ts +6 -3
  272. package/src/lib/modules/server/apn/notification-history.ts +2 -2
  273. package/src/lib/modules/server/apn/notification-sessions.ts +1 -3
  274. package/src/lib/modules/server/apn/pending-requests.ts +1 -1
  275. package/src/lib/modules/server/apn/types.ts +2 -52
  276. package/src/lib/modules/server/cli/index.ts +1 -30
  277. package/src/lib/modules/server/cli/runner.ts +7 -15
  278. package/src/lib/modules/server/fcm/fcm-service.ts +2 -2
  279. package/src/lib/modules/server/sessions/jsonl-parser.ts +97 -42
  280. package/src/lib/modules/server/sessions/jsonl-reader.ts +69 -60
  281. package/src/lib/modules/server/sessions/opencode-reader.ts +1 -1
  282. package/src/lib/modules/server/sessions/process-detector.ts +72 -31
  283. package/src/lib/modules/server/sessions/types.ts +2 -42
  284. package/src/lib/modules/server/terminal/holder-client.ts +11 -35
  285. package/src/lib/modules/server/terminal/opencode-watcher.ts +16 -24
  286. package/src/lib/modules/server/terminal/pty-manager.ts +40 -45
  287. package/src/lib/modules/server/terminal/session-watcher.ts +15 -17
  288. package/src/lib/modules/server/terminal/terminal-store.ts +1 -1
  289. package/src/lib/modules/server/ws/events-handler.ts +1 -16
  290. package/src/lib/modules/server/ws/keepalive.ts +1 -5
  291. package/src/lib/modules/server/ws/server.ts +1 -1
  292. package/src/lib/modules/server/ws/session-handler.ts +20 -86
  293. package/src/lib/modules/server/ws/terminal-handler.ts +28 -51
  294. package/src/lib/modules/server/ws/ticket-store.ts +1 -1
  295. package/src/lib/modules/shared/providers.ts +21 -0
  296. package/src/lib/types/activity.ts +18 -0
  297. package/src/lib/types/apn.ts +43 -0
  298. package/src/lib/types/cli.ts +39 -0
  299. package/src/lib/types/common.ts +39 -0
  300. package/src/lib/types/dashboard.ts +4 -0
  301. package/src/lib/types/generated/Client.ts +1656 -0
  302. package/src/{generated/types → lib/types/generated}/WsProtocol.ts +344 -2
  303. package/src/lib/types/index.ts +28 -0
  304. package/src/lib/types/neurolink.ts +4 -0
  305. package/src/lib/types/server.ts +93 -0
  306. package/src/lib/types/sessions.ts +59 -0
  307. package/src/lib/types/terminal-client.ts +132 -0
  308. package/src/lib/types/ws.ts +161 -0
  309. package/src/routes/+error.svelte +7 -2
  310. package/src/routes/+layout.server.ts +9 -0
  311. package/src/routes/+layout.svelte +36 -7
  312. package/src/routes/+page.server.ts +7 -0
  313. package/src/routes/+page.svelte +85 -35
  314. package/src/routes/activity/+page.server.ts +7 -0
  315. package/src/routes/activity/+page.svelte +58 -0
  316. package/src/routes/api/health/+server.ts +32 -19
  317. package/src/routes/api/neurolink-proxy/+server.ts +136 -0
  318. package/src/routes/api/notify/+server.ts +159 -84
  319. package/src/routes/api/sessions/+server.ts +1 -1
  320. package/src/routes/api/sessions/connect/+server.ts +10 -6
  321. package/src/routes/api/terminals/+server.ts +20 -1
  322. package/src/routes/api/terminals/[id]/+server.ts +16 -2
  323. package/src/routes/api/webhook/+server.ts +5 -33
  324. package/src/routes/api/ws-ticket/+server.ts +4 -4
  325. package/src/routes/config/+page.server.ts +9 -0
  326. package/src/routes/config/+page.svelte +118 -25
  327. package/src/routes/neurolink/+page.server.ts +10 -0
  328. package/src/routes/neurolink/+page.svelte +331 -0
  329. package/src/routes/project/+page.svelte +17 -12
  330. package/src/routes/session/[id]/+page.svelte +146 -62
  331. package/src/routes/terminals/+page.svelte +2 -2
  332. package/src/routes/terminals/[id]/+page.svelte +99 -88
  333. package/svelte.config.js +1 -3
  334. package/tsconfig.json +1 -0
  335. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +0 -1
  336. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +0 -1
  337. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
  338. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
  339. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
  340. package/build/client/_app/immutable/chunks/B5NAKyil.js +0 -20
  341. package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
  342. package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
  343. package/build/client/_app/immutable/chunks/B8XegpSE.js +0 -1
  344. package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
  345. package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
  346. package/build/client/_app/immutable/chunks/B8zoBsv3.js +0 -6
  347. package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
  348. package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
  349. package/build/client/_app/immutable/chunks/BN1NjBrw.js +0 -1
  350. package/build/client/_app/immutable/chunks/BN1NjBrw.js.br +0 -0
  351. package/build/client/_app/immutable/chunks/BN1NjBrw.js.gz +0 -0
  352. package/build/client/_app/immutable/chunks/BOYo8yTr.js +0 -1
  353. package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
  354. package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
  355. package/build/client/_app/immutable/chunks/Bu1aqm5j.js +0 -1
  356. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
  357. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
  358. package/build/client/_app/immutable/chunks/CDVSripB.js.br +0 -0
  359. package/build/client/_app/immutable/chunks/CDVSripB.js.gz +0 -0
  360. package/build/client/_app/immutable/chunks/CF4lQ45j.js.br +0 -0
  361. package/build/client/_app/immutable/chunks/CF4lQ45j.js.gz +0 -0
  362. package/build/client/_app/immutable/chunks/CQjSATpv.js +0 -61
  363. package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
  366. package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
  367. package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
  368. package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
  369. package/build/client/_app/immutable/chunks/DSU1n5N_.js +0 -1
  370. package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
  371. package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
  372. package/build/client/_app/immutable/chunks/DVkn4r72.js +0 -1
  373. package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
  374. package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
  375. package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
  376. package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
  377. package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
  378. package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
  379. package/build/client/_app/immutable/chunks/r0JawsZc.js +0 -2
  380. package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
  381. package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
  382. package/build/client/_app/immutable/entry/app.DwWiuoEC.js +0 -2
  383. package/build/client/_app/immutable/entry/app.DwWiuoEC.js.br +0 -0
  384. package/build/client/_app/immutable/entry/app.DwWiuoEC.js.gz +0 -0
  385. package/build/client/_app/immutable/entry/start.DG8BMhrh.js +0 -1
  386. package/build/client/_app/immutable/entry/start.DG8BMhrh.js.br +0 -0
  387. package/build/client/_app/immutable/entry/start.DG8BMhrh.js.gz +0 -0
  388. package/build/client/_app/immutable/nodes/0.ejabgzDQ.js +0 -1
  389. package/build/client/_app/immutable/nodes/0.ejabgzDQ.js.br +0 -0
  390. package/build/client/_app/immutable/nodes/0.ejabgzDQ.js.gz +0 -0
  391. package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js +0 -1
  392. package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js.br +0 -0
  393. package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js.gz +0 -0
  394. package/build/client/_app/immutable/nodes/2.DV3saFiY.js +0 -1
  395. package/build/client/_app/immutable/nodes/2.DV3saFiY.js.br +0 -0
  396. package/build/client/_app/immutable/nodes/2.DV3saFiY.js.gz +0 -0
  397. package/build/client/_app/immutable/nodes/3.3yohCM25.js +0 -3
  398. package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
  399. package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
  400. package/build/client/_app/immutable/nodes/4.D6NIf10D.js +0 -1
  401. package/build/client/_app/immutable/nodes/4.D6NIf10D.js.br +0 -0
  402. package/build/client/_app/immutable/nodes/4.D6NIf10D.js.gz +0 -0
  403. package/build/client/_app/immutable/nodes/5.g3R-QfIW.js.br +0 -0
  404. package/build/client/_app/immutable/nodes/5.g3R-QfIW.js.gz +0 -0
  405. package/build/client/_app/immutable/nodes/6.DSpd_nYK.js +0 -2
  406. package/build/client/_app/immutable/nodes/6.DSpd_nYK.js.br +0 -0
  407. package/build/client/_app/immutable/nodes/6.DSpd_nYK.js.gz +0 -0
  408. package/build/client/_app/immutable/nodes/7.F9WBFTz2.js +0 -2
  409. package/build/client/_app/immutable/nodes/7.F9WBFTz2.js.br +0 -0
  410. package/build/client/_app/immutable/nodes/7.F9WBFTz2.js.gz +0 -0
  411. package/build/server/chunks/0-ePgrkfG9.js +0 -9
  412. package/build/server/chunks/0-ePgrkfG9.js.map +0 -1
  413. package/build/server/chunks/1-BV7u1xGo.js +0 -9
  414. package/build/server/chunks/2-3p1kyvjQ.js +0 -9
  415. package/build/server/chunks/2-3p1kyvjQ.js.map +0 -1
  416. package/build/server/chunks/3-Ck7ewhOX.js +0 -9
  417. package/build/server/chunks/3-Ck7ewhOX.js.map +0 -1
  418. package/build/server/chunks/4-ChFYfo_S.js +0 -9
  419. package/build/server/chunks/4-ChFYfo_S.js.map +0 -1
  420. package/build/server/chunks/5-q-tQLBBu.js +0 -9
  421. package/build/server/chunks/5-q-tQLBBu.js.map +0 -1
  422. package/build/server/chunks/6-BIaAbm8b.js +0 -9
  423. package/build/server/chunks/6-BIaAbm8b.js.map +0 -1
  424. package/build/server/chunks/7--TmbCgrH.js +0 -9
  425. package/build/server/chunks/7--TmbCgrH.js.map +0 -1
  426. package/build/server/chunks/Button-Cs1aE6ka.js.map +0 -1
  427. package/build/server/chunks/Icon-CEUrotA6.js.map +0 -1
  428. package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +0 -1
  429. package/build/server/chunks/_page.svelte-BdYynOck.js +0 -85
  430. package/build/server/chunks/_page.svelte-BdYynOck.js.map +0 -1
  431. package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +0 -1
  432. package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +0 -1
  433. package/build/server/chunks/_server.ts-BStnNIcq.js +0 -34
  434. package/build/server/chunks/_server.ts-BStnNIcq.js.map +0 -1
  435. package/build/server/chunks/_server.ts-CAxsWKvS.js.map +0 -1
  436. package/build/server/chunks/_server.ts-COu0vNpd.js.map +0 -1
  437. package/build/server/chunks/_server.ts-CTpcLUH8.js.map +0 -1
  438. package/build/server/chunks/_server.ts-Cf84YIaW.js +0 -25
  439. package/build/server/chunks/_server.ts-Cf84YIaW.js.map +0 -1
  440. package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +0 -1
  441. package/build/server/chunks/_server.ts-CtH0dhUp.js +0 -71
  442. package/build/server/chunks/_server.ts-CtH0dhUp.js.map +0 -1
  443. package/build/server/chunks/_server.ts-DB_Kg97c.js.map +0 -1
  444. package/build/server/chunks/_server.ts-DYpJImqd.js.map +0 -1
  445. package/build/server/chunks/_server.ts-Deok2y88.js.map +0 -1
  446. package/build/server/chunks/_server.ts-tSpgyl1D.js.map +0 -1
  447. package/build/server/chunks/_server.ts-vekTmWAx.js.map +0 -1
  448. package/build/server/chunks/client2-CCBGA-2V.js +0 -7
  449. package/build/server/chunks/index-server-CrDaL06Y.js.map +0 -1
  450. package/build/server/chunks/index2-CgclKpUj.js.map +0 -1
  451. package/build/server/chunks/library-apns-BqJbvSKh.js.map +0 -1
  452. package/build/server/chunks/pty-manager-BQVB7IVj.js.map +0 -1
  453. package/build/server/chunks/root-DDSnEAZv.js.map +0 -1
  454. package/build/server/chunks/shared-server-sSGG17Df.js.map +0 -1
  455. package/build/server/chunks/state.svelte-hBbXlUak.js.map +0 -1
  456. package/src/generated/types/Client.ts +0 -589
  457. package/src/lib/types/config.ts +0 -1
  458. /package/build/client/_app/immutable/assets/{4.BFUut--w.css → 6.BFUut--w.css} +0 -0
  459. /package/build/client/_app/immutable/assets/{4.BFUut--w.css.br → 6.BFUut--w.css.br} +0 -0
  460. /package/build/client/_app/immutable/assets/{4.BFUut--w.css.gz → 6.BFUut--w.css.gz} +0 -0
  461. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css → 7.BTOx7yt7.css} +0 -0
  462. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.br → 7.BTOx7yt7.css.br} +0 -0
  463. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.gz → 7.BTOx7yt7.css.gz} +0 -0
  464. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css → 8.eZGZN-BF.css} +0 -0
  465. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.br → 8.eZGZN-BF.css.br} +0 -0
  466. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.gz → 8.eZGZN-BF.css.gz} +0 -0
  467. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css → 9.DwS5ZHBh.css} +0 -0
  468. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.br → 9.DwS5ZHBh.css.br} +0 -0
  469. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.gz → 9.DwS5ZHBh.css.gz} +0 -0
  470. /package/src/{generated/types → lib/types/generated}/API.ts +0 -0
  471. /package/src/{generated/types → lib/types/generated}/APN.ts +0 -0
  472. /package/src/{generated/types → lib/types/generated}/CLI.ts +0 -0
  473. /package/src/{generated/types → lib/types/generated}/Config.ts +0 -0
  474. /package/src/{generated/types → lib/types/generated}/Holder.ts +0 -0
  475. /package/src/{generated/types → lib/types/generated}/JWT.ts +0 -0
  476. /package/src/{generated/types → lib/types/generated}/Notification.ts +0 -0
  477. /package/src/{generated/types → lib/types/generated}/OpenCode.ts +0 -0
  478. /package/src/{generated/types → lib/types/generated}/Sessions.ts +0 -0
  479. /package/src/{generated/types → lib/types/generated}/Terminal.ts +0 -0
  480. /package/src/{generated/types → lib/types/generated}/index.ts +0 -0
@@ -0,0 +1,361 @@
1
+ #!/usr/bin/env node
2
+ // Dev orchestrator — mirrors exactly what `shooter start` does for users.
3
+ //
4
+ // Differences from the global server:
5
+ // PORT 54006 (vs 54007 for global)
6
+ // SHOOTER_HOME ~/.shooter-dev (isolated PID, DB, logs, tunnel URL)
7
+ //
8
+ // API key handling:
9
+ // Dev key = <hostname><4hex>, generated once, persisted in ~/.shooter-dev/.env
10
+ // Global key (shooter2024) in ~/.zshrc is NEVER touched.
11
+ // The dev key is passed explicitly as API_KEY to the server child process,
12
+ // overriding whatever the shell has exported.
13
+ //
14
+ // Other env/credentials (NeuroLink keys etc.) fall through from project .env
15
+ // and ~/.shooter/.env — but never override API_KEY.
16
+ //
17
+ // On source change: kill server → vite build → restart server → tunnel stays up.
18
+
19
+ import { spawn, execSync } from 'child_process';
20
+ import { mkdirSync, readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs';
21
+ import { createRequire } from 'module';
22
+ import { watch } from 'chokidar';
23
+ import { join, dirname } from 'path';
24
+ import { fileURLToPath } from 'url';
25
+ import { homedir } from 'os';
26
+ import { config as dotenvConfig } from 'dotenv';
27
+
28
+ const __dirname = dirname(fileURLToPath(import.meta.url));
29
+ const PKG_ROOT = join(__dirname, '..');
30
+ const DEV_HOME = join(homedir(), '.shooter-dev');
31
+ const LOG_DIR = join(DEV_HOME, 'logs');
32
+ const TUNNEL_URL_FILE = join(DEV_HOME, '.tunnel_url');
33
+ const PORT = 54006;
34
+
35
+ const _require = createRequire(import.meta.url);
36
+ const _crypto = _require('crypto');
37
+ const _os = _require('os');
38
+
39
+ mkdirSync(LOG_DIR, { recursive: true });
40
+
41
+ // ── Dev API key: generate once, persist, reuse forever ───────────────
42
+ // Stored in ~/.shooter-dev/.env — never touches global ~/.shooter/.env
43
+ // or ~/.zshrc. Passed as API_KEY env var to server child process.
44
+
45
+ const devEnvPath = join(DEV_HOME, '.env');
46
+
47
+ function makeApiKey() {
48
+ const name =
49
+ _os
50
+ .hostname()
51
+ .toLowerCase()
52
+ .replace(/\.local$/, '')
53
+ .replace(/[^a-z0-9]/g, ' ')
54
+ .trim()
55
+ .split(' ')
56
+ .filter((p) => /^[a-z]+$/.test(p))
57
+ .join('')
58
+ .slice(0, 20) || 'shooter';
59
+ const suffix = _crypto.randomBytes(16).toString('hex'); // 128 bits of entropy
60
+ return `${name}-${suffix}`;
61
+ }
62
+
63
+ function isWeakKey(key) {
64
+ // Reject previously generated short keys: <name><4hex> had no hyphen and
65
+ // a trailing ≤4 hex-char suffix. Keys generated now have 32 hex chars
66
+ // separated by a hyphen, which passes this check.
67
+ return !key.includes('-') || !/-[a-f0-9]{32,}$/.test(key);
68
+ }
69
+
70
+ function getOrCreateDevApiKey() {
71
+ if (existsSync(devEnvPath)) {
72
+ const match = readFileSync(devEnvPath, 'utf-8').match(/^API_KEY=(.+)$/m);
73
+ if (match && match[1].trim() && !isWeakKey(match[1].trim())) {
74
+ return match[1].trim();
75
+ }
76
+ }
77
+ const key = makeApiKey();
78
+ const existing = existsSync(devEnvPath) ? readFileSync(devEnvPath, 'utf-8') : '';
79
+ writeFileSync(devEnvPath, `${existing.trimEnd()}\nAPI_KEY=${key}\n`.trimStart());
80
+ return key;
81
+ }
82
+
83
+ const DEV_API_KEY = getOrCreateDevApiKey();
84
+
85
+ // Load remaining env vars (NeuroLink keys etc.) from project .env and
86
+ // ~/.shooter/.env — but never let them override API_KEY.
87
+ dotenvConfig({ path: join(PKG_ROOT, '.env') });
88
+ dotenvConfig({ override: false, path: join(homedir(), '.shooter', '.env') });
89
+
90
+ // ── Helpers ───────────────────────────────────────────────────────────
91
+
92
+ function isCloudflaredAvailable() {
93
+ try {
94
+ execSync('which cloudflared', { stdio: 'ignore' });
95
+ return true;
96
+ } catch {
97
+ return false;
98
+ }
99
+ }
100
+
101
+ function dim(s) {
102
+ return `\x1b[2m${s}\x1b[0m`;
103
+ }
104
+ function green(s) {
105
+ return `\x1b[32m${s}\x1b[0m`;
106
+ }
107
+ function yellow(s) {
108
+ return `\x1b[33m${s}\x1b[0m`;
109
+ }
110
+ function cyan(s) {
111
+ return `\x1b[36m${s}\x1b[0m`;
112
+ }
113
+ function bold(s) {
114
+ return `\x1b[1m${s}\x1b[0m`;
115
+ }
116
+
117
+ function log(msg) {
118
+ console.log(`${dim('[dev]')} ${msg}`);
119
+ }
120
+
121
+ // ── Build ─────────────────────────────────────────────────────────────
122
+
123
+ async function build() {
124
+ log('Building...');
125
+ return new Promise((resolve, reject) => {
126
+ const proc = spawn('node_modules/.bin/vite', ['build'], {
127
+ cwd: PKG_ROOT,
128
+ stdio: 'inherit',
129
+ env: { ...process.env },
130
+ });
131
+ proc.on('exit', (code) => {
132
+ if (code === 0) {
133
+ // Copy pty-holder.cjs (same as postbuild script)
134
+ const holderSrc = join(PKG_ROOT, 'src/lib/modules/server/terminal/pty-holder.cjs');
135
+ const holderDest = join(PKG_ROOT, 'build/pty-holder.cjs');
136
+ try {
137
+ const data = readFileSync(holderSrc);
138
+ writeFileSync(holderDest, data);
139
+ } catch (err) {
140
+ console.error(`Failed to copy pty-holder: ${holderSrc} -> ${holderDest}`, err);
141
+ }
142
+ log(green('Build complete.'));
143
+ resolve();
144
+ } else {
145
+ reject(new Error(`vite build exited with code ${code}`));
146
+ }
147
+ });
148
+ });
149
+ }
150
+
151
+ // ── Server ────────────────────────────────────────────────────────────
152
+
153
+ let serverProc = null;
154
+
155
+ function startServer() {
156
+ const tsxLoader = join(PKG_ROOT, 'node_modules/tsx/dist/loader.mjs');
157
+ const tsxPreflight = join(PKG_ROOT, 'node_modules/tsx/dist/preflight.cjs');
158
+ const serverEntry = join(PKG_ROOT, 'server.ts');
159
+
160
+ const nodeArgs = [];
161
+ if (existsSync(tsxPreflight)) nodeArgs.push('--require', tsxPreflight);
162
+ if (existsSync(tsxLoader)) nodeArgs.push('--import', `file://${tsxLoader}`);
163
+ else nodeArgs.push('--import', 'tsx');
164
+ nodeArgs.push(serverEntry);
165
+
166
+ serverProc = spawn(process.execPath, nodeArgs, {
167
+ cwd: PKG_ROOT,
168
+ stdio: 'inherit',
169
+ env: {
170
+ ...process.env,
171
+ PORT: String(PORT),
172
+ SHOOTER_HOME: DEV_HOME,
173
+ SHOOTER_PKG_ROOT: PKG_ROOT,
174
+ API_KEY: DEV_API_KEY, // override whatever ~/.zshrc exported
175
+ ORIGIN: `http://localhost:${PORT}`, // prevent SvelteKit from using https from x-forwarded-proto
176
+ },
177
+ });
178
+
179
+ serverProc.on('error', (err) => {
180
+ log(`${yellow('Server error:')} ${err.message}`);
181
+ serverProc = null;
182
+ });
183
+
184
+ serverProc.on('exit', (code, signal) => {
185
+ if (signal !== 'SIGTERM' && signal !== 'SIGINT') {
186
+ log(yellow(`Server exited (${signal ?? code})`));
187
+ }
188
+ serverProc = null;
189
+ });
190
+ }
191
+
192
+ function killServer() {
193
+ return new Promise((resolve) => {
194
+ if (!serverProc) {
195
+ resolve();
196
+ return;
197
+ }
198
+ const proc = serverProc;
199
+ serverProc = null;
200
+ proc.once('exit', resolve);
201
+ proc.kill('SIGTERM');
202
+ // Force-kill after 5s if graceful shutdown hangs
203
+ setTimeout(() => {
204
+ try {
205
+ proc.kill('SIGKILL');
206
+ } catch {}
207
+ }, 5000).unref();
208
+ });
209
+ }
210
+
211
+ // ── Tunnel ────────────────────────────────────────────────────────────
212
+
213
+ let tunnelProc = null;
214
+
215
+ function startTunnel() {
216
+ if (!isCloudflaredAvailable()) {
217
+ log(
218
+ yellow(
219
+ 'cloudflared not found — no tunnel. Server available at ' + cyan(`http://localhost:${PORT}`)
220
+ )
221
+ );
222
+ return;
223
+ }
224
+
225
+ // Clear previous URL
226
+ try {
227
+ unlinkSync(TUNNEL_URL_FILE);
228
+ } catch {}
229
+
230
+ tunnelProc = spawn('cloudflared', ['tunnel', '--url', `http://localhost:${PORT}`], {
231
+ cwd: PKG_ROOT,
232
+ stdio: ['ignore', 'pipe', 'pipe'],
233
+ });
234
+
235
+ const onData = (data) => {
236
+ const text = data.toString();
237
+ const match = text.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/);
238
+ if (match) {
239
+ const url = match[0];
240
+ writeFileSync(TUNNEL_URL_FILE, url);
241
+ const configUrl = `http://localhost:${PORT}/config#key=${encodeURIComponent(DEV_API_KEY)}&url=${encodeURIComponent(`http://localhost:${PORT}`)}`;
242
+ const maskedConfigUrl = configUrl.replace(encodeURIComponent(DEV_API_KEY), '(redacted)');
243
+ console.log('');
244
+ console.log(` ${bold('Shooter dev server ready')}`);
245
+ console.log(` ${dim('Local: ')} ${cyan(`http://localhost:${PORT}`)}`);
246
+ console.log(` ${dim('Tunnel: ')} ${green(url)}`);
247
+ console.log(` ${dim('API key:')} ${yellow(DEV_API_KEY ? '(set)' : '(not set)')}`);
248
+ console.log(` ${dim('Config: ')} ${cyan(maskedConfigUrl)}`);
249
+ console.log('');
250
+ }
251
+ };
252
+
253
+ tunnelProc.stdout.on('data', onData);
254
+ tunnelProc.stderr.on('data', onData);
255
+
256
+ tunnelProc.on('exit', (code) => {
257
+ if (code !== null && code !== 0) {
258
+ log(yellow(`Tunnel exited with code ${code}`));
259
+ }
260
+ tunnelProc = null;
261
+ });
262
+ }
263
+
264
+ function killTunnel() {
265
+ if (!tunnelProc) return;
266
+ try {
267
+ tunnelProc.kill('SIGTERM');
268
+ } catch {}
269
+ tunnelProc = null;
270
+ try {
271
+ unlinkSync(TUNNEL_URL_FILE);
272
+ } catch {}
273
+ }
274
+
275
+ // ── Watcher ───────────────────────────────────────────────────────────
276
+
277
+ let rebuilding = false;
278
+ let pendingRebuild = false;
279
+
280
+ async function rebuild(reason) {
281
+ if (rebuilding) {
282
+ pendingRebuild = true;
283
+ return;
284
+ }
285
+ rebuilding = true;
286
+ log(dim(`Change detected: ${reason} — rebuilding...`));
287
+
288
+ try {
289
+ await killServer();
290
+ await build();
291
+ startServer();
292
+ } catch (err) {
293
+ log(yellow(`Rebuild failed: ${err.message}`));
294
+ }
295
+
296
+ rebuilding = false;
297
+ if (pendingRebuild) {
298
+ pendingRebuild = false;
299
+ await rebuild('queued change');
300
+ }
301
+ }
302
+
303
+ function startWatcher() {
304
+ const watcher = watch(
305
+ [
306
+ join(PKG_ROOT, 'src'),
307
+ join(PKG_ROOT, 'server.ts'),
308
+ join(PKG_ROOT, 'svelte.config.js'),
309
+ join(PKG_ROOT, 'vite.config.js'),
310
+ ],
311
+ {
312
+ ignoreInitial: true,
313
+ ignored: ['**/node_modules/**', '**/.svelte-kit/**', '**/build/**', '**/*.d.ts'],
314
+ awaitWriteFinish: { stabilityThreshold: 300, pollInterval: 50 },
315
+ }
316
+ );
317
+
318
+ let debounce = null;
319
+ watcher.on('all', (event, filePath) => {
320
+ clearTimeout(debounce);
321
+ debounce = setTimeout(() => {
322
+ const rel = filePath.replace(PKG_ROOT + '/', '');
323
+ rebuild(rel);
324
+ }, 500);
325
+ });
326
+
327
+ return watcher;
328
+ }
329
+
330
+ // ── Shutdown ──────────────────────────────────────────────────────────
331
+
332
+ async function shutdown() {
333
+ console.log('');
334
+ log('Shutting down...');
335
+ await killServer();
336
+ killTunnel();
337
+ process.exit(0);
338
+ }
339
+
340
+ process.on('SIGINT', shutdown);
341
+ process.on('SIGTERM', shutdown);
342
+
343
+ // ── Main ──────────────────────────────────────────────────────────────
344
+
345
+ log(
346
+ `${bold('Shooter dev')} — port ${cyan(String(PORT))}, home ${dim(DEV_HOME)}, key ${yellow(DEV_API_KEY ? '(set)' : '(not set)')}`
347
+ );
348
+
349
+ try {
350
+ await build();
351
+ } catch (err) {
352
+ log(yellow(`Initial build failed: ${err.message}`));
353
+ process.exit(1);
354
+ }
355
+
356
+ startServer();
357
+
358
+ // Give server 2s to bind before starting tunnel (same as shooter CLI)
359
+ setTimeout(() => startTunnel(), 2000);
360
+
361
+ startWatcher();
@@ -184,11 +184,12 @@ check_linux_build_tools() {
184
184
 
185
185
  if ask_yes_no " Install build tools now? ($install_cmd)" "y"; then
186
186
  info "Installing build tools..."
187
- eval "$install_cmd"
187
+ $install_cmd
188
188
  success "Build tools installed."
189
189
  else
190
- warn "Continuing without build tools. Terminal features (node-pty) and"
191
- warn "database (better-sqlite3) may not work."
190
+ error "Build tools are required for native modules (node-pty, better-sqlite3)."
191
+ error "Install them manually:$missing"
192
+ exit 1
192
193
  fi
193
194
  else
194
195
  success "Build tools available (make, g++, python3)"
@@ -250,13 +251,11 @@ find_node() {
250
251
  }
251
252
 
252
253
  check_node() {
253
- NODE_BIN="$(find_node)"
254
+ NODE_BIN="$(find_node)" || true
254
255
  if [ -n "$NODE_BIN" ]; then
255
256
  node_version="$("$NODE_BIN" --version)"
256
257
  success "Node.js $node_version ($NODE_BIN)"
257
- local dir_path
258
- dir_path="$(dirname "$NODE_BIN")"
259
- export PATH="$dir_path:$PATH"
258
+ export PATH="$(dirname "$NODE_BIN"):$PATH"
260
259
  return 0
261
260
  fi
262
261
 
@@ -283,8 +282,12 @@ bootstrap_pnpm() {
283
282
  # Try corepack first
284
283
  if command -v corepack >/dev/null 2>&1; then
285
284
  if corepack enable 2>/dev/null; then
286
- success "pnpm enabled via corepack"
287
- return 0
285
+ # Pre-download pnpm to avoid interactive prompt during install
286
+ COREPACK_ENABLE_AUTO_PIN=0 corepack prepare pnpm@10.28.2 --activate 2>/dev/null
287
+ if command -v pnpm >/dev/null 2>&1; then
288
+ success "pnpm $(pnpm --version) (via corepack)"
289
+ return 0
290
+ fi
288
291
  fi
289
292
  fi
290
293
 
@@ -330,7 +333,7 @@ handle_existing() {
330
333
  1)
331
334
  step "Updating existing installation"
332
335
  cd "$SHOOTER_REPO"
333
- git pull --rebase origin "$REPO_BRANCH"
336
+ git fetch origin "$REPO_BRANCH" && git reset --hard "origin/$REPO_BRANCH"
334
337
  success "Repository updated."
335
338
  return 0
336
339
  ;;
@@ -340,12 +343,16 @@ handle_existing() {
340
343
  success "Removed $SHOOTER_REPO"
341
344
  return 1
342
345
  ;;
343
- *)
346
+ 3|abort)
344
347
  info "Aborted. No changes made."
345
348
  # Disable cleanup trap since nothing was cloned
346
349
  CLEANUP_CLONED=0
347
350
  exit 0
348
351
  ;;
352
+ *)
353
+ error "Invalid choice: $choice"
354
+ exit 1
355
+ ;;
349
356
  esac
350
357
  fi
351
358
  return 1
@@ -407,35 +414,6 @@ run_setup_wizard() {
407
414
  fi
408
415
  }
409
416
 
410
- # ── Global command ────────────────────────────────────────────────────
411
-
412
- offer_global_command() {
413
- step "Global command"
414
- BIN_DIR="$HOME/.local/bin"
415
- SHOOTER_BIN="$BIN_DIR/shooter"
416
-
417
- if [ -x "$SHOOTER_BIN" ]; then
418
- success "'shooter' command already linked."
419
- return
420
- fi
421
-
422
- if ask_yes_no " Install 'shooter' as a global command?" "y"; then
423
- mkdir -p "$BIN_DIR"
424
- ln -sf "$SHOOTER_REPO/bin/shooter.cjs" "$SHOOTER_BIN"
425
- chmod +x "$SHOOTER_BIN"
426
- success "'shooter' linked to $SHOOTER_BIN"
427
-
428
- # Check if ~/.local/bin is in PATH
429
- case ":$PATH:" in
430
- *":$BIN_DIR:"*) ;;
431
- *)
432
- warn "$BIN_DIR is not in your PATH."
433
- info "Add to your shell profile: export PATH=\"\$HOME/.local/bin:\$PATH\""
434
- ;;
435
- esac
436
- fi
437
- }
438
-
439
417
  # ── Cloudflare Tunnel ─────────────────────────────────────────────────
440
418
 
441
419
  install_cloudflared() {
@@ -515,46 +493,55 @@ start_server_and_tunnel() {
515
493
  step "Starting Shooter"
516
494
 
517
495
  cd "$SHOOTER_REPO"
496
+ port="$DEFAULT_PORT"
497
+
498
+ # Check if port is already in use
499
+ if command -v lsof >/dev/null 2>&1; then
500
+ if lsof -i ":${port}" -sTCP:LISTEN >/dev/null 2>&1; then
501
+ warn "Port ${port} is already in use."
502
+ info "Stop the existing process or set a different PORT in ~/.shooter/.env"
503
+ return 1
504
+ fi
505
+ fi
518
506
 
519
- # Start the server
520
- SHOOTER_HOME="$SHOOTER_HOME" "$NODE_BIN" bin/shooter.cjs start &
521
- SERVER_BG_PID=$!
522
- sleep 3
507
+ # Start server in daemon mode (detaches from terminal, auto-starts tunnel if cloudflared available)
508
+ SHOOTER_HOME="$SHOOTER_HOME" "$NODE_BIN" bin/shooter.cjs start -d
509
+
510
+ # Wait for server to be ready (up to 15s)
511
+ waited=0
512
+ while [ "$waited" -lt 15 ]; do
513
+ if curl -sf "http://localhost:${port}/api/health" >/dev/null 2>&1; then
514
+ break
515
+ fi
516
+ sleep 1
517
+ waited=$((waited + 1))
518
+ done
523
519
 
524
520
  # Verify server is up
525
- port="$DEFAULT_PORT"
526
521
  if curl -sf "http://localhost:${port}/api/health" >/dev/null 2>&1; then
527
522
  success "Server running on http://localhost:${port}"
528
523
  else
529
524
  warn "Server may still be starting. Check with: shooter status"
530
525
  fi
531
526
 
532
- # Start cloudflare quick tunnel if available
533
- if command -v cloudflared >/dev/null 2>&1; then
534
- info "Starting Cloudflare Tunnel..."
535
-
536
- # Quick tunnel run in background, capture URL from log file
537
- tunnel_log="$SHOOTER_HOME/logs/tunnel.log"
538
- mkdir -p "$(dirname "$tunnel_log")"
539
- cloudflared tunnel --url "http://localhost:${port}" > "$tunnel_log" 2>&1 &
540
- TUNNEL_PID=$!
541
-
542
- # Wait up to 10s for the tunnel URL to appear in logs
527
+ # Check for tunnel URL (daemon mode starts tunnel automatically)
528
+ if [ -f "$SHOOTER_HOME/.tunnel_url" ]; then
529
+ TUNNEL_URL="$(cat "$SHOOTER_HOME/.tunnel_url")"
530
+ success "Tunnel active: $TUNNEL_URL"
531
+ elif command -v cloudflared >/dev/null 2>&1; then
532
+ # Tunnel may still be starting — wait a few more seconds
543
533
  waited=0
544
534
  while [ "$waited" -lt 10 ]; do
545
- if grep -qo 'https://[^ ]*trycloudflare\.com' "$tunnel_log" 2>/dev/null; then
546
- grep -o 'https://[^ ]*trycloudflare\.com' "$tunnel_log" | head -1 > "$SHOOTER_HOME/.tunnel_url"
535
+ if [ -f "$SHOOTER_HOME/.tunnel_url" ]; then
536
+ TUNNEL_URL="$(cat "$SHOOTER_HOME/.tunnel_url")"
537
+ success "Tunnel active: $TUNNEL_URL"
547
538
  break
548
539
  fi
549
540
  sleep 1
550
541
  waited=$((waited + 1))
551
542
  done
552
-
553
- if [ -f "$SHOOTER_HOME/.tunnel_url" ]; then
554
- TUNNEL_URL="$(cat "$SHOOTER_HOME/.tunnel_url")"
555
- success "Tunnel active: $TUNNEL_URL"
556
- else
557
- warn "Tunnel is starting in the background. Check 'shooter status' shortly."
543
+ if [ -z "$TUNNEL_URL" ]; then
544
+ info "Tunnel is starting in the background. Check 'shooter status' shortly."
558
545
  fi
559
546
  else
560
547
  info "No cloudflared found — server accessible on local network only."
@@ -571,11 +558,19 @@ print_success() {
571
558
  printf ' ================================================\n'
572
559
  printf '%s' "$RESET"
573
560
  printf '\n'
574
- printf ' %sLocal:%s http://localhost:%s\n' "$BOLD" "$RESET" "$DEFAULT_PORT"
561
+ printf ' %sLocal:%s http://localhost:%s\n' "$BOLD" "$RESET" "$DEFAULT_PORT"
575
562
  if [ -n "$TUNNEL_URL" ]; then
576
- printf ' %sRemote:%s %s\n' "$BOLD" "$RESET" "$TUNNEL_URL"
563
+ printf ' %sRemote:%s %s\n' "$BOLD" "$RESET" "$TUNNEL_URL"
564
+ fi
565
+ # Read API key from ~/.shooter/.env for display
566
+ _api_key=""
567
+ if [ -f "$SHOOTER_HOME/.env" ]; then
568
+ _api_key="$(grep -m1 '^API_KEY=' "$SHOOTER_HOME/.env" 2>/dev/null | cut -d= -f2-)"
569
+ fi
570
+ if [ -n "$_api_key" ]; then
571
+ printf ' %sAPI key:%s (configured in %s/.env)\n' "$BOLD" "$RESET" "$SHOOTER_HOME"
577
572
  fi
578
- printf ' %sStatus:%s shooter status\n' "$BOLD" "$RESET"
573
+ printf ' %sStatus:%s shooter status\n' "$BOLD" "$RESET"
579
574
  printf ' %sLogs:%s shooter logs\n' "$BOLD" "$RESET"
580
575
  printf '\n'
581
576
  printf ' %sCommands:%s\n' "$BOLD" "$RESET"
@@ -622,14 +617,79 @@ main() {
622
617
  install_deps
623
618
  run_setup_wizard
624
619
 
625
- # Optional extras
626
- offer_global_command
620
+ # Optional extras — single prompt instead of 3 separate ones
621
+ step "Optional extras"
622
+ printf '\n'
623
+ printf ' The following are recommended:\n'
624
+ printf ' %s1.%s Global %sshooter%s command (run from anywhere)\n' "$BOLD" "$RESET" "$CYAN" "$RESET"
625
+ printf ' %s2.%s Cloudflare Tunnel (remote access from phone)\n' "$BOLD" "$RESET"
626
+ printf ' %s3.%s Autostart on login\n' "$BOLD" "$RESET"
627
+ printf '\n'
628
+
629
+ if ask_yes_no " Install all recommended extras?" "y"; then
630
+ # Global command
631
+ BIN_DIR="$HOME/.local/bin"
632
+ SHOOTER_BIN="$BIN_DIR/shooter"
633
+ if [ ! -x "$SHOOTER_BIN" ]; then
634
+ mkdir -p "$BIN_DIR"
635
+ if [ -d "$SHOOTER_BIN" ]; then
636
+ error "$SHOOTER_BIN exists as a directory. Remove it and re-run."
637
+ exit 1
638
+ fi
639
+ ln -sf "$SHOOTER_REPO/bin/shooter.cjs" "$SHOOTER_BIN"
640
+ chmod +x "$SHOOTER_BIN"
641
+ success "'shooter' command linked to $SHOOTER_BIN"
642
+ case ":$PATH:" in
643
+ *":$BIN_DIR:"*) ;;
644
+ *)
645
+ warn "$BIN_DIR is not in your PATH."
646
+ info "Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):"
647
+ info " export PATH=\"\$HOME/.local/bin:\$PATH\""
648
+
649
+ # Attempt to auto-configure PATH in shell profile
650
+ SHELL_NAME=$(basename "$SHELL")
651
+ case "$SHELL_NAME" in
652
+ bash)
653
+ RC_FILE="$HOME/.bashrc"
654
+ [ -f "$HOME/.bash_profile" ] && RC_FILE="$HOME/.bash_profile"
655
+ ;;
656
+ zsh)
657
+ RC_FILE="$HOME/.zshrc"
658
+ ;;
659
+ fish)
660
+ RC_FILE="$HOME/.config/fish/config.fish"
661
+ ;;
662
+ *)
663
+ RC_FILE=""
664
+ ;;
665
+ esac
666
+
667
+ if [ -n "$RC_FILE" ] && [ -f "$RC_FILE" ]; then
668
+ if ! grep -q '\.local/bin' "$RC_FILE" 2>/dev/null; then
669
+ echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$RC_FILE"
670
+ success "Added ~/.local/bin to $RC_FILE"
671
+ info "Run 'source $RC_FILE' or start a new terminal to use the 'shooter' command."
672
+ fi
673
+ fi
674
+ ;;
675
+ esac
676
+ else
677
+ success "'shooter' command already linked."
678
+ fi
679
+
680
+ # Cloudflare Tunnel
681
+ install_cloudflared
627
682
 
628
- # Cloudflare Tunnel
629
- install_cloudflared
683
+ # Autostart
684
+ enable_autostart
685
+ else
686
+ info "Skipped extras. You can add them later:"
687
+ info " Global command: ln -sf $SHOOTER_REPO/bin/shooter.cjs ~/.local/bin/shooter"
688
+ info " Cloudflare: brew install cloudflared (or see docs)"
689
+ info " Autostart: shooter autostart on"
690
+ fi
630
691
 
631
- # Autostart + launch
632
- enable_autostart
692
+ # Start server + tunnel
633
693
  start_server_and_tunnel
634
694
 
635
695
  # Done
@@ -8,7 +8,7 @@
8
8
  # no-ops. If the generator regresses (e.g., after a type-crafter upgrade),
9
9
  # they activate and silently fix the output. Do not remove them.
10
10
 
11
- FILE="./src/generated/types/Terminal.ts"
11
+ FILE="./src/lib/types/generated/Terminal.ts"
12
12
 
13
13
  # Portable sed-in-place helper (works on both BSD/macOS and GNU/Linux)
14
14
  _sed_i() {
@@ -31,7 +31,7 @@ _sed_i 's/contentItem/ContentBlockItem/g' "$FILE"
31
31
  _sed_i 's/decodeContentItem/decodeContentBlockItem/g' "$FILE"
32
32
 
33
33
  # Remove stale lowercase barrel exports from index.ts
34
- INDEX="./src/generated/types/index.ts"
34
+ INDEX="./src/lib/types/generated/index.ts"
35
35
  _sed_i "/export .* from '\\.\\/Apn'/d" "$INDEX"
36
36
  _sed_i "/export .* from '\\.\\/Cli'/d" "$INDEX"
37
37
  _sed_i "/export .* from '\\.\\/Api'/d" "$INDEX"