@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,205 @@
1
+ // Session summarizer for the live dashboard.
2
+ // Loads NeuroLink SDK from CDN and runs AI summarization client-side in the browser.
3
+ // Uses NeuroLink's createGoogleGenerativeAI + generateText bridge (AI SDK-compatible).
4
+ // The GOOGLE_AI_API_KEY is injected into window.process.env by +page.svelte before use.
5
+
6
+ // ── Types ────────────────────────────────────────────────────────────────────
7
+
8
+ import type { SummaryContext, SummaryResult } from '$lib/types';
9
+
10
+ import { installFetchProxy } from '$lib/modules/client/neurolink/fetch-proxy';
11
+ import { detectActiveProvider } from '$lib/modules/client/neurolink/provider-config';
12
+
13
+ // ── CDN loading ───────────────────────────────────────────────────────────────
14
+
15
+ const NEUROLINK_CDN_URL = 'https://unpkg.com/@juspay/neurolink/dist/browser/neurolink.min.js';
16
+
17
+ // Significant event types that trigger conversational tone
18
+ const SIGNIFICANT_EVENT_TYPES = new Set(['agent-question', 'terminal-exited', 'tool-failed']);
19
+
20
+ // Singleton SDK promise — load once, reuse across all summarizer instances
21
+ let sdkPromise: null | Promise<unknown> = null;
22
+
23
+ // Cached NeuroLink instance
24
+ let cachedNL: unknown = null;
25
+ let cachedProvider: null | { model: string; provider: string } = null;
26
+
27
+ export class SessionSummarizer {
28
+ /** Generate a summary for the given session context using NeuroLink client-side. */
29
+ async summarize(context: SummaryContext): Promise<SummaryResult> {
30
+ const tone = this.chooseTone(context);
31
+ const prompt =
32
+ tone === 'conversational'
33
+ ? this.buildConversationalPrompt(context)
34
+ : this.buildStatusReportPrompt(context);
35
+
36
+ try {
37
+ const nl = await getNeuroLink();
38
+
39
+ if (!nl) {
40
+ console.log('[SessionSummarizer] NeuroLink not available, using fallback.');
41
+ return { generatedAt: new Date().toISOString(), text: this.fallbackText(context), tone };
42
+ }
43
+
44
+ const result = await (
45
+ nl as Record<string, (opts: Record<string, unknown>) => Promise<{ content?: string }>>
46
+ ).generate({
47
+ input: { text: prompt },
48
+ ...(cachedProvider
49
+ ? { model: cachedProvider.model, provider: cachedProvider.provider }
50
+ : {}),
51
+ });
52
+ const text = str(result.content ?? '').trim() || this.fallbackText(context);
53
+ return { generatedAt: new Date().toISOString(), text, tone };
54
+ } catch (err) {
55
+ console.warn(
56
+ '[SessionSummarizer] summarize failed:',
57
+ err instanceof Error ? err.message : String(err)
58
+ );
59
+ return { generatedAt: new Date().toISOString(), text: this.fallbackText(context), tone };
60
+ }
61
+ }
62
+
63
+ /** Build the conversational prompt. */
64
+ private buildConversationalPrompt(context: SummaryContext): string {
65
+ const goal = context.goal ?? 'unknown';
66
+ const events = context.recentEvents
67
+ .map((e) => {
68
+ const parts: string[] = [e.type];
69
+ if (e.tool) {
70
+ parts.push(`tool=${e.tool}`);
71
+ }
72
+ if (e.error) {
73
+ parts.push(`error=${e.error}`);
74
+ }
75
+ if (e.command) {
76
+ parts.push(`command=${e.command}`);
77
+ }
78
+ return parts.join(' ');
79
+ })
80
+ .join(', ');
81
+
82
+ return `You are monitoring a coding session. Based on the context below, write ONE sentence (max 100 chars) describing what's happening in plain English. Be specific about what Claude did or is doing.
83
+
84
+ Goal: ${goal}
85
+ Recent events: ${events}
86
+ Conversation excerpt: ${context.conversationExcerpt}
87
+ Status: ${context.status}
88
+
89
+ One sentence only, no quotes, no markdown.`;
90
+ }
91
+
92
+ /** Build the status-report prompt. */
93
+ private buildStatusReportPrompt(context: SummaryContext): string {
94
+ const toolNames = context.recentEvents.flatMap((e) => (e.tool ? [e.tool] : [])).join(', ');
95
+
96
+ return `You are monitoring a coding session. Write a brief status update (max 60 chars) in the format "Doing X, Y done". Focus on the action.
97
+
98
+ Recent tool calls: ${toolNames || 'none'}
99
+ Status: ${context.status}
100
+
101
+ Short phrase only, no quotes.`;
102
+ }
103
+
104
+ /** Choose tone based on event severity. */
105
+ private chooseTone(context: SummaryContext): 'conversational' | 'status-report' {
106
+ if (context.status === 'error' || context.errorCount > 0) {
107
+ return 'conversational';
108
+ }
109
+ const hasSignificantEvent = context.recentEvents.some((e) =>
110
+ SIGNIFICANT_EVENT_TYPES.has(e.type)
111
+ );
112
+ if (hasSignificantEvent) {
113
+ return 'conversational';
114
+ }
115
+ return 'status-report';
116
+ }
117
+
118
+ /** Produce a simple fallback when NeuroLink is unavailable. */
119
+ private fallbackText(context: SummaryContext): string {
120
+ const tools = context.recentEvents.flatMap((e) => (e.tool ? [e.tool] : []));
121
+ const unique = [...new Set(tools)];
122
+ if (unique.length > 0) {
123
+ return `Running: ${unique.join(', ')} (${context.toolCallCount} tools)`;
124
+ }
125
+ return `Status: ${context.status} — ${context.toolCallCount} tool calls`;
126
+ }
127
+ }
128
+
129
+ // ── Private helpers ───────────────────────────────────────────────────────────
130
+
131
+ /** Get or create the NeuroLink instance with auto-detected provider. */
132
+ async function getNeuroLink(): Promise<unknown> {
133
+ if (cachedNL) {
134
+ return cachedNL;
135
+ }
136
+
137
+ installFetchProxy();
138
+
139
+ const NL = (await getSdk()) as Record<string, unknown>;
140
+ const NeuroLinkClass = NL.NeuroLink as
141
+ | (new (opts: Record<string, unknown>) => unknown)
142
+ | undefined;
143
+ if (!NeuroLinkClass) {
144
+ return null;
145
+ }
146
+
147
+ const serverFlags = (window as unknown as Record<string, Record<string, boolean>>).__aiProviders;
148
+ const preferredProvider = (
149
+ window as unknown as Record<string, Record<string, Record<string, string>>>
150
+ ).process?.env?.NEUROLINK_PROVIDER;
151
+
152
+ const active = detectActiveProvider(serverFlags, preferredProvider);
153
+ if (!active) {
154
+ console.warn('[SessionSummarizer] No AI provider configured');
155
+ return null;
156
+ }
157
+
158
+ // Proxy providers: inject dummy env vars so SDK validation passes.
159
+ // The fetch proxy strips these and injects real keys server-side.
160
+ const proc = (window as unknown as { process?: { env?: Record<string, string> } }).process;
161
+ if (proc?.env && serverFlags) {
162
+ if (serverFlags['google-ai'] && !proc.env.GOOGLE_AI_API_KEY) {
163
+ proc.env.GOOGLE_AI_API_KEY = 'proxy-via-server';
164
+ }
165
+ if (serverFlags.anthropic && !proc.env.ANTHROPIC_API_KEY) {
166
+ proc.env.ANTHROPIC_API_KEY = 'proxy-via-server';
167
+ }
168
+ if (serverFlags.openai && !proc.env.OPENAI_API_KEY) {
169
+ proc.env.OPENAI_API_KEY = 'proxy-via-server';
170
+ }
171
+ if (serverFlags.mistral && !proc.env.MISTRAL_API_KEY) {
172
+ proc.env.MISTRAL_API_KEY = 'proxy-via-server';
173
+ }
174
+ }
175
+
176
+ cachedNL = new NeuroLinkClass({ provider: active.provider });
177
+ cachedProvider = active;
178
+ console.log(`[SessionSummarizer] Using provider: ${active.provider}/${active.model}`);
179
+ return cachedNL;
180
+ }
181
+
182
+ function getSdk(): Promise<unknown> {
183
+ if (!sdkPromise) {
184
+ sdkPromise = import(/* @vite-ignore */ NEUROLINK_CDN_URL).catch((err: unknown) => {
185
+ console.warn('[SessionSummarizer] Failed to load NeuroLink SDK:', err);
186
+ // Reset so next call retries
187
+ sdkPromise = null;
188
+ throw err;
189
+ });
190
+ }
191
+ return sdkPromise;
192
+ }
193
+
194
+ // ── Utilities ────────────────────────────────────────────────────────────────
195
+
196
+ /** Safely coerce an unknown value to string, avoiding [object Object]. */
197
+ function str(v: unknown): string {
198
+ if (typeof v === 'string') {
199
+ return v;
200
+ }
201
+ if (typeof v === 'number' || typeof v === 'boolean') {
202
+ return String(v);
203
+ }
204
+ return '';
205
+ }
@@ -0,0 +1,70 @@
1
+ // Intercept fetch calls to CORS-restricted AI provider endpoints and route
2
+ // them through the SvelteKit server proxy at /api/neurolink-proxy.
3
+ // This is a browser-only workaround — in Node/Electron there's no CORS.
4
+
5
+ import { getApiKey } from '$lib/modules/client/common';
6
+
7
+ const PROXY_PREFIXES: Record<string, string> = {
8
+ 'https://api.anthropic.com/': 'anthropic',
9
+ 'https://api.mistral.ai/': 'mistral',
10
+ 'https://api.openai.com/': 'openai',
11
+ 'https://generativelanguage.googleapis.com/': 'google-ai',
12
+ };
13
+
14
+ let installed = false;
15
+
16
+ /** Install the fetch proxy. Safe to call multiple times — only installs once. */
17
+ export function installFetchProxy(): void {
18
+ if (installed || typeof globalThis === 'undefined') {
19
+ return;
20
+ }
21
+ installed = true;
22
+
23
+ const originalFetch = globalThis.fetch.bind(globalThis);
24
+
25
+ globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
26
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
27
+
28
+ const provider = Object.entries(PROXY_PREFIXES).find(([prefix]) => url.startsWith(prefix))?.[1];
29
+
30
+ if (!provider) {
31
+ return originalFetch(input, init);
32
+ }
33
+
34
+ // Strip provider auth headers — server re-injects from env
35
+ const headers: Record<string, string> = {};
36
+ const rawHeaders = init?.headers ?? (input instanceof Request ? input.headers : {});
37
+ const iterable =
38
+ rawHeaders instanceof Headers
39
+ ? rawHeaders
40
+ : Object.entries(rawHeaders as Record<string, string>);
41
+ for (const [k, v] of iterable) {
42
+ const lk = k.toLowerCase();
43
+ if (lk !== 'x-api-key' && lk !== 'authorization') {
44
+ headers[k] = v;
45
+ }
46
+ }
47
+
48
+ let body: unknown;
49
+ try {
50
+ body = JSON.parse(
51
+ (init?.body as string) ?? (input instanceof Request ? await input.text() : '{}')
52
+ );
53
+ } catch {
54
+ body = {};
55
+ }
56
+
57
+ // Authenticate with our own server using the Shooter API key
58
+ const apiKey = getApiKey();
59
+ const proxyHeaders: Record<string, string> = { 'Content-Type': 'application/json' };
60
+ if (apiKey) {
61
+ proxyHeaders.Authorization = `Bearer ${apiKey}`;
62
+ }
63
+
64
+ return originalFetch('/api/neurolink-proxy', {
65
+ body: JSON.stringify({ body, headers, provider, url }),
66
+ headers: proxyHeaders,
67
+ method: 'POST',
68
+ });
69
+ };
70
+ }
@@ -0,0 +1,111 @@
1
+ // Provider registry — single source of truth for all NeuroLink providers.
2
+ // Used by summarizers, settings page, setup wizard, and playground.
3
+
4
+ import type { ProviderId } from '$lib/types';
5
+
6
+ export const PROVIDERS = [
7
+ {
8
+ cors: 'proxy' as const,
9
+ envKeys: ['GOOGLE_AI_API_KEY'],
10
+ id: 'google-ai' as const,
11
+ label: 'Google AI',
12
+ model: 'gemini-3.1-flash-lite-preview',
13
+ },
14
+ {
15
+ cors: 'proxy' as const,
16
+ envKeys: ['ANTHROPIC_API_KEY'],
17
+ id: 'anthropic' as const,
18
+ label: 'Anthropic',
19
+ model: 'claude-haiku-4-5-20251001',
20
+ },
21
+ {
22
+ cors: 'proxy' as const,
23
+ envKeys: ['OPENAI_API_KEY'],
24
+ id: 'openai' as const,
25
+ label: 'OpenAI',
26
+ model: 'gpt-4o-mini',
27
+ },
28
+ {
29
+ cors: 'proxy' as const,
30
+ envKeys: ['MISTRAL_API_KEY'],
31
+ id: 'mistral' as const,
32
+ label: 'Mistral',
33
+ model: 'mistral-small-2506',
34
+ },
35
+ {
36
+ cors: 'direct' as const,
37
+ envKeys: ['LITELLM_API_KEY', 'LITELLM_BASE_URL'],
38
+ extraEnvKeys: ['LITELLM_MODEL'],
39
+ id: 'litellm' as const,
40
+ label: 'LiteLLM',
41
+ model: 'open-large',
42
+ },
43
+ ] as const;
44
+
45
+ // ProviderId imported from $lib/types — canonical definition lives there.
46
+
47
+ /**
48
+ * Detect which provider to use based on available env vars.
49
+ * Checks window.process.env for browser-side keys (litellm)
50
+ * and trusts server-passed flags for proxy providers (google-ai, anthropic, openai, mistral).
51
+ *
52
+ * @param serverFlags - Per-provider availability from +page.server.ts
53
+ * @param preferredProvider - Optional override (from NEUROLINK_PROVIDER env var)
54
+ */
55
+ export function detectActiveProvider(
56
+ serverFlags?: Record<string, boolean>,
57
+ preferredProvider?: string
58
+ ): null | { model: string; provider: ProviderId } {
59
+ // If user explicitly set a preferred provider, try it first — but only if
60
+ // credentials are actually available (serverFlags for proxy providers,
61
+ // browser env for direct providers). Without this gate a misconfigured
62
+ // NEUROLINK_PROVIDER would bypass the fallback loop and silently fail.
63
+ if (preferredProvider) {
64
+ const prov = PROVIDERS.find((p) => p.id === preferredProvider);
65
+ if (prov) {
66
+ if (prov.cors === 'direct') {
67
+ const env =
68
+ typeof window !== 'undefined'
69
+ ? ((window as unknown as { process?: { env?: Record<string, string> } }).process?.env ??
70
+ {})
71
+ : {};
72
+ if (prov.envKeys.every((k) => Boolean(env[k]))) {
73
+ return { model: prov.model, provider: prov.id };
74
+ }
75
+ } else if (serverFlags?.[prov.id]) {
76
+ return { model: prov.model, provider: prov.id };
77
+ }
78
+ }
79
+ }
80
+
81
+ const env =
82
+ typeof window !== 'undefined'
83
+ ? ((window as unknown as { process?: { env?: Record<string, string> } }).process?.env ?? {})
84
+ : {};
85
+
86
+ for (const prov of PROVIDERS) {
87
+ if (prov.cors === 'direct') {
88
+ // Check browser env vars
89
+ const hasKey = prov.envKeys.every((k) => Boolean(env[k]));
90
+ if (hasKey) {
91
+ return { model: prov.model, provider: prov.id };
92
+ }
93
+ } else {
94
+ // Check server-passed flags
95
+ if (serverFlags?.[prov.id]) {
96
+ return { model: prov.model, provider: prov.id };
97
+ }
98
+ }
99
+ }
100
+
101
+ return null;
102
+ }
103
+
104
+ /** Get the provider entry by ID. */
105
+ export function getProvider(id: ProviderId): (typeof PROVIDERS)[number] {
106
+ const provider = PROVIDERS.find((p) => p.id === id);
107
+ if (!provider) {
108
+ throw new Error(`Unknown provider: ${id}`);
109
+ }
110
+ return provider;
111
+ }
@@ -1,9 +1,12 @@
1
1
  <script lang="ts">
