@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.
- package/README.md +24 -20
- package/bin/shooter.cjs +68 -17
- 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/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/{CiF38mQq.js → Dc_Gg2H6.js} +1 -1
- package/build/client/_app/immutable/chunks/Dc_Gg2H6.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dc_Gg2H6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CRbaG9cv.js → DlnAjkg1.js} +1 -1
- package/build/client/_app/immutable/chunks/DlnAjkg1.js.br +0 -0
- package/build/client/_app/immutable/chunks/{CRbaG9cv.js.gz → DlnAjkg1.js.gz} +0 -0
- package/build/client/_app/immutable/chunks/YKoRJzXZ.js +3 -0
- package/build/client/_app/immutable/chunks/YKoRJzXZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/YKoRJzXZ.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/entry/app.CFPgQOa8.js +2 -0
- package/build/client/_app/immutable/entry/app.CFPgQOa8.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CFPgQOa8.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BnJOVqhI.js +1 -0
- package/build/client/_app/immutable/entry/start.BnJOVqhI.js.br +2 -0
- package/build/client/_app/immutable/entry/start.BnJOVqhI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DR-BBF5r.js +1 -0
- package/build/client/_app/immutable/nodes/0.DR-BBF5r.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DR-BBF5r.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CNm6rAwf.js +1 -0
- package/build/client/_app/immutable/nodes/1.CNm6rAwf.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.CNm6rAwf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.B08usYzr.js +13 -0
- package/build/client/_app/immutable/nodes/2.B08usYzr.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B08usYzr.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CsY6J5HS.js +9 -0
- package/build/client/_app/immutable/nodes/3.CsY6J5HS.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CsY6J5HS.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.CbQQ3FtZ.js +1 -0
- package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.CbQQ3FtZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.DIkXVP4q.js → 7.CCKgiNNk.js} +3 -3
- package/build/client/_app/immutable/nodes/7.CCKgiNNk.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.CCKgiNNk.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.C7AaheUD.js +2 -0
- package/build/client/_app/immutable/nodes/8.C7AaheUD.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.C7AaheUD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DfL9kMC4.js +2 -0
- package/build/client/_app/immutable/nodes/9.DfL9kMC4.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DfL9kMC4.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-DC2VLooL.js +23 -0
- package/build/server/chunks/0-DC2VLooL.js.map +1 -0
- package/build/server/chunks/1-XJaf8Jvf.js +9 -0
- package/build/server/chunks/{1-D0N7vVhH.js.map → 1-XJaf8Jvf.js.map} +1 -1
- package/build/server/chunks/2-D4Cx-1QL.js +21 -0
- package/build/server/chunks/2-D4Cx-1QL.js.map +1 -0
- package/build/server/chunks/3-CVhIEP-u.js +21 -0
- package/build/server/chunks/3-CVhIEP-u.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-QFSbzRMP.js +9 -0
- package/build/server/chunks/6-QFSbzRMP.js.map +1 -0
- package/build/server/chunks/7-CZ_YGjMV.js +9 -0
- package/build/server/chunks/7-CZ_YGjMV.js.map +1 -0
- package/build/server/chunks/8-Xe2Rugb4.js +9 -0
- package/build/server/chunks/8-Xe2Rugb4.js.map +1 -0
- package/build/server/chunks/9-IwHpC4SO.js +9 -0
- package/build/server/chunks/9-IwHpC4SO.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-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-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/{_server.ts-Deok2y88.js → _server.ts-Ds_SUGC3.js} +184 -90
- package/build/server/chunks/_server.ts-Ds_SUGC3.js.map +1 -0
- package/build/server/chunks/{_server.ts-Ch-6iOHp.js → _server.ts-G8OeADGj.js} +141 -89
- package/build/server/chunks/_server.ts-G8OeADGj.js.map +1 -0
- 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 +24 -6
- package/scripts/dev.mjs +361 -0
- package/scripts/install.sh +11 -3
- package/scripts/{fix-generated-types.sh → postgen-types.sh} +2 -2
- package/scripts/setup.cjs +219 -24
- 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 +144 -76
- 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 +190 -87
- 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/BIaXC2t9.js +0 -1
- package/build/client/_app/immutable/chunks/BIaXC2t9.js.br +0 -0
- package/build/client/_app/immutable/chunks/BIaXC2t9.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/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/CRbaG9cv.js.br +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/CiF38mQq.js.br +0 -0
- package/build/client/_app/immutable/chunks/CiF38mQq.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.CU7KVZja.js +0 -2
- package/build/client/_app/immutable/entry/app.CU7KVZja.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CU7KVZja.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.RAMZY19t.js +0 -1
- package/build/client/_app/immutable/entry/start.RAMZY19t.js.br +0 -2
- package/build/client/_app/immutable/entry/start.RAMZY19t.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js +0 -1
- package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.Bi3XYMSu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DTmfBFmm.js +0 -1
- package/build/client/_app/immutable/nodes/1.DTmfBFmm.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.DTmfBFmm.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Cm269yzt.js +0 -1
- package/build/client/_app/immutable/nodes/2.Cm269yzt.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Cm269yzt.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.C25c5hMg.js +0 -1
- package/build/client/_app/immutable/nodes/4.C25c5hMg.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.C25c5hMg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DIkXVP4q.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DIkXVP4q.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BPL-HzUX.js +0 -2
- package/build/client/_app/immutable/nodes/6.BPL-HzUX.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BPL-HzUX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.IgEqce53.js +0 -2
- package/build/client/_app/immutable/nodes/7.IgEqce53.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.IgEqce53.js.gz +0 -0
- package/build/server/chunks/0-DiORznXb.js +0 -9
- package/build/server/chunks/0-DiORznXb.js.map +0 -1
- package/build/server/chunks/1-D0N7vVhH.js +0 -9
- package/build/server/chunks/2-DfSav7a7.js +0 -9
- package/build/server/chunks/2-DfSav7a7.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-DV5MZUz_.js +0 -9
- package/build/server/chunks/4-DV5MZUz_.js.map +0 -1
- package/build/server/chunks/5-DJhoAjb0.js +0 -9
- package/build/server/chunks/5-DJhoAjb0.js.map +0 -1
- package/build/server/chunks/6-Cp8CzYbr.js +0 -9
- package/build/server/chunks/6-Cp8CzYbr.js.map +0 -1
- package/build/server/chunks/7-BA4xzUj3.js +0 -9
- package/build/server/chunks/7-BA4xzUj3.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
|
@@ -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/
|
|
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) {
|
|
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={() => {
|
|
284
|
-
|
|
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}
|
|
278
|
+
<span class="chat-tool-group-chevron" class:expanded={groupExpanded}
|
|
279
|
+
>▶</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={() => {
|
|
305
|
-
|
|
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}
|
|
303
|
+
<span class="chat-tool-chevron" class:expanded={isExpanded}
|
|
304
|
+
>▶</span
|
|
305
|
+
>
|
|
315
306
|
<Pill text={tool.toolName} classes="pill-tool-name" />
|
|
316
|
-
<span class="chat-tool-description"
|
|
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={() => {
|
|
341
|
-
|
|
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={() => {
|
|
367
|
-
|
|
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={() => {
|
|
403
|
-
|
|
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}
|
|
411
|
+
<span class="chat-tool-chevron" class:expanded={isResultExpanded}
|
|
412
|
+
>▶</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
|
|
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 {
|
|
3
|
-
|
|
4
|
-
interface Command {
|
|
5
|
-
action: () => void;
|
|
6
|
-
label: string;
|
|
7
|
-
}
|
|
2
|
+
import type { CommandPaletteProps } from '$lib/types';
|
|
8
3
|
|
|
9
|
-
|
|
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) }:
|
|
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 {
|
|
2
|
+
import type { ConnectionStatusProps } from '$lib/types';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
onretry?: () => void;
|
|
6
|
-
status: 'connected' | 'disconnected' | 'reconnecting';
|
|
7
|
-
}
|
|
4
|
+
import { Button } from '@juspay/svelte-ui-components';
|
|
8
5
|
|
|
9
|
-
const { onretry, status }:
|
|
6
|
+
const { onretry, status }: ConnectionStatusProps = $props();
|
|
10
7
|
|
|
11
8
|
const label = $derived(
|
|
12
9
|
status === 'connected'
|