@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,477 @@
1
+ #!/bin/sh
2
+ # ──────────────────────────────────────────────────────────────────────
3
+ # Shooter — One-line installer
4
+ #
5
+ # curl -fsSL https://raw.githubusercontent.com/juspay/shooter/release/scripts/install.sh | sh
6
+ #
7
+ # POSIX sh compatible. Tested on macOS and Linux.
8
+ # ──────────────────────────────────────────────────────────────────────
9
+
10
+ set -e
11
+
12
+ # ── Globals ───────────────────────────────────────────────────────────
13
+
14
+ SHOOTER_DIR="$HOME/.shooter"
15
+ REPO_URL="https://github.com/juspay/shooter.git"
16
+ REPO_BRANCH="release"
17
+ REQUIRED_NODE_MAJOR=20
18
+ DEFAULT_PORT=3000
19
+
20
+ # ── Color helpers (degrade gracefully if tput is unavailable) ─────────
21
+
22
+ setup_colors() {
23
+ if [ -t 1 ] && command -v tput >/dev/null 2>&1 && tput colors >/dev/null 2>&1; then
24
+ BOLD="$(tput bold)"
25
+ DIM="$(tput dim)"
26
+ RED="$(tput setaf 1)"
27
+ GREEN="$(tput setaf 2)"
28
+ YELLOW="$(tput setaf 3)"
29
+ BLUE="$(tput setaf 4)"
30
+ CYAN="$(tput setaf 6)"
31
+ RESET="$(tput sgr0)"
32
+ else
33
+ BOLD="" DIM="" RED="" GREEN="" YELLOW="" BLUE="" CYAN="" RESET=""
34
+ fi
35
+ }
36
+
37
+ # ── Output helpers ────────────────────────────────────────────────────
38
+
39
+ info() { printf '%s[*]%s %s\n' "$CYAN" "$RESET" "$1"; }
40
+ success() { printf '%s[+]%s %s\n' "$GREEN" "$RESET" "$1"; }
41
+ warn() { printf '%s[!]%s %s\n' "$YELLOW" "$RESET" "$1"; }
42
+ error() { printf '%s[-]%s %s\n' "$RED" "$RESET" "$1"; }
43
+ step() { printf '\n%s==>%s %s%s%s\n' "$BLUE" "$RESET" "$BOLD" "$1" "$RESET"; }
44
+
45
+ # ── Cleanup trap ──────────────────────────────────────────────────────
46
+
47
+ CLEANUP_CLONED=0
48
+
49
+ cleanup() {
50
+ exit_code=$?
51
+ if [ "$CLEANUP_CLONED" -eq 1 ] && [ -d "$SHOOTER_DIR" ]; then
52
+ warn "Installation did not complete. Removing $SHOOTER_DIR ..."
53
+ rm -rf "$SHOOTER_DIR"
54
+ fi
55
+ if [ "$exit_code" -ne 0 ]; then
56
+ error "Installation failed. Please check the errors above and try again."
57
+ fi
58
+ exit "$exit_code"
59
+ }
60
+
61
+ trap cleanup EXIT INT TERM
62
+
63
+ # ── Prompt helper (works in pipe via /dev/tty) ────────────────────────
64
+
65
+ ask_yes_no() {
66
+ prompt="$1"
67
+ default="${2:-y}"
68
+ if [ "$default" = "y" ]; then
69
+ hint="[Y/n]"
70
+ else
71
+ hint="[y/N]"
72
+ fi
73
+
74
+ # If stdin is not a terminal (piped install), use the default.
75
+ if [ ! -t 0 ]; then
76
+ # Try /dev/tty as fallback for curl | sh
77
+ if [ -r /dev/tty ]; then
78
+ printf '%s %s ' "$prompt" "$hint" >/dev/tty
79
+ read -r answer </dev/tty || answer=""
80
+ else
81
+ answer="$default"
82
+ fi
83
+ else
84
+ printf '%s %s ' "$prompt" "$hint"
85
+ read -r answer || answer=""
86
+ fi
87
+
88
+ answer="$(printf '%s' "$answer" | tr '[:upper:]' '[:lower:]')"
89
+ case "$answer" in
90
+ y|yes) return 0 ;;
91
+ n|no) return 1 ;;
92
+ "")
93
+ if [ "$default" = "y" ]; then return 0; else return 1; fi
94
+ ;;
95
+ *) return 1 ;;
96
+ esac
97
+ }
98
+
99
+ # ── Detect OS ─────────────────────────────────────────────────────────
100
+
101
+ detect_os() {
102
+ OS="$(uname -s)"
103
+ case "$OS" in
104
+ Darwin) OS="macos" ;;
105
+ Linux) OS="linux" ;;
106
+ *) OS="unknown" ;;
107
+ esac
108
+ }
109
+
110
+ # ── Banner ────────────────────────────────────────────────────────────
111
+
112
+ print_banner() {
113
+ printf '\n'
114
+ printf '%s' "$BOLD$CYAN"
115
+ cat <<'BANNER'
116
+ _____ _ _
117
+ / ____| | | |
118
+ | (___ | |__ ___ ___ | |_ ___ _ __
119
+ \___ \| '_ \ / _ \ / _ \| __/ _ \ '__|
120
+ ____) | | | | (_) | (_) | || __/ |
121
+ |_____/|_| |_|\___/ \___/ \__\___|_|
122
+
123
+ BANNER
124
+ printf '%s' "$RESET"
125
+ printf ' %sMobile-first dev notifications & remote terminal%s\n' "$DIM" "$RESET"
126
+ printf ' %shttps://github.com/juspay/shooter%s\n\n' "$DIM" "$RESET"
127
+ }
128
+
129
+ # ── Prerequisite checks ──────────────────────────────────────────────
130
+
131
+ check_git() {
132
+ step "Checking prerequisites"
133
+
134
+ if ! command -v git >/dev/null 2>&1; then
135
+ error "git is not installed."
136
+ printf ' Install it from: https://git-scm.com/downloads\n'
137
+ exit 1
138
+ fi
139
+ success "git $(git --version | sed 's/git version //')"
140
+ }
141
+
142
+ check_node() {
143
+ if ! command -v node >/dev/null 2>&1; then
144
+ error "Node.js is not installed."
145
+ printf ' Install Node.js %d+ from: https://nodejs.org\n' "$REQUIRED_NODE_MAJOR"
146
+ exit 1
147
+ fi
148
+
149
+ node_version="$(node --version)"
150
+ node_major="$(printf '%s' "$node_version" | sed 's/^v//' | cut -d. -f1)"
151
+
152
+ if [ "$node_major" -lt "$REQUIRED_NODE_MAJOR" ]; then
153
+ error "Node.js $node_version is too old. Version $REQUIRED_NODE_MAJOR+ is required."
154
+ printf ' Update from: https://nodejs.org\n'
155
+ exit 1
156
+ fi
157
+ success "Node.js $node_version"
158
+ }
159
+
160
+ check_pnpm() {
161
+ if ! command -v pnpm >/dev/null 2>&1; then
162
+ warn "pnpm is not installed."
163
+ if ask_yes_no " Install pnpm via 'npm install -g pnpm'?" "y"; then
164
+ info "Installing pnpm..."
165
+ npm install -g pnpm
166
+ if ! command -v pnpm >/dev/null 2>&1; then
167
+ error "pnpm installation failed. Please install it manually:"
168
+ printf ' npm install -g pnpm\n'
169
+ exit 1
170
+ fi
171
+ success "pnpm $(pnpm --version) (just installed)"
172
+ else
173
+ error "pnpm is required. Install it and try again:"
174
+ printf ' npm install -g pnpm\n'
175
+ exit 1
176
+ fi
177
+ else
178
+ success "pnpm $(pnpm --version)"
179
+ fi
180
+ }
181
+
182
+ # ── Handle existing installation ─────────────────────────────────────
183
+
184
+ handle_existing() {
185
+ if [ -d "$SHOOTER_DIR" ]; then
186
+ printf '\n'
187
+ warn "$SHOOTER_DIR already exists."
188
+ printf '\n'
189
+ printf ' %s1)%s Update — pull latest changes and reinstall\n' "$BOLD" "$RESET"
190
+ printf ' %s2)%s Fresh — remove and clone fresh\n' "$BOLD" "$RESET"
191
+ printf ' %s3)%s Abort — exit without changes\n' "$BOLD" "$RESET"
192
+ printf '\n'
193
+
194
+ # Read choice, handling piped stdin via /dev/tty
195
+ if [ ! -t 0 ] && [ -r /dev/tty ]; then
196
+ printf ' Choice [1/2/3]: ' >/dev/tty
197
+ read -r choice </dev/tty || choice="3"
198
+ elif [ -t 0 ]; then
199
+ printf ' Choice [1/2/3]: '
200
+ read -r choice || choice="3"
201
+ else
202
+ choice="3"
203
+ fi
204
+
205
+ case "$choice" in
206
+ 1)
207
+ step "Updating existing installation"
208
+ cd "$SHOOTER_DIR"
209
+ git pull --rebase origin "$REPO_BRANCH"
210
+ success "Repository updated."
211
+ return 0
212
+ ;;
213
+ 2)
214
+ step "Removing existing installation"
215
+ rm -rf "$SHOOTER_DIR"
216
+ success "Removed $SHOOTER_DIR"
217
+ return 1
218
+ ;;
219
+ *)
220
+ info "Aborted. No changes made."
221
+ # Disable cleanup trap since nothing was cloned
222
+ CLEANUP_CLONED=0
223
+ exit 0
224
+ ;;
225
+ esac
226
+ fi
227
+ return 1
228
+ }
229
+
230
+ # ── Clone ─────────────────────────────────────────────────────────────
231
+
232
+ clone_repo() {
233
+ step "Cloning Shooter"
234
+ CLEANUP_CLONED=1
235
+ git clone --branch "$REPO_BRANCH" --single-branch "$REPO_URL" "$SHOOTER_DIR"
236
+ CLEANUP_CLONED=0
237
+ success "Cloned to $SHOOTER_DIR"
238
+ }
239
+
240
+ # ── Install dependencies ─────────────────────────────────────────────
241
+
242
+ install_deps() {
243
+ step "Installing dependencies"
244
+ cd "$SHOOTER_DIR"
245
+ pnpm install
246
+ success "Dependencies installed."
247
+ }
248
+
249
+ # ── Setup wizard ──────────────────────────────────────────────────────
250
+
251
+ run_setup_wizard() {
252
+ step "Running setup wizard"
253
+
254
+ if [ -f "$SHOOTER_DIR/scripts/setup.cjs" ]; then
255
+ cd "$SHOOTER_DIR"
256
+ node scripts/setup.cjs
257
+ else
258
+ warn "Setup wizard (scripts/setup.cjs) not found. Skipping."
259
+ info "Creating .env from template..."
260
+ if [ ! -f "$SHOOTER_DIR/.env" ]; then
261
+ if [ -f "$SHOOTER_DIR/.env.example" ]; then
262
+ cp "$SHOOTER_DIR/.env.example" "$SHOOTER_DIR/.env"
263
+ success "Created .env from .env.example"
264
+ warn "Edit $SHOOTER_DIR/.env to add your credentials."
265
+ else
266
+ warn "No .env.example found. You will need to create .env manually."
267
+ fi
268
+ else
269
+ info ".env already exists. Skipping."
270
+ fi
271
+
272
+ info "Building the project..."
273
+ cd "$SHOOTER_DIR"
274
+ pnpm build
275
+ success "Build complete."
276
+ fi
277
+ }
278
+
279
+ # ── Global command ────────────────────────────────────────────────────
280
+
281
+ offer_global_command() {
282
+ step "Global command"
283
+
284
+ if ask_yes_no " Install 'shooter' as a global command (via npm link)?" "y"; then
285
+ cd "$SHOOTER_DIR"
286
+
287
+ # Ensure package.json has a bin entry for the link to work.
288
+ # If there is no bin field we create a thin wrapper.
289
+ if ! grep -q '"bin"' "$SHOOTER_DIR/package.json" 2>/dev/null; then
290
+ info "Creating global launcher script..."
291
+ mkdir -p "$SHOOTER_DIR/bin"
292
+ cat > "$SHOOTER_DIR/bin/shooter" <<'LAUNCHER'
293
+ #!/usr/bin/env node
294
+
295
+ import { execSync } from 'child_process';
296
+ import { dirname, join } from 'path';
297
+ import { fileURLToPath } from 'url';
298
+
299
+ const root = join(dirname(fileURLToPath(import.meta.url)), '..');
300
+ const cmd = process.argv[2] || 'start';
301
+
302
+ const commands = {
303
+ start: 'pnpm start',
304
+ dev: 'pnpm dev',
305
+ build: 'pnpm build',
306
+ status: 'echo "Shooter root: ' + root + '"',
307
+ };
308
+
309
+ const toRun = commands[cmd] || `pnpm ${cmd}`;
310
+ try {
311
+ execSync(toRun, { cwd: root, stdio: 'inherit' });
312
+ } catch { process.exit(1); }
313
+ LAUNCHER
314
+ chmod +x "$SHOOTER_DIR/bin/shooter"
315
+
316
+ # Patch package.json to add bin field via node (avoids jq dependency)
317
+ node -e "
318
+ const fs = require('fs');
319
+ const p = JSON.parse(fs.readFileSync('$SHOOTER_DIR/package.json','utf8'));
320
+ p.bin = { shooter: './bin/shooter' };
321
+ fs.writeFileSync('$SHOOTER_DIR/package.json', JSON.stringify(p, null, 2) + '\n');
322
+ "
323
+ fi
324
+
325
+ npm link 2>/dev/null || {
326
+ warn "npm link failed (may need sudo on some systems)."
327
+ warn "You can run it manually: cd $SHOOTER_DIR && sudo npm link"
328
+ }
329
+ success "'shooter' command installed globally."
330
+ else
331
+ info "Skipped. You can always run: cd $SHOOTER_DIR && npm link"
332
+ fi
333
+ }
334
+
335
+ # ── Auto-start (macOS launchd) ────────────────────────────────────────
336
+
337
+ offer_autostart() {
338
+ if [ "$OS" != "macos" ]; then
339
+ return
340
+ fi
341
+
342
+ step "Auto-start (macOS)"
343
+
344
+ PLIST_LABEL="com.shooter.server"
345
+ PLIST_DIR="$HOME/Library/LaunchAgents"
346
+ PLIST_FILE="$PLIST_DIR/$PLIST_LABEL.plist"
347
+
348
+ if ask_yes_no " Start Shooter automatically on login?" "n"; then
349
+ mkdir -p "$PLIST_DIR"
350
+
351
+ # Resolve paths
352
+ NODE_PATH="$(command -v node)"
353
+ TSX_PATH="$(command -v tsx || printf '%s' "$SHOOTER_DIR/node_modules/.bin/tsx")"
354
+ LOG_DIR="$HOME/Library/Logs/Shooter"
355
+ mkdir -p "$LOG_DIR"
356
+
357
+ cat > "$PLIST_FILE" <<PLIST
358
+ <?xml version="1.0" encoding="UTF-8"?>
359
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
360
+ <plist version="1.0">
361
+ <dict>
362
+ <key>Label</key>
363
+ <string>${PLIST_LABEL}</string>
364
+
365
+ <key>ProgramArguments</key>
366
+ <array>
367
+ <string>${TSX_PATH}</string>
368
+ <string>${SHOOTER_DIR}/server.ts</string>
369
+ </array>
370
+
371
+ <key>WorkingDirectory</key>
372
+ <string>${SHOOTER_DIR}</string>
373
+
374
+ <key>EnvironmentVariables</key>
375
+ <dict>
376
+ <key>PATH</key>
377
+ <string>/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin:$(dirname "$NODE_PATH")</string>
378
+ </dict>
379
+
380
+ <key>RunAtLoad</key>
381
+ <true/>
382
+
383
+ <key>KeepAlive</key>
384
+ <dict>
385
+ <key>SuccessfulExit</key>
386
+ <false/>
387
+ </dict>
388
+
389
+ <key>StandardOutPath</key>
390
+ <string>${LOG_DIR}/stdout.log</string>
391
+
392
+ <key>StandardErrorPath</key>
393
+ <string>${LOG_DIR}/stderr.log</string>
394
+
395
+ <key>ThrottleInterval</key>
396
+ <integer>10</integer>
397
+ </dict>
398
+ </plist>
399
+ PLIST
400
+
401
+ launchctl bootout "gui/$(id -u)/$PLIST_LABEL" 2>/dev/null || true
402
+ launchctl bootstrap "gui/$(id -u)" "$PLIST_FILE"
403
+
404
+ success "LaunchAgent installed. Shooter will start on login."
405
+ info " Logs: $LOG_DIR/"
406
+ info " Stop: launchctl bootout gui/$(id -u)/$PLIST_LABEL"
407
+ info " Restart: launchctl kickstart -k gui/$(id -u)/$PLIST_LABEL"
408
+ else
409
+ info "Skipped. To start manually:"
410
+ printf ' cd %s && pnpm start\n' "$SHOOTER_DIR"
411
+ printf '\n'
412
+ info "To set up auto-start later, create a LaunchAgent plist at:"
413
+ printf ' %s\n' "$PLIST_FILE"
414
+ fi
415
+ }
416
+
417
+ # ── Success message ───────────────────────────────────────────────────
418
+
419
+ print_success() {
420
+ printf '\n'
421
+ printf '%s' "$GREEN$BOLD"
422
+ printf ' ================================================\n'
423
+ printf ' Shooter installed successfully!\n'
424
+ printf ' ================================================\n'
425
+ printf '%s' "$RESET"
426
+ printf '\n'
427
+ printf ' %sInstall directory:%s %s\n' "$BOLD" "$RESET" "$SHOOTER_DIR"
428
+ printf ' %sServer URL:%s http://localhost:%s\n' "$BOLD" "$RESET" "$DEFAULT_PORT"
429
+ printf '\n'
430
+ printf ' %sGet started:%s\n' "$BOLD" "$RESET"
431
+ printf ' cd %s\n' "$SHOOTER_DIR"
432
+ printf ' pnpm start %s# start the server%s\n' "$DIM" "$RESET"
433
+ printf ' pnpm dev %s# development mode%s\n' "$DIM" "$RESET"
434
+ printf '\n'
435
+ printf ' %sConfigure:%s\n' "$BOLD" "$RESET"
436
+ printf ' Edit %s/.env with your credentials\n' "$SHOOTER_DIR"
437
+ printf ' See %s/.env.example for reference\n' "$SHOOTER_DIR"
438
+ printf '\n'
439
+ printf ' %sDocs:%s https://github.com/juspay/shooter\n' "$BOLD" "$RESET"
440
+ printf '\n'
441
+ }
442
+
443
+ # ── Main ──────────────────────────────────────────────────────────────
444
+
445
+ main() {
446
+ setup_colors
447
+ detect_os
448
+ print_banner
449
+
450
+ # Prerequisites
451
+ check_git
452
+ check_node
453
+ check_pnpm
454
+
455
+ # Clone or update
456
+ already_installed=0
457
+ if handle_existing; then
458
+ already_installed=1
459
+ fi
460
+
461
+ if [ "$already_installed" -eq 0 ]; then
462
+ clone_repo
463
+ fi
464
+
465
+ # Install & build
466
+ install_deps
467
+ run_setup_wizard
468
+
469
+ # Optional extras
470
+ offer_global_command
471
+ offer_autostart
472
+
473
+ # Done
474
+ print_success
475
+ }
476
+
477
+ main "$@"
@@ -0,0 +1,63 @@
1
+ #!/bin/bash
2
+
3
+ # Setup script for node-pty
4
+ # Handles installation and native module compilation for Node.js 22+
5
+
6
+ set -e
7
+
8
+ echo "🔧 Setting up node-pty..."
9
+
10
+ # Check Node.js version
11
+ NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
12
+ echo "📦 Detected Node.js version: $(node -v)"
13
+
14
+ if [ "$NODE_VERSION" -ge 22 ]; then
15
+ echo "⚠️ Node.js 22+ detected - using beta version of node-pty"
16
+ PTY_VERSION="1.2.0-beta.10"
17
+ else
18
+ echo "✓ Using stable node-pty"
19
+ PTY_VERSION="1.1.0"
20
+ fi
21
+
22
+ # Detect package manager
23
+ if [ -f "pnpm-lock.yaml" ]; then
24
+ PM="pnpm"
25
+ elif [ -f "yarn.lock" ]; then
26
+ PM="yarn"
27
+ else
28
+ PM="npm"
29
+ fi
30
+
31
+ echo "📦 Using package manager: $PM"
32
+
33
+ # Install node-pty
34
+ echo "📥 Installing node-pty@$PTY_VERSION..."
35
+ $PM add node-pty@$PTY_VERSION
36
+
37
+ # Configure pnpm to allow node-pty build scripts
38
+ if [ "$PM" = "pnpm" ]; then
39
+ echo "⚙️ Configuring pnpm to allow node-pty build scripts..."
40
+ pnpm config set onlyBuiltDependencies "node-pty" 2>/dev/null || true
41
+ fi
42
+
43
+ # Rebuild native modules
44
+ echo "🔨 Rebuilding native modules..."
45
+ if [ "$PM" = "pnpm" ]; then
46
+ pnpm rebuild node-pty
47
+ elif [ "$PM" = "yarn" ]; then
48
+ yarn rebuild node-pty
49
+ else
50
+ npm rebuild node-pty
51
+ fi
52
+
53
+ # Verify installation
54
+ echo "✅ Verifying installation..."
55
+ node -e "
56
+ const pty = require('node-pty');
57
+ const timeout = setTimeout(() => { console.error('node-pty verification timed out'); process.exit(1); }, 5000);
58
+ const t = pty.spawn('echo', ['ok']);
59
+ t.onData(d => { clearTimeout(timeout); console.log('node-pty works:', d.trim()); process.exit(0); });
60
+ "
61
+
62
+ echo ""
63
+ echo "✅ node-pty setup complete!"