@juspay/shooter 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/notifier.cjs +15 -1
- package/README.md +132 -36
- package/bin/shooter.cjs +98 -29
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css +1 -0
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.br +0 -0
- package/build/client/_app/immutable/assets/2.Dk9NfqnS.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.DHxQoulp.css +1 -0
- package/build/client/_app/immutable/assets/3.DHxQoulp.css.br +0 -0
- package/build/client/_app/immutable/assets/3.DHxQoulp.css.gz +0 -0
- package/build/client/_app/immutable/assets/{3.DGDHCVnW.css → 4.D5l1JxgO.css} +1 -1
- package/build/client/_app/immutable/assets/4.D5l1JxgO.css.br +0 -0
- package/build/client/_app/immutable/assets/4.D5l1JxgO.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.C5qz-NeI.css +1 -0
- package/build/client/_app/immutable/assets/5.C5qz-NeI.css.br +0 -0
- package/build/client/_app/immutable/assets/5.C5qz-NeI.css.gz +0 -0
- package/build/client/_app/immutable/chunks/1mEchsPO.js +1 -0
- package/build/client/_app/immutable/chunks/1mEchsPO.js.br +0 -0
- package/build/client/_app/immutable/chunks/1mEchsPO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B7X-vhXI.js +1 -0
- package/build/client/_app/immutable/chunks/B7X-vhXI.js.br +0 -0
- package/build/client/_app/immutable/chunks/B7X-vhXI.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BRkqKgVG.js +1 -0
- package/build/client/_app/immutable/chunks/BRkqKgVG.js.br +0 -0
- package/build/client/_app/immutable/chunks/BRkqKgVG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BfJ-f-Tu.js +1 -0
- package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.br +2 -0
- package/build/client/_app/immutable/chunks/BfJ-f-Tu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CGMJxf7r.js +1 -0
- package/build/client/_app/immutable/chunks/CGMJxf7r.js.br +0 -0
- package/build/client/_app/immutable/chunks/CGMJxf7r.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CZHsSL_X.js → CJFjKwJ7.js} +1 -1
- package/build/client/_app/immutable/chunks/CJFjKwJ7.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJFjKwJ7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CNH2HlKj.js +20 -0
- package/build/client/_app/immutable/chunks/CNH2HlKj.js.br +0 -0
- package/build/client/_app/immutable/chunks/CNH2HlKj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CR6bkGJW.js +6 -0
- package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
- package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CVtJ6yRM.js +1 -0
- package/build/client/_app/immutable/chunks/CVtJ6yRM.js.br +0 -0
- package/build/client/_app/immutable/chunks/CVtJ6yRM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CSoRdFvv.js → CaiJSUi3.js} +1 -1
- package/build/client/_app/immutable/chunks/CaiJSUi3.js.br +0 -0
- package/build/client/_app/immutable/chunks/CaiJSUi3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DjsDGxCa.js → CmczWE_d.js} +4 -4
- package/build/client/_app/immutable/chunks/CmczWE_d.js.br +0 -0
- package/build/client/_app/immutable/chunks/CmczWE_d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CDVSripB.js → CqfYvnci.js} +1 -1
- package/build/client/_app/immutable/chunks/CqfYvnci.js.br +0 -0
- package/build/client/_app/immutable/chunks/CqfYvnci.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CsgHjHGZ.js +1 -0
- package/build/client/_app/immutable/chunks/CsgHjHGZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/CsgHjHGZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{UJOiqIYE.js → CtrCjGZT.js} +1 -1
- package/build/client/_app/immutable/chunks/CtrCjGZT.js.br +0 -0
- package/build/client/_app/immutable/chunks/CtrCjGZT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DDiOVAd8.js +61 -0
- package/build/client/_app/immutable/chunks/DDiOVAd8.js.br +0 -0
- package/build/client/_app/immutable/chunks/DDiOVAd8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVl0sebP.js +2 -0
- package/build/client/_app/immutable/chunks/DVl0sebP.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVl0sebP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js +3 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js.br +0 -0
- package/build/client/_app/immutable/chunks/EhLZwqfu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gQJcRhou.js +1 -0
- package/build/client/_app/immutable/chunks/gQJcRhou.js.br +0 -0
- package/build/client/_app/immutable/chunks/gQJcRhou.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pRcLbE0d.js +1 -0
- package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
- package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CF4lQ45j.js → y_g-KC7l.js} +1 -1
- package/build/client/_app/immutable/chunks/y_g-KC7l.js.br +0 -0
- package/build/client/_app/immutable/chunks/y_g-KC7l.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js +2 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js.br +0 -0
- package/build/client/_app/immutable/entry/app.zJvbFXsj.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js +1 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.br +2 -0
- package/build/client/_app/immutable/entry/start.B2Jf5iFd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js +1 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.B_E4j3MX.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js +1 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B0oFqb8X.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js +13 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.Bqul0XyM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js +9 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CTqUQKSN.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.B_pbOZoD.js +4 -0
- package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.B_pbOZoD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.CdLPNo5-.js +1 -0
- package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.CdLPNo5-.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js +1 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BvjUfHnH.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.g3R-QfIW.js → 7.5K7Od8ba.js} +3 -3
- package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.5K7Od8ba.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js +2 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.Bs1DrW0_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js +2 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.1fMlGdqv.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/0-e1fgD9Mi.js +23 -0
- package/build/server/chunks/0-e1fgD9Mi.js.map +1 -0
- package/build/server/chunks/1-D2_XVthm.js +9 -0
- package/build/server/chunks/{1-BV7u1xGo.js.map → 1-D2_XVthm.js.map} +1 -1
- package/build/server/chunks/2-DADX86JZ.js +21 -0
- package/build/server/chunks/2-DADX86JZ.js.map +1 -0
- package/build/server/chunks/3-CHacdiCg.js +21 -0
- package/build/server/chunks/3-CHacdiCg.js.map +1 -0
- package/build/server/chunks/4-0UE_6Ep-.js +23 -0
- package/build/server/chunks/4-0UE_6Ep-.js.map +1 -0
- package/build/server/chunks/5-BBIP1PzX.js +24 -0
- package/build/server/chunks/5-BBIP1PzX.js.map +1 -0
- package/build/server/chunks/6-CWLNQu6F.js +9 -0
- package/build/server/chunks/6-CWLNQu6F.js.map +1 -0
- package/build/server/chunks/7-DmQ3B8uy.js +9 -0
- package/build/server/chunks/7-DmQ3B8uy.js.map +1 -0
- package/build/server/chunks/8-CnFVjQtZ.js +9 -0
- package/build/server/chunks/8-CnFVjQtZ.js.map +1 -0
- package/build/server/chunks/9-Dw7-P6aF.js +9 -0
- package/build/server/chunks/9-Dw7-P6aF.js.map +1 -0
- package/build/server/chunks/{Button-Cs1aE6ka.js → Button-WKgiLWZI.js} +4 -9
- package/build/server/chunks/Button-WKgiLWZI.js.map +1 -0
- package/build/server/chunks/{EmptyState-DDFH1K8g.js → EmptyState-BUBqASsp.js} +3 -3
- package/build/server/chunks/{EmptyState-DDFH1K8g.js.map → EmptyState-BUBqASsp.js.map} +1 -1
- package/build/server/chunks/{Icon-CEUrotA6.js → Icon-BNBAg85a.js} +3 -3
- package/build/server/chunks/Icon-BNBAg85a.js.map +1 -0
- package/build/server/chunks/{Shimmer-DB8W1zt6.js → Shimmer-C4uBVwxz.js} +2 -2
- package/build/server/chunks/{Shimmer-DB8W1zt6.js.map → Shimmer-C4uBVwxz.js.map} +1 -1
- package/build/server/chunks/{_error.svelte-uCOJNxvr.js → _error.svelte-DkIwmECt.js} +5 -5
- package/build/server/chunks/{_error.svelte-uCOJNxvr.js.map → _error.svelte-DkIwmECt.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-CtWmEJwe.js → _layout.svelte-DllETxmJ.js} +13 -7
- package/build/server/chunks/_layout.svelte-DllETxmJ.js.map +1 -0
- package/build/server/chunks/_page.svelte-BZSdLKE_.js +118 -0
- package/build/server/chunks/_page.svelte-BZSdLKE_.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CxWcQ0Am.js → _page.svelte-Cmuco1mC.js} +84 -199
- package/build/server/chunks/_page.svelte-Cmuco1mC.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BgevQjq1.js → _page.svelte-Co5sF7W-.js} +12 -11
- package/build/server/chunks/{_page.svelte-BgevQjq1.js.map → _page.svelte-Co5sF7W-.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-DO4oa_LY.js → _page.svelte-CpL3R-VI.js} +8 -8
- package/build/server/chunks/{_page.svelte-DO4oa_LY.js.map → _page.svelte-CpL3R-VI.js.map} +1 -1
- package/build/server/chunks/_page.svelte-DDSzYLUs.js +137 -0
- package/build/server/chunks/_page.svelte-DDSzYLUs.js.map +1 -0
- package/build/server/chunks/_page.svelte-JIkgFUFf.js +26 -0
- package/build/server/chunks/_page.svelte-JIkgFUFf.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CVq6tRb3.js → _page.svelte-Y9-O5a5w.js} +10 -9
- package/build/server/chunks/_page.svelte-Y9-O5a5w.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BcZaKdX9.js → _page.svelte-fcX09N4d.js} +9 -9
- package/build/server/chunks/{_page.svelte-BcZaKdX9.js.map → _page.svelte-fcX09N4d.js.map} +1 -1
- package/build/server/chunks/{_server.ts-DYpJImqd.js → _server.ts-0Xr2fWaq.js} +9 -5
- package/build/server/chunks/_server.ts-0Xr2fWaq.js.map +1 -0
- package/build/server/chunks/{_server.ts-CTpcLUH8.js → _server.ts-2ixC-X3K.js} +20 -5
- package/build/server/chunks/_server.ts-2ixC-X3K.js.map +1 -0
- package/build/server/chunks/{_server.ts-CAxsWKvS.js → _server.ts-40c_epk8.js} +20 -4
- package/build/server/chunks/_server.ts-40c_epk8.js.map +1 -0
- package/build/server/chunks/{_server.ts-WhTJBEJy.js → _server.ts-A9_tRR-K.js} +5 -4
- package/build/server/chunks/{_server.ts-WhTJBEJy.js.map → _server.ts-A9_tRR-K.js.map} +1 -1
- package/build/server/chunks/_server.ts-BRAzC6W1.js +98 -0
- package/build/server/chunks/_server.ts-BRAzC6W1.js.map +1 -0
- package/build/server/chunks/{_server.ts-DB_Kg97c.js → _server.ts-BScvgttw.js} +24 -4
- package/build/server/chunks/_server.ts-BScvgttw.js.map +1 -0
- package/build/server/chunks/{_server.ts-Ch-6iOHp.js → _server.ts-B__YN2kX.js} +121 -87
- package/build/server/chunks/_server.ts-B__YN2kX.js.map +1 -0
- package/build/server/chunks/{_server.ts-tSpgyl1D.js → _server.ts-Bjbr7glm.js} +4 -3
- package/build/server/chunks/_server.ts-Bjbr7glm.js.map +1 -0
- package/build/server/chunks/{_server.ts-COu0vNpd.js → _server.ts-BrqaMMAa.js} +7 -6
- package/build/server/chunks/_server.ts-BrqaMMAa.js.map +1 -0
- package/build/server/chunks/{_server.ts-vekTmWAx.js → _server.ts-BuYyCrnF.js} +6 -4
- package/build/server/chunks/_server.ts-BuYyCrnF.js.map +1 -0
- package/build/server/chunks/{_server.ts-Deok2y88.js → _server.ts-ByIrRtCx.js} +132 -76
- package/build/server/chunks/_server.ts-ByIrRtCx.js.map +1 -0
- package/build/server/chunks/{_server.ts-DYvb9ijZ.js → _server.ts-ByPExYfO.js} +4 -3
- package/build/server/chunks/{_server.ts-DYvb9ijZ.js.map → _server.ts-ByPExYfO.js.map} +1 -1
- package/build/server/chunks/_server.ts-CjpQ10xh.js +123 -0
- package/build/server/chunks/_server.ts-CjpQ10xh.js.map +1 -0
- package/build/server/chunks/_server.ts-CyjDrcZN.js +21 -0
- package/build/server/chunks/_server.ts-CyjDrcZN.js.map +1 -0
- package/build/server/chunks/{_server.ts-DV8zTCF9.js → _server.ts-DOGUMzPx.js} +4 -3
- package/build/server/chunks/{_server.ts-DV8zTCF9.js.map → _server.ts-DOGUMzPx.js.map} +1 -1
- package/build/server/chunks/_server.ts-DZvfyuNj.js +15 -0
- package/build/server/chunks/_server.ts-DZvfyuNj.js.map +1 -0
- package/build/server/chunks/{_server.ts-XzT2UHM1.js → _server.ts-DkPPTUPo.js} +4 -3
- package/build/server/chunks/{_server.ts-XzT2UHM1.js.map → _server.ts-DkPPTUPo.js.map} +1 -1
- package/build/server/chunks/{auth-DeCdZ83n.js → auth-DuunT7Cg.js} +2 -2
- package/build/server/chunks/{auth-DeCdZ83n.js.map → auth-DuunT7Cg.js.map} +1 -1
- package/build/server/chunks/{client-BdGHe_hY.js → client-DRtPDkMh.js} +4 -4
- package/build/server/chunks/{client-BdGHe_hY.js.map → client-DRtPDkMh.js.map} +1 -1
- package/build/server/chunks/client2-bqqmu0b7.js +7 -0
- package/build/server/chunks/{client2-CCBGA-2V.js.map → client2-bqqmu0b7.js.map} +1 -1
- package/build/server/chunks/close-BGlLztTb.js +192 -0
- package/build/server/chunks/close-BGlLztTb.js.map +1 -0
- package/build/server/chunks/events-handler-Dm1mNPQP.js +20 -0
- package/build/server/chunks/events-handler-Dm1mNPQP.js.map +1 -0
- package/build/server/chunks/html-FW6Ia4bL.js +8 -0
- package/build/server/chunks/html-FW6Ia4bL.js.map +1 -0
- package/build/server/chunks/{shared-server-sSGG17Df.js → index-CoD1IJuy.js} +2 -11
- package/build/server/chunks/index-CoD1IJuy.js.map +1 -0
- package/build/server/chunks/{index-DwaY1cAm.js → index-DP9bWJrR.js} +2 -2
- package/build/server/chunks/{index-DwaY1cAm.js.map → index-DP9bWJrR.js.map} +1 -1
- package/build/server/chunks/{index-server-CrDaL06Y.js → index-server-BUmV4MIG.js} +2 -2
- package/build/server/chunks/index-server-BUmV4MIG.js.map +1 -0
- package/build/server/chunks/index-server2-BJrT0wnA.js +5 -0
- package/build/server/chunks/index-server2-BJrT0wnA.js.map +1 -0
- package/build/server/chunks/{index2-CgclKpUj.js → index2-D5Y19GKR.js} +2 -2
- package/build/server/chunks/index2-D5Y19GKR.js.map +1 -0
- package/build/server/chunks/{library-apns-BqJbvSKh.js → library-apns-Cf-E-DhM.js} +5 -2
- package/build/server/chunks/library-apns-Cf-E-DhM.js.map +1 -0
- package/build/server/chunks/providers-DtstoHQ0.js +17 -0
- package/build/server/chunks/providers-DtstoHQ0.js.map +1 -0
- package/build/server/chunks/{pty-manager-BQVB7IVj.js → pty-manager-TyMUpDA9.js} +41 -9
- package/build/server/chunks/pty-manager-TyMUpDA9.js.map +1 -0
- package/build/server/chunks/{root-DDSnEAZv.js → root-CATOR_0t.js} +2 -2
- package/build/server/chunks/root-CATOR_0t.js.map +1 -0
- package/build/server/chunks/shared-server-DaWdgxVh.js +11 -0
- package/build/server/chunks/shared-server-DaWdgxVh.js.map +1 -0
- package/build/server/chunks/{state.svelte-hBbXlUak.js → state.svelte-CftllyvC.js} +3 -3
- package/build/server/chunks/state.svelte-CftllyvC.js.map +1 -0
- package/build/server/chunks/{stores-DHNzYNpX.js → stores-BjL57aOK.js} +4 -4
- package/build/server/chunks/{stores-DHNzYNpX.js.map → stores-BjL57aOK.js.map} +1 -1
- package/build/server/index.js +173 -6
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +53 -30
- package/build/server/manifest.js.map +1 -1
- package/package.json +28 -7
- package/scripts/dev.mjs +361 -0
- package/scripts/install.sh +133 -73
- package/scripts/{fix-generated-types.sh → postgen-types.sh} +2 -2
- package/scripts/setup.cjs +440 -244
- package/scripts/vercel-env-commands.sh +3 -3
- package/server.ts +3 -3
- package/src/app.html +163 -0
- package/src/lib/modules/client/activity/ActivityFeed.svelte +279 -0
- package/src/lib/modules/client/activity/index.ts +8 -0
- package/src/lib/modules/client/activity/store.svelte.ts +478 -0
- package/src/lib/modules/client/activity/summarizer.ts +224 -0
- package/src/lib/modules/client/common/Card.svelte +2 -9
- package/src/lib/modules/client/common/EmptyState.svelte +2 -20
- package/src/lib/modules/client/common/Icon.svelte +3 -7
- package/src/lib/modules/client/common/StatusBadge.svelte +2 -4
- package/src/lib/modules/client/common/config-guard.ts +22 -2
- package/src/lib/modules/client/common/index.ts +1 -1
- package/src/lib/modules/client/common/time.ts +27 -9
- package/src/lib/modules/client/dashboard/DashboardCard.svelte +374 -0
- package/src/lib/modules/client/dashboard/DashboardView.svelte +66 -0
- package/src/lib/modules/client/dashboard/index.ts +12 -0
- package/src/lib/modules/client/dashboard/store.svelte.ts +663 -0
- package/src/lib/modules/client/dashboard/summarizer.ts +205 -0
- package/src/lib/modules/client/neurolink/fetch-proxy.ts +70 -0
- package/src/lib/modules/client/neurolink/provider-config.ts +111 -0
- package/src/lib/modules/client/terminal/ChatView.svelte +46 -43
- package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -12
- package/src/lib/modules/client/terminal/ConnectionStatus.svelte +3 -6
- package/src/lib/modules/client/terminal/LaunchSheet.svelte +10 -21
- package/src/lib/modules/client/terminal/QuickKeys.svelte +4 -11
- package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +3 -6
- package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +5 -7
- package/src/lib/modules/client/terminal/xterm-wrapper.ts +27 -47
- package/src/lib/modules/server/apn/library-apns.ts +6 -3
- package/src/lib/modules/server/apn/notification-history.ts +2 -2
- package/src/lib/modules/server/apn/notification-sessions.ts +1 -3
- package/src/lib/modules/server/apn/pending-requests.ts +1 -1
- package/src/lib/modules/server/apn/types.ts +2 -52
- package/src/lib/modules/server/cli/index.ts +1 -30
- package/src/lib/modules/server/cli/runner.ts +7 -15
- package/src/lib/modules/server/fcm/fcm-service.ts +2 -2
- package/src/lib/modules/server/sessions/jsonl-parser.ts +97 -42
- package/src/lib/modules/server/sessions/jsonl-reader.ts +69 -60
- package/src/lib/modules/server/sessions/opencode-reader.ts +1 -1
- package/src/lib/modules/server/sessions/process-detector.ts +72 -31
- package/src/lib/modules/server/sessions/types.ts +2 -42
- package/src/lib/modules/server/terminal/holder-client.ts +11 -35
- package/src/lib/modules/server/terminal/opencode-watcher.ts +16 -24
- package/src/lib/modules/server/terminal/pty-manager.ts +40 -45
- package/src/lib/modules/server/terminal/session-watcher.ts +15 -17
- package/src/lib/modules/server/terminal/terminal-store.ts +1 -1
- package/src/lib/modules/server/ws/events-handler.ts +1 -16
- package/src/lib/modules/server/ws/keepalive.ts +1 -5
- package/src/lib/modules/server/ws/server.ts +1 -1
- package/src/lib/modules/server/ws/session-handler.ts +20 -86
- package/src/lib/modules/server/ws/terminal-handler.ts +28 -51
- package/src/lib/modules/server/ws/ticket-store.ts +1 -1
- package/src/lib/modules/shared/providers.ts +21 -0
- package/src/lib/types/activity.ts +18 -0
- package/src/lib/types/apn.ts +43 -0
- package/src/lib/types/cli.ts +39 -0
- package/src/lib/types/common.ts +39 -0
- package/src/lib/types/dashboard.ts +4 -0
- package/src/lib/types/generated/Client.ts +1656 -0
- package/src/{generated/types → lib/types/generated}/WsProtocol.ts +344 -2
- package/src/lib/types/index.ts +28 -0
- package/src/lib/types/neurolink.ts +4 -0
- package/src/lib/types/server.ts +93 -0
- package/src/lib/types/sessions.ts +59 -0
- package/src/lib/types/terminal-client.ts +132 -0
- package/src/lib/types/ws.ts +161 -0
- package/src/routes/+error.svelte +7 -2
- package/src/routes/+layout.server.ts +9 -0
- package/src/routes/+layout.svelte +36 -7
- package/src/routes/+page.server.ts +7 -0
- package/src/routes/+page.svelte +85 -35
- package/src/routes/activity/+page.server.ts +7 -0
- package/src/routes/activity/+page.svelte +58 -0
- package/src/routes/api/health/+server.ts +32 -19
- package/src/routes/api/neurolink-proxy/+server.ts +136 -0
- package/src/routes/api/notify/+server.ts +159 -84
- package/src/routes/api/sessions/+server.ts +1 -1
- package/src/routes/api/sessions/connect/+server.ts +10 -6
- package/src/routes/api/terminals/+server.ts +20 -1
- package/src/routes/api/terminals/[id]/+server.ts +16 -2
- package/src/routes/api/webhook/+server.ts +5 -33
- package/src/routes/api/ws-ticket/+server.ts +4 -4
- package/src/routes/config/+page.server.ts +9 -0
- package/src/routes/config/+page.svelte +118 -25
- package/src/routes/neurolink/+page.server.ts +10 -0
- package/src/routes/neurolink/+page.svelte +331 -0
- package/src/routes/project/+page.svelte +17 -12
- package/src/routes/session/[id]/+page.svelte +146 -62
- package/src/routes/terminals/+page.svelte +2 -2
- package/src/routes/terminals/[id]/+page.svelte +99 -88
- package/svelte.config.js +1 -3
- package/tsconfig.json +1 -0
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +0 -1
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +0 -1
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js +0 -20
- package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js +0 -1
- package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js +0 -6
- package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BN1NjBrw.js +0 -1
- package/build/client/_app/immutable/chunks/BN1NjBrw.js.br +0 -0
- package/build/client/_app/immutable/chunks/BN1NjBrw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js +0 -1
- package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js +0 -1
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CDVSripB.js.br +0 -0
- package/build/client/_app/immutable/chunks/CDVSripB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CF4lQ45j.js.br +0 -0
- package/build/client/_app/immutable/chunks/CF4lQ45j.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js +0 -61
- package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js +0 -1
- package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js +0 -1
- package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js +0 -2
- package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DwWiuoEC.js +0 -2
- package/build/client/_app/immutable/entry/app.DwWiuoEC.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DwWiuoEC.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DG8BMhrh.js +0 -1
- package/build/client/_app/immutable/entry/start.DG8BMhrh.js.br +0 -0
- package/build/client/_app/immutable/entry/start.DG8BMhrh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.ejabgzDQ.js +0 -1
- package/build/client/_app/immutable/nodes/0.ejabgzDQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.ejabgzDQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js +0 -1
- package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.BFK7Ubrr.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DV3saFiY.js +0 -1
- package/build/client/_app/immutable/nodes/2.DV3saFiY.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DV3saFiY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js +0 -3
- package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.D6NIf10D.js +0 -1
- package/build/client/_app/immutable/nodes/4.D6NIf10D.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.D6NIf10D.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.g3R-QfIW.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.g3R-QfIW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DSpd_nYK.js +0 -2
- package/build/client/_app/immutable/nodes/6.DSpd_nYK.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DSpd_nYK.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.F9WBFTz2.js +0 -2
- package/build/client/_app/immutable/nodes/7.F9WBFTz2.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.F9WBFTz2.js.gz +0 -0
- package/build/server/chunks/0-ePgrkfG9.js +0 -9
- package/build/server/chunks/0-ePgrkfG9.js.map +0 -1
- package/build/server/chunks/1-BV7u1xGo.js +0 -9
- package/build/server/chunks/2-3p1kyvjQ.js +0 -9
- package/build/server/chunks/2-3p1kyvjQ.js.map +0 -1
- package/build/server/chunks/3-Ck7ewhOX.js +0 -9
- package/build/server/chunks/3-Ck7ewhOX.js.map +0 -1
- package/build/server/chunks/4-ChFYfo_S.js +0 -9
- package/build/server/chunks/4-ChFYfo_S.js.map +0 -1
- package/build/server/chunks/5-q-tQLBBu.js +0 -9
- package/build/server/chunks/5-q-tQLBBu.js.map +0 -1
- package/build/server/chunks/6-BIaAbm8b.js +0 -9
- package/build/server/chunks/6-BIaAbm8b.js.map +0 -1
- package/build/server/chunks/7--TmbCgrH.js +0 -9
- package/build/server/chunks/7--TmbCgrH.js.map +0 -1
- package/build/server/chunks/Button-Cs1aE6ka.js.map +0 -1
- package/build/server/chunks/Icon-CEUrotA6.js.map +0 -1
- package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +0 -1
- package/build/server/chunks/_page.svelte-BdYynOck.js +0 -85
- package/build/server/chunks/_page.svelte-BdYynOck.js.map +0 -1
- package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +0 -1
- package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +0 -1
- package/build/server/chunks/_server.ts-BStnNIcq.js +0 -34
- package/build/server/chunks/_server.ts-BStnNIcq.js.map +0 -1
- package/build/server/chunks/_server.ts-CAxsWKvS.js.map +0 -1
- package/build/server/chunks/_server.ts-COu0vNpd.js.map +0 -1
- package/build/server/chunks/_server.ts-CTpcLUH8.js.map +0 -1
- package/build/server/chunks/_server.ts-Cf84YIaW.js +0 -25
- package/build/server/chunks/_server.ts-Cf84YIaW.js.map +0 -1
- package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +0 -1
- package/build/server/chunks/_server.ts-CtH0dhUp.js +0 -71
- package/build/server/chunks/_server.ts-CtH0dhUp.js.map +0 -1
- package/build/server/chunks/_server.ts-DB_Kg97c.js.map +0 -1
- package/build/server/chunks/_server.ts-DYpJImqd.js.map +0 -1
- package/build/server/chunks/_server.ts-Deok2y88.js.map +0 -1
- package/build/server/chunks/_server.ts-tSpgyl1D.js.map +0 -1
- package/build/server/chunks/_server.ts-vekTmWAx.js.map +0 -1
- package/build/server/chunks/client2-CCBGA-2V.js +0 -7
- package/build/server/chunks/index-server-CrDaL06Y.js.map +0 -1
- package/build/server/chunks/index2-CgclKpUj.js.map +0 -1
- package/build/server/chunks/library-apns-BqJbvSKh.js.map +0 -1
- package/build/server/chunks/pty-manager-BQVB7IVj.js.map +0 -1
- package/build/server/chunks/root-DDSnEAZv.js.map +0 -1
- package/build/server/chunks/shared-server-sSGG17Df.js.map +0 -1
- package/build/server/chunks/state.svelte-hBbXlUak.js.map +0 -1
- package/src/generated/types/Client.ts +0 -589
- package/src/lib/types/config.ts +0 -1
- /package/build/client/_app/immutable/assets/{4.BFUut--w.css → 6.BFUut--w.css} +0 -0
- /package/build/client/_app/immutable/assets/{4.BFUut--w.css.br → 6.BFUut--w.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{4.BFUut--w.css.gz → 6.BFUut--w.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css → 7.BTOx7yt7.css} +0 -0
- /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.br → 7.BTOx7yt7.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{5.BTOx7yt7.css.gz → 7.BTOx7yt7.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css → 8.eZGZN-BF.css} +0 -0
- /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.br → 8.eZGZN-BF.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{6.eZGZN-BF.css.gz → 8.eZGZN-BF.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css → 9.DwS5ZHBh.css} +0 -0
- /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.br → 9.DwS5ZHBh.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{7.DwS5ZHBh.css.gz → 9.DwS5ZHBh.css.gz} +0 -0
- /package/src/{generated/types → lib/types/generated}/API.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/APN.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/CLI.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Config.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Holder.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/JWT.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Notification.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/OpenCode.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Sessions.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/Terminal.ts +0 -0
- /package/src/{generated/types → lib/types/generated}/index.ts +0 -0
package/scripts/dev.mjs
ADDED
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Dev orchestrator — mirrors exactly what `shooter start` does for users.
|
|
3
|
+
//
|
|
4
|
+
// Differences from the global server:
|
|
5
|
+
// PORT 54006 (vs 54007 for global)
|
|
6
|
+
// SHOOTER_HOME ~/.shooter-dev (isolated PID, DB, logs, tunnel URL)
|
|
7
|
+
//
|
|
8
|
+
// API key handling:
|
|
9
|
+
// Dev key = <hostname><4hex>, generated once, persisted in ~/.shooter-dev/.env
|
|
10
|
+
// Global key (shooter2024) in ~/.zshrc is NEVER touched.
|
|
11
|
+
// The dev key is passed explicitly as API_KEY to the server child process,
|
|
12
|
+
// overriding whatever the shell has exported.
|
|
13
|
+
//
|
|
14
|
+
// Other env/credentials (NeuroLink keys etc.) fall through from project .env
|
|
15
|
+
// and ~/.shooter/.env — but never override API_KEY.
|
|
16
|
+
//
|
|
17
|
+
// On source change: kill server → vite build → restart server → tunnel stays up.
|
|
18
|
+
|
|
19
|
+
import { spawn, execSync } from 'child_process';
|
|
20
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs';
|
|
21
|
+
import { createRequire } from 'module';
|
|
22
|
+
import { watch } from 'chokidar';
|
|
23
|
+
import { join, dirname } from 'path';
|
|
24
|
+
import { fileURLToPath } from 'url';
|
|
25
|
+
import { homedir } from 'os';
|
|
26
|
+
import { config as dotenvConfig } from 'dotenv';
|
|
27
|
+
|
|
28
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
const PKG_ROOT = join(__dirname, '..');
|
|
30
|
+
const DEV_HOME = join(homedir(), '.shooter-dev');
|
|
31
|
+
const LOG_DIR = join(DEV_HOME, 'logs');
|
|
32
|
+
const TUNNEL_URL_FILE = join(DEV_HOME, '.tunnel_url');
|
|
33
|
+
const PORT = 54006;
|
|
34
|
+
|
|
35
|
+
const _require = createRequire(import.meta.url);
|
|
36
|
+
const _crypto = _require('crypto');
|
|
37
|
+
const _os = _require('os');
|
|
38
|
+
|
|
39
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
40
|
+
|
|
41
|
+
// ── Dev API key: generate once, persist, reuse forever ───────────────
|
|
42
|
+
// Stored in ~/.shooter-dev/.env — never touches global ~/.shooter/.env
|
|
43
|
+
// or ~/.zshrc. Passed as API_KEY env var to server child process.
|
|
44
|
+
|
|
45
|
+
const devEnvPath = join(DEV_HOME, '.env');
|
|
46
|
+
|
|
47
|
+
function makeApiKey() {
|
|
48
|
+
const name =
|
|
49
|
+
_os
|
|
50
|
+
.hostname()
|
|
51
|
+
.toLowerCase()
|
|
52
|
+
.replace(/\.local$/, '')
|
|
53
|
+
.replace(/[^a-z0-9]/g, ' ')
|
|
54
|
+
.trim()
|
|
55
|
+
.split(' ')
|
|
56
|
+
.filter((p) => /^[a-z]+$/.test(p))
|
|
57
|
+
.join('')
|
|
58
|
+
.slice(0, 20) || 'shooter';
|
|
59
|
+
const suffix = _crypto.randomBytes(16).toString('hex'); // 128 bits of entropy
|
|
60
|
+
return `${name}-${suffix}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function isWeakKey(key) {
|
|
64
|
+
// Reject previously generated short keys: <name><4hex> had no hyphen and
|
|
65
|
+
// a trailing ≤4 hex-char suffix. Keys generated now have 32 hex chars
|
|
66
|
+
// separated by a hyphen, which passes this check.
|
|
67
|
+
return !key.includes('-') || !/-[a-f0-9]{32,}$/.test(key);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function getOrCreateDevApiKey() {
|
|
71
|
+
if (existsSync(devEnvPath)) {
|
|
72
|
+
const match = readFileSync(devEnvPath, 'utf-8').match(/^API_KEY=(.+)$/m);
|
|
73
|
+
if (match && match[1].trim() && !isWeakKey(match[1].trim())) {
|
|
74
|
+
return match[1].trim();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const key = makeApiKey();
|
|
78
|
+
const existing = existsSync(devEnvPath) ? readFileSync(devEnvPath, 'utf-8') : '';
|
|
79
|
+
writeFileSync(devEnvPath, `${existing.trimEnd()}\nAPI_KEY=${key}\n`.trimStart());
|
|
80
|
+
return key;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const DEV_API_KEY = getOrCreateDevApiKey();
|
|
84
|
+
|
|
85
|
+
// Load remaining env vars (NeuroLink keys etc.) from project .env and
|
|
86
|
+
// ~/.shooter/.env — but never let them override API_KEY.
|
|
87
|
+
dotenvConfig({ path: join(PKG_ROOT, '.env') });
|
|
88
|
+
dotenvConfig({ override: false, path: join(homedir(), '.shooter', '.env') });
|
|
89
|
+
|
|
90
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
function isCloudflaredAvailable() {
|
|
93
|
+
try {
|
|
94
|
+
execSync('which cloudflared', { stdio: 'ignore' });
|
|
95
|
+
return true;
|
|
96
|
+
} catch {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function dim(s) {
|
|
102
|
+
return `\x1b[2m${s}\x1b[0m`;
|
|
103
|
+
}
|
|
104
|
+
function green(s) {
|
|
105
|
+
return `\x1b[32m${s}\x1b[0m`;
|
|
106
|
+
}
|
|
107
|
+
function yellow(s) {
|
|
108
|
+
return `\x1b[33m${s}\x1b[0m`;
|
|
109
|
+
}
|
|
110
|
+
function cyan(s) {
|
|
111
|
+
return `\x1b[36m${s}\x1b[0m`;
|
|
112
|
+
}
|
|
113
|
+
function bold(s) {
|
|
114
|
+
return `\x1b[1m${s}\x1b[0m`;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function log(msg) {
|
|
118
|
+
console.log(`${dim('[dev]')} ${msg}`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ── Build ─────────────────────────────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
async function build() {
|
|
124
|
+
log('Building...');
|
|
125
|
+
return new Promise((resolve, reject) => {
|
|
126
|
+
const proc = spawn('node_modules/.bin/vite', ['build'], {
|
|
127
|
+
cwd: PKG_ROOT,
|
|
128
|
+
stdio: 'inherit',
|
|
129
|
+
env: { ...process.env },
|
|
130
|
+
});
|
|
131
|
+
proc.on('exit', (code) => {
|
|
132
|
+
if (code === 0) {
|
|
133
|
+
// Copy pty-holder.cjs (same as postbuild script)
|
|
134
|
+
const holderSrc = join(PKG_ROOT, 'src/lib/modules/server/terminal/pty-holder.cjs');
|
|
135
|
+
const holderDest = join(PKG_ROOT, 'build/pty-holder.cjs');
|
|
136
|
+
try {
|
|
137
|
+
const data = readFileSync(holderSrc);
|
|
138
|
+
writeFileSync(holderDest, data);
|
|
139
|
+
} catch (err) {
|
|
140
|
+
console.error(`Failed to copy pty-holder: ${holderSrc} -> ${holderDest}`, err);
|
|
141
|
+
}
|
|
142
|
+
log(green('Build complete.'));
|
|
143
|
+
resolve();
|
|
144
|
+
} else {
|
|
145
|
+
reject(new Error(`vite build exited with code ${code}`));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ── Server ────────────────────────────────────────────────────────────
|
|
152
|
+
|
|
153
|
+
let serverProc = null;
|
|
154
|
+
|
|
155
|
+
function startServer() {
|
|
156
|
+
const tsxLoader = join(PKG_ROOT, 'node_modules/tsx/dist/loader.mjs');
|
|
157
|
+
const tsxPreflight = join(PKG_ROOT, 'node_modules/tsx/dist/preflight.cjs');
|
|
158
|
+
const serverEntry = join(PKG_ROOT, 'server.ts');
|
|
159
|
+
|
|
160
|
+
const nodeArgs = [];
|
|
161
|
+
if (existsSync(tsxPreflight)) nodeArgs.push('--require', tsxPreflight);
|
|
162
|
+
if (existsSync(tsxLoader)) nodeArgs.push('--import', `file://${tsxLoader}`);
|
|
163
|
+
else nodeArgs.push('--import', 'tsx');
|
|
164
|
+
nodeArgs.push(serverEntry);
|
|
165
|
+
|
|
166
|
+
serverProc = spawn(process.execPath, nodeArgs, {
|
|
167
|
+
cwd: PKG_ROOT,
|
|
168
|
+
stdio: 'inherit',
|
|
169
|
+
env: {
|
|
170
|
+
...process.env,
|
|
171
|
+
PORT: String(PORT),
|
|
172
|
+
SHOOTER_HOME: DEV_HOME,
|
|
173
|
+
SHOOTER_PKG_ROOT: PKG_ROOT,
|
|
174
|
+
API_KEY: DEV_API_KEY, // override whatever ~/.zshrc exported
|
|
175
|
+
ORIGIN: `http://localhost:${PORT}`, // prevent SvelteKit from using https from x-forwarded-proto
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
serverProc.on('error', (err) => {
|
|
180
|
+
log(`${yellow('Server error:')} ${err.message}`);
|
|
181
|
+
serverProc = null;
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
serverProc.on('exit', (code, signal) => {
|
|
185
|
+
if (signal !== 'SIGTERM' && signal !== 'SIGINT') {
|
|
186
|
+
log(yellow(`Server exited (${signal ?? code})`));
|
|
187
|
+
}
|
|
188
|
+
serverProc = null;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function killServer() {
|
|
193
|
+
return new Promise((resolve) => {
|
|
194
|
+
if (!serverProc) {
|
|
195
|
+
resolve();
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const proc = serverProc;
|
|
199
|
+
serverProc = null;
|
|
200
|
+
proc.once('exit', resolve);
|
|
201
|
+
proc.kill('SIGTERM');
|
|
202
|
+
// Force-kill after 5s if graceful shutdown hangs
|
|
203
|
+
setTimeout(() => {
|
|
204
|
+
try {
|
|
205
|
+
proc.kill('SIGKILL');
|
|
206
|
+
} catch {}
|
|
207
|
+
}, 5000).unref();
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ── Tunnel ────────────────────────────────────────────────────────────
|
|
212
|
+
|
|
213
|
+
let tunnelProc = null;
|
|
214
|
+
|
|
215
|
+
function startTunnel() {
|
|
216
|
+
if (!isCloudflaredAvailable()) {
|
|
217
|
+
log(
|
|
218
|
+
yellow(
|
|
219
|
+
'cloudflared not found — no tunnel. Server available at ' + cyan(`http://localhost:${PORT}`)
|
|
220
|
+
)
|
|
221
|
+
);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Clear previous URL
|
|
226
|
+
try {
|
|
227
|
+
unlinkSync(TUNNEL_URL_FILE);
|
|
228
|
+
} catch {}
|
|
229
|
+
|
|
230
|
+
tunnelProc = spawn('cloudflared', ['tunnel', '--url', `http://localhost:${PORT}`], {
|
|
231
|
+
cwd: PKG_ROOT,
|
|
232
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
const onData = (data) => {
|
|
236
|
+
const text = data.toString();
|
|
237
|
+
const match = text.match(/https:\/\/[a-z0-9-]+\.trycloudflare\.com/);
|
|
238
|
+
if (match) {
|
|
239
|
+
const url = match[0];
|
|
240
|
+
writeFileSync(TUNNEL_URL_FILE, url);
|
|
241
|
+
const configUrl = `http://localhost:${PORT}/config#key=${encodeURIComponent(DEV_API_KEY)}&url=${encodeURIComponent(`http://localhost:${PORT}`)}`;
|
|
242
|
+
const maskedConfigUrl = configUrl.replace(encodeURIComponent(DEV_API_KEY), '(redacted)');
|
|
243
|
+
console.log('');
|
|
244
|
+
console.log(` ${bold('Shooter dev server ready')}`);
|
|
245
|
+
console.log(` ${dim('Local: ')} ${cyan(`http://localhost:${PORT}`)}`);
|
|
246
|
+
console.log(` ${dim('Tunnel: ')} ${green(url)}`);
|
|
247
|
+
console.log(` ${dim('API key:')} ${yellow(DEV_API_KEY ? '(set)' : '(not set)')}`);
|
|
248
|
+
console.log(` ${dim('Config: ')} ${cyan(maskedConfigUrl)}`);
|
|
249
|
+
console.log('');
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
tunnelProc.stdout.on('data', onData);
|
|
254
|
+
tunnelProc.stderr.on('data', onData);
|
|
255
|
+
|
|
256
|
+
tunnelProc.on('exit', (code) => {
|
|
257
|
+
if (code !== null && code !== 0) {
|
|
258
|
+
log(yellow(`Tunnel exited with code ${code}`));
|
|
259
|
+
}
|
|
260
|
+
tunnelProc = null;
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function killTunnel() {
|
|
265
|
+
if (!tunnelProc) return;
|
|
266
|
+
try {
|
|
267
|
+
tunnelProc.kill('SIGTERM');
|
|
268
|
+
} catch {}
|
|
269
|
+
tunnelProc = null;
|
|
270
|
+
try {
|
|
271
|
+
unlinkSync(TUNNEL_URL_FILE);
|
|
272
|
+
} catch {}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ── Watcher ───────────────────────────────────────────────────────────
|
|
276
|
+
|
|
277
|
+
let rebuilding = false;
|
|
278
|
+
let pendingRebuild = false;
|
|
279
|
+
|
|
280
|
+
async function rebuild(reason) {
|
|
281
|
+
if (rebuilding) {
|
|
282
|
+
pendingRebuild = true;
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
rebuilding = true;
|
|
286
|
+
log(dim(`Change detected: ${reason} — rebuilding...`));
|
|
287
|
+
|
|
288
|
+
try {
|
|
289
|
+
await killServer();
|
|
290
|
+
await build();
|
|
291
|
+
startServer();
|
|
292
|
+
} catch (err) {
|
|
293
|
+
log(yellow(`Rebuild failed: ${err.message}`));
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
rebuilding = false;
|
|
297
|
+
if (pendingRebuild) {
|
|
298
|
+
pendingRebuild = false;
|
|
299
|
+
await rebuild('queued change');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function startWatcher() {
|
|
304
|
+
const watcher = watch(
|
|
305
|
+
[
|
|
306
|
+
join(PKG_ROOT, 'src'),
|
|
307
|
+
join(PKG_ROOT, 'server.ts'),
|
|
308
|
+
join(PKG_ROOT, 'svelte.config.js'),
|
|
309
|
+
join(PKG_ROOT, 'vite.config.js'),
|
|
310
|
+
],
|
|
311
|
+
{
|
|
312
|
+
ignoreInitial: true,
|
|
313
|
+
ignored: ['**/node_modules/**', '**/.svelte-kit/**', '**/build/**', '**/*.d.ts'],
|
|
314
|
+
awaitWriteFinish: { stabilityThreshold: 300, pollInterval: 50 },
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
let debounce = null;
|
|
319
|
+
watcher.on('all', (event, filePath) => {
|
|
320
|
+
clearTimeout(debounce);
|
|
321
|
+
debounce = setTimeout(() => {
|
|
322
|
+
const rel = filePath.replace(PKG_ROOT + '/', '');
|
|
323
|
+
rebuild(rel);
|
|
324
|
+
}, 500);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
return watcher;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ── Shutdown ──────────────────────────────────────────────────────────
|
|
331
|
+
|
|
332
|
+
async function shutdown() {
|
|
333
|
+
console.log('');
|
|
334
|
+
log('Shutting down...');
|
|
335
|
+
await killServer();
|
|
336
|
+
killTunnel();
|
|
337
|
+
process.exit(0);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
process.on('SIGINT', shutdown);
|
|
341
|
+
process.on('SIGTERM', shutdown);
|
|
342
|
+
|
|
343
|
+
// ── Main ──────────────────────────────────────────────────────────────
|
|
344
|
+
|
|
345
|
+
log(
|
|
346
|
+
`${bold('Shooter dev')} — port ${cyan(String(PORT))}, home ${dim(DEV_HOME)}, key ${yellow(DEV_API_KEY ? '(set)' : '(not set)')}`
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
try {
|
|
350
|
+
await build();
|
|
351
|
+
} catch (err) {
|
|
352
|
+
log(yellow(`Initial build failed: ${err.message}`));
|
|
353
|
+
process.exit(1);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
startServer();
|
|
357
|
+
|
|
358
|
+
// Give server 2s to bind before starting tunnel (same as shooter CLI)
|
|
359
|
+
setTimeout(() => startTunnel(), 2000);
|
|
360
|
+
|
|
361
|
+
startWatcher();
|
package/scripts/install.sh
CHANGED
|
@@ -184,11 +184,12 @@ check_linux_build_tools() {
|
|
|
184
184
|
|
|
185
185
|
if ask_yes_no " Install build tools now? ($install_cmd)" "y"; then
|
|
186
186
|
info "Installing build tools..."
|
|
187
|
-
|
|
187
|
+
$install_cmd
|
|
188
188
|
success "Build tools installed."
|
|
189
189
|
else
|
|
190
|
-
|
|
191
|
-
|
|
190
|
+
error "Build tools are required for native modules (node-pty, better-sqlite3)."
|
|
191
|
+
error "Install them manually:$missing"
|
|
192
|
+
exit 1
|
|
192
193
|
fi
|
|
193
194
|
else
|
|
194
195
|
success "Build tools available (make, g++, python3)"
|
|
@@ -250,13 +251,11 @@ find_node() {
|
|
|
250
251
|
}
|
|
251
252
|
|
|
252
253
|
check_node() {
|
|
253
|
-
NODE_BIN="$(find_node)"
|
|
254
|
+
NODE_BIN="$(find_node)" || true
|
|
254
255
|
if [ -n "$NODE_BIN" ]; then
|
|
255
256
|
node_version="$("$NODE_BIN" --version)"
|
|
256
257
|
success "Node.js $node_version ($NODE_BIN)"
|
|
257
|
-
|
|
258
|
-
dir_path="$(dirname "$NODE_BIN")"
|
|
259
|
-
export PATH="$dir_path:$PATH"
|
|
258
|
+
export PATH="$(dirname "$NODE_BIN"):$PATH"
|
|
260
259
|
return 0
|
|
261
260
|
fi
|
|
262
261
|
|
|
@@ -283,8 +282,12 @@ bootstrap_pnpm() {
|
|
|
283
282
|
# Try corepack first
|
|
284
283
|
if command -v corepack >/dev/null 2>&1; then
|
|
285
284
|
if corepack enable 2>/dev/null; then
|
|
286
|
-
|
|
287
|
-
|
|
285
|
+
# Pre-download pnpm to avoid interactive prompt during install
|
|
286
|
+
COREPACK_ENABLE_AUTO_PIN=0 corepack prepare pnpm@10.28.2 --activate 2>/dev/null
|
|
287
|
+
if command -v pnpm >/dev/null 2>&1; then
|
|
288
|
+
success "pnpm $(pnpm --version) (via corepack)"
|
|
289
|
+
return 0
|
|
290
|
+
fi
|
|
288
291
|
fi
|
|
289
292
|
fi
|
|
290
293
|
|
|
@@ -330,7 +333,7 @@ handle_existing() {
|
|
|
330
333
|
1)
|
|
331
334
|
step "Updating existing installation"
|
|
332
335
|
cd "$SHOOTER_REPO"
|
|
333
|
-
git
|
|
336
|
+
git fetch origin "$REPO_BRANCH" && git reset --hard "origin/$REPO_BRANCH"
|
|
334
337
|
success "Repository updated."
|
|
335
338
|
return 0
|
|
336
339
|
;;
|
|
@@ -340,12 +343,16 @@ handle_existing() {
|
|
|
340
343
|
success "Removed $SHOOTER_REPO"
|
|
341
344
|
return 1
|
|
342
345
|
;;
|
|
343
|
-
|
|
346
|
+
3|abort)
|
|
344
347
|
info "Aborted. No changes made."
|
|
345
348
|
# Disable cleanup trap since nothing was cloned
|
|
346
349
|
CLEANUP_CLONED=0
|
|
347
350
|
exit 0
|
|
348
351
|
;;
|
|
352
|
+
*)
|
|
353
|
+
error "Invalid choice: $choice"
|
|
354
|
+
exit 1
|
|
355
|
+
;;
|
|
349
356
|
esac
|
|
350
357
|
fi
|
|
351
358
|
return 1
|
|
@@ -407,35 +414,6 @@ run_setup_wizard() {
|
|
|
407
414
|
fi
|
|
408
415
|
}
|
|
409
416
|
|
|
410
|
-
# ── Global command ────────────────────────────────────────────────────
|
|
411
|
-
|
|
412
|
-
offer_global_command() {
|
|
413
|
-
step "Global command"
|
|
414
|
-
BIN_DIR="$HOME/.local/bin"
|
|
415
|
-
SHOOTER_BIN="$BIN_DIR/shooter"
|
|
416
|
-
|
|
417
|
-
if [ -x "$SHOOTER_BIN" ]; then
|
|
418
|
-
success "'shooter' command already linked."
|
|
419
|
-
return
|
|
420
|
-
fi
|
|
421
|
-
|
|
422
|
-
if ask_yes_no " Install 'shooter' as a global command?" "y"; then
|
|
423
|
-
mkdir -p "$BIN_DIR"
|
|
424
|
-
ln -sf "$SHOOTER_REPO/bin/shooter.cjs" "$SHOOTER_BIN"
|
|
425
|
-
chmod +x "$SHOOTER_BIN"
|
|
426
|
-
success "'shooter' linked to $SHOOTER_BIN"
|
|
427
|
-
|
|
428
|
-
# Check if ~/.local/bin is in PATH
|
|
429
|
-
case ":$PATH:" in
|
|
430
|
-
*":$BIN_DIR:"*) ;;
|
|
431
|
-
*)
|
|
432
|
-
warn "$BIN_DIR is not in your PATH."
|
|
433
|
-
info "Add to your shell profile: export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
434
|
-
;;
|
|
435
|
-
esac
|
|
436
|
-
fi
|
|
437
|
-
}
|
|
438
|
-
|
|
439
417
|
# ── Cloudflare Tunnel ─────────────────────────────────────────────────
|
|
440
418
|
|
|
441
419
|
install_cloudflared() {
|
|
@@ -515,46 +493,55 @@ start_server_and_tunnel() {
|
|
|
515
493
|
step "Starting Shooter"
|
|
516
494
|
|
|
517
495
|
cd "$SHOOTER_REPO"
|
|
496
|
+
port="$DEFAULT_PORT"
|
|
497
|
+
|
|
498
|
+
# Check if port is already in use
|
|
499
|
+
if command -v lsof >/dev/null 2>&1; then
|
|
500
|
+
if lsof -i ":${port}" -sTCP:LISTEN >/dev/null 2>&1; then
|
|
501
|
+
warn "Port ${port} is already in use."
|
|
502
|
+
info "Stop the existing process or set a different PORT in ~/.shooter/.env"
|
|
503
|
+
return 1
|
|
504
|
+
fi
|
|
505
|
+
fi
|
|
518
506
|
|
|
519
|
-
# Start
|
|
520
|
-
SHOOTER_HOME="$SHOOTER_HOME" "$NODE_BIN" bin/shooter.cjs start
|
|
521
|
-
|
|
522
|
-
|
|
507
|
+
# Start server in daemon mode (detaches from terminal, auto-starts tunnel if cloudflared available)
|
|
508
|
+
SHOOTER_HOME="$SHOOTER_HOME" "$NODE_BIN" bin/shooter.cjs start -d
|
|
509
|
+
|
|
510
|
+
# Wait for server to be ready (up to 15s)
|
|
511
|
+
waited=0
|
|
512
|
+
while [ "$waited" -lt 15 ]; do
|
|
513
|
+
if curl -sf "http://localhost:${port}/api/health" >/dev/null 2>&1; then
|
|
514
|
+
break
|
|
515
|
+
fi
|
|
516
|
+
sleep 1
|
|
517
|
+
waited=$((waited + 1))
|
|
518
|
+
done
|
|
523
519
|
|
|
524
520
|
# Verify server is up
|
|
525
|
-
port="$DEFAULT_PORT"
|
|
526
521
|
if curl -sf "http://localhost:${port}/api/health" >/dev/null 2>&1; then
|
|
527
522
|
success "Server running on http://localhost:${port}"
|
|
528
523
|
else
|
|
529
524
|
warn "Server may still be starting. Check with: shooter status"
|
|
530
525
|
fi
|
|
531
526
|
|
|
532
|
-
#
|
|
533
|
-
if
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
mkdir -p "$(dirname "$tunnel_log")"
|
|
539
|
-
cloudflared tunnel --url "http://localhost:${port}" > "$tunnel_log" 2>&1 &
|
|
540
|
-
TUNNEL_PID=$!
|
|
541
|
-
|
|
542
|
-
# Wait up to 10s for the tunnel URL to appear in logs
|
|
527
|
+
# Check for tunnel URL (daemon mode starts tunnel automatically)
|
|
528
|
+
if [ -f "$SHOOTER_HOME/.tunnel_url" ]; then
|
|
529
|
+
TUNNEL_URL="$(cat "$SHOOTER_HOME/.tunnel_url")"
|
|
530
|
+
success "Tunnel active: $TUNNEL_URL"
|
|
531
|
+
elif command -v cloudflared >/dev/null 2>&1; then
|
|
532
|
+
# Tunnel may still be starting — wait a few more seconds
|
|
543
533
|
waited=0
|
|
544
534
|
while [ "$waited" -lt 10 ]; do
|
|
545
|
-
if
|
|
546
|
-
|
|
535
|
+
if [ -f "$SHOOTER_HOME/.tunnel_url" ]; then
|
|
536
|
+
TUNNEL_URL="$(cat "$SHOOTER_HOME/.tunnel_url")"
|
|
537
|
+
success "Tunnel active: $TUNNEL_URL"
|
|
547
538
|
break
|
|
548
539
|
fi
|
|
549
540
|
sleep 1
|
|
550
541
|
waited=$((waited + 1))
|
|
551
542
|
done
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
TUNNEL_URL="$(cat "$SHOOTER_HOME/.tunnel_url")"
|
|
555
|
-
success "Tunnel active: $TUNNEL_URL"
|
|
556
|
-
else
|
|
557
|
-
warn "Tunnel is starting in the background. Check 'shooter status' shortly."
|
|
543
|
+
if [ -z "$TUNNEL_URL" ]; then
|
|
544
|
+
info "Tunnel is starting in the background. Check 'shooter status' shortly."
|
|
558
545
|
fi
|
|
559
546
|
else
|
|
560
547
|
info "No cloudflared found — server accessible on local network only."
|
|
@@ -571,11 +558,19 @@ print_success() {
|
|
|
571
558
|
printf ' ================================================\n'
|
|
572
559
|
printf '%s' "$RESET"
|
|
573
560
|
printf '\n'
|
|
574
|
-
printf ' %sLocal:%s
|
|
561
|
+
printf ' %sLocal:%s http://localhost:%s\n' "$BOLD" "$RESET" "$DEFAULT_PORT"
|
|
575
562
|
if [ -n "$TUNNEL_URL" ]; then
|
|
576
|
-
printf ' %sRemote:%s
|
|
563
|
+
printf ' %sRemote:%s %s\n' "$BOLD" "$RESET" "$TUNNEL_URL"
|
|
564
|
+
fi
|
|
565
|
+
# Read API key from ~/.shooter/.env for display
|
|
566
|
+
_api_key=""
|
|
567
|
+
if [ -f "$SHOOTER_HOME/.env" ]; then
|
|
568
|
+
_api_key="$(grep -m1 '^API_KEY=' "$SHOOTER_HOME/.env" 2>/dev/null | cut -d= -f2-)"
|
|
569
|
+
fi
|
|
570
|
+
if [ -n "$_api_key" ]; then
|
|
571
|
+
printf ' %sAPI key:%s (configured in %s/.env)\n' "$BOLD" "$RESET" "$SHOOTER_HOME"
|
|
577
572
|
fi
|
|
578
|
-
printf ' %sStatus:%s
|
|
573
|
+
printf ' %sStatus:%s shooter status\n' "$BOLD" "$RESET"
|
|
579
574
|
printf ' %sLogs:%s shooter logs\n' "$BOLD" "$RESET"
|
|
580
575
|
printf '\n'
|
|
581
576
|
printf ' %sCommands:%s\n' "$BOLD" "$RESET"
|
|
@@ -622,14 +617,79 @@ main() {
|
|
|
622
617
|
install_deps
|
|
623
618
|
run_setup_wizard
|
|
624
619
|
|
|
625
|
-
# Optional extras
|
|
626
|
-
|
|
620
|
+
# Optional extras — single prompt instead of 3 separate ones
|
|
621
|
+
step "Optional extras"
|
|
622
|
+
printf '\n'
|
|
623
|
+
printf ' The following are recommended:\n'
|
|
624
|
+
printf ' %s1.%s Global %sshooter%s command (run from anywhere)\n' "$BOLD" "$RESET" "$CYAN" "$RESET"
|
|
625
|
+
printf ' %s2.%s Cloudflare Tunnel (remote access from phone)\n' "$BOLD" "$RESET"
|
|
626
|
+
printf ' %s3.%s Autostart on login\n' "$BOLD" "$RESET"
|
|
627
|
+
printf '\n'
|
|
628
|
+
|
|
629
|
+
if ask_yes_no " Install all recommended extras?" "y"; then
|
|
630
|
+
# Global command
|
|
631
|
+
BIN_DIR="$HOME/.local/bin"
|
|
632
|
+
SHOOTER_BIN="$BIN_DIR/shooter"
|
|
633
|
+
if [ ! -x "$SHOOTER_BIN" ]; then
|
|
634
|
+
mkdir -p "$BIN_DIR"
|
|
635
|
+
if [ -d "$SHOOTER_BIN" ]; then
|
|
636
|
+
error "$SHOOTER_BIN exists as a directory. Remove it and re-run."
|
|
637
|
+
exit 1
|
|
638
|
+
fi
|
|
639
|
+
ln -sf "$SHOOTER_REPO/bin/shooter.cjs" "$SHOOTER_BIN"
|
|
640
|
+
chmod +x "$SHOOTER_BIN"
|
|
641
|
+
success "'shooter' command linked to $SHOOTER_BIN"
|
|
642
|
+
case ":$PATH:" in
|
|
643
|
+
*":$BIN_DIR:"*) ;;
|
|
644
|
+
*)
|
|
645
|
+
warn "$BIN_DIR is not in your PATH."
|
|
646
|
+
info "Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):"
|
|
647
|
+
info " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
648
|
+
|
|
649
|
+
# Attempt to auto-configure PATH in shell profile
|
|
650
|
+
SHELL_NAME=$(basename "$SHELL")
|
|
651
|
+
case "$SHELL_NAME" in
|
|
652
|
+
bash)
|
|
653
|
+
RC_FILE="$HOME/.bashrc"
|
|
654
|
+
[ -f "$HOME/.bash_profile" ] && RC_FILE="$HOME/.bash_profile"
|
|
655
|
+
;;
|
|
656
|
+
zsh)
|
|
657
|
+
RC_FILE="$HOME/.zshrc"
|
|
658
|
+
;;
|
|
659
|
+
fish)
|
|
660
|
+
RC_FILE="$HOME/.config/fish/config.fish"
|
|
661
|
+
;;
|
|
662
|
+
*)
|
|
663
|
+
RC_FILE=""
|
|
664
|
+
;;
|
|
665
|
+
esac
|
|
666
|
+
|
|
667
|
+
if [ -n "$RC_FILE" ] && [ -f "$RC_FILE" ]; then
|
|
668
|
+
if ! grep -q '\.local/bin' "$RC_FILE" 2>/dev/null; then
|
|
669
|
+
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$RC_FILE"
|
|
670
|
+
success "Added ~/.local/bin to $RC_FILE"
|
|
671
|
+
info "Run 'source $RC_FILE' or start a new terminal to use the 'shooter' command."
|
|
672
|
+
fi
|
|
673
|
+
fi
|
|
674
|
+
;;
|
|
675
|
+
esac
|
|
676
|
+
else
|
|
677
|
+
success "'shooter' command already linked."
|
|
678
|
+
fi
|
|
679
|
+
|
|
680
|
+
# Cloudflare Tunnel
|
|
681
|
+
install_cloudflared
|
|
627
682
|
|
|
628
|
-
|
|
629
|
-
|
|
683
|
+
# Autostart
|
|
684
|
+
enable_autostart
|
|
685
|
+
else
|
|
686
|
+
info "Skipped extras. You can add them later:"
|
|
687
|
+
info " Global command: ln -sf $SHOOTER_REPO/bin/shooter.cjs ~/.local/bin/shooter"
|
|
688
|
+
info " Cloudflare: brew install cloudflared (or see docs)"
|
|
689
|
+
info " Autostart: shooter autostart on"
|
|
690
|
+
fi
|
|
630
691
|
|
|
631
|
-
#
|
|
632
|
-
enable_autostart
|
|
692
|
+
# Start server + tunnel
|
|
633
693
|
start_server_and_tunnel
|
|
634
694
|
|
|
635
695
|
# Done
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# no-ops. If the generator regresses (e.g., after a type-crafter upgrade),
|
|
9
9
|
# they activate and silently fix the output. Do not remove them.
|
|
10
10
|
|
|
11
|
-
FILE="./src/
|
|
11
|
+
FILE="./src/lib/types/generated/Terminal.ts"
|
|
12
12
|
|
|
13
13
|
# Portable sed-in-place helper (works on both BSD/macOS and GNU/Linux)
|
|
14
14
|
_sed_i() {
|
|
@@ -31,7 +31,7 @@ _sed_i 's/contentItem/ContentBlockItem/g' "$FILE"
|
|
|
31
31
|
_sed_i 's/decodeContentItem/decodeContentBlockItem/g' "$FILE"
|
|
32
32
|
|
|
33
33
|
# Remove stale lowercase barrel exports from index.ts
|
|
34
|
-
INDEX="./src/
|
|
34
|
+
INDEX="./src/lib/types/generated/index.ts"
|
|
35
35
|
_sed_i "/export .* from '\\.\\/Apn'/d" "$INDEX"
|
|
36
36
|
_sed_i "/export .* from '\\.\\/Cli'/d" "$INDEX"
|
|
37
37
|
_sed_i "/export .* from '\\.\\/Api'/d" "$INDEX"
|