@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,148 @@
|
|
|
1
|
+
import { aH as head, M as prevent_snippet_stringification, J as FILENAME, aI as ensure_array_like } from './exports-CJ0Q5XmL.js';
|
|
2
|
+
import { p as push_element, a as pop_element, v as validate_snippet_args, g as goto } from './client-CxCatAKr.js';
|
|
3
|
+
import { o as onDestroy, B as Button, E as EmptyState, I as Icon, a as Shimmer } from './markdown-Bxrl3cCF.js';
|
|
4
|
+
import 'dompurify';
|
|
5
|
+
import 'marked';
|
|
6
|
+
|
|
7
|
+
_page[FILENAME] = "src/routes/terminals/+page.svelte";
|
|
8
|
+
function _page($$renderer, $$props) {
|
|
9
|
+
$$renderer.component(
|
|
10
|
+
($$renderer2) => {
|
|
11
|
+
const CACHE_KEY = "shooter_terminals";
|
|
12
|
+
let terminals = [];
|
|
13
|
+
let loading = false;
|
|
14
|
+
terminals.filter((t) => t.status === "running");
|
|
15
|
+
terminals.filter((t) => t.status === "exited");
|
|
16
|
+
onDestroy(() => {
|
|
17
|
+
});
|
|
18
|
+
async function fetchTerminals() {
|
|
19
|
+
{
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function forceRefresh() {
|
|
24
|
+
loading = true;
|
|
25
|
+
sessionStorage.removeItem(CACHE_KEY);
|
|
26
|
+
await fetchTerminals();
|
|
27
|
+
}
|
|
28
|
+
function navigateToConfig() {
|
|
29
|
+
void goto();
|
|
30
|
+
}
|
|
31
|
+
function handleNewTerminal() {
|
|
32
|
+
}
|
|
33
|
+
head("1ewpmn2", $$renderer2, ($$renderer3) => {
|
|
34
|
+
$$renderer3.title(($$renderer4) => {
|
|
35
|
+
$$renderer4.push(`<title>Terminals - Shooter</title>`);
|
|
36
|
+
});
|
|
37
|
+
$$renderer3.push(`<meta name="description" content="Active terminal sessions on this machine" class="svelte-1ewpmn2"/>`);
|
|
38
|
+
push_element($$renderer3, "meta", 231, 2);
|
|
39
|
+
pop_element();
|
|
40
|
+
});
|
|
41
|
+
$$renderer2.push(`<main class="main svelte-1ewpmn2">`);
|
|
42
|
+
push_element($$renderer2, "main", 234, 0);
|
|
43
|
+
$$renderer2.push(`<div class="page-header svelte-1ewpmn2">`);
|
|
44
|
+
push_element($$renderer2, "div", 235, 2);
|
|
45
|
+
$$renderer2.push(`<div class="page-header-content svelte-1ewpmn2">`);
|
|
46
|
+
push_element($$renderer2, "div", 236, 4);
|
|
47
|
+
$$renderer2.push(`<div class="svelte-1ewpmn2">`);
|
|
48
|
+
push_element($$renderer2, "div", 237, 6);
|
|
49
|
+
$$renderer2.push(`<h1 class="page-title svelte-1ewpmn2">`);
|
|
50
|
+
push_element($$renderer2, "h1", 238, 8);
|
|
51
|
+
$$renderer2.push(`Terminals</h1>`);
|
|
52
|
+
pop_element();
|
|
53
|
+
$$renderer2.push(` <p class="page-description svelte-1ewpmn2">`);
|
|
54
|
+
push_element($$renderer2, "p", 239, 8);
|
|
55
|
+
$$renderer2.push(`Active terminal sessions on this machine</p>`);
|
|
56
|
+
pop_element();
|
|
57
|
+
$$renderer2.push(`</div>`);
|
|
58
|
+
pop_element();
|
|
59
|
+
$$renderer2.push(` <div class="page-actions svelte-1ewpmn2">`);
|
|
60
|
+
push_element($$renderer2, "div", 241, 6);
|
|
61
|
+
{
|
|
62
|
+
let children = function($$renderer3) {
|
|
63
|
+
validate_snippet_args($$renderer3);
|
|
64
|
+
Icon($$renderer3, { name: "refresh", size: 14 });
|
|
65
|
+
$$renderer3.push(`<!----> Refresh`);
|
|
66
|
+
};
|
|
67
|
+
prevent_snippet_stringification(children);
|
|
68
|
+
Button($$renderer2, {
|
|
69
|
+
classes: "btn-secondary",
|
|
70
|
+
onclick: forceRefresh,
|
|
71
|
+
disabled: loading,
|
|
72
|
+
children,
|
|
73
|
+
$$slots: { default: true }
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
$$renderer2.push(`<!----> `);
|
|
77
|
+
{
|
|
78
|
+
let children = function($$renderer3) {
|
|
79
|
+
validate_snippet_args($$renderer3);
|
|
80
|
+
$$renderer3.push(`<span class="plus-icon svelte-1ewpmn2">`);
|
|
81
|
+
push_element($$renderer3, "span", 250, 12);
|
|
82
|
+
$$renderer3.push(`+</span>`);
|
|
83
|
+
pop_element();
|
|
84
|
+
$$renderer3.push(` New Terminal`);
|
|
85
|
+
};
|
|
86
|
+
prevent_snippet_stringification(children);
|
|
87
|
+
Button($$renderer2, {
|
|
88
|
+
classes: "btn-primary",
|
|
89
|
+
onclick: handleNewTerminal,
|
|
90
|
+
children,
|
|
91
|
+
$$slots: { default: true }
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
$$renderer2.push(`<!----></div>`);
|
|
95
|
+
pop_element();
|
|
96
|
+
$$renderer2.push(`</div>`);
|
|
97
|
+
pop_element();
|
|
98
|
+
$$renderer2.push(`</div>`);
|
|
99
|
+
pop_element();
|
|
100
|
+
$$renderer2.push(` `);
|
|
101
|
+
if (loading && terminals.length === 0) {
|
|
102
|
+
$$renderer2.push("<!--[-->");
|
|
103
|
+
$$renderer2.push(`<div class="loading-container svelte-1ewpmn2">`);
|
|
104
|
+
push_element($$renderer2, "div", 259, 4);
|
|
105
|
+
$$renderer2.push(`<!--[-->`);
|
|
106
|
+
const each_array = ensure_array_like(Array(4));
|
|
107
|
+
for (let i = 0, $$length = each_array.length; i < $$length; i++) {
|
|
108
|
+
each_array[i];
|
|
109
|
+
Shimmer($$renderer2, { classes: "shimmer-card" });
|
|
110
|
+
}
|
|
111
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
112
|
+
pop_element();
|
|
113
|
+
} else {
|
|
114
|
+
$$renderer2.push("<!--[!-->");
|
|
115
|
+
{
|
|
116
|
+
$$renderer2.push("<!--[-->");
|
|
117
|
+
EmptyState($$renderer2, {
|
|
118
|
+
icon: "settings",
|
|
119
|
+
title: "Configuration Required",
|
|
120
|
+
description: "Set up your API credentials to view terminal sessions",
|
|
121
|
+
children: prevent_snippet_stringification(($$renderer3) => {
|
|
122
|
+
Button($$renderer3, {
|
|
123
|
+
classes: "btn-primary",
|
|
124
|
+
onclick: navigateToConfig,
|
|
125
|
+
text: "Configure Settings"
|
|
126
|
+
});
|
|
127
|
+
})
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
$$renderer2.push(`<!--]-->`);
|
|
131
|
+
}
|
|
132
|
+
$$renderer2.push(`<!--]--></main>`);
|
|
133
|
+
pop_element();
|
|
134
|
+
$$renderer2.push(` `);
|
|
135
|
+
{
|
|
136
|
+
$$renderer2.push("<!--[!-->");
|
|
137
|
+
}
|
|
138
|
+
$$renderer2.push(`<!--]-->`);
|
|
139
|
+
},
|
|
140
|
+
_page
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
_page.render = function() {
|
|
144
|
+
throw new Error("Component.render(...) is no longer valid in Svelte 5. See https://svelte.dev/docs/svelte/v5-migration-guide#Components-are-no-longer-classes for more information");
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export { _page as default };
|
|
148
|
+
//# sourceMappingURL=_page.svelte-LbhhjP21.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_page.svelte-LbhhjP21.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/terminals/_page.svelte.js"],"sourcesContent":["import { ad as head, a7 as prevent_snippet_stringification, a5 as FILENAME, ae as ensure_array_like } from \"../../../chunks/index.js\";\nimport { p as push_element, a as pop_element, v as validate_snippet_args, g as goto } from \"../../../chunks/client.js\";\nimport { o as onDestroy, B as Button, E as EmptyState, I as Icon, a as Shimmer } from \"../../../chunks/markdown.js\";\n_page[FILENAME] = \"src/routes/terminals/+page.svelte\";\nfunction _page($$renderer, $$props) {\n $$renderer.component(\n ($$renderer2) => {\n const CACHE_KEY = \"shooter_terminals\";\n let terminals = [];\n let loading = false;\n terminals.filter((t) => t.status === \"running\");\n terminals.filter((t) => t.status === \"exited\");\n onDestroy(() => {\n });\n async function fetchTerminals() {\n {\n return;\n }\n }\n async function forceRefresh() {\n loading = true;\n sessionStorage.removeItem(CACHE_KEY);\n await fetchTerminals();\n }\n function navigateToConfig() {\n void goto();\n }\n function handleNewTerminal() {\n }\n head(\"1ewpmn2\", $$renderer2, ($$renderer3) => {\n $$renderer3.title(($$renderer4) => {\n $$renderer4.push(`<title>Terminals - Shooter</title>`);\n });\n $$renderer3.push(`<meta name=\"description\" content=\"Active terminal sessions on this machine\" class=\"svelte-1ewpmn2\"/>`);\n push_element($$renderer3, \"meta\", 231, 2);\n pop_element();\n });\n $$renderer2.push(`<main class=\"main svelte-1ewpmn2\">`);\n push_element($$renderer2, \"main\", 234, 0);\n $$renderer2.push(`<div class=\"page-header svelte-1ewpmn2\">`);\n push_element($$renderer2, \"div\", 235, 2);\n $$renderer2.push(`<div class=\"page-header-content svelte-1ewpmn2\">`);\n push_element($$renderer2, \"div\", 236, 4);\n $$renderer2.push(`<div class=\"svelte-1ewpmn2\">`);\n push_element($$renderer2, \"div\", 237, 6);\n $$renderer2.push(`<h1 class=\"page-title svelte-1ewpmn2\">`);\n push_element($$renderer2, \"h1\", 238, 8);\n $$renderer2.push(`Terminals</h1>`);\n pop_element();\n $$renderer2.push(` <p class=\"page-description svelte-1ewpmn2\">`);\n push_element($$renderer2, \"p\", 239, 8);\n $$renderer2.push(`Active terminal sessions on this machine</p>`);\n pop_element();\n $$renderer2.push(`</div>`);\n pop_element();\n $$renderer2.push(` <div class=\"page-actions svelte-1ewpmn2\">`);\n push_element($$renderer2, \"div\", 241, 6);\n {\n let children = function($$renderer3) {\n validate_snippet_args($$renderer3);\n Icon($$renderer3, { name: \"refresh\", size: 14 });\n $$renderer3.push(`<!----> Refresh`);\n };\n prevent_snippet_stringification(children);\n Button($$renderer2, {\n classes: \"btn-secondary\",\n onclick: forceRefresh,\n disabled: loading,\n children,\n $$slots: { default: true }\n });\n }\n $$renderer2.push(`<!----> `);\n {\n let children = function($$renderer3) {\n validate_snippet_args($$renderer3);\n $$renderer3.push(`<span class=\"plus-icon svelte-1ewpmn2\">`);\n push_element($$renderer3, \"span\", 250, 12);\n $$renderer3.push(`+</span>`);\n pop_element();\n $$renderer3.push(` New Terminal`);\n };\n prevent_snippet_stringification(children);\n Button($$renderer2, {\n classes: \"btn-primary\",\n onclick: handleNewTerminal,\n children,\n $$slots: { default: true }\n });\n }\n $$renderer2.push(`<!----></div>`);\n pop_element();\n $$renderer2.push(`</div>`);\n pop_element();\n $$renderer2.push(`</div>`);\n pop_element();\n $$renderer2.push(` `);\n if (loading && terminals.length === 0) {\n $$renderer2.push(\"<!--[-->\");\n $$renderer2.push(`<div class=\"loading-container svelte-1ewpmn2\">`);\n push_element($$renderer2, \"div\", 259, 4);\n $$renderer2.push(`<!--[-->`);\n const each_array = ensure_array_like(Array(4));\n for (let i = 0, $$length = each_array.length; i < $$length; i++) {\n each_array[i];\n Shimmer($$renderer2, { classes: \"shimmer-card\" });\n }\n $$renderer2.push(`<!--]--></div>`);\n pop_element();\n } else {\n $$renderer2.push(\"<!--[!-->\");\n {\n $$renderer2.push(\"<!--[-->\");\n EmptyState($$renderer2, {\n icon: \"settings\",\n title: \"Configuration Required\",\n description: \"Set up your API credentials to view terminal sessions\",\n children: prevent_snippet_stringification(($$renderer3) => {\n Button($$renderer3, {\n classes: \"btn-primary\",\n onclick: navigateToConfig,\n text: \"Configure Settings\"\n });\n })\n });\n }\n $$renderer2.push(`<!--]-->`);\n }\n $$renderer2.push(`<!--]--></main>`);\n pop_element();\n $$renderer2.push(` `);\n {\n $$renderer2.push(\"<!--[!-->\");\n }\n $$renderer2.push(`<!--]-->`);\n },\n _page\n );\n}\n_page.render = function() {\n throw new Error(\"Component.render(...) is no longer valid in Svelte 5. See https://svelte.dev/docs/svelte/v5-migration-guide#Components-are-no-longer-classes for more information\");\n};\nexport {\n _page as default\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { j as json, b as private_env } from './shared-server-BDY8jh20.js';
|
|
2
|
+
import { L as LibraryAPNsService } from './library-apns-BHxLmuIx.js';
|
|
3
|
+
import { c as createPendingRequest } from './pending-requests-D8UiTw7L.js';
|
|
4
|
+
import { v as validateAuth } from './auth-CEgFis71.js';
|
|
5
|
+
import admin from 'firebase-admin';
|
|
6
|
+
import '@parse/node-apn';
|
|
7
|
+
import 'crypto';
|
|
8
|
+
|
|
9
|
+
const MAX_HISTORY = 100;
|
|
10
|
+
const history = [];
|
|
11
|
+
function addNotification(record) {
|
|
12
|
+
history.unshift(record);
|
|
13
|
+
if (history.length > MAX_HISTORY) {
|
|
14
|
+
history.length = MAX_HISTORY;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function getNotifications(limit = 50) {
|
|
18
|
+
return history.slice(0, limit);
|
|
19
|
+
}
|
|
20
|
+
let app = null;
|
|
21
|
+
function isFCMConfigured() {
|
|
22
|
+
return !!(process.env.FCM_PROJECT_ID && process.env.FCM_CLIENT_EMAIL && process.env.FCM_PRIVATE_KEY);
|
|
23
|
+
}
|
|
24
|
+
async function sendFCMNotification(deviceToken, payload) {
|
|
25
|
+
try {
|
|
26
|
+
const fcmApp = getApp();
|
|
27
|
+
const message = {
|
|
28
|
+
android: {
|
|
29
|
+
priority: "high",
|
|
30
|
+
// Ensures delivery even in Doze mode
|
|
31
|
+
ttl: 3e5
|
|
32
|
+
// 5 minutes TTL (matches pending request expiry)
|
|
33
|
+
},
|
|
34
|
+
data: {
|
|
35
|
+
body: payload.body || payload.message || "",
|
|
36
|
+
category: payload.category ? String(payload.category) : payload.data?.category ? String(payload.data.category) : "",
|
|
37
|
+
project: payload.data?.project ? String(payload.data.project) : "",
|
|
38
|
+
requestId: payload.data?.requestId ? String(payload.data.requestId) : "",
|
|
39
|
+
source: payload.data?.source ? String(payload.data.source) : "",
|
|
40
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
41
|
+
title: payload.title,
|
|
42
|
+
toolInput: payload.data?.toolInput ? JSON.stringify(payload.data.toolInput) : "",
|
|
43
|
+
toolName: payload.data?.toolName ? String(payload.data.toolName) : "",
|
|
44
|
+
type: payload.data?.type ? String(payload.data.type) : ""
|
|
45
|
+
},
|
|
46
|
+
token: deviceToken
|
|
47
|
+
};
|
|
48
|
+
const messageId = await admin.messaging(fcmApp).send(message);
|
|
49
|
+
return { messageId, success: true };
|
|
50
|
+
} catch (error) {
|
|
51
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
52
|
+
console.error("[FCM] Send failed:", errorMessage);
|
|
53
|
+
return { error: errorMessage, success: false };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function getApp() {
|
|
57
|
+
if (!app) {
|
|
58
|
+
const projectId = process.env.FCM_PROJECT_ID;
|
|
59
|
+
const clientEmail = process.env.FCM_CLIENT_EMAIL;
|
|
60
|
+
const privateKey = process.env.FCM_PRIVATE_KEY?.replace(/\\n/g, "\n");
|
|
61
|
+
if (!projectId || !clientEmail || !privateKey) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
"FCM not configured: missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY"
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
app = admin.initializeApp({
|
|
67
|
+
credential: admin.credential.cert({ clientEmail, privateKey, projectId })
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return app;
|
|
71
|
+
}
|
|
72
|
+
let apnsSingleton = null;
|
|
73
|
+
function getAPNsClient() {
|
|
74
|
+
if (!apnsSingleton) {
|
|
75
|
+
apnsSingleton = new LibraryAPNsService();
|
|
76
|
+
}
|
|
77
|
+
return apnsSingleton;
|
|
78
|
+
}
|
|
79
|
+
const notificationCache = /* @__PURE__ */ new Map();
|
|
80
|
+
const DEDUP_WINDOW = 1e4;
|
|
81
|
+
function intelligentNotificationFilter(title, message, data) {
|
|
82
|
+
const source = data?.source || "unknown";
|
|
83
|
+
if (isDuplicateNotification(title, message, data)) {
|
|
84
|
+
return {
|
|
85
|
+
reason: "Duplicate notification within 10-second window",
|
|
86
|
+
send: false
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (source === "smart-completion-detector" || source === "shooter-completion-detector") {
|
|
90
|
+
return {
|
|
91
|
+
reason: "Smart completion detector - completion or intervention needed",
|
|
92
|
+
send: true
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (source === "stop-hook") {
|
|
96
|
+
return {
|
|
97
|
+
reason: "Stop hook completion notification - session finished",
|
|
98
|
+
send: true
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const spamPatterns = [
|
|
102
|
+
/PreToolUse/i,
|
|
103
|
+
// Any PreToolUse notifications
|
|
104
|
+
/PostToolUse/i,
|
|
105
|
+
// Any PostToolUse notifications
|
|
106
|
+
/^(Read|Write|Edit|Bash)\s+Starting\s*\|\s*\w+$/i,
|
|
107
|
+
// Only basic tool starting patterns
|
|
108
|
+
/^unknown\s*\|\s*\w+$/i
|
|
109
|
+
// Only "unknown | projectname" exactly
|
|
110
|
+
];
|
|
111
|
+
const isSpam = spamPatterns.some((pattern) => pattern.test(title) || pattern.test(message));
|
|
112
|
+
if (isSpam) {
|
|
113
|
+
return {
|
|
114
|
+
reason: "Filtered spam notification from old hook system",
|
|
115
|
+
send: false
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const importantPatterns = [
|
|
119
|
+
/session complete/i,
|
|
120
|
+
/intervention needed/i,
|
|
121
|
+
/error/i,
|
|
122
|
+
/failed/i,
|
|
123
|
+
/blocked/i,
|
|
124
|
+
/attention/i
|
|
125
|
+
];
|
|
126
|
+
const isImportant = importantPatterns.some(
|
|
127
|
+
(pattern) => pattern.test(title) || pattern.test(message)
|
|
128
|
+
);
|
|
129
|
+
if (isImportant) {
|
|
130
|
+
return {
|
|
131
|
+
reason: "Important notification - completion or intervention",
|
|
132
|
+
send: true
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
reason: "General notification - allowing by default",
|
|
137
|
+
send: true
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function isDuplicateNotification(title, message, data) {
|
|
141
|
+
const key = `${title}|${message}|${data?.category || "unknown"}`;
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
if (notificationCache.has(key)) {
|
|
144
|
+
const lastSent = notificationCache.get(key);
|
|
145
|
+
if (now - lastSent < DEDUP_WINDOW) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
for (const [k, v] of notificationCache.entries()) {
|
|
150
|
+
if (now - v > DEDUP_WINDOW) {
|
|
151
|
+
notificationCache.delete(k);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
function recordNotification(title, message, data) {
|
|
157
|
+
const key = `${title}|${message}|${data?.category || "unknown"}`;
|
|
158
|
+
notificationCache.set(key, Date.now());
|
|
159
|
+
}
|
|
160
|
+
const POST = async ({ request }) => {
|
|
161
|
+
try {
|
|
162
|
+
const apnsClient = getAPNsClient();
|
|
163
|
+
const authError = validateAuth(request);
|
|
164
|
+
if (authError) return authError;
|
|
165
|
+
const body = await request.json();
|
|
166
|
+
const { data, message, title, waitForResponse } = body;
|
|
167
|
+
if (!title || !message) {
|
|
168
|
+
return json({ error: "Title and message are required" }, { status: 400 });
|
|
169
|
+
}
|
|
170
|
+
const requestId = Math.random().toString(36).substring(2, 15);
|
|
171
|
+
const dataRequestId = typeof data?.requestId === "string" ? data.requestId : void 0;
|
|
172
|
+
const canonicalRequestId = dataRequestId || requestId;
|
|
173
|
+
const shouldSendNotification = intelligentNotificationFilter(title, message, data);
|
|
174
|
+
if (!shouldSendNotification.send) {
|
|
175
|
+
addNotification({
|
|
176
|
+
category: data?.category,
|
|
177
|
+
data,
|
|
178
|
+
error: shouldSendNotification.reason,
|
|
179
|
+
id: canonicalRequestId,
|
|
180
|
+
message,
|
|
181
|
+
project: data?.project,
|
|
182
|
+
source: data?.source,
|
|
183
|
+
status: "filtered",
|
|
184
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
185
|
+
title,
|
|
186
|
+
tool: data?.tool
|
|
187
|
+
});
|
|
188
|
+
return json({
|
|
189
|
+
message: "Notification filtered (not sent)",
|
|
190
|
+
reason: shouldSendNotification.reason,
|
|
191
|
+
success: true,
|
|
192
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
const payload = {
|
|
196
|
+
badge: 1,
|
|
197
|
+
body: message,
|
|
198
|
+
category: waitForResponse ? "CLAUDE_PERMISSION" : void 0,
|
|
199
|
+
data: {
|
|
200
|
+
...data,
|
|
201
|
+
requestId: canonicalRequestId,
|
|
202
|
+
source: "modern-apns-api",
|
|
203
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
204
|
+
waitForResponse: waitForResponse || false
|
|
205
|
+
},
|
|
206
|
+
message: null,
|
|
207
|
+
sound: "default",
|
|
208
|
+
title
|
|
209
|
+
};
|
|
210
|
+
const platform = private_env.DEVICE_PLATFORM || "ios";
|
|
211
|
+
if (platform === "android") {
|
|
212
|
+
if (!isFCMConfigured()) {
|
|
213
|
+
return json(
|
|
214
|
+
{
|
|
215
|
+
details: "Missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY environment variables",
|
|
216
|
+
error: "FCM not configured"
|
|
217
|
+
},
|
|
218
|
+
{ status: 500 }
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
const androidToken = (private_env.ANDROID_DEVICE_TOKEN || private_env.DEVICE_TOKEN)?.trim();
|
|
222
|
+
if (!androidToken) {
|
|
223
|
+
return json(
|
|
224
|
+
{
|
|
225
|
+
details: "ANDROID_DEVICE_TOKEN or DEVICE_TOKEN environment variable is missing",
|
|
226
|
+
error: "No device token configured"
|
|
227
|
+
},
|
|
228
|
+
{ status: 500 }
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
const fcmResult = await sendFCMNotification(androidToken, payload);
|
|
232
|
+
if (fcmResult.success) {
|
|
233
|
+
recordNotification(title, message, data);
|
|
234
|
+
if (waitForResponse) {
|
|
235
|
+
createPendingRequest(canonicalRequestId, {
|
|
236
|
+
sessionId: data?.sessionId || "",
|
|
237
|
+
toolInput: data?.toolInput || {},
|
|
238
|
+
toolName: data?.toolName || ""
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
addNotification({
|
|
242
|
+
category: data?.category,
|
|
243
|
+
data,
|
|
244
|
+
id: canonicalRequestId,
|
|
245
|
+
message,
|
|
246
|
+
project: data?.project,
|
|
247
|
+
source: data?.source,
|
|
248
|
+
status: "sent",
|
|
249
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
250
|
+
title,
|
|
251
|
+
tool: data?.tool
|
|
252
|
+
});
|
|
253
|
+
return json({
|
|
254
|
+
message: "Notification sent successfully",
|
|
255
|
+
requestId: canonicalRequestId,
|
|
256
|
+
result: { messageId: fcmResult.messageId },
|
|
257
|
+
success: true,
|
|
258
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
259
|
+
});
|
|
260
|
+
} else {
|
|
261
|
+
console.error(`[notify] FCM delivery failed: ${fcmResult.error}`);
|
|
262
|
+
addNotification({
|
|
263
|
+
category: data?.category,
|
|
264
|
+
data,
|
|
265
|
+
error: fcmResult.error,
|
|
266
|
+
id: canonicalRequestId,
|
|
267
|
+
message,
|
|
268
|
+
project: data?.project,
|
|
269
|
+
source: data?.source,
|
|
270
|
+
status: "failed",
|
|
271
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
272
|
+
title,
|
|
273
|
+
tool: data?.tool
|
|
274
|
+
});
|
|
275
|
+
return json(
|
|
276
|
+
{
|
|
277
|
+
details: fcmResult.error,
|
|
278
|
+
error: "Failed to send notification",
|
|
279
|
+
requestId: canonicalRequestId,
|
|
280
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
281
|
+
},
|
|
282
|
+
{ status: 500 }
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
} else {
|
|
286
|
+
if (!apnsClient.isConfigured()) {
|
|
287
|
+
return json(
|
|
288
|
+
{
|
|
289
|
+
details: "Missing APNS_KEY, APNS_KEY_ID, or APNS_TEAM_ID environment variables",
|
|
290
|
+
error: "APNs client not configured"
|
|
291
|
+
},
|
|
292
|
+
{ status: 500 }
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
const deviceToken = private_env.DEVICE_TOKEN?.trim();
|
|
296
|
+
if (!deviceToken) {
|
|
297
|
+
return json(
|
|
298
|
+
{
|
|
299
|
+
details: "DEVICE_TOKEN environment variable is missing",
|
|
300
|
+
error: "No device token configured"
|
|
301
|
+
},
|
|
302
|
+
{ status: 500 }
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
const result = await apnsClient.sendNotification(deviceToken, payload);
|
|
307
|
+
recordNotification(title, message, data);
|
|
308
|
+
if (waitForResponse) {
|
|
309
|
+
createPendingRequest(canonicalRequestId, {
|
|
310
|
+
sessionId: data?.sessionId || "",
|
|
311
|
+
toolInput: data?.toolInput || {},
|
|
312
|
+
toolName: data?.toolName || ""
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
addNotification({
|
|
316
|
+
category: data?.category,
|
|
317
|
+
data,
|
|
318
|
+
id: canonicalRequestId,
|
|
319
|
+
message,
|
|
320
|
+
project: data?.project,
|
|
321
|
+
source: data?.source,
|
|
322
|
+
status: "sent",
|
|
323
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
324
|
+
title,
|
|
325
|
+
tool: data?.tool
|
|
326
|
+
});
|
|
327
|
+
return json({
|
|
328
|
+
message: "Notification sent successfully",
|
|
329
|
+
requestId: canonicalRequestId,
|
|
330
|
+
result,
|
|
331
|
+
success: true,
|
|
332
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
333
|
+
});
|
|
334
|
+
} catch (notificationError) {
|
|
335
|
+
const err = notificationError;
|
|
336
|
+
console.error(`[notify] APNs delivery failed: ${err.message}`);
|
|
337
|
+
addNotification({
|
|
338
|
+
category: data?.category,
|
|
339
|
+
data,
|
|
340
|
+
error: err.message,
|
|
341
|
+
id: canonicalRequestId,
|
|
342
|
+
message,
|
|
343
|
+
project: data?.project,
|
|
344
|
+
source: data?.source,
|
|
345
|
+
status: "failed",
|
|
346
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
347
|
+
title,
|
|
348
|
+
tool: data?.tool
|
|
349
|
+
});
|
|
350
|
+
return json(
|
|
351
|
+
{
|
|
352
|
+
details: err.message,
|
|
353
|
+
error: "Failed to send notification",
|
|
354
|
+
requestId: canonicalRequestId,
|
|
355
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
356
|
+
},
|
|
357
|
+
{ status: 500 }
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
} catch (error) {
|
|
362
|
+
const err = error;
|
|
363
|
+
console.error("Notification error:", err);
|
|
364
|
+
return json(
|
|
365
|
+
{
|
|
366
|
+
details: err.message,
|
|
367
|
+
error: "Failed to send notification",
|
|
368
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
369
|
+
},
|
|
370
|
+
{ status: 500 }
|
|
371
|
+
);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
const GET = ({ request, url }) => {
|
|
375
|
+
const authError = validateAuth(request);
|
|
376
|
+
if (authError) return authError;
|
|
377
|
+
const limit = parseInt(url.searchParams.get("limit") || "50");
|
|
378
|
+
const notifications = getNotifications(limit);
|
|
379
|
+
return json({
|
|
380
|
+
count: notifications.length,
|
|
381
|
+
notifications,
|
|
382
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
383
|
+
});
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
export { GET, POST };
|
|
387
|
+
//# sourceMappingURL=_server.ts-BL2FGb5Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-BL2FGb5Z.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/notify/_server.ts.js"],"sourcesContent":["import { b as private_env } from \"../../../../chunks/shared-server.js\";\nimport { L as LibraryAPNsService } from \"../../../../chunks/library-apns.js\";\nimport { c as createPendingRequest } from \"../../../../chunks/pending-requests.js\";\nimport { v as validateAuth } from \"../../../../chunks/auth.js\";\nimport admin from \"firebase-admin\";\nimport { json } from \"@sveltejs/kit\";\nconst MAX_HISTORY = 100;\nconst history = [];\nfunction addNotification(record) {\n history.unshift(record);\n if (history.length > MAX_HISTORY) {\n history.length = MAX_HISTORY;\n }\n}\nfunction getNotifications(limit = 50) {\n return history.slice(0, limit);\n}\nlet app = null;\nfunction isFCMConfigured() {\n return !!(process.env.FCM_PROJECT_ID && process.env.FCM_CLIENT_EMAIL && process.env.FCM_PRIVATE_KEY);\n}\nasync function sendFCMNotification(deviceToken, payload) {\n try {\n const fcmApp = getApp();\n const message = {\n android: {\n priority: \"high\",\n // Ensures delivery even in Doze mode\n ttl: 3e5\n // 5 minutes TTL (matches pending request expiry)\n },\n data: {\n body: payload.body || payload.message || \"\",\n category: payload.category ? String(payload.category) : payload.data?.category ? String(payload.data.category) : \"\",\n project: payload.data?.project ? String(payload.data.project) : \"\",\n requestId: payload.data?.requestId ? String(payload.data.requestId) : \"\",\n source: payload.data?.source ? String(payload.data.source) : \"\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title: payload.title,\n toolInput: payload.data?.toolInput ? JSON.stringify(payload.data.toolInput) : \"\",\n toolName: payload.data?.toolName ? String(payload.data.toolName) : \"\",\n type: payload.data?.type ? String(payload.data.type) : \"\"\n },\n token: deviceToken\n };\n const messageId = await admin.messaging(fcmApp).send(message);\n return { messageId, success: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(\"[FCM] Send failed:\", errorMessage);\n return { error: errorMessage, success: false };\n }\n}\nfunction getApp() {\n if (!app) {\n const projectId = process.env.FCM_PROJECT_ID;\n const clientEmail = process.env.FCM_CLIENT_EMAIL;\n const privateKey = process.env.FCM_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!projectId || !clientEmail || !privateKey) {\n throw new Error(\n \"FCM not configured: missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY\"\n );\n }\n app = admin.initializeApp({\n credential: admin.credential.cert({ clientEmail, privateKey, projectId })\n });\n }\n return app;\n}\nlet apnsSingleton = null;\nfunction getAPNsClient() {\n if (!apnsSingleton) {\n apnsSingleton = new LibraryAPNsService();\n }\n return apnsSingleton;\n}\nconst notificationCache = /* @__PURE__ */ new Map();\nconst DEDUP_WINDOW = 1e4;\nfunction intelligentNotificationFilter(title, message, data) {\n const source = data?.source || \"unknown\";\n if (isDuplicateNotification(title, message, data)) {\n return {\n reason: \"Duplicate notification within 10-second window\",\n send: false\n };\n }\n if (source === \"smart-completion-detector\" || source === \"shooter-completion-detector\") {\n return {\n reason: \"Smart completion detector - completion or intervention needed\",\n send: true\n };\n }\n if (source === \"stop-hook\") {\n return {\n reason: \"Stop hook completion notification - session finished\",\n send: true\n };\n }\n const spamPatterns = [\n /PreToolUse/i,\n // Any PreToolUse notifications\n /PostToolUse/i,\n // Any PostToolUse notifications\n /^(Read|Write|Edit|Bash)\\s+Starting\\s*\\|\\s*\\w+$/i,\n // Only basic tool starting patterns\n /^unknown\\s*\\|\\s*\\w+$/i\n // Only \"unknown | projectname\" exactly\n ];\n const isSpam = spamPatterns.some((pattern) => pattern.test(title) || pattern.test(message));\n if (isSpam) {\n return {\n reason: \"Filtered spam notification from old hook system\",\n send: false\n };\n }\n const importantPatterns = [\n /session complete/i,\n /intervention needed/i,\n /error/i,\n /failed/i,\n /blocked/i,\n /attention/i\n ];\n const isImportant = importantPatterns.some(\n (pattern) => pattern.test(title) || pattern.test(message)\n );\n if (isImportant) {\n return {\n reason: \"Important notification - completion or intervention\",\n send: true\n };\n }\n return {\n reason: \"General notification - allowing by default\",\n send: true\n };\n}\nfunction isDuplicateNotification(title, message, data) {\n const key = `${title}|${message}|${data?.category || \"unknown\"}`;\n const now = Date.now();\n if (notificationCache.has(key)) {\n const lastSent = notificationCache.get(key);\n if (now - lastSent < DEDUP_WINDOW) {\n return true;\n }\n }\n for (const [k, v] of notificationCache.entries()) {\n if (now - v > DEDUP_WINDOW) {\n notificationCache.delete(k);\n }\n }\n return false;\n}\nfunction recordNotification(title, message, data) {\n const key = `${title}|${message}|${data?.category || \"unknown\"}`;\n notificationCache.set(key, Date.now());\n}\nconst POST = async ({ request }) => {\n try {\n const apnsClient = getAPNsClient();\n const authError = validateAuth(request);\n if (authError) return authError;\n const body = await request.json();\n const { data, message, title, waitForResponse } = body;\n if (!title || !message) {\n return json({ error: \"Title and message are required\" }, { status: 400 });\n }\n const requestId = Math.random().toString(36).substring(2, 15);\n const dataRequestId = typeof data?.requestId === \"string\" ? data.requestId : void 0;\n const canonicalRequestId = dataRequestId || requestId;\n const shouldSendNotification = intelligentNotificationFilter(title, message, data);\n if (!shouldSendNotification.send) {\n addNotification({\n category: data?.category,\n data,\n error: shouldSendNotification.reason,\n id: canonicalRequestId,\n message,\n project: data?.project,\n source: data?.source,\n status: \"filtered\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool\n });\n return json({\n message: \"Notification filtered (not sent)\",\n reason: shouldSendNotification.reason,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n const payload = {\n badge: 1,\n body: message,\n category: waitForResponse ? \"CLAUDE_PERMISSION\" : void 0,\n data: {\n ...data,\n requestId: canonicalRequestId,\n source: \"modern-apns-api\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n waitForResponse: waitForResponse || false\n },\n message: null,\n sound: \"default\",\n title\n };\n const platform = private_env.DEVICE_PLATFORM || \"ios\";\n if (platform === \"android\") {\n if (!isFCMConfigured()) {\n return json(\n {\n details: \"Missing FCM_PROJECT_ID, FCM_CLIENT_EMAIL, or FCM_PRIVATE_KEY environment variables\",\n error: \"FCM not configured\"\n },\n { status: 500 }\n );\n }\n const androidToken = (private_env.ANDROID_DEVICE_TOKEN || private_env.DEVICE_TOKEN)?.trim();\n if (!androidToken) {\n return json(\n {\n details: \"ANDROID_DEVICE_TOKEN or DEVICE_TOKEN environment variable is missing\",\n error: \"No device token configured\"\n },\n { status: 500 }\n );\n }\n const fcmResult = await sendFCMNotification(androidToken, payload);\n if (fcmResult.success) {\n recordNotification(title, message, data);\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification({\n category: data?.category,\n data,\n id: canonicalRequestId,\n message,\n project: data?.project,\n source: data?.source,\n status: \"sent\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool\n });\n return json({\n message: \"Notification sent successfully\",\n requestId: canonicalRequestId,\n result: { messageId: fcmResult.messageId },\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } else {\n console.error(`[notify] FCM delivery failed: ${fcmResult.error}`);\n addNotification({\n category: data?.category,\n data,\n error: fcmResult.error,\n id: canonicalRequestId,\n message,\n project: data?.project,\n source: data?.source,\n status: \"failed\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool\n });\n return json(\n {\n details: fcmResult.error,\n error: \"Failed to send notification\",\n requestId: canonicalRequestId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n } else {\n if (!apnsClient.isConfigured()) {\n return json(\n {\n details: \"Missing APNS_KEY, APNS_KEY_ID, or APNS_TEAM_ID environment variables\",\n error: \"APNs client not configured\"\n },\n { status: 500 }\n );\n }\n const deviceToken = private_env.DEVICE_TOKEN?.trim();\n if (!deviceToken) {\n return json(\n {\n details: \"DEVICE_TOKEN environment variable is missing\",\n error: \"No device token configured\"\n },\n { status: 500 }\n );\n }\n try {\n const result = await apnsClient.sendNotification(deviceToken, payload);\n recordNotification(title, message, data);\n if (waitForResponse) {\n createPendingRequest(canonicalRequestId, {\n sessionId: data?.sessionId || \"\",\n toolInput: data?.toolInput || {},\n toolName: data?.toolName || \"\"\n });\n }\n addNotification({\n category: data?.category,\n data,\n id: canonicalRequestId,\n message,\n project: data?.project,\n source: data?.source,\n status: \"sent\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool\n });\n return json({\n message: \"Notification sent successfully\",\n requestId: canonicalRequestId,\n result,\n success: true,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n } catch (notificationError) {\n const err = notificationError;\n console.error(`[notify] APNs delivery failed: ${err.message}`);\n addNotification({\n category: data?.category,\n data,\n error: err.message,\n id: canonicalRequestId,\n message,\n project: data?.project,\n source: data?.source,\n status: \"failed\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n title,\n tool: data?.tool\n });\n return json(\n {\n details: err.message,\n error: \"Failed to send notification\",\n requestId: canonicalRequestId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n }\n } catch (error) {\n const err = error;\n console.error(\"Notification error:\", err);\n return json(\n {\n details: err.message,\n error: \"Failed to send notification\",\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n },\n { status: 500 }\n );\n }\n};\nconst GET = ({ request, url }) => {\n const authError = validateAuth(request);\n if (authError) return authError;\n const limit = parseInt(url.searchParams.get(\"limit\") || \"50\");\n const notifications = getNotifications(limit);\n return json({\n count: notifications.length,\n notifications,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { v as validateAuth } from './auth-CEgFis71.js';
|
|
2
|
+
import { j as json } from './shared-server-BDY8jh20.js';
|
|
3
|
+
import { mkdirSync, writeFileSync } from 'fs';
|
|
4
|
+
import 'crypto';
|
|
5
|
+
|
|
6
|
+
const POST = async ({ params, request }) => {
|
|
7
|
+
const authError = validateAuth(request);
|
|
8
|
+
if (authError) {
|
|
9
|
+
return authError;
|
|
10
|
+
}
|
|
11
|
+
const terminalId = params.id;
|
|
12
|
+
if (!/^[A-Za-z0-9_-]+$/.test(terminalId)) {
|
|
13
|
+
return json({ error: "Invalid terminal ID" }, { status: 400 });
|
|
14
|
+
}
|
|
15
|
+
let body;
|
|
16
|
+
try {
|
|
17
|
+
body = await request.json();
|
|
18
|
+
} catch {
|
|
19
|
+
return json({ error: "Invalid JSON" }, { status: 400 });
|
|
20
|
+
}
|
|
21
|
+
if (!body.image || typeof body.image !== "string") {
|
|
22
|
+
return json({ error: "image (base64) is required" }, { status: 400 });
|
|
23
|
+
}
|
|
24
|
+
let imageBuffer;
|
|
25
|
+
try {
|
|
26
|
+
const base64Data = body.image.replace(/^data:image\/\w+;base64,/, "");
|
|
27
|
+
const decoded = Buffer.from(base64Data, "base64");
|
|
28
|
+
if (decoded.length === 0 || decoded.toString("base64") !== base64Data) {
|
|
29
|
+
return json({ error: "Invalid base64 image data" }, { status: 400 });
|
|
30
|
+
}
|
|
31
|
+
imageBuffer = decoded;
|
|
32
|
+
} catch {
|
|
33
|
+
return json({ error: "Invalid base64 image data" }, { status: 400 });
|
|
34
|
+
}
|
|
35
|
+
const clipboardDir = `/tmp/shooter-clipboard-${terminalId}`;
|
|
36
|
+
const imagePath = `${clipboardDir}/image.png`;
|
|
37
|
+
try {
|
|
38
|
+
mkdirSync(clipboardDir, { recursive: true });
|
|
39
|
+
writeFileSync(imagePath, imageBuffer);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
return json({ details: err.message, error: "Failed to write image" }, { status: 500 });
|
|
42
|
+
}
|
|
43
|
+
return json({ path: imagePath, size: imageBuffer.length });
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { POST };
|
|
47
|
+
//# sourceMappingURL=_server.ts-BgdjBZco.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.ts-BgdjBZco.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/api/terminals/_id_/paste-image/_server.ts.js"],"sourcesContent":["import { v as validateAuth } from \"../../../../../../chunks/auth.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { mkdirSync, writeFileSync } from \"fs\";\nconst POST = async ({ params, request }) => {\n const authError = validateAuth(request);\n if (authError) {\n return authError;\n }\n const terminalId = params.id;\n if (!/^[A-Za-z0-9_-]+$/.test(terminalId)) {\n return json({ error: \"Invalid terminal ID\" }, { status: 400 });\n }\n let body;\n try {\n body = await request.json();\n } catch {\n return json({ error: \"Invalid JSON\" }, { status: 400 });\n }\n if (!body.image || typeof body.image !== \"string\") {\n return json({ error: \"image (base64) is required\" }, { status: 400 });\n }\n let imageBuffer;\n try {\n const base64Data = body.image.replace(/^data:image\\/\\w+;base64,/, \"\");\n const decoded = Buffer.from(base64Data, \"base64\");\n if (decoded.length === 0 || decoded.toString(\"base64\") !== base64Data) {\n return json({ error: \"Invalid base64 image data\" }, { status: 400 });\n }\n imageBuffer = decoded;\n } catch {\n return json({ error: \"Invalid base64 image data\" }, { status: 400 });\n }\n const clipboardDir = `/tmp/shooter-clipboard-${terminalId}`;\n const imagePath = `${clipboardDir}/image.png`;\n try {\n mkdirSync(clipboardDir, { recursive: true });\n writeFileSync(imagePath, imageBuffer);\n } catch (err) {\n return json({ details: err.message, error: \"Failed to write image\" }, { status: 500 });\n }\n return json({ path: imagePath, size: imageBuffer.length });\n};\nexport {\n POST\n};\n"],"names":[],"mappings":";;;;;AAGK,MAAC,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;AAC5C,EAAE,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;AACzC,EAAE,IAAI,SAAS,EAAE;AACjB,IAAI,OAAO,SAAS;AACpB,EAAE;AACF,EAAE,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE;AAC9B,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC5C,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAClE,EAAE;AACF,EAAE,IAAI,IAAI;AACV,EAAE,IAAI;AACN,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;AAC/B,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3D,EAAE;AACF,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE;AACrD,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACzE,EAAE;AACF,EAAE,IAAI,WAAW;AACjB,EAAE,IAAI;AACN,IAAI,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;AACzE,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;AACrD,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,UAAU,EAAE;AAC3E,MAAM,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC1E,IAAI;AACJ,IAAI,WAAW,GAAG,OAAO;AACzB,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxE,EAAE;AACF,EAAE,MAAM,YAAY,GAAG,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;AAC7D,EAAE,MAAM,SAAS,GAAG,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC;AAC/C,EAAE,IAAI;AACN,IAAI,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAChD,IAAI,aAAa,CAAC,SAAS,EAAE,WAAW,CAAC;AACzC,EAAE,CAAC,CAAC,OAAO,GAAG,EAAE;AAChB,IAAI,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC1F,EAAE;AACF,EAAE,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;AAC5D;;;;"}
|