@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
|
@@ -39,6 +39,20 @@ const LOCAL_BASE_URL = `http://localhost:${LOCAL_PORT}`;
|
|
|
39
39
|
const BASE_URL = USE_LOCAL ? LOCAL_BASE_URL : REMOTE_BASE_URL;
|
|
40
40
|
const API_URL = `${BASE_URL}/api/notify`;
|
|
41
41
|
|
|
42
|
+
// Read API_KEY from ~/.shooter/.env if not in environment
|
|
43
|
+
if (!process.env.API_KEY && !process.env.SHOOTER_API_KEY) {
|
|
44
|
+
const envPath = path.join(require('os').homedir(), '.shooter', '.env');
|
|
45
|
+
try {
|
|
46
|
+
const envContent = fs.readFileSync(envPath, 'utf-8');
|
|
47
|
+
const match = envContent.match(/^API_KEY=["']?([^"'\n]+)["']?$/m);
|
|
48
|
+
if (match) {
|
|
49
|
+
process.env.API_KEY = match[1];
|
|
50
|
+
}
|
|
51
|
+
} catch {
|
|
52
|
+
// .env file doesn't exist — API_KEY must be in environment
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
42
56
|
// Authentication
|
|
43
57
|
const API_KEY = process.env.API_KEY || process.env.SHOOTER_API_KEY;
|
|
44
58
|
const DEVICE_TOKEN = process.env.SHOOTER_DEVICE_TOKEN || null;
|
|
@@ -1467,7 +1481,7 @@ const OpenCodePlugin = async (ctx) => {
|
|
|
1467
1481
|
},
|
|
1468
1482
|
|
|
1469
1483
|
// Specific hook: After tool execution
|
|
1470
|
-
'tool.execute.after': async (input,
|
|
1484
|
+
'tool.execute.after': async (input, _output) => {
|
|
1471
1485
|
const commonEvent = adaptOpenCodeEvent('tool.execute.after', {
|
|
1472
1486
|
tool: input?.tool || 'unknown',
|
|
1473
1487
|
});
|
package/README.md
CHANGED
|
@@ -57,13 +57,13 @@ Open [http://localhost:54007](http://localhost:54007) in your browser. Visit `/c
|
|
|
57
57
|
|
|
58
58
|
## All Setup Methods
|
|
59
59
|
|
|
60
|
-
| Method | Command | Notes
|
|
61
|
-
| ------------------- | ---------------------------------------------------------------------------------------------- |
|
|
60
|
+
| Method | Command | Notes |
|
|
61
|
+
| ------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
62
62
|
| One-command install | `curl -fsSL https://raw.githubusercontent.com/juspay/shooter/release/scripts/install.sh \| sh` | Recommended. Clones to `~/.shooter/repo`, auto-generates API key, builds, installs cloudflared, starts server |
|
|
63
|
-
| Interactive wizard | `pnpm setup` | Walks through env config, builds, and verifies. Pass `--auto` for non-interactive mode.
|
|
64
|
-
| CLI (npx) | `npx @juspay/shooter setup` | No clone needed -- runs the setup wizard directly from npm
|
|
65
|
-
| Docker | `docker compose up -d` | See [Docker](#docker)
|
|
66
|
-
| Manual | See [Manual Setup](#manual-setup) | For advanced users
|
|
63
|
+
| Interactive wizard | `pnpm setup` | Walks through env config, builds, and verifies. Pass `--auto` for non-interactive mode. |
|
|
64
|
+
| CLI (npx) | `npx @juspay/shooter setup` | No clone needed -- runs the setup wizard directly from npm |
|
|
65
|
+
| Docker | `docker compose up -d` | See [Docker](#docker) |
|
|
66
|
+
| Manual | See [Manual Setup](#manual-setup) | For advanced users |
|
|
67
67
|
|
|
68
68
|
### Manual Setup
|
|
69
69
|
|
|
@@ -71,19 +71,23 @@ Open [http://localhost:54007](http://localhost:54007) in your browser. Visit `/c
|
|
|
71
71
|
git clone https://github.com/juspay/shooter.git
|
|
72
72
|
cd shooter
|
|
73
73
|
pnpm install
|
|
74
|
-
|
|
75
|
-
# Edit .env with your values (at minimum, set API_KEY)
|
|
76
|
-
pnpm build
|
|
74
|
+
pnpm setup # generates ~/.shooter/.env with API key, builds the project
|
|
77
75
|
pnpm start
|
|
78
76
|
```
|
|
79
77
|
|
|
80
|
-
|
|
78
|
+
Or without the wizard:
|
|
81
79
|
|
|
82
80
|
```bash
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
git clone https://github.com/juspay/shooter.git
|
|
82
|
+
cd shooter
|
|
83
|
+
pnpm install
|
|
84
|
+
mkdir -p ~/.shooter && echo "API_KEY=$(openssl rand -hex 32)" > ~/.shooter/.env
|
|
85
|
+
pnpm build
|
|
86
|
+
pnpm start
|
|
85
87
|
```
|
|
86
88
|
|
|
89
|
+
> **Note:** Configuration lives in `~/.shooter/.env` (not the repo root). The hook notifier reads `API_KEY` from this file automatically.
|
|
90
|
+
|
|
87
91
|
---
|
|
88
92
|
|
|
89
93
|
## Architecture
|
|
@@ -131,7 +135,7 @@ source ~/.zshrc
|
|
|
131
135
|
|
|
132
136
|
## Configuration
|
|
133
137
|
|
|
134
|
-
|
|
138
|
+
Configuration is stored in `~/.shooter/.env`. The `pnpm setup` wizard generates this file interactively. Only `API_KEY` is required to start -- push notification config can be added later with `shooter setup --push`.
|
|
135
139
|
|
|
136
140
|
| Variable | Required | Default | Description |
|
|
137
141
|
| ---------------------- | -------- | ------- | ---------------------------------------------------------------- |
|
|
@@ -279,11 +283,17 @@ The `PermissionRequest` hook has a 180-second timeout in `.claude/settings.json`
|
|
|
279
283
|
### Quick Start
|
|
280
284
|
|
|
281
285
|
```bash
|
|
282
|
-
|
|
283
|
-
|
|
286
|
+
# Minimal — just set API_KEY:
|
|
287
|
+
echo "API_KEY=$(openssl rand -hex 32)" > .env
|
|
284
288
|
docker compose up -d
|
|
285
289
|
```
|
|
286
290
|
|
|
291
|
+
Or with a Cloudflare Tunnel for remote access:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
docker compose --profile tunnel up -d
|
|
295
|
+
```
|
|
296
|
+
|
|
287
297
|
### Manual Build and Run
|
|
288
298
|
|
|
289
299
|
```bash
|
|
@@ -291,14 +301,16 @@ docker build -t shooter .
|
|
|
291
301
|
|
|
292
302
|
docker run -d \
|
|
293
303
|
--name shooter \
|
|
294
|
-
|
|
304
|
+
-e API_KEY=your-secret-key-here \
|
|
295
305
|
-p 54007:54007 \
|
|
296
306
|
-v shooter-data:/root/.shooter \
|
|
297
307
|
--restart unless-stopped \
|
|
298
308
|
shooter
|
|
299
309
|
```
|
|
300
310
|
|
|
301
|
-
|
|
311
|
+
> **Required:** Set `API_KEY` either via `-e API_KEY=...`, `--env-file .env`, or in `docker-compose.yml`. Without it, all authenticated endpoints return 401.
|
|
312
|
+
|
|
313
|
+
The multi-stage Dockerfile uses `node:20-slim` with native addon binaries copied from the build stage (no build tools in the production image). SQLite data is persisted in the `shooter-data` volume. The `.env` file is injected at runtime and never baked into the image.
|
|
302
314
|
|
|
303
315
|
A separate `Dockerfile.test` is provided for verifying the fresh-user install experience in an isolated container.
|
|
304
316
|
|
|
@@ -311,11 +323,26 @@ services:
|
|
|
311
323
|
ports:
|
|
312
324
|
- '54007:54007'
|
|
313
325
|
env_file:
|
|
314
|
-
- .env
|
|
326
|
+
- path: .env
|
|
327
|
+
required: false
|
|
328
|
+
# Set API_KEY in .env or uncomment below:
|
|
329
|
+
# environment:
|
|
330
|
+
# - API_KEY=your-secret-key-here
|
|
315
331
|
volumes:
|
|
316
332
|
- shooter-data:/root/.shooter
|
|
317
333
|
restart: unless-stopped
|
|
318
334
|
|
|
335
|
+
# Optional: Cloudflare Tunnel for remote access
|
|
336
|
+
# Start with: docker compose --profile tunnel up -d
|
|
337
|
+
tunnel:
|
|
338
|
+
image: cloudflare/cloudflared:latest
|
|
339
|
+
command: tunnel --no-autoupdate --url http://shooter:54007
|
|
340
|
+
depends_on:
|
|
341
|
+
- shooter
|
|
342
|
+
restart: unless-stopped
|
|
343
|
+
profiles:
|
|
344
|
+
- tunnel
|
|
345
|
+
|
|
319
346
|
volumes:
|
|
320
347
|
shooter-data:
|
|
321
348
|
```
|
|
@@ -341,7 +368,7 @@ All endpoints require the `Authorization: Bearer <API_KEY>` header.
|
|
|
341
368
|
| `POST` | `/api/response` | Submit a permission allow/deny decision |
|
|
342
369
|
| `GET` | `/api/response` | Poll for a pending permission decision |
|
|
343
370
|
| `GET` | `/api/sessions` | List sessions across all projects |
|
|
344
|
-
| `POST` | `/api/webhook` |
|
|
371
|
+
| `POST` | `/api/webhook` | Stub — returns 501 (not yet implemented) |
|
|
345
372
|
| `GET` | `/api/qr-config` | Generate QR code for mobile app pairing |
|
|
346
373
|
| `POST` | `/api/device-token` | Register a device token (iOS or Android) |
|
|
347
374
|
| `GET` | `/api/debug` | Debug information (APNs config, device token status) |
|
|
@@ -396,23 +423,23 @@ pnpm format:check # Check formatting without writing
|
|
|
396
423
|
|
|
397
424
|
The `shooter` command (via `bin/shooter.cjs` or the global `shooter` symlink) supports:
|
|
398
425
|
|
|
399
|
-
| Command
|
|
400
|
-
|
|
|
401
|
-
| `shooter start`
|
|
402
|
-
| `shooter stop`
|
|
403
|
-
| `shooter status`
|
|
404
|
-
| `shooter autostart on` | Enable autostart on login (LaunchAgent on macOS, systemd on Linux)
|
|
405
|
-
| `shooter autostart off` | Disable autostart and remove the service definition
|
|
406
|
-
| `shooter logs`
|
|
407
|
-
| `shooter setup`
|
|
408
|
-
| `shooter version`
|
|
409
|
-
| `shooter help`
|
|
426
|
+
| Command | Description |
|
|
427
|
+
| ----------------------- | ------------------------------------------------------------------------------------------- |
|
|
428
|
+
| `shooter start` | Start the server (default if no command given) |
|
|
429
|
+
| `shooter stop` | Stop the running server gracefully (SIGTERM, then SIGKILL after 5s) |
|
|
430
|
+
| `shooter status` | Show PID, URL, autostart state, log path |
|
|
431
|
+
| `shooter autostart on` | Enable autostart on login (LaunchAgent on macOS, systemd on Linux) |
|
|
432
|
+
| `shooter autostart off` | Disable autostart and remove the service definition |
|
|
433
|
+
| `shooter logs` | Tail server logs (log file on macOS, journalctl on Linux) |
|
|
434
|
+
| `shooter setup` | Quick setup (~60s): API key + build. `--auto` for non-interactive, `--push` for push config |
|
|
435
|
+
| `shooter version` | Print version number |
|
|
436
|
+
| `shooter help` | Show all available commands |
|
|
410
437
|
|
|
411
438
|
Process state is tracked via a PID file at `~/.shooter/shooter.pid`. Logs are written to `~/.shooter/logs/shooter.log` when running via autostart.
|
|
412
439
|
|
|
413
440
|
### Type System
|
|
414
441
|
|
|
415
|
-
Types are auto-generated from YAML specifications in `specs/types/` using [type-crafter](https://github.com/nicktaf/type-crafter). Never edit files in `src/
|
|
442
|
+
Types are auto-generated from YAML specifications in `specs/types/` using [type-crafter](https://github.com/nicktaf/type-crafter). Never edit files in `src/lib/types/generated/` directly -- edit the YAML specs and run `pnpm run gen:types`.
|
|
416
443
|
|
|
417
444
|
---
|
|
418
445
|
|
|
@@ -437,8 +464,9 @@ shooter/
|
|
|
437
464
|
hooks/notifier.cjs # Unified hook notifier (Node.js)
|
|
438
465
|
settings.json # Hook configuration (13 event types)
|
|
439
466
|
src/
|
|
440
|
-
generated/types/ # Auto-generated TypeScript types (DO NOT EDIT)
|
|
441
467
|
lib/
|
|
468
|
+
types/
|
|
469
|
+
generated/ # Auto-generated TypeScript types (DO NOT EDIT)
|
|
442
470
|
modules/
|
|
443
471
|
server/
|
|
444
472
|
apn/ # APNs push notification service
|
|
@@ -462,6 +490,9 @@ shooter/
|
|
|
462
490
|
opencode-reader.ts # Parse OpenCode sessions
|
|
463
491
|
client/
|
|
464
492
|
common/ # Reusable UI components
|
|
493
|
+
activity/ # Activity feed components
|
|
494
|
+
dashboard/ # Dashboard components
|
|
495
|
+
neurolink/ # Neurolink integration components
|
|
465
496
|
terminal/
|
|
466
497
|
ChatView.svelte # Structured AI conversation view
|
|
467
498
|
LaunchSheet.svelte # Terminal launch dialog
|
|
@@ -483,6 +514,70 @@ shooter/
|
|
|
483
514
|
|
|
484
515
|
---
|
|
485
516
|
|
|
517
|
+
## Updating
|
|
518
|
+
|
|
519
|
+
If you installed via the one-command installer:
|
|
520
|
+
|
|
521
|
+
```bash
|
|
522
|
+
cd ~/.shooter/repo
|
|
523
|
+
git pull origin release
|
|
524
|
+
pnpm install
|
|
525
|
+
pnpm build
|
|
526
|
+
shooter stop && shooter start -d
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
Or re-run the installer -- it detects the existing installation and offers to update:
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
curl -fsSL https://raw.githubusercontent.com/juspay/shooter/release/scripts/install.sh | sh
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
If you installed via npm:
|
|
536
|
+
|
|
537
|
+
```bash
|
|
538
|
+
npm update -g @juspay/shooter
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
---
|
|
542
|
+
|
|
543
|
+
## Uninstall
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
# 1. Stop the server and disable autostart
|
|
547
|
+
shooter stop
|
|
548
|
+
shooter autostart off
|
|
549
|
+
|
|
550
|
+
# 2. Remove the data directory (config, logs, SQLite database)
|
|
551
|
+
rm -rf ~/.shooter
|
|
552
|
+
|
|
553
|
+
# 3. Remove the global command symlink
|
|
554
|
+
rm -f ~/.local/bin/shooter
|
|
555
|
+
|
|
556
|
+
# 4. Remove the repo (if installed via one-command installer)
|
|
557
|
+
rm -rf ~/.shooter/repo
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
If you installed via npm: `npm uninstall -g @juspay/shooter`
|
|
561
|
+
|
|
562
|
+
To also remove Claude Code hooks, delete the `hooks` section from `.claude/settings.json` in each project that uses Shooter.
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## Reset
|
|
567
|
+
|
|
568
|
+
To reset Shooter to a clean state without reinstalling:
|
|
569
|
+
|
|
570
|
+
```bash
|
|
571
|
+
shooter stop
|
|
572
|
+
rm ~/.shooter/.env # Remove config (re-run shooter setup to regenerate)
|
|
573
|
+
rm ~/.shooter/shooter.db # Remove terminal history database
|
|
574
|
+
rm -rf ~/.shooter/logs # Remove log files
|
|
575
|
+
shooter setup # Regenerate config
|
|
576
|
+
shooter start -d # Restart
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
486
581
|
## Troubleshooting
|
|
487
582
|
|
|
488
583
|
### Server does not start
|
|
@@ -509,9 +604,9 @@ shooter/
|
|
|
509
604
|
|
|
510
605
|
### Hooks not sending notifications
|
|
511
606
|
|
|
512
|
-
- `API_KEY`
|
|
607
|
+
- The notifier reads `API_KEY` from `~/.shooter/.env` automatically. If that file is missing or empty, run `shooter setup`.
|
|
513
608
|
- Verify the hooks are configured in `.claude/settings.json`
|
|
514
|
-
- Test connectivity: `curl -H "Authorization: Bearer $API_KEY" http://localhost:54007/api/health`
|
|
609
|
+
- Test connectivity: `curl -H "Authorization: Bearer $(grep API_KEY ~/.shooter/.env | cut -d= -f2 | tr -d '\"')" http://localhost:54007/api/health`
|
|
515
610
|
|
|
516
611
|
### Terminal sessions lost after restart
|
|
517
612
|
|
|
@@ -526,8 +621,9 @@ shooter/
|
|
|
526
621
|
|
|
527
622
|
### Port already in use
|
|
528
623
|
|
|
529
|
-
-
|
|
530
|
-
-
|
|
624
|
+
- `shooter start` detects port conflicts automatically and prints a clear error
|
|
625
|
+
- Default port is 54007. Set `PORT=<number>` in `~/.shooter/.env` to use a different port
|
|
626
|
+
- To find what's using the port: `lsof -i :54007` (macOS) or `ss -tlnp | grep 54007` (Linux)
|
|
531
627
|
|
|
532
628
|
---
|
|
533
629
|
|
package/bin/shooter.cjs
CHANGED
|
@@ -23,6 +23,23 @@ const SYSTEMD_UNIT = path.join(os.homedir(), '.config', 'systemd', 'user', 'shoo
|
|
|
23
23
|
|
|
24
24
|
const pkg = require(path.join(PKG_ROOT, 'package.json'));
|
|
25
25
|
|
|
26
|
+
// ── Read API key from env files (same chain as src/lib/env.ts) ──────
|
|
27
|
+
function readApiKey() {
|
|
28
|
+
if (process.env.API_KEY) return process.env.API_KEY;
|
|
29
|
+
const envFiles = [
|
|
30
|
+
path.join(SHOOTER_HOME, '.env'),
|
|
31
|
+
path.join(PKG_ROOT, '.env'),
|
|
32
|
+
path.join(os.homedir(), '.shooter', '.env'),
|
|
33
|
+
];
|
|
34
|
+
for (const f of envFiles) {
|
|
35
|
+
try {
|
|
36
|
+
const match = fs.readFileSync(f, 'utf8').match(/^API_KEY=(.+)$/m);
|
|
37
|
+
if (match) return match[1].trim();
|
|
38
|
+
} catch {}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
26
43
|
// ── Signal Helpers ──────────────────────────────────────────────────
|
|
27
44
|
function signalCode(sig) {
|
|
28
45
|
return os.constants.signals[sig] || 0;
|
|
@@ -38,7 +55,11 @@ function readPid() {
|
|
|
38
55
|
// Verify it's actually a node/shooter process (prevent PID reuse attacks)
|
|
39
56
|
try {
|
|
40
57
|
const cmdline = execSync(`ps -p ${pid} -o command= 2>/dev/null`, { encoding: 'utf8' }).trim();
|
|
41
|
-
if (
|
|
58
|
+
if (
|
|
59
|
+
!cmdline.includes('shooter') &&
|
|
60
|
+
!cmdline.includes('server.ts') &&
|
|
61
|
+
!cmdline.includes('tsx')
|
|
62
|
+
) {
|
|
42
63
|
// PID was reused by a different process — stale pidfile
|
|
43
64
|
fs.unlinkSync(PID_FILE);
|
|
44
65
|
return null;
|
|
@@ -59,7 +80,9 @@ function writePid(pid) {
|
|
|
59
80
|
}
|
|
60
81
|
|
|
61
82
|
function removePid() {
|
|
62
|
-
try {
|
|
83
|
+
try {
|
|
84
|
+
fs.unlinkSync(PID_FILE);
|
|
85
|
+
} catch {}
|
|
63
86
|
}
|
|
64
87
|
|
|
65
88
|
// ── CLI argument parsing ────────────────────────────────────────────
|
|
@@ -140,7 +163,9 @@ function startTunnel(port) {
|
|
|
140
163
|
if (match) {
|
|
141
164
|
clearInterval(poll);
|
|
142
165
|
fs.writeFileSync(tunnelUrlFile, match[0]);
|
|
166
|
+
const apiKey = readApiKey();
|
|
143
167
|
console.log(`Tunnel active: ${match[0]}`);
|
|
168
|
+
console.log(` API key: ${apiKey ? '(set)' : '(not set — run shooter setup)'}`);
|
|
144
169
|
}
|
|
145
170
|
} catch {}
|
|
146
171
|
waited += 1;
|
|
@@ -159,10 +184,16 @@ function stopTunnel() {
|
|
|
159
184
|
try {
|
|
160
185
|
const pid = parseInt(fs.readFileSync(tunnelPidFile, 'utf8').trim(), 10);
|
|
161
186
|
if (!isNaN(pid)) {
|
|
162
|
-
try {
|
|
187
|
+
try {
|
|
188
|
+
process.kill(pid, 'SIGTERM');
|
|
189
|
+
} catch {}
|
|
163
190
|
}
|
|
164
|
-
try {
|
|
165
|
-
|
|
191
|
+
try {
|
|
192
|
+
fs.unlinkSync(tunnelPidFile);
|
|
193
|
+
} catch {}
|
|
194
|
+
try {
|
|
195
|
+
fs.unlinkSync(tunnelUrlFile);
|
|
196
|
+
} catch {}
|
|
166
197
|
} catch {}
|
|
167
198
|
}
|
|
168
199
|
|
|
@@ -187,6 +218,18 @@ function startServer() {
|
|
|
187
218
|
const noTunnel = hasFlag('--no-tunnel');
|
|
188
219
|
const port = resolvePort();
|
|
189
220
|
|
|
221
|
+
// Check if port is already in use (no external tools needed)
|
|
222
|
+
try {
|
|
223
|
+
execSync(
|
|
224
|
+
`"${process.execPath}" -e "const s=require('net').createServer();s.listen(${parseInt(port, 10)},()=>s.close());s.on('error',e=>{if(e.code==='EADDRINUSE')process.exit(1)})"`,
|
|
225
|
+
{ stdio: 'ignore', timeout: 2000 }
|
|
226
|
+
);
|
|
227
|
+
} catch {
|
|
228
|
+
console.error(`Error: Port ${port} is already in use.`);
|
|
229
|
+
console.error('Stop the existing process or set a different PORT in ~/.shooter/.env');
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
|
|
190
233
|
if (daemon) {
|
|
191
234
|
// ── Daemon mode: detach, redirect to log file ──
|
|
192
235
|
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
@@ -222,26 +265,29 @@ function startServer() {
|
|
|
222
265
|
child.unref();
|
|
223
266
|
fs.closeSync(logFd);
|
|
224
267
|
|
|
268
|
+
const apiKey = readApiKey();
|
|
225
269
|
console.log(`Shooter started in background (PID ${child.pid}).`);
|
|
226
|
-
console.log(` URL:
|
|
227
|
-
console.log(`
|
|
270
|
+
console.log(` URL: http://localhost:${port}`);
|
|
271
|
+
console.log(` API key: ${apiKey ? '(set)' : '(not set — run shooter setup)'}`);
|
|
272
|
+
console.log(` Logs: ${LOG_FILE}`);
|
|
228
273
|
|
|
229
|
-
//
|
|
274
|
+
// Start tunnel in background if available; it writes URL to ~/.shooter/.tunnel_url
|
|
230
275
|
if (!noTunnel && isCloudflaredAvailable()) {
|
|
231
276
|
setTimeout(() => {
|
|
232
277
|
startTunnel(port);
|
|
233
278
|
}, 3000);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
} else {
|
|
237
|
-
if (!noTunnel && !isCloudflaredAvailable()) {
|
|
238
|
-
console.log(' (cloudflared not found — no tunnel. Install: brew install cloudflared)');
|
|
239
|
-
}
|
|
240
|
-
process.exit(0);
|
|
279
|
+
} else if (!noTunnel && !isCloudflaredAvailable()) {
|
|
280
|
+
console.log(' (cloudflared not found — no tunnel. Install: brew install cloudflared)');
|
|
241
281
|
}
|
|
282
|
+
// Exit immediately — daemon is running, tunnel starts async
|
|
283
|
+
process.exit(0);
|
|
242
284
|
} else {
|
|
243
285
|
// ── Foreground mode: inherit stdio ──
|
|
244
|
-
const
|
|
286
|
+
const tsxLoader = path.join(PKG_ROOT, 'node_modules', 'tsx', 'dist', 'loader.mjs');
|
|
287
|
+
const nodeArgs = fs.existsSync(tsxLoader)
|
|
288
|
+
? ['--import', `file://${tsxLoader}`, serverEntry]
|
|
289
|
+
: ['--import', 'tsx', serverEntry];
|
|
290
|
+
const child = spawn(process.execPath, nodeArgs, {
|
|
245
291
|
cwd: PKG_ROOT,
|
|
246
292
|
stdio: 'inherit',
|
|
247
293
|
env: {
|
|
@@ -253,6 +299,9 @@ function startServer() {
|
|
|
253
299
|
|
|
254
300
|
writePid(child.pid);
|
|
255
301
|
|
|
302
|
+
// Clean up any stale tunnel from previous run (important for LaunchAgent restart)
|
|
303
|
+
stopTunnel();
|
|
304
|
+
|
|
256
305
|
// Start tunnel in foreground mode too (unless --no-tunnel)
|
|
257
306
|
let tunnelStarted = false;
|
|
258
307
|
if (!noTunnel && isCloudflaredAvailable()) {
|
|
@@ -313,7 +362,9 @@ function stopServer() {
|
|
|
313
362
|
if (waited > 5000) {
|
|
314
363
|
clearInterval(check);
|
|
315
364
|
console.log('Force-killing...');
|
|
316
|
-
try {
|
|
365
|
+
try {
|
|
366
|
+
process.kill(pid, 'SIGKILL');
|
|
367
|
+
} catch {}
|
|
317
368
|
removePid();
|
|
318
369
|
console.log('Shooter stopped.');
|
|
319
370
|
}
|
|
@@ -349,7 +400,9 @@ function showStatus() {
|
|
|
349
400
|
const autostartEnabled = isAutostartInstalled();
|
|
350
401
|
const tunnelUrlFile = path.join(SHOOTER_HOME, '.tunnel_url');
|
|
351
402
|
let tunnelUrl = null;
|
|
352
|
-
try {
|
|
403
|
+
try {
|
|
404
|
+
tunnelUrl = fs.readFileSync(tunnelUrlFile, 'utf8').trim();
|
|
405
|
+
} catch {}
|
|
353
406
|
|
|
354
407
|
if (pid) {
|
|
355
408
|
console.log(`Shooter is running`);
|
|
@@ -448,7 +501,7 @@ function enableLaunchAgent() {
|
|
|
448
501
|
<key>EnvironmentVariables</key>
|
|
449
502
|
<dict>
|
|
450
503
|
<key>PATH</key>
|
|
451
|
-
<string>${path.dirname(nodeBin)}:/usr/local/bin:/usr/bin:/bin</string>
|
|
504
|
+
<string>${path.dirname(nodeBin)}:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
|
|
452
505
|
<key>SHOOTER_HOME</key>
|
|
453
506
|
<string>${SHOOTER_HOME}</string>
|
|
454
507
|
</dict>
|
|
@@ -474,7 +527,9 @@ function enableLaunchAgent() {
|
|
|
474
527
|
|
|
475
528
|
// Unload existing if present
|
|
476
529
|
if (fs.existsSync(LAUNCHD_PLIST)) {
|
|
477
|
-
try {
|
|
530
|
+
try {
|
|
531
|
+
execSync(`launchctl unload "${LAUNCHD_PLIST}" 2>/dev/null`);
|
|
532
|
+
} catch {}
|
|
478
533
|
}
|
|
479
534
|
|
|
480
535
|
fs.writeFileSync(LAUNCHD_PLIST, plist);
|
|
@@ -493,7 +548,9 @@ function disableLaunchAgent() {
|
|
|
493
548
|
return;
|
|
494
549
|
}
|
|
495
550
|
|
|
496
|
-
try {
|
|
551
|
+
try {
|
|
552
|
+
execSync(`launchctl unload "${LAUNCHD_PLIST}" 2>/dev/null`);
|
|
553
|
+
} catch {}
|
|
497
554
|
fs.unlinkSync(LAUNCHD_PLIST);
|
|
498
555
|
console.log('Autostart disabled. LaunchAgent removed.');
|
|
499
556
|
}
|
|
@@ -539,10 +596,16 @@ function disableSystemdUnit() {
|
|
|
539
596
|
return;
|
|
540
597
|
}
|
|
541
598
|
|
|
542
|
-
try {
|
|
543
|
-
|
|
599
|
+
try {
|
|
600
|
+
execSync('systemctl --user stop shooter.service 2>/dev/null');
|
|
601
|
+
} catch {}
|
|
602
|
+
try {
|
|
603
|
+
execSync('systemctl --user disable shooter.service 2>/dev/null');
|
|
604
|
+
} catch {}
|
|
544
605
|
fs.unlinkSync(SYSTEMD_UNIT);
|
|
545
|
-
try {
|
|
606
|
+
try {
|
|
607
|
+
execSync('systemctl --user daemon-reload');
|
|
608
|
+
} catch {}
|
|
546
609
|
console.log('Autostart disabled. systemd unit removed.');
|
|
547
610
|
}
|
|
548
611
|
|
|
@@ -553,9 +616,13 @@ function showLogs() {
|
|
|
553
616
|
|
|
554
617
|
// For systemd on Linux, use journalctl
|
|
555
618
|
if (platform === 'linux' && fs.existsSync(SYSTEMD_UNIT)) {
|
|
556
|
-
const child = spawn(
|
|
557
|
-
|
|
558
|
-
|
|
619
|
+
const child = spawn(
|
|
620
|
+
'journalctl',
|
|
621
|
+
['--user', '-u', 'shooter.service', '-f', '--no-pager', '-n', '50'],
|
|
622
|
+
{
|
|
623
|
+
stdio: 'inherit',
|
|
624
|
+
}
|
|
625
|
+
);
|
|
559
626
|
child.on('exit', (code) => process.exit(code ?? 0));
|
|
560
627
|
for (const sig of ['SIGTERM', 'SIGINT']) {
|
|
561
628
|
process.on(sig, () => child.kill(sig));
|
|
@@ -630,7 +697,8 @@ Commands:
|
|
|
630
697
|
autostart on Start automatically on login (macOS/Linux)
|
|
631
698
|
autostart off Disable autostart
|
|
632
699
|
logs Tail server logs
|
|
633
|
-
setup
|
|
700
|
+
setup Quick setup (API key + build, ~60 seconds)
|
|
701
|
+
setup --push Add/reconfigure push notifications
|
|
634
702
|
version Show version number
|
|
635
703
|
help Show this help message
|
|
636
704
|
|
|
@@ -645,7 +713,8 @@ Examples:
|
|
|
645
713
|
shooter status Check status and tunnel URL
|
|
646
714
|
shooter autostart on Enable autostart on login
|
|
647
715
|
shooter logs Follow server logs
|
|
648
|
-
shooter setup
|
|
716
|
+
shooter setup Quick setup (~60s, push deferred)
|
|
717
|
+
shooter setup --push Add iOS/Android push notifications
|
|
649
718
|
`.trim()
|
|
650
719
|
);
|
|
651
720
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@keyframes svelte-1qbe2oo-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes svelte-1qbe2oo-activity-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.7}}.card.svelte-1qbe2oo{background:var(--component-bg, #1a1a1a);border:1px solid var(--border, #2e2e2e);border-left:4px solid var(--status-color, #6b7280);border-radius:var(--radius-lg, 8px);padding:var(--space-4, 16px);display:flex;flex-direction:column;gap:var(--space-3, 12px);cursor:pointer;transition:border-color var(--transition-fast, .15s ease),background var(--transition-fast, .15s ease);color:inherit;text-align:left;width:100%}.card.svelte-1qbe2oo:hover{background:var(--component-bg-hover, #1f1f1f);border-color:var(--border-hover, #454545);border-left-color:var(--status-color, #6b7280)}.card.svelte-1qbe2oo:focus-visible{outline:2px solid var(--ds-blue-700, #0070f3);outline-offset:2px}.card-header.svelte-1qbe2oo{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2, 8px);min-width:0}.project-name.svelte-1qbe2oo{font-size:var(--text-base, 14px);font-weight:600;color:var(--text-primary, #ededed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.status-pill{--pill-font-size: var(--text-xs, 12px);--pill-font-weight: 500;--pill-padding: 3px 10px;--pill-border-radius: var(--radius-full, 9999px);--pill-cursor: default;flex-shrink:0}.status-pill--running-active{--pill-background: var(--ds-green-100);--pill-color: var(--ds-green-700);--pill-hover-background: var(--ds-green-100);--pill-hover-color: var(--ds-green-700);animation:svelte-1qbe2oo-pulse 2s ease-in-out infinite}.status-pill--running{--pill-background: var(--ds-blue-100);--pill-color: var(--ds-blue-700);--pill-hover-background: var(--ds-blue-100);--pill-hover-color: var(--ds-blue-700)}.status-pill--idle{--pill-background: var(--ds-amber-100);--pill-color: var(--ds-amber-700);--pill-hover-background: var(--ds-amber-100);--pill-hover-color: var(--ds-amber-700)}.status-pill--exited{--pill-background: var(--ds-gray-alpha-200);--pill-color: var(--ds-gray-600);--pill-hover-background: var(--ds-gray-alpha-200);--pill-hover-color: var(--ds-gray-600)}.status-pill--error{--pill-background: var(--ds-red-100);--pill-color: var(--ds-red-700);--pill-hover-background: var(--ds-red-100);--pill-hover-color: var(--ds-red-700)}.goal-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-secondary, #a1a1a1);font-style:italic;margin:0;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:var(--leading-normal, 1.5)}.summary-row.svelte-1qbe2oo{min-height:18px}.summary-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-primary, #ededed);line-height:var(--leading-normal, 1.5);display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.summarizing.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--ds-amber-700);font-style:italic}.summary-fallback.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);font-style:italic}.stats-row.svelte-1qbe2oo{display:flex;align-items:center;gap:var(--space-3, 12px);flex-wrap:wrap;min-width:0}.stat.svelte-1qbe2oo{display:inline-flex;align-items:center;gap:var(--space-1, 4px);font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);white-space:nowrap}.stat-error.svelte-1qbe2oo{color:var(--ds-red-700)}.stat-path.svelte-1qbe2oo{font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1;text-align:right}.status-dot-active.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-green-700);animation:svelte-1qbe2oo-activity-pulse .6s ease-in-out infinite;flex-shrink:0}.status-dot-static.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-gray-600, #878787);flex-shrink:0}@media(max-width:768px){.card.svelte-1qbe2oo{padding:10px 12px}.stats-row.svelte-1qbe2oo{flex-wrap:wrap;gap:4px}}@media(max-width:480px){.card.svelte-1qbe2oo{padding:8px 10px}.goal-text.svelte-1qbe2oo{-webkit-line-clamp:1;line-clamp:1}}.section.svelte-14sxgtb{display:flex;flex-direction:column;gap:var(--space-3, 12px);margin-bottom:var(--space-6, 24px)}.section-label.svelte-14sxgtb{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary, #a1a1a1);margin:0 0 var(--space-1, 4px) 0}.page-header.svelte-1uha8ag{margin-bottom:var(--space-6)}.page-header-content.svelte-1uha8ag{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--space-4)}.page-title.svelte-1uha8ag{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-1)}.page-description.svelte-1uha8ag{font-size:var(--text-sm);color:var(--text-secondary)}.page-actions.svelte-1uha8ag{display:flex;gap:var(--space-2);flex-shrink:0}.dashboard-section.svelte-1uha8ag{margin-bottom:var(--space-6)}.section-label.svelte-1uha8ag{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:var(--space-3)}.projects-container.svelte-1uha8ag{display:flex;flex-direction:column;gap:var(--space-4);animation:fadeIn .2s ease}@media(max-width:768px){.page-header-content.svelte-1uha8ag{flex-direction:column;gap:var(--space-4)}}@media(max-width:480px){.page-actions.svelte-1uha8ag{width:100%}.page-actions.svelte-1uha8ag button{flex:1}}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.feed.svelte-tc58m{display:flex;flex-direction:column;height:100%}header.svelte-tc58m{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-3) 0}h2.svelte-tc58m{margin:0;font-size:var(--text-lg)}.status.svelte-tc58m{font-size:var(--text-xs);color:var(--text-tertiary)}.status.live.svelte-tc58m{color:var(--ds-green-700)}.summarizing.svelte-tc58m{font-size:var(--text-xs);color:var(--ds-amber-700)}.entries.svelte-tc58m{flex:1;overflow-y:auto}.empty.svelte-tc58m{color:var(--text-tertiary);font-size:var(--text-sm)}.summary-card.svelte-tc58m{padding:var(--space-2) var(--space-3);margin-bottom:var(--space-2);background:var(--component-bg);border-radius:var(--radius-md);border-left:3px solid var(--ds-green-700)}.summary-card.svelte-tc58m time:where(.svelte-tc58m){font-size:var(--text-xs);color:var(--text-tertiary)}.summary-card.svelte-tc58m p:where(.svelte-tc58m){margin:var(--space-1) 0 2px;font-size:var(--text-sm);line-height:var(--leading-normal)}.event-count.svelte-tc58m{font-size:var(--text-xs);color:var(--text-tertiary)}.pending.svelte-tc58m{padding:var(--space-2) var(--space-3);font-size:var(--text-xs);color:var(--ds-amber-700)}.raw-toggle{--button-color: transparent;--button-text-color: var(--text-tertiary);--button-hover-color: transparent;--button-hover-text-color: var(--text-secondary);--button-font-family: var(--font-mono);--button-font-size: var(--text-xs);--button-padding: var(--space-2) 0;text-align:left}.raw-events.svelte-tc58m{font-size:var(--text-xs);max-height:200px;overflow-y:auto}.raw-event.svelte-tc58m{display:flex;gap:var(--space-2);padding:2px 0;opacity:1}.raw-event.summarized.svelte-tc58m{opacity:.5}.raw-event.svelte-tc58m time:where(.svelte-tc58m){color:var(--text-tertiary);min-width:60px}.raw-event.svelte-tc58m .project:where(.svelte-tc58m){color:var(--text-tertiary);min-width:80px;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.type.svelte-tc58m{color:var(--ds-blue-700)}.project-group.svelte-tc58m{margin-bottom:var(--space-4)}.project-name.svelte-tc58m{margin:0 0 var(--space-2) 0;font-size:var(--text-xs);font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.5px}.tool.svelte-tc58m{color:var(--ds-green-700)}.file-path.svelte-tc58m{color:var(--ds-amber-700);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}code.svelte-tc58m{color:var(--text-tertiary);font-size:var(--text-xs)}.page-title.svelte-13r34ge{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-4)}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.settings-container.svelte-1gp6n77{max-width:900px;margin:0 auto;padding-bottom:var(--space-6)}.page-header.svelte-1gp6n77{margin-bottom:var(--space-8)}.page-title.svelte-1gp6n77{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-1)}.page-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary)}.settings-grid.svelte-1gp6n77{display:grid;grid-template-columns:1fr 320px;gap:var(--space-6);align-items:start}.settings-section.svelte-1gp6n77,.settings-sidebar.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-4)}.button-group.svelte-1gp6n77{display:flex;gap:var(--space-3);justify-content:flex-end}.setup-stepper{--container-flex-direction: column;--step-flex-direction: row;--step-index-container-height: 24px;--step-index-container-width: 24px;--step-index-font-size: var(--text-xs);--step-text-font-size: var(--text-sm);--step-text-margin: 0 0 0 var(--space-3);--separator-display: none;--step-text-active-color: var(--text-primary);--step-text-completed-color: var(--ds-green-900);--step-index-container-active-background-color: var(--component-bg-active);--step-index-container-completed-background-color: var(--ds-green-700);--step-index-container-background-color: var(--component-bg-active);--step-index-color: var(--text-secondary);align-items:flex-start;gap:var(--space-3)}.qr-section.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-3)}.qr-section.svelte-1gp6n77 .button-container{align-self:center}.qr-container.svelte-1gp6n77{display:flex;justify-content:center;padding:var(--space-3);background:var(--ds-background-200);border:1px solid var(--border);border-radius:var(--radius-lg)}.qr-image.svelte-1gp6n77{width:200px;height:200px;border-radius:var(--radius-sm);image-rendering:pixelated}.qr-placeholder.svelte-1gp6n77{display:flex;align-items:center;justify-content:center;height:200px;background:var(--ds-background-200);border:1px dashed var(--border);border-radius:var(--radius-lg)}.qr-loading-text.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-tertiary)}.qr-hint.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-secondary);line-height:var(--leading-relaxed);text-align:center}.qr-server-url.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary);text-align:center}.qr-server-url.svelte-1gp6n77 code:where(.svelte-1gp6n77){font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-secondary);background:var(--component-bg);padding:1px 4px;border-radius:var(--radius-sm)}.qr-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-relaxed)}.qr-error.svelte-1gp6n77{font-size:var(--text-sm);color:var(--ds-red-900);line-height:var(--leading-relaxed)}.settings-sidebar.svelte-1gp6n77 .card:last-child{border-color
|
|
1
|
+
.settings-container.svelte-1gp6n77{max-width:900px;margin:0 auto;padding-bottom:var(--space-6)}.page-header.svelte-1gp6n77{margin-bottom:var(--space-8)}.page-title.svelte-1gp6n77{font-size:var(--text-2xl);font-weight:600;letter-spacing:-.03em;color:var(--text-primary);margin-bottom:var(--space-1)}.page-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary)}.settings-grid.svelte-1gp6n77{display:grid;grid-template-columns:1fr 320px;gap:var(--space-6);align-items:start}.settings-section.svelte-1gp6n77,.settings-sidebar.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-4)}.button-group.svelte-1gp6n77{display:flex;gap:var(--space-3);justify-content:flex-end}.setup-stepper{--container-flex-direction: column;--step-flex-direction: row;--step-index-container-height: 24px;--step-index-container-width: 24px;--step-index-font-size: var(--text-xs);--step-text-font-size: var(--text-sm);--step-text-margin: 0 0 0 var(--space-3);--separator-display: none;--step-text-active-color: var(--text-primary);--step-text-completed-color: var(--ds-green-900);--step-index-container-active-background-color: var(--component-bg-active);--step-index-container-completed-background-color: var(--ds-green-700);--step-index-container-background-color: var(--component-bg-active);--step-index-color: var(--text-secondary);align-items:flex-start;gap:var(--space-3)}.qr-section.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-3)}.qr-section.svelte-1gp6n77 .button-container{align-self:center}.qr-container.svelte-1gp6n77{display:flex;justify-content:center;padding:var(--space-3);background:var(--ds-background-200);border:1px solid var(--border);border-radius:var(--radius-lg)}.qr-image.svelte-1gp6n77{width:200px;height:200px;border-radius:var(--radius-sm);image-rendering:pixelated}.qr-placeholder.svelte-1gp6n77{display:flex;align-items:center;justify-content:center;height:200px;background:var(--ds-background-200);border:1px dashed var(--border);border-radius:var(--radius-lg)}.qr-loading-text.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-tertiary)}.qr-hint.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-secondary);line-height:var(--leading-relaxed);text-align:center}.qr-server-url.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary);text-align:center}.qr-server-url.svelte-1gp6n77 code:where(.svelte-1gp6n77){font-family:var(--font-mono);font-size:var(--text-xs);color:var(--text-secondary);background:var(--component-bg);padding:1px 4px;border-radius:var(--radius-sm)}.qr-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-relaxed)}.qr-error.svelte-1gp6n77{font-size:var(--text-sm);color:var(--ds-red-900);line-height:var(--leading-relaxed)}.settings-sidebar.svelte-1gp6n77 .card:last-child{border-color:color-mix(in srgb,var(--ds-red-700) 30%,transparent)}.ai-providers.svelte-1gp6n77{display:flex;flex-direction:column;gap:var(--space-2)}.provider-row.svelte-1gp6n77{display:flex;align-items:center;gap:var(--space-2);font-size:var(--text-sm)}.provider-label.svelte-1gp6n77{flex:1;color:var(--text-primary)}.provider-status.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary)}.provider-status.configured.svelte-1gp6n77{color:var(--ds-green-900)}.active-provider.svelte-1gp6n77{margin-top:var(--space-2);padding-top:var(--space-2);border-top:1px solid var(--border);font-size:var(--text-xs);color:var(--text-secondary)}.ai-help.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-secondary);margin-top:var(--space-2)}.ai-help.svelte-1gp6n77 code:where(.svelte-1gp6n77){background:var(--ds-gray-200, #1a1a1a);padding:1px 4px;border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs)}.danger-description.svelte-1gp6n77{font-size:var(--text-sm);color:var(--text-secondary);margin-bottom:var(--space-4);line-height:var(--leading-relaxed);padding-left:var(--space-3);border-left:3px solid color-mix(in srgb,var(--ds-red-700) 50%,transparent)}.input-help.svelte-1gp6n77{font-size:var(--text-xs);color:var(--text-tertiary);margin-top:var(--space-1);margin-bottom:0}.input-help.svelte-1gp6n77 code:where(.svelte-1gp6n77){background:var(--ds-gray-200, #1a1a1a);padding:1px 4px;border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:var(--text-xs)}@media(max-width:768px){.settings-grid.svelte-1gp6n77{grid-template-columns:1fr}.button-group.svelte-1gp6n77{flex-direction:column}.button-group.svelte-1gp6n77 button,.button-group.svelte-1gp6n77 .button-container{width:100%}}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.page.svelte-sjabew{display:flex;flex-direction:column;height:100vh;background:var(--background);color:var(--text-primary);font-family:var(--font-mono);padding:0}header.svelte-sjabew{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--border)}h1.svelte-sjabew{font-size:var(--text-lg);color:var(--ds-blue-700);margin:0}.version.svelte-sjabew{color:var(--text-tertiary);font-size:var(--text-xs)}.pill-connected{--pill-background: var(--ds-green-100);--pill-color: var(--ds-green-700);--pill-font-size: var(--text-xs)}.pill-loading{--pill-background: var(--ds-amber-100);--pill-color: var(--ds-amber-700);--pill-font-size: var(--text-xs)}.provider-bar.svelte-sjabew{display:flex;gap:var(--space-2);padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--border);flex-wrap:wrap}.prov-pill{--pill-background: var(--component-bg);--pill-color: var(--text-tertiary);--pill-font-size: var(--text-xs);--pill-cursor: pointer;--pill-border-radius: var(--radius-md)}.prov-pill:hover{--pill-color: var(--text-primary)}.prov-pill--active{--pill-background: var(--ds-blue-100);--pill-color: var(--ds-blue-700)}.log.svelte-sjabew{flex:1;overflow-y:auto;padding:var(--space-3) var(--space-4);font-size:var(--text-sm);line-height:1.6}.log-entry.svelte-sjabew{white-space:pre-wrap;margin-bottom:var(--space-1)}.log-entry.pass.svelte-sjabew{color:var(--ds-green-900)}.log-entry.fail.svelte-sjabew{color:var(--ds-red-900)}.log-entry.dim.svelte-sjabew{color:var(--text-tertiary);font-size:var(--text-xs)}.log-entry.user.svelte-sjabew{color:var(--ds-blue-700);font-weight:700}.log-entry.ai.svelte-sjabew{color:var(--text-primary);padding:var(--space-2) var(--space-3);background:var(--component-bg);border-radius:var(--radius-md);margin:var(--space-1) 0}.input-bar.svelte-sjabew{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border-top:1px solid var(--border)}.input-bar.svelte-sjabew .input-prompt{flex:1;--input-font-family: var(--font-mono);--input-background: var(--component-bg);--input-border: 1px solid var(--border-hover);--input-focus-border: 1px solid var(--ds-blue-700);--input-container-margin: 0}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as u,q as S,v as h,w as o,x as v,D as x,S as T}from"./CJFjKwJ7.js";function n(r,s){return r===s||r?.[T]===s}function l(r={},s,i,b){var c=u.r,p=v;return S(()=>{var f,a;return h(()=>{f=a,a=[],o(()=>{r!==i(...a)&&(s(r,...a),f&&n(i(...f),r)&&s(null,...f))})}),()=>{let t=p;for(;t!==c&&t.parent!==null&&t.parent.f&x;)t=t.parent;const w=()=>{a&&n(i(...a),r)&&s(null,...a)},d=t.teardown;t.teardown=()=>{w(),d?.()}}}),r}export{l as b};
|
|
Binary file
|
|
Binary file
|