@juspay/shooter 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/README.md +24 -20
  2. package/bin/shooter.cjs +68 -17
  3. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css +1 -0
  4. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.br +0 -0
  5. package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.gz +0 -0
  6. package/build/client/_app/immutable/assets/3.DHxQoulp.css +1 -0
  7. package/build/client/_app/immutable/assets/3.DHxQoulp.css.br +0 -0
  8. package/build/client/_app/immutable/assets/3.DHxQoulp.css.gz +0 -0
  9. package/build/client/_app/immutable/assets/{3.DGDHCVnW.css → 4.D5l1JxgO.css} +1 -1
  10. package/build/client/_app/immutable/assets/4.D5l1JxgO.css.br +0 -0
  11. package/build/client/_app/immutable/assets/4.D5l1JxgO.css.gz +0 -0
  12. package/build/client/_app/immutable/assets/5.C5qz-NeI.css +1 -0
  13. package/build/client/_app/immutable/assets/5.C5qz-NeI.css.br +0 -0
  14. package/build/client/_app/immutable/assets/5.C5qz-NeI.css.gz +0 -0
  15. package/build/client/_app/immutable/chunks/1mEchsPO.js +1 -0
  16. package/build/client/_app/immutable/chunks/1mEchsPO.js.br +0 -0
  17. package/build/client/_app/immutable/chunks/1mEchsPO.js.gz +0 -0
  18. package/build/client/_app/immutable/chunks/B7X-vhXI.js +1 -0
  19. package/build/client/_app/immutable/chunks/B7X-vhXI.js.br +0 -0
  20. package/build/client/_app/immutable/chunks/B7X-vhXI.js.gz +0 -0
  21. package/build/client/_app/immutable/chunks/BRkqKgVG.js +1 -0
  22. package/build/client/_app/immutable/chunks/BRkqKgVG.js.br +0 -0
  23. package/build/client/_app/immutable/chunks/BRkqKgVG.js.gz +0 -0
  24. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js +1 -0
  25. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.br +2 -0
  26. package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.gz +0 -0
  27. package/build/client/_app/immutable/chunks/CGMJxf7r.js +1 -0
  28. package/build/client/_app/immutable/chunks/CGMJxf7r.js.br +0 -0
  29. package/build/client/_app/immutable/chunks/CGMJxf7r.js.gz +0 -0
  30. package/build/client/_app/immutable/chunks/{CZHsSL_X.js → CJFjKwJ7.js} +1 -1
  31. package/build/client/_app/immutable/chunks/CJFjKwJ7.js.br +0 -0
  32. package/build/client/_app/immutable/chunks/CJFjKwJ7.js.gz +0 -0
  33. package/build/client/_app/immutable/chunks/CNH2HlKj.js +20 -0
  34. package/build/client/_app/immutable/chunks/CNH2HlKj.js.br +0 -0
  35. package/build/client/_app/immutable/chunks/CNH2HlKj.js.gz +0 -0
  36. package/build/client/_app/immutable/chunks/CR6bkGJW.js +6 -0
  37. package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
  38. package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
  39. package/build/client/_app/immutable/chunks/CVtJ6yRM.js +1 -0
  40. package/build/client/_app/immutable/chunks/CVtJ6yRM.js.br +0 -0
  41. package/build/client/_app/immutable/chunks/CVtJ6yRM.js.gz +0 -0
  42. package/build/client/_app/immutable/chunks/{CSoRdFvv.js → CaiJSUi3.js} +1 -1
  43. package/build/client/_app/immutable/chunks/CaiJSUi3.js.br +0 -0
  44. package/build/client/_app/immutable/chunks/CaiJSUi3.js.gz +0 -0
  45. package/build/client/_app/immutable/chunks/{DjsDGxCa.js → CmczWE_d.js} +4 -4
  46. package/build/client/_app/immutable/chunks/CmczWE_d.js.br +0 -0
  47. package/build/client/_app/immutable/chunks/CmczWE_d.js.gz +0 -0
  48. package/build/client/_app/immutable/chunks/CsgHjHGZ.js +1 -0
  49. package/build/client/_app/immutable/chunks/CsgHjHGZ.js.br +0 -0
  50. package/build/client/_app/immutable/chunks/CsgHjHGZ.js.gz +0 -0
  51. package/build/client/_app/immutable/chunks/{UJOiqIYE.js → CtrCjGZT.js} +1 -1
  52. package/build/client/_app/immutable/chunks/CtrCjGZT.js.br +0 -0
  53. package/build/client/_app/immutable/chunks/CtrCjGZT.js.gz +0 -0
  54. package/build/client/_app/immutable/chunks/DDiOVAd8.js +61 -0
  55. package/build/client/_app/immutable/chunks/DDiOVAd8.js.br +0 -0
  56. package/build/client/_app/immutable/chunks/DDiOVAd8.js.gz +0 -0
  57. package/build/client/_app/immutable/chunks/DVl0sebP.js +2 -0
  58. package/build/client/_app/immutable/chunks/DVl0sebP.js.br +0 -0
  59. package/build/client/_app/immutable/chunks/DVl0sebP.js.gz +0 -0
  60. package/build/client/_app/immutable/chunks/{CiF38mQq.js → Dc_Gg2H6.js} +1 -1
  61. package/build/client/_app/immutable/chunks/Dc_Gg2H6.js.br +0 -0
  62. package/build/client/_app/immutable/chunks/Dc_Gg2H6.js.gz +0 -0
  63. package/build/client/_app/immutable/chunks/{CRbaG9cv.js → DlnAjkg1.js} +1 -1
  64. package/build/client/_app/immutable/chunks/DlnAjkg1.js.br +0 -0
  65. package/build/client/_app/immutable/chunks/{CRbaG9cv.js.gz → DlnAjkg1.js.gz} +0 -0
  66. package/build/client/_app/immutable/chunks/YKoRJzXZ.js +3 -0
  67. package/build/client/_app/immutable/chunks/YKoRJzXZ.js.br +0 -0
  68. package/build/client/_app/immutable/chunks/YKoRJzXZ.js.gz +0 -0
  69. package/build/client/_app/immutable/chunks/gQJcRhou.js +1 -0
  70. package/build/client/_app/immutable/chunks/gQJcRhou.js.br +0 -0
  71. package/build/client/_app/immutable/chunks/gQJcRhou.js.gz +0 -0
  72. package/build/client/_app/immutable/chunks/pRcLbE0d.js +1 -0
  73. package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
  74. package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
  75. package/build/client/_app/immutable/entry/app.CFPgQOa8.js +2 -0
  76. package/build/client/_app/immutable/entry/app.CFPgQOa8.js.br +0 -0
  77. package/build/client/_app/immutable/entry/app.CFPgQOa8.js.gz +0 -0
  78. package/build/client/_app/immutable/entry/start.BnJOVqhI.js +1 -0
  79. package/build/client/_app/immutable/entry/start.BnJOVqhI.js.br +2 -0
  80. package/build/client/_app/immutable/entry/start.BnJOVqhI.js.gz +0 -0
  81. package/build/client/_app/immutable/nodes/0.DR-BBF5r.js +1 -0
  82. package/build/client/_app/immutable/nodes/0.DR-BBF5r.js.br +0 -0
  83. package/build/client/_app/immutable/nodes/0.DR-BBF5r.js.gz +0 -0
  84. package/build/client/_app/immutable/nodes/1.CNm6rAwf.js +1 -0
  85. package/build/client/_app/immutable/nodes/1.CNm6rAwf.js.br +0 -0
  86. package/build/client/_app/immutable/nodes/1.CNm6rAwf.js.gz +0 -0
  87. package/build/client/_app/immutable/nodes/2.B08usYzr.js +13 -0
  88. package/build/client/_app/immutable/nodes/2.B08usYzr.js.br +0 -0
  89. package/build/client/_app/immutable/nodes/2.B08usYzr.js.gz +0 -0
  90. package/build/client/_app/immutable/nodes/3.CsY6J5HS.js +9 -0
  91. package/build/client/_app/immutable/nodes/3.CsY6J5HS.js.br +0 -0
  92. package/build/client/_app/immutable/nodes/3.CsY6J5HS.js.gz +0 -0
  93. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js +4 -0
  94. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.br +0 -0
  95. package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.gz +0 -0
  96. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js +1 -0
  97. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.br +0 -0
  98. package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.gz +0 -0
  99. package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js +1 -0
  100. package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js.br +0 -0
  101. package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js.gz +0 -0
  102. package/build/client/_app/immutable/nodes/{5.DIkXVP4q.js → 7.CCKgiNNk.js} +3 -3
  103. package/build/client/_app/immutable/nodes/7.CCKgiNNk.js.br +0 -0
  104. package/build/client/_app/immutable/nodes/7.CCKgiNNk.js.gz +0 -0
  105. package/build/client/_app/immutable/nodes/8.C7AaheUD.js +2 -0
  106. package/build/client/_app/immutable/nodes/8.C7AaheUD.js.br +0 -0
  107. package/build/client/_app/immutable/nodes/8.C7AaheUD.js.gz +0 -0
  108. package/build/client/_app/immutable/nodes/9.DfL9kMC4.js +2 -0
  109. package/build/client/_app/immutable/nodes/9.DfL9kMC4.js.br +0 -0
  110. package/build/client/_app/immutable/nodes/9.DfL9kMC4.js.gz +0 -0
  111. package/build/client/_app/version.json +1 -1
  112. package/build/client/_app/version.json.br +0 -0
  113. package/build/client/_app/version.json.gz +0 -0
  114. package/build/server/chunks/0-DC2VLooL.js +23 -0
  115. package/build/server/chunks/0-DC2VLooL.js.map +1 -0
  116. package/build/server/chunks/1-XJaf8Jvf.js +9 -0
  117. package/build/server/chunks/{1-D0N7vVhH.js.map → 1-XJaf8Jvf.js.map} +1 -1
  118. package/build/server/chunks/2-D4Cx-1QL.js +21 -0
  119. package/build/server/chunks/2-D4Cx-1QL.js.map +1 -0
  120. package/build/server/chunks/3-CVhIEP-u.js +21 -0
  121. package/build/server/chunks/3-CVhIEP-u.js.map +1 -0
  122. package/build/server/chunks/4-0UE_6Ep-.js +23 -0
  123. package/build/server/chunks/4-0UE_6Ep-.js.map +1 -0
  124. package/build/server/chunks/5-BBIP1PzX.js +24 -0
  125. package/build/server/chunks/5-BBIP1PzX.js.map +1 -0
  126. package/build/server/chunks/6-QFSbzRMP.js +9 -0
  127. package/build/server/chunks/6-QFSbzRMP.js.map +1 -0
  128. package/build/server/chunks/7-CZ_YGjMV.js +9 -0
  129. package/build/server/chunks/7-CZ_YGjMV.js.map +1 -0
  130. package/build/server/chunks/8-Xe2Rugb4.js +9 -0
  131. package/build/server/chunks/8-Xe2Rugb4.js.map +1 -0
  132. package/build/server/chunks/9-IwHpC4SO.js +9 -0
  133. package/build/server/chunks/9-IwHpC4SO.js.map +1 -0
  134. package/build/server/chunks/{Button-Cs1aE6ka.js → Button-WKgiLWZI.js} +4 -9
  135. package/build/server/chunks/Button-WKgiLWZI.js.map +1 -0
  136. package/build/server/chunks/{EmptyState-DDFH1K8g.js → EmptyState-BUBqASsp.js} +3 -3
  137. package/build/server/chunks/{EmptyState-DDFH1K8g.js.map → EmptyState-BUBqASsp.js.map} +1 -1
  138. package/build/server/chunks/{Icon-CEUrotA6.js → Icon-BNBAg85a.js} +3 -3
  139. package/build/server/chunks/Icon-BNBAg85a.js.map +1 -0
  140. package/build/server/chunks/{Shimmer-DB8W1zt6.js → Shimmer-C4uBVwxz.js} +2 -2
  141. package/build/server/chunks/{Shimmer-DB8W1zt6.js.map → Shimmer-C4uBVwxz.js.map} +1 -1
  142. package/build/server/chunks/{_error.svelte-uCOJNxvr.js → _error.svelte-DkIwmECt.js} +5 -5
  143. package/build/server/chunks/{_error.svelte-uCOJNxvr.js.map → _error.svelte-DkIwmECt.js.map} +1 -1
  144. package/build/server/chunks/{_layout.svelte-CtWmEJwe.js → _layout.svelte-DllETxmJ.js} +13 -7
  145. package/build/server/chunks/_layout.svelte-DllETxmJ.js.map +1 -0
  146. package/build/server/chunks/_page.svelte-BZSdLKE_.js +118 -0
  147. package/build/server/chunks/_page.svelte-BZSdLKE_.js.map +1 -0
  148. package/build/server/chunks/{_page.svelte-CxWcQ0Am.js → _page.svelte-Cmuco1mC.js} +84 -199
  149. package/build/server/chunks/_page.svelte-Cmuco1mC.js.map +1 -0
  150. package/build/server/chunks/{_page.svelte-BgevQjq1.js → _page.svelte-Co5sF7W-.js} +12 -11
  151. package/build/server/chunks/{_page.svelte-BgevQjq1.js.map → _page.svelte-Co5sF7W-.js.map} +1 -1
  152. package/build/server/chunks/{_page.svelte-DO4oa_LY.js → _page.svelte-CpL3R-VI.js} +8 -8
  153. package/build/server/chunks/{_page.svelte-DO4oa_LY.js.map → _page.svelte-CpL3R-VI.js.map} +1 -1
  154. package/build/server/chunks/_page.svelte-DDSzYLUs.js +137 -0
  155. package/build/server/chunks/_page.svelte-DDSzYLUs.js.map +1 -0
  156. package/build/server/chunks/_page.svelte-JIkgFUFf.js +26 -0
  157. package/build/server/chunks/_page.svelte-JIkgFUFf.js.map +1 -0
  158. package/build/server/chunks/{_page.svelte-CVq6tRb3.js → _page.svelte-Y9-O5a5w.js} +10 -9
  159. package/build/server/chunks/_page.svelte-Y9-O5a5w.js.map +1 -0
  160. package/build/server/chunks/{_page.svelte-BcZaKdX9.js → _page.svelte-fcX09N4d.js} +9 -9
  161. package/build/server/chunks/{_page.svelte-BcZaKdX9.js.map → _page.svelte-fcX09N4d.js.map} +1 -1
  162. package/build/server/chunks/{_server.ts-DYpJImqd.js → _server.ts-0Xr2fWaq.js} +9 -5
  163. package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +1 -0
  164. package/build/server/chunks/{_server.ts-CTpcLUH8.js → _server.ts-2ixC-X3K.js} +20 -5
  165. package/build/server/chunks/_server.ts-2ixC-X3K.js.map +1 -0
  166. package/build/server/chunks/{_server.ts-CAxsWKvS.js → _server.ts-40c_epk8.js} +20 -4
  167. package/build/server/chunks/_server.ts-40c_epk8.js.map +1 -0
  168. package/build/server/chunks/{_server.ts-WhTJBEJy.js → _server.ts-A9_tRR-K.js} +5 -4
  169. package/build/server/chunks/{_server.ts-WhTJBEJy.js.map → _server.ts-A9_tRR-K.js.map} +1 -1
  170. package/build/server/chunks/_server.ts-BRAzC6W1.js +98 -0
  171. package/build/server/chunks/_server.ts-BRAzC6W1.js.map +1 -0
  172. package/build/server/chunks/{_server.ts-DB_Kg97c.js → _server.ts-BScvgttw.js} +24 -4
  173. package/build/server/chunks/_server.ts-BScvgttw.js.map +1 -0
  174. package/build/server/chunks/{_server.ts-tSpgyl1D.js → _server.ts-Bjbr7glm.js} +4 -3
  175. package/build/server/chunks/_server.ts-Bjbr7glm.js.map +1 -0
  176. package/build/server/chunks/{_server.ts-COu0vNpd.js → _server.ts-BrqaMMAa.js} +7 -6
  177. package/build/server/chunks/_server.ts-BrqaMMAa.js.map +1 -0
  178. package/build/server/chunks/{_server.ts-vekTmWAx.js → _server.ts-BuYyCrnF.js} +6 -4
  179. package/build/server/chunks/_server.ts-BuYyCrnF.js.map +1 -0
  180. package/build/server/chunks/{_server.ts-DYvb9ijZ.js → _server.ts-ByPExYfO.js} +4 -3
  181. package/build/server/chunks/{_server.ts-DYvb9ijZ.js.map → _server.ts-ByPExYfO.js.map} +1 -1
  182. package/build/server/chunks/_server.ts-CjpQ10xh.js +123 -0
  183. package/build/server/chunks/_server.ts-CjpQ10xh.js.map +1 -0
  184. package/build/server/chunks/_server.ts-CyjDrcZN.js +21 -0
  185. package/build/server/chunks/_server.ts-CyjDrcZN.js.map +1 -0
  186. package/build/server/chunks/{_server.ts-DV8zTCF9.js → _server.ts-DOGUMzPx.js} +4 -3
  187. package/build/server/chunks/{_server.ts-DV8zTCF9.js.map → _server.ts-DOGUMzPx.js.map} +1 -1
  188. package/build/server/chunks/_server.ts-DZvfyuNj.js +15 -0
  189. package/build/server/chunks/_server.ts-DZvfyuNj.js.map +1 -0
  190. package/build/server/chunks/{_server.ts-XzT2UHM1.js → _server.ts-DkPPTUPo.js} +4 -3
  191. package/build/server/chunks/{_server.ts-XzT2UHM1.js.map → _server.ts-DkPPTUPo.js.map} +1 -1
  192. package/build/server/chunks/{_server.ts-Deok2y88.js → _server.ts-Ds_SUGC3.js} +184 -90
  193. package/build/server/chunks/_server.ts-Ds_SUGC3.js.map +1 -0
  194. package/build/server/chunks/{_server.ts-Ch-6iOHp.js → _server.ts-G8OeADGj.js} +141 -89
  195. package/build/server/chunks/_server.ts-G8OeADGj.js.map +1 -0
  196. package/build/server/chunks/{auth-DeCdZ83n.js → auth-DuunT7Cg.js} +2 -2
  197. package/build/server/chunks/{auth-DeCdZ83n.js.map → auth-DuunT7Cg.js.map} +1 -1
  198. package/build/server/chunks/{client-BdGHe_hY.js → client-DRtPDkMh.js} +4 -4
  199. package/build/server/chunks/{client-BdGHe_hY.js.map → client-DRtPDkMh.js.map} +1 -1
  200. package/build/server/chunks/client2-bqqmu0b7.js +7 -0
  201. package/build/server/chunks/{client2-CCBGA-2V.js.map → client2-bqqmu0b7.js.map} +1 -1
  202. package/build/server/chunks/close-BGlLztTb.js +192 -0
  203. package/build/server/chunks/close-BGlLztTb.js.map +1 -0
  204. package/build/server/chunks/events-handler-Dm1mNPQP.js +20 -0
  205. package/build/server/chunks/events-handler-Dm1mNPQP.js.map +1 -0
  206. package/build/server/chunks/html-FW6Ia4bL.js +8 -0
  207. package/build/server/chunks/html-FW6Ia4bL.js.map +1 -0
  208. package/build/server/chunks/{shared-server-sSGG17Df.js → index-CoD1IJuy.js} +2 -11
  209. package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
  210. package/build/server/chunks/{index-DwaY1cAm.js → index-DP9bWJrR.js} +2 -2
  211. package/build/server/chunks/{index-DwaY1cAm.js.map → index-DP9bWJrR.js.map} +1 -1
  212. package/build/server/chunks/{index-server-CrDaL06Y.js → index-server-BUmV4MIG.js} +2 -2
  213. package/build/server/chunks/index-server-BUmV4MIG.js.map +1 -0
  214. package/build/server/chunks/index-server2-BJrT0wnA.js +5 -0
  215. package/build/server/chunks/index-server2-BJrT0wnA.js.map +1 -0
  216. package/build/server/chunks/{index2-CgclKpUj.js → index2-D5Y19GKR.js} +2 -2
  217. package/build/server/chunks/index2-D5Y19GKR.js.map +1 -0
  218. package/build/server/chunks/{library-apns-BqJbvSKh.js → library-apns-Cf-E-DhM.js} +5 -2
  219. package/build/server/chunks/library-apns-Cf-E-DhM.js.map +1 -0
  220. package/build/server/chunks/providers-DtstoHQ0.js +17 -0
  221. package/build/server/chunks/providers-DtstoHQ0.js.map +1 -0
  222. package/build/server/chunks/{pty-manager-BQVB7IVj.js → pty-manager-TyMUpDA9.js} +41 -9
  223. package/build/server/chunks/pty-manager-TyMUpDA9.js.map +1 -0
  224. package/build/server/chunks/{root-DDSnEAZv.js → root-CATOR_0t.js} +2 -2
  225. package/build/server/chunks/root-CATOR_0t.js.map +1 -0
  226. package/build/server/chunks/shared-server-DaWdgxVh.js +11 -0
  227. package/build/server/chunks/shared-server-DaWdgxVh.js.map +1 -0
  228. package/build/server/chunks/{state.svelte-hBbXlUak.js → state.svelte-CftllyvC.js} +3 -3
  229. package/build/server/chunks/state.svelte-CftllyvC.js.map +1 -0
  230. package/build/server/chunks/{stores-DHNzYNpX.js → stores-BjL57aOK.js} +4 -4
  231. package/build/server/chunks/{stores-DHNzYNpX.js.map → stores-BjL57aOK.js.map} +1 -1
  232. package/build/server/index.js +173 -6
  233. package/build/server/index.js.map +1 -1
  234. package/build/server/manifest.js +53 -30
  235. package/build/server/manifest.js.map +1 -1
  236. package/package.json +24 -6
  237. package/scripts/dev.mjs +361 -0
  238. package/scripts/install.sh +11 -3
  239. package/scripts/{fix-generated-types.sh → postgen-types.sh} +2 -2
  240. package/scripts/setup.cjs +219 -24
  241. package/scripts/vercel-env-commands.sh +3 -3
  242. package/server.ts +3 -3
  243. package/src/app.html +163 -0
  244. package/src/lib/modules/client/activity/ActivityFeed.svelte +279 -0
  245. package/src/lib/modules/client/activity/index.ts +8 -0
  246. package/src/lib/modules/client/activity/store.svelte.ts +478 -0
  247. package/src/lib/modules/client/activity/summarizer.ts +224 -0
  248. package/src/lib/modules/client/common/Card.svelte +2 -9
  249. package/src/lib/modules/client/common/EmptyState.svelte +2 -20
  250. package/src/lib/modules/client/common/Icon.svelte +3 -7
  251. package/src/lib/modules/client/common/StatusBadge.svelte +2 -4
  252. package/src/lib/modules/client/common/config-guard.ts +22 -2
  253. package/src/lib/modules/client/common/index.ts +1 -1
  254. package/src/lib/modules/client/common/time.ts +27 -9
  255. package/src/lib/modules/client/dashboard/DashboardCard.svelte +374 -0
  256. package/src/lib/modules/client/dashboard/DashboardView.svelte +66 -0
  257. package/src/lib/modules/client/dashboard/index.ts +12 -0
  258. package/src/lib/modules/client/dashboard/store.svelte.ts +663 -0
  259. package/src/lib/modules/client/dashboard/summarizer.ts +205 -0
  260. package/src/lib/modules/client/neurolink/fetch-proxy.ts +70 -0
  261. package/src/lib/modules/client/neurolink/provider-config.ts +111 -0
  262. package/src/lib/modules/client/terminal/ChatView.svelte +46 -43
  263. package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -12
  264. package/src/lib/modules/client/terminal/ConnectionStatus.svelte +3 -6
  265. package/src/lib/modules/client/terminal/LaunchSheet.svelte +10 -21
  266. package/src/lib/modules/client/terminal/QuickKeys.svelte +4 -11
  267. package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +3 -6
  268. package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +5 -7
  269. package/src/lib/modules/client/terminal/xterm-wrapper.ts +27 -47
  270. package/src/lib/modules/server/apn/library-apns.ts +6 -3
  271. package/src/lib/modules/server/apn/notification-history.ts +2 -2
  272. package/src/lib/modules/server/apn/notification-sessions.ts +1 -3
  273. package/src/lib/modules/server/apn/pending-requests.ts +1 -1
  274. package/src/lib/modules/server/apn/types.ts +2 -52
  275. package/src/lib/modules/server/cli/index.ts +1 -30
  276. package/src/lib/modules/server/cli/runner.ts +7 -15
  277. package/src/lib/modules/server/fcm/fcm-service.ts +2 -2
  278. package/src/lib/modules/server/sessions/jsonl-parser.ts +97 -42
  279. package/src/lib/modules/server/sessions/jsonl-reader.ts +144 -76
  280. package/src/lib/modules/server/sessions/opencode-reader.ts +1 -1
  281. package/src/lib/modules/server/sessions/process-detector.ts +72 -31
  282. package/src/lib/modules/server/sessions/types.ts +2 -42
  283. package/src/lib/modules/server/terminal/holder-client.ts +11 -35
  284. package/src/lib/modules/server/terminal/opencode-watcher.ts +16 -24
  285. package/src/lib/modules/server/terminal/pty-manager.ts +40 -45
  286. package/src/lib/modules/server/terminal/session-watcher.ts +15 -17
  287. package/src/lib/modules/server/terminal/terminal-store.ts +1 -1
  288. package/src/lib/modules/server/ws/events-handler.ts +1 -16
  289. package/src/lib/modules/server/ws/keepalive.ts +1 -5
  290. package/src/lib/modules/server/ws/server.ts +1 -1
  291. package/src/lib/modules/server/ws/session-handler.ts +20 -86
  292. package/src/lib/modules/server/ws/terminal-handler.ts +28 -51
  293. package/src/lib/modules/server/ws/ticket-store.ts +1 -1
  294. package/src/lib/modules/shared/providers.ts +21 -0
  295. package/src/lib/types/activity.ts +18 -0
  296. package/src/lib/types/apn.ts +43 -0
  297. package/src/lib/types/cli.ts +39 -0
  298. package/src/lib/types/common.ts +39 -0
  299. package/src/lib/types/dashboard.ts +4 -0
  300. package/src/lib/types/generated/Client.ts +1656 -0
  301. package/src/{generated/types → lib/types/generated}/WsProtocol.ts +344 -2
  302. package/src/lib/types/index.ts +28 -0
  303. package/src/lib/types/neurolink.ts +4 -0
  304. package/src/lib/types/server.ts +93 -0
  305. package/src/lib/types/sessions.ts +59 -0
  306. package/src/lib/types/terminal-client.ts +132 -0
  307. package/src/lib/types/ws.ts +161 -0
  308. package/src/routes/+error.svelte +7 -2
  309. package/src/routes/+layout.server.ts +9 -0
  310. package/src/routes/+layout.svelte +36 -7
  311. package/src/routes/+page.server.ts +7 -0
  312. package/src/routes/+page.svelte +85 -35
  313. package/src/routes/activity/+page.server.ts +7 -0
  314. package/src/routes/activity/+page.svelte +58 -0
  315. package/src/routes/api/health/+server.ts +32 -19
  316. package/src/routes/api/neurolink-proxy/+server.ts +136 -0
  317. package/src/routes/api/notify/+server.ts +190 -87
  318. package/src/routes/api/sessions/+server.ts +1 -1
  319. package/src/routes/api/sessions/connect/+server.ts +10 -6
  320. package/src/routes/api/terminals/+server.ts +20 -1
  321. package/src/routes/api/terminals/[id]/+server.ts +16 -2
  322. package/src/routes/api/webhook/+server.ts +5 -33
  323. package/src/routes/api/ws-ticket/+server.ts +4 -4
  324. package/src/routes/config/+page.server.ts +9 -0
  325. package/src/routes/config/+page.svelte +118 -25
  326. package/src/routes/neurolink/+page.server.ts +10 -0
  327. package/src/routes/neurolink/+page.svelte +331 -0
  328. package/src/routes/project/+page.svelte +17 -12
  329. package/src/routes/session/[id]/+page.svelte +146 -62
  330. package/src/routes/terminals/+page.svelte +2 -2
  331. package/src/routes/terminals/[id]/+page.svelte +99 -88
  332. package/svelte.config.js +1 -3
  333. package/tsconfig.json +1 -0
  334. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +0 -1
  335. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +0 -1
  336. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
  337. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
  338. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
  339. package/build/client/_app/immutable/chunks/B5NAKyil.js +0 -20
  340. package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/B8XegpSE.js +0 -1
  343. package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/B8zoBsv3.js +0 -6
  346. package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
  347. package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
  348. package/build/client/_app/immutable/chunks/BIaXC2t9.js +0 -1
  349. package/build/client/_app/immutable/chunks/BIaXC2t9.js.br +0 -0
  350. package/build/client/_app/immutable/chunks/BIaXC2t9.js.gz +0 -0
  351. package/build/client/_app/immutable/chunks/BOYo8yTr.js +0 -1
  352. package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
  353. package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
  354. package/build/client/_app/immutable/chunks/Bu1aqm5j.js +0 -1
  355. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
  356. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
  357. package/build/client/_app/immutable/chunks/CQjSATpv.js +0 -61
  358. package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
  359. package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
  360. package/build/client/_app/immutable/chunks/CRbaG9cv.js.br +0 -0
  361. package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
  362. package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
  363. package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/CiF38mQq.js.br +0 -0
  366. package/build/client/_app/immutable/chunks/CiF38mQq.js.gz +0 -0
  367. package/build/client/_app/immutable/chunks/DSU1n5N_.js +0 -1
  368. package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
  370. package/build/client/_app/immutable/chunks/DVkn4r72.js +0 -1
  371. package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
  372. package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
  373. package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
  374. package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
  375. package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
  376. package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
  377. package/build/client/_app/immutable/chunks/r0JawsZc.js +0 -2
  378. package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
  379. package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
  380. package/build/client/_app/immutable/entry/app.CU7KVZja.js +0 -2
  381. package/build/client/_app/immutable/entry/app.CU7KVZja.js.br +0 -0
  382. package/build/client/_app/immutable/entry/app.CU7KVZja.js.gz +0 -0
  383. package/build/client/_app/immutable/entry/start.RAMZY19t.js +0 -1
  384. package/build/client/_app/immutable/entry/start.RAMZY19t.js.br +0 -2
  385. package/build/client/_app/immutable/entry/start.RAMZY19t.js.gz +0 -0
  386. package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js +0 -1
  387. package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js.br +0 -0
  388. package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js.gz +0 -0
  389. package/build/client/_app/immutable/nodes/1.DTmfBFmm.js +0 -1
  390. package/build/client/_app/immutable/nodes/1.DTmfBFmm.js.br +0 -0
  391. package/build/client/_app/immutable/nodes/1.DTmfBFmm.js.gz +0 -0
  392. package/build/client/_app/immutable/nodes/2.Cm269yzt.js +0 -1
  393. package/build/client/_app/immutable/nodes/2.Cm269yzt.js.br +0 -0
  394. package/build/client/_app/immutable/nodes/2.Cm269yzt.js.gz +0 -0
  395. package/build/client/_app/immutable/nodes/3.3yohCM25.js +0 -3
  396. package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
  397. package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
  398. package/build/client/_app/immutable/nodes/4.C25c5hMg.js +0 -1
  399. package/build/client/_app/immutable/nodes/4.C25c5hMg.js.br +0 -0
  400. package/build/client/_app/immutable/nodes/4.C25c5hMg.js.gz +0 -0
  401. package/build/client/_app/immutable/nodes/5.DIkXVP4q.js.br +0 -0
  402. package/build/client/_app/immutable/nodes/5.DIkXVP4q.js.gz +0 -0
  403. package/build/client/_app/immutable/nodes/6.BPL-HzUX.js +0 -2
  404. package/build/client/_app/immutable/nodes/6.BPL-HzUX.js.br +0 -0
  405. package/build/client/_app/immutable/nodes/6.BPL-HzUX.js.gz +0 -0
  406. package/build/client/_app/immutable/nodes/7.IgEqce53.js +0 -2
  407. package/build/client/_app/immutable/nodes/7.IgEqce53.js.br +0 -0
  408. package/build/client/_app/immutable/nodes/7.IgEqce53.js.gz +0 -0
  409. package/build/server/chunks/0-DiORznXb.js +0 -9
  410. package/build/server/chunks/0-DiORznXb.js.map +0 -1
  411. package/build/server/chunks/1-D0N7vVhH.js +0 -9
  412. package/build/server/chunks/2-DfSav7a7.js +0 -9
  413. package/build/server/chunks/2-DfSav7a7.js.map +0 -1
  414. package/build/server/chunks/3-Ck7ewhOX.js +0 -9
  415. package/build/server/chunks/3-Ck7ewhOX.js.map +0 -1
  416. package/build/server/chunks/4-DV5MZUz_.js +0 -9
  417. package/build/server/chunks/4-DV5MZUz_.js.map +0 -1
  418. package/build/server/chunks/5-DJhoAjb0.js +0 -9
  419. package/build/server/chunks/5-DJhoAjb0.js.map +0 -1
  420. package/build/server/chunks/6-Cp8CzYbr.js +0 -9
  421. package/build/server/chunks/6-Cp8CzYbr.js.map +0 -1
  422. package/build/server/chunks/7-BA4xzUj3.js +0 -9
  423. package/build/server/chunks/7-BA4xzUj3.js.map +0 -1
  424. package/build/server/chunks/Button-Cs1aE6ka.js.map +0 -1
  425. package/build/server/chunks/Icon-CEUrotA6.js.map +0 -1
  426. package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +0 -1
  427. package/build/server/chunks/_page.svelte-BdYynOck.js +0 -85
  428. package/build/server/chunks/_page.svelte-BdYynOck.js.map +0 -1
  429. package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +0 -1
  430. package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +0 -1
  431. package/build/server/chunks/_server.ts-BStnNIcq.js +0 -34
  432. package/build/server/chunks/_server.ts-BStnNIcq.js.map +0 -1
  433. package/build/server/chunks/_server.ts-CAxsWKvS.js.map +0 -1
  434. package/build/server/chunks/_server.ts-COu0vNpd.js.map +0 -1
  435. package/build/server/chunks/_server.ts-CTpcLUH8.js.map +0 -1
  436. package/build/server/chunks/_server.ts-Cf84YIaW.js +0 -25
  437. package/build/server/chunks/_server.ts-Cf84YIaW.js.map +0 -1
  438. package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +0 -1
  439. package/build/server/chunks/_server.ts-CtH0dhUp.js +0 -71
  440. package/build/server/chunks/_server.ts-CtH0dhUp.js.map +0 -1
  441. package/build/server/chunks/_server.ts-DB_Kg97c.js.map +0 -1
  442. package/build/server/chunks/_server.ts-DYpJImqd.js.map +0 -1
  443. package/build/server/chunks/_server.ts-Deok2y88.js.map +0 -1
  444. package/build/server/chunks/_server.ts-tSpgyl1D.js.map +0 -1
  445. package/build/server/chunks/_server.ts-vekTmWAx.js.map +0 -1
  446. package/build/server/chunks/client2-CCBGA-2V.js +0 -7
  447. package/build/server/chunks/index-server-CrDaL06Y.js.map +0 -1
  448. package/build/server/chunks/index2-CgclKpUj.js.map +0 -1
  449. package/build/server/chunks/library-apns-BqJbvSKh.js.map +0 -1
  450. package/build/server/chunks/pty-manager-BQVB7IVj.js.map +0 -1
  451. package/build/server/chunks/root-DDSnEAZv.js.map +0 -1
  452. package/build/server/chunks/shared-server-sSGG17Df.js.map +0 -1
  453. package/build/server/chunks/state.svelte-hBbXlUak.js.map +0 -1
  454. package/src/generated/types/Client.ts +0 -589
  455. package/src/lib/types/config.ts +0 -1
  456. /package/build/client/_app/immutable/assets/{4.BFUut--w.css → 6.BFUut--w.css} +0 -0
  457. /package/build/client/_app/immutable/assets/{4.BFUut--w.css.br → 6.BFUut--w.css.br} +0 -0
  458. /package/build/client/_app/immutable/assets/{4.BFUut--w.css.gz → 6.BFUut--w.css.gz} +0 -0
  459. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css → 7.BTOx7yt7.css} +0 -0
  460. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.br → 7.BTOx7yt7.css.br} +0 -0
  461. /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.gz → 7.BTOx7yt7.css.gz} +0 -0
  462. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css → 8.eZGZN-BF.css} +0 -0
  463. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.br → 8.eZGZN-BF.css.br} +0 -0
  464. /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.gz → 8.eZGZN-BF.css.gz} +0 -0
  465. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css → 9.DwS5ZHBh.css} +0 -0
  466. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.br → 9.DwS5ZHBh.css.br} +0 -0
  467. /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.gz → 9.DwS5ZHBh.css.gz} +0 -0
  468. /package/src/{generated/types → lib/types/generated}/API.ts +0 -0
  469. /package/src/{generated/types → lib/types/generated}/APN.ts +0 -0
  470. /package/src/{generated/types → lib/types/generated}/CLI.ts +0 -0
  471. /package/src/{generated/types → lib/types/generated}/Config.ts +0 -0
  472. /package/src/{generated/types → lib/types/generated}/Holder.ts +0 -0
  473. /package/src/{generated/types → lib/types/generated}/JWT.ts +0 -0
  474. /package/src/{generated/types → lib/types/generated}/Notification.ts +0 -0
  475. /package/src/{generated/types → lib/types/generated}/OpenCode.ts +0 -0
  476. /package/src/{generated/types → lib/types/generated}/Sessions.ts +0 -0
  477. /package/src/{generated/types → lib/types/generated}/Terminal.ts +0 -0
  478. /package/src/{generated/types → lib/types/generated}/index.ts +0 -0
