@juspay/shooter 1.0.0 → 1.2.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 +117 -33
- package/.claude/settings.json +14 -14
- package/README.md +116 -84
- package/bin/shooter.cjs +471 -102
- package/build/client/_app/immutable/assets/{0.CM9Hl6d-.css → 0.BhZOCxO4.css} +1 -1
- package/build/client/_app/immutable/assets/0.BhZOCxO4.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BhZOCxO4.css.gz +0 -0
- package/build/client/_app/immutable/assets/1.BYutk3aU.css +1 -0
- package/build/client/_app/immutable/assets/1.BYutk3aU.css.br +0 -0
- package/build/client/_app/immutable/assets/1.BYutk3aU.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css +1 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
- package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.BFUut--w.css +1 -0
- package/build/client/_app/immutable/assets/4.BFUut--w.css.br +0 -0
- package/build/client/_app/immutable/assets/4.BFUut--w.css.gz +0 -0
- package/build/client/_app/immutable/assets/5.BTOx7yt7.css +1 -0
- package/build/client/_app/immutable/assets/5.BTOx7yt7.css.br +0 -0
- package/build/client/_app/immutable/assets/5.BTOx7yt7.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.eZGZN-BF.css +1 -0
- package/build/client/_app/immutable/assets/6.eZGZN-BF.css.br +0 -0
- package/build/client/_app/immutable/assets/6.eZGZN-BF.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.DwS5ZHBh.css +1 -0
- package/build/client/_app/immutable/assets/7.DwS5ZHBh.css.br +0 -0
- package/build/client/_app/immutable/assets/7.DwS5ZHBh.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChatView.CwWbzIL-.css +1 -0
- package/build/client/_app/immutable/assets/ChatView.CwWbzIL-.css.br +0 -0
- package/build/client/_app/immutable/assets/ChatView.CwWbzIL-.css.gz +0 -0
- package/build/client/_app/immutable/assets/Phone.FQEfwCX2.css +1 -0
- package/build/client/_app/immutable/assets/Phone.FQEfwCX2.css.br +0 -0
- package/build/client/_app/immutable/assets/Phone.FQEfwCX2.css.gz +0 -0
- package/build/client/_app/immutable/assets/markdown.Dc-OSJWY.css +1 -0
- package/build/client/_app/immutable/assets/markdown.Dc-OSJWY.css.br +0 -0
- package/build/client/_app/immutable/assets/markdown.Dc-OSJWY.css.gz +0 -0
- package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B-K5Sh65.js +1 -0
- package/build/client/_app/immutable/chunks/B-K5Sh65.js.br +0 -0
- package/build/client/_app/immutable/chunks/B-K5Sh65.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js +20 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js +1 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js +6 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
- package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BLszSzTT.js +1 -0
- package/build/client/_app/immutable/chunks/BLszSzTT.js.br +0 -0
- package/build/client/_app/immutable/chunks/BLszSzTT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js +1 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BTGVxaYV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BYqGCrTe.js +1 -0
- package/build/client/_app/immutable/chunks/BYqGCrTe.js.br +0 -0
- package/build/client/_app/immutable/chunks/BYqGCrTe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BlxrFPDK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js +1 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C4mLaWWx.js +1 -0
- package/build/client/_app/immutable/chunks/C4mLaWWx.js.br +0 -0
- package/build/client/_app/immutable/chunks/C4mLaWWx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js +61 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js +1 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
- package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js +1 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DLu6yJIZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js +1 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js +1 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
- package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js +41 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
- package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/PPVm8Dsz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js +1 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
- package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js +2 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
- package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Z3zMnuSx.js +2 -0
- package/build/client/_app/immutable/entry/app.Z3zMnuSx.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Z3zMnuSx.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.Dd-gIP4y.js +1 -0
- package/build/client/_app/immutable/entry/start.Dd-gIP4y.js.br +2 -0
- package/build/client/_app/immutable/entry/start.Dd-gIP4y.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.D2YR8tTD.js +1 -0
- package/build/client/_app/immutable/nodes/0.D2YR8tTD.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.D2YR8tTD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.B3m6rO4C.js +1 -0
- package/build/client/_app/immutable/nodes/1.B3m6rO4C.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.B3m6rO4C.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.CyRB2euU.js +1 -0
- package/build/client/_app/immutable/nodes/2.CyRB2euU.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CyRB2euU.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js +3 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.DEAcwl7l.js +1 -0
- package/build/client/_app/immutable/nodes/4.DEAcwl7l.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.DEAcwl7l.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.C6bLGWQR.js +4 -0
- package/build/client/_app/immutable/nodes/5.C6bLGWQR.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.C6bLGWQR.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.ByTzlA2D.js +2 -0
- package/build/client/_app/immutable/nodes/6.ByTzlA2D.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.ByTzlA2D.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.BPMfwzd2.js +2 -0
- package/build/client/_app/immutable/nodes/7.BPMfwzd2.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BPMfwzd2.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/favicon.svg.gz +0 -0
- package/build/client/manifest.json +13 -0
- package/build/client/manifest.json.br +0 -0
- package/build/client/manifest.json.gz +0 -0
- package/build/pty-holder.cjs +37 -8
- package/build/server/chunks/0-Vk38tI2J.js +9 -0
- package/build/server/chunks/0-Vk38tI2J.js.map +1 -0
- package/build/server/chunks/1-BvYQX5MR.js +9 -0
- package/build/server/chunks/1-BvYQX5MR.js.map +1 -0
- package/build/server/chunks/2-Cl7R4Qk2.js +9 -0
- package/build/server/chunks/2-Cl7R4Qk2.js.map +1 -0
- package/build/server/chunks/3-Ck7ewhOX.js +9 -0
- package/build/server/chunks/3-Ck7ewhOX.js.map +1 -0
- package/build/server/chunks/4-CnDeRm2Z.js +9 -0
- package/build/server/chunks/4-CnDeRm2Z.js.map +1 -0
- package/build/server/chunks/5-IxitzEvN.js +9 -0
- package/build/server/chunks/5-IxitzEvN.js.map +1 -0
- package/build/server/chunks/6-CyZ3r1iS.js +9 -0
- package/build/server/chunks/6-CyZ3r1iS.js.map +1 -0
- package/build/server/chunks/7-BmI7du46.js +9 -0
- package/build/server/chunks/7-BmI7du46.js.map +1 -0
- package/build/server/chunks/Button-Cs1aE6ka.js +80 -0
- package/build/server/chunks/Button-Cs1aE6ka.js.map +1 -0
- package/build/server/chunks/EmptyState-DDFH1K8g.js +26 -0
- package/build/server/chunks/EmptyState-DDFH1K8g.js.map +1 -0
- package/build/server/chunks/Icon-CEUrotA6.js +36 -0
- package/build/server/chunks/Icon-CEUrotA6.js.map +1 -0
- package/build/server/chunks/Shimmer-DB8W1zt6.js +10 -0
- package/build/server/chunks/Shimmer-DB8W1zt6.js.map +1 -0
- package/build/server/chunks/_error.svelte-uCOJNxvr.js +39 -0
- package/build/server/chunks/_error.svelte-uCOJNxvr.js.map +1 -0
- package/build/server/chunks/_layout.svelte-CtWmEJwe.js +56 -0
- package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +1 -0
- package/build/server/chunks/_page.svelte-BcZaKdX9.js +45 -0
- package/build/server/chunks/_page.svelte-BcZaKdX9.js.map +1 -0
- package/build/server/chunks/_page.svelte-BdYynOck.js +85 -0
- package/build/server/chunks/_page.svelte-BdYynOck.js.map +1 -0
- package/build/server/chunks/_page.svelte-BgevQjq1.js +101 -0
- package/build/server/chunks/_page.svelte-BgevQjq1.js.map +1 -0
- package/build/server/chunks/_page.svelte-CVq6tRb3.js +550 -0
- package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +1 -0
- package/build/server/chunks/_page.svelte-CxWcQ0Am.js +651 -0
- package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +1 -0
- package/build/server/chunks/_page.svelte-DO4oa_LY.js +44 -0
- package/build/server/chunks/_page.svelte-DO4oa_LY.js.map +1 -0
- package/build/server/chunks/{_server.ts-CbDRDIoP.js → _server.ts-BStnNIcq.js} +9 -11
- package/build/server/chunks/_server.ts-BStnNIcq.js.map +1 -0
- package/build/server/chunks/{_server.ts-DRVbgm6k.js → _server.ts-CAxsWKvS.js} +22 -25
- package/build/server/chunks/_server.ts-CAxsWKvS.js.map +1 -0
- package/build/server/chunks/{_server.ts-CPa6DgIt.js → _server.ts-COu0vNpd.js} +6 -6
- package/build/server/chunks/_server.ts-COu0vNpd.js.map +1 -0
- package/build/server/chunks/{_server.ts-C29xzfaw.js → _server.ts-CTpcLUH8.js} +10 -10
- package/build/server/chunks/_server.ts-CTpcLUH8.js.map +1 -0
- package/build/server/chunks/{_server.ts-D4MNi4cD.js → _server.ts-Cf84YIaW.js} +3 -3
- package/build/server/chunks/{_server.ts-D4MNi4cD.js.map → _server.ts-Cf84YIaW.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BL2FGb5Z.js → _server.ts-Ch-6iOHp.js} +99 -53
- package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +1 -0
- package/build/server/chunks/_server.ts-CtH0dhUp.js +71 -0
- package/build/server/chunks/_server.ts-CtH0dhUp.js.map +1 -0
- package/build/server/chunks/_server.ts-DB_Kg97c.js +73 -0
- package/build/server/chunks/_server.ts-DB_Kg97c.js.map +1 -0
- package/build/server/chunks/{_server.ts-DfajWaqh.js → _server.ts-DV8zTCF9.js} +7 -9
- package/build/server/chunks/_server.ts-DV8zTCF9.js.map +1 -0
- package/build/server/chunks/_server.ts-DYpJImqd.js +99 -0
- package/build/server/chunks/_server.ts-DYpJImqd.js.map +1 -0
- package/build/server/chunks/{_server.ts-ColfDHW8.js → _server.ts-DYvb9ijZ.js} +21 -10
- package/build/server/chunks/_server.ts-DYvb9ijZ.js.map +1 -0
- package/build/server/chunks/{_server.ts-Cv_OrRuL.js → _server.ts-Deok2y88.js} +209 -34
- package/build/server/chunks/_server.ts-Deok2y88.js.map +1 -0
- package/build/server/chunks/{_server.ts-y9-WYDMa.js → _server.ts-WhTJBEJy.js} +5 -4
- package/build/server/chunks/{_server.ts-y9-WYDMa.js.map → _server.ts-WhTJBEJy.js.map} +1 -1
- package/build/server/chunks/{_server.ts-BjOJsoy4.js → _server.ts-XzT2UHM1.js} +6 -5
- package/build/server/chunks/_server.ts-XzT2UHM1.js.map +1 -0
- package/build/server/chunks/{_server.ts-BgdjBZco.js → _server.ts-tSpgyl1D.js} +7 -5
- package/build/server/chunks/_server.ts-tSpgyl1D.js.map +1 -0
- package/build/server/chunks/{_server.ts-BihKSdj_.js → _server.ts-vekTmWAx.js} +8 -8
- package/build/server/chunks/_server.ts-vekTmWAx.js.map +1 -0
- package/build/server/chunks/{auth-CEgFis71.js → auth-DeCdZ83n.js} +2 -2
- package/build/server/chunks/{auth-CEgFis71.js.map → auth-DeCdZ83n.js.map} +1 -1
- package/build/server/chunks/client-BdGHe_hY.js +25 -0
- package/build/server/chunks/client-BdGHe_hY.js.map +1 -0
- package/build/server/chunks/client2-CCBGA-2V.js +7 -0
- package/build/server/chunks/client2-CCBGA-2V.js.map +1 -0
- package/build/server/chunks/error-DDXB3duW.js +12 -0
- package/build/server/chunks/error-DDXB3duW.js.map +1 -0
- package/build/server/chunks/{exports-CJ0Q5XmL.js → index-DwaY1cAm.js} +1111 -1634
- package/build/server/chunks/index-DwaY1cAm.js.map +1 -0
- package/build/server/chunks/index-server-CrDaL06Y.js +9 -0
- package/build/server/chunks/index-server-CrDaL06Y.js.map +1 -0
- package/build/server/chunks/index2-CgclKpUj.js +58 -0
- package/build/server/chunks/index2-CgclKpUj.js.map +1 -0
- package/build/server/chunks/{library-apns-BHxLmuIx.js → library-apns-BqJbvSKh.js} +4 -4
- package/build/server/chunks/library-apns-BqJbvSKh.js.map +1 -0
- package/build/server/chunks/markdown-W_mTBct0.js +8 -0
- package/build/server/chunks/markdown-W_mTBct0.js.map +1 -0
- package/build/server/chunks/opencode-db-path-DcfhJtJy.js +15 -0
- package/build/server/chunks/opencode-db-path-DcfhJtJy.js.map +1 -0
- package/build/server/chunks/{pty-manager-C0FhBiVq.js → pty-manager-BQVB7IVj.js} +155 -326
- package/build/server/chunks/pty-manager-BQVB7IVj.js.map +1 -0
- package/build/server/chunks/root-DDSnEAZv.js +1171 -0
- package/build/server/chunks/root-DDSnEAZv.js.map +1 -0
- package/build/server/chunks/{shared-server-BDY8jh20.js → shared-server-sSGG17Df.js} +2 -3
- package/build/server/chunks/{shared-server-BDY8jh20.js.map → shared-server-sSGG17Df.js.map} +1 -1
- package/build/server/chunks/state.svelte-hBbXlUak.js +11 -0
- package/build/server/chunks/state.svelte-hBbXlUak.js.map +1 -0
- package/build/server/chunks/stores-DHNzYNpX.js +28 -0
- package/build/server/chunks/stores-DHNzYNpX.js.map +1 -0
- package/build/server/index.js +1085 -2242
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +39 -25
- package/build/server/manifest.js.map +1 -1
- package/package.json +32 -9
- package/scripts/fix-generated-types.sh +37 -0
- package/scripts/homebrew/shooter.rb +51 -0
- package/scripts/install.sh +348 -186
- package/scripts/setup.cjs +215 -45
- package/server.ts +114 -71
- package/src/app.css +12 -3
- package/src/app.d.ts +13 -20
- package/src/app.html +3 -2
- package/src/generated/types/API.ts +280 -0
- package/src/generated/types/APN.ts +186 -203
- package/src/generated/types/CLI.ts +18 -25
- package/src/generated/types/Client.ts +589 -0
- package/src/generated/types/Config.ts +53 -0
- package/src/generated/types/Holder.ts +638 -0
- package/src/generated/types/JWT.ts +39 -50
- package/src/generated/types/Notification.ts +426 -0
- package/src/generated/types/OpenCode.ts +356 -0
- package/src/generated/types/Sessions.ts +570 -0
- package/src/generated/types/Terminal.ts +2184 -2071
- package/src/generated/types/WsProtocol.ts +2004 -0
- package/src/generated/types/index.ts +9 -3
- package/src/lib/env.ts +29 -0
- package/src/lib/modules/client/common/cache.ts +10 -2
- package/src/lib/modules/client/common/config-guard.ts +37 -5
- package/src/lib/modules/client/common/error.ts +10 -0
- package/src/lib/modules/client/common/index.ts +6 -5
- package/src/lib/modules/client/common/markdown.ts +22 -1
- package/src/lib/modules/client/common/native-bridge.ts +28 -20
- package/src/lib/modules/client/common/time.ts +13 -11
- package/src/lib/modules/client/terminal/ChatView.svelte +354 -74
- package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -2
- package/src/lib/modules/client/terminal/ConnectionStatus.svelte +7 -1
- package/src/lib/modules/client/terminal/LaunchSheet.svelte +147 -84
- package/src/lib/modules/client/terminal/QuickKeys.svelte +3 -1
- package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +2 -5
- package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +27 -24
- package/src/lib/modules/client/terminal/xterm-wrapper.ts +74 -45
- package/src/lib/modules/server/apn/library-apns.ts +3 -2
- package/src/lib/modules/server/apn/notification-history.ts +2 -13
- package/src/lib/modules/server/apn/notification-sessions.ts +3 -13
- package/src/lib/modules/server/apn/pending-requests.ts +3 -8
- package/src/lib/modules/server/apn/types.ts +5 -4
- package/src/lib/modules/server/cli/index.ts +3 -2
- package/src/lib/modules/server/fcm/fcm-service.ts +8 -6
- package/src/lib/modules/server/sessions/jsonl-parser.ts +3 -3
- package/src/lib/modules/server/sessions/jsonl-reader.ts +86 -26
- package/src/lib/modules/server/sessions/opencode-db-path.ts +26 -0
- package/src/lib/modules/server/sessions/opencode-reader.ts +13 -15
- package/src/lib/modules/server/sessions/process-detector.ts +103 -0
- package/src/lib/modules/server/sessions/types.ts +11 -22
- package/src/lib/modules/server/terminal/holder-client.ts +272 -248
- package/src/lib/modules/server/terminal/opencode-watcher.ts +547 -556
- package/src/lib/modules/server/terminal/pty-holder.cjs +37 -8
- package/src/lib/modules/server/terminal/pty-manager.ts +157 -115
- package/src/lib/modules/server/terminal/session-watcher.ts +6 -4
- package/src/lib/modules/server/terminal/terminal-store.ts +131 -128
- package/src/lib/modules/server/utils/error.ts +9 -0
- package/src/lib/modules/server/ws/events-handler.ts +12 -6
- package/src/lib/modules/server/ws/keepalive.ts +86 -69
- package/src/lib/modules/server/ws/server.ts +43 -37
- package/src/lib/modules/server/ws/session-handler.ts +332 -147
- package/src/lib/modules/server/ws/terminal-handler.ts +29 -17
- package/src/lib/modules/server/ws/ticket-store.ts +29 -26
- package/src/lib/theme.css +30 -0
- package/src/lib/types/config.ts +1 -6
- package/src/routes/+error.svelte +94 -0
- package/src/routes/+layout.svelte +66 -31
- package/src/routes/+page.svelte +25 -22
- package/src/routes/api/debug/+server.ts +3 -1
- package/src/routes/api/device-token/+server.ts +60 -60
- package/src/routes/api/health/+server.ts +81 -73
- package/src/routes/api/notify/+server.ts +115 -68
- package/src/routes/api/qr-config/+server.ts +30 -32
- package/src/routes/api/response/+server.ts +9 -4
- package/src/routes/api/sessions/+server.ts +15 -5
- package/src/routes/api/sessions/connect/+server.ts +125 -0
- package/src/routes/api/sessions/detect/+server.ts +27 -0
- package/src/routes/api/terminals/+server.ts +26 -24
- package/src/routes/api/terminals/[id]/+server.ts +13 -7
- package/src/routes/api/terminals/[id]/paste-image/+server.ts +54 -52
- package/src/routes/api/terminals/[id]/resize/+server.ts +6 -3
- package/src/routes/api/webhook/+server.ts +8 -10
- package/src/routes/api/ws-status/+server.ts +7 -5
- package/src/routes/api/ws-ticket/+server.ts +42 -41
- package/src/routes/config/+page.svelte +149 -75
- package/src/routes/project/+page.svelte +165 -35
- package/src/routes/session/[id]/+page.svelte +479 -283
- package/src/routes/terminals/+page.svelte +58 -45
- package/src/routes/terminals/[id]/+page.svelte +223 -91
- 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/3.C0uFg0IS.css +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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/chunks/BNJphC1q.js +0 -56
- 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/Bvk7mfPM.js +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -6
- 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 +0 -11
- 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 +0 -1
- 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 +0 -1
- 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/Dkkpz_4D.js +0 -126
- 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 +0 -1
- 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/RpcNruLP.js +0 -2
- 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 +0 -1
- 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 +0 -1
- 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 +0 -2
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -3
- 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 +0 -1
- 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 +0 -1
- 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 +0 -2
- 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 +0 -2
- 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/manifest.webmanifest +0 -1
- package/build/client/registerSW.js +0 -1
- package/build/client/registerSW.js.br +0 -0
- package/build/client/registerSW.js.gz +0 -0
- package/build/client/sw.js +0 -222
- package/build/client/sw.js.br +0 -0
- package/build/client/sw.js.gz +0 -0
- package/build/client/workbox-5119daf5.js +0 -3395
- package/build/client/workbox-5119daf5.js.br +0 -0
- package/build/client/workbox-5119daf5.js.gz +0 -0
- package/build/server/chunks/0-q2IUp76Y.js +0 -9
- package/build/server/chunks/0-q2IUp76Y.js.map +0 -1
- package/build/server/chunks/1-CU50G5wZ.js +0 -9
- package/build/server/chunks/1-CU50G5wZ.js.map +0 -1
- package/build/server/chunks/2-D01t9s8T.js +0 -9
- package/build/server/chunks/2-D01t9s8T.js.map +0 -1
- package/build/server/chunks/3-5PUQ04wC.js +0 -9
- package/build/server/chunks/3-5PUQ04wC.js.map +0 -1
- package/build/server/chunks/4-e7gywnSG.js +0 -9
- package/build/server/chunks/4-e7gywnSG.js.map +0 -1
- package/build/server/chunks/5-CA1SA6KZ.js +0 -9
- package/build/server/chunks/5-CA1SA6KZ.js.map +0 -1
- package/build/server/chunks/6-71H221sV.js +0 -9
- package/build/server/chunks/6-71H221sV.js.map +0 -1
- package/build/server/chunks/7-Bo-vmdyz.js +0 -9
- package/build/server/chunks/7-Bo-vmdyz.js.map +0 -1
- package/build/server/chunks/_layout.svelte-SFHOxs74.js +0 -132
- package/build/server/chunks/_layout.svelte-SFHOxs74.js.map +0 -1
- package/build/server/chunks/_page.svelte-B4w-2wD-.js +0 -120
- package/build/server/chunks/_page.svelte-B4w-2wD-.js.map +0 -1
- package/build/server/chunks/_page.svelte-B_qAXjkh.js +0 -213
- package/build/server/chunks/_page.svelte-B_qAXjkh.js.map +0 -1
- package/build/server/chunks/_page.svelte-CsF1_TRG.js +0 -50
- package/build/server/chunks/_page.svelte-CsF1_TRG.js.map +0 -1
- package/build/server/chunks/_page.svelte-DJC6U-P0.js +0 -68
- package/build/server/chunks/_page.svelte-DJC6U-P0.js.map +0 -1
- package/build/server/chunks/_page.svelte-DQ6HBtsz.js +0 -407
- package/build/server/chunks/_page.svelte-DQ6HBtsz.js.map +0 -1
- package/build/server/chunks/_page.svelte-LbhhjP21.js +0 -148
- package/build/server/chunks/_page.svelte-LbhhjP21.js.map +0 -1
- package/build/server/chunks/_server.ts-BL2FGb5Z.js.map +0 -1
- package/build/server/chunks/_server.ts-BgdjBZco.js.map +0 -1
- package/build/server/chunks/_server.ts-BihKSdj_.js.map +0 -1
- package/build/server/chunks/_server.ts-BjOJsoy4.js.map +0 -1
- package/build/server/chunks/_server.ts-C29xzfaw.js.map +0 -1
- package/build/server/chunks/_server.ts-CPa6DgIt.js.map +0 -1
- package/build/server/chunks/_server.ts-CbDRDIoP.js.map +0 -1
- package/build/server/chunks/_server.ts-Cl1OEWL4.js +0 -54
- package/build/server/chunks/_server.ts-Cl1OEWL4.js.map +0 -1
- package/build/server/chunks/_server.ts-ColfDHW8.js.map +0 -1
- package/build/server/chunks/_server.ts-Cv_OrRuL.js.map +0 -1
- package/build/server/chunks/_server.ts-DRVbgm6k.js.map +0 -1
- package/build/server/chunks/_server.ts-DfajWaqh.js.map +0 -1
- package/build/server/chunks/client-CxCatAKr.js +0 -255
- package/build/server/chunks/client-CxCatAKr.js.map +0 -1
- package/build/server/chunks/error.svelte-BqdwMWdK.js +0 -26
- package/build/server/chunks/error.svelte-BqdwMWdK.js.map +0 -1
- package/build/server/chunks/exports-CJ0Q5XmL.js.map +0 -1
- package/build/server/chunks/index2-DAxIoAO-.js +0 -36
- package/build/server/chunks/index2-DAxIoAO-.js.map +0 -1
- package/build/server/chunks/jsonl-parser-dmZU_Hyu.js +0 -137
- package/build/server/chunks/jsonl-parser-dmZU_Hyu.js.map +0 -1
- package/build/server/chunks/library-apns-BHxLmuIx.js.map +0 -1
- package/build/server/chunks/markdown-Bxrl3cCF.js +0 -1241
- package/build/server/chunks/markdown-Bxrl3cCF.js.map +0 -1
- package/build/server/chunks/pty-manager-C0FhBiVq.js.map +0 -1
- package/build/server/chunks/stores-D0HorpgL.js +0 -36
- package/build/server/chunks/stores-D0HorpgL.js.map +0 -1
|
@@ -1,92 +1,81 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isJSON, decodeString, _decodeString, decodeNumber, _decodeNumber } from 'type-decoder';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @type { Header }
|
|
5
5
|
* @description JWT header for APNs authentication token
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
7
|
+
export type Header = {
|
|
8
8
|
/**
|
|
9
9
|
* @description Algorithm used for signing (ES256 for APNs)
|
|
10
10
|
* @type { string }
|
|
11
11
|
* @memberof Header
|
|
12
|
-
|
|
12
|
+
*/
|
|
13
13
|
alg: string;
|
|
14
14
|
/**
|
|
15
15
|
* @description Key ID from Apple Developer account
|
|
16
16
|
* @type { string }
|
|
17
17
|
* @memberof Header
|
|
18
|
-
|
|
18
|
+
*/
|
|
19
19
|
kid: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function decodeHeader(rawInput: unknown): Header | null {
|
|
23
|
+
if (isJSON(rawInput)) {
|
|
24
|
+
const decodedAlg = decodeString(rawInput['alg']);
|
|
25
|
+
const decodedKid = decodeString(rawInput['kid']);
|
|
26
|
+
|
|
27
|
+
if (decodedAlg === null || decodedKid === null) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
alg: decodedAlg,
|
|
33
|
+
kid: decodedKid,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
20
37
|
}
|
|
21
38
|
|
|
22
39
|
/**
|
|
23
40
|
* @type { Payload }
|
|
24
41
|
* @description JWT payload containing token claims
|
|
25
42
|
*/
|
|
26
|
-
export
|
|
43
|
+
export type Payload = {
|
|
27
44
|
/**
|
|
28
|
-
* @description
|
|
29
|
-
* @type {
|
|
45
|
+
* @description Issuer - your Apple Team ID
|
|
46
|
+
* @type { string }
|
|
30
47
|
* @memberof Payload
|
|
31
|
-
|
|
32
|
-
|
|
48
|
+
*/
|
|
49
|
+
iss: string;
|
|
33
50
|
/**
|
|
34
51
|
* @description Issued at time (Unix timestamp)
|
|
35
52
|
* @type { number }
|
|
36
53
|
* @memberof Payload
|
|
37
|
-
|
|
54
|
+
*/
|
|
38
55
|
iat: number;
|
|
39
56
|
/**
|
|
40
|
-
* @description
|
|
41
|
-
* @type {
|
|
57
|
+
* @description Expiration time (Unix timestamp, optional)
|
|
58
|
+
* @type { number }
|
|
42
59
|
* @memberof Payload
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
60
|
+
*/
|
|
61
|
+
exp: number | null;
|
|
62
|
+
};
|
|
47
63
|
|
|
48
|
-
export function
|
|
64
|
+
export function decodePayload(rawInput: unknown): Payload | null {
|
|
49
65
|
if (isJSON(rawInput)) {
|
|
50
|
-
const
|
|
51
|
-
const
|
|
66
|
+
const decodedIss = decodeString(rawInput['iss']);
|
|
67
|
+
const decodedIat = decodeNumber(rawInput['iat']);
|
|
68
|
+
const decodedExp = decodeNumber(rawInput['exp']);
|
|
52
69
|
|
|
53
|
-
if (
|
|
54
|
-
decodedAlg === null ||
|
|
55
|
-
decodedKid === null
|
|
56
|
-
) {
|
|
70
|
+
if (decodedIss === null || decodedIat === null) {
|
|
57
71
|
return null;
|
|
58
72
|
}
|
|
59
73
|
|
|
60
74
|
return {
|
|
61
|
-
|
|
62
|
-
kid: decodedKid
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function decodePayload(rawInput: unknown): null | Payload {
|
|
69
|
-
if (isJSON(rawInput)) {
|
|
70
|
-
const decodedIss = decodeString(rawInput.iss);
|
|
71
|
-
const decodedIat = decodeNumber(rawInput.iat);
|
|
72
|
-
const decodedExp = decodeNumber(rawInput.exp);
|
|
73
|
-
|
|
74
|
-
if (
|
|
75
|
-
decodedIss === null ||
|
|
76
|
-
decodedIat === null
|
|
77
|
-
) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
exp: decodedExp,
|
|
75
|
+
iss: decodedIss,
|
|
83
76
|
iat: decodedIat,
|
|
84
|
-
|
|
77
|
+
exp: decodedExp,
|
|
85
78
|
};
|
|
86
79
|
}
|
|
87
80
|
return null;
|
|
88
81
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isJSON,
|
|
3
|
+
decodeString,
|
|
4
|
+
_decodeString,
|
|
5
|
+
decodeNumber,
|
|
6
|
+
_decodeNumber,
|
|
7
|
+
decodeArray,
|
|
8
|
+
_decodeArray,
|
|
9
|
+
} from 'type-decoder';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @type { NotificationStatus }
|
|
13
|
+
* @description Delivery status of a notification
|
|
14
|
+
*/
|
|
15
|
+
export type NotificationStatus = 'sent' | 'failed' | 'filtered' | 'skipped';
|
|
16
|
+
|
|
17
|
+
export function decodeNotificationStatus(rawInput: unknown): NotificationStatus | null {
|
|
18
|
+
switch (rawInput) {
|
|
19
|
+
case 'sent':
|
|
20
|
+
case 'failed':
|
|
21
|
+
case 'filtered':
|
|
22
|
+
case 'skipped':
|
|
23
|
+
return rawInput;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function _decodeNotificationStatus(rawInput: unknown): NotificationStatus | undefined {
|
|
29
|
+
switch (rawInput) {
|
|
30
|
+
case 'sent':
|
|
31
|
+
case 'failed':
|
|
32
|
+
case 'filtered':
|
|
33
|
+
case 'skipped':
|
|
34
|
+
return rawInput;
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @type { NotificationSessionStatus }
|
|
41
|
+
* @description Whether a notification session is still active or has completed
|
|
42
|
+
*/
|
|
43
|
+
export type NotificationSessionStatus = 'active' | 'complete';
|
|
44
|
+
|
|
45
|
+
export function decodeNotificationSessionStatus(
|
|
46
|
+
rawInput: unknown
|
|
47
|
+
): NotificationSessionStatus | null {
|
|
48
|
+
switch (rawInput) {
|
|
49
|
+
case 'active':
|
|
50
|
+
case 'complete':
|
|
51
|
+
return rawInput;
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function _decodeNotificationSessionStatus(
|
|
57
|
+
rawInput: unknown
|
|
58
|
+
): NotificationSessionStatus | undefined {
|
|
59
|
+
switch (rawInput) {
|
|
60
|
+
case 'active':
|
|
61
|
+
case 'complete':
|
|
62
|
+
return rawInput;
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @type { PermissionDecision }
|
|
69
|
+
* @description User decision on a permission request
|
|
70
|
+
*/
|
|
71
|
+
export type PermissionDecision = 'allow' | 'deny';
|
|
72
|
+
|
|
73
|
+
export function decodePermissionDecision(rawInput: unknown): PermissionDecision | null {
|
|
74
|
+
switch (rawInput) {
|
|
75
|
+
case 'allow':
|
|
76
|
+
case 'deny':
|
|
77
|
+
return rawInput;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function _decodePermissionDecision(rawInput: unknown): PermissionDecision | undefined {
|
|
83
|
+
switch (rawInput) {
|
|
84
|
+
case 'allow':
|
|
85
|
+
case 'deny':
|
|
86
|
+
return rawInput;
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @type { NotificationRecord }
|
|
93
|
+
* @description A single notification entry stored in the in-memory history
|
|
94
|
+
*/
|
|
95
|
+
export type NotificationRecord = {
|
|
96
|
+
/**
|
|
97
|
+
* @description Unique notification identifier
|
|
98
|
+
* @type { string }
|
|
99
|
+
* @memberof NotificationRecord
|
|
100
|
+
*/
|
|
101
|
+
id: string;
|
|
102
|
+
/**
|
|
103
|
+
* @description Notification title
|
|
104
|
+
* @type { string }
|
|
105
|
+
* @memberof NotificationRecord
|
|
106
|
+
*/
|
|
107
|
+
title: string;
|
|
108
|
+
/**
|
|
109
|
+
* @description Notification body text
|
|
110
|
+
* @type { string }
|
|
111
|
+
* @memberof NotificationRecord
|
|
112
|
+
*/
|
|
113
|
+
message: string;
|
|
114
|
+
/**
|
|
115
|
+
* @description Delivery status of the notification
|
|
116
|
+
* @type { NotificationStatus }
|
|
117
|
+
* @memberof NotificationRecord
|
|
118
|
+
*/
|
|
119
|
+
status: NotificationStatus;
|
|
120
|
+
/**
|
|
121
|
+
* @description ISO 8601 timestamp when the notification was created
|
|
122
|
+
* @type { string }
|
|
123
|
+
* @memberof NotificationRecord
|
|
124
|
+
*/
|
|
125
|
+
timestamp: string;
|
|
126
|
+
/**
|
|
127
|
+
* @description Notification category (e.g. debug, feature, testing)
|
|
128
|
+
* @type { string }
|
|
129
|
+
* @memberof NotificationRecord
|
|
130
|
+
*/
|
|
131
|
+
category: string | null;
|
|
132
|
+
/**
|
|
133
|
+
* @description Project name the notification relates to
|
|
134
|
+
* @type { string }
|
|
135
|
+
* @memberof NotificationRecord
|
|
136
|
+
*/
|
|
137
|
+
project: string | null;
|
|
138
|
+
/**
|
|
139
|
+
* @description Source that triggered the notification (e.g. hook name)
|
|
140
|
+
* @type { string }
|
|
141
|
+
* @memberof NotificationRecord
|
|
142
|
+
*/
|
|
143
|
+
source: string | null;
|
|
144
|
+
/**
|
|
145
|
+
* @description Tool name that triggered the notification
|
|
146
|
+
* @type { string }
|
|
147
|
+
* @memberof NotificationRecord
|
|
148
|
+
*/
|
|
149
|
+
tool: string | null;
|
|
150
|
+
/**
|
|
151
|
+
* @description Error message if the notification failed to send
|
|
152
|
+
* @type { string }
|
|
153
|
+
* @memberof NotificationRecord
|
|
154
|
+
*/
|
|
155
|
+
error: string | null;
|
|
156
|
+
/**
|
|
157
|
+
* @description Additional metadata attached to the notification
|
|
158
|
+
* @type { NotificationRecordData }
|
|
159
|
+
* @memberof NotificationRecord
|
|
160
|
+
*/
|
|
161
|
+
data: NotificationRecordData | null;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
export function decodeNotificationRecord(rawInput: unknown): NotificationRecord | null {
|
|
165
|
+
if (isJSON(rawInput)) {
|
|
166
|
+
const decodedId = decodeString(rawInput['id']);
|
|
167
|
+
const decodedTitle = decodeString(rawInput['title']);
|
|
168
|
+
const decodedMessage = decodeString(rawInput['message']);
|
|
169
|
+
const decodedStatus = decodeNotificationStatus(rawInput['status']);
|
|
170
|
+
const decodedTimestamp = decodeString(rawInput['timestamp']);
|
|
171
|
+
const decodedCategory = decodeString(rawInput['category']);
|
|
172
|
+
const decodedProject = decodeString(rawInput['project']);
|
|
173
|
+
const decodedSource = decodeString(rawInput['source']);
|
|
174
|
+
const decodedTool = decodeString(rawInput['tool']);
|
|
175
|
+
const decodedError = decodeString(rawInput['error']);
|
|
176
|
+
const decodedData = decodeNotificationRecordData(rawInput['data']);
|
|
177
|
+
|
|
178
|
+
if (
|
|
179
|
+
decodedId === null ||
|
|
180
|
+
decodedTitle === null ||
|
|
181
|
+
decodedMessage === null ||
|
|
182
|
+
decodedStatus === null ||
|
|
183
|
+
decodedTimestamp === null
|
|
184
|
+
) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
id: decodedId,
|
|
190
|
+
title: decodedTitle,
|
|
191
|
+
message: decodedMessage,
|
|
192
|
+
status: decodedStatus,
|
|
193
|
+
timestamp: decodedTimestamp,
|
|
194
|
+
category: decodedCategory,
|
|
195
|
+
project: decodedProject,
|
|
196
|
+
source: decodedSource,
|
|
197
|
+
tool: decodedTool,
|
|
198
|
+
error: decodedError,
|
|
199
|
+
data: decodedData,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @type { NotificationRecordData }
|
|
207
|
+
* @description Additional metadata attached to the notification
|
|
208
|
+
*/
|
|
209
|
+
export type NotificationRecordData = Record<string, unknown>;
|
|
210
|
+
|
|
211
|
+
export function decodeNotificationRecordData(rawInput: unknown): NotificationRecordData | null {
|
|
212
|
+
if (isJSON(rawInput)) {
|
|
213
|
+
return {
|
|
214
|
+
...rawInput,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @type { NotificationSession }
|
|
222
|
+
* @description A grouped session of notification events, derived from notification history with 30-minute gap detection
|
|
223
|
+
*/
|
|
224
|
+
export type NotificationSession = {
|
|
225
|
+
/**
|
|
226
|
+
* @description Session identifier (e.g. "session-1")
|
|
227
|
+
* @type { string }
|
|
228
|
+
* @memberof NotificationSession
|
|
229
|
+
*/
|
|
230
|
+
id: string;
|
|
231
|
+
/**
|
|
232
|
+
* @description Project name associated with this session
|
|
233
|
+
* @type { string }
|
|
234
|
+
* @memberof NotificationSession
|
|
235
|
+
*/
|
|
236
|
+
project: string;
|
|
237
|
+
/**
|
|
238
|
+
* @description Runtime that produced the events (e.g. "claude-code", "opencode")
|
|
239
|
+
* @type { string }
|
|
240
|
+
* @memberof NotificationSession
|
|
241
|
+
*/
|
|
242
|
+
runtime: string;
|
|
243
|
+
/**
|
|
244
|
+
* @description ISO 8601 timestamp of the first event in the session
|
|
245
|
+
* @type { string }
|
|
246
|
+
* @memberof NotificationSession
|
|
247
|
+
*/
|
|
248
|
+
startTime: string;
|
|
249
|
+
/**
|
|
250
|
+
* @description ISO 8601 timestamp of the last event in the session
|
|
251
|
+
* @type { string }
|
|
252
|
+
* @memberof NotificationSession
|
|
253
|
+
*/
|
|
254
|
+
endTime: string;
|
|
255
|
+
/**
|
|
256
|
+
* @description Session duration in seconds
|
|
257
|
+
* @type { number }
|
|
258
|
+
* @memberof NotificationSession
|
|
259
|
+
*/
|
|
260
|
+
duration: number;
|
|
261
|
+
/**
|
|
262
|
+
* @description Total number of notification events in this session
|
|
263
|
+
* @type { number }
|
|
264
|
+
* @memberof NotificationSession
|
|
265
|
+
*/
|
|
266
|
+
eventCount: number;
|
|
267
|
+
/**
|
|
268
|
+
* @description All notification records in this session, sorted chronologically
|
|
269
|
+
* @type { NotificationRecord[] }
|
|
270
|
+
* @memberof NotificationSession
|
|
271
|
+
*/
|
|
272
|
+
events: NotificationRecord[];
|
|
273
|
+
/**
|
|
274
|
+
* @description Distinct tool names used during this session
|
|
275
|
+
* @type { string[] }
|
|
276
|
+
* @memberof NotificationSession
|
|
277
|
+
*/
|
|
278
|
+
toolsUsed: string[];
|
|
279
|
+
/**
|
|
280
|
+
* @description Distinct file paths modified during this session
|
|
281
|
+
* @type { string[] }
|
|
282
|
+
* @memberof NotificationSession
|
|
283
|
+
*/
|
|
284
|
+
filesModified: string[];
|
|
285
|
+
/**
|
|
286
|
+
* @description Whether the session is still active or has completed
|
|
287
|
+
* @type { NotificationSessionStatus }
|
|
288
|
+
* @memberof NotificationSession
|
|
289
|
+
*/
|
|
290
|
+
status: NotificationSessionStatus;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export function decodeNotificationSession(rawInput: unknown): NotificationSession | null {
|
|
294
|
+
if (isJSON(rawInput)) {
|
|
295
|
+
const decodedId = decodeString(rawInput['id']);
|
|
296
|
+
const decodedProject = decodeString(rawInput['project']);
|
|
297
|
+
const decodedRuntime = decodeString(rawInput['runtime']);
|
|
298
|
+
const decodedStartTime = decodeString(rawInput['startTime']);
|
|
299
|
+
const decodedEndTime = decodeString(rawInput['endTime']);
|
|
300
|
+
const decodedDuration = decodeNumber(rawInput['duration']);
|
|
301
|
+
const decodedEventCount = decodeNumber(rawInput['eventCount']);
|
|
302
|
+
const decodedEvents = decodeArray(rawInput['events'], decodeNotificationRecord);
|
|
303
|
+
const decodedToolsUsed = decodeArray(rawInput['toolsUsed'], decodeString);
|
|
304
|
+
const decodedFilesModified = decodeArray(rawInput['filesModified'], decodeString);
|
|
305
|
+
const decodedStatus = decodeNotificationSessionStatus(rawInput['status']);
|
|
306
|
+
|
|
307
|
+
if (
|
|
308
|
+
decodedId === null ||
|
|
309
|
+
decodedProject === null ||
|
|
310
|
+
decodedRuntime === null ||
|
|
311
|
+
decodedStartTime === null ||
|
|
312
|
+
decodedEndTime === null ||
|
|
313
|
+
decodedDuration === null ||
|
|
314
|
+
decodedEventCount === null ||
|
|
315
|
+
decodedEvents === null ||
|
|
316
|
+
decodedToolsUsed === null ||
|
|
317
|
+
decodedFilesModified === null ||
|
|
318
|
+
decodedStatus === null
|
|
319
|
+
) {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return {
|
|
324
|
+
id: decodedId,
|
|
325
|
+
project: decodedProject,
|
|
326
|
+
runtime: decodedRuntime,
|
|
327
|
+
startTime: decodedStartTime,
|
|
328
|
+
endTime: decodedEndTime,
|
|
329
|
+
duration: decodedDuration,
|
|
330
|
+
eventCount: decodedEventCount,
|
|
331
|
+
events: decodedEvents,
|
|
332
|
+
toolsUsed: decodedToolsUsed,
|
|
333
|
+
filesModified: decodedFilesModified,
|
|
334
|
+
status: decodedStatus,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* @type { PendingRequest }
|
|
342
|
+
* @description An in-memory pending permission request awaiting user decision via iOS notification
|
|
343
|
+
*/
|
|
344
|
+
export type PendingRequest = {
|
|
345
|
+
/**
|
|
346
|
+
* @description AI session that triggered the permission request
|
|
347
|
+
* @type { string }
|
|
348
|
+
* @memberof PendingRequest
|
|
349
|
+
*/
|
|
350
|
+
sessionId: string;
|
|
351
|
+
/**
|
|
352
|
+
* @description Tool requesting permission (e.g. "Bash", "Edit")
|
|
353
|
+
* @type { string }
|
|
354
|
+
* @memberof PendingRequest
|
|
355
|
+
*/
|
|
356
|
+
toolName: string;
|
|
357
|
+
/**
|
|
358
|
+
* @description Tool input parameters that require approval
|
|
359
|
+
* @type { PendingRequestToolInput }
|
|
360
|
+
* @memberof PendingRequest
|
|
361
|
+
*/
|
|
362
|
+
toolInput: PendingRequestToolInput;
|
|
363
|
+
/**
|
|
364
|
+
* @description Unix timestamp (ms) when the request was created
|
|
365
|
+
* @type { number }
|
|
366
|
+
* @memberof PendingRequest
|
|
367
|
+
*/
|
|
368
|
+
createdAt: number;
|
|
369
|
+
/**
|
|
370
|
+
* @description Unix timestamp (ms) when the user responded, or null if still pending
|
|
371
|
+
* @type { number }
|
|
372
|
+
* @memberof PendingRequest
|
|
373
|
+
*/
|
|
374
|
+
decidedAt: number | null;
|
|
375
|
+
/**
|
|
376
|
+
* @description User's decision (allow/deny), or null if still pending
|
|
377
|
+
* @type { PermissionDecision }
|
|
378
|
+
* @memberof PendingRequest
|
|
379
|
+
*/
|
|
380
|
+
decision: PermissionDecision | null;
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
export function decodePendingRequest(rawInput: unknown): PendingRequest | null {
|
|
384
|
+
if (isJSON(rawInput)) {
|
|
385
|
+
const decodedSessionId = decodeString(rawInput['sessionId']);
|
|
386
|
+
const decodedToolName = decodeString(rawInput['toolName']);
|
|
387
|
+
const decodedToolInput = decodePendingRequestToolInput(rawInput['toolInput']);
|
|
388
|
+
const decodedCreatedAt = decodeNumber(rawInput['createdAt']);
|
|
389
|
+
const decodedDecidedAt = decodeNumber(rawInput['decidedAt']);
|
|
390
|
+
const decodedDecision = decodePermissionDecision(rawInput['decision']);
|
|
391
|
+
|
|
392
|
+
if (
|
|
393
|
+
decodedSessionId === null ||
|
|
394
|
+
decodedToolName === null ||
|
|
395
|
+
decodedToolInput === null ||
|
|
396
|
+
decodedCreatedAt === null
|
|
397
|
+
) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return {
|
|
402
|
+
sessionId: decodedSessionId,
|
|
403
|
+
toolName: decodedToolName,
|
|
404
|
+
toolInput: decodedToolInput,
|
|
405
|
+
createdAt: decodedCreatedAt,
|
|
406
|
+
decidedAt: decodedDecidedAt,
|
|
407
|
+
decision: decodedDecision,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* @type { PendingRequestToolInput }
|
|
415
|
+
* @description Tool input parameters that require approval
|
|
416
|
+
*/
|
|
417
|
+
export type PendingRequestToolInput = Record<string, unknown>;
|
|
418
|
+
|
|
419
|
+
export function decodePendingRequestToolInput(rawInput: unknown): PendingRequestToolInput | null {
|
|
420
|
+
if (isJSON(rawInput)) {
|
|
421
|
+
return {
|
|
422
|
+
...rawInput,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
return null;
|
|
426
|
+
}
|