2
2
  import type {
3
+ ChatViewProps,
3
4
  ConversationMessage,
5
+ GroupedPart,
4
6
  MessagePart,
7
+ ToolGroup,
5
8
  ToolUsePart,
6
- } from '$lib/modules/server/sessions/types';
9
+ } from '$lib/types';
7
10
 
8
11
  import { browser } from '$app/environment';
9
12
  import { getToolDescription, renderMarkdown } from '$lib/modules/client/common';
@@ -22,23 +25,12 @@
22
25
  sessionEnded = false,
23
26
  showHeader = false,
24
27
  showInput = true,
25
- }: {
26
- connectionState?: 'connected' | 'connecting' | 'disconnected' | 'idle' | 'reconnecting';
27
- messages: ConversationMessage[];
28
- newestFirst?: boolean;
29
- onCancel?: () => void;
30
- onSendInput?: (text: string) => void;
31
- sendDisabled?: boolean;
32
- sessionEnded?: boolean;
33
- showHeader?: boolean;
34
- showInput?: boolean;
35
- } = $props();
28
+ }: ChatViewProps = $props();
36
29
 
37
30
  // When sendDisabled is explicitly provided, it overrides the connectionState check.
38
31
  // Otherwise fall back to the existing behaviour (disabled when not connected).
