@juspay/shooter 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/notifier.cjs +15 -1
- package/README.md +132 -36
- package/bin/shooter.cjs +98 -29
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css +1 -0
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.br +0 -0
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.DHxQoulp.css +1 -0
- package/build/client/_app/immutable/assets/3.DHxQoulp.css.br +0 -0
- package/build/client/_app/immutable/assets/3.DHxQoulp.css.gz +0 -0
- package/build/client/_app/immutable/assets/{3.DGDHCVnW.css → 4.D5l1JxgO.css} +1 -1
- package/build/client/_app/immutable/assets/4.D5l1JxgO.css.br +0 -0
- package/build/client/_app/immutable/assets/4.D5l1JxgO.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.C5qz-NeI.css +1 -0
- package/build/client/_app/immutable/assets/5.C5qz-NeI.css.br +0 -0
- package/build/client/_app/immutable/assets/5.C5qz-NeI.css.gz +0 -0
- package/build/client/_app/immutable/chunks/1mEchsPO.js +1 -0
- package/build/client/_app/immutable/chunks/1mEchsPO.js.br +0 -0
- package/build/client/_app/immutable/chunks/1mEchsPO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B7X-vhXI.js +1 -0
- package/build/client/_app/immutable/chunks/B7X-vhXI.js.br +0 -0
- package/build/client/_app/immutable/chunks/B7X-vhXI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BRkqKgVG.js +1 -0
- package/build/client/_app/immutable/chunks/BRkqKgVG.js.br +0 -0
- package/build/client/_app/immutable/chunks/BRkqKgVG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BfJ-f-Tu.js +1 -0
- package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.br +2 -0
- package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CGMJxf7r.js +1 -0
- package/build/client/_app/immutable/chunks/CGMJxf7r.js.br +0 -0
- package/build/client/_app/immutable/chunks/CGMJxf7r.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CZHsSL_X.js → CJFjKwJ7.js} +1 -1
- package/build/client/_app/immutable/chunks/CJFjKwJ7.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJFjKwJ7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CNH2HlKj.js +20 -0
- package/build/client/_app/immutable/chunks/CNH2HlKj.js.br +0 -0
- package/build/client/_app/immutable/chunks/CNH2HlKj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CR6bkGJW.js +6 -0
- package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
- package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CVtJ6yRM.js +1 -0
- package/build/client/_app/immutable/chunks/CVtJ6yRM.js.br +0 -0
- package/build/client/_app/immutable/chunks/CVtJ6yRM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CSoRdFvv.js → CaiJSUi3.js} +1 -1
- package/build/client/_app/immutable/chunks/CaiJSUi3.js.br +0 -0
- package/build/client/_app/immutable/chunks/CaiJSUi3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DjsDGxCa.js → CmczWE_d.js} +4 -4
- package/build/client/_app/immutable/chunks/CmczWE_d.js.br +0 -0
- package/build/client/_app/immutable/chunks/CmczWE_d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CDVSripB.js → CqfYvnci.js} +1 -1
- package/build/client/_app/immutable/chunks/CqfYvnci.js.br +0 -0
- package/build/client/_app/immutable/chunks/CqfYvnci.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CsgHjHGZ.js +1 -0
- package/build/client/_app/immutable/chunks/CsgHjHGZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/CsgHjHGZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{UJOiqIYE.js → CtrCjGZT.js} +1 -1
- package/build/client/_app/immutable/chunks/CtrCjGZT.js.br +0 -0
- package/build/client/_app/immutable/chunks/CtrCjGZT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DDiOVAd8.js +61 -0
- package/build/client/_app/immutable/chunks/DDiOVAd8.js.br +0 -0
- package/build/client/_app/immutable/chunks/DDiOVAd8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVl0sebP.js +2 -0
- package/build/client/_app/immutable/chunks/DVl0sebP.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVl0sebP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js +3 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js.br +0 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gQJcRhou.js +1 -0
- package/build/client/_app/immutable/chunks/gQJcRhou.js.br +0 -0
- package/build/client/_app/immutable/chunks/gQJcRhou.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pRcLbE0d.js +1 -0
- package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
- package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CF4lQ45j.js → y_g-KC7l.js} +1 -1
- package/build/client/_app/immutable/chunks/y_g-KC7l.js.br +0 -0
- package/build/client/_app/immutable/chunks/y_g-KC7l.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js +2 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js.br +0 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js +1 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.br +2 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js +1 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js +1 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js +13 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js +9 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.B_pbOZoD.js +4 -0
- package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.CdLPNo5-.js +1 -0
- package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js +1 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.g3R-QfIW.js → 7.5K7Od8ba.js} +3 -3
- package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js +2 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js +2 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/0-e1fgD9Mi.js +23 -0
- package/build/server/chunks/0-e1fgD9Mi.js.map +1 -0
- package/build/server/chunks/1-D2_XVthm.js +9 -0
- package/build/server/chunks/{1-BV7u1xGo.js.map → 1-D2_XVthm.js.map} +1 -1
- package/build/server/chunks/2-DADX86JZ.js +21 -0
- package/build/server/chunks/2-DADX86JZ.js.map +1 -0
- package/build/server/chunks/3-CHacdiCg.js +21 -0
- package/build/server/chunks/3-CHacdiCg.js.map +1 -0
- package/build/server/chunks/4-0UE_6Ep-.js +23 -0
- package/build/server/chunks/4-0UE_6Ep-.js.map +1 -0
- package/build/server/chunks/5-BBIP1PzX.js +24 -0
- package/build/server/chunks/5-BBIP1PzX.js.map +1 -0
- package/build/server/chunks/6-CWLNQu6F.js +9 -0
- package/build/server/chunks/6-CWLNQu6F.js.map +1 -0
- package/build/server/chunks/7-DmQ3B8uy.js +9 -0
- package/build/server/chunks/7-DmQ3B8uy.js.map +1 -0
- package/build/server/chunks/8-CnFVjQtZ.js +9 -0
- package/build/server/chunks/8-CnFVjQtZ.js.map +1 -0
- package/build/server/chunks/9-Dw7-P6aF.js +9 -0
- package/build/server/chunks/9-Dw7-P6aF.js.map +1 -0
- package/build/server/chunks/{Button-Cs1aE6ka.js → Button-WKgiLWZI.js} +4 -9
- package/build/server/chunks/Button-WKgiLWZI.js.map +1 -0
- package/build/server/chunks/{EmptyState-DDFH1K8g.js → EmptyState-BUBqASsp.js} +3 -3
- package/build/server/chunks/{EmptyState-DDFH1K8g.js.map → EmptyState-BUBqASsp.js.map} +1 -1
- package/build/server/chunks/{Icon-CEUrotA6.js → Icon-BNBAg85a.js} +3 -3
- package/build/server/chunks/Icon-BNBAg85a.js.map +1 -0
- package/build/server/chunks/{Shimmer-DB8W1zt6.js → Shimmer-C4uBVwxz.js} +2 -2
- package/build/server/chunks/{Shimmer-DB8W1zt6.js.map → Shimmer-C4uBVwxz.js.map} +1 -1
- package/build/server/chunks/{_error.svelte-uCOJNxvr.js → _error.svelte-DkIwmECt.js} +5 -5
- package/build/server/chunks/{_error.svelte-uCOJNxvr.js.map → _error.svelte-DkIwmECt.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-CtWmEJwe.js → _layout.svelte-DllETxmJ.js} +13 -7
- package/build/server/chunks/_layout.svelte-DllETxmJ.js.map +1 -0
- package/build/server/chunks/_page.svelte-BZSdLKE_.js +118 -0
- package/build/server/chunks/_page.svelte-BZSdLKE_.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CxWcQ0Am.js → _page.svelte-Cmuco1mC.js} +84 -199
- package/build/server/chunks/_page.svelte-Cmuco1mC.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BgevQjq1.js → _page.svelte-Co5sF7W-.js} +12 -11
- package/build/server/chunks/{_page.svelte-BgevQjq1.js.map → _page.svelte-Co5sF7W-.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-DO4oa_LY.js → _page.svelte-CpL3R-VI.js} +8 -8
- package/build/server/chunks/{_page.svelte-DO4oa_LY.js.map → _page.svelte-CpL3R-VI.js.map} +1 -1
- package/build/server/chunks/_page.svelte-DDSzYLUs.js +137 -0
- package/build/server/chunks/_page.svelte-DDSzYLUs.js.map +1 -0
- package/build/server/chunks/_page.svelte-JIkgFUFf.js +26 -0
- package/build/server/chunks/_page.svelte-JIkgFUFf.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CVq6tRb3.js → _page.svelte-Y9-O5a5w.js} +10 -9
- package/build/server/chunks/_page.svelte-Y9-O5a5w.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BcZaKdX9.js → _page.svelte-fcX09N4d.js} +9 -9
- package/build/server/chunks/{_page.svelte-BcZaKdX9.js.map → _page.svelte-fcX09N4d.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DYpJImqd.js → _server.ts-0Xr2fWaq.js} +9 -5
- package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +1 -0
- package/build/server/chunks/{_server.ts-CTpcLUH8.js → _server.ts-2ixC-X3K.js} +20 -5
- package/build/server/chunks/_server.ts-2ixC-X3K.js.map +1 -0
- package/build/server/chunks/{_server.ts-CAxsWKvS.js → _server.ts-40c_epk8.js} +20 -4
- package/build/server/chunks/_server.ts-40c_epk8.js.map +1 -0
- package/build/server/chunks/{_server.ts-WhTJBEJy.js → _server.ts-A9_tRR-K.js} +5 -4
- package/build/server/chunks/{_server.ts-WhTJBEJy.js.map → _server.ts-A9_tRR-K.js.map} +1 -1
- package/build/server/chunks/_server.ts-BRAzC6W1.js +98 -0
- package/build/server/chunks/_server.ts-BRAzC6W1.js.map +1 -0
- package/build/server/chunks/{_server.ts-DB_Kg97c.js → _server.ts-BScvgttw.js} +24 -4
- package/build/server/chunks/_server.ts-BScvgttw.js.map +1 -0
- package/build/server/chunks/{_server.ts-Ch-6iOHp.js → _server.ts-B__YN2kX.js} +121 -87
- package/build/server/chunks/_server.ts-B__YN2kX.js.map +1 -0
- package/build/server/chunks/{_server.ts-tSpgyl1D.js → _server.ts-Bjbr7glm.js} +4 -3
- package/build/server/chunks/_server.ts-Bjbr7glm.js.map +1 -0
- package/build/server/chunks/{_server.ts-COu0vNpd.js → _server.ts-BrqaMMAa.js} +7 -6
- package/build/server/chunks/_server.ts-BrqaMMAa.js.map +1 -0
- package/build/server/chunks/{_server.ts-vekTmWAx.js → _server.ts-BuYyCrnF.js} +6 -4
- package/build/server/chunks/_server.ts-BuYyCrnF.js.map +1 -0
- package/build/server/chunks/{_server.ts-Deok2y88.js → _server.ts-ByIrRtCx.js} +132 -76
- package/build/server/chunks/_server.ts-ByIrRtCx.js.map +1 -0
- package/build/server/chunks/{_server.ts-DYvb9ijZ.js → _server.ts-ByPExYfO.js} +4 -3
- package/build/server/chunks/{_server.ts-DYvb9ijZ.js.map → _server.ts-ByPExYfO.js.map} +1 -1
- package/build/server/chunks/_server.ts-CjpQ10xh.js +123 -0
- package/build/server/chunks/_server.ts-CjpQ10xh.js.map +1 -0
- package/build/server/chunks/_server.ts-CyjDrcZN.js +21 -0
- package/build/server/chunks/_server.ts-CyjDrcZN.js.map +1 -0
- package/build/server/chunks/{_server.ts-DV8zTCF9.js → _server.ts-DOGUMzPx.js} +4 -3
- package/build/server/chunks/{_server.ts-DV8zTCF9.js.map → _server.ts-DOGUMzPx.js.map} +1 -1
- package/build/server/chunks/_server.ts-DZvfyuNj.js +15 -0
- package/build/server/chunks/_server.ts-DZvfyuNj.js.map +1 -0
- package/build/server/chunks/{_server.ts-XzT2UHM1.js → _server.ts-DkPPTUPo.js} +4 -3
- package/build/server/chunks/{_server.ts-XzT2UHM1.js.map → _server.ts-DkPPTUPo.js.map} +1 -1
- package/build/server/chunks/{auth-DeCdZ83n.js → auth-DuunT7Cg.js} +2 -2
- package/build/server/chunks/{auth-DeCdZ83n.js.map → auth-DuunT7Cg.js.map} +1 -1
- package/build/server/chunks/{client-BdGHe_hY.js → client-DRtPDkMh.js} +4 -4
- package/build/server/chunks/{client-BdGHe_hY.js.map → client-DRtPDkMh.js.map} +1 -1
- package/build/server/chunks/client2-bqqmu0b7.js +7 -0
- package/build/server/chunks/{client2-CCBGA-2V.js.map → client2-bqqmu0b7.js.map} +1 -1
- package/build/server/chunks/close-BGlLztTb.js +192 -0
- package/build/server/chunks/close-BGlLztTb.js.map +1 -0
- package/build/server/chunks/events-handler-Dm1mNPQP.js +20 -0
- package/build/server/chunks/events-handler-Dm1mNPQP.js.map +1 -0
- package/build/server/chunks/html-FW6Ia4bL.js +8 -0
- package/build/server/chunks/html-FW6Ia4bL.js.map +1 -0
- package/build/server/chunks/{shared-server-sSGG17Df.js → index-CoD1IJuy.js} +2 -11
- package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
- package/build/server/chunks/{index-DwaY1cAm.js → index-DP9bWJrR.js} +2 -2
- package/build/server/chunks/{index-DwaY1cAm.js.map → index-DP9bWJrR.js.map} +1 -1
- package/build/server/chunks/{index-server-CrDaL06Y.js → index-server-BUmV4MIG.js} +2 -2
- package/build/server/chunks/index-server-BUmV4MIG.js.map +1 -0
- package/build/server/chunks/index-server2-BJrT0wnA.js +5 -0
- package/build/server/chunks/index-server2-BJrT0wnA.js.map +1 -0
- package/build/server/chunks/{index2-CgclKpUj.js → index2-D5Y19GKR.js} +2 -2
- package/build/server/chunks/index2-D5Y19GKR.js.map +1 -0
- package/build/server/chunks/{library-apns-BqJbvSKh.js → library-apns-Cf-E-DhM.js} +5 -2
- package/build/server/chunks/library-apns-Cf-E-DhM.js.map +1 -0
- package/build/server/chunks/providers-DtstoHQ0.js +17 -0
- package/build/server/chunks/providers-DtstoHQ0.js.map +1 -0
- package/build/server/chunks/{pty-manager-BQVB7IVj.js → pty-manager-TyMUpDA9.js} +41 -9
- package/build/server/chunks/pty-manager-TyMUpDA9.js.map +1 -0
- package/build/server/chunks/{root-DDSnEAZv.js → root-CATOR_0t.js} +2 -2
- package/build/server/chunks/root-CATOR_0t.js.map +1 -0
- package/build/server/chunks/shared-server-DaWdgxVh.js +11 -0
- package/build/server/chunks/shared-server-DaWdgxVh.js.map +1 -0
- package/build/server/chunks/{state.svelte-hBbXlUak.js → state.svelte-CftllyvC.js} +3 -3
- package/build/server/chunks/state.svelte-CftllyvC.js.map +1 -0
- package/build/server/chunks/{stores-DHNzYNpX.js → stores-BjL57aOK.js} +4 -4
- package/build/server/chunks/{stores-DHNzYNpX.js.map → stores-BjL57aOK.js.map} +1 -1
- package/build/server/index.js +173 -6
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +53 -30
- package/build/server/manifest.js.map +1 -1
- package/package.json +28 -7
- package/scripts/dev.mjs +361 -0
- package/scripts/install.sh +133 -73
- package/scripts/{fix-generated-types.sh → postgen-types.sh} +2 -2
- package/scripts/setup.cjs +440 -244
- package/scripts/vercel-env-commands.sh +3 -3
- package/server.ts +3 -3
- package/src/app.html +163 -0
- package/src/lib/modules/client/activity/ActivityFeed.svelte +279 -0
- package/src/lib/modules/client/activity/index.ts +8 -0
- package/src/lib/modules/client/activity/store.svelte.ts +478 -0
- package/src/lib/modules/client/activity/summarizer.ts +224 -0
- package/src/lib/modules/client/common/Card.svelte +2 -9
- package/src/lib/modules/client/common/EmptyState.svelte +2 -20
- package/src/lib/modules/client/common/Icon.svelte +3 -7
- package/src/lib/modules/client/common/StatusBadge.svelte +2 -4
- package/src/lib/modules/client/common/config-guard.ts +22 -2
- package/src/lib/modules/client/common/index.ts +1 -1
- package/src/lib/modules/client/common/time.ts +27 -9
- package/src/lib/modules/client/dashboard/DashboardCard.svelte +374 -0
- package/src/lib/modules/client/dashboard/DashboardView.svelte +66 -0
- package/src/lib/modules/client/dashboard/index.ts +12 -0
- package/src/lib/modules/client/dashboard/store.svelte.ts +663 -0
- package/src/lib/modules/client/dashboard/summarizer.ts +205 -0
- package/src/lib/modules/client/neurolink/fetch-proxy.ts +70 -0
- package/src/lib/modules/client/neurolink/provider-config.ts +111 -0
- package/src/lib/modules/client/terminal/ChatView.svelte +46 -43
- package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -12
- package/src/lib/modules/client/terminal/ConnectionStatus.svelte +3 -6
- package/src/lib/modules/client/terminal/LaunchSheet.svelte +10 -21
- package/src/lib/modules/client/terminal/QuickKeys.svelte +4 -11
- package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +3 -6
- package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +5 -7
- package/src/lib/modules/client/terminal/xterm-wrapper.ts +27 -47
- package/src/lib/modules/server/apn/library-apns.ts +6 -3
- package/src/lib/modules/server/apn/notification-history.ts +2 -2
- package/src/lib/modules/server/apn/notification-sessions.ts +1 -3
- package/src/lib/modules/server/apn/pending-requests.ts +1 -1
- package/src/lib/modules/server/apn/types.ts +2 -52
- package/src/lib/modules/server/cli/index.ts +1 -30
- package/src/lib/modules/server/cli/runner.ts +7 -15
- package/src/lib/modules/server/fcm/fcm-service.ts +2 -2
- package/src/lib/modules/server/sessions/jsonl-parser.ts +97 -42
- package/src/lib/modules/server/sessions/jsonl-reader.ts +69 -60
- package/src/lib/modules/server/sessions/opencode-reader.ts +1 -1
- package/src/lib/modules/server/sessions/process-detector.ts +72 -31
- package/src/lib/modules/server/sessions/types.ts +2 -42
- package/src/lib/modules/server/terminal/holder-client.ts +11 -35
- package/src/lib/modules/server/terminal/opencode-watcher.ts +16 -24
- package/src/lib/modules/server/terminal/pty-manager.ts +40 -45
- package/src/lib/modules/server/terminal/session-watcher.ts +15 -17
- package/src/lib/modules/server/terminal/terminal-store.ts +1 -1
- package/src/lib/modules/server/ws/events-handler.ts +1 -16
- package/src/lib/modules/server/ws/keepalive.ts +1 -5
- package/src/lib/modules/server/ws/server.ts +1 -1
- package/src/lib/modules/server/ws/session-handler.ts +20 -86
- package/src/lib/modules/server/ws/terminal-handler.ts +28 -51
- package/src/lib/modules/server/ws/ticket-store.ts +1 -1
- package/src/lib/modules/shared/providers.ts +21 -0
- package/src/lib/types/activity.ts +18 -0
- package/src/lib/types/apn.ts +43 -0
- package/src/lib/types/cli.ts +39 -0
- package/src/lib/types/common.ts +39 -0
- package/src/lib/types/dashboard.ts +4 -0
- package/src/lib/types/generated/Client.ts +1656 -0
- package/src/{generated/types → lib/types/generated}/WsProtocol.ts +344 -2
- package/src/lib/types/index.ts +28 -0
- package/src/lib/types/neurolink.ts +4 -0
- package/src/lib/types/server.ts +93 -0
- package/src/lib/types/sessions.ts +59 -0
- package/src/lib/types/terminal-client.ts +132 -0
- package/src/lib/types/ws.ts +161 -0
- package/src/routes/+error.svelte +7 -2
- package/src/routes/+layout.server.ts +9 -0
- package/src/routes/+layout.svelte +36 -7
- package/src/routes/+page.server.ts +7 -0
- package/src/routes/+page.svelte +85 -35
- package/src/routes/activity/+page.server.ts +7 -0
- package/src/routes/activity/+page.svelte +58 -0
- package/src/routes/api/health/+server.ts +32 -19
- package/src/routes/api/neurolink-proxy/+server.ts +136 -0
- package/src/routes/api/notify/+server.ts +159 -84
- package/src/routes/api/sessions/+server.ts +1 -1
- package/src/routes/api/sessions/connect/+server.ts +10 -6
- package/src/routes/api/terminals/+server.ts +20 -1
- package/src/routes/api/terminals/[id]/+server.ts +16 -2
- package/src/routes/api/webhook/+server.ts +5 -33
- package/src/routes/api/ws-ticket/+server.ts +4 -4
- package/src/routes/config/+page.server.ts +9 -0
- package/src/routes/config/+page.svelte +118 -25
- package/src/routes/neurolink/+page.server.ts +10 -0
- package/src/routes/neurolink/+page.svelte +331 -0
- package/src/routes/project/+page.svelte +17 -12
- package/src/routes/session/[id]/+page.svelte +146 -62
- package/src/routes/terminals/+page.svelte +2 -2
- package/src/routes/terminals/[id]/+page.svelte +99 -88
- package/svelte.config.js +1 -3
- package/tsconfig.json +1 -0
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +0 -1
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +0 -1
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js +0 -20
- package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js +0 -1
- package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js +0 -6
- package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BN1NjBrw.js +0 -1
- package/build/client/_app/immutable/chunks/BN1NjBrw.js.br +0 -0
- package/build/client/_app/immutable/chunks/BN1NjBrw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js +0 -1
- package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js +0 -1
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CDVSripB.js.br +0 -0
- package/build/client/_app/immutable/chunks/CDVSripB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CF4lQ45j.js.br +0 -0
- package/build/client/_app/immutable/chunks/CF4lQ45j.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js +0 -61
- package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js +0 -1
- package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js +0 -1
- package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js +0 -2
- package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DwWiuoEC.js +0 -2
- package/build/client/_app/immutable/entry/app.DwWiuoEC.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DwWiuoEC.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DG8BMhrh.js +0 -1
- package/build/client/_app/immutable/entry/start.DG8BMhrh.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DG8BMhrh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.ejabgzDQ.js +0 -1
- package/build/client/_app/immutable/nodes/0.ejabgzDQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.ejabgzDQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js +0 -1
- package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DV3saFiY.js +0 -1
- package/build/client/_app/immutable/nodes/2.DV3saFiY.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DV3saFiY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js +0 -3
- package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.D6NIf10D.js +0 -1
- package/build/client/_app/immutable/nodes/4.D6NIf10D.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.D6NIf10D.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.g3R-QfIW.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.g3R-QfIW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DSpd_nYK.js +0 -2
- package/build/client/_app/immutable/nodes/6.DSpd_nYK.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DSpd_nYK.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.F9WBFTz2.js +0 -2
- package/build/client/_app/immutable/nodes/7.F9WBFTz2.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.F9WBFTz2.js.gz +0 -0
- package/build/server/chunks/0-ePgrkfG9.js +0 -9
- package/build/server/chunks/0-ePgrkfG9.js.map +0 -1
- package/build/server/chunks/1-BV7u1xGo.js +0 -9
- package/build/server/chunks/2-3p1kyvjQ.js +0 -9
- package/build/server/chunks/2-3p1kyvjQ.js.map +0 -1
- package/build/server/chunks/3-Ck7ewhOX.js +0 -9
- package/build/server/chunks/3-Ck7ewhOX.js.map +0 -1
- package/build/server/chunks/4-ChFYfo_S.js +0 -9
- package/build/server/chunks/4-ChFYfo_S.js.map +0 -1
- package/build/server/chunks/5-q-tQLBBu.js +0 -9
- package/build/server/chunks/5-q-tQLBBu.js.map +0 -1
- package/build/server/chunks/6-BIaAbm8b.js +0 -9
- package/build/server/chunks/6-BIaAbm8b.js.map +0 -1
- package/build/server/chunks/7--TmbCgrH.js +0 -9
- package/build/server/chunks/7--TmbCgrH.js.map +0 -1
- package/build/server/chunks/Button-Cs1aE6ka.js.map +0 -1
- package/build/server/chunks/Icon-CEUrotA6.js.map +0 -1
- package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +0 -1
- package/build/server/chunks/_page.svelte-BdYynOck.js +0 -85
- package/build/server/chunks/_page.svelte-BdYynOck.js.map +0 -1
- package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +0 -1
- package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +0 -1
- package/build/server/chunks/_server.ts-BStnNIcq.js +0 -34
- package/build/server/chunks/_server.ts-BStnNIcq.js.map +0 -1
- package/build/server/chunks/_server.ts-CAxsWKvS.js.map +0 -1
- package/build/server/chunks/_server.ts-COu0vNpd.js.map +0 -1
- package/build/server/chunks/_server.ts-CTpcLUH8.js.map +0 -1
- package/build/server/chunks/_server.ts-Cf84YIaW.js +0 -25
- package/build/server/chunks/_server.ts-Cf84YIaW.js.map +0 -1
- package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +0 -1
- package/build/server/chunks/_server.ts-CtH0dhUp.js +0 -71
- package/build/server/chunks/_server.ts-CtH0dhUp.js.map +0 -1
- package/build/server/chunks/_server.ts-DB_Kg97c.js.map +0 -1
- package/build/server/chunks/_server.ts-DYpJImqd.js.map +0 -1
- package/build/server/chunks/_server.ts-Deok2y88.js.map +0 -1
- package/build/server/chunks/_server.ts-tSpgyl1D.js.map +0 -1
- package/build/server/chunks/_server.ts-vekTmWAx.js.map +0 -1
- package/build/server/chunks/client2-CCBGA-2V.js +0 -7
- package/build/server/chunks/index-server-CrDaL06Y.js.map +0 -1
- package/build/server/chunks/index2-CgclKpUj.js.map +0 -1
- package/build/server/chunks/library-apns-BqJbvSKh.js.map +0 -1
- package/build/server/chunks/pty-manager-BQVB7IVj.js.map +0 -1
- package/build/server/chunks/root-DDSnEAZv.js.map +0 -1
- package/build/server/chunks/shared-server-sSGG17Df.js.map +0 -1
- package/build/server/chunks/state.svelte-hBbXlUak.js.map +0 -1
- package/src/generated/types/Client.ts +0 -589
- package/src/lib/types/config.ts +0 -1
- /package/build/client/_app/immutable/assets/{4.BFUut--w.css → 6.BFUut--w.css} +0 -0
- /package/build/client/_app/immutable/assets/{4.BFUut--w.css.br → 6.BFUut--w.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{4.BFUut--w.css.gz → 6.BFUut--w.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css → 7.BTOx7yt7.css} +0 -0
- /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.br → 7.BTOx7yt7.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.gz → 7.BTOx7yt7.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css → 8.eZGZN-BF.css} +0 -0
- /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.br → 8.eZGZN-BF.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.gz → 8.eZGZN-BF.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css → 9.DwS5ZHBh.css} +0 -0
- /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.br → 9.DwS5ZHBh.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.gz → 9.DwS5ZHBh.css.gz} +0 -0
- /package/src/{generated/types → lib/types/generated}/API.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/APN.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/CLI.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Config.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Holder.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/JWT.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Notification.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/OpenCode.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Sessions.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Terminal.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/index.ts +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { NativeBridgeConfig } from '$
|
|
3
|
-
import type { ShooterConfig } from '$lib/types/config';
|
|
2
|
+
import type { ConfigPageData, NativeBridgeConfig, ShooterConfig } from '$lib/types';
|
|
4
3
|
|
|
5
4
|
import { browser } from '$app/environment';
|
|
6
5
|
import {
|
|
@@ -11,9 +10,12 @@
|
|
|
11
10
|
scanQR,
|
|
12
11
|
toErrorMessage,
|
|
13
12
|
} from '$lib/modules/client/common';
|
|
13
|
+
import { PROVIDERS } from '$lib/modules/client/neurolink/provider-config';
|
|
14
14
|
import { Banner, Button, Input, Stepper } from '@juspay/svelte-ui-components';
|
|
15
15
|
import { onMount } from 'svelte';
|
|
16
16
|
|
|
17
|
+
const { data }: { data: ConfigPageData } = $props();
|
|
18
|
+
|
|
17
19
|
let serverUrl = $state('');
|
|
18
20
|
let apiKey = $state('');
|
|
19
21
|
let deviceToken = $state('');
|
|
@@ -157,26 +159,45 @@
|
|
|
157
159
|
|
|
158
160
|
onMount(() => {
|
|
159
161
|
if (browser) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
162
|
+
// Auto-configure from URL fragment (#key=...&url=...) to avoid
|
|
163
|
+
// exposing secrets in the request URL, browser history, or referrer headers.
|
|
164
|
+
const hash = window.location.hash.slice(1);
|
|
165
|
+
if (hash) {
|
|
166
|
+
const params = new URLSearchParams(hash);
|
|
167
|
+
const paramKey = params.get('key');
|
|
168
|
+
const paramUrl = params.get('url');
|
|
169
|
+
if (paramKey) {
|
|
170
|
+
apiKey = paramKey;
|
|
171
|
+
if (paramUrl) {
|
|
172
|
+
serverUrl = paramUrl;
|
|
173
|
+
}
|
|
174
|
+
void saveConfiguration();
|
|
175
|
+
// Clean fragment so the key doesn't linger
|
|
176
|
+
window.history.replaceState({}, '', window.location.pathname);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (!apiKey) {
|
|
180
|
+
try {
|
|
181
|
+
const saved = localStorage.getItem('shooter_config');
|
|
182
|
+
if (saved) {
|
|
183
|
+
const parsed: unknown = JSON.parse(saved);
|
|
184
|
+
if (isShooterConfig(parsed)) {
|
|
185
|
+
if (parsed.apiKey) {
|
|
186
|
+
apiKey = parsed.apiKey;
|
|
187
|
+
}
|
|
188
|
+
if (parsed.deviceToken) {
|
|
189
|
+
deviceToken = parsed.deviceToken;
|
|
190
|
+
}
|
|
191
|
+
if (parsed.serverUrl) {
|
|
192
|
+
serverUrl = parsed.serverUrl;
|
|
193
|
+
}
|
|
194
|
+
} else {
|
|
195
|
+
localStorage.removeItem('shooter_config');
|
|
173
196
|
}
|
|
174
|
-
} else {
|
|
175
|
-
localStorage.removeItem('shooter_config');
|
|
176
197
|
}
|
|
198
|
+
} catch {
|
|
199
|
+
// No saved configuration — expected on first visit
|
|
177
200
|
}
|
|
178
|
-
} catch {
|
|
179
|
-
// No saved configuration — expected on first visit
|
|
180
201
|
}
|
|
181
202
|
|
|
182
203
|
// Hydrate from native bridge BEFORE applying the browser default.
|
|
@@ -285,13 +306,13 @@
|
|
|
285
306
|
method: 'POST',
|
|
286
307
|
});
|
|
287
308
|
|
|
288
|
-
const data = await response.json()
|
|
309
|
+
const data = (await response.json()) as Record<string, unknown>;
|
|
289
310
|
|
|
290
311
|
if (response.ok) {
|
|
291
312
|
result = 'Test notification sent successfully';
|
|
292
313
|
statusType = 'success';
|
|
293
314
|
} else {
|
|
294
|
-
result = `Test failed: ${data.error
|
|
315
|
+
result = `Test failed: ${typeof data.error === 'string' ? data.error : 'Unknown error'}`;
|
|
295
316
|
statusType = 'error';
|
|
296
317
|
}
|
|
297
318
|
} catch (error) {
|
|
@@ -358,7 +379,8 @@
|
|
|
358
379
|
infoMessage="Required for sending notifications"
|
|
359
380
|
/>
|
|
360
381
|
<p class="input-help">
|
|
361
|
-
Find this in your <code>~/.shooter/.env</code> file. Run <code>shooter setup</code> to generate
|
|
382
|
+
Find this in your <code>~/.shooter/.env</code> file. Run <code>shooter setup</code> to generate
|
|
383
|
+
one.
|
|
362
384
|
</p>
|
|
363
385
|
|
|
364
386
|
<Input
|
|
@@ -474,6 +496,35 @@
|
|
|
474
496
|
</div>
|
|
475
497
|
</Card>
|
|
476
498
|
|
|
499
|
+
<Card title="AI Providers" description="NeuroLink-powered summaries and AI features">
|
|
500
|
+
<div class="ai-providers">
|
|
501
|
+
{#each PROVIDERS as provider (provider.id)}
|
|
502
|
+
<div class="provider-row">
|
|
503
|
+
<Icon
|
|
504
|
+
name={data.aiProviders[provider.id] ? 'check-circle' : 'x-circle'}
|
|
505
|
+
size={14}
|
|
506
|
+
/>
|
|
507
|
+
<span class="provider-label">{provider.label}</span>
|
|
508
|
+
<span class="provider-status" class:configured={data.aiProviders[provider.id]}>
|
|
509
|
+
{data.aiProviders[provider.id] ? 'configured' : 'not configured'}
|
|
510
|
+
</span>
|
|
511
|
+
</div>
|
|
512
|
+
{/each}
|
|
513
|
+
|
|
514
|
+
{#if data.activeProvider}
|
|
515
|
+
<div class="active-provider">
|
|
516
|
+
Active: <strong>{data.activeProvider}</strong>
|
|
517
|
+
</div>
|
|
518
|
+
{:else if Object.values(data.aiProviders).some(Boolean)}
|
|
519
|
+
<div class="active-provider">Auto-detected from configured keys</div>
|
|
520
|
+
{:else}
|
|
521
|
+
<p class="ai-help">
|
|
522
|
+
Run <code>shooter setup</code> to configure AI providers for summaries.
|
|
523
|
+
</p>
|
|
524
|
+
{/if}
|
|
525
|
+
</div>
|
|
526
|
+
</Card>
|
|
527
|
+
|
|
477
528
|
<Card title="Danger Zone">
|
|
478
529
|
<p class="danger-description">Clear all saved configuration data from this device.</p>
|
|
479
530
|
<Button
|
|
@@ -631,7 +682,49 @@
|
|
|
631
682
|
}
|
|
632
683
|
|
|
633
684
|
.settings-sidebar :global(.card):last-child {
|
|
634
|
-
border-color:
|
|
685
|
+
border-color: color-mix(in srgb, var(--ds-red-700) 30%, transparent);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.ai-providers {
|
|
689
|
+
display: flex;
|
|
690
|
+
flex-direction: column;
|
|
691
|
+
gap: var(--space-2);
|
|
692
|
+
}
|
|
693
|
+
.provider-row {
|
|
694
|
+
display: flex;
|
|
695
|
+
align-items: center;
|
|
696
|
+
gap: var(--space-2);
|
|
697
|
+
font-size: var(--text-sm);
|
|
698
|
+
}
|
|
699
|
+
.provider-label {
|
|
700
|
+
flex: 1;
|
|
701
|
+
color: var(--text-primary);
|
|
702
|
+
}
|
|
703
|
+
.provider-status {
|
|
704
|
+
font-size: var(--text-xs);
|
|
705
|
+
color: var(--text-tertiary);
|
|
706
|
+
}
|
|
707
|
+
.provider-status.configured {
|
|
708
|
+
color: var(--ds-green-900);
|
|
709
|
+
}
|
|
710
|
+
.active-provider {
|
|
711
|
+
margin-top: var(--space-2);
|
|
712
|
+
padding-top: var(--space-2);
|
|
713
|
+
border-top: 1px solid var(--border);
|
|
714
|
+
font-size: var(--text-xs);
|
|
715
|
+
color: var(--text-secondary);
|
|
716
|
+
}
|
|
717
|
+
.ai-help {
|
|
718
|
+
font-size: var(--text-xs);
|
|
719
|
+
color: var(--text-secondary);
|
|
720
|
+
margin-top: var(--space-2);
|
|
721
|
+
}
|
|
722
|
+
.ai-help code {
|
|
723
|
+
background: var(--ds-gray-200, #1a1a1a);
|
|
724
|
+
padding: 1px 4px;
|
|
725
|
+
border-radius: var(--radius-sm);
|
|
726
|
+
font-family: var(--font-mono);
|
|
727
|
+
font-size: var(--text-xs);
|
|
635
728
|
}
|
|
636
729
|
|
|
637
730
|
.danger-description {
|
|
@@ -640,12 +733,12 @@
|
|
|
640
733
|
margin-bottom: var(--space-4);
|
|
641
734
|
line-height: var(--leading-relaxed);
|
|
642
735
|
padding-left: var(--space-3);
|
|
643
|
-
border-left: 3px solid
|
|
736
|
+
border-left: 3px solid color-mix(in srgb, var(--ds-red-700) 50%, transparent);
|
|
644
737
|
}
|
|
645
738
|
|
|
646
739
|
.input-help {
|
|
647
740
|
font-size: var(--text-xs);
|
|
648
|
-
color: var(--
|
|
741
|
+
color: var(--text-tertiary);
|
|
649
742
|
margin-top: var(--space-1);
|
|
650
743
|
margin-bottom: 0;
|
|
651
744
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { env } from '$env/dynamic/private';
|
|
2
|
+
|
|
3
|
+
import type { PageServerLoad } from './$types';
|
|
4
|
+
|
|
5
|
+
export const load: PageServerLoad = () => ({
|
|
6
|
+
// LiteLLM base URL and model name are safe to pass (not secrets)
|
|
7
|
+
litellmBaseUrl: env.LITELLM_BASE_URL ?? '',
|
|
8
|
+
litellmModel: env.LITELLM_MODEL ?? 'open-large',
|
|
9
|
+
// All API keys stay server-side — injected by /api/neurolink-proxy
|
|
10
|
+
});
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { installFetchProxy } from '$lib/modules/client/neurolink/fetch-proxy';
|
|
3
|
+
import { Button, Input, Pill } from '@juspay/svelte-ui-components';
|
|
4
|
+
import { onMount } from 'svelte';
|
|
5
|
+
|
|
6
|
+
const NEUROLINK_CDN_URL = 'https://unpkg.com/@juspay/neurolink/dist/browser/neurolink.min.js';
|
|
7
|
+
|
|
8
|
+
import type { ProviderId } from '$lib/types';
|
|
9
|
+
|
|
10
|
+
import { PROVIDERS } from '$lib/modules/client/neurolink/provider-config';
|
|
11
|
+
|
|
12
|
+
const { data } = $props<{
|
|
13
|
+
data: {
|
|
14
|
+
litellmBaseUrl: string;
|
|
15
|
+
litellmModel: string;
|
|
16
|
+
};
|
|
17
|
+
}>();
|
|
18
|
+
|
|
19
|
+
let NL: null | Record<string, unknown> = $state(null);
|
|
20
|
+
let sdk: null | {
|
|
21
|
+
generate: (opts: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
22
|
+
} = $state(null);
|
|
23
|
+
let logs = $state<{ text: string; type: string }[]>([]);
|
|
24
|
+
let prompt = $state('');
|
|
25
|
+
let loading = $state(false);
|
|
26
|
+
let loaded = $state(false);
|
|
27
|
+
let activeProvider = $state<ProviderId>('litellm');
|
|
28
|
+
|
|
29
|
+
function log(text: string, type = 'info'): void {
|
|
30
|
+
logs = [...logs, { text, type }];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function injectEnvKeys(): void {
|
|
34
|
+
const p = (globalThis as unknown as { process?: { env?: Record<string, string> } }).process;
|
|
35
|
+
if (!p?.env) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const env = p.env;
|
|
39
|
+
if (data.litellmBaseUrl) {
|
|
40
|
+
env.LITELLM_BASE_URL = data.litellmBaseUrl;
|
|
41
|
+
}
|
|
42
|
+
if (data.litellmModel) {
|
|
43
|
+
env.LITELLM_MODEL = data.litellmModel;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// All providers go through the server proxy. Inject dummy placeholders so
|
|
47
|
+
// the SDK's env-var validation passes — the fetch proxy strips these and
|
|
48
|
+
// injects real keys server-side.
|
|
49
|
+
const flags = (window as unknown as Record<string, Record<string, boolean>>).__aiProviders;
|
|
50
|
+
if (flags?.['google-ai']) {
|
|
51
|
+
env.GOOGLE_AI_API_KEY = 'proxy-via-server';
|
|
52
|
+
}
|
|
53
|
+
if (flags?.anthropic) {
|
|
54
|
+
env.ANTHROPIC_API_KEY = 'proxy-via-server';
|
|
55
|
+
}
|
|
56
|
+
if (flags?.openai) {
|
|
57
|
+
env.OPENAI_API_KEY = 'proxy-via-server';
|
|
58
|
+
}
|
|
59
|
+
if (flags?.mistral) {
|
|
60
|
+
env.MISTRAL_API_KEY = 'proxy-via-server';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
onMount(async () => {
|
|
65
|
+
installShims();
|
|
66
|
+
installFetchProxy();
|
|
67
|
+
injectEnvKeys();
|
|
68
|
+
|
|
69
|
+
log('Loading NeuroLink from CDN...');
|
|
70
|
+
log(NEUROLINK_CDN_URL, 'dim');
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
74
|
+
NL = await import(/* @vite-ignore */ NEUROLINK_CDN_URL);
|
|
75
|
+
log(`Loaded! ${Object.keys(NL ?? {}).length} exports`, 'pass');
|
|
76
|
+
sdk = new (
|
|
77
|
+
NL as Record<
|
|
78
|
+
string,
|
|
79
|
+
new (opts: Record<string, unknown>) => {
|
|
80
|
+
generate: (opts: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
81
|
+
}
|
|
82
|
+
>
|
|
83
|
+
).NeuroLink({ provider: activeProvider });
|
|
84
|
+
log(`NeuroLink ready · provider: ${activeProvider}`, 'pass');
|
|
85
|
+
loaded = true;
|
|
86
|
+
} catch (e: unknown) {
|
|
87
|
+
log(`Failed to load: ${e instanceof Error ? e.message : String(e)}`, 'fail');
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
function switchProvider(id: ProviderId): void {
|
|
92
|
+
if (!NL || id === activeProvider) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
activeProvider = id;
|
|
96
|
+
sdk = new (
|
|
97
|
+
NL as Record<
|
|
98
|
+
string,
|
|
99
|
+
new (opts: Record<string, unknown>) => {
|
|
100
|
+
generate: (opts: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
101
|
+
}
|
|
102
|
+
>
|
|
103
|
+
).NeuroLink({ provider: id });
|
|
104
|
+
log(`Switched to provider: ${id}`, 'dim');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Ensure global shims exist — app.html normally installs them,
|
|
108
|
+
* but guard in case this page loads before the inline script runs. */
|
|
109
|
+
function installShims(): void {
|
|
110
|
+
if (typeof globalThis.process === 'undefined') {
|
|
111
|
+
(globalThis as unknown as { process: Record<string, unknown> }).process = {
|
|
112
|
+
cwd: (): string => '/',
|
|
113
|
+
env: {},
|
|
114
|
+
platform: 'browser',
|
|
115
|
+
version: 'v24.0.0',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (typeof globalThis.global === 'undefined') {
|
|
119
|
+
(globalThis as unknown as { global: typeof globalThis }).global = globalThis;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function send(): Promise<void> {
|
|
124
|
+
if (!prompt.trim() || !sdk || loading) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const input = prompt.trim();
|
|
128
|
+
prompt = '';
|
|
129
|
+
loading = true;
|
|
130
|
+
log(`> ${input}`, 'user');
|
|
131
|
+
|
|
132
|
+
const prov = PROVIDERS.find((p) => p.id === activeProvider);
|
|
133
|
+
if (!prov) {
|
|
134
|
+
loading = false;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const result = await sdk.generate({
|
|
139
|
+
input: { text: input },
|
|
140
|
+
model: prov.model,
|
|
141
|
+
provider: prov.id,
|
|
142
|
+
});
|
|
143
|
+
const content = typeof result.content === 'string' ? result.content : '(empty response)';
|
|
144
|
+
const usage = result.usage as undefined | { total?: number };
|
|
145
|
+
log(content, 'ai');
|
|
146
|
+
log(`${prov.id}/${prov.model} | ${usage?.total ?? '?'} tokens`, 'dim');
|
|
147
|
+
} catch (e: unknown) {
|
|
148
|
+
log(`Error: ${e instanceof Error ? e.message : String(e)}`, 'fail');
|
|
149
|
+
}
|
|
150
|
+
loading = false;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function handleKeydown(e: KeyboardEvent): void {
|
|
154
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
void send();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
</script>
|
|
160
|
+
|
|
161
|
+
<div class="page">
|
|
162
|
+
<header>
|
|
163
|
+
<h1>NeuroLink</h1>
|
|
164
|
+
<span class="version">new NeuroLink()</span>
|
|
165
|
+
{#if loaded}
|
|
166
|
+
<Pill text="Connected" classes="pill-connected" />
|
|
167
|
+
{:else}
|
|
168
|
+
<Pill text="Loading..." classes="pill-loading" />
|
|
169
|
+
{/if}
|
|
170
|
+
</header>
|
|
171
|
+
|
|
172
|
+
{#if loaded}
|
|
173
|
+
<div class="provider-bar">
|
|
174
|
+
{#each PROVIDERS as p (p.id)}
|
|
175
|
+
<Pill
|
|
176
|
+
text={p.label}
|
|
177
|
+
classes="prov-pill {activeProvider === p.id ? 'prov-pill--active' : ''}"
|
|
178
|
+
onclick={(): void => {
|
|
179
|
+
switchProvider(p.id);
|
|
180
|
+
}}
|
|
181
|
+
/>
|
|
182
|
+
{/each}
|
|
183
|
+
</div>
|
|
184
|
+
{/if}
|
|
185
|
+
|
|
186
|
+
<div class="log" id="log">
|
|
187
|
+
{#each logs as entry, i (i)}
|
|
188
|
+
<div class="log-entry {entry.type}">{entry.text}</div>
|
|
189
|
+
{/each}
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
193
|
+
<div class="input-bar" onkeydown={handleKeydown}>
|
|
194
|
+
<Input
|
|
195
|
+
name="prompt"
|
|
196
|
+
bind:value={prompt}
|
|
197
|
+
placeholder={loaded ? `Ask anything... [${activeProvider}]` : 'Loading SDK...'}
|
|
198
|
+
classes="input-prompt"
|
|
199
|
+
/>
|
|
200
|
+
<Button
|
|
201
|
+
classes="btn-primary"
|
|
202
|
+
onclick={send}
|
|
203
|
+
disabled={!loaded || loading || !prompt.trim()}
|
|
204
|
+
text={loading ? '...' : 'Send'}
|
|
205
|
+
/>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
|
|
209
|
+
<style>
|
|
210
|
+
.page {
|
|
211
|
+
display: flex;
|
|
212
|
+
flex-direction: column;
|
|
213
|
+
height: 100vh;
|
|
214
|
+
background: var(--background);
|
|
215
|
+
color: var(--text-primary);
|
|
216
|
+
font-family: var(--font-mono);
|
|
217
|
+
padding: 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
header {
|
|
221
|
+
display: flex;
|
|
222
|
+
align-items: center;
|
|
223
|
+
gap: var(--space-3);
|
|
224
|
+
padding: var(--space-3) var(--space-4);
|
|
225
|
+
border-bottom: 1px solid var(--border);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
h1 {
|
|
229
|
+
font-size: var(--text-lg);
|
|
230
|
+
color: var(--ds-blue-700);
|
|
231
|
+
margin: 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.version {
|
|
235
|
+
color: var(--text-tertiary);
|
|
236
|
+
font-size: var(--text-xs);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
:global(.pill-connected) {
|
|
240
|
+
--pill-background: var(--ds-green-100);
|
|
241
|
+
--pill-color: var(--ds-green-700);
|
|
242
|
+
--pill-font-size: var(--text-xs);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
:global(.pill-loading) {
|
|
246
|
+
--pill-background: var(--ds-amber-100);
|
|
247
|
+
--pill-color: var(--ds-amber-700);
|
|
248
|
+
--pill-font-size: var(--text-xs);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.provider-bar {
|
|
252
|
+
display: flex;
|
|
253
|
+
gap: var(--space-2);
|
|
254
|
+
padding: var(--space-2) var(--space-4);
|
|
255
|
+
border-bottom: 1px solid var(--border);
|
|
256
|
+
flex-wrap: wrap;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
:global(.prov-pill) {
|
|
260
|
+
--pill-background: var(--component-bg);
|
|
261
|
+
--pill-color: var(--text-tertiary);
|
|
262
|
+
--pill-font-size: var(--text-xs);
|
|
263
|
+
--pill-cursor: pointer;
|
|
264
|
+
--pill-border-radius: var(--radius-md);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
:global(.prov-pill:hover) {
|
|
268
|
+
--pill-color: var(--text-primary);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
:global(.prov-pill--active) {
|
|
272
|
+
--pill-background: var(--ds-blue-100);
|
|
273
|
+
--pill-color: var(--ds-blue-700);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.log {
|
|
277
|
+
flex: 1;
|
|
278
|
+
overflow-y: auto;
|
|
279
|
+
padding: var(--space-3) var(--space-4);
|
|
280
|
+
font-size: var(--text-sm);
|
|
281
|
+
line-height: 1.6;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.log-entry {
|
|
285
|
+
white-space: pre-wrap;
|
|
286
|
+
margin-bottom: var(--space-1);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.log-entry.pass {
|
|
290
|
+
color: var(--ds-green-900);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.log-entry.fail {
|
|
294
|
+
color: var(--ds-red-900);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.log-entry.dim {
|
|
298
|
+
color: var(--text-tertiary);
|
|
299
|
+
font-size: var(--text-xs);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.log-entry.user {
|
|
303
|
+
color: var(--ds-blue-700);
|
|
304
|
+
font-weight: bold;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.log-entry.ai {
|
|
308
|
+
color: var(--text-primary);
|
|
309
|
+
padding: var(--space-2) var(--space-3);
|
|
310
|
+
background: var(--component-bg);
|
|
311
|
+
border-radius: var(--radius-md);
|
|
312
|
+
margin: var(--space-1) 0;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.input-bar {
|
|
316
|
+
display: flex;
|
|
317
|
+
align-items: center;
|
|
318
|
+
gap: var(--space-2);
|
|
319
|
+
padding: var(--space-3) var(--space-4);
|
|
320
|
+
border-top: 1px solid var(--border);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.input-bar :global(.input-prompt) {
|
|
324
|
+
flex: 1;
|
|
325
|
+
--input-font-family: var(--font-mono);
|
|
326
|
+
--input-background: var(--component-bg);
|
|
327
|
+
--input-border: 1px solid var(--border-hover);
|
|
328
|
+
--input-focus-border: 1px solid var(--ds-blue-700);
|
|
329
|
+
--input-container-margin: 0;
|
|
330
|
+
}
|
|
331
|
+
</style>
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { ProjectGroup, ShooterConfig } from '$
|
|
3
|
-
import type { DetectedProcess } from '$lib/modules/server/sessions/process-detector';
|
|
2
|
+
import type { DetectedProcess, ProjectGroup, ShooterConfig } from '$lib/types';
|
|
4
3
|
|
|
5
4
|
import { goto } from '$app/navigation';
|
|
6
5
|
import { page } from '$app/state';
|
|
@@ -35,7 +34,9 @@
|
|
|
35
34
|
|
|
36
35
|
// Build a set of session IDs that have running processes
|
|
37
36
|
const runningSessionIds = $derived(
|
|
38
|
-
new Set(
|
|
37
|
+
new Set(
|
|
38
|
+
detectedProcesses.map((p) => p.sessionId).filter((id): id is string => typeof id === 'string')
|
|
39
|
+
)
|
|
39
40
|
);
|
|
40
41
|
|
|
41
42
|
onMount(() => {
|
|
@@ -112,7 +113,7 @@
|
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
fetchError = null;
|
|
115
|
-
const result
|
|
116
|
+
const result = (await response.json()) as { projects: ProjectGroup[] };
|
|
116
117
|
const foundProject = result.projects.find((p) => p.id === projectId) || null;
|
|
117
118
|
project = foundProject;
|
|
118
119
|
if (foundProject) {
|
|
@@ -135,7 +136,7 @@
|
|
|
135
136
|
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
136
137
|
});
|
|
137
138
|
if (response.ok) {
|
|
138
|
-
const data
|
|
139
|
+
const data = (await response.json()) as { processes: DetectedProcess[] };
|
|
139
140
|
detectedProcesses = data.processes;
|
|
140
141
|
}
|
|
141
142
|
} catch {
|
|
@@ -173,7 +174,7 @@
|
|
|
173
174
|
});
|
|
174
175
|
|
|
175
176
|
if (response.ok) {
|
|
176
|
-
const result
|
|
177
|
+
const result = (await response.json()) as { terminalId: string };
|
|
177
178
|
void goto(`/terminals/${result.terminalId}`);
|
|
178
179
|
}
|
|
179
180
|
} catch (error) {
|
|
@@ -197,9 +198,13 @@
|
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
function formatDate(ts: string): string {
|
|
200
|
-
if (!ts) {
|
|
201
|
+
if (!ts) {
|
|
202
|
+
return '';
|
|
203
|
+
}
|
|
201
204
|
const d = new Date(ts);
|
|
202
|
-
if (isNaN(d.getTime())) {
|
|
205
|
+
if (isNaN(d.getTime())) {
|
|
206
|
+
return '';
|
|
207
|
+
}
|
|
203
208
|
return d.toLocaleDateString('en-US', {
|
|
204
209
|
day: 'numeric',
|
|
205
210
|
hour: '2-digit',
|
|
@@ -283,8 +288,8 @@
|
|
|
283
288
|
{#if runningSessionIds.has(session.id)}
|
|
284
289
|
<Button
|
|
285
290
|
classes="btn-connect btn-xs"
|
|
286
|
-
onclick={(e: MouseEvent) =>
|
|
287
|
-
connectToSession(
|
|
291
|
+
onclick={(e: MouseEvent): void =>
|
|
292
|
+
void connectToSession(
|
|
288
293
|
e,
|
|
289
294
|
session.id,
|
|
290
295
|
session.source === 'opencode' ? 'opencode' : 'claude'
|
|
@@ -298,8 +303,8 @@
|
|
|
298
303
|
{:else}
|
|
299
304
|
<Button
|
|
300
305
|
classes="btn-resume btn-xs"
|
|
301
|
-
onclick={(e: MouseEvent) =>
|
|
302
|
-
connectToSession(
|
|
306
|
+
onclick={(e: MouseEvent): void =>
|
|
307
|
+
void connectToSession(
|
|
303
308
|
e,
|
|
304
309
|
session.id,
|
|
305
310
|
session.source === 'opencode' ? 'opencode' : 'claude'
|