@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,161 @@
|
|
|
1
|
+
// WebSocket module types — extracted from ws/ handler files.
|
|
2
|
+
// All WebSocket-related type/interface definitions live here.
|
|
3
|
+
//
|
|
4
|
+
// Names use a "Wire" prefix where they collide with generated types
|
|
5
|
+
// in WsProtocol.ts (which use class-wrapper discriminated unions).
|
|
6
|
+
// These "Wire" types are the simple literal unions used at runtime.
|
|
7
|
+
|
|
8
|
+
import type { WebSocket } from 'ws';
|
|
9
|
+
|
|
10
|
+
import type {
|
|
11
|
+
MessageRole,
|
|
12
|
+
NotificationSession,
|
|
13
|
+
PermissionDecision,
|
|
14
|
+
SessionSource,
|
|
15
|
+
TerminalSignal,
|
|
16
|
+
TextContentBlock,
|
|
17
|
+
} from './generated';
|
|
18
|
+
import type { ConversationMessage } from './sessions';
|
|
19
|
+
|
|
20
|
+
// ── events-handler types ────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
export interface PendingPong {
|
|
23
|
+
onClose: () => void;
|
|
24
|
+
onPong: () => void;
|
|
25
|
+
timer: ReturnType<typeof setTimeout>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ── keepalive types ─────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
export type Session = NotificationSession;
|
|
31
|
+
|
|
32
|
+
// ── session-handler types ───────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
export interface SessionManagedTerminal {
|
|
35
|
+
id: string;
|
|
36
|
+
openCodeSessionId: null | string;
|
|
37
|
+
pty: {
|
|
38
|
+
pid: number;
|
|
39
|
+
write: (data: string) => void;
|
|
40
|
+
};
|
|
41
|
+
sessionFile: null | string;
|
|
42
|
+
status: 'exited' | 'running';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Extended PTY manager interface with list() for UUID-based terminal search. */
|
|
46
|
+
export interface SessionPtyManagerFullLike extends SessionPtyManagerLike {
|
|
47
|
+
list: () => SessionManagedTerminal[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface SessionPtyManagerLike {
|
|
51
|
+
getTerminal: (id: string) => SessionManagedTerminal | undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface SessionWatcherLike {
|
|
55
|
+
getHistory: (sessionFile: string) => ConversationMessage[];
|
|
56
|
+
subscribe: (
|
|
57
|
+
sessionFile: string,
|
|
58
|
+
callback: (messages: ConversationMessage[]) => void
|
|
59
|
+
) => () => void;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface TerminalManagedTerminal {
|
|
63
|
+
clients: Set<WebSocket>;
|
|
64
|
+
exitCode: null | number;
|
|
65
|
+
id: string;
|
|
66
|
+
pty: {
|
|
67
|
+
kill: (signal: string) => void;
|
|
68
|
+
pid: number;
|
|
69
|
+
resize: (cols: number, rows: number) => void;
|
|
70
|
+
write: (data: string) => void;
|
|
71
|
+
};
|
|
72
|
+
status: 'exited' | 'running';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface TerminalPtyManagerLike {
|
|
76
|
+
attach: (id: string, ws: WebSocket) => boolean;
|
|
77
|
+
detach: (id: string, ws: WebSocket) => boolean;
|
|
78
|
+
getTerminal: (id: string) => TerminalManagedTerminal | undefined;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** A message in the history payload. */
|
|
82
|
+
export interface WireHistoryMessage {
|
|
83
|
+
content: WireHistoryPart[];
|
|
84
|
+
id: string;
|
|
85
|
+
role: MessageRole;
|
|
86
|
+
timestamp: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** A single part within a history message — discriminated union. */
|
|
90
|
+
export type WireHistoryPart =
|
|
91
|
+
| { content: string; type: 'text' }
|
|
92
|
+
| { content: string; type: 'thinking' }
|
|
93
|
+
| { id: string; input: Record<string, unknown>; toolName: string; type: 'tool_use' }
|
|
94
|
+
| { isError: boolean; output: string; toolUseId: string; type: 'tool_result' };
|
|
95
|
+
|
|
96
|
+
/** Inbound messages from the client (session channel). */
|
|
97
|
+
export type WireSessionClientMessage =
|
|
98
|
+
| { sessionId: string; type: 'subscribe' }
|
|
99
|
+
| { text: string; type: 'send-input' }
|
|
100
|
+
| { type: 'cancel' };
|
|
101
|
+
|
|
102
|
+
// ── terminal-handler types ──────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
/** Outbound messages to the client (session channel). */
|
|
105
|
+
export type WireSessionServerMessage =
|
|
106
|
+
| { content: TextContentBlock[]; role: MessageRole; timestamp: string; type: 'message' }
|
|
107
|
+
| {
|
|
108
|
+
id: string;
|
|
109
|
+
input: Record<string, unknown>;
|
|
110
|
+
name: string;
|
|
111
|
+
status: 'running';
|
|
112
|
+
type: 'tool-use';
|
|
113
|
+
}
|
|
114
|
+
| { id: string; isError: boolean; output: string; status: 'done'; type: 'tool-result' }
|
|
115
|
+
| { message: string; type: 'error' }
|
|
116
|
+
| { messages: WireHistoryMessage[]; type: 'history' }
|
|
117
|
+
| { text: string; type: 'thinking' }
|
|
118
|
+
| { type: 'session-end' };
|
|
119
|
+
|
|
120
|
+
export type WireShooterEvent =
|
|
121
|
+
| { code: null | number; terminalId: string; type: 'terminal-exited' }
|
|
122
|
+
| { command: string; terminalId: string; type: 'terminal-created' }
|
|
123
|
+
| { command?: string; filePath?: string; terminalId?: string; tool: string; type: 'tool-started' }
|
|
124
|
+
| { decision: PermissionDecision; requestId: string; type: 'permission-resolved' }
|
|
125
|
+
| { error: string; terminalId?: string; tool: string; type: 'tool-failed' }
|
|
126
|
+
| {
|
|
127
|
+
input: Record<string, unknown>;
|
|
128
|
+
requestId: string;
|
|
129
|
+
tool: string;
|
|
130
|
+
type: 'permission-requested';
|
|
131
|
+
}
|
|
132
|
+
| { message: string; sessionId?: string; terminalId?: string; type: 'agent-question' }
|
|
133
|
+
| { message?: string; sessionId?: string; terminalId?: string; type: 'agent-idle' }
|
|
134
|
+
| { project: string; sessionId: string; source: SessionSource; type: 'session-started' }
|
|
135
|
+
| { sessionId: string; summary: string; type: 'session-ended' }
|
|
136
|
+
| { success: boolean; terminalId?: string; tool: string; type: 'tool-completed' };
|
|
137
|
+
|
|
138
|
+
/** Inbound messages from the client (terminal channel). */
|
|
139
|
+
export type WireTerminalClientMessage =
|
|
140
|
+
| { cols: number; rows: number; type: 'resize' }
|
|
141
|
+
| { data: string; type: 'input' }
|
|
142
|
+
| { signal: TerminalSignal; type: 'signal' };
|
|
143
|
+
|
|
144
|
+
/** Outbound messages to the client (terminal channel). */
|
|
145
|
+
export type WireTerminalServerMessage =
|
|
146
|
+
| { bytes: number; type: 'output-dropped' }
|
|
147
|
+
| { chunk: number; data: string; total: number; type: 'scrollback' }
|
|
148
|
+
| { code: null | number; signal: null | string; type: 'exit' }
|
|
149
|
+
| { data: string; type: 'output' }
|
|
150
|
+
| { message: string; type: 'error' };
|
|
151
|
+
|
|
152
|
+
// ── notification-sessions type alias ────────────────────────────────
|
|
153
|
+
|
|
154
|
+
/** Per-connection state tracked for cleanup. */
|
|
155
|
+
export interface WsConnectionState {
|
|
156
|
+
/** True when the session is file-only (no terminal backing it). */
|
|
157
|
+
isExternalSession: boolean;
|
|
158
|
+
retryInterval: null | ReturnType<typeof setInterval>;
|
|
159
|
+
terminalId: string;
|
|
160
|
+
unsubscribe: (() => void) | null;
|
|
161
|
+
}
|
package/src/routes/+error.svelte
CHANGED
|
@@ -27,8 +27,13 @@
|
|
|
27
27
|
{/if}
|
|
28
28
|
</p>
|
|
29
29
|
<div class="error-actions">
|
|
30
|
-
<button class="error-btn" onclick={() => goto('/')}>Go Home</button>
|
|
31
|
-
<button
|
|
30
|
+
<button class="error-btn" onclick={(): void => void goto('/')}>Go Home</button>
|
|
31
|
+
<button
|
|
32
|
+
class="error-btn error-btn-secondary"
|
|
33
|
+
onclick={(): void => {
|
|
34
|
+
history.back();
|
|
35
|
+
}}>Go Back</button
|
|
36
|
+
>
|
|
32
37
|
</div>
|
|
33
38
|
</div>
|
|
34
39
|
</main>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { env } from '$env/dynamic/private';
|
|
2
|
+
import { getProviderAvailability } from '$lib/modules/shared/providers';
|
|
3
|
+
|
|
4
|
+
import type { LayoutServerLoad } from './$types';
|
|
5
|
+
|
|
6
|
+
export const load: LayoutServerLoad = () => ({
|
|
7
|
+
aiProviders: getProviderAvailability(env),
|
|
8
|
+
neurolinkProvider: env.NEUROLINK_PROVIDER ?? '',
|
|
9
|
+
});
|
|
@@ -1,12 +1,29 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { LayoutData } from '$lib/types';
|
|
3
|
+
|
|
2
4
|
import '../app.css';
|
|
3
5
|
import '$lib/theme.css';
|
|
6
|
+
import { browser } from '$app/environment';
|
|
4
7
|
import { goto } from '$app/navigation';
|
|
5
8
|
import { page } from '$app/stores';
|
|
6
|
-
import { StatusBadge } from '$lib/modules/client/common';
|
|
9
|
+
import { Icon, StatusBadge } from '$lib/modules/client/common';
|
|
7
10
|
import { onMount, type Snippet } from 'svelte';
|
|
8
11
|
|
|
9
|
-
const { children }: { children: Snippet } = $props();
|
|
12
|
+
const { children, data }: { children: Snippet; data: LayoutData } = $props();
|
|
13
|
+
|
|
14
|
+
// Expose AI provider flags for summarizers (they run outside SvelteKit's data flow)
|
|
15
|
+
$effect(() => {
|
|
16
|
+
if (!browser || !data?.aiProviders) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
(window as unknown as Record<string, unknown>).__aiProviders = data.aiProviders;
|
|
20
|
+
if (data.neurolinkProvider) {
|
|
21
|
+
const proc = (window as unknown as { process?: { env?: Record<string, string> } }).process;
|
|
22
|
+
if (proc?.env) {
|
|
23
|
+
proc.env.NEUROLINK_PROVIDER = data.neurolinkProvider;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
10
27
|
|
|
11
28
|
let systemStatus = $state<'degraded' | 'error' | 'healthy' | 'unknown'>('unknown');
|
|
12
29
|
|
|
@@ -51,7 +68,9 @@
|
|
|
51
68
|
<StatusBadge status={systemStatus} />
|
|
52
69
|
<button
|
|
53
70
|
class="btn-gear {$page.url.pathname === '/config' ? 'btn-gear-active' : ''}"
|
|
54
|
-
onclick={() =>
|
|
71
|
+
onclick={(): void => {
|
|
72
|
+
void goto('/config');
|
|
73
|
+
}}
|
|
55
74
|
aria-label="Settings"
|
|
56
75
|
>
|
|
57
76
|
<svg
|
|
@@ -79,7 +98,7 @@
|
|
|
79
98
|
{@render children()}
|
|
80
99
|
</div>
|
|
81
100
|
|
|
82
|
-
<!-- Bottom tab bar:
|
|
101
|
+
<!-- Bottom tab bar: Dashboard + Activity + Terminals -->
|
|
83
102
|
<nav class="bottom-tabs">
|
|
84
103
|
<div class="bottom-tabs-inner">
|
|
85
104
|
<a
|
|
@@ -97,10 +116,20 @@
|
|
|
97
116
|
stroke-linecap="round"
|
|
98
117
|
stroke-linejoin="round"
|
|
99
118
|
>
|
|
100
|
-
<
|
|
101
|
-
></
|
|
119
|
+
<rect x="3" y="3" width="7" height="7"></rect>
|
|
120
|
+
<rect x="14" y="3" width="7" height="7"></rect>
|
|
121
|
+
<rect x="3" y="14" width="7" height="7"></rect>
|
|
122
|
+
<rect x="14" y="14" width="7" height="7"></rect>
|
|
102
123
|
</svg>
|
|
103
|
-
<span>
|
|
124
|
+
<span>Dashboard</span>
|
|
125
|
+
</a>
|
|
126
|
+
<a
|
|
127
|
+
href="/activity"
|
|
128
|
+
class="tab-item"
|
|
129
|
+
class:active={$page.url.pathname.startsWith('/activity')}
|
|
130
|
+
>
|
|
131
|
+
<Icon name="bell" size={26} />
|
|
132
|
+
<span>Activity</span>
|
|
104
133
|
</a>
|
|
105
134
|
<a
|
|
106
135
|
href="/terminals"
|
package/src/routes/+page.svelte
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { ProjectGroup, ShooterConfig } from '$
|
|
2
|
+
import type { DashboardCard, ProjectGroup, ShooterConfig } from '$lib/types';
|
|
3
3
|
|
|
4
4
|
import { goto } from '$app/navigation';
|
|
5
5
|
import {
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
isShooterConfig,
|
|
12
12
|
setCache,
|
|
13
13
|
} from '$lib/modules/client/common';
|
|
14
|
+
import { connect, DashboardView, disconnect, getCards } from '$lib/modules/client/dashboard';
|
|
14
15
|
import { Banner, Button, Pill, Shimmer } from '@juspay/svelte-ui-components';
|
|
15
16
|
import { onDestroy, onMount } from 'svelte';
|
|
16
17
|
|
|
@@ -26,6 +27,8 @@
|
|
|
26
27
|
let hasMore = $state(false);
|
|
27
28
|
let currentOffset = $state(0);
|
|
28
29
|
|
|
30
|
+
const cards = $derived(getCards());
|
|
31
|
+
|
|
29
32
|
onMount(() => {
|
|
30
33
|
loadConfiguration();
|
|
31
34
|
|
|
@@ -51,6 +54,7 @@
|
|
|
51
54
|
clearInterval(pollTimer);
|
|
52
55
|
pollTimer = null;
|
|
53
56
|
}
|
|
57
|
+
disconnect();
|
|
54
58
|
});
|
|
55
59
|
|
|
56
60
|
function loadConfiguration(): void {
|
|
@@ -60,6 +64,8 @@
|
|
|
60
64
|
const parsed: unknown = JSON.parse(saved);
|
|
61
65
|
if (isShooterConfig(parsed)) {
|
|
62
66
|
config = parsed;
|
|
67
|
+
// Connect dashboard store with API key
|
|
68
|
+
void connect(config.apiKey);
|
|
63
69
|
} else {
|
|
64
70
|
localStorage.removeItem('shooter_config');
|
|
65
71
|
config = null;
|
|
@@ -97,7 +103,7 @@
|
|
|
97
103
|
}
|
|
98
104
|
|
|
99
105
|
fetchError = null;
|
|
100
|
-
const result
|
|
106
|
+
const result = (await response.json()) as { projects: ProjectGroup[]; total?: number };
|
|
101
107
|
if (append) {
|
|
102
108
|
projects = [...projects, ...result.projects];
|
|
103
109
|
} else {
|
|
@@ -129,22 +135,26 @@
|
|
|
129
135
|
void goto('/config');
|
|
130
136
|
}
|
|
131
137
|
|
|
138
|
+
function navigateToTerminal(terminalId: string): void {
|
|
139
|
+
void goto(`/terminals/${terminalId}`);
|
|
140
|
+
}
|
|
141
|
+
|
|
132
142
|
function totalSessionCount(): number {
|
|
133
143
|
return projects.reduce((sum, p) => sum + p.sessionCount, 0);
|
|
134
144
|
}
|
|
135
145
|
</script>
|
|
136
146
|
|
|
137
147
|
<svelte:head>
|
|
138
|
-
<title>
|
|
139
|
-
<meta name="description" content="Claude Code sessions
|
|
148
|
+
<title>Dashboard - Shooter</title>
|
|
149
|
+
<meta name="description" content="Active terminals and Claude Code sessions" />
|
|
140
150
|
</svelte:head>
|
|
141
151
|
|
|
142
152
|
<main class="main">
|
|
143
153
|
<div class="page-header">
|
|
144
154
|
<div class="page-header-content">
|
|
145
155
|
<div>
|
|
146
|
-
<h1 class="page-title">
|
|
147
|
-
<p class="page-description">Claude Code sessions
|
|
156
|
+
<h1 class="page-title">Dashboard</h1>
|
|
157
|
+
<p class="page-description">Active terminals and Claude Code sessions</p>
|
|
148
158
|
</div>
|
|
149
159
|
<div class="page-actions">
|
|
150
160
|
<Button classes="btn-secondary" onclick={forceRefresh} disabled={loading}>
|
|
@@ -159,9 +169,9 @@
|
|
|
159
169
|
<Banner text={fetchError} classes="banner-error" />
|
|
160
170
|
{/if}
|
|
161
171
|
|
|
162
|
-
{#if loading && projects.length === 0}
|
|
172
|
+
{#if loading && projects.length === 0 && cards.length === 0}
|
|
163
173
|
<div class="loading-container">
|
|
164
|
-
{#each Array(
|
|
174
|
+
{#each Array(3) as _, i (i)}
|
|
165
175
|
<Shimmer classes="shimmer-card" />
|
|
166
176
|
{/each}
|
|
167
177
|
</div>
|
|
@@ -173,36 +183,63 @@
|
|
|
173
183
|
>
|
|
174
184
|
<Button classes="btn-primary" onclick={navigateToConfig} text="Configure Settings" />
|
|
175
185
|
</EmptyState>
|
|
176
|
-
{:else if totalSessionCount() === 0}
|
|
177
|
-
<EmptyState
|
|
178
|
-
icon="bell"
|
|
179
|
-
title="No sessions yet"
|
|
180
|
-
description="Claude Code sessions will appear here once JSONL files are found"
|
|
181
|
-
/>
|
|
182
186
|
{:else}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
187
|
+
<!-- Dashboard section: active terminal sessions -->
|
|
188
|
+
{#if cards.length > 0}
|
|
189
|
+
<div class="dashboard-section">
|
|
190
|
+
<DashboardView
|
|
191
|
+
{cards}
|
|
192
|
+
onCardClick={(card: DashboardCard): void => {
|
|
193
|
+
navigateToTerminal(card.terminalId);
|
|
194
|
+
}}
|
|
195
|
+
/>
|
|
196
|
+
</div>
|
|
197
|
+
{/if}
|
|
198
|
+
|
|
199
|
+
<!-- Sessions archive below dashboard -->
|
|
200
|
+
{#if loading && projects.length === 0}
|
|
201
|
+
<div class="loading-container">
|
|
202
|
+
{#each Array(3) as _, i (i)}
|
|
203
|
+
<Shimmer classes="shimmer-card" />
|
|
204
|
+
{/each}
|
|
205
|
+
</div>
|
|
206
|
+
{:else if totalSessionCount() === 0 && cards.length === 0}
|
|
207
|
+
<EmptyState
|
|
208
|
+
icon="bell"
|
|
209
|
+
title="No sessions yet"
|
|
210
|
+
description="Claude Code sessions will appear here once JSONL files are found"
|
|
211
|
+
/>
|
|
212
|
+
{:else if projects.length > 0}
|
|
213
|
+
{#if cards.length > 0}
|
|
214
|
+
<h3 class="section-label">Sessions</h3>
|
|
215
|
+
{/if}
|
|
216
|
+
<div class="projects-container">
|
|
217
|
+
{#each projects as project (project.id)}
|
|
218
|
+
<a href="/project?id={project.id}" class="session-card">
|
|
219
|
+
<div class="session-card-header">
|
|
220
|
+
<div>
|
|
221
|
+
<h3 class="session-card-title">{project.name}</h3>
|
|
222
|
+
<div class="session-card-subtitle">{project.fullPath}</div>
|
|
223
|
+
</div>
|
|
224
|
+
<Pill
|
|
225
|
+
text="Last updated {formatRelativeTime(project.lastModified)}"
|
|
226
|
+
classes="pill-session-time"
|
|
227
|
+
/>
|
|
190
228
|
</div>
|
|
191
|
-
<
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
</a>
|
|
200
|
-
{/each}
|
|
201
|
-
</div>
|
|
202
|
-
{#if hasMore}
|
|
203
|
-
<div style="text-align: center; padding: 1rem;">
|
|
204
|
-
<Button classes="btn-secondary" onclick={loadMore} text="Load More" />
|
|
229
|
+
<div class="session-stats">
|
|
230
|
+
<span
|
|
231
|
+
><strong>{project.sessionCount}</strong>
|
|
232
|
+
{project.sessionCount === 1 ? 'session' : 'sessions'}</span
|
|
233
|
+
>
|
|
234
|
+
</div>
|
|
235
|
+
</a>
|
|
236
|
+
{/each}
|
|
205
237
|
</div>
|
|
238
|
+
{#if hasMore}
|
|
239
|
+
<div style="text-align: center; padding: 1rem;">
|
|
240
|
+
<Button classes="btn-secondary" onclick={loadMore} text="Load More" />
|
|
241
|
+
</div>
|
|
242
|
+
{/if}
|
|
206
243
|
{/if}
|
|
207
244
|
{/if}
|
|
208
245
|
</main>
|
|
@@ -238,6 +275,19 @@
|
|
|
238
275
|
flex-shrink: 0;
|
|
239
276
|
}
|
|
240
277
|
|
|
278
|
+
.dashboard-section {
|
|
279
|
+
margin-bottom: var(--space-6);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.section-label {
|
|
283
|
+
font-size: var(--text-xs, 12px);
|
|
284
|
+
font-weight: 600;
|
|
285
|
+
letter-spacing: 0.08em;
|
|
286
|
+
text-transform: uppercase;
|
|
287
|
+
color: var(--text-secondary);
|
|
288
|
+
margin-bottom: var(--space-3);
|
|
289
|
+
}
|
|
290
|
+
|
|
241
291
|
.projects-container {
|
|
242
292
|
display: flex;
|
|
243
293
|
flex-direction: column;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { browser } from '$app/environment';
|
|
3
|
+
import { goto } from '$app/navigation';
|
|
4
|
+
import { ActivityFeed } from '$lib/modules/client/activity';
|
|
5
|
+
import { isShooterConfig } from '$lib/modules/client/common';
|
|
6
|
+
import { onMount } from 'svelte';
|
|
7
|
+
|
|
8
|
+
let configured = $state(false);
|
|
9
|
+
|
|
10
|
+
onMount(() => {
|
|
11
|
+
if (!browser) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Check config exists
|
|
16
|
+
try {
|
|
17
|
+
const saved = localStorage.getItem('shooter_config');
|
|
18
|
+
if (!saved) {
|
|
19
|
+
void goto('/config');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const parsed: unknown = JSON.parse(saved);
|
|
23
|
+
if (!isShooterConfig(parsed)) {
|
|
24
|
+
localStorage.removeItem('shooter_config');
|
|
25
|
+
void goto('/config');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
configured = true;
|
|
29
|
+
} catch {
|
|
30
|
+
// Malformed config in storage — clear it before redirecting so
|
|
31
|
+
// revisits don't keep bouncing back to /config with stale state.
|
|
32
|
+
localStorage.removeItem('shooter_config');
|
|
33
|
+
void goto('/config');
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<svelte:head>
|
|
39
|
+
<title>Activity Feed - Shooter</title>
|
|
40
|
+
<meta name="description" content="Real-time activity feed" />
|
|
41
|
+
</svelte:head>
|
|
42
|
+
|
|
43
|
+
<main class="main">
|
|
44
|
+
<h1 class="page-title">Activity Feed</h1>
|
|
45
|
+
{#if configured}
|
|
46
|
+
<ActivityFeed />
|
|
47
|
+
{/if}
|
|
48
|
+
</main>
|
|
49
|
+
|
|
50
|
+
<style>
|
|
51
|
+
.page-title {
|
|
52
|
+
font-size: var(--text-2xl);
|
|
53
|
+
font-weight: 600;
|
|
54
|
+
letter-spacing: -0.03em;
|
|
55
|
+
color: var(--text-primary);
|
|
56
|
+
margin-bottom: var(--space-4);
|
|
57
|
+
}
|
|
58
|
+
</style>
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
FCMConfiguration,
|
|
3
|
-
HealthChecks,
|
|
4
|
-
HealthConfiguration,
|
|
5
|
-
HealthStatus,
|
|
6
|
-
} from '$generated/types';
|
|
1
|
+
import type { FCMConfiguration, HealthChecks, HealthConfiguration, HealthStatus } from '$lib/types';
|
|
7
2
|
|
|
8
3
|
import { env } from '$env/dynamic/private';
|
|
9
4
|
import { validateAuth } from '$lib/modules/server/auth';
|
|
5
|
+
import { getProviderAvailability } from '$lib/modules/shared/providers';
|
|
10
6
|
import { json } from '@sveltejs/kit';
|
|
11
7
|
import { readFileSync } from 'fs';
|
|
12
8
|
import { join } from 'path';
|
|
13
9
|
|
|
14
10
|
import type { RequestHandler } from './$types';
|
|
15
11
|
|
|
16
|
-
const PKG_VERSION: string = (() => {
|
|
12
|
+
const PKG_VERSION: string = ((): string => {
|
|
17
13
|
const root = process.env.SHOOTER_PKG_ROOT || process.cwd();
|
|
18
14
|
try {
|
|
19
|
-
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8')) as {
|
|
15
|
+
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8')) as {
|
|
16
|
+
version?: string;
|
|
17
|
+
};
|
|
20
18
|
return pkg.version || 'unknown';
|
|
21
19
|
} catch {
|
|
22
20
|
return 'unknown';
|
|
@@ -76,19 +74,26 @@ export const GET: RequestHandler = ({ request, url }) => {
|
|
|
76
74
|
warnings.push('FCM not configured — Android push notifications disabled');
|
|
77
75
|
}
|
|
78
76
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
77
|
+
// AI provider checks
|
|
78
|
+
const aiProviders = getProviderAvailability(env);
|
|
79
|
+
const hasAnyAiProvider = Object.values(aiProviders).some(Boolean);
|
|
80
|
+
|
|
81
|
+
if (!hasAnyAiProvider) {
|
|
82
|
+
warnings.push(
|
|
83
|
+
'No AI provider configured — AI summaries disabled. Run "shooter setup" to configure.'
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const health = {
|
|
88
|
+
ai: {
|
|
89
|
+
activeProvider: env.NEUROLINK_PROVIDER ?? 'auto',
|
|
90
|
+
hasAnyProvider: hasAnyAiProvider,
|
|
91
|
+
providers: aiProviders,
|
|
92
|
+
},
|
|
88
93
|
checks,
|
|
89
94
|
configuration,
|
|
90
95
|
environment: env.NODE_ENV || 'development',
|
|
91
|
-
status: 'healthy',
|
|
96
|
+
status: 'healthy' as HealthStatus,
|
|
92
97
|
timestamp: new Date().toISOString(),
|
|
93
98
|
version: PKG_VERSION,
|
|
94
99
|
warnings,
|
|
@@ -101,7 +106,15 @@ export const GET: RequestHandler = ({ request, url }) => {
|
|
|
101
106
|
|
|
102
107
|
// Public response: status + warnings. Authenticated: full details.
|
|
103
108
|
if (!wantsDetails) {
|
|
104
|
-
|
|
109
|
+
// Filter AI provider configuration warnings from the unauthenticated
|
|
110
|
+
// response so we don't leak system capability details to anonymous callers.
|
|
111
|
+
const publicWarnings = health.warnings.filter((w) => !w.includes('AI provider'));
|
|
112
|
+
return json({
|
|
113
|
+
status: health.status,
|
|
114
|
+
timestamp: health.timestamp,
|
|
115
|
+
version: health.version,
|
|
116
|
+
warnings: publicWarnings,
|
|
117
|
+
});
|
|
105
118
|
}
|
|
106
119
|
|
|
107
120
|
return json(health);
|