@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
@@ -39,6 +39,20 @@ const LOCAL_BASE_URL = `http://localhost:${LOCAL_PORT}`;
39
39
  const BASE_URL = USE_LOCAL ? LOCAL_BASE_URL : REMOTE_BASE_URL;
40
40
  const API_URL = `${BASE_URL}/api/notify`;
41
41
 
42
+ // Read API_KEY from ~/.shooter/.env if not in environment
43
+ if (!process.env.API_KEY && !process.env.SHOOTER_API_KEY) {
44
+ const envPath = path.join(require('os').homedir(), '.shooter', '.env');
45
+ try {
46
+ const envContent = fs.readFileSync(envPath, 'utf-8');
47
+ const match = envContent.match(/^API_KEY=["']?([^"'\n]+)["']?$/m);
48
+ if (match) {
49
+ process.env.API_KEY = match[1];
50
+ }
51
+ } catch {
52
+ // .env file doesn't exist — API_KEY must be in environment
53
+ }
54
+ }
55
+
42
56
  // Authentication
43
57
  const API_KEY = process.env.API_KEY || process.env.SHOOTER_API_KEY;
44
58
  const DEVICE_TOKEN = process.env.SHOOTER_DEVICE_TOKEN || null;
@@ -1467,7 +1481,7 @@ const OpenCodePlugin = async (ctx) => {
1467
1481
  },
1468
1482
 
1469
1483
  // Specific hook: After tool execution