@@ -0,0 +1,161 @@
1
+ // WebSocket module types — extracted from ws/ handler files.
2
+ // All WebSocket-related type/interface definitions live here.
3
+ //
4
+ // Names use a "Wire" prefix where they collide with generated types
5
+ // in WsProtocol.ts (which use class-wrapper discriminated unions).
6
+ // These "Wire" types are the simple literal unions used at runtime.
7
+
8
+ import type { WebSocket } from 'ws';
9
+
10
+ import type {
11
+ MessageRole,
12
+ NotificationSession,
13
+ PermissionDecision,
14
+ SessionSource,
15
+ TerminalSignal,
16
+ TextContentBlock,
17
+ } from './generated';
18
+ import type { ConversationMessage } from './sessions';
19
+
20
+ // ── events-handler types ────────────────────────────────────────────
21
+
22
+ export interface PendingPong {
23
+ onClose: () => void;
24
+ onPong: () => void;
25
+ timer: ReturnType<typeof setTimeout>;
26
+ }
27
+
28
+ // ── keepalive types ─────────────────────────────────────────────────
29
+
30
+ export type Session = NotificationSession;
31
+
32
+ // ── session-handler types ───────────────────────────────────────────
33
+
34
+ export interface SessionManagedTerminal {
35
+ id: string;
36
+ openCodeSessionId: null | string;
37
+ pty: {
38
+ pid: number;
39
+ write: (data: string) => void;
40
+ };
41
+ sessionFile: null | string;
42
+ status: 'exited' | 'running';
43
+ }
44
+
45
+ /** Extended PTY manager interface with list() for UUID-based terminal search. */
46
+ export interface SessionPtyManagerFullLike extends SessionPtyManagerLike {
47
+ list: () => SessionManagedTerminal[];
48
+ }
49
+
50
+ export interface SessionPtyManagerLike {
51
+ getTerminal: (id: string) => SessionManagedTerminal | undefined;
52
+ }
53
+
54
+ export interface SessionWatcherLike {
55
+ getHistory: (sessionFile: string) => ConversationMessage[];
56
+ subscribe: (
57
+ sessionFile: string,
58
+ callback: (messages: ConversationMessage[]) => void
59
+ ) => () => void;
60
+ }
61
+
62
+ export interface TerminalManagedTerminal {
63
+ clients: Set<WebSocket>;
64
+ exitCode: null | number;
65
+ id: string;
66
+ pty: {
67
+ kill: (signal: string) => void;
68
+ pid: number;
69
+ resize: (cols: number, rows: number) => void;
70
+ write: (data: string) => void;
71
+ };
72
+ status: 'exited' | 'running';
73
+ }
74
+
75
+ export interface TerminalPtyManagerLike {
76
+ attach: (id: string, ws: WebSocket) => boolean;
77
+ detach: (id: string, ws: WebSocket) => boolean;
78
+ getTerminal: (id: string) => TerminalManagedTerminal | undefined;
79
+ }
80
+
81
+ /** A message in the history payload. */
82
+ export interface WireHistoryMessage {
83
+ content: WireHistoryPart[];
84
+ id: string;
85
+ role: MessageRole;
86
+ timestamp: string;
87
+ }
88
+
89
+ /** A single part within a history message — discriminated union. */
90
+ export type WireHistoryPart =
91
+ | { content: string; type: 'text' }
92
+ | { content: string; type: 'thinking' }
93
+ | { id: string; input: Record<string, unknown>; toolName: string; type: 'tool_use' }
94
+ | { isError: boolean; output: string; toolUseId: string; type: 'tool_result' };
95
+
96
+ /** Inbound messages from the client (session channel). */
97
+ export type WireSessionClientMessage =
98
+ | { sessionId: string; type: 'subscribe' }
99
+ | { text: string; type: 'send-input' }
100
+ | { type: 'cancel' };
101
+
102
+ // ── terminal-handler types ──────────────────────────────────────────
103
+
104
+ /** Outbound messages to the client (session channel). */
105
+ export type WireSessionServerMessage =
106
+ | { content: TextContentBlock[]; role: MessageRole; timestamp: string; type: 'message' }
107
+ | {
108
+ id: string;
109
+ input: Record<string, unknown>;
110
+ name: string;
111
+ status: 'running';
112
+ type: 'tool-use';
113
+ }
114
+ | { id: string; isError: boolean; output: string; status: 'done'; type: 'tool-result' }
115
+ | { message: string; type: 'error' }
116
+ | { messages: WireHistoryMessage[]; type: 'history' }
117
+ | { text: string; type: 'thinking' }
118
+ | { type: 'session-end' };
119
+
120
+ export type WireShooterEvent =
121
+ | { code: null | number; terminalId: string; type: 'terminal-exited' }
122
+ | { command: string; terminalId: string; type: 'terminal-created' }
123
+ | { command?: string; filePath?: string; terminalId?: string; tool: string; type: 'tool-started' }
124
+ | { decision: PermissionDecision; requestId: string; type: 'permission-resolved' }
125
+ | { error: string; terminalId?: string; tool: string; type: 'tool-failed' }
126
+ | {
127
+ input: Record<string, unknown>;
128
+ requestId: string;
129
+ tool: string;
130
+ type: 'permission-requested';
131
+ }
132
+ | { message: string; sessionId?: string; terminalId?: string; type: 'agent-question' }
133
+ | { message?: string; sessionId?: string; terminalId?: string; type: 'agent-idle' }
134
+ | { project: string; sessionId: string; source: SessionSource; type: 'session-started' }
135
+ | { sessionId: string; summary: string; type: 'session-ended' }
136
+ | { success: boolean; terminalId?: string; tool: string; type: 'tool-completed' };
137
+
138
+ /** Inbound messages from the client (terminal channel). */
139
+ export type WireTerminalClientMessage =
140
+ | { cols: number; rows: number; type: 'resize' }
141
+ | { data: string; type: 'input' }
142
+ | { signal: TerminalSignal; type: 'signal' };
143
+
144
+ /** Outbound messages to the client (terminal channel). */
145
+ export type WireTerminalServerMessage =
146
+ | { bytes: number; type: 'output-dropped' }
147
+ | { chunk: number; data: string; total: number; type: 'scrollback' }
148
+ | { code: null | number; signal: null | string; type: 'exit' }
149
+ | { data: string; type: 'output' }
150
+ | { message: string; type: 'error' };
151
+
152
+ // ── notification-sessions type alias ────────────────────────────────
153
+
154
+ /** Per-connection state tracked for cleanup. */
155
+ export interface WsConnectionState {
156
+ /** True when the session is file-only (no terminal backing it). */
157
+ isExternalSession: boolean;
158
+ retryInterval: null | ReturnType<typeof setInterval>;
159
+ terminalId: string;
160
+ unsubscribe: (() => void) | null;
161
+ }
@@ -27,8 +27,13 @@
27
27
  {/if}
