@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.
Files changed (327) hide show
  1. package/.claude/hooks/notifier.cjs +1431 -0
  2. package/.claude/settings.json +162 -0
  3. package/README.md +515 -0
  4. package/bin/shooter.cjs +141 -0
  5. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css +1 -0
  6. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.br +0 -0
  7. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css +1 -0
  9. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.br +1 -0
  10. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/3.C0uFg0IS.css +1 -0
  12. package/build/client/_app/immutable/assets/3.C0uFg0IS.css.br +0 -0
  13. package/build/client/_app/immutable/assets/3.C0uFg0IS.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css +1 -0
  15. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.br +0 -0
  16. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.gz +0 -0
  17. package/build/client/_app/immutable/assets/5.DRjApZQW.css +1 -0
  18. package/build/client/_app/immutable/assets/5.DRjApZQW.css.br +0 -0
  19. package/build/client/_app/immutable/assets/5.DRjApZQW.css.gz +0 -0
  20. package/build/client/_app/immutable/assets/6.AraZrY8I.css +1 -0
  21. package/build/client/_app/immutable/assets/6.AraZrY8I.css.br +0 -0
  22. package/build/client/_app/immutable/assets/6.AraZrY8I.css.gz +0 -0
  23. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css +1 -0
  24. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.br +0 -0
  25. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.gz +0 -0
  26. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css +1 -0
  27. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.br +0 -0
  28. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.gz +0 -0
  29. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css +1 -0
  30. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.br +0 -0
  31. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.gz +0 -0
  32. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css +1 -0
  33. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.br +0 -0
  34. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.gz +0 -0
  35. package/build/client/_app/immutable/chunks/BNJphC1q.js +56 -0
  36. package/build/client/_app/immutable/chunks/BNJphC1q.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/BNJphC1q.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/BTGVxaYV.js +9 -0
  39. package/build/client/_app/immutable/chunks/BTGVxaYV.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/BTGVxaYV.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/BlxrFPDK.js +1 -0
  42. package/build/client/_app/immutable/chunks/BlxrFPDK.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/BlxrFPDK.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/Bvk7mfPM.js +1 -0
  45. package/build/client/_app/immutable/chunks/Bvk7mfPM.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/Bvk7mfPM.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/CAokzuPQ.js +1 -0
  48. package/build/client/_app/immutable/chunks/CAokzuPQ.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/CAokzuPQ.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/CGLrx-H5.js +1 -0
  51. package/build/client/_app/immutable/chunks/CGLrx-H5.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/CGLrx-H5.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/CgCpWzEA.js +1 -0
  54. package/build/client/_app/immutable/chunks/CgCpWzEA.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/CgCpWzEA.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/Cjwk_cGO.js +6 -0
  57. package/build/client/_app/immutable/chunks/Cjwk_cGO.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/Cjwk_cGO.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/CtQ8EED1.js +11 -0
  60. package/build/client/_app/immutable/chunks/CtQ8EED1.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/CtQ8EED1.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/DERQCisl.js +1 -0
  63. package/build/client/_app/immutable/chunks/DERQCisl.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/DERQCisl.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/DKrg8TQs.js +1 -0
  66. package/build/client/_app/immutable/chunks/DKrg8TQs.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/DKrg8TQs.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/DLu6yJIZ.js +1 -0
  69. package/build/client/_app/immutable/chunks/DLu6yJIZ.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/DLu6yJIZ.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/Dkkpz_4D.js +126 -0
  72. package/build/client/_app/immutable/chunks/Dkkpz_4D.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/Dkkpz_4D.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/DoczjQhA.js +1 -0
  75. package/build/client/_app/immutable/chunks/DoczjQhA.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/DoczjQhA.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  78. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/RpcNruLP.js +2 -0
  81. package/build/client/_app/immutable/chunks/RpcNruLP.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/RpcNruLP.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/a-St0Zwo.js +1 -0
  84. package/build/client/_app/immutable/chunks/a-St0Zwo.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/a-St0Zwo.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/bo70OQUZ.js +1 -0
  87. package/build/client/_app/immutable/chunks/bo70OQUZ.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/bo70OQUZ.js.gz +0 -0
  89. package/build/client/_app/immutable/entry/app.QvGgdvTI.js +2 -0
  90. package/build/client/_app/immutable/entry/app.QvGgdvTI.js.br +0 -0
  91. package/build/client/_app/immutable/entry/app.QvGgdvTI.js.gz +0 -0
  92. package/build/client/_app/immutable/entry/start.BntDNRMC.js +1 -0
  93. package/build/client/_app/immutable/entry/start.BntDNRMC.js.br +0 -0
  94. package/build/client/_app/immutable/entry/start.BntDNRMC.js.gz +0 -0
  95. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js +1 -0
  96. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.br +0 -0
  97. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js +1 -0
  99. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.br +0 -0
  100. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js +1 -0
  102. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js +3 -0
  105. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.gz +0 -0
  107. package/build/client/_app/immutable/nodes/4.D-cIe70D.js +1 -0
  108. package/build/client/_app/immutable/nodes/4.D-cIe70D.js.br +0 -0
  109. package/build/client/_app/immutable/nodes/4.D-cIe70D.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js +1 -0
  111. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/6.BB7QE48r.js +2 -0
  114. package/build/client/_app/immutable/nodes/6.BB7QE48r.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/6.BB7QE48r.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js +2 -0
  117. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.gz +0 -0
  119. package/build/client/_app/version.json +1 -0
  120. package/build/client/_app/version.json.br +0 -0
  121. package/build/client/_app/version.json.gz +0 -0
  122. package/build/client/app-icon.png +0 -0
  123. package/build/client/apple-touch-icon.png +0 -0
  124. package/build/client/favicon.png +0 -0
  125. package/build/client/favicon.svg +10 -0
  126. package/build/client/favicon.svg.br +0 -0
  127. package/build/client/favicon.svg.gz +0 -0
  128. package/build/client/manifest.webmanifest +1 -0
  129. package/build/client/pwa-192x192.png +0 -0
  130. package/build/client/pwa-512x512.png +0 -0
  131. package/build/client/registerSW.js +1 -0
  132. package/build/client/registerSW.js.br +0 -0
  133. package/build/client/registerSW.js.gz +0 -0
  134. package/build/client/sw.js +222 -0
  135. package/build/client/sw.js.br +0 -0
  136. package/build/client/sw.js.gz +0 -0
  137. package/build/client/workbox-5119daf5.js +3395 -0
  138. package/build/client/workbox-5119daf5.js.br +0 -0
  139. package/build/client/workbox-5119daf5.js.gz +0 -0
  140. package/build/env.js +94 -0
  141. package/build/handler.js +1494 -0
  142. package/build/index.js +345 -0
  143. package/build/pty-holder.cjs +510 -0
  144. package/build/server/chunks/0-q2IUp76Y.js +9 -0
  145. package/build/server/chunks/0-q2IUp76Y.js.map +1 -0
  146. package/build/server/chunks/1-CU50G5wZ.js +9 -0
  147. package/build/server/chunks/1-CU50G5wZ.js.map +1 -0
  148. package/build/server/chunks/2-D01t9s8T.js +9 -0
  149. package/build/server/chunks/2-D01t9s8T.js.map +1 -0
  150. package/build/server/chunks/3-5PUQ04wC.js +9 -0
  151. package/build/server/chunks/3-5PUQ04wC.js.map +1 -0
  152. package/build/server/chunks/4-e7gywnSG.js +9 -0
  153. package/build/server/chunks/4-e7gywnSG.js.map +1 -0
  154. package/build/server/chunks/5-CA1SA6KZ.js +9 -0
  155. package/build/server/chunks/5-CA1SA6KZ.js.map +1 -0
  156. package/build/server/chunks/6-71H221sV.js +9 -0
  157. package/build/server/chunks/6-71H221sV.js.map +1 -0
  158. package/build/server/chunks/7-Bo-vmdyz.js +9 -0
  159. package/build/server/chunks/7-Bo-vmdyz.js.map +1 -0
  160. package/build/server/chunks/_layout.svelte-SFHOxs74.js +132 -0
  161. package/build/server/chunks/_layout.svelte-SFHOxs74.js.map +1 -0
  162. package/build/server/chunks/_page.svelte-B4w-2wD-.js +120 -0
  163. package/build/server/chunks/_page.svelte-B4w-2wD-.js.map +1 -0
  164. package/build/server/chunks/_page.svelte-B_qAXjkh.js +213 -0
  165. package/build/server/chunks/_page.svelte-B_qAXjkh.js.map +1 -0
  166. package/build/server/chunks/_page.svelte-CsF1_TRG.js +50 -0
  167. package/build/server/chunks/_page.svelte-CsF1_TRG.js.map +1 -0
  168. package/build/server/chunks/_page.svelte-DJC6U-P0.js +68 -0
  169. package/build/server/chunks/_page.svelte-DJC6U-P0.js.map +1 -0
  170. package/build/server/chunks/_page.svelte-DQ6HBtsz.js +407 -0
  171. package/build/server/chunks/_page.svelte-DQ6HBtsz.js.map +1 -0
  172. package/build/server/chunks/_page.svelte-LbhhjP21.js +148 -0
  173. package/build/server/chunks/_page.svelte-LbhhjP21.js.map +1 -0
  174. package/build/server/chunks/_server.ts-BL2FGb5Z.js +387 -0
  175. package/build/server/chunks/_server.ts-BL2FGb5Z.js.map +1 -0
  176. package/build/server/chunks/_server.ts-BgdjBZco.js +47 -0
  177. package/build/server/chunks/_server.ts-BgdjBZco.js.map +1 -0
  178. package/build/server/chunks/_server.ts-BihKSdj_.js +59 -0
  179. package/build/server/chunks/_server.ts-BihKSdj_.js.map +1 -0
  180. package/build/server/chunks/_server.ts-BjOJsoy4.js +63 -0
  181. package/build/server/chunks/_server.ts-BjOJsoy4.js.map +1 -0
  182. package/build/server/chunks/_server.ts-C29xzfaw.js +77 -0
  183. package/build/server/chunks/_server.ts-C29xzfaw.js.map +1 -0
  184. package/build/server/chunks/_server.ts-CPa6DgIt.js +71 -0
  185. package/build/server/chunks/_server.ts-CPa6DgIt.js.map +1 -0
  186. package/build/server/chunks/_server.ts-CbDRDIoP.js +36 -0
  187. package/build/server/chunks/_server.ts-CbDRDIoP.js.map +1 -0
  188. package/build/server/chunks/_server.ts-Cl1OEWL4.js +54 -0
  189. package/build/server/chunks/_server.ts-Cl1OEWL4.js.map +1 -0
  190. package/build/server/chunks/_server.ts-ColfDHW8.js +60 -0
  191. package/build/server/chunks/_server.ts-ColfDHW8.js.map +1 -0
  192. package/build/server/chunks/_server.ts-Cv_OrRuL.js +494 -0
  193. package/build/server/chunks/_server.ts-Cv_OrRuL.js.map +1 -0
  194. package/build/server/chunks/_server.ts-D4MNi4cD.js +25 -0
  195. package/build/server/chunks/_server.ts-D4MNi4cD.js.map +1 -0
  196. package/build/server/chunks/_server.ts-DRVbgm6k.js +125 -0
  197. package/build/server/chunks/_server.ts-DRVbgm6k.js.map +1 -0
  198. package/build/server/chunks/_server.ts-DfajWaqh.js +39 -0
  199. package/build/server/chunks/_server.ts-DfajWaqh.js.map +1 -0
  200. package/build/server/chunks/_server.ts-y9-WYDMa.js +35 -0
  201. package/build/server/chunks/_server.ts-y9-WYDMa.js.map +1 -0
  202. package/build/server/chunks/auth-CEgFis71.js +32 -0
  203. package/build/server/chunks/auth-CEgFis71.js.map +1 -0
  204. package/build/server/chunks/client-CxCatAKr.js +255 -0
  205. package/build/server/chunks/client-CxCatAKr.js.map +1 -0
  206. package/build/server/chunks/error.svelte-BqdwMWdK.js +26 -0
  207. package/build/server/chunks/error.svelte-BqdwMWdK.js.map +1 -0
  208. package/build/server/chunks/exports-CJ0Q5XmL.js +4081 -0
  209. package/build/server/chunks/exports-CJ0Q5XmL.js.map +1 -0
  210. package/build/server/chunks/index2-DAxIoAO-.js +36 -0
  211. package/build/server/chunks/index2-DAxIoAO-.js.map +1 -0
  212. package/build/server/chunks/jsonl-parser-dmZU_Hyu.js +137 -0
  213. package/build/server/chunks/jsonl-parser-dmZU_Hyu.js.map +1 -0
  214. package/build/server/chunks/library-apns-BHxLmuIx.js +104 -0
  215. package/build/server/chunks/library-apns-BHxLmuIx.js.map +1 -0
  216. package/build/server/chunks/markdown-Bxrl3cCF.js +1241 -0
  217. package/build/server/chunks/markdown-Bxrl3cCF.js.map +1 -0
  218. package/build/server/chunks/pending-requests-D8UiTw7L.js +44 -0
  219. package/build/server/chunks/pending-requests-D8UiTw7L.js.map +1 -0
  220. package/build/server/chunks/pty-manager-C0FhBiVq.js +1697 -0
  221. package/build/server/chunks/pty-manager-C0FhBiVq.js.map +1 -0
  222. package/build/server/chunks/shared-server-BDY8jh20.js +200 -0
  223. package/build/server/chunks/shared-server-BDY8jh20.js.map +1 -0
  224. package/build/server/chunks/stores-D0HorpgL.js +36 -0
  225. package/build/server/chunks/stores-D0HorpgL.js.map +1 -0
  226. package/build/server/index.js +6466 -0
  227. package/build/server/index.js.map +1 -0
  228. package/build/server/manifest.js +184 -0
  229. package/build/server/manifest.js.map +1 -0
  230. package/build/shims.js +32 -0
  231. package/package.json +94 -0
  232. package/scripts/clipboard-shims/wl-paste +48 -0
  233. package/scripts/clipboard-shims/xclip +31 -0
  234. package/scripts/install.sh +477 -0
  235. package/scripts/setup-node-pty.sh +63 -0
  236. package/scripts/setup.cjs +571 -0
  237. package/scripts/test-runner.ts +243 -0
  238. package/scripts/vercel-env-commands.sh +60 -0
  239. package/server.ts +139 -0
  240. package/src/app.css +1835 -0
  241. package/src/app.d.ts +31 -0
  242. package/src/app.html +24 -0
  243. package/src/generated/types/APN.ts +305 -0
  244. package/src/generated/types/CLI.ts +52 -0
  245. package/src/generated/types/JWT.ts +92 -0
  246. package/src/generated/types/Terminal.ts +2736 -0
  247. package/src/generated/types/index.ts +6 -0
  248. package/src/lib/assets/icons/alert-triangle.svg +5 -0
  249. package/src/lib/assets/icons/bell.svg +4 -0
  250. package/src/lib/assets/icons/check-circle.svg +4 -0
  251. package/src/lib/assets/icons/file.svg +4 -0
  252. package/src/lib/assets/icons/folder.svg +3 -0
  253. package/src/lib/assets/icons/play.svg +3 -0
  254. package/src/lib/assets/icons/refresh.svg +4 -0
  255. package/src/lib/assets/icons/settings.svg +4 -0
  256. package/src/lib/assets/icons/terminal.svg +1 -0
  257. package/src/lib/assets/icons/tool.svg +3 -0
  258. package/src/lib/assets/icons/x-circle.svg +5 -0
  259. package/src/lib/modules/client/common/Card.svelte +26 -0
  260. package/src/lib/modules/client/common/EmptyState.svelte +36 -0
  261. package/src/lib/modules/client/common/Icon.svelte +61 -0
  262. package/src/lib/modules/client/common/StatusBadge.svelte +38 -0
  263. package/src/lib/modules/client/common/cache.ts +31 -0
  264. package/src/lib/modules/client/common/config-guard.ts +18 -0
  265. package/src/lib/modules/client/common/index.ts +12 -0
  266. package/src/lib/modules/client/common/markdown.ts +23 -0
  267. package/src/lib/modules/client/common/native-bridge.ts +50 -0
  268. package/src/lib/modules/client/common/time.ts +22 -0
  269. package/src/lib/modules/client/common/tool-title.ts +28 -0
  270. package/src/lib/modules/client/terminal/ChatView.svelte +400 -0
  271. package/src/lib/modules/client/terminal/CommandPalette.svelte +60 -0
  272. package/src/lib/modules/client/terminal/ConnectionStatus.svelte +99 -0
  273. package/src/lib/modules/client/terminal/LaunchSheet.svelte +294 -0
  274. package/src/lib/modules/client/terminal/QuickKeys.svelte +71 -0
  275. package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +79 -0
  276. package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +70 -0
  277. package/src/lib/modules/client/terminal/xterm-wrapper.ts +243 -0
  278. package/src/lib/modules/server/apn/library-apns.ts +137 -0
  279. package/src/lib/modules/server/apn/notification-history.ts +35 -0
  280. package/src/lib/modules/server/apn/notification-sessions.ts +117 -0
  281. package/src/lib/modules/server/apn/pending-requests.ts +65 -0
  282. package/src/lib/modules/server/apn/types.ts +51 -0
  283. package/src/lib/modules/server/auth.ts +34 -0
  284. package/src/lib/modules/server/cli/index.ts +79 -0
  285. package/src/lib/modules/server/cli/runner.ts +162 -0
  286. package/src/lib/modules/server/fcm/fcm-service.ts +72 -0
  287. package/src/lib/modules/server/sessions/jsonl-parser.ts +197 -0
  288. package/src/lib/modules/server/sessions/jsonl-reader.ts +301 -0
  289. package/src/lib/modules/server/sessions/opencode-reader.ts +264 -0
  290. package/src/lib/modules/server/sessions/types.ts +53 -0
  291. package/src/lib/modules/server/terminal/holder-client.ts +273 -0
  292. package/src/lib/modules/server/terminal/opencode-watcher.ts +661 -0
  293. package/src/lib/modules/server/terminal/pty-holder.cjs +510 -0
  294. package/src/lib/modules/server/terminal/pty-manager.ts +1012 -0
  295. package/src/lib/modules/server/terminal/session-watcher.ts +320 -0
  296. package/src/lib/modules/server/terminal/terminal-store.ts +198 -0
  297. package/src/lib/modules/server/ws/events-handler.ts +73 -0
  298. package/src/lib/modules/server/ws/keepalive.ts +108 -0
  299. package/src/lib/modules/server/ws/server.ts +93 -0
  300. package/src/lib/modules/server/ws/session-handler.ts +462 -0
  301. package/src/lib/modules/server/ws/terminal-handler.ts +197 -0
  302. package/src/lib/modules/server/ws/ticket-store.ts +58 -0
  303. package/src/lib/theme.css +529 -0
  304. package/src/lib/types/config.ts +6 -0
  305. package/src/routes/+layout.svelte +218 -0
  306. package/src/routes/+page.svelte +261 -0
  307. package/src/routes/api/debug/+server.ts +33 -0
  308. package/src/routes/api/device-token/+server.ts +85 -0
  309. package/src/routes/api/health/+server.ts +100 -0
  310. package/src/routes/api/notify/+server.ts +418 -0
  311. package/src/routes/api/qr-config/+server.ts +45 -0
  312. package/src/routes/api/response/+server.ts +73 -0
  313. package/src/routes/api/sessions/+server.ts +120 -0
  314. package/src/routes/api/terminals/+server.ts +141 -0
  315. package/src/routes/api/terminals/[id]/+server.ts +75 -0
  316. package/src/routes/api/terminals/[id]/paste-image/+server.ts +61 -0
  317. package/src/routes/api/terminals/[id]/resize/+server.ts +60 -0
  318. package/src/routes/api/webhook/+server.ts +42 -0
  319. package/src/routes/api/ws-status/+server.ts +23 -0
  320. package/src/routes/api/ws-ticket/+server.ts +86 -0
  321. package/src/routes/config/+page.svelte +600 -0
  322. package/src/routes/project/+page.svelte +274 -0
  323. package/src/routes/session/[id]/+page.svelte +434 -0
  324. package/src/routes/terminals/+page.svelte +618 -0
  325. package/src/routes/terminals/[id]/+page.svelte +968 -0
  326. package/svelte.config.js +18 -0
  327. 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;;;;"}