@juspay/shooter 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/.claude/hooks/notifier.cjs +117 -33
  2. package/.claude/settings.json +14 -14
  3. package/README.md +116 -84
  4. package/bin/shooter.cjs +471 -102
  5. package/build/client/_app/immutable/assets/{0.CM9Hl6d-.css → 0.BhZOCxO4.css} +1 -1
  6. package/build/client/_app/immutable/assets/0.BhZOCxO4.css.br +0 -0
  7. package/build/client/_app/immutable/assets/0.BhZOCxO4.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/1.BYutk3aU.css +1 -0
  9. package/build/client/_app/immutable/assets/1.BYutk3aU.css.br +0 -0
  10. package/build/client/_app/immutable/assets/1.BYutk3aU.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/2.CAShZ7lQ.css.gz +0 -0
  12. package/build/client/_app/immutable/assets/3.DGDHCVnW.css +1 -0
  13. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.br +0 -0
  14. package/build/client/_app/immutable/assets/3.DGDHCVnW.css.gz +0 -0
  15. package/build/client/_app/immutable/assets/4.BFUut--w.css +1 -0
  16. package/build/client/_app/immutable/assets/4.BFUut--w.css.br +0 -0
  17. package/build/client/_app/immutable/assets/4.BFUut--w.css.gz +0 -0
  18. package/build/client/_app/immutable/assets/5.BTOx7yt7.css +1 -0
  19. package/build/client/_app/immutable/assets/5.BTOx7yt7.css.br +0 -0
  20. package/build/client/_app/immutable/assets/5.BTOx7yt7.css.gz +0 -0
  21. package/build/client/_app/immutable/assets/6.eZGZN-BF.css +1 -0
  22. package/build/client/_app/immutable/assets/6.eZGZN-BF.css.br +0 -0
  23. package/build/client/_app/immutable/assets/6.eZGZN-BF.css.gz +0 -0
  24. package/build/client/_app/immutable/assets/7.DwS5ZHBh.css +1 -0
  25. package/build/client/_app/immutable/assets/7.DwS5ZHBh.css.br +0 -0
  26. package/build/client/_app/immutable/assets/7.DwS5ZHBh.css.gz +0 -0
  27. package/build/client/_app/immutable/assets/ChatView.CwWbzIL-.css +1 -0
  28. package/build/client/_app/immutable/assets/ChatView.CwWbzIL-.css.br +0 -0
  29. package/build/client/_app/immutable/assets/ChatView.CwWbzIL-.css.gz +0 -0
  30. package/build/client/_app/immutable/assets/Phone.FQEfwCX2.css +1 -0
  31. package/build/client/_app/immutable/assets/Phone.FQEfwCX2.css.br +0 -0
  32. package/build/client/_app/immutable/assets/Phone.FQEfwCX2.css.gz +0 -0
  33. package/build/client/_app/immutable/assets/markdown.Dc-OSJWY.css +1 -0
  34. package/build/client/_app/immutable/assets/markdown.Dc-OSJWY.css.br +0 -0
  35. package/build/client/_app/immutable/assets/markdown.Dc-OSJWY.css.gz +0 -0
  36. package/build/client/_app/immutable/assets/xterm.DFuMZ0ql.css.gz +0 -0
  37. package/build/client/_app/immutable/chunks/B-K5Sh65.js +1 -0
  38. package/build/client/_app/immutable/chunks/B-K5Sh65.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/B-K5Sh65.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/B5NAKyil.js +20 -0
  41. package/build/client/_app/immutable/chunks/B5NAKyil.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/B5NAKyil.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/B8XegpSE.js +1 -0
  44. package/build/client/_app/immutable/chunks/B8XegpSE.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/B8XegpSE.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/B8zoBsv3.js +6 -0
  47. package/build/client/_app/immutable/chunks/B8zoBsv3.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/B8zoBsv3.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/BLszSzTT.js +1 -0
  50. package/build/client/_app/immutable/chunks/BLszSzTT.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/BLszSzTT.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/BOYo8yTr.js +1 -0
  53. package/build/client/_app/immutable/chunks/BOYo8yTr.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/BOYo8yTr.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/BTGVxaYV.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/BYqGCrTe.js +1 -0
  57. package/build/client/_app/immutable/chunks/BYqGCrTe.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/BYqGCrTe.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/BlxrFPDK.js.gz +0 -0
  60. package/build/client/_app/immutable/chunks/Bu1aqm5j.js +1 -0
  61. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.br +0 -0
  62. package/build/client/_app/immutable/chunks/Bu1aqm5j.js.gz +0 -0
  63. package/build/client/_app/immutable/chunks/C4mLaWWx.js +1 -0
  64. package/build/client/_app/immutable/chunks/C4mLaWWx.js.br +0 -0
  65. package/build/client/_app/immutable/chunks/C4mLaWWx.js.gz +0 -0
  66. package/build/client/_app/immutable/chunks/CQjSATpv.js +61 -0
  67. package/build/client/_app/immutable/chunks/CQjSATpv.js.br +0 -0
  68. package/build/client/_app/immutable/chunks/CQjSATpv.js.gz +0 -0
  69. package/build/client/_app/immutable/chunks/CSoRdFvv.js +1 -0
  70. package/build/client/_app/immutable/chunks/CSoRdFvv.js.br +0 -0
  71. package/build/client/_app/immutable/chunks/CSoRdFvv.js.gz +0 -0
  72. package/build/client/_app/immutable/chunks/CZHsSL_X.js +1 -0
  73. package/build/client/_app/immutable/chunks/CZHsSL_X.js.br +0 -0
  74. package/build/client/_app/immutable/chunks/CZHsSL_X.js.gz +0 -0
  75. package/build/client/_app/immutable/chunks/DLu6yJIZ.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/DSU1n5N_.js +1 -0
  77. package/build/client/_app/immutable/chunks/DSU1n5N_.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/DSU1n5N_.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/DVkn4r72.js +1 -0
  80. package/build/client/_app/immutable/chunks/DVkn4r72.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/DVkn4r72.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/DjsDGxCa.js +41 -0
  83. package/build/client/_app/immutable/chunks/DjsDGxCa.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/DjsDGxCa.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/UJOiqIYE.js +1 -0
  87. package/build/client/_app/immutable/chunks/UJOiqIYE.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/UJOiqIYE.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/r0JawsZc.js +2 -0
  90. package/build/client/_app/immutable/chunks/r0JawsZc.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/r0JawsZc.js.gz +0 -0
  92. package/build/client/_app/immutable/entry/app.Z3zMnuSx.js +2 -0
  93. package/build/client/_app/immutable/entry/app.Z3zMnuSx.js.br +0 -0
  94. package/build/client/_app/immutable/entry/app.Z3zMnuSx.js.gz +0 -0
  95. package/build/client/_app/immutable/entry/start.Dd-gIP4y.js +1 -0
  96. package/build/client/_app/immutable/entry/start.Dd-gIP4y.js.br +2 -0
  97. package/build/client/_app/immutable/entry/start.Dd-gIP4y.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/0.D2YR8tTD.js +1 -0
  99. package/build/client/_app/immutable/nodes/0.D2YR8tTD.js.br +0 -0
  100. package/build/client/_app/immutable/nodes/0.D2YR8tTD.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/1.B3m6rO4C.js +1 -0
  102. package/build/client/_app/immutable/nodes/1.B3m6rO4C.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/1.B3m6rO4C.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/2.CyRB2euU.js +1 -0
  105. package/build/client/_app/immutable/nodes/2.CyRB2euU.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/2.CyRB2euU.js.gz +0 -0
  107. package/build/client/_app/immutable/nodes/3.3yohCM25.js +3 -0
  108. package/build/client/_app/immutable/nodes/3.3yohCM25.js.br +0 -0
  109. package/build/client/_app/immutable/nodes/3.3yohCM25.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/4.DEAcwl7l.js +1 -0
  111. package/build/client/_app/immutable/nodes/4.DEAcwl7l.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/4.DEAcwl7l.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/5.C6bLGWQR.js +4 -0
  114. package/build/client/_app/immutable/nodes/5.C6bLGWQR.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/5.C6bLGWQR.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/6.ByTzlA2D.js +2 -0
  117. package/build/client/_app/immutable/nodes/6.ByTzlA2D.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/6.ByTzlA2D.js.gz +0 -0
  119. package/build/client/_app/immutable/nodes/7.BPMfwzd2.js +2 -0
  120. package/build/client/_app/immutable/nodes/7.BPMfwzd2.js.br +0 -0
  121. package/build/client/_app/immutable/nodes/7.BPMfwzd2.js.gz +0 -0
  122. package/build/client/_app/version.json +1 -1
  123. package/build/client/_app/version.json.br +0 -0
  124. package/build/client/_app/version.json.gz +0 -0
  125. package/build/client/favicon.svg.gz +0 -0
  126. package/build/client/manifest.json +13 -0
  127. package/build/client/manifest.json.br +0 -0
  128. package/build/client/manifest.json.gz +0 -0
  129. package/build/pty-holder.cjs +37 -8
  130. package/build/server/chunks/0-Vk38tI2J.js +9 -0
  131. package/build/server/chunks/0-Vk38tI2J.js.map +1 -0
  132. package/build/server/chunks/1-BvYQX5MR.js +9 -0
  133. package/build/server/chunks/1-BvYQX5MR.js.map +1 -0
  134. package/build/server/chunks/2-Cl7R4Qk2.js +9 -0
  135. package/build/server/chunks/2-Cl7R4Qk2.js.map +1 -0
  136. package/build/server/chunks/3-Ck7ewhOX.js +9 -0
  137. package/build/server/chunks/3-Ck7ewhOX.js.map +1 -0
  138. package/build/server/chunks/4-CnDeRm2Z.js +9 -0
  139. package/build/server/chunks/4-CnDeRm2Z.js.map +1 -0
  140. package/build/server/chunks/5-IxitzEvN.js +9 -0
  141. package/build/server/chunks/5-IxitzEvN.js.map +1 -0
  142. package/build/server/chunks/6-CyZ3r1iS.js +9 -0
  143. package/build/server/chunks/6-CyZ3r1iS.js.map +1 -0
  144. package/build/server/chunks/7-BmI7du46.js +9 -0
  145. package/build/server/chunks/7-BmI7du46.js.map +1 -0
  146. package/build/server/chunks/Button-Cs1aE6ka.js +80 -0
  147. package/build/server/chunks/Button-Cs1aE6ka.js.map +1 -0
  148. package/build/server/chunks/EmptyState-DDFH1K8g.js +26 -0
  149. package/build/server/chunks/EmptyState-DDFH1K8g.js.map +1 -0
  150. package/build/server/chunks/Icon-CEUrotA6.js +36 -0
  151. package/build/server/chunks/Icon-CEUrotA6.js.map +1 -0
  152. package/build/server/chunks/Shimmer-DB8W1zt6.js +10 -0
  153. package/build/server/chunks/Shimmer-DB8W1zt6.js.map +1 -0
  154. package/build/server/chunks/_error.svelte-uCOJNxvr.js +39 -0
  155. package/build/server/chunks/_error.svelte-uCOJNxvr.js.map +1 -0
  156. package/build/server/chunks/_layout.svelte-CtWmEJwe.js +56 -0
  157. package/build/server/chunks/_layout.svelte-CtWmEJwe.js.map +1 -0
  158. package/build/server/chunks/_page.svelte-BcZaKdX9.js +45 -0
  159. package/build/server/chunks/_page.svelte-BcZaKdX9.js.map +1 -0
  160. package/build/server/chunks/_page.svelte-BdYynOck.js +85 -0
  161. package/build/server/chunks/_page.svelte-BdYynOck.js.map +1 -0
  162. package/build/server/chunks/_page.svelte-BgevQjq1.js +101 -0
  163. package/build/server/chunks/_page.svelte-BgevQjq1.js.map +1 -0
  164. package/build/server/chunks/_page.svelte-CVq6tRb3.js +550 -0
  165. package/build/server/chunks/_page.svelte-CVq6tRb3.js.map +1 -0
  166. package/build/server/chunks/_page.svelte-CxWcQ0Am.js +651 -0
  167. package/build/server/chunks/_page.svelte-CxWcQ0Am.js.map +1 -0
  168. package/build/server/chunks/_page.svelte-DO4oa_LY.js +44 -0
  169. package/build/server/chunks/_page.svelte-DO4oa_LY.js.map +1 -0
  170. package/build/server/chunks/{_server.ts-CbDRDIoP.js → _server.ts-BStnNIcq.js} +9 -11
  171. package/build/server/chunks/_server.ts-BStnNIcq.js.map +1 -0
  172. package/build/server/chunks/{_server.ts-DRVbgm6k.js → _server.ts-CAxsWKvS.js} +22 -25
  173. package/build/server/chunks/_server.ts-CAxsWKvS.js.map +1 -0
  174. package/build/server/chunks/{_server.ts-CPa6DgIt.js → _server.ts-COu0vNpd.js} +6 -6
  175. package/build/server/chunks/_server.ts-COu0vNpd.js.map +1 -0
  176. package/build/server/chunks/{_server.ts-C29xzfaw.js → _server.ts-CTpcLUH8.js} +10 -10
  177. package/build/server/chunks/_server.ts-CTpcLUH8.js.map +1 -0
  178. package/build/server/chunks/{_server.ts-D4MNi4cD.js → _server.ts-Cf84YIaW.js} +3 -3
  179. package/build/server/chunks/{_server.ts-D4MNi4cD.js.map → _server.ts-Cf84YIaW.js.map} +1 -1
  180. package/build/server/chunks/{_server.ts-BL2FGb5Z.js → _server.ts-Ch-6iOHp.js} +99 -53
  181. package/build/server/chunks/_server.ts-Ch-6iOHp.js.map +1 -0
  182. package/build/server/chunks/_server.ts-CtH0dhUp.js +71 -0
  183. package/build/server/chunks/_server.ts-CtH0dhUp.js.map +1 -0
  184. package/build/server/chunks/_server.ts-DB_Kg97c.js +73 -0
  185. package/build/server/chunks/_server.ts-DB_Kg97c.js.map +1 -0
  186. package/build/server/chunks/{_server.ts-DfajWaqh.js → _server.ts-DV8zTCF9.js} +7 -9
  187. package/build/server/chunks/_server.ts-DV8zTCF9.js.map +1 -0
  188. package/build/server/chunks/_server.ts-DYpJImqd.js +99 -0
  189. package/build/server/chunks/_server.ts-DYpJImqd.js.map +1 -0
  190. package/build/server/chunks/{_server.ts-ColfDHW8.js → _server.ts-DYvb9ijZ.js} +21 -10
  191. package/build/server/chunks/_server.ts-DYvb9ijZ.js.map +1 -0
  192. package/build/server/chunks/{_server.ts-Cv_OrRuL.js → _server.ts-Deok2y88.js} +209 -34
  193. package/build/server/chunks/_server.ts-Deok2y88.js.map +1 -0
  194. package/build/server/chunks/{_server.ts-y9-WYDMa.js → _server.ts-WhTJBEJy.js} +5 -4
  195. package/build/server/chunks/{_server.ts-y9-WYDMa.js.map → _server.ts-WhTJBEJy.js.map} +1 -1
  196. package/build/server/chunks/{_server.ts-BjOJsoy4.js → _server.ts-XzT2UHM1.js} +6 -5
  197. package/build/server/chunks/_server.ts-XzT2UHM1.js.map +1 -0
  198. package/build/server/chunks/{_server.ts-BgdjBZco.js → _server.ts-tSpgyl1D.js} +7 -5
  199. package/build/server/chunks/_server.ts-tSpgyl1D.js.map +1 -0
  200. package/build/server/chunks/{_server.ts-BihKSdj_.js → _server.ts-vekTmWAx.js} +8 -8
  201. package/build/server/chunks/_server.ts-vekTmWAx.js.map +1 -0
  202. package/build/server/chunks/{auth-CEgFis71.js → auth-DeCdZ83n.js} +2 -2
  203. package/build/server/chunks/{auth-CEgFis71.js.map → auth-DeCdZ83n.js.map} +1 -1
  204. package/build/server/chunks/client-BdGHe_hY.js +25 -0
  205. package/build/server/chunks/client-BdGHe_hY.js.map +1 -0
  206. package/build/server/chunks/client2-CCBGA-2V.js +7 -0
  207. package/build/server/chunks/client2-CCBGA-2V.js.map +1 -0
  208. package/build/server/chunks/error-DDXB3duW.js +12 -0
  209. package/build/server/chunks/error-DDXB3duW.js.map +1 -0
  210. package/build/server/chunks/{exports-CJ0Q5XmL.js → index-DwaY1cAm.js} +1111 -1634
  211. package/build/server/chunks/index-DwaY1cAm.js.map +1 -0
  212. package/build/server/chunks/index-server-CrDaL06Y.js +9 -0
  213. package/build/server/chunks/index-server-CrDaL06Y.js.map +1 -0
  214. package/build/server/chunks/index2-CgclKpUj.js +58 -0
  215. package/build/server/chunks/index2-CgclKpUj.js.map +1 -0
  216. package/build/server/chunks/{library-apns-BHxLmuIx.js → library-apns-BqJbvSKh.js} +4 -4
  217. package/build/server/chunks/library-apns-BqJbvSKh.js.map +1 -0
  218. package/build/server/chunks/markdown-W_mTBct0.js +8 -0
  219. package/build/server/chunks/markdown-W_mTBct0.js.map +1 -0
  220. package/build/server/chunks/opencode-db-path-DcfhJtJy.js +15 -0
  221. package/build/server/chunks/opencode-db-path-DcfhJtJy.js.map +1 -0
  222. package/build/server/chunks/{pty-manager-C0FhBiVq.js → pty-manager-BQVB7IVj.js} +155 -326
  223. package/build/server/chunks/pty-manager-BQVB7IVj.js.map +1 -0
  224. package/build/server/chunks/root-DDSnEAZv.js +1171 -0
  225. package/build/server/chunks/root-DDSnEAZv.js.map +1 -0
  226. package/build/server/chunks/{shared-server-BDY8jh20.js → shared-server-sSGG17Df.js} +2 -3
  227. package/build/server/chunks/{shared-server-BDY8jh20.js.map → shared-server-sSGG17Df.js.map} +1 -1
  228. package/build/server/chunks/state.svelte-hBbXlUak.js +11 -0
  229. package/build/server/chunks/state.svelte-hBbXlUak.js.map +1 -0
  230. package/build/server/chunks/stores-DHNzYNpX.js +28 -0
  231. package/build/server/chunks/stores-DHNzYNpX.js.map +1 -0
  232. package/build/server/index.js +1085 -2242
  233. package/build/server/index.js.map +1 -1
  234. package/build/server/manifest.js +39 -25
  235. package/build/server/manifest.js.map +1 -1
  236. package/package.json +32 -9
  237. package/scripts/fix-generated-types.sh +37 -0
  238. package/scripts/homebrew/shooter.rb +51 -0
  239. package/scripts/install.sh +348 -186
  240. package/scripts/setup.cjs +215 -45
  241. package/server.ts +114 -71
  242. package/src/app.css +12 -3
  243. package/src/app.d.ts +13 -20
  244. package/src/app.html +3 -2
  245. package/src/generated/types/API.ts +280 -0
  246. package/src/generated/types/APN.ts +186 -203
  247. package/src/generated/types/CLI.ts +18 -25
  248. package/src/generated/types/Client.ts +589 -0
  249. package/src/generated/types/Config.ts +53 -0
  250. package/src/generated/types/Holder.ts +638 -0
  251. package/src/generated/types/JWT.ts +39 -50
  252. package/src/generated/types/Notification.ts +426 -0
  253. package/src/generated/types/OpenCode.ts +356 -0
  254. package/src/generated/types/Sessions.ts +570 -0
  255. package/src/generated/types/Terminal.ts +2184 -2071
  256. package/src/generated/types/WsProtocol.ts +2004 -0
  257. package/src/generated/types/index.ts +9 -3
  258. package/src/lib/env.ts +29 -0
  259. package/src/lib/modules/client/common/cache.ts +10 -2
  260. package/src/lib/modules/client/common/config-guard.ts +37 -5
  261. package/src/lib/modules/client/common/error.ts +10 -0
  262. package/src/lib/modules/client/common/index.ts +6 -5
  263. package/src/lib/modules/client/common/markdown.ts +22 -1
  264. package/src/lib/modules/client/common/native-bridge.ts +28 -20
  265. package/src/lib/modules/client/common/time.ts +13 -11
  266. package/src/lib/modules/client/terminal/ChatView.svelte +354 -74
  267. package/src/lib/modules/client/terminal/CommandPalette.svelte +3 -2
  268. package/src/lib/modules/client/terminal/ConnectionStatus.svelte +7 -1
  269. package/src/lib/modules/client/terminal/LaunchSheet.svelte +147 -84
  270. package/src/lib/modules/client/terminal/QuickKeys.svelte +3 -1
  271. package/src/lib/modules/client/terminal/ShortcutsHelp.svelte +2 -5
  272. package/src/lib/modules/client/terminal/keyboard-shortcuts.ts +27 -24
  273. package/src/lib/modules/client/terminal/xterm-wrapper.ts +74 -45
  274. package/src/lib/modules/server/apn/library-apns.ts +3 -2
  275. package/src/lib/modules/server/apn/notification-history.ts +2 -13
  276. package/src/lib/modules/server/apn/notification-sessions.ts +3 -13
  277. package/src/lib/modules/server/apn/pending-requests.ts +3 -8
  278. package/src/lib/modules/server/apn/types.ts +5 -4
  279. package/src/lib/modules/server/cli/index.ts +3 -2
  280. package/src/lib/modules/server/fcm/fcm-service.ts +8 -6
  281. package/src/lib/modules/server/sessions/jsonl-parser.ts +3 -3
  282. package/src/lib/modules/server/sessions/jsonl-reader.ts +86 -26
  283. package/src/lib/modules/server/sessions/opencode-db-path.ts +26 -0
  284. package/src/lib/modules/server/sessions/opencode-reader.ts +13 -15
  285. package/src/lib/modules/server/sessions/process-detector.ts +103 -0
  286. package/src/lib/modules/server/sessions/types.ts +11 -22
  287. package/src/lib/modules/server/terminal/holder-client.ts +272 -248
  288. package/src/lib/modules/server/terminal/opencode-watcher.ts +547 -556
  289. package/src/lib/modules/server/terminal/pty-holder.cjs +37 -8
  290. package/src/lib/modules/server/terminal/pty-manager.ts +157 -115
  291. package/src/lib/modules/server/terminal/session-watcher.ts +6 -4
  292. package/src/lib/modules/server/terminal/terminal-store.ts +131 -128
  293. package/src/lib/modules/server/utils/error.ts +9 -0
  294. package/src/lib/modules/server/ws/events-handler.ts +12 -6
  295. package/src/lib/modules/server/ws/keepalive.ts +86 -69
  296. package/src/lib/modules/server/ws/server.ts +43 -37
  297. package/src/lib/modules/server/ws/session-handler.ts +332 -147
  298. package/src/lib/modules/server/ws/terminal-handler.ts +29 -17
  299. package/src/lib/modules/server/ws/ticket-store.ts +29 -26
  300. package/src/lib/theme.css +30 -0
  301. package/src/lib/types/config.ts +1 -6
  302. package/src/routes/+error.svelte +94 -0
  303. package/src/routes/+layout.svelte +66 -31
  304. package/src/routes/+page.svelte +25 -22
  305. package/src/routes/api/debug/+server.ts +3 -1
  306. package/src/routes/api/device-token/+server.ts +60 -60
  307. package/src/routes/api/health/+server.ts +81 -73
  308. package/src/routes/api/notify/+server.ts +115 -68
  309. package/src/routes/api/qr-config/+server.ts +30 -32
  310. package/src/routes/api/response/+server.ts +9 -4
  311. package/src/routes/api/sessions/+server.ts +15 -5
  312. package/src/routes/api/sessions/connect/+server.ts +125 -0
  313. package/src/routes/api/sessions/detect/+server.ts +27 -0
  314. package/src/routes/api/terminals/+server.ts +26 -24
  315. package/src/routes/api/terminals/[id]/+server.ts +13 -7
  316. package/src/routes/api/terminals/[id]/paste-image/+server.ts +54 -52
  317. package/src/routes/api/terminals/[id]/resize/+server.ts +6 -3
  318. package/src/routes/api/webhook/+server.ts +8 -10
  319. package/src/routes/api/ws-status/+server.ts +7 -5
  320. package/src/routes/api/ws-ticket/+server.ts +42 -41
  321. package/src/routes/config/+page.svelte +149 -75
  322. package/src/routes/project/+page.svelte +165 -35
  323. package/src/routes/session/[id]/+page.svelte +479 -283
  324. package/src/routes/terminals/+page.svelte +58 -45
  325. package/src/routes/terminals/[id]/+page.svelte +223 -91
  326. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.br +0 -0
  327. package/build/client/_app/immutable/assets/0.CM9Hl6d-.css.gz +0 -0
  328. package/build/client/_app/immutable/assets/3.C0uFg0IS.css +0 -1
  329. package/build/client/_app/immutable/assets/3.C0uFg0IS.css.br +0 -0
  330. package/build/client/_app/immutable/assets/3.C0uFg0IS.css.gz +0 -0
  331. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css +0 -1
  332. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.br +0 -0
  333. package/build/client/_app/immutable/assets/4.cJuCkJKZ.css.gz +0 -0
  334. package/build/client/_app/immutable/assets/5.DRjApZQW.css +0 -1
  335. package/build/client/_app/immutable/assets/5.DRjApZQW.css.br +0 -0
  336. package/build/client/_app/immutable/assets/5.DRjApZQW.css.gz +0 -0
  337. package/build/client/_app/immutable/assets/6.AraZrY8I.css +0 -1
  338. package/build/client/_app/immutable/assets/6.AraZrY8I.css.br +0 -0
  339. package/build/client/_app/immutable/assets/6.AraZrY8I.css.gz +0 -0
  340. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css +0 -1
  341. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.br +0 -0
  342. package/build/client/_app/immutable/assets/7.BCJ1IuMx.css.gz +0 -0
  343. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css +0 -1
  344. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.br +0 -0
  345. package/build/client/_app/immutable/assets/ChatView.CsdBAOKx.css.gz +0 -0
  346. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css +0 -1
  347. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.br +0 -0
  348. package/build/client/_app/immutable/assets/markdown.B0b5w2tq.css.gz +0 -0
  349. package/build/client/_app/immutable/chunks/BNJphC1q.js +0 -56
  350. package/build/client/_app/immutable/chunks/BNJphC1q.js.br +0 -0
  351. package/build/client/_app/immutable/chunks/BNJphC1q.js.gz +0 -0
  352. package/build/client/_app/immutable/chunks/Bvk7mfPM.js +0 -1
  353. package/build/client/_app/immutable/chunks/Bvk7mfPM.js.br +0 -0
  354. package/build/client/_app/immutable/chunks/Bvk7mfPM.js.gz +0 -0
  355. package/build/client/_app/immutable/chunks/CAokzuPQ.js +0 -1
  356. package/build/client/_app/immutable/chunks/CAokzuPQ.js.br +0 -0
  357. package/build/client/_app/immutable/chunks/CAokzuPQ.js.gz +0 -0
  358. package/build/client/_app/immutable/chunks/CGLrx-H5.js +0 -1
  359. package/build/client/_app/immutable/chunks/CGLrx-H5.js.br +0 -0
  360. package/build/client/_app/immutable/chunks/CGLrx-H5.js.gz +0 -0
  361. package/build/client/_app/immutable/chunks/CgCpWzEA.js +0 -1
  362. package/build/client/_app/immutable/chunks/CgCpWzEA.js.br +0 -0
  363. package/build/client/_app/immutable/chunks/CgCpWzEA.js.gz +0 -0
  364. package/build/client/_app/immutable/chunks/Cjwk_cGO.js +0 -6
  365. package/build/client/_app/immutable/chunks/Cjwk_cGO.js.br +0 -0
  366. package/build/client/_app/immutable/chunks/Cjwk_cGO.js.gz +0 -0
  367. package/build/client/_app/immutable/chunks/CtQ8EED1.js +0 -11
  368. package/build/client/_app/immutable/chunks/CtQ8EED1.js.br +0 -0
  369. package/build/client/_app/immutable/chunks/CtQ8EED1.js.gz +0 -0
  370. package/build/client/_app/immutable/chunks/DERQCisl.js +0 -1
  371. package/build/client/_app/immutable/chunks/DERQCisl.js.br +0 -0
  372. package/build/client/_app/immutable/chunks/DERQCisl.js.gz +0 -0
  373. package/build/client/_app/immutable/chunks/DKrg8TQs.js +0 -1
  374. package/build/client/_app/immutable/chunks/DKrg8TQs.js.br +0 -0
  375. package/build/client/_app/immutable/chunks/DKrg8TQs.js.gz +0 -0
  376. package/build/client/_app/immutable/chunks/Dkkpz_4D.js +0 -126
  377. package/build/client/_app/immutable/chunks/Dkkpz_4D.js.br +0 -0
  378. package/build/client/_app/immutable/chunks/Dkkpz_4D.js.gz +0 -0
  379. package/build/client/_app/immutable/chunks/DoczjQhA.js +0 -1
  380. package/build/client/_app/immutable/chunks/DoczjQhA.js.br +0 -0
  381. package/build/client/_app/immutable/chunks/DoczjQhA.js.gz +0 -0
  382. package/build/client/_app/immutable/chunks/RpcNruLP.js +0 -2
  383. package/build/client/_app/immutable/chunks/RpcNruLP.js.br +0 -0
  384. package/build/client/_app/immutable/chunks/RpcNruLP.js.gz +0 -0
  385. package/build/client/_app/immutable/chunks/a-St0Zwo.js +0 -1
  386. package/build/client/_app/immutable/chunks/a-St0Zwo.js.br +0 -0
  387. package/build/client/_app/immutable/chunks/a-St0Zwo.js.gz +0 -0
  388. package/build/client/_app/immutable/chunks/bo70OQUZ.js +0 -1
  389. package/build/client/_app/immutable/chunks/bo70OQUZ.js.br +0 -0
  390. package/build/client/_app/immutable/chunks/bo70OQUZ.js.gz +0 -0
  391. package/build/client/_app/immutable/entry/app.QvGgdvTI.js +0 -2
  392. package/build/client/_app/immutable/entry/app.QvGgdvTI.js.br +0 -0
  393. package/build/client/_app/immutable/entry/app.QvGgdvTI.js.gz +0 -0
  394. package/build/client/_app/immutable/entry/start.BntDNRMC.js +0 -1
  395. package/build/client/_app/immutable/entry/start.BntDNRMC.js.br +0 -0
  396. package/build/client/_app/immutable/entry/start.BntDNRMC.js.gz +0 -0
  397. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js +0 -1
  398. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.br +0 -0
  399. package/build/client/_app/immutable/nodes/0.CzkdvJ7j.js.gz +0 -0
  400. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js +0 -1
  401. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.br +0 -0
  402. package/build/client/_app/immutable/nodes/1.MG1QhfrI.js.gz +0 -0
  403. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js +0 -1
  404. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.br +0 -0
  405. package/build/client/_app/immutable/nodes/2.B4MlOSh6.js.gz +0 -0
  406. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js +0 -3
  407. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.br +0 -0
  408. package/build/client/_app/immutable/nodes/3.DIwYkjDn.js.gz +0 -0
  409. package/build/client/_app/immutable/nodes/4.D-cIe70D.js +0 -1
  410. package/build/client/_app/immutable/nodes/4.D-cIe70D.js.br +0 -0
  411. package/build/client/_app/immutable/nodes/4.D-cIe70D.js.gz +0 -0
  412. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js +0 -1
  413. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.br +0 -0
  414. package/build/client/_app/immutable/nodes/5.D7zPRe3L.js.gz +0 -0
  415. package/build/client/_app/immutable/nodes/6.BB7QE48r.js +0 -2
  416. package/build/client/_app/immutable/nodes/6.BB7QE48r.js.br +0 -0
  417. package/build/client/_app/immutable/nodes/6.BB7QE48r.js.gz +0 -0
  418. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js +0 -2
  419. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.br +0 -0
  420. package/build/client/_app/immutable/nodes/7.D8mqsrZG.js.gz +0 -0
  421. package/build/client/manifest.webmanifest +0 -1
  422. package/build/client/registerSW.js +0 -1
  423. package/build/client/registerSW.js.br +0 -0
  424. package/build/client/registerSW.js.gz +0 -0
  425. package/build/client/sw.js +0 -222
  426. package/build/client/sw.js.br +0 -0
  427. package/build/client/sw.js.gz +0 -0
  428. package/build/client/workbox-5119daf5.js +0 -3395
  429. package/build/client/workbox-5119daf5.js.br +0 -0
  430. package/build/client/workbox-5119daf5.js.gz +0 -0
  431. package/build/server/chunks/0-q2IUp76Y.js +0 -9
  432. package/build/server/chunks/0-q2IUp76Y.js.map +0 -1
  433. package/build/server/chunks/1-CU50G5wZ.js +0 -9
  434. package/build/server/chunks/1-CU50G5wZ.js.map +0 -1
  435. package/build/server/chunks/2-D01t9s8T.js +0 -9
  436. package/build/server/chunks/2-D01t9s8T.js.map +0 -1
  437. package/build/server/chunks/3-5PUQ04wC.js +0 -9
  438. package/build/server/chunks/3-5PUQ04wC.js.map +0 -1
  439. package/build/server/chunks/4-e7gywnSG.js +0 -9
  440. package/build/server/chunks/4-e7gywnSG.js.map +0 -1
  441. package/build/server/chunks/5-CA1SA6KZ.js +0 -9
  442. package/build/server/chunks/5-CA1SA6KZ.js.map +0 -1
  443. package/build/server/chunks/6-71H221sV.js +0 -9
  444. package/build/server/chunks/6-71H221sV.js.map +0 -1
  445. package/build/server/chunks/7-Bo-vmdyz.js +0 -9
  446. package/build/server/chunks/7-Bo-vmdyz.js.map +0 -1
  447. package/build/server/chunks/_layout.svelte-SFHOxs74.js +0 -132
  448. package/build/server/chunks/_layout.svelte-SFHOxs74.js.map +0 -1
  449. package/build/server/chunks/_page.svelte-B4w-2wD-.js +0 -120
  450. package/build/server/chunks/_page.svelte-B4w-2wD-.js.map +0 -1
  451. package/build/server/chunks/_page.svelte-B_qAXjkh.js +0 -213
  452. package/build/server/chunks/_page.svelte-B_qAXjkh.js.map +0 -1
  453. package/build/server/chunks/_page.svelte-CsF1_TRG.js +0 -50
  454. package/build/server/chunks/_page.svelte-CsF1_TRG.js.map +0 -1
  455. package/build/server/chunks/_page.svelte-DJC6U-P0.js +0 -68
  456. package/build/server/chunks/_page.svelte-DJC6U-P0.js.map +0 -1
  457. package/build/server/chunks/_page.svelte-DQ6HBtsz.js +0 -407
  458. package/build/server/chunks/_page.svelte-DQ6HBtsz.js.map +0 -1
  459. package/build/server/chunks/_page.svelte-LbhhjP21.js +0 -148
  460. package/build/server/chunks/_page.svelte-LbhhjP21.js.map +0 -1
  461. package/build/server/chunks/_server.ts-BL2FGb5Z.js.map +0 -1
  462. package/build/server/chunks/_server.ts-BgdjBZco.js.map +0 -1
  463. package/build/server/chunks/_server.ts-BihKSdj_.js.map +0 -1
  464. package/build/server/chunks/_server.ts-BjOJsoy4.js.map +0 -1
  465. package/build/server/chunks/_server.ts-C29xzfaw.js.map +0 -1
  466. package/build/server/chunks/_server.ts-CPa6DgIt.js.map +0 -1
  467. package/build/server/chunks/_server.ts-CbDRDIoP.js.map +0 -1
  468. package/build/server/chunks/_server.ts-Cl1OEWL4.js +0 -54
  469. package/build/server/chunks/_server.ts-Cl1OEWL4.js.map +0 -1
  470. package/build/server/chunks/_server.ts-ColfDHW8.js.map +0 -1
  471. package/build/server/chunks/_server.ts-Cv_OrRuL.js.map +0 -1
  472. package/build/server/chunks/_server.ts-DRVbgm6k.js.map +0 -1
  473. package/build/server/chunks/_server.ts-DfajWaqh.js.map +0 -1
  474. package/build/server/chunks/client-CxCatAKr.js +0 -255
  475. package/build/server/chunks/client-CxCatAKr.js.map +0 -1
  476. package/build/server/chunks/error.svelte-BqdwMWdK.js +0 -26
  477. package/build/server/chunks/error.svelte-BqdwMWdK.js.map +0 -1
  478. package/build/server/chunks/exports-CJ0Q5XmL.js.map +0 -1
  479. package/build/server/chunks/index2-DAxIoAO-.js +0 -36
  480. package/build/server/chunks/index2-DAxIoAO-.js.map +0 -1
  481. package/build/server/chunks/jsonl-parser-dmZU_Hyu.js +0 -137
  482. package/build/server/chunks/jsonl-parser-dmZU_Hyu.js.map +0 -1
  483. package/build/server/chunks/library-apns-BHxLmuIx.js.map +0 -1
  484. package/build/server/chunks/markdown-Bxrl3cCF.js +0 -1241
  485. package/build/server/chunks/markdown-Bxrl3cCF.js.map +0 -1
  486. package/build/server/chunks/pty-manager-C0FhBiVq.js.map +0 -1
  487. package/build/server/chunks/stores-D0HorpgL.js +0 -36
  488. package/build/server/chunks/stores-D0HorpgL.js.map +0 -1