1470
- 'tool.execute.after': async (input, output) => {
1484
+ 'tool.execute.after': async (input, _output) => {
1471
1485
  const commonEvent = adaptOpenCodeEvent('tool.execute.after', {
1472
1486
  tool: input?.tool || 'unknown',
1473
1487
  });
package/README.md CHANGED
@@ -57,13 +57,13 @@ Open [http://localhost:54007](http://localhost:54007) in your browser. Visit `/c
57
57
 
58
58
  ## All Setup Methods
59
59
 
60
- | Method | Command | Notes |
61
- | ------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
60
+ | Method | Command | Notes |
61
+ | ------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
62
62
  | One-command install | `curl -fsSL https://raw.githubusercontent.com/juspay/shooter/release/scripts/install.sh \| sh` | Recommended. Clones to `~/.shooter/repo`, auto-generates API key, builds, installs cloudflared, starts server |
63
- | Interactive wizard | `pnpm setup` | Walks through env config, builds, and verifies. Pass `--auto` for non-interactive mode. |
64
- | CLI (npx) | `npx @juspay/shooter setup` | No clone needed -- runs the setup wizard directly from npm |
65
- | Docker | `docker compose up -d` | See [Docker](#docker) |
66
- | Manual | See [Manual Setup](#manual-setup) | For advanced users |
63
+ | Interactive wizard | `pnpm setup` | Walks through env config, builds, and verifies. Pass `--auto` for non-interactive mode. |
64
+ | CLI (npx) | `npx @juspay/shooter setup` | No clone needed -- runs the setup wizard directly from npm |
65
+ | Docker | `docker compose up -d` | See [Docker](#docker) |
66
+ | Manual | See [Manual Setup](#manual-setup) | For advanced users |
67
67
 
68
68
  ### Manual Setup
69
69
 
@@ -71,19 +71,23 @@ Open [http://localhost:54007](http://localhost:54007) in your browser. Visit `/c
71
71
  git clone https://github.com/juspay/shooter.git
72
72
  cd shooter
73
73
  pnpm install
74
- cp .env.example .env
75
- # Edit .env with your values (at minimum, set API_KEY)
76
- pnpm build
74
+ pnpm setup # generates ~/.shooter/.env with API key, builds the project
77
75
  pnpm start
78
76
  ```
79
77
 
80
- The hook notifier reads `API_KEY` from the environment. Export it in your shell profile so hooks can authenticate with the server:
78
+ Or without the wizard:
81
79
 
82
80
  ```bash
83
- echo 'export API_KEY="your-api-key-here"' >> ~/.zshrc
84
- source ~/.zshrc
81
+ git clone https://github.com/juspay/shooter.git
82
+ cd shooter
83
+ pnpm install
84
+ mkdir -p ~/.shooter && echo "API_KEY=$(openssl rand -hex 32)" > ~/.shooter/.env
85
+ pnpm build
86
+ pnpm start
85
87
  ```
86
88
 
89
+ > **Note:** Configuration lives in `~/.shooter/.env` (not the repo root). The hook notifier reads `API_KEY` from this file automatically.
90
+
87
91
  ---
88
92
 
89
93
  ## Architecture
@@ -131,7 +135,7 @@ source ~/.zshrc
131
135
 
132
136
  ## Configuration
133
137
 
134
- Copy `.env.example` to `.env` and fill in your values. The `pnpm setup` wizard handles this interactively.
138
+ Configuration is stored in `~/.shooter/.env`. The `pnpm setup` wizard generates this file interactively. Only `API_KEY` is required to start -- push notification config can be added later with `shooter setup --push`.
135
139
 
136
140
  | Variable | Required | Default | Description |
137
141
  | ---------------------- | -------- | ------- | ---------------------------------------------------------------- |
@@ -279,11 +283,17 @@ The `PermissionRequest` hook has a 180-second timeout in `.claude/settings.json`
279
283
  ### Quick Start
280
284
 
281
285
  ```bash
282
- cp .env.example .env
283
- # Edit .env with your values
286
+ # Minimal — just set API_KEY:
287
+ echo "API_KEY=$(openssl rand -hex 32)" > .env
284
288
  docker compose up -d
285
289
  ```
286
290
 
291
+ Or with a Cloudflare Tunnel for remote access:
292
+
293
+ ```bash
294
+ docker compose --profile tunnel up -d
295
+ ```
296
+
287
297
  ### Manual Build and Run
288
298
 
289
299
  ```bash
@@ -291,14 +301,16 @@ docker build -t shooter .
291
301
 
292
302
  docker run -d \
293
303
  --name shooter \
294
- --env-file .env \
304
+ -e API_KEY=your-secret-key-here \
295
305
  -p 54007:54007 \
296
306
  -v shooter-data:/root/.shooter \
297
307
  --restart unless-stopped \
298
308
  shooter
299
309
  ```
300
310
 
301
- The multi-stage Dockerfile uses `node:20-slim` and includes build tools for `node-pty` and `better-sqlite3` native addons. SQLite data is persisted in the `shooter-data` volume. The `.env` file is injected at runtime and never baked into the image.
311
+ > **Required:** Set `API_KEY` either via `-e API_KEY=...`, `--env-file .env`, or in `docker-compose.yml`. Without it, all authenticated endpoints return 401.
312
+
313
+ The multi-stage Dockerfile uses `node:20-slim` with native addon binaries copied from the build stage (no build tools in the production image). SQLite data is persisted in the `shooter-data` volume. The `.env` file is injected at runtime and never baked into the image.
302
314
 
303
315
  A separate `Dockerfile.test` is provided for verifying the fresh-user install experience in an isolated container.
304
316
 
@@ -311,11 +323,26 @@ services:
311
323
  ports:
312
324
  - '54007:54007'
313
325
  env_file:
314
- - .env
326
+ - path: .env
327
+ required: false
328
+ # Set API_KEY in .env or uncomment below:
329
+ # environment:
330
+ # - API_KEY=your-secret-key-here
315
331
  volumes:
316
332
  - shooter-data:/root/.shooter
317
333
  restart: unless-stopped
318
334
 
335
+ # Optional: Cloudflare Tunnel for remote access
336
+ # Start with: docker compose --profile tunnel up -d
337
+ tunnel:
338
+ image: cloudflare/cloudflared:latest
339
+ command: tunnel --no-autoupdate --url http://shooter:54007
340
+ depends_on:
341
+ - shooter
342
+ restart: unless-stopped
343
+ profiles:
344
+ - tunnel
345
+
319
346
  volumes:
320
347
  shooter-data:
321
348
  ```
@@ -341,7 +368,7 @@ All endpoints require the `Authorization: Bearer <API_KEY>` header.
341
368
  | `POST` | `/api/response` | Submit a permission allow/deny decision |
342
369
  | `GET` | `/api/response` | Poll for a pending permission decision |
343
370
  | `GET` | `/api/sessions` | List sessions across all projects |
344
- | `POST` | `/api/webhook` | Receive external webhook events |
371
+ | `POST` | `/api/webhook` | Stub returns 501 (not yet implemented) |
345
372
  | `GET` | `/api/qr-config` | Generate QR code for mobile app pairing |
346
373
  | `POST` | `/api/device-token` | Register a device token (iOS or Android) |
347
374
  | `GET` | `/api/debug` | Debug information (APNs config, device token status) |
@@ -396,23 +423,23 @@ pnpm format:check # Check formatting without writing
396
423
 
397
424
  The `shooter` command (via `bin/shooter.cjs` or the global `shooter` symlink) supports:
398
425
 
399
- | Command | Description |
400
- | -------------------- | ------------------------------------------------------------------ |
401
- | `shooter start` | Start the server (default if no command given) |
402
- | `shooter stop` | Stop the running server gracefully (SIGTERM, then SIGKILL after 5s)|
403
- | `shooter status` | Show PID, URL, autostart state, log path |
404
- | `shooter autostart on` | Enable autostart on login (LaunchAgent on macOS, systemd on Linux) |
405
- | `shooter autostart off` | Disable autostart and remove the service definition |
406
- | `shooter logs` | Tail server logs (log file on macOS, journalctl on Linux) |
407
- | `shooter setup` | Run the interactive setup wizard; pass `--auto` for non-interactive|
408
- | `shooter version` | Print version number |
409
- | `shooter help` | Show all available commands |
426
+ | Command | Description |
427
+ | ----------------------- | ------------------------------------------------------------------------------------------- |
428
+ | `shooter start` | Start the server (default if no command given) |
429
+ | `shooter stop` | Stop the running server gracefully (SIGTERM, then SIGKILL after 5s) |
430
+ | `shooter status` | Show PID, URL, autostart state, log path |
431
+ | `shooter autostart on` | Enable autostart on login (LaunchAgent on macOS, systemd on Linux) |
432
+ | `shooter autostart off` | Disable autostart and remove the service definition |
433
+ | `shooter logs` | Tail server logs (log file on macOS, journalctl on Linux) |
434
+ | `shooter setup` | Quick setup (~60s): API key + build. `--auto` for non-interactive, `--push` for push config |
435
+ | `shooter version` | Print version number |
436
+ | `shooter help` | Show all available commands |
410
437
 
411
438
  Process state is tracked via a PID file at `~/.shooter/shooter.pid`. Logs are written to `~/.shooter/logs/shooter.log` when running via autostart.
412
439
 
413
440
  ### Type System
414
441
 
415
- Types are auto-generated from YAML specifications in `specs/types/` using [type-crafter](https://github.com/nicktaf/type-crafter). Never edit files in `src/generated/types/` directly -- edit the YAML specs and run `pnpm run gen:types`.
442
+ Types are auto-generated from YAML specifications in `specs/types/` using [type-crafter](https://github.com/nicktaf/type-crafter). Never edit files in `src/lib/types/generated/` directly -- edit the YAML specs and run `pnpm run gen:types`.
416
443
 
417
444
  ---
418
445
 
@@ -437,8 +464,9 @@ shooter/
437
464
  hooks/notifier.cjs # Unified hook notifier (Node.js)
438
465
  settings.json # Hook configuration (13 event types)
439
466
  src/
440
- generated/types/ # Auto-generated TypeScript types (DO NOT EDIT)
441
467
  lib/
468
+ types/
469
+ generated/ # Auto-generated TypeScript types (DO NOT EDIT)
442
470
  modules/
443
471
  server/
444
472
  apn/ # APNs push notification service
@@ -462,6 +490,9 @@ shooter/
462
490
  opencode-reader.ts # Parse OpenCode sessions
463
491
  client/
464
492
  common/ # Reusable UI components
493
+ activity/ # Activity feed components
494
+ dashboard/ # Dashboard components
495
+ neurolink/ # Neurolink integration components
465
496
  terminal/
466
497
  ChatView.svelte # Structured AI conversation view
467
498
  LaunchSheet.svelte # Terminal launch dialog
@@ -483,6 +514,70 @@ shooter/
483
514
 
484
515
  ---
485
516
 
517
+ ## Updating
518
+
519
+ If you installed via the one-command installer:
520
+
521
+ ```bash
522
+ cd ~/.shooter/repo
523
+ git pull origin release
524
+ pnpm install
525
+ pnpm build
526
+ shooter stop && shooter start -d
527
+ ```
528
+
529
+ Or re-run the installer -- it detects the existing installation and offers to update:
530
+
531
+ ```bash
532
+ curl -fsSL https://raw.githubusercontent.com/juspay/shooter/release/scripts/install.sh | sh
533
+ ```
534
+
535
+ If you installed via npm:
536
+
537
+ ```bash
538
+ npm update -g @juspay/shooter
539
+ ```
540
+
541
+ ---
542
+
543
+ ## Uninstall
544
+
545
+ ```bash
546
+ # 1. Stop the server and disable autostart
547
+ shooter stop
548
+ shooter autostart off
549
+
550
+ # 2. Remove the data directory (config, logs, SQLite database)
551
+ rm -rf ~/.shooter
552
+
553
+ # 3. Remove the global command symlink
554
+ rm -f ~/.local/bin/shooter
555
+
556
+ # 4. Remove the repo (if installed via one-command installer)
557
+ rm -rf ~/.shooter/repo
558
+ ```
559
+
560
+ If you installed via npm: `npm uninstall -g @juspay/shooter`
561
+
562
+ To also remove Claude Code hooks, delete the `hooks` section from `.claude/settings.json` in each project that uses Shooter.
563
+
564
+ ---
565
+
566
+ ## Reset
567
+
568
+ To reset Shooter to a clean state without reinstalling:
569
+
570
+ ```bash
571
+ shooter stop
572
+ rm ~/.shooter/.env # Remove config (re-run shooter setup to regenerate)
573
+ rm ~/.shooter/shooter.db # Remove terminal history database
574
+ rm -rf ~/.shooter/logs # Remove log files
575
+ shooter setup # Regenerate config
576
+ shooter start -d # Restart
577
+ ```
578
+
579
+ ---
580
+
486
581
  ## Troubleshooting
487
582
 
488
583
  ### Server does not start
@@ -509,9 +604,9 @@ shooter/
509
604
 
510
605
  ### Hooks not sending notifications
511
606
 
512
- - `API_KEY` must be exported in your shell environment, not just in `.env`: `export API_KEY="..."`
607
+ - The notifier reads `API_KEY` from `~/.shooter/.env` automatically. If that file is missing or empty, run `shooter setup`.
513
608
  - Verify the hooks are configured in `.claude/settings.json`
514
- - Test connectivity: `curl -H "Authorization: Bearer $API_KEY" http://localhost:54007/api/health`
609
+ - Test connectivity: `curl -H "Authorization: Bearer $(grep API_KEY ~/.shooter/.env | cut -d= -f2 | tr -d '\"')" http://localhost:54007/api/health`
515
610
 
516
611
  ### Terminal sessions lost after restart
517
612
 
@@ -526,8 +621,9 @@ shooter/
526
621
 
527
622
  ### Port already in use
528
623
 
529
- - Default port is 54007. Set `PORT=<number>` in `.env` to use a different port.
530
- - Check what is using the port: `lsof -i :54007`
624
+ - `shooter start` detects port conflicts automatically and prints a clear error
625
+ - Default port is 54007. Set `PORT=<number>` in `~/.shooter/.env` to use a different port
626
+ - To find what's using the port: `lsof -i :54007` (macOS) or `ss -tlnp | grep 54007` (Linux)
531
627
 
532
628
  ---
533
629
 
package/bin/shooter.cjs CHANGED
@@ -23,6 +23,23 @@ const SYSTEMD_UNIT = path.join(os.homedir(), '.config', 'systemd', 'user', 'shoo
23
23
 
24
24
  const pkg = require(path.join(PKG_ROOT, 'package.json'));
25
25
 
26
+ // ── Read API key from env files (same chain as src/lib/env.ts) ──────
27
+ function readApiKey() {
28
+ if (process.env.API_KEY) return process.env.API_KEY;
29
+ const envFiles = [
30
+ path.join(SHOOTER_HOME, '.env'),
31
+ path.join(PKG_ROOT, '.env'),
32
+ path.join(os.homedir(), '.shooter', '.env'),
33
+ ];
34
+ for (const f of envFiles) {
35
+ try {
36
+ const match = fs.readFileSync(f, 'utf8').match(/^API_KEY=(.+)$/m);
37
+ if (match) return match[1].trim();
38
+ } catch {}
39
+ }
40
+ return null;
41
+ }
42
+
26
43
  // ── Signal Helpers ──────────────────────────────────────────────────
27
44
  function signalCode(sig) {
28
45
  return os.constants.signals[sig] || 0;
@@ -38,7 +55,11 @@ function readPid() {
38
55
  // Verify it's actually a node/shooter process (prevent PID reuse attacks)
39
56
  try {
40
57
  const cmdline = execSync(`ps -p ${pid} -o command= 2>/dev/null`, { encoding: 'utf8' }).trim();
41
- if (!cmdline.includes('shooter') && !cmdline.includes('server.ts') && !cmdline.includes('tsx')) {
58
+ if (
59
+ !cmdline.includes('shooter') &&
60
+ !cmdline.includes('server.ts') &&
61
+ !cmdline.includes('tsx')
62
+ ) {
42
63
  // PID was reused by a different process — stale pidfile
43
64
  fs.unlinkSync(PID_FILE);
44
65
  return null;
@@ -59,7 +80,9 @@ function writePid(pid) {
59
80
  }
60
81
 
61
82
  function removePid() {
62
- try { fs.unlinkSync(PID_FILE); } catch {}
83
+ try {
84
+ fs.unlinkSync(PID_FILE);
85
+ } catch {}
63
86
  }
64
87
 
65
88
  // ── CLI argument parsing ────────────────────────────────────────────
@@ -140,7 +163,9 @@ function startTunnel(port) {
140
163
  if (match) {
141
164
  clearInterval(poll);
142
165
  fs.writeFileSync(tunnelUrlFile, match[0]);
166
+ const apiKey = readApiKey();
143
167
  console.log(`Tunnel active: ${match[0]}`);
168
+ console.log(` API key: ${apiKey ? '(set)' : '(not set — run shooter setup)'}`);
144
169
  }
145
170
  } catch {}
146
171
  waited += 1;
@@ -159,10 +184,16 @@ function stopTunnel() {
159
184
  try {
160
185
  const pid = parseInt(fs.readFileSync(tunnelPidFile, 'utf8').trim(), 10);
161
186
  if (!isNaN(pid)) {
162
- try { process.kill(pid, 'SIGTERM'); } catch {}
187
+ try {
188
+ process.kill(pid, 'SIGTERM');
189
+ } catch {}
163
190
  }
164
- try { fs.unlinkSync(tunnelPidFile); } catch {}
165
- try { fs.unlinkSync(tunnelUrlFile); } catch {}
191
+ try {
192
+ fs.unlinkSync(tunnelPidFile);
193
+ } catch {}
194
+ try {
195
+ fs.unlinkSync(tunnelUrlFile);
196
+ } catch {}
166
197
  } catch {}
167
198
  }
168
199
 
@@ -187,6 +218,18 @@ function startServer() {
187
218
  const noTunnel = hasFlag('--no-tunnel');
188
219
  const port = resolvePort();
189
220
 
221
+ // Check if port is already in use (no external tools needed)
222
+ try {
223
+ execSync(
224
+ `"${process.execPath}" -e "const s=require('net').createServer();s.listen(${parseInt(port, 10)},()=>s.close());s.on('error',e=>{if(e.code==='EADDRINUSE')process.exit(1)})"`,
225
+ { stdio: 'ignore', timeout: 2000 }
226
+ );
227
+ } catch {
228
+ console.error(`Error: Port ${port} is already in use.`);
229
+ console.error('Stop the existing process or set a different PORT in ~/.shooter/.env');
230
+ process.exit(1);
231
+ }
232
+
190
233
  if (daemon) {
191
234
  // ── Daemon mode: detach, redirect to log file ──
192
235
  fs.mkdirSync(LOG_DIR, { recursive: true });
@@ -222,26 +265,29 @@ function startServer() {
222
265
  child.unref();
223
266
  fs.closeSync(logFd);
224
267
 
268
+ const apiKey = readApiKey();
225
269
  console.log(`Shooter started in background (PID ${child.pid}).`);
226
- console.log(` URL: http://localhost:${port}`);
227
- console.log(` Logs: ${LOG_FILE}`);
270
+ console.log(` URL: http://localhost:${port}`);
271
+ console.log(` API key: ${apiKey ? '(set)' : '(not set — run shooter setup)'}`);
272
+ console.log(` Logs: ${LOG_FILE}`);
228
273
 
229
- // Wait briefly for server to be ready before starting tunnel
274
+ // Start tunnel in background if available; it writes URL to ~/.shooter/.tunnel_url
230
275
  if (!noTunnel && isCloudflaredAvailable()) {
231
276
  setTimeout(() => {
232
277
  startTunnel(port);
233
278
  }, 3000);
234
- // Keep process alive long enough for tunnel URL to appear
235
- setTimeout(() => process.exit(0), 20000);
236
- } else {
237
- if (!noTunnel && !isCloudflaredAvailable()) {
238
- console.log(' (cloudflared not found — no tunnel. Install: brew install cloudflared)');
239
- }
240
- process.exit(0);
279
+ } else if (!noTunnel && !isCloudflaredAvailable()) {
280
+ console.log(' (cloudflared not found — no tunnel. Install: brew install cloudflared)');
241
281
  }
282
+ // Exit immediately — daemon is running, tunnel starts async
283
+ process.exit(0);
242
284
  } else {
243
285
  // ── Foreground mode: inherit stdio ──
244
- const child = spawn(process.execPath, ['--import', 'tsx', serverEntry], {
286
+ const tsxLoader = path.join(PKG_ROOT, 'node_modules', 'tsx', 'dist', 'loader.mjs');
287
+ const nodeArgs = fs.existsSync(tsxLoader)
288
+ ? ['--import', `file://${tsxLoader}`, serverEntry]
289
+ : ['--import', 'tsx', serverEntry];
290
+ const child = spawn(process.execPath, nodeArgs, {
245
291
  cwd: PKG_ROOT,
246
292
  stdio: 'inherit',
247
293
  env: {
@@ -253,6 +299,9 @@ function startServer() {
253
299
 
254
300
  writePid(child.pid);
255
301
 
302
+ // Clean up any stale tunnel from previous run (important for LaunchAgent restart)
303
+ stopTunnel();
304
+
256
305
  // Start tunnel in foreground mode too (unless --no-tunnel)
257
306
  let tunnelStarted = false;
258
307
  if (!noTunnel && isCloudflaredAvailable()) {
@@ -313,7 +362,9 @@ function stopServer() {
313
362
  if (waited > 5000) {
314
363
  clearInterval(check);
315
364
  console.log('Force-killing...');
316
- try { process.kill(pid, 'SIGKILL'); } catch {}
365
+ try {
366
+ process.kill(pid, 'SIGKILL');
367
+ } catch {}
317
368
  removePid();
318
369
  console.log('Shooter stopped.');
319
370
  }
@@ -349,7 +400,9 @@ function showStatus() {
349
400
  const autostartEnabled = isAutostartInstalled();
350
401
  const tunnelUrlFile = path.join(SHOOTER_HOME, '.tunnel_url');
351
402
  let tunnelUrl = null;
352
- try { tunnelUrl = fs.readFileSync(tunnelUrlFile, 'utf8').trim(); } catch {}
403
+ try {
404
+ tunnelUrl = fs.readFileSync(tunnelUrlFile, 'utf8').trim();
405
+ } catch {}
353
406
 
354
407
  if (pid) {
355
408
  console.log(`Shooter is running`);
@@ -448,7 +501,7 @@ function enableLaunchAgent() {
448
501
  <key>EnvironmentVariables</key>
449
502
  <dict>
450
503
  <key>PATH</key>
451
- <string>${path.dirname(nodeBin)}:/usr/local/bin:/usr/bin:/bin</string>
504
+ <string>${path.dirname(nodeBin)}:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
452
505
  <key>SHOOTER_HOME</key>
453
506
  <string>${SHOOTER_HOME}</string>
454
507
  </dict>
@@ -474,7 +527,9 @@ function enableLaunchAgent() {
474
527
 
475
528
  // Unload existing if present
476
529
  if (fs.existsSync(LAUNCHD_PLIST)) {
477
- try { execSync(`launchctl unload "${LAUNCHD_PLIST}" 2>/dev/null`); } catch {}
530
+ try {
531
+ execSync(`launchctl unload "${LAUNCHD_PLIST}" 2>/dev/null`);
532
+ } catch {}
478
533
  }
479
534
 
480
535
  fs.writeFileSync(LAUNCHD_PLIST, plist);
@@ -493,7 +548,9 @@ function disableLaunchAgent() {
493
548
  return;
494
549
  }
495
550
 
496
- try { execSync(`launchctl unload "${LAUNCHD_PLIST}" 2>/dev/null`); } catch {}
551
+ try {
552
+ execSync(`launchctl unload "${LAUNCHD_PLIST}" 2>/dev/null`);
553
+ } catch {}
497
554
  fs.unlinkSync(LAUNCHD_PLIST);
498
555
  console.log('Autostart disabled. LaunchAgent removed.');
499
556
  }
@@ -539,10 +596,16 @@ function disableSystemdUnit() {
539
596
  return;
540
597
  }
541
598
 
542
- try { execSync('systemctl --user stop shooter.service 2>/dev/null'); } catch {}
543
- try { execSync('systemctl --user disable shooter.service 2>/dev/null'); } catch {}
599
+ try {
600
+ execSync('systemctl --user stop shooter.service 2>/dev/null');
601
+ } catch {}
602
+ try {
603
+ execSync('systemctl --user disable shooter.service 2>/dev/null');
604
+ } catch {}
544
605
  fs.unlinkSync(SYSTEMD_UNIT);
545
- try { execSync('systemctl --user daemon-reload'); } catch {}
606
+ try {
607
+ execSync('systemctl --user daemon-reload');
608
+ } catch {}
546
609
  console.log('Autostart disabled. systemd unit removed.');
547
610
  }
548
611
 
@@ -553,9 +616,13 @@ function showLogs() {
553
616
 
554
617
  // For systemd on Linux, use journalctl
555
618
  if (platform === 'linux' && fs.existsSync(SYSTEMD_UNIT)) {
556
- const child = spawn('journalctl', ['--user', '-u', 'shooter.service', '-f', '--no-pager', '-n', '50'], {
557
- stdio: 'inherit',
558
- });
619
+ const child = spawn(
620
+ 'journalctl',
621
+ ['--user', '-u', 'shooter.service', '-f', '--no-pager', '-n', '50'],
622
+ {
623
+ stdio: 'inherit',
624
+ }
625
+ );
559
626
  child.on('exit', (code) => process.exit(code ?? 0));
560
627
  for (const sig of ['SIGTERM', 'SIGINT']) {
561
628
  process.on(sig, () => child.kill(sig));
@@ -630,7 +697,8 @@ Commands:
630
697
  autostart on Start automatically on login (macOS/Linux)
631
698
  autostart off Disable autostart
632
699
  logs Tail server logs
633
- setup Run the interactive setup wizard
700
+ setup Quick setup (API key + build, ~60 seconds)
701
+ setup --push Add/reconfigure push notifications
634
702
  version Show version number
635
703
  help Show this help message
636
704
 
@@ -645,7 +713,8 @@ Examples:
645
713
  shooter status Check status and tunnel URL
646
714
  shooter autostart on Enable autostart on login
647
715
  shooter logs Follow server logs
648
- shooter setup Configure credentials
716
+ shooter setup Quick setup (~60s, push deferred)
717
+ shooter setup --push Add iOS/Android push notifications
649
718
  `.trim()
650
719
  );
651
720
  }
@@ -0,0 +1 @@
1
+ @keyframes svelte-1qbe2oo-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes svelte-1qbe2oo-activity-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.7}}.card.svelte-1qbe2oo{background:var(--component-bg, #1a1a1a);border:1px solid var(--border, #2e2e2e);border-left:4px solid var(--status-color, #6b7280);border-radius:var(--radius-lg, 8px);padding:var(--space-4, 16px);display:flex;flex-direction:column;gap:var(--space-3, 12px);cursor:pointer;transition:border-color var(--transition-fast, .15s ease),background var(--transition-fast, .15s ease);color:inherit;text-align:left;width:100%}.card.svelte-1qbe2oo:hover{background:var(--component-bg-hover, #1f1f1f);border-color:var(--border-hover, #454545);border-left-color:var(--status-color, #6b7280)}.card.svelte-1qbe2oo:focus-visible{outline:2px solid var(--ds-blue-700, #0070f3);outline-offset:2px}.card-header.svelte-1qbe2oo{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2, 8px);min-width:0}.project-name.svelte-1qbe2oo{font-size:var(--text-base, 14px);font-weight:600;color:var(--text-primary, #ededed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.status-pill{--pill-font-size: var(--text-xs, 12px);--pill-font-weight: 500;--pill-padding: 3px 10px;--pill-border-radius: var(--radius-full, 9999px);--pill-cursor: default;flex-shrink:0}.status-pill--running-active{--pill-background: var(--ds-green-100);--pill-color: var(--ds-green-700);--pill-hover-background: var(--ds-green-100);--pill-hover-color: var(--ds-green-700);animation:svelte-1qbe2oo-pulse 2s ease-in-out infinite}.status-pill--running{--pill-background: var(--ds-blue-100);--pill-color: var(--ds-blue-700);--pill-hover-background: var(--ds-blue-100);--pill-hover-color: var(--ds-blue-700)}.status-pill--idle{--pill-background: var(--ds-amber-100);--pill-color: var(--ds-amber-700);--pill-hover-background: var(--ds-amber-100);--pill-hover-color: var(--ds-amber-700)}.status-pill--exited{--pill-background: var(--ds-gray-alpha-200);--pill-color: var(--ds-gray-600);--pill-hover-background: var(--ds-gray-alpha-200);--pill-hover-color: var(--ds-gray-600)}.status-pill--error{--pill-background: var(--ds-red-100);--pill-color: var(--ds-red-700);--pill-hover-background: var(--ds-red-100);--pill-hover-color: var(--ds-red-700)}.goal-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-secondary, #a1a1a1);font-style:italic;margin:0;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:var(--leading-normal, 1.5)}.summary-row.svelte-1qbe2oo{min-height:18px}.summary-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-primary, #ededed);line-height:var(--leading-normal, 1.5);display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.summarizing.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--ds-amber-700);font-style:italic}.summary-fallback.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);font-style:italic}.stats-row.svelte-1qbe2oo{display:flex;align-items:center;gap:var(--space-3, 12px);flex-wrap:wrap;min-width:0}.stat.svelte-1qbe2oo{display:inline-flex;align-items:center;gap:var(--space-1, 4px);font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);white-space:nowrap}.stat-error.svelte-1qbe2oo{color:var(--ds-red-700)}.stat-path.svelte-1qbe2oo{font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1;text-align:right}.status-dot-active.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-green-700);animation:svelte-1qbe2oo-activity-pulse .6s ease-in-out infinite;flex-shrink:0}.status-dot-static.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-gray-600, #878787);flex-shrink:0}@media(max-width:768px){.card.svelte-1qbe2oo{padding:10px 12px}.stats-row.svelte-1qbe2oo{flex-wrap:wrap;gap:4px}}@media(max-width:480px){.card.svelte-1qbe2oo{padding:8px 10px}.goal-text.svelte-1qbe2oo{-webkit-line-clamp:1;line-clamp:1}}.section.svelte-14sxgtb{display:flex;flex-direction:column;gap:var(--space-3, 12px);margin-bottom:var(--space-6, 24px)}.section-label.svelte-14sxgtb{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary, #a1a1a1);margin:0 0 var(--space-1, 4px) 0}.page-header.svelte-1uha8ag{margin-bottom:var(--space-6)}.page-header-content.svelte-1uha8ag{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--space-4)}.page-title.svelte-1uha8ag{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-1)}.page-description.svelte-1uha8ag{font-size:var(--text-sm);color:var(--text-secondary)}.page-actions.svelte-1uha8ag{display:flex;gap:var(--space-2);flex-shrink:0}.dashboard-section.svelte-1uha8ag{margin-bottom:var(--space-6)}.section-label.svelte-1uha8ag{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:var(--space-3)}.projects-container.svelte-1uha8ag{display:flex;flex-direction:column;gap:var(--space-4);animation:fadeIn .2s ease}@media(max-width:768px){.page-header-content.svelte-1uha8ag{flex-direction:column;gap:var(--space-4)}}@media(max-width:480px){.page-actions.svelte-1uha8ag{width:100%}.page-actions.svelte-1uha8ag button{flex:1}}
@@ -0,0 +1 @@
1
+ .feed.svelte-tc58m{display:flex;flex-direction:column;height:100%}header.svelte-tc58m{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-3) 0}h2.svelte-tc58m{margin:0;font-size:var(--text-lg)}.status.svelte-tc58m{font-size:var(--text-xs);color:var(--text-tertiary)}.status.live.svelte-tc58m{color:var(--ds-green-700)}.summarizing.svelte-tc58m{font-size:var(--text-xs);color:var(--ds-amber-700)}.entries.svelte-tc58m{flex:1;overflow-y:auto}.empty.svelte-tc58m{color:var(--text-tertiary);font-size:var(--text-sm)}.summary-card.svelte-tc58m{padding:var(--space-2) var(--space-3);margin-bottom:var(--space-2);background:var(--component-bg);border-radius:var(--radius-md);border-left:3px solid var(--ds-green-700)}.summary-card.svelte-tc58m time:where(.svelte-tc58m){font-size:var(--text-xs);color:var(--text-tertiary)}.summary-card.svelte-tc58m p:where(.svelte-tc58m){margin:var(--space-1) 0 2px;font-size:var(--text-sm);line-height:var(--leading-normal)}.event-count.svelte-tc58m{font-size:var(--text-xs);color:var(--text-tertiary)}.pending.svelte-tc58m{padding:var(--space-2) var(--space-3);font-size:var(--text-xs);color:var(--ds-amber-700)}.raw-toggle{--button-color: transparent;--button-text-color: var(--text-tertiary);--button-hover-color: transparent;--button-hover-text-color: var(--text-secondary);--button-font-family: var(--font-mono);--button-font-size: var(--text-xs);--button-padding: var(--space-2) 0;text-align:left}.raw-events.svelte-tc58m{font-size:var(--text-xs);max-height:200px;overflow-y:auto}.raw-event.svelte-tc58m{display:flex;gap:var(--space-2);padding:2px 0;opacity:1}.raw-event.summarized.svelte-tc58m{opacity:.5}.raw-event.svelte-tc58m time:where(.svelte-tc58m){color:var(--text-tertiary);min-width:60px}.raw-event.svelte-tc58m .project:where(.svelte-tc58m){color:var(--text-tertiary);min-width:80px;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.type.svelte-tc58m{color:var(--ds-blue-700)}.project-group.svelte-tc58m{margin-bottom:var(--space-4)}.project-name.svelte-tc58m{margin:0 0 var(--space-2) 0;font-size:var(--text-xs);font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px}.tool.svelte-tc58m{color:var(--ds-green-700)}.file-path.svelte-tc58m{color:var(--ds-amber-700);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}code.svelte-tc58m{color:var(--text-tertiary);font-size:var(--text-xs)}.page-title.svelte-13r34ge{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-4)}
@@ -1 +1 @@
1
- .settings-container.svelte-1gp6n77{max-width:900px;margin:0 auto;padding-bottom:var(--space-6)}.page-header.svelte-1gp6n77{margin-bottom:var(--space-8)}.page-title.svelte-1gp6n77{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-1)}.page-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary)}.settings-grid.svelte-1gp6n77{display:grid;grid-template-columns:1fr 320px;gap:var(--space-6);align-items:start}.settings-section.svelte-1gp6n77,.settings-sidebar.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-4)}.button-group.svelte-1gp6n77{display:flex;gap:var(--space-3);justify-content:flex-end}.setup-stepper{--container-flex-direction: column;--step-flex-direction: row;--step-index-container-height: 24px;--step-index-container-width: 24px;--step-index-font-size: var(--text-xs);--step-text-font-size: var(--text-sm);--step-text-margin: 0 0 0 var(--space-3);--separator-display: none;--step-text-active-color: var(--text-primary);--step-text-completed-color: var(--ds-green-900);--step-index-container-active-background-color: var(--component-bg-active);--step-index-container-completed-background-color: var(--ds-green-700);--step-index-container-background-color: var(--component-bg-active);--step-index-color: var(--text-secondary);align-items:flex-start;gap:var(--space-3)}.qr-section.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-3)}.qr-section.svelte-1gp6n77 .button-container{align-self:center}.qr-container.svelte-1gp6n77{display:flex;justify-content:center;padding:var(--space-3);background:var(--ds-background-200);border:1px solid var(--border);border-radius:var(--radius-lg)}.qr-image.svelte-1gp6n77{width:200px;height:200px;border-radius:var(--radius-sm);image-rendering:pixelated}.qr-placeholder.svelte-1gp6n77{display:flex;align-items:center;justify-content:center;height:200px;background:var(--ds-background-200);border:1px dashed var(--border);border-radius:var(--radius-lg)}.qr-loading-text.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-tertiary)}.qr-hint.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-secondary);line-height:var(--leading-relaxed);text-align:center}.qr-server-url.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary);text-align:center}.qr-server-url.svelte-1gp6n77 code:where(.svelte-1gp6n77){font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-secondary);background:var(--component-bg);padding:1px 4px;border-radius:var(--radius-sm)}.qr-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-relaxed)}.qr-error.svelte-1gp6n77{font-size:var(--text-sm);color:var(--ds-red-900);line-height:var(--leading-relaxed)}.settings-sidebar.svelte-1gp6n77 .card:last-child{border-color:#d930364d}.danger-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);margin-bottom:var(--space-4);line-height:var(--leading-relaxed);padding-left:var(--space-3);border-left:3px solid rgba(217,48,54,.5)}.input-help.svelte-1gp6n77{font-size:var(--text-xs);color:var(--color-text-tertiary, #888);margin-top:var(--space-1);margin-bottom:0}.input-help.svelte-1gp6n77 code:where(.svelte-1gp6n77){background:var(--ds-gray-200, #1a1a1a);padding:1px 4px;border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs)}@media(max-width:768px){.settings-grid.svelte-1gp6n77{grid-template-columns:1fr}.button-group.svelte-1gp6n77{flex-direction:column}.button-group.svelte-1gp6n77 button,.button-group.svelte-1gp6n77 .button-container{width:100%}}
1
+ .settings-container.svelte-1gp6n77{max-width:900px;margin:0 auto;padding-bottom:var(--space-6)}.page-header.svelte-1gp6n77{margin-bottom:var(--space-8)}.page-title.svelte-1gp6n77{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-1)}.page-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary)}.settings-grid.svelte-1gp6n77{display:grid;grid-template-columns:1fr 320px;gap:var(--space-6);align-items:start}.settings-section.svelte-1gp6n77,.settings-sidebar.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-4)}.button-group.svelte-1gp6n77{display:flex;gap:var(--space-3);justify-content:flex-end}.setup-stepper{--container-flex-direction: column;--step-flex-direction: row;--step-index-container-height: 24px;--step-index-container-width: 24px;--step-index-font-size: var(--text-xs);--step-text-font-size: var(--text-sm);--step-text-margin: 0 0 0 var(--space-3);--separator-display: none;--step-text-active-color: var(--text-primary);--step-text-completed-color: var(--ds-green-900);--step-index-container-active-background-color: var(--component-bg-active);--step-index-container-completed-background-color: var(--ds-green-700);--step-index-container-background-color: var(--component-bg-active);--step-index-color: var(--text-secondary);align-items:flex-start;gap:var(--space-3)}.qr-section.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-3)}.qr-section.svelte-1gp6n77 .button-container{align-self:center}.qr-container.svelte-1gp6n77{display:flex;justify-content:center;padding:var(--space-3);background:var(--ds-background-200);border:1px solid var(--border);border-radius:var(--radius-lg)}.qr-image.svelte-1gp6n77{width:200px;height:200px;border-radius:var(--radius-sm);image-rendering:pixelated}.qr-placeholder.svelte-1gp6n77{display:flex;align-items:center;justify-content:center;height:200px;background:var(--ds-background-200);border:1px dashed var(--border);border-radius:var(--radius-lg)}.qr-loading-text.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-tertiary)}.qr-hint.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-secondary);line-height:var(--leading-relaxed);text-align:center}.qr-server-url.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary);text-align:center}.qr-server-url.svelte-1gp6n77 code:where(.svelte-1gp6n77){font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-secondary);background:var(--component-bg);padding:1px 4px;border-radius:var(--radius-sm)}.qr-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-relaxed)}.qr-error.svelte-1gp6n77{font-size:var(--text-sm);color:var(--ds-red-900);line-height:var(--leading-relaxed)}.settings-sidebar.svelte-1gp6n77 .card:last-child{border-color:color-mix(in srgb,var(--ds-red-700) 30%,transparent)}.ai-providers.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-2)}.provider-row.svelte-1gp6n77{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-sm)}.provider-label.svelte-1gp6n77{flex:1;color:var(--text-primary)}.provider-status.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary)}.provider-status.configured.svelte-1gp6n77{color:var(--ds-green-900)}.active-provider.svelte-1gp6n77{margin-top:var(--space-2);padding-top:var(--space-2);border-top:1px solid var(--border);font-size:var(--text-xs);color:var(--text-secondary)}.ai-help.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-secondary);margin-top:var(--space-2)}.ai-help.svelte-1gp6n77 code:where(.svelte-1gp6n77){background:var(--ds-gray-200, #1a1a1a);padding:1px 4px;border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs)}.danger-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);margin-bottom:var(--space-4);line-height:var(--leading-relaxed);padding-left:var(--space-3);border-left:3px solid color-mix(in srgb,var(--ds-red-700) 50%,transparent)}.input-help.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary);margin-top:var(--space-1);margin-bottom:0}.input-help.svelte-1gp6n77 code:where(.svelte-1gp6n77){background:var(--ds-gray-200, #1a1a1a);padding:1px 4px;border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs)}@media(max-width:768px){.settings-grid.svelte-1gp6n77{grid-template-columns:1fr}.button-group.svelte-1gp6n77{flex-direction:column}.button-group.svelte-1gp6n77 button,.button-group.svelte-1gp6n77 .button-container{width:100%}}
@@ -0,0 +1 @@
1
+ .page.svelte-sjabew{display:flex;flex-direction:column;height:100vh;background:var(--background);color:var(--text-primary);font-family:var(--font-mono);padding:0}header.svelte-sjabew{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border)}h1.svelte-sjabew{font-size:var(--text-lg);color:var(--ds-blue-700);margin:0}.version.svelte-sjabew{color:var(--text-tertiary);font-size:var(--text-xs)}.pill-connected{--pill-background: var(--ds-green-100);--pill-color: var(--ds-green-700);--pill-font-size: var(--text-xs)}.pill-loading{--pill-background: var(--ds-amber-100);--pill-color: var(--ds-amber-700);--pill-font-size: var(--text-xs)}.provider-bar.svelte-sjabew{display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--border);flex-wrap:wrap}.prov-pill{--pill-background: var(--component-bg);--pill-color: var(--text-tertiary);--pill-font-size: var(--text-xs);--pill-cursor: pointer;--pill-border-radius: var(--radius-md)}.prov-pill:hover{--pill-color: var(--text-primary)}.prov-pill--active{--pill-background: var(--ds-blue-100);--pill-color: var(--ds-blue-700)}.log.svelte-sjabew{flex:1;overflow-y:auto;padding:var(--space-3) var(--space-4);font-size:var(--text-sm);line-height:1.6}.log-entry.svelte-sjabew{white-space:pre-wrap;margin-bottom:var(--space-1)}.log-entry.pass.svelte-sjabew{color:var(--ds-green-900)}.log-entry.fail.svelte-sjabew{color:var(--ds-red-900)}.log-entry.dim.svelte-sjabew{color:var(--text-tertiary);font-size:var(--text-xs)}.log-entry.user.svelte-sjabew{color:var(--ds-blue-700);font-weight:700}.log-entry.ai.svelte-sjabew{color:var(--text-primary);padding:var(--space-2) var(--space-3);background:var(--component-bg);border-radius:var(--radius-md);margin:var(--space-1) 0}.input-bar.svelte-sjabew{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-top:1px solid var(--border)}.input-bar.svelte-sjabew .input-prompt{flex:1;--input-font-family: var(--font-mono);--input-background: var(--component-bg);--input-border: 1px solid var(--border-hover);--input-focus-border: 1px solid var(--ds-blue-700);--input-container-margin: 0}
@@ -0,0 +1 @@
1
+ import{p as u,q as S,v as h,w as o,x as v,D as x,S as T}from"./CJFjKwJ7.js";function n(r,s){return r===s||r?.[T]===s}function l(r={},s,i,b){var c=u.r,p=v;return S(()=>{var f,a;return h(()=>{f=a,a=[],o(()=>{r!==i(...a)&&(s(r,...a),f&&n(i(...f),r)&&s(null,...f))})}),()=>{let t=p;for(;t!==c&&t.parent!==null&&t.parent.f&x;)t=t.parent;const w=()=>{a&&n(i(...a),r)&&s(null,...a)},d=t.teardown;t.teardown=()=>{w(),d?.()}}}),r}export{l as b};