@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,400 @@
1
+ <script lang="ts">
2
+ import type {
3
+ ConversationMessage,
4
+ MessagePart,
5
+ ToolUsePart,
6
+ } from '$lib/modules/server/sessions/types';
7
+
8
+ import { Accordion, Avatar, Button, Input, Pill } from '@juspay/svelte-ui-components';
9
+ import {
10
+ getToolDescription,
11
+ renderMarkdown,
12
+ } from '$lib/modules/client/common';
13
+ import { tick } from 'svelte';
14
+ import { SvelteSet } from 'svelte/reactivity';
15
+
16
+ // --- Props (Svelte 5 runes) ---
17
+ const {
18
+ connectionState = 'idle',
19
+ messages,
20
+ onCancel,
21
+ onSendInput,
22
+ sessionEnded = false,
23
+ showHeader = false,
24
+ showInput = true,
25
+ }: {
26
+ connectionState?: 'connected' | 'connecting' | 'disconnected' | 'idle' | 'reconnecting';
27
+ messages: ConversationMessage[];
28
+ onCancel?: () => void;
29
+ onSendInput?: (text: string) => void;
30
+ sessionEnded?: boolean;
31
+ showHeader?: boolean;
32
+ showInput?: boolean;
33
+ } = $props();
34
+
35
+ // --- Local state ---
36
+ let inputText = $state('');
37
+ let chatContainerEl = $state<HTMLElement | null>(null);
38
+ let shouldAutoScroll = $state(true);
39
+
40
+ const expandedTools = new SvelteSet<string>();
41
+
42
+ // --- Auto-scroll ---
43
+ // Re-scroll whenever the messages array identity changes
44
+ $effect(() => {
45
+ // Read messages to track dependency
46
+ void messages;
47
+ void scrollToBottom();
48
+ });
49
+
50
+ async function scrollToBottom(): Promise<void> {
51
+ if (!shouldAutoScroll || !chatContainerEl) { return; }
52
+ await tick();
53
+ chatContainerEl.scrollTop = chatContainerEl.scrollHeight;
54
+ }
55
+
56
+ function handleScroll(): void {
57
+ if (!chatContainerEl) { return; }
58
+ const { clientHeight, scrollHeight, scrollTop } = chatContainerEl;
59
+ shouldAutoScroll = scrollHeight - scrollTop - clientHeight < 100;
60
+ }
61
+
62
+ // --- Input handling ---
63
+ function handleSend(): void {
64
+ const text = inputText.trim();
65
+ if (!text) { return; }
66
+ inputText = '';
67
+ onSendInput?.(text);
68
+ }
69
+
70
+ function handleKeydown(e: KeyboardEvent): void {
71
+ if (e.key === 'Enter' && !e.shiftKey) {
72
+ e.preventDefault();
73
+ handleSend();
74
+ }
75
+ }
76
+
77
+ // --- Tool helpers ---
78
+ function toggleTool(id: string): void {
79
+ if (expandedTools.has(id)) {
80
+ expandedTools.delete(id);
81
+ } else {
82
+ expandedTools.add(id);
83
+ }
84
+ }
85
+
86
+ function formatTime(ts: string): string {
87
+ return new Date(ts).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
88
+ }
89
+
90
+ function getToolDescriptionFromPart(part: ToolUsePart): string {
91
+ return getToolDescription(part.toolName, part.input);
92
+ }
93
+
94
+ function formatInput(input: Record<string, unknown>): string {
95
+ return JSON.stringify(input, null, 2);
96
+ }
97
+
98
+ function isToolUsePart(part: MessagePart): part is ToolUsePart {
99
+ return part.type === 'tool_use';
100
+ }
101
+ </script>
102
+
103
+ <div class="chatview-wrapper">
104
+ <!-- Optional header (pages can supply their own) -->
105
+ {#if showHeader}
106
+ <div class="chatview-header">
107
+ <div class="chatview-header-left">
108
+ <Pill text="LIVE" classes="pill-live" />
109
+ <span class="chatview-title">Session</span>
110
+ </div>
111
+ <div class="chatview-header-right">
112
+ <span
113
+ class="connection-status {connectionState}"
114
+ >
115
+ <span class="connection-status-dot"></span>
116
+ {connectionState === 'connected'
117
+ ? 'Connected'
118
+ : connectionState === 'connecting' || connectionState === 'reconnecting'
119
+ ? 'Connecting...'
120
+ : 'Disconnected'}
121
+ </span>
122
+ {#if !sessionEnded && onCancel}
123
+ <Button classes="btn-danger btn-sm" onclick={() => { onCancel(); }} text="Cancel" />
124
+ {/if}
125
+ </div>
126
+ </div>
127
+ {/if}
128
+
129
+ <!-- Chat Container (scrollable) -->
130
+ <div
131
+ class="chat-container chatview-scroll"
132
+ bind:this={chatContainerEl}
133
+ onscroll={handleScroll}
134
+ >
135
+ {#if messages.length === 0}
136
+ <div class="chatview-empty">
137
+ <p class="chatview-empty-text">Waiting for session messages...</p>
138
+ </div>
139
+ {:else}
140
+ {#each messages as message (message.id)}
141
+ {#if message.role === 'user'}
142
+ <div class="chat-message chat-message-user">
143
+ <div>
144
+ {#each message.parts as part, partIdx (partIdx)}
145
+ {#if part.type === 'text'}
146
+ <div class="chat-bubble chat-bubble-user">
147
+ {@html renderMarkdown(part.content)}
148
+ </div>
149
+ {/if}
150
+ {/each}
151
+ <div class="chat-timestamp">{formatTime(message.timestamp)}</div>
152
+ </div>
153
+ <Avatar alt="User" name="User" size="small" classes="avatar-user" />
154
+ </div>
155
+ {:else if message.role === 'assistant'}
156
+ <div class="chat-message chat-message-assistant">
157
+ <Avatar alt="Claude" name="Claude" size="small" classes="avatar-assistant" />
158
+ <div>
159
+ {#each message.parts as part, partIdx (partIdx)}
160
+ {#if part.type === 'text'}
161
+ <div class="chat-bubble chat-bubble-assistant">
162
+ {@html renderMarkdown(part.content)}
163
+ </div>
164
+ {:else if isToolUsePart(part)}
165
+ {@const toolId = part.id}
166
+ {@const isExpanded = expandedTools.has(toolId)}
167
+ <div class="chat-tool-card">
168
+ <div
169
+ class="chat-tool-header"
170
+ onclick={() => { toggleTool(toolId); }}
171
+ onkeydown={(e) => {
172
+ if (e.key === 'Enter' || e.key === ' ') { toggleTool(toolId); }
173
+ }}
174
+ role="button"
175
+ tabindex="0"
176
+ >
177
+ <span class="chat-tool-chevron" class:expanded={isExpanded}>&#9654;</span>
178
+ <Pill text={part.toolName} classes="pill-tool-name" />
179
+ <span class="chat-tool-description">{getToolDescriptionFromPart(part)}</span>
180
+ </div>
181
+ <Accordion expand={isExpanded}>
182
+ {#if isExpanded}
183
+ <div class="chat-tool-body">{formatInput(part.input)}</div>
184
+ {/if}
185
+ </Accordion>
186
+ </div>
187
+ {:else if part.type === 'thinking'}
188
+ {@const thinkId = `thinking-${message.id}`}
189
+ {@const isThinkExpanded = expandedTools.has(thinkId)}
190
+ <div class="chat-thinking">
191
+ <div
192
+ class="chat-thinking-header"
193
+ onclick={() => { toggleTool(thinkId); }}
194
+ onkeydown={(e) => {
195
+ if (e.key === 'Enter' || e.key === ' ') { toggleTool(thinkId); }
196
+ }}
197
+ role="button"
198
+ tabindex="0"
199
+ >
200
+ &#128173; Thinking... {isThinkExpanded ? '&#9660;' : '&#9654;'}
201
+ </div>
202
+ <Accordion expand={isThinkExpanded}>
203
+ {#if isThinkExpanded}
204
+ <div class="chat-thinking-body">{@html renderMarkdown(part.content)}</div>
205
+ {/if}
206
+ </Accordion>
207
+ </div>
208
+ {/if}
209
+ {/each}
210
+ <div class="chat-timestamp">{formatTime(message.timestamp)}</div>
211
+ </div>
212
+ </div>
213
+ {:else if message.role === 'system'}
214
+ {#each message.parts as part, partIdx (partIdx)}
215
+ {#if part.type === 'tool_result'}
216
+ {@const resultId = `result-${part.toolUseId}`}
217
+ {@const isResultExpanded = expandedTools.has(resultId)}
218
+ <div class="chat-message chat-message-system">
219
+ <div class="chat-tool-card">
220
+ <div
221
+ class="chat-tool-header"
222
+ onclick={() => { toggleTool(resultId); }}
223
+ onkeydown={(e) => {
224
+ if (e.key === 'Enter' || e.key === ' ') { toggleTool(resultId); }
225
+ }}
226
+ role="button"
227
+ tabindex="0"
228
+ >
229
+ <span class="chat-tool-chevron" class:expanded={isResultExpanded}>&#9654;</span>
230
+ <Pill
231
+ text={part.isError ? '\u274C Tool Error' : '\u2705 Tool Result'}
232
+ classes={part.isError ? 'pill-tool-error' : 'pill-tool-success'}
233
+ />
234
+ </div>
235
+ <Accordion expand={isResultExpanded}>
236
+ {#if isResultExpanded}
237
+ <div
238
+ class="chat-tool-result"
239
+ class:chat-tool-result-success={!part.isError}
240
+ class:chat-tool-result-error={part.isError}
241
+ >
242
+ {part.output}
243
+ </div>
244
+ {/if}
245
+ </Accordion>
246
+ </div>
247
+ </div>
248
+ {:else if part.type === 'text'}
249
+ <!-- System text messages (e.g. error messages displayed inline) -->
250
+ <div class="chat-message chat-message-system">
251
+ <div class="chat-bubble chat-bubble-system">
252
+ {@html renderMarkdown(part.content)}
253
+ </div>
254
+ </div>
255
+ {/if}
256
+ {/each}
257
+ {/if}
258
+ {/each}
259
+
260
+ <!-- Session ended indicator -->
261
+ {#if sessionEnded}
262
+ <div class="chatview-ended">
263
+ <Pill text="ENDED" classes="pill-badge-ended" />
264
+ <span>Session has ended</span>
265
+ </div>
266
+ {/if}
267
+ {/if}
268
+ </div>
269
+
270
+ <!-- Input bar (if showInput is true) -->
271
+ {#if showInput}
272
+ <div class="chat-input-bar">
273
+ <Input
274
+ bind:value={inputText}
275
+ dataType="text"
276
+ placeholder={sessionEnded ? 'Session ended' : 'Send a message...'}
277
+ disable={sessionEnded || connectionState !== 'connected'}
278
+ onKeyDown={handleKeydown}
279
+ classes="chat-input-field"
280
+ />
281
+ <Button
282
+ classes="btn-primary btn-sm"
283
+ disabled={sessionEnded || connectionState !== 'connected' || !inputText.trim()}
284
+ onclick={handleSend}
285
+ text="Send"
286
+ />
287
+ </div>
288
+ {/if}
289
+ </div>
290
+
291
+ <style>
292
+ /* ChatView wrapper: fills parent, flex column layout */
293
+ .chatview-wrapper {
294
+ display: flex;
295
+ flex-direction: column;
296
+ height: 100%;
297
+ min-height: 0;
298
+ background: var(--ds-background-100, #0a0a0a);
299
+ }
300
+
301
+ /* Header bar */
302
+ .chatview-header {
303
+ display: flex;
304
+ align-items: center;
305
+ justify-content: space-between;
306
+ gap: var(--space-3, 0.75rem);
307
+ padding: var(--space-2, 0.5rem) var(--space-4, 1rem);
308
+ background: #111827;
309
+ border-bottom: 1px solid #1e293b;
310
+ min-height: 48px;
311
+ flex-shrink: 0;
312
+ }
313
+
314
+ .chatview-header-left {
315
+ display: flex;
316
+ align-items: center;
317
+ gap: var(--space-3, 0.75rem);
318
+ min-width: 0;
319
+ }
320
+
321
+ .chatview-title {
322
+ font-size: 0.9rem;
323
+ font-weight: 600;
324
+ color: var(--text-primary, #ededed);
325
+ white-space: nowrap;
326
+ overflow: hidden;
327
+ text-overflow: ellipsis;
328
+ }
329
+
330
+ .chatview-header-right {
331
+ display: flex;
332
+ align-items: center;
333
+ gap: var(--space-3, 0.75rem);
334
+ flex-shrink: 0;
335
+ }
336
+
337
+ :global(.chat-input-field) {
338
+ --input-container-margin: 0;
339
+ --input-height: 40px;
340
+ flex: 1;
341
+ }
342
+
343
+ /* Scrollable chat area */
344
+ .chatview-scroll {
345
+ flex: 1;
346
+ overflow-y: auto;
347
+ overflow-x: hidden;
348
+ padding: var(--space-4, 1rem);
349
+ -webkit-overflow-scrolling: touch;
350
+ scroll-behavior: smooth;
351
+ }
352
+
353
+ /* Empty state */
354
+ .chatview-empty {
355
+ display: flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ padding: var(--space-8, 2rem);
359
+ height: 100%;
360
+ }
361
+
362
+ .chatview-empty-text {
363
+ font-size: var(--text-sm, 0.875rem);
364
+ color: var(--text-tertiary, #7d7d7d);
365
+ }
366
+
367
+ /* Session ended indicator */
368
+ .chatview-ended {
369
+ display: flex;
370
+ align-items: center;
371
+ justify-content: center;
372
+ gap: var(--space-2, 0.5rem);
373
+ padding: var(--space-4, 1rem);
374
+ font-size: 0.85rem;
375
+ color: var(--text-tertiary, #7d7d7d);
376
+ }
377
+
378
+ /* Mobile responsive */
379
+ @media (max-width: 768px) {
380
+ .chatview-header {
381
+ padding: var(--space-2, 0.5rem) var(--space-3, 0.75rem);
382
+ gap: var(--space-2, 0.5rem);
383
+ min-height: 44px;
384
+ }
385
+
386
+ .chatview-title {
387
+ font-size: 0.8rem;
388
+ }
389
+
390
+ .chatview-scroll {
391
+ padding: var(--space-3, 0.75rem);
392
+ }
393
+ }
394
+
395
+ @media (max-width: 480px) {
396
+ .chatview-header {
397
+ flex-wrap: wrap;
398
+ }
399
+ }
400
+ </style>
@@ -0,0 +1,60 @@
1
+ <script lang="ts">
2
+ import { CommandMenu } from '@juspay/svelte-ui-components';
3
+
4
+ interface Command {
5
+ action: () => void;
6
+ label: string;
7
+ }
8
+
9
+ interface Props {
10
+ commands: Command[];
11
+ onClose: () => void;
12
+ open: boolean;
13
+ }
14
+
15
+ let { commands, onClose, open = $bindable() }: Props = $props();
16
+
17
+ const items = $derived(
18
+ commands.map((cmd, i) => ({
19
+ label: cmd.label,
20
+ value: String(i),
21
+ }))
22
+ );
23
+
24
+ function handleSelect(item: { value: string }): void {
25
+ const index = parseInt(item.value, 10);
26
+ if (commands[index]) {
27
+ commands[index].action();
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <CommandMenu
33
+ {items}
34
+ bind:open
35
+ placeholder="Type a command..."
36
+ emptyText="No matching commands"
37
+ onselect={handleSelect}
38
+ onclose={onClose}
39
+ classes="command-palette"
40
+ />
41
+
42
+ <style>
43
+ :global(.command-palette) {
44
+ --command-menu-overlay-background: rgba(0, 0, 0, 0.5);
45
+ --command-menu-background: var(--component-bg);
46
+ --command-menu-border: 1px solid var(--border);
47
+ --command-menu-border-radius: var(--radius-lg);
48
+ --command-menu-width: 500px;
49
+ --command-menu-max-width: 90vw;
50
+ --command-menu-input-color: var(--text-primary);
51
+ --command-menu-input-placeholder-color: var(--text-tertiary);
52
+ --command-menu-input-font-family: var(--font-mono);
53
+ --command-menu-separator-color: var(--border);
54
+ --command-menu-item-color: var(--text-secondary);
55
+ --command-menu-item-active-background: var(--component-bg-hover);
56
+ --command-menu-item-active-color: var(--text-primary);
57
+ --command-menu-empty-color: var(--text-tertiary);
58
+ --command-menu-z-index: 1001;
59
+ }
60
+ </style>
@@ -0,0 +1,99 @@
1
+ <script lang="ts">
2
+ import { Button } from '@juspay/svelte-ui-components';
3
+
4
+ interface Props {
5
+ onretry?: () => void;
6
+ status: 'connected' | 'disconnected' | 'reconnecting';
7
+ }
8
+
9
+ const { onretry, status }: Props = $props();
10
+
11
+ const label = $derived(
12
+ status === 'connected'
13
+ ? 'Connected'
14
+ : status === 'reconnecting'
15
+ ? 'Reconnecting...'
16
+ : 'Disconnected'
17
+ );
18
+ </script>
19
+
20
+ <div class="connection-status" class:reconnecting={status === 'reconnecting'} class:disconnected={status === 'disconnected'} class:connected={status === 'connected'}>
21
+ <span class="status-dot {status}"></span>
22
+ <span class="status-label">{label}</span>
23
+ {#if status === 'disconnected' && onretry}
24
+ <Button classes="btn-ghost btn-sm btn-retry" onclick={onretry} text="Retry" />
25
+ {/if}
26
+ </div>
27
+
28
+ <style>
29
+ .connection-status {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ gap: 6px;
33
+ font-size: 12px;
34
+ font-weight: 500;
35
+ line-height: 1;
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ .connection-status.connected {
40
+ color: #22c55e;
41
+ }
42
+
43
+ .connection-status.reconnecting {
44
+ color: var(--ds-amber-900);
45
+ }
46
+
47
+ .connection-status.disconnected {
48
+ color: var(--ds-red-900);
49
+ }
50
+
51
+ .status-dot {
52
+ width: 8px;
53
+ height: 8px;
54
+ border-radius: 50%;
55
+ flex-shrink: 0;
56
+ }
57
+
58
+ .status-dot.connected {
59
+ background: #22c55e;
60
+ }
61
+
62
+ .status-dot.reconnecting {
63
+ background: var(--ds-amber-700);
64
+ animation: pulse-dot 1.5s ease-in-out infinite;
65
+ }
66
+
67
+ .status-dot.disconnected {
68
+ background: var(--ds-red-700);
69
+ }
70
+
71
+ @keyframes pulse-dot {
72
+ 0%,
73
+ 100% {
74
+ opacity: 1;
75
+ }
76
+ 50% {
77
+ opacity: 0.3;
78
+ }
79
+ }
80
+
81
+ .status-label {
82
+ white-space: nowrap;
83
+ }
84
+
85
+ :global(.btn-retry) {
86
+ --button-height: auto;
87
+ --button-padding: 2px 8px;
88
+ --button-font-size: 12px;
89
+ --button-border: 1px solid currentColor;
90
+ --button-text-color: inherit;
91
+ margin-left: 2px;
92
+ }
93
+
94
+ @media (max-width: 480px) {
95
+ .status-label {
96
+ display: none;
97
+ }
98
+ }
99
+ </style>