28
28
  </p>
29
29
  <div class="error-actions">
30
- <button class="error-btn" onclick={() => goto('/')}>Go Home</button>
31
- <button class="error-btn error-btn-secondary" onclick={() => { history.back(); }}>Go Back</button>
30
+ <button class="error-btn" onclick={(): void => void goto('/')}>Go Home</button>
31
+ <button
32
+ class="error-btn error-btn-secondary"
33
+ onclick={(): void => {
34
+ history.back();
35
+ }}>Go Back</button
36
+ >
32
37
  </div>
33
38
  </div>
34
39
  </main>
@@ -0,0 +1,9 @@
1
+ import { env } from '$env/dynamic/private';
2
+ import { getProviderAvailability } from '$lib/modules/shared/providers';
3
+
4
+ import type { LayoutServerLoad } from './$types';
5
+
6
+ export const load: LayoutServerLoad = () => ({
7
+ aiProviders: getProviderAvailability(env),
8
+ neurolinkProvider: env.NEUROLINK_PROVIDER ?? '',
9
+ });
@@ -1,12 +1,29 @@
1
1
  <script lang="ts">
2
+ import type { LayoutData } from '$lib/types';
3
+
2
4
  import '../app.css';
3
5
  import '$lib/theme.css';
6
+ import { browser } from '$app/environment';
4
7
  import { goto } from '$app/navigation';