39
32
  const isInputDisabled = $derived(
40
- sessionEnded ||
41
- (sendDisabled !== undefined ? sendDisabled : connectionState !== 'connected')
33
+ sessionEnded || (sendDisabled !== undefined ? sendDisabled : connectionState !== 'connected')
42
34
  );
43
35
 
44
36
  // --- Local state ---
@@ -51,9 +43,7 @@
51
43
 
52
44
  // --- Show Details toggle (persisted in localStorage) ---
53
45
  const SHOW_DETAILS_KEY = 'shooter:chatview:showDetails';
54
- let showDetails = $state(
55
- browser ? localStorage.getItem(SHOW_DETAILS_KEY) === 'true' : false,
56
- );
46
+ let showDetails = $state(browser ? localStorage.getItem(SHOW_DETAILS_KEY) === 'true' : false);
57
47
 
58
48
  function toggleShowDetails(): void {
59
49
  showDetails = !showDetails;
@@ -63,22 +53,15 @@
63
53
  }
64
54
 
65
55
  // --- Tool grouping ---
66
- interface ToolGroup {
67
- groupId: string;
68
- summary: string;
69
- tools: ToolUsePart[];
70
- type: 'tool_group';
71
- }
72
-
73
- type GroupedPart = MessagePart | ToolGroup;
74
-
75
56
  function groupMessageParts(parts: MessagePart[], messageId: string): GroupedPart[] {
76
57
  const result: GroupedPart[] = [];
77
58
  let currentToolGroup: ToolUsePart[] = [];
78
59
  let groupIndex = 0;
79
60
 
80
61
  function flushToolGroup(): void {
81
- if (currentToolGroup.length === 0) {return;}
62
+ if (currentToolGroup.length === 0) {
63
+ return;
64
+ }
82
65
 
83
66
  if (currentToolGroup.length === 1) {
84
67
  // Single tool -- render as normal tool card, no group wrapper
@@ -223,7 +206,7 @@
223
206
  {#if !sessionEnded && onCancel}
224
207
  <Button
225
208
  classes="btn-danger btn-sm"
226
- onclick={() => {
209
+ onclick={(): void => {
227
210
  onCancel();
228
211
  }}
229
212
  text="Cancel"
@@ -280,8 +263,10 @@
280
263
  <div class="chat-tool-group">
281
264
  <div
282
265
  class="chat-tool-group-header"
283
- onclick={() => { toggleGroup(gpart.groupId); }}
284
- onkeydown={(e) => {
266
+ onclick={(): void => {
267
+ toggleGroup(gpart.groupId);
268
+ }}
269
+ onkeydown={(e: KeyboardEvent): void => {
285
270
  if (e.key === 'Enter' || e.key === ' ') {
286
271
  e.preventDefault();
287
272
  toggleGroup(gpart.groupId);
@@ -290,7 +275,9 @@
290
275
  role="button"
291
276
  tabindex="0"
292
277
  >
293
- <span class="chat-tool-group-chevron" class:expanded={groupExpanded}>&#9654;</span>
278
+ <span class="chat-tool-group-chevron" class:expanded={groupExpanded}
279
+ >&#9654;</span
280
+ >
294
281
  <span class="chat-tool-group-summary">{gpart.summary}</span>
295
282
  </div>
296
283
  {#if groupExpanded}
@@ -301,8 +288,10 @@
301
288
  <div class="chat-tool-card">
302
289
  <div
303
290
  class="chat-tool-header"
304
- onclick={() => { toggleTool(toolId); }}
305
- onkeydown={(e) => {
291
+ onclick={(): void => {
292
+ toggleTool(toolId);
293
+ }}
294
+ onkeydown={(e: KeyboardEvent): void => {
306
295
  if (e.key === 'Enter' || e.key === ' ') {
307
296
  e.preventDefault();
308
297
  toggleTool(toolId);
@@ -311,9 +300,13 @@
311
300
  role="button"
312
301
  tabindex="0"
313
302
  >
314
- <span class="chat-tool-chevron" class:expanded={isExpanded}>&#9654;</span>
303
+ <span class="chat-tool-chevron" class:expanded={isExpanded}
304
+ >&#9654;</span
305
+ >
315
306
  <Pill text={tool.toolName} classes="pill-tool-name" />
316
- <span class="chat-tool-description">{getToolDescriptionFromPart(tool)}</span>
307
+ <span class="chat-tool-description"
308
+ >{getToolDescriptionFromPart(tool)}</span
309
+ >
317
310
  </div>
318
311
  <Accordion expand={isExpanded}>
319
312
  {#if isExpanded}
@@ -337,8 +330,10 @@
337
330
  <div class="chat-tool-card">
338
331
  <div
339
332
  class="chat-tool-header"
340
- onclick={() => { toggleTool(toolId); }}
341
- onkeydown={(e) => {
333
+ onclick={(): void => {
334
+ toggleTool(toolId);
335
+ }}
336
+ onkeydown={(e: KeyboardEvent): void => {
342
337
  if (e.key === 'Enter' || e.key === ' ') {
343
338
  e.preventDefault();
344
339
  toggleTool(toolId);
@@ -363,8 +358,10 @@
363
358
  <div class="chat-thinking">
364
359
  <div
365
360
  class="chat-thinking-header"
366
- onclick={() => { toggleTool(thinkId); }}
367
- onkeydown={(e) => {
361
+ onclick={(): void => {
362
+ toggleTool(thinkId);
363
+ }}
364
+ onkeydown={(e: KeyboardEvent): void => {
368
365
  if (e.key === 'Enter' || e.key === ' ') {
369
366
  e.preventDefault();
370
367
  toggleTool(thinkId);
@@ -399,8 +396,10 @@
399
396
  <div class="chat-tool-card">
400
397
  <div
401
398
  class="chat-tool-header"
402
- onclick={() => { toggleTool(resultId); }}
403
- onkeydown={(e) => {
399
+ onclick={(): void => {
400
+ toggleTool(resultId);
401
+ }}
402
+ onkeydown={(e: KeyboardEvent): void => {
404
403
  if (e.key === 'Enter' || e.key === ' ') {
405
404
  e.preventDefault();
406
405
  toggleTool(resultId);
@@ -409,7 +408,9 @@
409
408
  role="button"
410
409
  tabindex="0"
411
410
  >
412
- <span class="chat-tool-chevron" class:expanded={isResultExpanded}>&#9654;</span>
411
+ <span class="chat-tool-chevron" class:expanded={isResultExpanded}
412
+ >&#9654;</span
413
+ >
413
414
  <Pill
414
415
  text={part.isError ? '\u274C Tool Error' : '\u2705 Tool Result'}
415
416
  classes={part.isError ? 'pill-tool-error' : 'pill-tool-success'}
@@ -460,7 +461,9 @@
460
461
  bind:value={inputText}
461
462
  dataType="text"
462
463
  useTextArea={true}
463
- placeholder={sessionEnded ? 'Session ended' : 'Send a message... (Shift+Enter for new line)'}
464
+ placeholder={sessionEnded
465
+ ? 'Session ended'
466
+ : 'Send a message... (Shift+Enter for new line)'}
464
467
  disable={isInputDisabled}
465
468
  onKeyDown={handleKeydown}
466
469
  classes="chat-input-field"
@@ -1,19 +1,10 @@
1
1
  <script lang="ts">
2
- import { CommandMenu } from '@juspay/svelte-ui-components';
3
-
4
- interface Command {
5
- action: () => void;
6
- label: string;
7
- }
2
+ import type { CommandPaletteProps } from '$lib/types';
8
3
 
9
- interface Props {
10
- commands: Command[];
11
- onClose: () => void;
12
- open?: boolean;
13
- }
4
+ import { CommandMenu } from '@juspay/svelte-ui-components';
14
5
 
15
6
  // eslint-disable-next-line prefer-const -- open is mutated via bind:open from parent
16
- let { commands, onClose, open = $bindable(false) }: Props = $props();
7
+ let { commands, onClose, open = $bindable(false) }: CommandPaletteProps = $props();
17
8
 
18
9
  const items = $derived(
19
10
  commands.map((cmd, i) => ({
@@ -1,12 +1,9 @@
1
1
  <script lang="ts">
2
- import { Button } from '@juspay/svelte-ui-components';
2
+ import type { ConnectionStatusProps } from '$lib/types';
3
3
 
4
- interface Props {
5
- onretry?: () => void;
6
- status: 'connected' | 'disconnected' | 'reconnecting';
7
- }
4
+ import { Button } from '@juspay/svelte-ui-components';
8
5
 
9
- const { onretry, status }: Props = $props();
6
+ const { onretry, status }: ConnectionStatusProps = $props();
10
7
 
11
8
  const label = $derived(
12
9
  status === 'connected'