@juspay/shooter 1.0.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 +1431 -0
- package/.claude/settings.json +162 -0
- package/README.md +515 -0
- package/bin/shooter.cjs +141 -0
- package/build/client/_app/immutable/assets/0.CM9Hl6d-.css +1 -0
- package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.br +0 -0
- package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +1 -0
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +1 -0
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.C0uFg0IS.css +1 -0
- package/build/client/_app/immutable/assets/3.C0uFg0IS.css.br +0 -0
- package/build/client/_app/immutable/assets/3.C0uFg0IS.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.cJuCkJKZ.css +1 -0
- package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.br +0 -0
- package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.DRjApZQW.css +1 -0
- package/build/client/_app/immutable/assets/5.DRjApZQW.css.br +0 -0
- package/build/client/_app/immutable/assets/5.DRjApZQW.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.AraZrY8I.css +1 -0
- package/build/client/_app/immutable/assets/6.AraZrY8I.css.br +0 -0
- package/build/client/_app/immutable/assets/6.AraZrY8I.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.BCJ1IuMx.css +1 -0
- package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.br +0 -0
- package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css +1 -0
- package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.br +0 -0
- package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.gz +0 -0
- package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css +1 -0
- package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.br +0 -0
- package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.gz +0 -0
- package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css +1 -0
- package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.br +0 -0
- package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.gz +0 -0
- package/build/client/_app/immutable/chunks/BNJphC1q.js +56 -0
- package/build/client/_app/immutable/chunks/BNJphC1q.js.br +0 -0
- package/build/client/_app/immutable/chunks/BNJphC1q.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BTGVxaYV.js +9 -0
- package/build/client/_app/immutable/chunks/BTGVxaYV.js.br +0 -0
- package/build/client/_app/immutable/chunks/BTGVxaYV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BlxrFPDK.js +1 -0
- package/build/client/_app/immutable/chunks/BlxrFPDK.js.br +0 -0
- package/build/client/_app/immutable/chunks/BlxrFPDK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bvk7mfPM.js +1 -0
- package/build/client/_app/immutable/chunks/Bvk7mfPM.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bvk7mfPM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CAokzuPQ.js +1 -0
- package/build/client/_app/immutable/chunks/CAokzuPQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/CAokzuPQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CGLrx-H5.js +1 -0
- package/build/client/_app/immutable/chunks/CGLrx-H5.js.br +0 -0
- package/build/client/_app/immutable/chunks/CGLrx-H5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CgCpWzEA.js +1 -0
- package/build/client/_app/immutable/chunks/CgCpWzEA.js.br +0 -0
- package/build/client/_app/immutable/chunks/CgCpWzEA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cjwk_cGO.js +6 -0
- package/build/client/_app/immutable/chunks/Cjwk_cGO.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cjwk_cGO.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CtQ8EED1.js +11 -0
- package/build/client/_app/immutable/chunks/CtQ8EED1.js.br +0 -0
- package/build/client/_app/immutable/chunks/CtQ8EED1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DERQCisl.js +1 -0
- package/build/client/_app/immutable/chunks/DERQCisl.js.br +0 -0
- package/build/client/_app/immutable/chunks/DERQCisl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DKrg8TQs.js +1 -0
- package/build/client/_app/immutable/chunks/DKrg8TQs.js.br +0 -0
- package/build/client/_app/immutable/chunks/DKrg8TQs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DLu6yJIZ.js +1 -0
- package/build/client/_app/immutable/chunks/DLu6yJIZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DLu6yJIZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dkkpz_4D.js +126 -0
- package/build/client/_app/immutable/chunks/Dkkpz_4D.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dkkpz_4D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DoczjQhA.js +1 -0
- package/build/client/_app/immutable/chunks/DoczjQhA.js.br +0 -0
- package/build/client/_app/immutable/chunks/DoczjQhA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/PPVm8Dsz.js +1 -0
- package/build/client/_app/immutable/chunks/PPVm8Dsz.js.br +0 -0
- package/build/client/_app/immutable/chunks/PPVm8Dsz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/RpcNruLP.js +2 -0
- package/build/client/_app/immutable/chunks/RpcNruLP.js.br +0 -0
- package/build/client/_app/immutable/chunks/RpcNruLP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/a-St0Zwo.js +1 -0
- package/build/client/_app/immutable/chunks/a-St0Zwo.js.br +0 -0
- package/build/client/_app/immutable/chunks/a-St0Zwo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/bo70OQUZ.js +1 -0
- package/build/client/_app/immutable/chunks/bo70OQUZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/bo70OQUZ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.QvGgdvTI.js +2 -0
- package/build/client/_app/immutable/entry/app.QvGgdvTI.js.br +0 -0
- package/build/client/_app/immutable/entry/app.QvGgdvTI.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BntDNRMC.js +1 -0
- package/build/client/_app/immutable/entry/start.BntDNRMC.js.br +0 -0
- package/build/client/_app/immutable/entry/start.BntDNRMC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js +1 -0
- package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.MG1QhfrI.js +1 -0
- package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.B4MlOSh6.js +1 -0
- package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.DIwYkjDn.js +3 -0
- package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.D-cIe70D.js +1 -0
- package/build/client/_app/immutable/nodes/4.D-cIe70D.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.D-cIe70D.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.D7zPRe3L.js +1 -0
- package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BB7QE48r.js +2 -0
- package/build/client/_app/immutable/nodes/6.BB7QE48r.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BB7QE48r.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.D8mqsrZG.js +2 -0
- package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.gz +0 -0
- package/build/client/_app/version.json +1 -0
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/app-icon.png +0 -0
- package/build/client/apple-touch-icon.png +0 -0
- package/build/client/favicon.png +0 -0
- package/build/client/favicon.svg +10 -0
- package/build/client/favicon.svg.br +0 -0
- package/build/client/favicon.svg.gz +0 -0
- package/build/client/manifest.webmanifest +1 -0
- package/build/client/pwa-192x192.png +0 -0
- package/build/client/pwa-512x512.png +0 -0
- package/build/client/registerSW.js +1 -0
- package/build/client/registerSW.js.br +0 -0
- package/build/client/registerSW.js.gz +0 -0
- package/build/client/sw.js +222 -0
- package/build/client/sw.js.br +0 -0
- package/build/client/sw.js.gz +0 -0
- package/build/client/workbox-5119daf5.js +3395 -0
- package/build/client/workbox-5119daf5.js.br +0 -0
- package/build/client/workbox-5119daf5.js.gz +0 -0
- package/build/env.js +94 -0
- package/build/handler.js +1494 -0
- package/build/index.js +345 -0
- package/build/pty-holder.cjs +510 -0
- package/build/server/chunks/0-q2IUp76Y.js +9 -0
- package/build/server/chunks/0-q2IUp76Y.js.map +1 -0
- package/build/server/chunks/1-CU50G5wZ.js +9 -0
- package/build/server/chunks/1-CU50G5wZ.js.map +1 -0
- package/build/server/chunks/2-D01t9s8T.js +9 -0
- package/build/server/chunks/2-D01t9s8T.js.map +1 -0
- package/build/server/chunks/3-5PUQ04wC.js +9 -0
- package/build/server/chunks/3-5PUQ04wC.js.map +1 -0
- package/build/server/chunks/4-e7gywnSG.js +9 -0
- package/build/server/chunks/4-e7gywnSG.js.map +1 -0
- package/build/server/chunks/5-CA1SA6KZ.js +9 -0
- package/build/server/chunks/5-CA1SA6KZ.js.map +1 -0
- package/build/server/chunks/6-71H221sV.js +9 -0
- package/build/server/chunks/6-71H221sV.js.map +1 -0
- package/build/server/chunks/7-Bo-vmdyz.js +9 -0
- package/build/server/chunks/7-Bo-vmdyz.js.map +1 -0
- package/build/server/chunks/_layout.svelte-SFHOxs74.js +132 -0
- package/build/server/chunks/_layout.svelte-SFHOxs74.js.map +1 -0
- package/build/server/chunks/_page.svelte-B4w-2wD-.js +120 -0
- package/build/server/chunks/_page.svelte-B4w-2wD-.js.map +1 -0
- package/build/server/chunks/_page.svelte-B_qAXjkh.js +213 -0
- package/build/server/chunks/_page.svelte-B_qAXjkh.js.map +1 -0
- package/build/server/chunks/_page.svelte-CsF1_TRG.js +50 -0
- package/build/server/chunks/_page.svelte-CsF1_TRG.js.map +1 -0
- package/build/server/chunks/_page.svelte-DJC6U-P0.js +68 -0
- package/build/server/chunks/_page.svelte-DJC6U-P0.js.map +1 -0
- package/build/server/chunks/_page.svelte-DQ6HBtsz.js +407 -0
- package/build/server/chunks/_page.svelte-DQ6HBtsz.js.map +1 -0
- package/build/server/chunks/_page.svelte-LbhhjP21.js +148 -0
- package/build/server/chunks/_page.svelte-LbhhjP21.js.map +1 -0
- package/build/server/chunks/_server.ts-BL2FGb5Z.js +387 -0
- package/build/server/chunks/_server.ts-BL2FGb5Z.js.map +1 -0
- package/build/server/chunks/_server.ts-BgdjBZco.js +47 -0
- package/build/server/chunks/_server.ts-BgdjBZco.js.map +1 -0
- package/build/server/chunks/_server.ts-BihKSdj_.js +59 -0
- package/build/server/chunks/_server.ts-BihKSdj_.js.map +1 -0
- package/build/server/chunks/_server.ts-BjOJsoy4.js +63 -0
- package/build/server/chunks/_server.ts-BjOJsoy4.js.map +1 -0
- package/build/server/chunks/_server.ts-C29xzfaw.js +77 -0
- package/build/server/chunks/_server.ts-C29xzfaw.js.map +1 -0
- package/build/server/chunks/_server.ts-CPa6DgIt.js +71 -0
- package/build/server/chunks/_server.ts-CPa6DgIt.js.map +1 -0
- package/build/server/chunks/_server.ts-CbDRDIoP.js +36 -0
- package/build/server/chunks/_server.ts-CbDRDIoP.js.map +1 -0
- package/build/server/chunks/_server.ts-Cl1OEWL4.js +54 -0
- package/build/server/chunks/_server.ts-Cl1OEWL4.js.map +1 -0
- package/build/server/chunks/_server.ts-ColfDHW8.js +60 -0
- package/build/server/chunks/_server.ts-ColfDHW8.js.map +1 -0
- package/build/server/chunks/_server.ts-Cv_OrRuL.js +494 -0
- package/build/server/chunks/_server.ts-Cv_OrRuL.js.map +1 -0
- package/build/server/chunks/_server.ts-D4MNi4cD.js +25 -0
- package/build/server/chunks/_server.ts-D4MNi4cD.js.map +1 -0
- package/build/server/chunks/_server.ts-DRVbgm6k.js +125 -0
- package/build/server/chunks/_server.ts-DRVbgm6k.js.map +1 -0
- package/build/server/chunks/_server.ts-DfajWaqh.js +39 -0
- package/build/server/chunks/_server.ts-DfajWaqh.js.map +1 -0
- package/build/server/chunks/_server.ts-y9-WYDMa.js +35 -0
- package/build/server/chunks/_server.ts-y9-WYDMa.js.map +1 -0
- package/build/server/chunks/auth-CEgFis71.js +32 -0
- package/build/server/chunks/auth-CEgFis71.js.map +1 -0
- package/build/server/chunks/client-CxCatAKr.js +255 -0
- package/build/server/chunks/client-CxCatAKr.js.map +1 -0
- package/build/server/chunks/error.svelte-BqdwMWdK.js +26 -0
- package/build/server/chunks/error.svelte-BqdwMWdK.js.map +1 -0
- package/build/server/chunks/exports-CJ0Q5XmL.js +4081 -0
- package/build/server/chunks/exports-CJ0Q5XmL.js.map +1 -0
- package/build/server/chunks/index2-DAxIoAO-.js +36 -0
- package/build/server/chunks/index2-DAxIoAO-.js.map +1 -0
- package/build/server/chunks/jsonl-parser-dmZU_Hyu.js +137 -0
- package/build/server/chunks/jsonl-parser-dmZU_Hyu.js.map +1 -0
- package/build/server/chunks/library-apns-BHxLmuIx.js +104 -0
- package/build/server/chunks/library-apns-BHxLmuIx.js.map +1 -0
- package/build/server/chunks/markdown-Bxrl3cCF.js +1241 -0
- package/build/server/chunks/markdown-Bxrl3cCF.js.map +1 -0
- package/build/server/chunks/pending-requests-D8UiTw7L.js +44 -0
- package/build/server/chunks/pending-requests-D8UiTw7L.js.map +1 -0
- package/build/server/chunks/pty-manager-C0FhBiVq.js +1697 -0
- package/build/server/chunks/pty-manager-C0FhBiVq.js.map +1 -0
- package/build/server/chunks/shared-server-BDY8jh20.js +200 -0
- package/build/server/chunks/shared-server-BDY8jh20.js.map +1 -0
- package/build/server/chunks/stores-D0HorpgL.js +36 -0
- package/build/server/chunks/stores-D0HorpgL.js.map +1 -0
- package/build/server/index.js +6466 -0
- package/build/server/index.js.map +1 -0
- package/build/server/manifest.js +184 -0
- package/build/server/manifest.js.map +1 -0
- package/build/shims.js +32 -0
- package/package.json +94 -0
- package/scripts/clipboard-shims/wl-paste +48 -0
- package/scripts/clipboard-shims/xclip +31 -0
- package/scripts/install.sh +477 -0
- package/scripts/setup-node-pty.sh +63 -0
- package/scripts/setup.cjs +571 -0
- package/scripts/test-runner.ts +243 -0
- package/scripts/vercel-env-commands.sh +60 -0
- package/server.ts +139 -0
- package/src/app.css +1835 -0
- package/src/app.d.ts +31 -0
- package/src/app.html +24 -0
- package/src/generated/types/APN.ts +305 -0
- package/src/generated/types/CLI.ts +52 -0
- package/src/generated/types/JWT.ts +92 -0
- package/src/generated/types/Terminal.ts +2736 -0
- package/src/generated/types/index.ts +6 -0
- package/src/lib/assets/icons/alert-triangle.svg +5 -0
- package/src/lib/assets/icons/bell.svg +4 -0
- package/src/lib/assets/icons/check-circle.svg +4 -0
- package/src/lib/assets/icons/file.svg +4 -0
- package/src/lib/assets/icons/folder.svg +3 -0
- package/src/lib/assets/icons/play.svg +3 -0
- package/src/lib/assets/icons/refresh.svg +4 -0
- package/src/lib/assets/icons/settings.svg +4 -0
- package/src/lib/assets/icons/terminal.svg +1 -0
- package/src/lib/assets/icons/tool.svg +3 -0
- package/src/lib/assets/icons/x-circle.svg +5 -0
- package/src/lib/modules/client/common/Card.svelte +26 -0
- package/src/lib/modules/client/common/EmptyState.svelte +36 -0
- package/src/lib/modules/client/common/Icon.svelte +61 -0
- package/src/lib/modules/client/common/StatusBadge.svelte +38 -0
- package/src/lib/modules/client/common/cache.ts +31 -0
- package/src/lib/modules/client/common/config-guard.ts +18 -0
- package/src/lib/modules/client/common/index.ts +12 -0
- package/src/lib/modules/client/common/markdown.ts +23 -0
- package/src/lib/modules/client/common/native-bridge.ts +50 -0
- package/src/lib/modules/client/common/time.ts +22 -0
- package/src/lib/modules/client/common/tool-title.ts +28 -0
- package/src/lib/modules/client/terminal/ChatView.svelte +400 -0
- package/src/lib/modules/client/terminal/CommandPalette.svelte +60 -0
- package/src/lib/modules/client/terminal/ConnectionStatus.svelte +99 -0
- package/src/lib/modules/client/terminal/LaunchSheet.svelte +294 -0
- package/src/lib/modules/client/terminal/QuickKeys.svelte +71 -0
- package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +79 -0
- package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +70 -0
- package/src/lib/modules/client/terminal/xterm-wrapper.ts +243 -0
- package/src/lib/modules/server/apn/library-apns.ts +137 -0
- package/src/lib/modules/server/apn/notification-history.ts +35 -0
- package/src/lib/modules/server/apn/notification-sessions.ts +117 -0
- package/src/lib/modules/server/apn/pending-requests.ts +65 -0
- package/src/lib/modules/server/apn/types.ts +51 -0
- package/src/lib/modules/server/auth.ts +34 -0
- package/src/lib/modules/server/cli/index.ts +79 -0
- package/src/lib/modules/server/cli/runner.ts +162 -0
- package/src/lib/modules/server/fcm/fcm-service.ts +72 -0
- package/src/lib/modules/server/sessions/jsonl-parser.ts +197 -0
- package/src/lib/modules/server/sessions/jsonl-reader.ts +301 -0
- package/src/lib/modules/server/sessions/opencode-reader.ts +264 -0
- package/src/lib/modules/server/sessions/types.ts +53 -0
- package/src/lib/modules/server/terminal/holder-client.ts +273 -0
- package/src/lib/modules/server/terminal/opencode-watcher.ts +661 -0
- package/src/lib/modules/server/terminal/pty-holder.cjs +510 -0
- package/src/lib/modules/server/terminal/pty-manager.ts +1012 -0
- package/src/lib/modules/server/terminal/session-watcher.ts +320 -0
- package/src/lib/modules/server/terminal/terminal-store.ts +198 -0
- package/src/lib/modules/server/ws/events-handler.ts +73 -0
- package/src/lib/modules/server/ws/keepalive.ts +108 -0
- package/src/lib/modules/server/ws/server.ts +93 -0
- package/src/lib/modules/server/ws/session-handler.ts +462 -0
- package/src/lib/modules/server/ws/terminal-handler.ts +197 -0
- package/src/lib/modules/server/ws/ticket-store.ts +58 -0
- package/src/lib/theme.css +529 -0
- package/src/lib/types/config.ts +6 -0
- package/src/routes/+layout.svelte +218 -0
- package/src/routes/+page.svelte +261 -0
- package/src/routes/api/debug/+server.ts +33 -0
- package/src/routes/api/device-token/+server.ts +85 -0
- package/src/routes/api/health/+server.ts +100 -0
- package/src/routes/api/notify/+server.ts +418 -0
- package/src/routes/api/qr-config/+server.ts +45 -0
- package/src/routes/api/response/+server.ts +73 -0
- package/src/routes/api/sessions/+server.ts +120 -0
- package/src/routes/api/terminals/+server.ts +141 -0
- package/src/routes/api/terminals/[id]/+server.ts +75 -0
- package/src/routes/api/terminals/[id]/paste-image/+server.ts +61 -0
- package/src/routes/api/terminals/[id]/resize/+server.ts +60 -0
- package/src/routes/api/webhook/+server.ts +42 -0
- package/src/routes/api/ws-status/+server.ts +23 -0
- package/src/routes/api/ws-ticket/+server.ts +86 -0
- package/src/routes/config/+page.svelte +600 -0
- package/src/routes/project/+page.svelte +274 -0
- package/src/routes/session/[id]/+page.svelte +434 -0
- package/src/routes/terminals/+page.svelte +618 -0
- package/src/routes/terminals/[id]/+page.svelte +968 -0
- package/svelte.config.js +18 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/>
|
|
3
|
+
<line x1="12" y1="9" x2="12" y2="13"/>
|
|
4
|
+
<line x1="12" y1="17" x2="12.01" y2="17"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<circle cx="12" cy="12" r="3"/>
|
|
3
|
+
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
2
|
+
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
children: Snippet;
|
|
6
|
+
class?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { children, class: className = '', description, title }: Props = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<div class="card {className}">
|
|
15
|
+
{#if title}
|
|
16
|
+
<div class="card-header">
|
|
17
|
+
<h2 class="card-title">{title}</h2>
|
|
18
|
+
{#if description}
|
|
19
|
+
<p class="card-description">{description}</p>
|
|
20
|
+
{/if}
|
|
21
|
+
</div>
|
|
22
|
+
{/if}
|
|
23
|
+
<div class="card-content">
|
|
24
|
+
{@render children()}
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
import Icon from './Icon.svelte';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
description: string;
|
|
9
|
+
icon:
|
|
10
|
+
| 'alert-triangle'
|
|
11
|
+
| 'bell'
|
|
12
|
+
| 'check-circle'
|
|
13
|
+
| 'file'
|
|
14
|
+
| 'folder'
|
|
15
|
+
| 'play'
|
|
16
|
+
| 'refresh'
|
|
17
|
+
| 'settings'
|
|
18
|
+
| 'terminal'
|
|
19
|
+
| 'tool'
|
|
20
|
+
| 'x-circle';
|
|
21
|
+
title: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const { children, description, icon, title }: Props = $props();
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<div class="empty-state">
|
|
28
|
+
<div class="empty-state-icon">
|
|
29
|
+
<Icon name={icon} size={24} />
|
|
30
|
+
</div>
|
|
31
|
+
<h3 class="empty-state-title">{title}</h3>
|
|
32
|
+
<p class="empty-state-description">{description}</p>
|
|
33
|
+
{#if children}
|
|
34
|
+
{@render children()}
|
|
35
|
+
{/if}
|
|
36
|
+
</div>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import AlertTriangle from '$lib/assets/icons/alert-triangle.svg?raw';
|
|
3
|
+
import Bell from '$lib/assets/icons/bell.svg?raw';
|
|
4
|
+
import CheckCircle from '$lib/assets/icons/check-circle.svg?raw';
|
|
5
|
+
import File from '$lib/assets/icons/file.svg?raw';
|
|
6
|
+
import Folder from '$lib/assets/icons/folder.svg?raw';
|
|
7
|
+
import Play from '$lib/assets/icons/play.svg?raw';
|
|
8
|
+
import Refresh from '$lib/assets/icons/refresh.svg?raw';
|
|
9
|
+
import Settings from '$lib/assets/icons/settings.svg?raw';
|
|
10
|
+
import Terminal from '$lib/assets/icons/terminal.svg?raw';
|
|
11
|
+
import Tool from '$lib/assets/icons/tool.svg?raw';
|
|
12
|
+
import XCircle from '$lib/assets/icons/x-circle.svg?raw';
|
|
13
|
+
|
|
14
|
+
const icons: Record<string, string> = {
|
|
15
|
+
'alert-triangle': AlertTriangle,
|
|
16
|
+
bell: Bell,
|
|
17
|
+
'check-circle': CheckCircle,
|
|
18
|
+
file: File,
|
|
19
|
+
folder: Folder,
|
|
20
|
+
play: Play,
|
|
21
|
+
refresh: Refresh,
|
|
22
|
+
settings: Settings,
|
|
23
|
+
terminal: Terminal,
|
|
24
|
+
tool: Tool,
|
|
25
|
+
'x-circle': XCircle,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
interface Props {
|
|
29
|
+
class?: string;
|
|
30
|
+
name: keyof typeof icons;
|
|
31
|
+
size?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const { class: className = '', name, size = 16 }: Props = $props();
|
|
35
|
+
|
|
36
|
+
const svgContent = $derived(icons[name] || '');
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<span
|
|
40
|
+
class="icon {className}"
|
|
41
|
+
style="width: {size}px; height: {size}px;"
|
|
42
|
+
role="img"
|
|
43
|
+
aria-hidden="true"
|
|
44
|
+
>
|
|
45
|
+
<!-- eslint-disable-next-line svelte/no-at-html-tags -- SVG content is from trusted local assets -->
|
|
46
|
+
{@html svgContent}
|
|
47
|
+
</span>
|
|
48
|
+
|
|
49
|
+
<style>
|
|
50
|
+
.icon {
|
|
51
|
+
display: inline-flex;
|
|
52
|
+
align-items: center;
|
|
53
|
+
justify-content: center;
|
|
54
|
+
flex-shrink: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.icon :global(svg) {
|
|
58
|
+
width: 100%;
|
|
59
|
+
height: 100%;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
status: 'degraded' | 'error' | 'healthy' | 'unknown';
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const { status }: Props = $props();
|
|
7
|
+
|
|
8
|
+
function getStatusLabel(s: string): string {
|
|
9
|
+
switch (s) {
|
|
10
|
+
case 'degraded':
|
|
11
|
+
return 'Degraded';
|
|
12
|
+
case 'error':
|
|
13
|
+
return 'Offline';
|
|
14
|
+
case 'healthy':
|
|
15
|
+
return 'Online';
|
|
16
|
+
default:
|
|
17
|
+
return 'Checking';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getStatusClass(s: string): string {
|
|
22
|
+
switch (s) {
|
|
23
|
+
case 'degraded':
|
|
24
|
+
return 'degraded';
|
|
25
|
+
case 'error':
|
|
26
|
+
return 'offline';
|
|
27
|
+
case 'healthy':
|
|
28
|
+
return 'online';
|
|
29
|
+
default:
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<div class="status-badge {getStatusClass(status)}">
|
|
36
|
+
<span class="status-dot"></span>
|
|
37
|
+
<span>{getStatusLabel(status)}</span>
|
|
38
|
+
</div>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared sessionStorage cache helpers.
|
|
3
|
+
*
|
|
4
|
+
* Default TTL is 30 seconds. Callers may override per-call.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const DEFAULT_TTL_MS = 30_000;
|
|
8
|
+
|
|
9
|
+
export function getCached(key: string, ttlMs: number = DEFAULT_TTL_MS): unknown {
|
|
10
|
+
try {
|
|
11
|
+
const item = sessionStorage.getItem(key);
|
|
12
|
+
if (!item) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const { data, timestamp } = JSON.parse(item) as { data: unknown; timestamp: number };
|
|
16
|
+
if (Date.now() - timestamp > ttlMs) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return data;
|
|
20
|
+
} catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function setCache(key: string, data: unknown): void {
|
|
26
|
+
try {
|
|
27
|
+
sessionStorage.setItem(key, JSON.stringify({ data, timestamp: Date.now() }));
|
|
28
|
+
} catch {
|
|
29
|
+
// sessionStorage full — silently ignore
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard for ShooterConfig objects stored in localStorage.
|
|
3
|
+
*
|
|
4
|
+
* The stricter variant (used on the config page) validates that apiKey
|
|
5
|
+
* and deviceToken are strings. The simpler variant only checks key
|
|
6
|
+
* presence. This implementation uses the stricter check so all
|
|
7
|
+
* consumers benefit from the extra safety.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { ShooterConfig } from '$lib/types/config';
|
|
11
|
+
|
|
12
|
+
export function isShooterConfig(value: unknown): value is ShooterConfig {
|
|
13
|
+
if (!value || typeof value !== 'object') {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const obj = value as Record<string, unknown>;
|
|
17
|
+
return typeof obj.apiKey === 'string' && typeof obj.deviceToken === 'string';
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { default as Card } from './Card.svelte';
|
|
2
|
+
export { default as EmptyState } from './EmptyState.svelte';
|
|
3
|
+
export { default as Icon } from './Icon.svelte';
|
|
4
|
+
export { default as StatusBadge } from './StatusBadge.svelte';
|
|
5
|
+
|
|
6
|
+
// Shared client utilities
|
|
7
|
+
export { getCached, setCache } from './cache';
|
|
8
|
+
export { isShooterConfig } from './config-guard';
|
|
9
|
+
export { renderMarkdown } from './markdown';
|
|
10
|
+
export { hasScanner, isNativeBridge, scanQR } from './native-bridge';
|
|
11
|
+
export { formatRelativeTime } from './time';
|
|
12
|
+
export { getToolDescription } from './tool-title';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Markdown rendering utility.
|
|
3
|
+
*
|
|
4
|
+
* Uses `marked` for parsing and `DOMPurify` for sanitisation.
|
|
5
|
+
* Callers should import this instead of duplicating the setup.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import DOMPurify from 'dompurify';
|
|
9
|
+
import { marked } from 'marked';
|
|
10
|
+
|
|
11
|
+
// Configure marked once at module level
|
|
12
|
+
marked.setOptions({
|
|
13
|
+
breaks: true,
|
|
14
|
+
gfm: true,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export function renderMarkdown(text: string): string {
|
|
18
|
+
if (!text) {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
const html = marked.parse(text) as string;
|
|
22
|
+
return DOMPurify.sanitize(html);
|
|
23
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native bridge utilities for detecting and communicating with
|
|
3
|
+
* the ShooterBridge injected by native WebView wrappers (iOS/Android).
|
|
4
|
+
*
|
|
5
|
+
* The native side injects window.ShooterBridge at documentStart with its own
|
|
6
|
+
* callback-ID system (window.ShooterBridge._callbacks + window.handleNativeResponse).
|
|
7
|
+
* This module MUST NOT override handleNativeResponse — the native version handles
|
|
8
|
+
* resolving scanner/picker promises using its own callback registry.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** True when the page is running inside a native WebView with a bridge */
|
|
12
|
+
export function isNativeBridge(): boolean {
|
|
13
|
+
if (typeof window === 'undefined') return false;
|
|
14
|
+
// iOS injects window.ShooterBridge, Android injects window.ShooterNativeBridge
|
|
15
|
+
return (
|
|
16
|
+
(typeof window.ShooterBridge === 'object' && window.ShooterBridge !== null) ||
|
|
17
|
+
(typeof (window as any).ShooterNativeBridge === 'object' && (window as any).ShooterNativeBridge !== null)
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Get the scanner.scan function from whichever bridge exists */
|
|
22
|
+
function getScanFn(): (() => Promise<string>) | null {
|
|
23
|
+
if (typeof window === 'undefined') return null;
|
|
24
|
+
// Check iOS bridge first, then Android
|
|
25
|
+
if (typeof window.ShooterBridge?.scanner?.scan === 'function') {
|
|
26
|
+
return () => window.ShooterBridge!.scanner!.scan();
|
|
27
|
+
}
|
|
28
|
+
if (typeof (window as any).ShooterNativeBridge?.scanner?.scan === 'function') {
|
|
29
|
+
return () => (window as any).ShooterNativeBridge.scanner.scan();
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** True when the native bridge exposes a QR scanner */
|
|
35
|
+
export function hasScanner(): boolean {
|
|
36
|
+
return getScanFn() !== null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Invoke the native QR scanner.
|
|
41
|
+
* Returns the scanned string on success, throws on cancel/error.
|
|
42
|
+
* The Promise is managed entirely by the native bridge's callback system.
|
|
43
|
+
*/
|
|
44
|
+
export async function scanQR(): Promise<string> {
|
|
45
|
+
const scan = getScanFn();
|
|
46
|
+
if (!scan) {
|
|
47
|
+
throw new Error('Scanner not available');
|
|
48
|
+
}
|
|
49
|
+
return scan();
|
|
50
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relative time formatting utility.
|
|
3
|
+
*
|
|
4
|
+
* Converts an ISO 8601 timestamp string into a human-friendly
|
|
5
|
+
* relative label such as "just now", "5m ago", "2h ago", or "3d ago".
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export function formatRelativeTime(ts: string): string {
|
|
9
|
+
const diff = Date.now() - new Date(ts).getTime();
|
|
10
|
+
const mins = Math.floor(diff / 60000);
|
|
11
|
+
if (mins < 1) {
|
|
12
|
+
return 'just now';
|
|
13
|
+
}
|
|
14
|
+
if (mins < 60) {
|
|
15
|
+
return `${mins}m ago`;
|
|
16
|
+
}
|
|
17
|
+
const hrs = Math.floor(mins / 60);
|
|
18
|
+
if (hrs < 24) {
|
|
19
|
+
return `${hrs}h ago`;
|
|
20
|
+
}
|
|
21
|
+
return `${Math.floor(hrs / 24)}d ago`;
|
|
22
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human-readable one-line description for a tool invocation.
|
|
3
|
+
*
|
|
4
|
+
* Accepts the tool name and its input record and returns a short
|
|
5
|
+
* summary string suitable for display in a chat UI.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export function getToolDescription(toolName: string, input: Record<string, unknown>): string {
|
|
9
|
+
if (toolName === 'Bash') {
|
|
10
|
+
return (input.command as string) || (input.description as string) || '';
|
|
11
|
+
}
|
|
12
|
+
if (toolName === 'Read') {
|
|
13
|
+
return (input.file_path as string) || '';
|
|
14
|
+
}
|
|
15
|
+
if (toolName === 'Edit' || toolName === 'Write') {
|
|
16
|
+
return (input.file_path as string) || '';
|
|
17
|
+
}
|
|
18
|
+
if (toolName === 'Grep') {
|
|
19
|
+
return (input.pattern as string) || '';
|
|
20
|
+
}
|
|
21
|
+
if (toolName === 'Glob') {
|
|
22
|
+
return (input.pattern as string) || '';
|
|
23
|
+
}
|
|
24
|
+
if (toolName === 'Agent') {
|
|
25
|
+
return (input.description as string) || (input.prompt as string)?.slice(0, 50) || '';
|
|
26
|
+
}
|
|
27
|
+
return JSON.stringify(input).slice(0, 60);
|
|
28
|
+
}
|