5
8
  import { page } from '$app/stores';
6
- import { StatusBadge } from '$lib/modules/client/common';
9
+ import { Icon, StatusBadge } from '$lib/modules/client/common';
7
10
  import { onMount, type Snippet } from 'svelte';
8
11
 
9
- const { children }: { children: Snippet } = $props();
12
+ const { children, data }: { children: Snippet; data: LayoutData } = $props();
13
+
14
+ // Expose AI provider flags for summarizers (they run outside SvelteKit's data flow)
15
+ $effect(() => {
16
+ if (!browser || !data?.aiProviders) {
17
+ return;
18
+ }
19
+ (window as unknown as Record<string, unknown>).__aiProviders = data.aiProviders;
20
+ if (data.neurolinkProvider) {
21
+ const proc = (window as unknown as { process?: { env?: Record<string, string> } }).process;
22
+ if (proc?.env) {
23
+ proc.env.NEUROLINK_PROVIDER = data.neurolinkProvider;
24
+ }
25
+ }
26
+ });
10
27
 
11
28
  let systemStatus = $state<'degraded' | 'error' | 'healthy' | 'unknown'>('unknown');
12
29
 
@@ -51,7 +68,9 @@
51
68
  <StatusBadge status={systemStatus} />
52
69
  <button
53
70
  class="btn-gear {$page.url.pathname === '/config' ? 'btn-gear-active' : ''}"
