@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
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { SessionViewResponse, ShooterConfig } from '$generated/types';
|
|
3
2
|
import type {
|
|
4
3
|
ConversationMessage,
|
|
5
4
|
MessagePart,
|
|
6
5
|
SessionInfo,
|
|
6
|
+
SessionViewResponse,
|
|
7
|
+
ShooterConfig,
|
|
7
8
|
ToolUsePart,
|
|
8
|
-
} from '$lib/
|
|
9
|
+
} from '$lib/types';
|
|
9
10
|
|
|
10
11
|
import { browser } from '$app/environment';
|
|
11
12
|
import { page } from '$app/state';
|
|
@@ -26,7 +27,9 @@
|
|
|
26
27
|
|
|
27
28
|
// Terminal + WS connection state
|
|
28
29
|
let connectedTerminalId = $state<null | string>(null);
|
|
29
|
-
let chatConnectionState = $state<
|
|
30
|
+
let chatConnectionState = $state<
|
|
31
|
+
'connected' | 'connecting' | 'disconnected' | 'idle' | 'reconnecting'
|
|
32
|
+
>('idle');
|
|
30
33
|
// sendStatus:
|
|
31
34
|
// 'idle' = no terminal yet; input ready for first send
|
|
32
35
|
// 'connecting' = calling /api/sessions/connect
|
|
@@ -52,7 +55,9 @@
|
|
|
52
55
|
function getConfig(): null | ShooterConfig {
|
|
53
56
|
try {
|
|
54
57
|
const saved = localStorage.getItem('shooter_config');
|
|
55
|
-
if (!saved) {
|
|
58
|
+
if (!saved) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
56
61
|
return JSON.parse(saved) as ShooterConfig;
|
|
57
62
|
} catch {
|
|
58
63
|
return null;
|
|
@@ -61,14 +66,18 @@
|
|
|
61
66
|
|
|
62
67
|
async function getWsTicket(): Promise<null | string> {
|
|
63
68
|
const config = getConfig();
|
|
64
|
-
if (!config) {
|
|
69
|
+
if (!config) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
65
72
|
try {
|
|
66
73
|
const res = await fetch('/api/ws-ticket', {
|
|
67
74
|
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
68
75
|
method: 'POST',
|
|
69
76
|
});
|
|
70
|
-
if (!res.ok) {
|
|
71
|
-
|
|
77
|
+
if (!res.ok) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const data = (await res.json()) as { ticket: string };
|
|
72
81
|
return data.ticket;
|
|
73
82
|
} catch {
|
|
74
83
|
return null;
|
|
@@ -78,7 +87,9 @@
|
|
|
78
87
|
// --- Session WS (receive chat messages) ---
|
|
79
88
|
|
|
80
89
|
async function connectSessionWs(sessionWsPath: string, termId: string): Promise<void> {
|
|
81
|
-
if (disposed) {
|
|
90
|
+
if (disposed) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
82
93
|
|
|
83
94
|
// Avoid stacking connections
|
|
84
95
|
if (
|
|
@@ -89,7 +100,9 @@
|
|
|
89
100
|
}
|
|
90
101
|
|
|
91
102
|
const ticket = await getWsTicket();
|
|
92
|
-
if (!ticket || disposed) {
|
|
103
|
+
if (!ticket || disposed) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
93
106
|
|
|
94
107
|
chatConnectionState = 'connecting';
|
|
95
108
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
@@ -97,24 +110,38 @@
|
|
|
97
110
|
`${protocol}//${window.location.host}${sessionWsPath}?ticket=${ticket}`
|
|
98
111
|
);
|
|
99
112
|
|
|
100
|
-
socket.onopen = () => {
|
|
101
|
-
if (disposed) {
|
|
113
|
+
socket.onopen = (): void => {
|
|
114
|
+
if (disposed) {
|
|
115
|
+
socket.close();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
102
118
|
chatConnectionState = 'connected';
|
|
103
119
|
socket.send(JSON.stringify({ sessionId: termId, type: 'subscribe' }));
|
|
104
120
|
};
|
|
105
121
|
|
|
106
|
-
socket.onmessage = (event) => {
|
|
107
|
-
if (disposed) {
|
|
108
|
-
|
|
122
|
+
socket.onmessage = (event: MessageEvent): void => {
|
|
123
|
+
if (disposed) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(event.data as string) as Record<string, unknown>;
|
|
128
|
+
handleSessionMessage(parsed);
|
|
129
|
+
} catch {
|
|
130
|
+
/* ignore */
|
|
131
|
+
}
|
|
109
132
|
};
|
|
110
133
|
|
|
111
|
-
socket.onclose = () => {
|
|
112
|
-
if (disposed) {
|
|
134
|
+
socket.onclose = (): void => {
|
|
135
|
+
if (disposed) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
113
138
|
chatConnectionState = 'disconnected';
|
|
114
139
|
sessionWs = null;
|
|
115
140
|
if (connectedTerminalId) {
|
|
116
|
-
if (sessionReconnectTimer) {
|
|
117
|
-
|
|
141
|
+
if (sessionReconnectTimer) {
|
|
142
|
+
clearTimeout(sessionReconnectTimer);
|
|
143
|
+
}
|
|
144
|
+
sessionReconnectTimer = setTimeout((): void => {
|
|
118
145
|
sessionReconnectTimer = null;
|
|
119
146
|
if (!disposed && connectedTerminalId) {
|
|
120
147
|
void connectSessionWs(`/ws/session/${connectedTerminalId}`, connectedTerminalId);
|
|
@@ -123,8 +150,10 @@
|
|
|
123
150
|
}
|
|
124
151
|
};
|
|
125
152
|
|
|
126
|
-
socket.onerror = () => {
|
|
127
|
-
if (!disposed) {
|
|
153
|
+
socket.onerror = (): void => {
|
|
154
|
+
if (!disposed) {
|
|
155
|
+
chatConnectionState = 'disconnected';
|
|
156
|
+
}
|
|
128
157
|
};
|
|
129
158
|
|
|
130
159
|
sessionWs = socket;
|
|
@@ -133,16 +162,23 @@
|
|
|
133
162
|
// --- Terminal WS (send PTY input only) ---
|
|
134
163
|
|
|
135
164
|
async function connectTerminalWs(wsPath: string): Promise<void> {
|
|
136
|
-
if (disposed) {
|
|
165
|
+
if (disposed) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
137
168
|
|
|
138
169
|
const ticket = await getWsTicket();
|
|
139
|
-
if (!ticket || disposed) {
|
|
170
|
+
if (!ticket || disposed) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
140
173
|
|
|
141
174
|
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
142
175
|
const ws = new WebSocket(`${protocol}//${window.location.host}${wsPath}?ticket=${ticket}`);
|
|
143
176
|
|
|
144
|
-
ws.onopen = () => {
|
|
145
|
-
if (disposed) {
|
|
177
|
+
ws.onopen = (): void => {
|
|
178
|
+
if (disposed) {
|
|
179
|
+
ws.close();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
146
182
|
terminalWs = ws;
|
|
147
183
|
if (sendStatus === 'ready' && pendingMessage) {
|
|
148
184
|
ws.send(JSON.stringify({ data: `${pendingMessage}\n`, type: 'input' }));
|
|
@@ -150,8 +186,10 @@
|
|
|
150
186
|
}
|
|
151
187
|
};
|
|
152
188
|
|
|
153
|
-
ws.onclose = () => {
|
|
154
|
-
if (terminalWs === ws) {
|
|
189
|
+
ws.onclose = (): void => {
|
|
190
|
+
if (terminalWs === ws) {
|
|
191
|
+
terminalWs = null;
|
|
192
|
+
}
|
|
155
193
|
};
|
|
156
194
|
}
|
|
157
195
|
|
|
@@ -243,10 +281,7 @@
|
|
|
243
281
|
const thinkPart: MessagePart = { content: (msg.text as string) || '', type: 'thinking' };
|
|
244
282
|
const lastMsg = messages.length > 0 ? messages[messages.length - 1] : null;
|
|
245
283
|
if (lastMsg?.role === 'assistant') {
|
|
246
|
-
messages = [
|
|
247
|
-
...messages.slice(0, -1),
|
|
248
|
-
{ ...lastMsg, parts: [...lastMsg.parts, thinkPart] },
|
|
249
|
-
];
|
|
284
|
+
messages = [...messages.slice(0, -1), { ...lastMsg, parts: [...lastMsg.parts, thinkPart] }];
|
|
250
285
|
} else {
|
|
251
286
|
messages = [
|
|
252
287
|
...messages,
|
|
@@ -266,10 +301,16 @@
|
|
|
266
301
|
// --- Connect + send flow ---
|
|
267
302
|
|
|
268
303
|
async function connectAndSend(): Promise<void> {
|
|
269
|
-
if (!session || disposed) {
|
|
304
|
+
if (!session || disposed) {
|
|
305
|
+
sendStatus = 'idle';
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
270
308
|
|
|
271
309
|
const config = getConfig();
|
|
272
|
-
if (!config) {
|
|
310
|
+
if (!config) {
|
|
311
|
+
sendStatus = 'idle';
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
273
314
|
|
|
274
315
|
sendStatus = 'connecting';
|
|
275
316
|
|
|
@@ -284,9 +325,12 @@
|
|
|
284
325
|
method: 'POST',
|
|
285
326
|
});
|
|
286
327
|
|
|
287
|
-
if (!res.ok || disposed) {
|
|
328
|
+
if (!res.ok || disposed) {
|
|
329
|
+
sendStatus = 'idle';
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
288
332
|
|
|
289
|
-
const result
|
|
333
|
+
const result = (await res.json()) as { sessionWs: string; terminalId: string; ws: string };
|
|
290
334
|
connectedTerminalId = result.terminalId;
|
|
291
335
|
sendStatus = 'resuming';
|
|
292
336
|
|
|
@@ -300,7 +344,9 @@
|
|
|
300
344
|
// --- Called by ChatView on submit ---
|
|
301
345
|
|
|
302
346
|
function sendMessage(text: string): void {
|
|
303
|
-
if (!text.trim()) {
|
|
347
|
+
if (!text.trim()) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
304
350
|
|
|
305
351
|
if (sendStatus === 'ready' && terminalWs?.readyState === WebSocket.OPEN) {
|
|
306
352
|
terminalWs.send(JSON.stringify({ data: `${text}\n`, type: 'input' }));
|
|
@@ -321,8 +367,12 @@
|
|
|
321
367
|
// --- REST fetch (initial messages) ---
|
|
322
368
|
|
|
323
369
|
async function fetchSession(): Promise<void> {
|
|
324
|
-
if (!browser) {
|
|
325
|
-
|
|
370
|
+
if (!browser) {
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
if (messages.length === 0) {
|
|
374
|
+
loading = true;
|
|
375
|
+
}
|
|
326
376
|
|
|
327
377
|
try {
|
|
328
378
|
const config = getConfig();
|
|
@@ -348,8 +398,9 @@
|
|
|
348
398
|
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
349
399
|
});
|
|
350
400
|
if (projectsRes.ok) {
|
|
351
|
-
const projectsData
|
|
352
|
-
|
|
401
|
+
const projectsData = (await projectsRes.json()) as {
|
|
402
|
+
projects?: { id: string; sessions?: { id: string }[] }[];
|
|
403
|
+
};
|
|
353
404
|
for (const project of projectsData.projects || []) {
|
|
354
405
|
if ((project.sessions || []).find((s) => s.id === sid)) {
|
|
355
406
|
res = await fetch(
|
|
@@ -362,11 +413,17 @@
|
|
|
362
413
|
}
|
|
363
414
|
}
|
|
364
415
|
|
|
365
|
-
if (!res.ok) {
|
|
416
|
+
if (!res.ok) {
|
|
417
|
+
error = 'Session not found';
|
|
418
|
+
loading = false;
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
366
421
|
|
|
367
|
-
const data
|
|
422
|
+
const data = (await res.json()) as SessionViewResponse;
|
|
368
423
|
session = data.session as SessionInfo;
|
|
369
|
-
const rawMessages = Array.isArray(data.messages)
|
|
424
|
+
const rawMessages = Array.isArray(data.messages)
|
|
425
|
+
? (data.messages as unknown as ConversationMessage[])
|
|
426
|
+
: [];
|
|
370
427
|
messages = rawMessages;
|
|
371
428
|
hasMoreMessages = rawMessages.length >= currentLimit;
|
|
372
429
|
setCache(`shooter_session_${sid}`, { messages: rawMessages, session: data.session });
|
|
@@ -377,9 +434,13 @@
|
|
|
377
434
|
}
|
|
378
435
|
|
|
379
436
|
async function loadEarlierMessages(): Promise<void> {
|
|
380
|
-
if (!browser || loadingMore) {
|
|
437
|
+
if (!browser || loadingMore) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
381
440
|
const config = getConfig();
|
|
382
|
-
if (!config) {
|
|
441
|
+
if (!config) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
383
444
|
|
|
384
445
|
loadingMore = true;
|
|
385
446
|
try {
|
|
@@ -387,18 +448,28 @@
|
|
|
387
448
|
const sid = sessionId || '';
|
|
388
449
|
const pid = projectId || '';
|
|
389
450
|
const queryParts = [`id=${encodeURIComponent(sid)}`, `limit=${newLimit}`];
|
|
390
|
-
if (pid) {
|
|
451
|
+
if (pid) {
|
|
452
|
+
queryParts.push(`project=${encodeURIComponent(pid)}`);
|
|
453
|
+
}
|
|
391
454
|
const res = await fetch(`/api/sessions?${queryParts.join('&')}`, {
|
|
392
455
|
headers: { Authorization: `Bearer ${config.apiKey}` },
|
|
393
456
|
});
|
|
394
|
-
if (!res.ok) {
|
|
395
|
-
|
|
396
|
-
|
|
457
|
+
if (!res.ok) {
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
const data = (await res.json()) as SessionViewResponse;
|
|
461
|
+
const rawMessages = Array.isArray(data.messages)
|
|
462
|
+
? (data.messages as unknown as ConversationMessage[])
|
|
463
|
+
: [];
|
|
397
464
|
messages = rawMessages;
|
|
398
465
|
currentLimit = newLimit;
|
|
399
466
|
hasMoreMessages = rawMessages.length >= newLimit;
|
|
400
467
|
setCache(`shooter_session_${sid}`, { messages: rawMessages, session: data.session });
|
|
401
|
-
} catch {
|
|
468
|
+
} catch {
|
|
469
|
+
/* best effort */
|
|
470
|
+
} finally {
|
|
471
|
+
loadingMore = false;
|
|
472
|
+
}
|
|
402
473
|
}
|
|
403
474
|
|
|
404
475
|
// --- Lifecycle ---
|
|
@@ -416,11 +487,15 @@
|
|
|
416
487
|
}
|
|
417
488
|
|
|
418
489
|
void fetchSession().then(async () => {
|
|
419
|
-
if (!session || disposed) {
|
|
490
|
+
if (!session || disposed) {
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
420
493
|
|
|
421
494
|
// Check if there's already a running terminal for this session
|
|
422
495
|
const config = getConfig();
|
|
423
|
-
if (!config) {
|
|
496
|
+
if (!config) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
424
499
|
|
|
425
500
|
try {
|
|
426
501
|
const command = session.source === 'opencode' ? 'opencode' : 'claude';
|
|
@@ -439,19 +514,27 @@
|
|
|
439
514
|
});
|
|
440
515
|
|
|
441
516
|
if (res.ok && !disposed) {
|
|
442
|
-
const result
|
|
517
|
+
const result = (await res.json()) as {
|
|
518
|
+
sessionWs: string;
|
|
519
|
+
terminalId: string;
|
|
520
|
+
ws: string;
|
|
521
|
+
};
|
|
443
522
|
connectedTerminalId = result.terminalId;
|
|
444
523
|
sendStatus = 'resuming';
|
|
445
524
|
void connectSessionWs(result.sessionWs, result.terminalId);
|
|
446
525
|
void connectTerminalWs(result.ws);
|
|
447
526
|
}
|
|
448
527
|
// 404 = no existing terminal, that's fine
|
|
449
|
-
} catch {
|
|
528
|
+
} catch {
|
|
529
|
+
/* ignore */
|
|
530
|
+
}
|
|
450
531
|
});
|
|
451
532
|
|
|
452
|
-
return () => {
|
|
533
|
+
return (): void => {
|
|
453
534
|
disposed = true;
|
|
454
|
-
if (sessionReconnectTimer) {
|
|
535
|
+
if (sessionReconnectTimer) {
|
|
536
|
+
clearTimeout(sessionReconnectTimer);
|
|
537
|
+
}
|
|
455
538
|
sessionWs?.close();
|
|
456
539
|
terminalWs?.close();
|
|
457
540
|
};
|
|
@@ -501,11 +584,7 @@
|
|
|
501
584
|
<div class="session-chat-container">
|
|
502
585
|
{#if hasMoreMessages}
|
|
503
586
|
<div class="load-earlier-row">
|
|
504
|
-
<button
|
|
505
|
-
class="load-earlier-btn"
|
|
506
|
-
onclick={loadEarlierMessages}
|
|
507
|
-
disabled={loadingMore}
|
|
508
|
-
>
|
|
587
|
+
<button class="load-earlier-btn" onclick={loadEarlierMessages} disabled={loadingMore}>
|
|
509
588
|
{loadingMore ? 'Loading...' : 'Load earlier messages'}
|
|
510
589
|
</button>
|
|
511
590
|
</div>
|
|
@@ -570,8 +649,13 @@
|
|
|
570
649
|
}
|
|
571
650
|
|
|
572
651
|
@keyframes pulse {
|
|
573
|
-
0%,
|
|
574
|
-
|
|
652
|
+
0%,
|
|
653
|
+
100% {
|
|
654
|
+
opacity: 1;
|
|
655
|
+
}
|
|
656
|
+
50% {
|
|
657
|
+
opacity: 0.4;
|
|
658
|
+
}
|
|
575
659
|
}
|
|
576
660
|
|
|
577
661
|
.connection-dot {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { ShooterConfig, TerminalListItem } from '$
|
|
2
|
+
import type { ShooterConfig, TerminalListItem } from '$lib/types';
|
|
3
3
|
|
|
4
4
|
import { goto } from '$app/navigation';
|
|
5
5
|
import {
|
|
@@ -343,7 +343,7 @@
|
|
|
343
343
|
</span>
|
|
344
344
|
<Button
|
|
345
345
|
classes="btn-ghost btn-sm btn-remove"
|
|
346
|
-
onclick={(e) => removeTerminal(e, terminal.id)}
|
|
346
|
+
onclick={(e: MouseEvent): void => void removeTerminal(e, terminal.id)}
|
|
347
347
|
text="×"
|
|
348
348
|
/>
|
|
349
349
|
</div>
|