@@ -0,0 +1,651 @@
1
+ import { l as head, d as attr_class, f as stringify, k as escape_html, o as attr, p as attr_style, q as bind_props, r as spread_props, n as ensure_array_like, t as derived } from './index-DwaY1cAm.js';
2
+ import { I as Icon } from './Icon-CEUrotA6.js';
3
+ import './markdown-W_mTBct0.js';
4
+ import { B as Button, h as html } from './Button-Cs1aE6ka.js';
5
+ import 'dompurify';
6
+ import 'marked';
7
+
8
+ /* empty css */
9
+ function Card($$renderer, $$props) {
10
+ const { children, class: className = "", description, title } = $$props;
11
+ $$renderer.push(`<div${attr_class(`card ${stringify(className)}`)}>`);
12
+ if (title) {
13
+ $$renderer.push("<!--[0-->");
14
+ $$renderer.push(`<div class="card-header"><h2 class="card-title">${escape_html(title)}</h2> `);
15
+ if (description) {
16
+ $$renderer.push("<!--[0-->");
17
+ $$renderer.push(`<p class="card-description">${escape_html(description)}</p>`);
18
+ } else {
19
+ $$renderer.push("<!--[-1-->");
20
+ }
21
+ $$renderer.push(`<!--]--></div>`);
22
+ } else {
23
+ $$renderer.push("<!--[-1-->");
24
+ }
25
+ $$renderer.push(`<!--]--> <div class="card-content">`);
26
+ children($$renderer);
27
+ $$renderer.push(`<!----></div></div>`);
28
+ }
29
+ function toErrorMessage(err) {
30
+ if (err instanceof Error) {
31
+ return err.message;
32
+ }
33
+ if (typeof err === "string") {
34
+ return err;
35
+ }
36
+ return String(err);
37
+ }
38
+ function validateInput(inputValue, dataType, validPattern, inProgressPattern, customValidators) {
39
+ let validationResult = "Valid";
40
+ switch (dataType) {
41
+ case "email":
42
+ validationResult = validateEmailInput(inputValue);
43
+ break;
44
+ case "tel":
45
+ validationResult = validPattern === null ? validatePhoneNumber(inputValue) : validateTextWithPattern(inputValue, validPattern, inProgressPattern);
46
+ break;
47
+ case "password":
48
+ validationResult = validatePassword(inputValue, validPattern, inProgressPattern);
49
+ break;
50
+ case "text":
51
+ validationResult = validateTextWithPattern(inputValue, validPattern, inProgressPattern);
52
+ break;
53
+ }
54
+ customValidators.forEach((validator) => {
55
+ const currentResult = validator(inputValue, validationResult);
56
+ if (currentResult === "Invalid") {
57
+ validationResult = "Invalid";
58
+ } else if (currentResult === "InProgress") {
59
+ validationResult = "InProgress";
60
+ } else {
61
+ validationResult = validationResult === "Valid" && currentResult === "Valid" ? "Valid" : validationResult;
62
+ }
63
+ });
64
+ return validationResult;
65
+ }
66
+ function validateTextWithPattern(inputValue, validationPattern, inProgressPattern) {
67
+ if (validationPattern !== null) {
68
+ if (validationPattern.test(inputValue)) {
69
+ return "Valid";
70
+ } else if (inProgressPattern !== null && inProgressPattern.test(inputValue) || inputValue.length === 0) {
71
+ return "InProgress";
72
+ } else {
73
+ return "Invalid";
74
+ }
75
+ }
76
+ return "Valid";
77
+ }
78
+ function validatePassword(password, validationPattern, inProgressPattern) {
79
+ if (validationPattern !== null) {
80
+ if (validationPattern.test(password)) {
81
+ return "Valid";
82
+ } else if (inProgressPattern !== null && inProgressPattern.test(password) && password.length === 0) {
83
+ return "InProgress";
84
+ } else {
85
+ return "Invalid";
86
+ }
87
+ }
88
+ return "Valid";
89
+ }
90
+ function validateEmailInput(emailId) {
91
+ try {
92
+ const validPattern = new RegExp(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);
93
+ const inProgressPattern = new RegExp(/[^ ]{1,}[\w0-9.,_,@]{0,}/);
94
+ if (validPattern.test(emailId)) {
95
+ return "Valid";
96
+ } else if (inProgressPattern.test(emailId) || emailId.length === 0) {
97
+ return "InProgress";
98
+ } else {
99
+ return "Invalid";
100
+ }
101
+ } catch (e) {
102
+ console.error("Email Regex creation failed: ", e);
103
+ }
104
+ return "Valid";
105
+ }
106
+ function validatePhoneNumber(phoneNumber) {
107
+ try {
108
+ const validationPattern = new RegExp("^[6-9]{1}[0-9]{9}$");
109
+ const inProgressPattern = new RegExp("^[6-9]{1}[0-9]{0,9}$");
110
+ if (validationPattern.test(phoneNumber)) {
111
+ return "Valid";
112
+ } else if (inProgressPattern.test(phoneNumber) || phoneNumber.length === 0) {
113
+ return "InProgress";
114
+ } else {
115
+ return "Invalid";
116
+ }
117
+ } catch (e) {
118
+ console.error("Phone Regex creation failed", e);
119
+ }
120
+ return phoneNumber.length === 10 ? "Valid" : phoneNumber.length > 10 ? "InProgress" : "Invalid";
121
+ }
122
+ function Input($$renderer, $$props) {
123
+ $$renderer.component(($$renderer2) => {
124
+ let {
125
+ value = "",
126
+ placeholder = "",
127
+ dataType = "text",
128
+ label = "",
129
+ onErrorMessage = "",
130
+ infoMessage = "",
131
+ validators = [],
132
+ disable = false,
133
+ validationPattern = null,
134
+ inProgressPattern = null,
135
+ addFocusColor = false,
136
+ maxLength = 1e3,
137
+ minLength = 0,
138
+ actionInput = false,
139
+ useTextArea = false,
140
+ autoComplete = "on",
141
+ name = "",
142
+ testId = "",
143
+ textTransformers = [],
144
+ textViewPresentation = [],
145
+ onFocus = () => {
146
+ },
147
+ onFocusout = () => {
148
+ },
149
+ onInput = () => {
150
+ },
151
+ onPaste = () => {
152
+ },
153
+ onStateChange = () => {
154
+ },
155
+ onClick = () => {
156
+ },
157
+ onKeyDown = () => {
158
+ },
159
+ classes
160
+ } = $$props;
161
+ function focus() {
162
+ try {
163
+ inputElement?.focus();
164
+ inputElement?.scrollIntoView({ behavior: "smooth", block: "center" });
165
+ } catch (error) {
166
+ console.error("Error focusing or scrolling inputElement:", error);
167
+ }
168
+ }
169
+ function blur() {
170
+ try {
171
+ inputElement?.blur();
172
+ } catch (error) {
173
+ console.error("Error blurring inputElement:", error);
174
+ }
175
+ }
176
+ let inputElement = null;
177
+ let validationState = derived(() => {
178
+ const valueValidation = validateInput(value, dataType, validationPattern, inProgressPattern, validators);
179
+ if (valueValidation === "InProgress" && value.length > 0 && inputElement) ;
180
+ return valueValidation;
181
+ });
182
+ const showErrorMessage = derived(() => validationState() === "Invalid");
183
+ $$renderer2.push(`<div${attr_class(`input-container ${stringify(classes ?? "")}`, "svelte-1y8a925", {
184
+ "input-error": validationState() === "Invalid" && !actionInput
185
+ })}>`);
186
+ if (typeof label === "string" && label !== "" && !actionInput) {
187
+ $$renderer2.push("<!--[0-->");
188
+ $$renderer2.push(`<label class="label svelte-1y8a925"${attr("for", name)}>${escape_html(label)}</label>`);
189
+ } else {
190
+ $$renderer2.push("<!--[-1-->");
191
+ }
192
+ $$renderer2.push(`<!--]--> `);
193
+ if (useTextArea) {
194
+ $$renderer2.push("<!--[0-->");
195
+ $$renderer2.push(`<textarea${attr("placeholder", placeholder)}${attr("autocomplete", autoComplete)}${attr("name", name)}${attr_style(`--focus-border: ${stringify(addFocusColor ? 1 : 0)}px;`)}${attr("disabled", disable, true)}${attr("maxlength", dataType === "tel" ? null : maxLength)}${attr("minlength", minLength)}${attr_class("svelte-1y8a925", void 0, { "action-input": actionInput })}>`);
196
+ const $$body = escape_html(value);
197
+ if ($$body) {
198
+ $$renderer2.push(`${$$body}`);
199
+ }
200
+ $$renderer2.push(`</textarea>`);
201
+ } else {
202
+ $$renderer2.push("<!--[-1-->");
203
+ $$renderer2.push(`<input${attr("type", dataType)}${attr("value", value)}${attr("placeholder", placeholder)}${attr("autocomplete", autoComplete)}${attr("name", name)}${attr("data-pw", testId)}${attr("disabled", disable, true)}${attr("maxlength", dataType === "tel" ? null : maxLength)}${attr("minlength", minLength)}${attr_class("svelte-1y8a925", void 0, { "action-input": actionInput })}/>`);
204
+ }
205
+ $$renderer2.push(`<!--]--> `);
206
+ if (onErrorMessage !== "" && showErrorMessage() && !actionInput) {
207
+ $$renderer2.push("<!--[0-->");
208
+ $$renderer2.push(`<div class="error-message svelte-1y8a925">${escape_html(onErrorMessage)}</div>`);
209
+ } else {
210
+ $$renderer2.push("<!--[-1-->");
211
+ }
212
+ $$renderer2.push(`<!--]--> `);
213
+ if (infoMessage !== "" && !actionInput) {
214
+ $$renderer2.push("<!--[0-->");
215
+ $$renderer2.push(`<div class="info-message svelte-1y8a925">${escape_html(infoMessage)}</div>`);
216
+ } else {
217
+ $$renderer2.push("<!--[-1-->");
218
+ }
219
+ $$renderer2.push(`<!--]--></div>`);
220
+ bind_props($$props, { value, focus, blur });
221
+ });
222
+ }
223
+ const closeSvg = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n <line x1="18" y1="6" x2="6" y2="18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n <line x1="6" y1="6" x2="18" y2="18" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>\n</svg>\n';
224
+ function Banner($$renderer, $$props) {
225
+ $$renderer.component(($$renderer2) => {
226
+ let {
227
+ text,
228
+ icon,
229
+ linkText,
230
+ dismissible = false,
231
+ visible = true,
232
+ testId,
233
+ rightContent,
234
+ dismissIcon,
235
+ onclick,
236
+ ondismiss,
237
+ classes
238
+ } = $$props;
239
+ let interactive = derived(() => typeof onclick === "function");
240
+ function handleDismiss(event) {
241
+ event.stopPropagation();
242
+ visible = false;
243
+ ondismiss?.();
244
+ }
245
+ if (visible) {
246
+ $$renderer2.push("<!--[0-->");
247
+ $$renderer2.push(`<div${attr_class(`banner ${stringify(classes ?? "")}`, "svelte-1omq7oz")}${attr("role", interactive() ? "button" : null)}${attr("tabindex", interactive() ? 0 : null)}${attr("data-pw", typeof testId === "string" ? testId : null)}>`);
248
+ if (typeof icon === "function") {
249
+ $$renderer2.push("<!--[0-->");
250
+ $$renderer2.push(`<div class="banner-icon svelte-1omq7oz">`);
251
+ icon($$renderer2);
252
+ $$renderer2.push(`<!----></div>`);
253
+ } else {
254
+ $$renderer2.push("<!--[-1-->");
255
+ }
256
+ $$renderer2.push(`<!--]--> <div class="banner-text svelte-1omq7oz">${escape_html(text)} `);
257
+ if (typeof linkText === "string" && linkText.length > 0) {
258
+ $$renderer2.push("<!--[0-->");
259
+ $$renderer2.push(`<span class="banner-link-text svelte-1omq7oz">${escape_html(linkText)}</span>`);
260
+ } else {
261
+ $$renderer2.push("<!--[-1-->");
262
+ }
263
+ $$renderer2.push(`<!--]--></div> `);
264
+ if (typeof rightContent === "function") {
265
+ $$renderer2.push("<!--[0-->");
266
+ $$renderer2.push(`<div class="banner-right svelte-1omq7oz">`);
267
+ rightContent($$renderer2);
268
+ $$renderer2.push(`<!----></div>`);
269
+ } else {
270
+ $$renderer2.push("<!--[-1-->");
271
+ }
272
+ $$renderer2.push(`<!--]--> `);
273
+ if (dismissible) {
274
+ $$renderer2.push("<!--[0-->");
275
+ $$renderer2.push(`<div class="banner-dismiss svelte-1omq7oz">`);
276
+ Button($$renderer2, spread_props([
277
+ { onclick: handleDismiss, ariaLabel: "Dismiss" },
278
+ typeof testId === "string" ? { testId: `${testId}-dismiss` } : {},
279
+ {
280
+ children: ($$renderer3) => {
281
+ if (typeof dismissIcon === "function") {
282
+ $$renderer3.push("<!--[0-->");
283
+ dismissIcon($$renderer3);
284
+ $$renderer3.push(`<!---->`);
285
+ } else {
286
+ $$renderer3.push("<!--[-1-->");
287
+ $$renderer3.push(`${html(closeSvg)}`);
288
+ }
289
+ $$renderer3.push(`<!--]-->`);
290
+ },
291
+ $$slots: { default: true }
292
+ }
293
+ ]));
294
+ $$renderer2.push(`<!----></div>`);
295
+ } else {
296
+ $$renderer2.push("<!--[-1-->");
297
+ }
298
+ $$renderer2.push(`<!--]--></div>`);
299
+ } else {
300
+ $$renderer2.push("<!--[-1-->");
301
+ }
302
+ $$renderer2.push(`<!--]-->`);
303
+ bind_props($$props, { visible });
304
+ });
305
+ }
306
+ function Step($$renderer, $$props) {
307
+ $$renderer.component(($$renderer2) => {
308
+ let { stepIndex, label, icon, classes } = $$props;
309
+ $$renderer2.push(`<div${attr_class(`step ${stringify(classes ?? "")}`, "svelte-ds22du")} role="button" tabindex="0">`);
310
+ if (typeof icon === "string" && icon.length > 0) {
311
+ $$renderer2.push("<!--[0-->");
312
+ $$renderer2.push(`<div class="step-icon-container"><img class="step-icon"${attr("src", icon)} alt=""/></div>`);
313
+ } else {
314
+ $$renderer2.push("<!--[-1-->");
315
+ $$renderer2.push(`<div class="step-index-container svelte-ds22du"><div class="step-index-text svelte-ds22du">${escape_html(stepIndex)}</div></div>`);
316
+ }
317
+ $$renderer2.push(`<!--]--> <div class="step-text svelte-ds22du">${escape_html(label)}</div> <div class="separator svelte-ds22du"></div></div>`);
318
+ });
319
+ }
320
+ function Stepper($$renderer, $$props) {
321
+ let { steps, currentStepIndex, classes } = $$props;
322
+ $$renderer.push(`<div${attr_class(`container ${stringify(classes ?? "")}`, "svelte-xw39st")}><!--[-->`);
323
+ const each_array = ensure_array_like(steps);
324
+ for (let stepIndex = 0, $$length = each_array.length; stepIndex < $$length; stepIndex++) {
325
+ let currentStep = each_array[stepIndex];
326
+ $$renderer.push(`<div${attr_class("step-container svelte-xw39st", void 0, {
327
+ "active-step": currentStepIndex === stepIndex,
328
+ "completed-step": currentStepIndex > stepIndex
329
+ })}>`);
330
+ Step($$renderer, {
331
+ label: currentStep.label,
332
+ icon: currentStep.icon,
333
+ stepIndex: stepIndex + 1
334
+ });
335
+ $$renderer.push(`<!----></div>`);
336
+ }
337
+ $$renderer.push(`<!--]--></div>`);
338
+ }
339
+ function _page($$renderer, $$props) {
340
+ $$renderer.component(($$renderer2) => {
341
+ let serverUrl = "";
342
+ let apiKey = "";
343
+ let deviceToken = "";
344
+ let result = "";
345
+ let loading = false;
346
+ let statusType = "";
347
+ let qrDataUrl = "";
348
+ let qrServerUrl = "";
349
+ let qrLoading = false;
350
+ let qrError = "";
351
+ async function fetchQrCode() {
352
+ if (!apiKey.trim()) {
353
+ qrError = "Save an API key first to generate a QR code";
354
+ return;
355
+ }
356
+ qrLoading = true;
357
+ qrError = "";
358
+ qrDataUrl = "";
359
+ qrServerUrl = "";
360
+ try {
361
+ const response = await fetch("/api/qr-config", { headers: { Authorization: `Bearer ${apiKey.trim()}` } });
362
+ if (!response.ok) {
363
+ const data2 = await response.json();
364
+ qrError = data2.error || "Failed to generate QR code";
365
+ return;
366
+ }
367
+ const data = await response.json();
368
+ qrDataUrl = data.dataUrl;
369
+ qrServerUrl = data.serverUrl;
370
+ } catch (error) {
371
+ qrError = `Network error: ${toErrorMessage(error)}`;
372
+ } finally {
373
+ qrLoading = false;
374
+ }
375
+ }
376
+ function getNativeBridge() {
377
+ if (typeof window === "undefined") {
378
+ return null;
379
+ }
380
+ if (window.ShooterBridge) {
381
+ return window.ShooterBridge;
382
+ }
383
+ if (window.ShooterNativeBridge) {
384
+ return window.ShooterNativeBridge;
385
+ }
386
+ return null;
387
+ }
388
+ function getDefaultServerUrl() {
389
+ return window.location.origin;
390
+ }
391
+ async function saveConfiguration() {
392
+ loading = true;
393
+ result = "";
394
+ statusType = "";
395
+ try {
396
+ const trimmedUrl = serverUrl.trim().replace(/\/+$/, "");
397
+ localStorage.setItem("shooter_config", JSON.stringify({
398
+ apiKey: apiKey.trim(),
399
+ deviceToken: deviceToken.trim(),
400
+ lastUpdated: Date.now(),
401
+ serverUrl: trimmedUrl || getDefaultServerUrl()
402
+ }));
403
+ const bridge = getNativeBridge();
404
+ if (bridge) {
405
+ bridge.saveConfig?.(JSON.stringify({
406
+ apiKey: apiKey.trim(),
407
+ serverUrl: trimmedUrl || getDefaultServerUrl()
408
+ }));
409
+ }
410
+ const response = await fetch("/api/health");
411
+ if (response.ok) {
412
+ result = "Configuration saved successfully";
413
+ statusType = "success";
414
+ } else {
415
+ result = "Configuration saved but system health check failed";
416
+ statusType = "warning";
417
+ }
418
+ } catch (error) {
419
+ result = `Configuration failed: ${toErrorMessage(error)}`;
420
+ statusType = "error";
421
+ }
422
+ loading = false;
423
+ }
424
+ async function testConfiguration() {
425
+ if (!apiKey.trim()) {
426
+ result = "API key is required for testing";
427
+ statusType = "error";
428
+ return;
429
+ }
430
+ loading = true;
431
+ result = "";
432
+ statusType = "";
433
+ try {
434
+ const testPayload = {
435
+ data: { source: "config-test", timestamp: Date.now() },
436
+ message: `Configuration test at ${(/* @__PURE__ */ new Date()).toLocaleTimeString()}`,
437
+ title: "Configuration Test"
438
+ };
439
+ if (deviceToken.trim()) {
440
+ testPayload.deviceToken = deviceToken.trim();
441
+ }
442
+ const response = await fetch("/api/notify", {
443
+ body: JSON.stringify(testPayload),
444
+ headers: {
445
+ Authorization: `Bearer ${apiKey}`,
446
+ "Content-Type": "application/json"
447
+ },
448
+ method: "POST"
449
+ });
450
+ const data = await response.json();
451
+ if (response.ok) {
452
+ result = "Test notification sent successfully";
453
+ statusType = "success";
454
+ } else {
455
+ result = `Test failed: ${data.error || "Unknown error"}`;
456
+ statusType = "error";
457
+ }
458
+ } catch (error) {
459
+ result = `Network error: ${toErrorMessage(error)}`;
460
+ statusType = "error";
461
+ }
462
+ loading = false;
463
+ }
464
+ function clearConfiguration() {
465
+ }
466
+ let $$settled = true;
467
+ let $$inner_renderer;
468
+ function $$render_inner($$renderer3) {
469
+ head("1gp6n77", $$renderer3, ($$renderer4) => {
470
+ $$renderer4.title(($$renderer5) => {
471
+ $$renderer5.push(`<title>Settings - Shooter</title>`);
472
+ });
473
+ $$renderer4.push(`<meta name="description" content="Configure notification system settings"/>`);
474
+ });
475
+ $$renderer3.push(`<main class="main"><div class="settings-container svelte-1gp6n77"><div style="margin-bottom: var(--space-4);"><a href="/" class="back-link">← Back to Projects</a></div> <div class="page-header svelte-1gp6n77"><h1 class="page-title svelte-1gp6n77">Settings</h1> <p class="page-description svelte-1gp6n77">Configure your API credentials and notification preferences</p></div> <div class="settings-grid svelte-1gp6n77"><section class="settings-section svelte-1gp6n77">`);
476
+ Card($$renderer3, {
477
+ title: "Server Configuration",
478
+ description: "Configure server connection and credentials",
479
+ children: ($$renderer4) => {
480
+ Input($$renderer4, {
481
+ name: "serverUrl",
482
+ label: "Server URL",
483
+ dataType: "text",
484
+ placeholder: "https://shooter.breezehq.dev",
485
+ infoMessage: "Base URL of your Shooter server. Apps will reload with this URL on next launch.",
486
+ get value() {
487
+ return serverUrl;
488
+ },
489
+ set value($$value) {
490
+ serverUrl = $$value;
491
+ $$settled = false;
492
+ }
493
+ });
494
+ $$renderer4.push(`<!----> `);
495
+ Input($$renderer4, {
496
+ name: "apiKey",
497
+ label: "API Key",
498
+ dataType: "password",
499
+ placeholder: "Enter your API key",
500
+ infoMessage: "Required for sending notifications",
501
+ get value() {
502
+ return apiKey;
503
+ },
504
+ set value($$value) {
505
+ apiKey = $$value;
506
+ $$settled = false;
507
+ }
508
+ });
509
+ $$renderer4.push(`<!----> <p class="input-help svelte-1gp6n77">Find this in your <code class="svelte-1gp6n77">~/.shooter/.env</code> file. Run <code class="svelte-1gp6n77">shooter setup</code> to generate one.</p> `);
510
+ Input($$renderer4, {
511
+ name: "deviceToken",
512
+ label: "Device Token",
513
+ dataType: "text",
514
+ placeholder: "64-character hex string",
515
+ infoMessage: "Device token from app registration",
516
+ classes: "input-mono",
517
+ get value() {
518
+ return deviceToken;
519
+ },
520
+ set value($$value) {
521
+ deviceToken = $$value;
522
+ $$settled = false;
523
+ }
524
+ });
525
+ $$renderer4.push(`<!----> <p class="input-help svelte-1gp6n77">Optional — only needed for iOS/Android push notifications.</p>`);
526
+ }
527
+ });
528
+ $$renderer3.push(`<!----> `);
529
+ if (result) {
530
+ $$renderer3.push("<!--[0-->");
531
+ const bannerIcon = statusType === "success" ? "check-circle" : statusType === "error" ? "x-circle" : "alert-triangle";
532
+ {
533
+ let icon = function($$renderer4) {
534
+ Icon($$renderer4, { name: bannerIcon, size: 16 });
535
+ };
536
+ Banner($$renderer3, {
537
+ text: result,
538
+ classes: `banner-${stringify(statusType || "info")}`,
539
+ icon,
540
+ $$slots: { icon: true }
541
+ });
542
+ }
543
+ } else {
544
+ $$renderer3.push("<!--[-1-->");
545
+ }
546
+ $$renderer3.push(`<!--]--> <div class="button-group svelte-1gp6n77">`);
547
+ Button($$renderer3, {
548
+ classes: "btn-secondary",
549
+ onclick: testConfiguration,
550
+ disabled: loading || !apiKey.trim(),
551
+ children: ($$renderer4) => {
552
+ if (!loading) {
553
+ $$renderer4.push("<!--[0-->");
554
+ Icon($$renderer4, { name: "play", size: 14 });
555
+ } else {
556
+ $$renderer4.push("<!--[-1-->");
557
+ }
558
+ $$renderer4.push(`<!--]--> Test Connection`);
559
+ },
560
+ $$slots: { default: true }
561
+ });
562
+ $$renderer3.push(`<!----> `);
563
+ Button($$renderer3, {
564
+ classes: "btn-primary",
565
+ onclick: saveConfiguration,
566
+ disabled: loading || !apiKey.trim(),
567
+ showLoader: loading,
568
+ text: "Save Changes"
569
+ });
570
+ $$renderer3.push(`<!----></div></section> <aside class="settings-sidebar svelte-1gp6n77">`);
571
+ Card($$renderer3, {
572
+ title: "Setup Guide",
573
+ children: ($$renderer4) => {
574
+ Stepper($$renderer4, {
575
+ steps: [
576
+ { label: "Get API Key" },
577
+ { label: "Find Device Token" },
578
+ { label: "Test Connection" }
579
+ ],
580
+ currentStepIndex: apiKey.trim() && deviceToken.trim() ? 2 : apiKey.trim() ? 1 : 0,
581
+ classes: "setup-stepper"
582
+ });
583
+ }
584
+ });
585
+ $$renderer3.push(`<!----> `);
586
+ Card($$renderer3, {
587
+ title: "Mobile App Setup",
588
+ description: "Scan to connect your mobile app",
589
+ children: ($$renderer4) => {
590
+ $$renderer4.push(`<div class="qr-section svelte-1gp6n77">`);
591
+ {
592
+ $$renderer4.push("<!--[-1-->");
593
+ if (qrDataUrl) {
594
+ $$renderer4.push("<!--[0-->");
595
+ $$renderer4.push(`<div class="qr-container svelte-1gp6n77"><img${attr("src", qrDataUrl)} alt="QR code for mobile app pairing" class="qr-image svelte-1gp6n77"/></div> <p class="qr-hint svelte-1gp6n77">Scan this QR code with the Shooter iOS or Android app to connect.</p> `);
596
+ if (qrServerUrl) {
597
+ $$renderer4.push("<!--[0-->");
598
+ $$renderer4.push(`<p class="qr-server-url svelte-1gp6n77">Server: <code class="svelte-1gp6n77">${escape_html(qrServerUrl)}</code></p>`);
599
+ } else {
600
+ $$renderer4.push("<!--[-1-->");
601
+ }
602
+ $$renderer4.push(`<!--]-->`);
603
+ } else if (qrLoading) {
604
+ $$renderer4.push("<!--[1-->");
605
+ $$renderer4.push(`<div class="qr-placeholder svelte-1gp6n77"><p class="qr-loading-text svelte-1gp6n77">Generating QR code...</p></div>`);
606
+ } else if (qrError) {
607
+ $$renderer4.push("<!--[2-->");
608
+ $$renderer4.push(`<p class="qr-error svelte-1gp6n77">${escape_html(qrError)}</p>`);
609
+ } else {
610
+ $$renderer4.push("<!--[-1-->");
611
+ $$renderer4.push(`<p class="qr-description svelte-1gp6n77">Generate a QR code containing your server URL and API key. Your mobile app can
612
+ scan it to auto-configure the connection.</p>`);
613
+ }
614
+ $$renderer4.push(`<!--]--> `);
615
+ Button($$renderer4, {
616
+ classes: "btn-secondary btn-sm",
617
+ onclick: fetchQrCode,
618
+ disabled: qrLoading || !apiKey.trim(),
619
+ text: qrDataUrl ? "Regenerate QR Code" : "Generate QR Code"
620
+ });
621
+ $$renderer4.push(`<!---->`);
622
+ }
623
+ $$renderer4.push(`<!--]--></div>`);
624
+ }
625
+ });
626
+ $$renderer3.push(`<!----> `);
627
+ Card($$renderer3, {
628
+ title: "Danger Zone",
629
+ children: ($$renderer4) => {
630
+ $$renderer4.push(`<p class="danger-description svelte-1gp6n77">Clear all saved configuration data from this device.</p> `);
631
+ Button($$renderer4, {
632
+ classes: "btn-danger btn-sm",
633
+ onclick: clearConfiguration,
634
+ text: "Clear Configuration"
635
+ });
636
+ $$renderer4.push(`<!---->`);
637
+ }
638
+ });
639
+ $$renderer3.push(`<!----></aside></div></div></main>`);
640
+ }
641
+ do {
642
+ $$settled = true;
643
+ $$inner_renderer = $$renderer2.copy();
644
+ $$render_inner($$inner_renderer);
645
+ } while (!$$settled);
646
+ $$renderer2.subsume($$inner_renderer);
647
+ });
648
+ }
649
+
650
+ export { _page as default };
651
+ //# sourceMappingURL=_page.svelte-CxWcQ0Am.js.map