54
- onclick={() => goto('/config')}
71
+ onclick={(): void => {
72
+ void goto('/config');
73
+ }}
55
74
  aria-label="Settings"
56
75
  >
57
76
  <svg
@@ -79,7 +98,7 @@
79
98
  {@render children()}
80
99
  </div>
81
100
 
82
- <!-- Bottom tab bar: Projects + Terminals -->
101
+ <!-- Bottom tab bar: Dashboard + Activity + Terminals -->
83
102
  <nav class="bottom-tabs">
84
103
  <div class="bottom-tabs-inner">
85
104
  <a
@@ -97,10 +116,20 @@
97
116
  stroke-linecap="round"
98
117
  stroke-linejoin="round"
99
118
  >
100
- <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"
101
- ></path>
119
+ <rect x="3" y="3" width="7" height="7"></rect>
120
+ <rect x="14" y="3" width="7" height="7"></rect>
121
+ <rect x="3" y="14" width="7" height="7"></rect>
122
+ <rect x="14" y="14" width="7" height="7"></rect>
102
123
  </svg>
103
- <span>Projects</span>
124
+ <span>Dashboard</span>
125
+ </a>
126
+ <a
127
+ href="/activity"
128
+ class="tab-item"
129
+ class:active={$page.url.pathname.startsWith('/activity')}
130
+ >
131
+ <Icon name="bell" size={26} />
132
+ <span>Activity</span>
104
133
  </a>
105
134
  <a
106
135
  href="/terminals"
@@ -0,0 +1,7 @@
1
+ import { env } from '$env/dynamic/private';
2
+
3
+ import type { PageServerLoad } from './$types';
4
+
5
+ export const load: PageServerLoad = () => ({
6
+ googleAiConfigured: Boolean(env.GOOGLE_AI_API_KEY?.trim()),
7
+ });
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { ProjectGroup, ShooterConfig } from '$generated/types';
2
+ import type { DashboardCard, ProjectGroup, ShooterConfig } from '$lib/types';
3
3
 
4
4
  import { goto } from '$app/navigation';
5
5
  import {
@@ -11,6 +11,7 @@
11
11
  isShooterConfig,
12
12
  setCache,
13
13
  } from '$lib/modules/client/common';
14
+ import { connect, DashboardView, disconnect, getCards } from '$lib/modules/client/dashboard';
14
15
  import { Banner, Button, Pill, Shimmer } from '@juspay/svelte-ui-components';
15
16
  import { onDestroy, onMount } from 'svelte';
16
17
 
@@ -26,6 +27,8 @@
26
27
  let hasMore = $state(false);
27
28
  let currentOffset = $state(0);
28
29
 
30
+ const cards = $derived(getCards());
31
+
29
32
  onMount(() => {
30
33
  loadConfiguration();
31
34
 
@@ -51,6 +54,7 @@
51
54
  clearInterval(pollTimer);
52
55
  pollTimer = null;
53
56
  }
57
+ disconnect();
54
58
  });
55
59
 
56
60
  function loadConfiguration(): void {
@@ -60,6 +64,8 @@
60
64
  const parsed: unknown = JSON.parse(saved);
61
65
  if (isShooterConfig(parsed)) {
62
66
  config = parsed;
67
+ // Connect dashboard store with API key
68
+ void connect(config.apiKey);
63
69
  } else {
64
70
  localStorage.removeItem('shooter_config');
65
71
  config = null;
@@ -97,7 +103,7 @@
97
103
  }
98
104
 
99
105
  fetchError = null;
100
- const result: { projects: ProjectGroup[]; total?: number } = await response.json();
106
+ const result = (await response.json()) as { projects: ProjectGroup[]; total?: number };
101
107
  if (append) {
102
108
  projects = [...projects, ...result.projects];
103
109
  } else {
@@ -129,22 +135,26 @@
129
135
  void goto('/config');
130
136
  }
131
137
 
138
+ function navigateToTerminal(terminalId: string): void {
139
+ void goto(`/terminals/${terminalId}`);
140
+ }
141
+
132
142
  function totalSessionCount(): number {
133
143
  return projects.reduce((sum, p) => sum + p.sessionCount, 0);
134
144
  }
135
145
  </script>
136
146
 
137
147
  <svelte:head>
138
- <title>Projects - Shooter</title>
139
- <meta name="description" content="Claude Code sessions across all projects" />
148
+ <title>Dashboard - Shooter</title>
149
+ <meta name="description" content="Active terminals and Claude Code sessions" />
140
150
  </svelte:head>
141
151
 
142
152
  <main class="main">
143
153
  <div class="page-header">
144
154
  <div class="page-header-content">
145
155
  <div>
146
- <h1 class="page-title">Projects</h1>
147
- <p class="page-description">Claude Code sessions across all projects</p>
156
+ <h1 class="page-title">Dashboard</h1>
157
+ <p class="page-description">Active terminals and Claude Code sessions</p>
148
158
  </div>
149
159
  <div class="page-actions">
150
160
  <Button classes="btn-secondary" onclick={forceRefresh} disabled={loading}>
@@ -159,9 +169,9 @@
159
169
  <Banner text={fetchError} classes="banner-error" />
160
170
  {/if}
161
171
 
162
- {#if loading && projects.length === 0}
172
+ {#if loading && projects.length === 0 && cards.length === 0}
163
173
  <div class="loading-container">
164
- {#each Array(5) as _, i (i)}
174
+ {#each Array(3) as _, i (i)}
165
175
  <Shimmer classes="shimmer-card" />
166
176
  {/each}
167
177
  </div>
@@ -173,36 +183,63 @@
173
183
  >
174
184
  <Button classes="btn-primary" onclick={navigateToConfig} text="Configure Settings" />
175
185
  </EmptyState>
176
- {:else if totalSessionCount() === 0}
177
- <EmptyState
178
- icon="bell"
179
- title="No sessions yet"
180
- description="Claude Code sessions will appear here once JSONL files are found"
181
- />
182
186
  {:else}
183
- <div class="projects-container">
184
- {#each projects as project (project.id)}
185
- <a href="/project?id={project.id}" class="session-card">
186
- <div class="session-card-header">
187
- <div>
188
- <h3 class="session-card-title">{project.name}</h3>
189
- <div class="session-card-subtitle">{project.fullPath}</div>
187
+ <!-- Dashboard section: active terminal sessions -->
188
+ {#if cards.length > 0}
189
+ <div class="dashboard-section">
190
+ <DashboardView
191
+ {cards}
192
+ onCardClick={(card: DashboardCard): void => {
193
+ navigateToTerminal(card.terminalId);
194
+ }}
195
+ />
196
+ </div>
197
+ {/if}
198
+
199
+ <!-- Sessions archive below dashboard -->
200
+ {#if loading && projects.length === 0}
201
+ <div class="loading-container">
202
+ {#each Array(3) as _, i (i)}
203
+ <Shimmer classes="shimmer-card" />
204
+ {/each}
205
+ </div>
206
+ {:else if totalSessionCount() === 0 && cards.length === 0}
207
+ <EmptyState
208
+ icon="bell"
209
+ title="No sessions yet"
210
+ description="Claude Code sessions will appear here once JSONL files are found"
211
+ />
212
+ {:else if projects.length > 0}
213
+ {#if cards.length > 0}
214
+ <h3 class="section-label">Sessions</h3>
215
+ {/if}
216
+ <div class="projects-container">
217
+ {#each projects as project (project.id)}
218
+ <a href="/project?id={project.id}" class="session-card">
219
+ <div class="session-card-header">
220
+ <div>
221
+ <h3 class="session-card-title">{project.name}</h3>
222
+ <div class="session-card-subtitle">{project.fullPath}</div>
223
+ </div>
224
+ <Pill
225
+ text="Last updated {formatRelativeTime(project.lastModified)}"
226
+ classes="pill-session-time"
227
+ />
190
228
  </div>
191
- <Pill text="Last updated {formatRelativeTime(project.lastModified)}" classes="pill-session-time" />
192
- </div>
193
- <div class="session-stats">
194
- <span
195
- ><strong>{project.sessionCount}</strong>
196
- {project.sessionCount === 1 ? 'session' : 'sessions'}</span
197
- >
198
- </div>
199
- </a>
200
- {/each}
201
- </div>
202
- {#if hasMore}
203
- <div style="text-align: center; padding: 1rem;">
204
- <Button classes="btn-secondary" onclick={loadMore} text="Load More" />
229
+ <div class="session-stats">
230
+ <span
231
+ ><strong>{project.sessionCount}</strong>
232
+ {project.sessionCount === 1 ? 'session' : 'sessions'}</span
233
+ >
234
+ </div>
235
+ </a>
236
+ {/each}
205
237
  </div>
238
+ {#if hasMore}
239
+ <div style="text-align: center; padding: 1rem;">
240
+ <Button classes="btn-secondary" onclick={loadMore} text="Load More" />
241
+ </div>
242
+ {/if}
206
243
  {/if}
207
244
  {/if}
208
245
  </main>
@@ -238,6 +275,19 @@
238
275
  flex-shrink: 0;
239
276
  }
240
277
 
278
+ .dashboard-section {
279
+ margin-bottom: var(--space-6);
280
+ }
281
+
282
+ .section-label {
283
+ font-size: var(--text-xs, 12px);
284
+ font-weight: 600;
285
+ letter-spacing: 0.08em;
286
+ text-transform: uppercase;
287
+ color: var(--text-secondary);
288
+ margin-bottom: var(--space-3);
289
+ }
290
+
241
291
  .projects-container {
242
292
  display: flex;
243
293
  flex-direction: column;
@@ -0,0 +1,7 @@
1
+ import { env } from '$env/dynamic/private';
2
+
3
+ import type { PageServerLoad } from './$types';
4
+
5
+ export const load: PageServerLoad = () => ({
6
+ googleAiConfigured: Boolean(env.GOOGLE_AI_API_KEY?.trim()),
7
+ });
@@ -0,0 +1,58 @@
1
+ <script lang="ts">
2
+ import { browser } from '$app/environment';
3
+ import { goto } from '$app/navigation';
4
+ import { ActivityFeed } from '$lib/modules/client/activity';
5
+ import { isShooterConfig } from '$lib/modules/client/common';
6
+ import { onMount } from 'svelte';
7
+
8
+ let configured = $state(false);
9
+
10
+ onMount(() => {
11
+ if (!browser) {
12
+ return;
13
+ }
14
+
15
+ // Check config exists
16
+ try {
17
+ const saved = localStorage.getItem('shooter_config');
18
+ if (!saved) {
19
+ void goto('/config');
20
+ return;
21
+ }
22
+ const parsed: unknown = JSON.parse(saved);
23
+ if (!isShooterConfig(parsed)) {
24
+ localStorage.removeItem('shooter_config');
25
+ void goto('/config');
26
+ return;
27
+ }
28
+ configured = true;
29
+ } catch {
30
+ // Malformed config in storage — clear it before redirecting so
31
+ // revisits don't keep bouncing back to /config with stale state.
32
+ localStorage.removeItem('shooter_config');
33
+ void goto('/config');
34
+ }
35
+ });
36
+ </script>
37
+
38
+ <svelte:head>
39
+ <title>Activity Feed - Shooter</title>
40
+ <meta name="description" content="Real-time activity feed" />
41
+ </svelte:head>
42
+
43
+ <main class="main">
44
+ <h1 class="page-title">Activity Feed</h1>
45
+ {#if configured}
46
+ <ActivityFeed />
47
+ {/if}
48
+ </main>
49
+
50
+ <style>
51
+ .page-title {
52
+ font-size: var(--text-2xl);
53
+ font-weight: 600;
54
+ letter-spacing: -0.03em;
55
+ color: var(--text-primary);
56
+ margin-bottom: var(--space-4);
57
+ }
58
+ </style>
@@ -1,22 +1,20 @@
1
- import type {
2
- FCMConfiguration,
3
- HealthChecks,
4
- HealthConfiguration,
5
- HealthStatus,
6
- } from '$generated/types';
1
+ import type { FCMConfiguration, HealthChecks, HealthConfiguration, HealthStatus } from '$lib/types';
7
2
 
8
3
  import { env } from '$env/dynamic/private';
9
4
  import { validateAuth } from '$lib/modules/server/auth';
5
+ import { getProviderAvailability } from '$lib/modules/shared/providers';
10
6
  import { json } from '@sveltejs/kit';
11
7
  import { readFileSync } from 'fs';
12
8
  import { join } from 'path';
13
9
 
14
10
  import type { RequestHandler } from './$types';
15
11
 
16
- const PKG_VERSION: string = (() => {
12
+ const PKG_VERSION: string = ((): string => {
17
13
  const root = process.env.SHOOTER_PKG_ROOT || process.cwd();
18
14
  try {
19
- const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8')) as { version?: string };
15
+ const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8')) as {
16
+ version?: string;
17
+ };
20
18
  return pkg.version || 'unknown';
21
19
  } catch {
22
20
  return 'unknown';
@@ -76,19 +74,26 @@ export const GET: RequestHandler = ({ request, url }) => {
76
74
  warnings.push('FCM not configured — Android push notifications disabled');
77
75
  }
78
76
 
79
- const health: {
80
- checks: HealthChecks;
81
- configuration: HealthConfiguration;
82
- environment: string;
83
- status: HealthStatus;
84
- timestamp: string;
85
- version: string;
86
- warnings: string[];
87
- } = {
77
+ // AI provider checks
78
+ const aiProviders = getProviderAvailability(env);
79
+ const hasAnyAiProvider = Object.values(aiProviders).some(Boolean);
80
+
81
+ if (!hasAnyAiProvider) {
82
+ warnings.push(
83
+ 'No AI provider configured — AI summaries disabled. Run "shooter setup" to configure.'
84
+ );
85
+ }
86
+
87
+ const health = {
88
+ ai: {
89
+ activeProvider: env.NEUROLINK_PROVIDER ?? 'auto',
90
+ hasAnyProvider: hasAnyAiProvider,
91
+ providers: aiProviders,
92
+ },
88
93
  checks,
89
94
  configuration,
90
95
  environment: env.NODE_ENV || 'development',
91
- status: 'healthy',
96
+ status: 'healthy' as HealthStatus,
92
97
  timestamp: new Date().toISOString(),
93
98
  version: PKG_VERSION,
94
99
  warnings,
@@ -101,7 +106,15 @@ export const GET: RequestHandler = ({ request, url }) => {
101
106
 
102
107
  // Public response: status + warnings. Authenticated: full details.
103
108
  if (!wantsDetails) {
104
- return json({ status: health.status, timestamp: health.timestamp, version: health.version, warnings: health.warnings });
109
+ // Filter AI provider configuration warnings from the unauthenticated
110
+ // response so we don't leak system capability details to anonymous callers.
111
+ const publicWarnings = health.warnings.filter((w) => !w.includes('AI provider'));
112
+ return json({
113
+ status: health.status,
114
+ timestamp: health.timestamp,
115
+ version: health.version,
116
+ warnings: publicWarnings,
117
+ });
105
118
  }
106
119
 
107
120
  return json(health);