@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 @@
1
+ function t(r){if(!r||typeof r!="object")return!1;const e=r;return typeof e.apiKey!="string"||e.apiKey.length===0||e.deviceToken!==void 0&&e.deviceToken!==null&&typeof e.deviceToken!="string"||e.serverUrl!==void 0&&e.serverUrl!==null&&typeof e.serverUrl!="string"||e.lastUpdated!==void 0&&e.lastUpdated!==null&&typeof e.lastUpdated!="string"?!1:(e.deviceToken===void 0&&(e.deviceToken=null),e.serverUrl===void 0&&(e.serverUrl=null),e.lastUpdated===void 0&&(e.lastUpdated=null),!0)}export{t as i};
@@ -0,0 +1 @@
1
+ import{a as o,f as i,d as Tt,i as Dt,s as H,c as K,b as R}from"./r0JawsZc.js";import{c as r,a6 as It,r as a,t as P,o as fe,a7 as Xe,a8 as Ct,z as e,y as L,a9 as Fe,p as Pt,q as At,a0 as Gt,aa as Ht,s as n,w as Ot,A as Ze,f as O,B as k}from"./CZHsSL_X.js";import{i as y}from"./B8XegpSE.js";import{P as Ee,e as Se,i as Ke,A as $e,I as Bt,B as et,h as Ce}from"./B5NAKyil.js";import{s as Ut,a as te,r as Pe}from"./CQjSATpv.js";import{p as ye,b as Ft}from"./Bu1aqm5j.js";function Kt(B,t){return B==="Bash"?t.command||t.description||"":B==="Read"||B==="Edit"||B==="Write"?t.file_path||"":B==="Grep"||B==="Glob"?t.pattern||"":B==="Agent"?t.description||t.prompt?.slice(0,50)||"":JSON.stringify(t).slice(0,60)}var Rt=i('<div><div class="accordion-content svelte-19akzbp"><!></div></div>');function Ae(B,t){let v=ye(t,"expand",3,!1);var c=Rt();let u;var he=r(c),Ge=r(he);Ut(Ge,()=>t.children??It),a(he),a(c),P(()=>u=te(c,1,`accordion ${t.classes??""??""}`,"svelte-19akzbp",u,{expanded:v()})),o(B,c)}var Lt=["forEach","isDisjointFrom","isSubsetOf","isSupersetOf"],Mt=["difference","intersection","symmetricDifference","union"],tt=!1;class Te extends Set{#s=new Map;#e=fe(0);#t=fe(0);#a=Xe||-1;constructor(t){if(super(),t){for(var v of t)super.add(v);this.#t.v=super.size}tt||this.#o()}#r(t){return Xe===this.#a?fe(t):Ct(t)}#o(){tt=!0;var t=Te.prototype,v=Set.prototype;for(const c of Lt)t[c]=function(...u){return e(this.#e),v[c].apply(this,u)};for(const c of Mt)t[c]=function(...u){e(this.#e);var he=v[c].apply(this,u);return new Te(he)}}has(t){var v=super.has(t),c=this.#s,u=c.get(t);if(u===void 0){if(!v)return e(this.#e),!1;u=this.#r(!0),c.set(t,u)}return e(u),v}add(t){return super.has(t)||(super.add(t),L(this.#t,super.size),Fe(this.#e)),this}delete(t){var v=super.delete(t),c=this.#s,u=c.get(t);return u!==void 0&&(c.delete(t),L(u,!1)),v&&(L(this.#t,super.size),Fe(this.#e)),v}clear(){if(super.size!==0){super.clear();var t=this.#s;for(var v of t.values())L(v,!1);t.clear(),L(this.#t,0),Fe(this.#e)}}keys(){return this.values()}values(){return e(this.#e),super.values()}entries(){return e(this.#e),super.entries()}[Symbol.iterator](){return this.keys()}get size(){return e(this.#t)}}var Nt=i('<div class="chatview-header svelte-1tpzk7f"><div class="chatview-header-left svelte-1tpzk7f"><!> <span class="chatview-title svelte-1tpzk7f">Session</span></div> <div class="chatview-header-right svelte-1tpzk7f"><span><span class="connection-status-dot"></span> </span> <!></div></div>'),Wt=i('<div class="chatview-empty svelte-1tpzk7f"><p class="chatview-empty-text svelte-1tpzk7f">Waiting for session messages...</p></div>'),jt=i('<div class="chat-bubble chat-bubble-user"></div>'),qt=i('<div class="chat-message chat-message-user"><div><!> <div class="chat-timestamp"> </div></div> <!></div>'),Jt=i('<div class="chat-tool-body"> </div>'),Vt=i('<div class="chat-tool-card svelte-1tpzk7f"><div class="chat-tool-header" role="button" tabindex="0"><span>&#9654;</span> <!> <span class="chat-tool-description"> </span></div> <!></div>'),Yt=i('<div class="chat-tool-group-body svelte-1tpzk7f"></div>'),Qt=i('<div class="chat-tool-group svelte-1tpzk7f"><div class="chat-tool-group-header svelte-1tpzk7f" role="button" tabindex="0"><span>&#9654;</span> <span class="chat-tool-group-summary svelte-1tpzk7f"> </span></div> <!></div>'),Xt=i('<div class="chat-bubble chat-bubble-assistant"></div>'),Zt=i('<div class="chat-tool-body"> </div>'),$t=i('<div class="chat-tool-card"><div class="chat-tool-header" role="button" tabindex="0"><span>&#9654;</span> <!> <span class="chat-tool-description"> </span></div> <!></div>'),es=i('<div class="chat-thinking-body"></div>'),ts=i('<div class="chat-thinking"><div class="chat-thinking-header" role="button" tabindex="0"> </div> <!></div>'),ss=i('<div class="chat-message chat-message-assistant"><!> <div><!> <div class="chat-timestamp"> </div></div></div>'),as=i("<div> </div>"),rs=i('<div class="chat-message chat-message-system"><div class="chat-tool-card"><div class="chat-tool-header" role="button" tabindex="0"><span>&#9654;</span> <!></div> <!></div></div>'),os=i('<div class="chat-message chat-message-system"><div class="chat-bubble chat-bubble-system"></div></div>'),ns=i('<div class="chatview-ended svelte-1tpzk7f"><!> <span>Session has ended</span></div>'),is=i('<div class="chatview-details-toggle svelte-1tpzk7f"><button type="button"><span class="chatview-details-icon svelte-1tpzk7f"> </span> </button></div> <!> <!>',1),ls=i('<div class="chat-input-bar"><!> <!></div>'),vs=i('<div class="chatview-wrapper svelte-1tpzk7f"><!> <div class="chat-container chatview-scroll svelte-1tpzk7f"><!></div> <!></div>');function ms(B,t){Pt(t,!0);const v=ye(t,"connectionState",3,"idle"),c=ye(t,"newestFirst",3,!1),u=ye(t,"sessionEnded",3,!1),he=ye(t,"showHeader",3,!1),Ge=ye(t,"showInput",3,!0),Re=k(()=>u()||(t.sendDisabled!==void 0?t.sendDisabled:v()!=="connected"));let be=fe(""),J=fe(null),He=fe(!0);const se=new Te,De=new Te,Le="shooter:chatview:showDetails";let A=fe(At(localStorage.getItem(Le)==="true"));function st(){L(A,!e(A)),localStorage.setItem(Le,String(e(A)))}function at(s,f){const h=[];let m=[],G=0;function T(){if(m.length!==0){if(m.length===1)h.push(m[0]);else{const W=m.map(ae=>ae.toolName),we=[...new Set(W)],pe=`Used ${m.length} tools: ${we.join(", ")}`;h.push({groupId:`toolgroup-${f}-${G}`,summary:pe,tools:m,type:"tool_group"}),G++}m=[]}}for(const W of s)W.type==="tool_use"?m.push(W):(T(),h.push(W));return T(),h}function rt(s){return s.type==="tool_group"}function ot(s){return s.parts.every(f=>f.type==="tool_result")}Gt(()=>{t.messages,nt()});async function nt(){!e(He)||!e(J)||(await Ht(),c()?e(J).scrollTop=0:e(J).scrollTop=e(J).scrollHeight)}function it(){if(!e(J))return;const{clientHeight:s,scrollHeight:f,scrollTop:h}=e(J);c()?L(He,h<100):L(He,f-h-s<100)}function Me(){const s=e(be).trim();s&&(L(be,""),t.onSendInput?.(s))}function lt(s){s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),Me())}function V(s){se.has(s)?se.delete(s):se.add(s)}function Ne(s){De.has(s)?De.delete(s):De.add(s)}function We(s){return new Date(s).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function je(s){return Kt(s.toolName,s.input)}function qe(s){return JSON.stringify(s,null,2)}function vt(s){return s.type==="tool_use"}var Oe=vs(),Je=r(Oe);{var dt=s=>{var f=Nt(),h=r(f),m=r(h);Ee(m,{text:"LIVE",classes:"pill-live"}),Ze(2),a(h);var G=n(h,2),T=r(G),W=n(r(T));a(T);var we=n(T,2);{var pe=ae=>{et(ae,{classes:"btn-danger btn-sm",onclick:()=>{t.onCancel()},text:"Cancel"})};y(we,ae=>{!u()&&t.onCancel&&ae(pe)})}a(G),a(f),P(()=>{te(T,1,`connection-status ${v()??""}`,"svelte-1tpzk7f"),H(W,` ${v()==="connected"?"Connected":v()==="connecting"||v()==="reconnecting"?"Connecting...":"Disconnected"}`)}),o(s,f)};y(Je,s=>{he()&&s(dt)})}var xe=n(Je,2),ct=r(xe);{var ut=s=>{var f=Wt();o(s,f)},ft=s=>{var f=is(),h=O(f),m=r(h);let G;var T=r(m),W=r(T,!0);a(T);var we=n(T);a(m),a(h);var pe=n(h,2);Se(pe,17,()=>t.messages,re=>re.id,(re,b)=>{var Ie=K(),mt=O(Ie);{var gt=j=>{var M=qt(),Y=r(M),oe=r(Y);Se(oe,17,()=>e(b).parts,Ke,(q,d)=>{var x=K(),me=O(x);{var ze=ie=>{var le=jt();Ce(le,()=>Pe(e(d).content),!0),a(le),o(ie,le)};y(me,ie=>{e(d).type==="text"&&ie(ze)})}o(q,x)});var ne=n(oe,2),Q=r(ne,!0);a(ne),a(Y);var _e=n(Y,2);$e(_e,{alt:"User",name:"User",size:"small",classes:"avatar-user"}),a(M),P(q=>H(Q,q),[()=>We(e(b).timestamp)]),o(j,M)},kt=j=>{var M=ss(),Y=r(M);$e(Y,{alt:"Claude",name:"Claude",size:"small",classes:"avatar-assistant"});var oe=n(Y,2),ne=r(oe);Se(ne,17,()=>at(e(b).parts,e(b).id),Ke,(q,d)=>{var x=K(),me=O(x);{var ze=z=>{const p=k(()=>e(A)||De.has(e(d).groupId));var w=Qt(),g=r(w),_=r(g);let N;var D=n(_,2),I=r(D,!0);a(D),a(g);var $=n(g,2);{var ee=C=>{var l=Yt();Se(l,21,()=>e(d).tools,U=>U.id,(U,E)=>{const ve=k(()=>e(E).id),de=k(()=>e(A)||se.has(e(ve)));var F=Vt(),S=r(F),ce=r(S);let ke;var Ve=n(ce,2);Ee(Ve,{get text(){return e(E).toolName},classes:"pill-tool-name"});var Ye=n(Ve,2),bt=r(Ye,!0);a(Ye),a(S);var xt=n(S,2);Ae(xt,{get expand(){return e(de)},children:(ue,ds)=>{var Qe=K(),wt=O(Qe);{var zt=Be=>{var Ue=Jt(),Et=r(Ue,!0);a(Ue),P(St=>H(Et,St),[()=>qe(e(E).input)]),o(Be,Ue)};y(wt,Be=>{e(de)&&Be(zt)})}o(ue,Qe)},$$slots:{default:!0}}),a(F),P(ue=>{ke=te(ce,1,"chat-tool-chevron",null,ke,{expanded:e(de)}),H(bt,ue)},[()=>je(e(E))]),R("click",S,()=>{V(e(ve))}),R("keydown",S,ue=>{(ue.key==="Enter"||ue.key===" ")&&(ue.preventDefault(),V(e(ve)))}),o(U,F)}),a(l),o(C,l)};y($,C=>{e(p)&&C(ee)})}a(w),P(()=>{N=te(_,1,"chat-tool-group-chevron svelte-1tpzk7f",null,N,{expanded:e(p)}),H(I,e(d).summary)}),R("click",g,()=>{Ne(e(d).groupId)}),R("keydown",g,C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),Ne(e(d).groupId))}),o(z,w)},ie=k(()=>rt(e(d))),le=z=>{var p=Xt();Ce(p,()=>Pe(e(d).content),!0),a(p),o(z,p)},X=z=>{const p=k(()=>e(d).id),w=k(()=>e(A)||se.has(e(p)));var g=$t(),_=r(g),N=r(_);let D;var I=n(N,2);Ee(I,{get text(){return e(d).toolName},classes:"pill-tool-name"});var $=n(I,2),ee=r($,!0);a($),a(_);var C=n(_,2);Ae(C,{get expand(){return e(w)},children:(l,U)=>{var E=K(),ve=O(E);{var de=F=>{var S=Zt(),ce=r(S,!0);a(S),P(ke=>H(ce,ke),[()=>qe(e(d).input)]),o(F,S)};y(ve,F=>{e(w)&&F(de)})}o(l,E)},$$slots:{default:!0}}),a(g),P(l=>{D=te(N,1,"chat-tool-chevron",null,D,{expanded:e(w)}),H(ee,l)},[()=>je(e(d))]),R("click",_,()=>{V(e(p))}),R("keydown",_,l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),V(e(p)))}),o(z,g)},Z=k(()=>vt(e(d))),ge=z=>{const p=k(()=>`thinking-${e(b).id}`),w=k(()=>e(A)||se.has(e(p)));var g=ts(),_=r(g),N=r(_);a(_);var D=n(_,2);Ae(D,{get expand(){return e(w)},children:(I,$)=>{var ee=K(),C=O(ee);{var l=U=>{var E=es();Ce(E,()=>Pe(e(d).content),!0),a(E),o(U,E)};y(C,U=>{e(w)&&U(l)})}o(I,ee)},$$slots:{default:!0}}),a(g),P(()=>H(N,`💭 Thinking... ${e(w)?"&#9660;":"&#9654;"}`)),R("click",_,()=>{V(e(p))}),R("keydown",_,I=>{(I.key==="Enter"||I.key===" ")&&(I.preventDefault(),V(e(p)))}),o(z,g)};y(me,z=>{e(ie)?z(ze):e(d).type==="text"?z(le,1):e(Z)?z(X,2):e(d).type==="thinking"&&z(ge,3)})}o(q,x)});var Q=n(ne,2),_e=r(Q,!0);a(Q),a(oe),a(M),P(q=>H(_e,q),[()=>We(e(b).timestamp)]),o(j,M)},yt=j=>{var M=K(),Y=O(M);{var oe=Q=>{var _e=K(),q=O(_e);Se(q,17,()=>e(b).parts,Ke,(d,x)=>{var me=K(),ze=O(me);{var ie=X=>{var Z=K(),ge=O(Z);{var z=p=>{const w=k(()=>`result-${e(x).toolUseId}`),g=k(()=>se.has(e(w)));var _=rs(),N=r(_),D=r(N),I=r(D);let $;var ee=n(I,2);{let l=k(()=>e(x).isError?"❌ Tool Error":"✅ Tool Result"),U=k(()=>e(x).isError?"pill-tool-error":"pill-tool-success");Ee(ee,{get text(){return e(l)},get classes(){return e(U)}})}a(D);var C=n(D,2);Ae(C,{get expand(){return e(g)},children:(l,U)=>{var E=K(),ve=O(E);{var de=F=>{var S=as();let ce;var ke=r(S,!0);a(S),P(()=>{ce=te(S,1,"chat-tool-result",null,ce,{"chat-tool-result-success":!e(x).isError,"chat-tool-result-error":e(x).isError}),H(ke,e(x).output)}),o(F,S)};y(ve,F=>{e(g)&&F(de)})}o(l,E)},$$slots:{default:!0}}),a(N),a(_),P(()=>$=te(I,1,"chat-tool-chevron",null,$,{expanded:e(g)})),R("click",D,()=>{V(e(w))}),R("keydown",D,l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),V(e(w)))}),o(p,_)};y(ge,p=>{e(A)&&p(z)})}o(X,Z)},le=X=>{var Z=os(),ge=r(Z);Ce(ge,()=>Pe(e(x).content),!0),a(ge),a(Z),o(X,Z)};y(ze,X=>{e(x).type==="tool_result"?X(ie):e(x).type==="text"&&X(le,1)})}o(d,me)}),o(Q,_e)},ne=k(()=>e(A)||!ot(e(b)));y(Y,Q=>{e(ne)&&Q(oe)})}o(j,M)};y(mt,j=>{e(b).role==="user"?j(gt):e(b).role==="assistant"?j(kt,1):e(b).role==="system"&&j(yt,2)})}o(re,Ie)});var ae=n(pe,2);{var _t=re=>{var b=ns(),Ie=r(b);Ee(Ie,{text:"ENDED",classes:"pill-badge-ended"}),Ze(2),a(b),o(re,b)};y(ae,re=>{u()&&re(_t)})}P(()=>{G=te(m,1,"chatview-details-btn svelte-1tpzk7f",null,G,{active:e(A)}),H(W,e(A)?"&#9660;":"&#9654;"),H(we,` ${e(A)?"Hide details":"Show details"}`)}),R("click",m,st),o(s,f)};y(ct,s=>{t.messages.length===0?s(ut):s(ft,-1)})}a(xe),Ft(xe,s=>L(J,s),()=>e(J));var ht=n(xe,2);{var pt=s=>{var f=ls(),h=r(f);{let G=k(()=>u()?"Session ended":"Send a message... (Shift+Enter for new line)");Bt(h,{dataType:"text",useTextArea:!0,get placeholder(){return e(G)},get disable(){return e(Re)},onKeyDown:lt,classes:"chat-input-field",get value(){return e(be)},set value(T){L(be,T,!0)}})}var m=n(h,2);{let G=k(()=>e(Re)||!e(be).trim());et(m,{classes:"btn-primary btn-sm",get disabled(){return e(G)},onclick:Me,text:"Send"})}a(f),o(s,f)};y(ht,s=>{Ge()&&s(pt)})}a(Oe),Dt("scroll",xe,it),o(B,Oe),Ot()}Tt(["click","keydown"]);export{ms as C};
@@ -0,0 +1,41 @@
1
+ import{a,f as h}from"./r0JawsZc.js";import{t as d,z as c,r as k,B as g}from"./CZHsSL_X.js";import{h as p,d as v}from"./B5NAKyil.js";import{a as w}from"./CQjSATpv.js";import{p as t}from"./Bu1aqm5j.js";const u=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
2
+ <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/>
3
+ <line x1="12" y1="9" x2="12" y2="13"/>
4
+ <line x1="12" y1="17" x2="12.01" y2="17"/>
5
+ </svg>
6
+ `,x=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
7
+ <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/>
8
+ <path d="M13.73 21a2 2 0 0 1-3.46 0"/>
9
+ </svg>
10
+ `,f=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
11
+ <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>
12
+ <polyline points="22 4 12 14.01 9 11.01"/>
13
+ </svg>
14
+ `,m=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
15
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
16
+ <polyline points="14 2 14 8 20 8"/>
17
+ </svg>
18
+ `,y=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
19
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
20
+ </svg>
21
+ `,C=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
22
+ <polygon points="5 3 19 12 5 21 5 3"/>
23
+ </svg>
24
+ `,B=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
25
+ <path d="M23 4v6h-6M1 20v-6h6"/>
26
+ <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
27
+ </svg>
28
+ `,M=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
29
+ <circle cx="12" cy="12" r="3"/>
30
+ <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/>
31
+ </svg>
32
+ `,j=`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg>
33
+ `,z=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
34
+ <path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/>
35
+ </svg>
36
+ `,V=`<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
37
+ <circle cx="12" cy="12" r="10"/>
38
+ <line x1="15" y1="9" x2="9" y2="15"/>
39
+ <line x1="9" y1="9" x2="15" y2="15"/>
40
+ </svg>
41
+ `;var A=h('<span role="img" aria-hidden="true"></span>');function I(r,e){const i={"alert-triangle":u,bell:x,"check-circle":f,file:m,folder:y,play:C,refresh:B,settings:M,terminal:j,tool:z,"x-circle":V},s=t(e,"class",3,""),o=t(e,"size",3,16),l=g(()=>i[e.name]||"");var n=A();p(n,()=>c(l),!0),k(n),d(()=>{w(n,1,`icon ${s()??""}`,"svelte-1worgqe"),v(n,`width: ${o()??""}px; height: ${o()??""}px;`)}),a(r,n)}export{I};
@@ -0,0 +1 @@
1
+ import{a as n,f as o}from"./r0JawsZc.js";import{t as i}from"./CZHsSL_X.js";import{s as m}from"./B5NAKyil.js";import{a as c}from"./CQjSATpv.js";const f=5e3;function g(t){try{sessionStorage.removeItem(t)}catch{}}function S(t,e=f){try{const s=sessionStorage.getItem(t);if(!s)return null;const{data:a,timestamp:r}=JSON.parse(s);return Date.now()-r>e?null:a}catch{return null}}function v(t,e){try{sessionStorage.setItem(t,JSON.stringify({data:e,timestamp:Date.now()}))}catch{}}var l=o("<div></div>");function _(t,e){var s=l();i(()=>{c(s,1,`shimmer ${e.classes??""??""}`,"svelte-4rk0dx"),m(s,"data-pw",typeof e.testId=="string"?e.testId:null)}),n(t,s)}export{_ as S,g as c,S as g,v as s};
@@ -0,0 +1,2 @@
1
+ import{af as Z,ad as ee,a6 as z,ae as ue,ag as le,ah as ce,z as q,y as de,ai as he,G as _e,a8 as te,I as pe,a9 as $,aj as N,i as c,h as _,J as m,ak as G,b as ve,k as re,al as ge,am as J,an as v,a as y,ao as I,ap as x,aq as se,ar as me,as as L,at as F,au as K,av as be,aw as ye,ax as ne,F as ie,ay as Ee,az as w,e as S,A as Te,n as we,aA as M,l as Ae,E as ke,aB as Ne,aC as Se,aD as Me,aE as Re,j as P,aF as De,aG as Oe,aH as Ie,aI as Le,aJ as Fe,aK as Ce,aL as B,C as ae,ab as xe,g as Pe,aM as H,d as R,aN as Be,aO as He,aP as Ve,aQ as je,p as Ue,aR as We,aS as qe,w as Ye,aT as ze,aU as $e}from"./CZHsSL_X.js";let D=!1,V=Symbol();function ut(t,e,r){const n=r[e]??={store:null,source:ue(void 0),unsubscribe:z};if(n.store!==t&&!(V in r))if(n.unsubscribe(),n.store=t??null,t==null)n.source.v=void 0,n.unsubscribe=z;else{var i=!0;n.unsubscribe=le(t,s=>{i?n.source.v=s:de(n.source,s)}),i=!1}return t&&V in r?ce(t):q(n.source)}function lt(){const t={};function e(){Z(()=>{for(var r in t)t[r].unsubscribe();ee(t,V,{enumerable:!1,value:!0})})}return[t,e]}function ct(t){var e=D;try{return D=!1,[t(),D]}finally{D=e}}function Ge(t){let e=0,r=te(0),n;return()=>{he()&&(q(r),_e(()=>(e===0&&(n=pe(()=>t(()=>$(r)))),e+=1,()=>{N(()=>{e-=1,e===0&&(n?.(),n=void 0,$(r))})})))}}var Je=Ae|ke;function Ke(t,e,r,n){new Qe(t,e,r,n)}class Qe{parent;is_pending=!1;transform_error;#e;#n=_?c:null;#t;#a;#r;#i=null;#s=null;#o=null;#f=null;#c=0;#l=0;#d=!1;#p=new Set;#v=new Set;#u=null;#b=Ge(()=>(this.#u=te(this.#c),()=>{this.#u=null}));constructor(e,r,n,i){this.#e=e,this.#t=r,this.#a=s=>{var a=m;a.b=this,a.f|=G,n(s)},this.parent=m.b,this.transform_error=i??this.parent?.transform_error??(s=>s),this.#r=ve(()=>{if(_){const s=this.#n;re();const a=s.data===ge;if(s.data.startsWith(J)){const o=JSON.parse(s.data.slice(J.length));this.#E(o)}else a?this.#T():this.#y()}else this.#g()},Je),_&&(this.#e=c)}#y(){try{this.#i=v(()=>this.#a(this.#e))}catch(e){this.error(e)}}#E(e){const r=this.#t.failed;r&&(this.#o=v(()=>{r(this.#e,()=>e,()=>()=>{})}))}#T(){const e=this.#t.pending;e&&(this.is_pending=!0,this.#s=v(()=>e(this.#e)),N(()=>{var r=this.#f=document.createDocumentFragment(),n=y();r.append(n),this.#i=this.#_(()=>v(()=>this.#a(n))),this.#l===0&&(this.#e.before(r),this.#f=null,I(this.#s,()=>{this.#s=null}),this.#h(x))}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#c=0,this.#i=v(()=>{this.#a(this.#e)}),this.#l>0){var e=this.#f=document.createDocumentFragment();se(this.#i,e);const r=this.#t.pending;this.#s=v(()=>r(this.#e))}else this.#h(x)}catch(r){this.error(r)}}#h(e){this.is_pending=!1,e.transfer_effects(this.#p,this.#v)}defer_effect(e){me(e,this.#p,this.#v)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#t.pending}#_(e){var r=m,n=ne,i=ie;L(this.#r),F(this.#r),K(this.#r.ctx);try{return be.ensure(),e()}catch(s){return ye(s),null}finally{L(r),F(n),K(i)}}#m(e,r){if(!this.has_pending_snippet()){this.parent&&this.parent.#m(e,r);return}this.#l+=e,this.#l===0&&(this.#h(r),this.#s&&I(this.#s,()=>{this.#s=null}),this.#f&&(this.#e.before(this.#f),this.#f=null))}update_pending_count(e,r){this.#m(e,r),this.#c+=e,!(!this.#u||this.#d)&&(this.#d=!0,N(()=>{this.#d=!1,this.#u&&Ee(this.#u,this.#c)}))}get_effect_pending(){return this.#b(),q(this.#u)}error(e){var r=this.#t.onerror;let n=this.#t.failed;if(!r&&!n)throw e;this.#i&&(w(this.#i),this.#i=null),this.#s&&(w(this.#s),this.#s=null),this.#o&&(w(this.#o),this.#o=null),_&&(S(this.#n),Te(),S(we()));var i=!1,s=!1;const a=()=>{if(i){Se();return}i=!0,s&&Ne(),this.#o!==null&&I(this.#o,()=>{this.#o=null}),this.#_(()=>{this.#g()})},f=o=>{try{s=!0,r?.(o,a),s=!1}catch(u){M(u,this.#r&&this.#r.parent)}n&&(this.#o=this.#_(()=>{try{return v(()=>{var u=m;u.b=this,u.f|=G,n(this.#e,()=>o,()=>a)})}catch(u){return M(u,this.#r.parent),null}}))};N(()=>{var o;try{o=this.transform_error(e)}catch(u){M(u,this.#r&&this.#r.parent);return}o!==null&&typeof o=="object"&&typeof o.then=="function"?o.then(f,u=>M(u,this.#r&&this.#r.parent)):f(o)})}}function dt(t){return t.endsWith("capture")&&t!=="gotpointercapture"&&t!=="lostpointercapture"}const Xe=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"];function ht(t){return Xe.includes(t)}const Ze={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"};function _t(t){return t=t.toLowerCase(),Ze[t]??t}const et=["touchstart","touchmove"];function tt(t){return et.includes(t)}const k=Symbol("events"),oe=new Set,j=new Set;function pt(t){if(!_)return;t.removeAttribute("onload"),t.removeAttribute("onerror");const e=t.__e;e!==void 0&&(t.__e=void 0,queueMicrotask(()=>{t.isConnected&&t.dispatchEvent(e)}))}function rt(t,e,r,n={}){function i(s){if(n.capture||U.call(e,s),!s.cancelBubble)return Me(()=>r?.call(this,s))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?N(()=>{e.addEventListener(t,i,n)}):e.addEventListener(t,i,n),i}function vt(t,e,r,n,i){var s={capture:n,passive:i},a=rt(t,e,r,s);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&Z(()=>{e.removeEventListener(t,a,s)})}function gt(t,e,r){(e[k]??={})[t]=r}function mt(t){for(var e=0;e<t.length;e++)oe.add(t[e]);for(var r of j)r(t)}let Q=null;function U(t){var e=this,r=e.ownerDocument,n=t.type,i=t.composedPath?.()||[],s=i[0]||t.target;Q=t;var a=0,f=Q===t&&t[k];if(f){var o=i.indexOf(f);if(o!==-1&&(e===document||e===window)){t[k]=e;return}var u=i.indexOf(e);if(u===-1)return;o<=u&&(a=o)}if(s=i[a]||t.target,s!==e){ee(t,"currentTarget",{configurable:!0,get(){return s||r}});var E=ne,A=m;F(null),L(null);try{for(var g,d=[];s!==null;){var l=s.assignedSlot||s.parentNode||s.host||null;try{var h=s[k]?.[n];h!=null&&(!s.disabled||t.target===s)&&h.call(s,t)}catch(p){g?d.push(p):g=p}if(t.cancelBubble||l===e||l===null)break;s=l}if(g){for(let p of d)queueMicrotask(()=>{throw p});throw g}}finally{t[k]=e,delete t.currentTarget,F(E),L(A)}}}const st=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function nt(t){return st?.createHTML(t)??t}function it(t){var e=Re("template");return e.innerHTML=nt(t.replaceAll("<!>","<!---->")),e.content}function b(t,e){var r=m;r.nodes===null&&(r.nodes={start:t,end:e,a:null,t:null})}function bt(t,e){var r=(e&Oe)!==0,n=(e&Ie)!==0,i,s=!t.startsWith("<!>");return()=>{if(_)return b(c,null),c;i===void 0&&(i=it(s?t:"<!>"+t),r||(i=P(i)));var a=n||De?document.importNode(i,!0):i.cloneNode(!0);if(r){var f=P(a),o=a.lastChild;b(f,o)}else b(a,a);return a}}function yt(t=""){if(!_){var e=y(t+"");return b(e,e),e}var r=c;return r.nodeType!==Fe?(r.before(r=y()),S(r)):Ce(r),b(r,r),r}function Et(){if(_)return b(c,null),c;var t=document.createDocumentFragment(),e=document.createComment(""),r=y();return t.append(e,r),b(e,r),t}function Tt(t,e){if(_){var r=m;((r.f&Le)===0||r.nodes.end===null)&&(r.nodes.end=c),re();return}t!==null&&t.before(e)}let X=!0;function wt(t,e){var r=e==null?"":typeof e=="object"?`${e}`:e;r!==(t.__t??=t.nodeValue)&&(t.__t=r,t.nodeValue=`${r}`)}function at(t,e){return fe(t,e)}function At(t,e){B(),e.intro=e.intro??!1;const r=e.target,n=_,i=c;try{for(var s=P(r);s&&(s.nodeType!==ae||s.data!==xe);)s=Pe(s);if(!s)throw H;R(!0),S(s);const a=fe(t,{...e,anchor:s});return R(!1),a}catch(a){if(a instanceof Error&&a.message.split(`
2
+ `).some(f=>f.startsWith("https://svelte.dev/e/")))throw a;return a!==H&&console.warn("Failed to hydrate: ",a),e.recover===!1&&Be(),B(),He(r),R(!1),at(t,e)}finally{R(n),S(i)}}const O=new Map;function fe(t,{target:e,anchor:r,props:n={},events:i,context:s,intro:a=!0,transformError:f}){B();var o=void 0,u=Ve(()=>{var E=r??e.appendChild(y());Ke(E,{pending:()=>{}},d=>{Ue({});var l=ie;if(s&&(l.c=s),i&&(n.$$events=i),_&&b(d,null),X=a,o=t(d,n)||{},X=!0,_&&(m.nodes.end=c,c===null||c.nodeType!==ae||c.data!==We))throw qe(),H;Ye()},f);var A=new Set,g=d=>{for(var l=0;l<d.length;l++){var h=d[l];if(!A.has(h)){A.add(h);var p=tt(h);for(const C of[e,document]){var T=O.get(C);T===void 0&&(T=new Map,O.set(C,T));var Y=T.get(h);Y===void 0?(C.addEventListener(h,U,{passive:p}),T.set(h,1)):T.set(h,Y+1)}}}};return g(je(oe)),j.add(g),()=>{for(var d of A)for(const p of[e,document]){var l=O.get(p),h=l.get(d);--h==0?(p.removeEventListener(d,U),l.delete(d),l.size===0&&O.delete(p)):l.set(d,h)}j.delete(g),E!==r&&E.parentNode?.removeChild(E)}});return W.set(o,u),o}let W=new WeakMap;function kt(t,e){const r=W.get(t);return r?(W.delete(t),r(e)):Promise.resolve()}class Nt{anchor;#e=new Map;#n=new Map;#t=new Map;#a=new Set;#r=!0;constructor(e,r=!0){this.anchor=e,this.#r=r}#i=e=>{if(this.#e.has(e)){var r=this.#e.get(e),n=this.#n.get(r);if(n)ze(n),this.#a.delete(r);else{var i=this.#t.get(r);i&&(this.#n.set(r,i.effect),this.#t.delete(r),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),n=i.effect)}for(const[s,a]of this.#e){if(this.#e.delete(s),s===e)break;const f=this.#t.get(a);f&&(w(f.effect),this.#t.delete(a))}for(const[s,a]of this.#n){if(s===r||this.#a.has(s))continue;const f=()=>{if(Array.from(this.#e.values()).includes(s)){var u=document.createDocumentFragment();se(a,u),u.append(y()),this.#t.set(s,{effect:a,fragment:u})}else w(a);this.#a.delete(s),this.#n.delete(s)};this.#r||!n?(this.#a.add(s),I(a,f,!1)):f()}}};#s=e=>{this.#e.delete(e);const r=Array.from(this.#e.values());for(const[n,i]of this.#t)r.includes(n)||(w(i.effect),this.#t.delete(n))};ensure(e,r){var n=x,i=$e();if(r&&!this.#n.has(e)&&!this.#t.has(e))if(i){var s=document.createDocumentFragment(),a=y();s.append(a),this.#t.set(e,{effect:v(()=>r(a)),fragment:s})}else this.#n.set(e,v(()=>r(this.anchor)));if(this.#e.set(n,e),i){for(const[f,o]of this.#n)f===e?n.unskip_effect(o):n.skip_effect(o);for(const[f,o]of this.#t)f===e?n.unskip_effect(o.effect):n.skip_effect(o.effect);n.oncommit(this.#i),n.ondiscard(this.#s)}else _&&(this.anchor=c),this.#i(n)}}const ot="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(ot);export{Nt as B,Tt as a,gt as b,Et as c,mt as d,ct as e,bt as f,lt as g,ut as h,vt as i,At as j,b as k,X as l,at as m,dt as n,rt as o,_t as p,ht as q,pt as r,wt as s,yt as t,kt as u};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.D2YR8tTD.js","../chunks/r0JawsZc.js","../chunks/CZHsSL_X.js","../chunks/CQjSATpv.js","../assets/markdown.Dc-OSJWY.css","../chunks/B-K5Sh65.js","../chunks/BYqGCrTe.js","../assets/0.BhZOCxO4.css","../nodes/1.B3m6rO4C.js","../chunks/B8XegpSE.js","../chunks/BOYo8yTr.js","../assets/1.BYutk3aU.css","../nodes/2.CyRB2euU.js","../chunks/B5NAKyil.js","../chunks/Bu1aqm5j.js","../assets/Phone.FQEfwCX2.css","../chunks/UJOiqIYE.js","../chunks/DSU1n5N_.js","../chunks/CSoRdFvv.js","../chunks/DjsDGxCa.js","../chunks/BLszSzTT.js","../assets/2.CAShZ7lQ.css","../nodes/3.3yohCM25.js","../assets/3.DGDHCVnW.css","../nodes/4.DEAcwl7l.js","../chunks/C4mLaWWx.js","../assets/4.BFUut--w.css","../nodes/5.C6bLGWQR.js","../chunks/DVkn4r72.js","../assets/ChatView.CwWbzIL-.css","../assets/5.BTOx7yt7.css","../nodes/6.ByTzlA2D.js","../assets/6.eZGZN-BF.css","../nodes/7.BPMfwzd2.js","../chunks/PPVm8Dsz.js","../assets/7.DwS5ZHBh.css"])))=>i.map(i=>d[i]);
2
+ import{_}from"../chunks/PPVm8Dsz.js";import{h as j,k as G,b as H,l as q,m as J,n as K,e as Q,d as k,ab as U,i as W,y as R,Y as X,z as u,ac as Z,ad as $,ae as tt,p as et,_ as rt,a0 as at,u as st,aa as ot,f as b,s as nt,w as it,o as O,c as ct,r as ut,t as _t,B as p}from"../chunks/CZHsSL_X.js";import{B as mt,j as dt,m as lt,u as ft,a as v,c as T,f as w,t as ht,s as vt}from"../chunks/r0JawsZc.js";import{i as A}from"../chunks/B8XegpSE.js";import{p as x,b as D}from"../chunks/Bu1aqm5j.js";function I(s,t,a){var n;j&&(n=W,G());var o=new mt(s);H(()=>{var e=t()??null;if(j){var r=J(n),c=r===U,P=e!==null;if(c!==P){var g=K();Q(g),o.anchor=g,k(!1),o.ensure(e,e&&(f=>a(f,e))),k(!0);return}}o.ensure(e,e&&(f=>a(f,e)))},q)}function gt(s){return class extends yt{constructor(t){super({component:s,...t})}}}class yt{#e;#t;constructor(t){var a=new Map,n=(e,r)=>{var c=tt(r,!1,!1);return a.set(e,c),c};const o=new Proxy({...t.props||{},$$events:{}},{get(e,r){return u(a.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===X?!0:(u(a.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,c){return R(a.get(r)??n(r,c),c),Reflect.set(e,r,c)}});this.#t=(t.hydrate?dt:lt)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&Z(),this.#e=o.$$events;for(const e of Object.keys(this.#t))e==="$set"||e==="$destroy"||e==="$on"||$(this,e,{get(){return this.#t[e]},set(r){this.#t[e]=r},enumerable:!0});this.#t.$set=e=>{Object.assign(o,e)},this.#t.$destroy=()=>{ft(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const n=(...o)=>a.call(this,...o);return this.#e[t].push(n),()=>{this.#e[t]=this.#e[t].filter(o=>o!==n)}}$destroy(){this.#t.$destroy()}}const It={};var Et=w('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),bt=w("<!> <!>",1);function Rt(s,t){et(t,!0);let a=x(t,"components",23,()=>[]),n=x(t,"data_0",3,null),o=x(t,"data_1",3,null);rt(()=>t.stores.page.set(t.page)),at(()=>{t.stores,t.page,t.constructors,a(),t.form,n(),o(),t.stores.page.notify()});let e=O(!1),r=O(!1),c=O(null);st(()=>{const i=t.stores.page.subscribe(()=>{u(e)&&(R(r,!0),ot().then(()=>{R(c,document.title||"untitled page",!0)}))});return R(e,!0),i});const P=p(()=>t.constructors[1]);var g=bt(),f=b(g);{var C=i=>{const m=p(()=>t.constructors[0]);var d=T(),y=b(d);I(y,()=>u(m),(l,h)=>{D(h(l,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(E,Ot)=>{var L=T(),N=b(L);I(N,()=>u(P),(Y,F)=>{D(F(Y,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),z=>a()[1]=z,()=>a()?.[1])}),v(E,L)},$$slots:{default:!0}}),E=>a()[0]=E,()=>a()?.[0])}),v(i,d)},S=i=>{const m=p(()=>t.constructors[0]);var d=T(),y=b(d);I(y,()=>u(m),(l,h)=>{D(h(l,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),E=>a()[0]=E,()=>a()?.[0])}),v(i,d)};A(f,i=>{t.constructors[1]?i(C):i(S,-1)})}var B=nt(f,2);{var M=i=>{var m=Et(),d=ct(m);{var y=l=>{var h=ht();_t(()=>vt(h,u(c))),v(l,h)};A(d,l=>{u(r)&&l(y)})}ut(m),v(i,m)};A(B,i=>{u(e)&&i(M)})}v(s,g),it()}const Lt=gt(Rt),jt=[()=>_(()=>import("../nodes/0.D2YR8tTD.js"),__vite__mapDeps([0,1,2,3,4,5,6,7]),import.meta.url),()=>_(()=>import("../nodes/1.B3m6rO4C.js"),__vite__mapDeps([8,1,2,9,10,5,6,11]),import.meta.url),()=>_(()=>import("../nodes/2.CyRB2euU.js"),__vite__mapDeps([12,1,2,9,13,3,4,14,15,10,5,16,17,18,19,20,21]),import.meta.url),()=>_(()=>import("../nodes/3.3yohCM25.js"),__vite__mapDeps([22,1,2,9,10,13,3,4,14,15,17,19,23]),import.meta.url),()=>_(()=>import("../nodes/4.DEAcwl7l.js"),__vite__mapDeps([24,1,2,9,13,3,4,14,15,10,5,25,16,17,18,19,20,26]),import.meta.url),()=>_(()=>import("../nodes/5.C6bLGWQR.js"),__vite__mapDeps([27,1,2,9,10,13,3,4,14,15,25,5,16,28,29,30]),import.meta.url),()=>_(()=>import("../nodes/6.ByTzlA2D.js"),__vite__mapDeps([31,1,2,9,13,3,4,14,15,10,5,16,17,18,19,20,32]),import.meta.url),()=>_(()=>import("../nodes/7.BPMfwzd2.js"),__vite__mapDeps([33,34,1,2,9,10,13,3,4,14,15,5,6,18,19,28,29,35]),import.meta.url)],kt=[],wt={"/":[2],"/config":[3],"/project":[4],"/session/[id]":[5],"/terminals":[6],"/terminals/[id]":[7]},V={handleError:(({error:s})=>{console.error(s)}),reroute:(()=>{}),transport:{}},Pt=Object.fromEntries(Object.entries(V.transport).map(([s,t])=>[s,t.decode])),Vt=Object.fromEntries(Object.entries(V.transport).map(([s,t])=>[s,t.encode])),Ct=!1,St=(s,t)=>Pt[s](t);export{St as decode,Pt as decoders,wt as dictionary,Vt as encoders,Ct as hash,V as hooks,It as matchers,jt as nodes,Lt as root,kt as server_loads};
@@ -0,0 +1 @@
1
+ import{l as o,a as r}from"../chunks/B-K5Sh65.js";export{o as load_css,r as start};
@@ -0,0 +1,2 @@
1
+ )�import{l as o,a as r}from"../chunks/B-K5Sh65.js";export{o as load_css,r as start};
2
+ 
@@ -0,0 +1 @@
1
+ import{a as j,f as A,s as z,d as H,b as M,g as V,h as W}from"../chunks/r0JawsZc.js";import{t as C,s as i,c as t,r as e,p as I,u as O,w as D,y as f,z as L,o as P}from"../chunks/CZHsSL_X.js";import{a as v,s as T}from"../chunks/CQjSATpv.js";import{g as E}from"../chunks/B-K5Sh65.js";import{p as F}from"../chunks/BYqGCrTe.js";var G=A('<div><span class="status-dot"></span> <span> </span></div>');function J(u,c){function s(a){switch(a){case"degraded":return"Degraded";case"error":return"Offline";case"healthy":return"Online";default:return"Checking"}}function p(a){switch(a){case"degraded":return"degraded";case"error":return"offline";case"healthy":return"online";default:return""}}var n=G(),r=i(t(n),2),d=t(r,!0);e(r),e(n),C((a,h)=>{v(n,1,`status-badge ${a??""}`),z(d,h)},[()=>p(c.status),()=>s(c.status)]),j(u,n)}var K=A('<div class="app"><header class="header"><div class="header-content"><a href="/" class="logo"><img src="/app-icon.png" alt="Shooter" class="logo-icon" width="24" height="24"/> <span class="logo-text">Shooter</span></a> <div class="nav-right svelte-12qhfyh"><!> <button aria-label="Settings"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button></div></div></header> <div class="content-area svelte-12qhfyh"><!></div> <nav class="bottom-tabs svelte-12qhfyh"><div class="bottom-tabs-inner svelte-12qhfyh"><a href="/"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"></path></svg> <span>Projects</span></a> <a href="/terminals"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" y1="19" x2="20" y2="19"></line></svg> <span>Terminals</span></a></div></nav></div>');function Y(u,c){I(c,!0);const s=()=>W(F,"$page",p),[p,n]=V();let r=P("unknown");O(()=>{d();const o=setInterval(()=>{d()},3e4);return()=>{clearInterval(o)}});async function d(){try{const o=await fetch("/api/health");if(!o.ok){f(r,"error");return}const l=await o.json();f(r,l.status==="healthy"||l.status==="degraded"||l.status==="error"?l.status:"unknown",!0)}catch{f(r,"error")}}var a=K(),h=t(a),m=t(h),y=i(t(m),2),k=t(y);J(k,{get status(){return L(r)}});var b=i(k,2);e(y),e(m),e(h);var g=i(h,2),$=t(g);T($,()=>c.children),e(g);var w=i(g,2),_=t(w),x=t(_);let S;var B=i(x,2);let q;e(_),e(w),e(a),C((o,l)=>{v(b,1,`btn-gear ${s().url.pathname==="/config"?"btn-gear-active":""}`,"svelte-12qhfyh"),S=v(x,1,"tab-item svelte-12qhfyh",null,S,o),q=v(B,1,"tab-item svelte-12qhfyh",null,q,l)},[()=>({active:s().url.pathname==="/"||s().url.pathname.startsWith("/project")||s().url.pathname.startsWith("/session")}),()=>({active:s().url.pathname.startsWith("/terminals")})]),M("click",b,()=>E("/config")),j(u,a),D(),n()}H(["click"]);export{Y as component};
@@ -0,0 +1 @@
1
+ import{d as P,b as x,a as i,g as V,f as q,s as w,h as C,t as d}from"../chunks/r0JawsZc.js";import{F as D,_ as J,a0 as k,I as K,a1 as j,a2 as L,z as S,a3 as M,V as N,a4 as O,p as Q,t as y,w as R,c as f,s as g,x as U,$ as W,r as v}from"../chunks/CZHsSL_X.js";import{i as $}from"../chunks/B8XegpSE.js";import{h as X}from"../chunks/BOYo8yTr.js";import{g as Y}from"../chunks/B-K5Sh65.js";import{p as Z}from"../chunks/BYqGCrTe.js";function ee(n=!1){const s=D,t=s.l.u;if(!t)return;let p=()=>M(s.s);if(n){let l=0,a={};const m=N(()=>{let c=!1;const u=s.s;for(const o in u)u[o]!==a[o]&&(a[o]=u[o],c=!0);return c&&l++,l});p=()=>S(m)}t.b.length&&J(()=>{G(s,p),j(t.b)}),k(()=>{const l=K(()=>t.m.map(L));return()=>{for(const a of l)typeof a=="function"&&a()}}),t.a.length&&k(()=>{G(s,p),j(t.a)})}function G(n,s){if(n.l.s)for(const t of n.l.s)S(t);s()}O();var te=q('<main class="error-page svelte-1j96wlh"><div class="error-content svelte-1j96wlh"><div class="error-code svelte-1j96wlh"> </div> <h1 class="error-title svelte-1j96wlh"><!></h1> <p class="error-message svelte-1j96wlh"><!></p> <div class="error-actions svelte-1j96wlh"><button class="error-btn svelte-1j96wlh">Go Home</button> <button class="error-btn error-btn-secondary svelte-1j96wlh">Go Back</button></div></div></main>');function ce(n,s){Q(s,!1);const t=()=>C(Z,"$page",p),[p,l]=V();ee();var a=te();X("1j96wlh",e=>{U(()=>{W.title="Error - Shooter"})});var m=f(a),c=f(m),u=f(c,!0);v(c);var o=g(c,2),T=f(o);{var z=e=>{var r=d("Page not found");i(e,r)},A=e=>{var r=d("Something went wrong");i(e,r)};$(T,e=>{t().status===404?e(z):e(A,-1)})}v(o);var h=g(o,2),B=f(h);{var E=e=>{var r=d();y(()=>w(r,t().error.message)),i(e,r)},F=e=>{var r=d("The page you're looking for doesn't exist or has been moved.");i(e,r)},H=e=>{var r=d("An unexpected error occurred. Try refreshing or going back.");i(e,r)};$(B,e=>{t().error?.message?e(E):t().status===404?e(F,1):e(H,-1)})}v(h);var _=g(h,2),b=f(_),I=g(b,2);v(_),v(m),v(a),y(()=>w(u,t().status)),x("click",b,()=>Y("/")),x("click",I,()=>{history.back()}),i(n,a),R(),l()}P(["click"]);export{ce as component};
@@ -0,0 +1 @@
1
+ import{a as f,f as u,s as S}from"../chunks/r0JawsZc.js";import{p as ue,o as g,q as pe,u as he,v as me,w as ge,x as _e,y as r,z as s,$ as ye,c as o,s as d,f as F,A as Ce,r as t,B as q,t as xe}from"../chunks/CZHsSL_X.js";import{i as E}from"../chunks/B8XegpSE.js";import{B as L,a as Se,e as J,i as be,P as Pe,s as $e}from"../chunks/B5NAKyil.js";import{h as je}from"../chunks/BOYo8yTr.js";import{g as Ie}from"../chunks/B-K5Sh65.js";import{g as ke,s as we,c as Ae,S as Ee}from"../chunks/UJOiqIYE.js";import{i as Le}from"../chunks/DSU1n5N_.js";import{E as D}from"../chunks/CSoRdFvv.js";import{I as Me}from"../chunks/DjsDGxCa.js";import"../chunks/CQjSATpv.js";import{f as Te}from"../chunks/BLszSzTT.js";var Be=u('<meta name="description" content="Claude Code sessions across all projects"/>'),Re=u("<!> Refresh",1),Ke=u('<div class="loading-container"></div>'),Ne=u('<a class="session-card"><div class="session-card-header"><div><h3 class="session-card-title"> </h3> <div class="session-card-subtitle"> </div></div> <!></div> <div class="session-stats"><span><strong> </strong> </span></div></a>'),Oe=u('<div style="text-align: center; padding: 1rem;"><!></div>'),ze=u('<div class="projects-container svelte-1uha8ag"></div> <!>',1),Fe=u('<main class="main"><div class="page-header svelte-1uha8ag"><div class="page-header-content svelte-1uha8ag"><div><h1 class="page-title svelte-1uha8ag">Projects</h1> <p class="page-description svelte-1uha8ag">Claude Code sessions across all projects</p></div> <div class="page-actions svelte-1uha8ag"><!></div></div></div> <!> <!></main>');function es(G,H){ue(H,!0);const V=1e4,M=20;let n=g(pe([])),p=g(!1),b=!1,h=g(null),C=null,_=g(null),T=g(!1),P=g(0);he(()=>{Z();const e=ke("shooter_projects");e&&(r(n,e,!0),r(p,!1)),x(),C=setInterval(()=>{s(h)?.apiKey&&s(P)<=M&&x()},V)}),me(()=>{C&&(clearInterval(C),C=null)});function Z(){try{const e=localStorage.getItem("shooter_config");if(e){const a=JSON.parse(e);Le(a)?r(h,a,!0):(localStorage.removeItem("shooter_config"),r(h,null))}}catch{}}async function x(e=!1,a=!1){if(!s(h)?.apiKey||b)return;b=!0,s(n).length===0&&r(p,!0);const l=e?s(P):0;try{const y=await fetch(`${a?"/api/sessions?refresh=true&":"/api/sessions?"}limit=${M}&offset=${l}`,{headers:{Authorization:`Bearer ${s(h).apiKey}`}});if(!y.ok){r(_,`Failed to load projects (HTTP ${y.status})`);return}r(_,null);const i=await y.json();e?r(n,[...s(n),...i.projects],!0):r(n,i.projects,!0),r(P,s(n).length,!0),r(T,i.total!==void 0?s(n).length<i.total:!1,!0),we("shooter_projects",s(n))}catch(v){r(_,"Failed to load projects"),console.error("Failed to fetch sessions:",v)}finally{r(p,!1),b=!1}}async function Q(){await x(!0)}async function U(){r(p,!0),Ae("shooter_projects"),await x(!1,!0)}function W(){Ie("/config")}function X(){return s(n).reduce((e,a)=>e+a.sessionCount,0)}var $=Fe();je("1uha8ag",e=>{var a=Be();_e(()=>{ye.title="Projects - Shooter"}),f(e,a)});var j=o($),B=o(j),R=d(o(B),2),Y=o(R);L(Y,{classes:"btn-secondary",onclick:U,get disabled(){return s(p)},children:(e,a)=>{var l=Re(),v=F(l);Me(v,{name:"refresh",size:14}),Ce(),f(e,l)},$$slots:{default:!0}}),t(R),t(B),t(j);var K=d(j,2);{var ee=e=>{Se(e,{get text(){return s(_)},classes:"banner-error"})};E(K,e=>{s(_)&&e(ee)})}var se=d(K,2);{var ae=e=>{var a=Ke();J(a,20,()=>Array(5),be,(l,v)=>{Ee(l,{classes:"shimmer-card"})}),t(a),f(e,a)},te=e=>{D(e,{icon:"settings",title:"Configuration Required",description:"Set up your API credentials to start tracking sessions",children:(a,l)=>{L(a,{classes:"btn-primary",onclick:W,text:"Configure Settings"})}})},re=e=>{D(e,{icon:"bell",title:"No sessions yet",description:"Claude Code sessions will appear here once JSONL files are found"})},oe=q(()=>X()===0),ie=e=>{var a=ze(),l=F(a);J(l,21,()=>s(n),i=>i.id,(i,c)=>{var m=Ne(),I=o(m),k=o(I),w=o(k),ne=o(w,!0);t(w);var N=d(w,2),le=o(N,!0);t(N),t(k);var ce=d(k,2);{let fe=q(()=>Te(s(c).lastModified));Pe(ce,{get text(){return`Last updated ${s(fe)??""}`},classes:"pill-session-time"})}t(I);var O=d(I,2),z=o(O),A=o(z),de=o(A,!0);t(A);var ve=d(A);t(z),t(O),t(m),xe(()=>{$e(m,"href",`/project?id=${s(c).id??""}`),S(ne,s(c).name),S(le,s(c).fullPath),S(de,s(c).sessionCount),S(ve,` ${s(c).sessionCount===1?"session":"sessions"}`)}),f(i,m)}),t(l);var v=d(l,2);{var y=i=>{var c=Oe(),m=o(c);L(m,{classes:"btn-secondary",onclick:Q,text:"Load More"}),t(c),f(i,c)};E(v,i=>{s(T)&&i(y)})}f(e,a)};E(se,e=>{s(p)&&s(n).length===0?e(ae):s(h)?.apiKey?s(oe)?e(re,2):e(ie,-1):e(te,1)})}t($),f(G,$),ge()}export{es as component};
@@ -0,0 +1,3 @@
1
+ import{a as d,f as u,s as E}from"../chunks/r0JawsZc.js";import{t as R,c as f,s as h,r as v,z as t,p as qe,u as Ae,w as Be,x as Qe,f as K,y as e,o as _,$ as Ne,A as fe,B as k}from"../chunks/CZHsSL_X.js";import{i as B}from"../chunks/B8XegpSE.js";import{h as Pe}from"../chunks/BOYo8yTr.js";import{e as Ke,b as De,i as Oe,B as J,I as X,a as Le,s as Je}from"../chunks/B5NAKyil.js";import{s as ze,a as ee}from"../chunks/CQjSATpv.js";import{p as Me}from"../chunks/Bu1aqm5j.js";import{i as je}from"../chunks/DSU1n5N_.js";import{I as pe}from"../chunks/DjsDGxCa.js";var Ee=u('<p class="card-description"> </p>'),Fe=u('<div class="card-header"><h2 class="card-title"> </h2> <!></div>'),Ge=u('<div><!> <div class="card-content"><!></div></div>');function M(c,l){const p=Me(l,"class",3,"");var n=Ge(),g=f(n);{var s=C=>{var $=Fe(),x=f($),Q=f(x,!0);v(x);var U=h(x,2);{var q=D=>{var N=Ee(),P=f(N,!0);v(N),R(()=>E(P,l.description)),d(D,N)};B(U,D=>{l.description&&D(q)})}v($),R(()=>E(Q,l.title)),d(C,$)};B(g,C=>{l.title&&C(s)})}var m=h(g,2),o=f(m);ze(o,()=>l.children),v(m),v(n),R(()=>ee(n,1,`card ${p()??""}`)),d(c,n)}function j(c){return c instanceof Error?c.message:typeof c=="string"?c:String(c)}function He(){return ge()!==null}async function We(){const c=ge();if(!c)throw new Error("Scanner not available");return c()}function ge(){if(typeof window>"u")return null;const c=window.ShooterBridge?.scanner;if(c&&typeof c.scan=="function")return()=>c.scan();const l=window.ShooterNativeBridge?.scanner;return l&&typeof l.scan=="function"?()=>l.scan():null}var Ye=u("<div><!></div>"),Ze=u("<div></div>");function Ve(c,l){var p=Ze();Ke(p,21,()=>l.steps,Oe,(n,g,s)=>{var m=Ye();let o;var C=f(m);De(C,{get onclick(){return l.onhandleStepClick},get label(){return t(g).label},get icon(){return t(g).icon},stepIndex:s+1}),v(m),R(()=>o=ee(m,1,"step-container svelte-xw39st",null,o,{"active-step":l.currentStepIndex===s,"completed-step":l.currentStepIndex>s})),d(n,m)}),v(p),R(()=>ee(p,1,`container ${l.classes??""??""}`,"svelte-xw39st")),d(c,p)}var Xe=u('<meta name="description" content="Configure notification system settings"/>'),et=u('<!> <!> <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> <!> <p class="input-help svelte-1gp6n77">Optional — only needed for iOS/Android push notifications.</p>',1),tt=u("<!> Test Connection",1),rt=u(`<p class="qr-description svelte-1gp6n77">Scan the QR code shown on your server's settings page to auto-configure the
2
+ connection.</p> <!>`,1),at=u('<p class="qr-server-url svelte-1gp6n77">Server: <code class="svelte-1gp6n77"> </code></p>'),nt=u('<div class="qr-container svelte-1gp6n77"><img 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> <!>',1),ot=u('<div class="qr-placeholder svelte-1gp6n77"><p class="qr-loading-text svelte-1gp6n77">Generating QR code...</p></div>'),st=u('<p class="qr-error svelte-1gp6n77"> </p>'),it=u(`<p class="qr-description svelte-1gp6n77">Generate a QR code containing your server URL and API key. Your mobile app can
3
+ scan it to auto-configure the connection.</p>`),ct=u("<!> <!>",1),lt=u('<div class="qr-section svelte-1gp6n77"><!></div>'),dt=u('<p class="danger-description svelte-1gp6n77">Clear all saved configuration data from this device.</p> <!>',1),vt=u('<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"><!> <!> <div class="button-group svelte-1gp6n77"><!> <!></div></section> <aside class="settings-sidebar svelte-1gp6n77"><!> <!> <!></aside></div></div></main>');function wt(c,l){qe(l,!0);let p=_(""),n=_(""),g=_(""),s=_(""),m=_(!1),o=_(""),C=_(!1),$=_(""),x=_(""),Q=_(!1),U=_(""),q=_(!1),D=_(!1),N=!1,P=_(!1);async function me(){if(!t(n).trim()){e(U,"Save an API key first to generate a QR code");return}e(Q,!0),e(U,""),e($,""),e(x,"");try{const r=await fetch("/api/qr-config",{headers:{Authorization:`Bearer ${t(n).trim()}`}});if(!r.ok){const i=await r.json();e(U,i.error||"Failed to generate QR code",!0);return}const a=await r.json();e($,a.dataUrl,!0),e(x,a.serverUrl,!0)}catch(r){e(U,`Network error: ${j(r)}`)}finally{e(Q,!1)}}async function he(){e(P,!0),e(s,""),e(o,"");try{const r=await We();try{const a=JSON.parse(r);typeof a.serverUrl=="string"&&a.serverUrl&&e(p,a.serverUrl,!0),typeof a.apiKey=="string"&&a.apiKey&&e(n,a.apiKey,!0),await re();const i=t(o);i!=="error"&&i!=="warning"&&(e(s,"Configuration updated from QR code"),e(o,"success"))}catch{e(s,"Invalid QR code data"),e(o,"error")}}catch(r){const a=j(r);a!=="cancelled"&&(e(s,`Scanner error: ${a}`),e(o,"error"))}finally{e(P,!1)}}function F(){return typeof window>"u"?null:window.ShooterBridge?window.ShooterBridge:window.ShooterNativeBridge?window.ShooterNativeBridge:null}function G(){return window.location.origin}function te(){const r=F();if(r&&!N){e(C,!0);try{const a=JSON.parse(r.getConfig?.()??"{}");a.serverUrl&&e(p,a.serverUrl,!0),a.apiKey&&e(n,a.apiKey,!0);const i=r.getFcmToken?.();i&&e(g,i,!0),N=!0}catch{}}e(q,He(),!0)}Ae(()=>{{try{const r=localStorage.getItem("shooter_config");if(r){const a=JSON.parse(r);je(a)?(a.apiKey&&e(n,a.apiKey,!0),a.deviceToken&&e(g,a.deviceToken,!0),a.serverUrl&&e(p,a.serverUrl,!0)):localStorage.removeItem("shooter_config")}}catch{}if(te(),t(p)||e(p,G(),!0),e(D,!0),!t(q)){const r=setInterval(()=>{te(),t(q)&&clearInterval(r)},200);setTimeout(()=>{clearInterval(r)},3e3)}}});async function re(){e(m,!0),e(s,""),e(o,"");try{const r=t(p).trim().replace(/\/+$/,"");localStorage.setItem("shooter_config",JSON.stringify({apiKey:t(n).trim(),deviceToken:t(g).trim(),lastUpdated:Date.now(),serverUrl:r||G()}));const a=F();a&&a.saveConfig?.(JSON.stringify({apiKey:t(n).trim(),serverUrl:r||G()})),(await fetch("/api/health")).ok?(e(s,"Configuration saved successfully"),e(o,"success")):(e(s,"Configuration saved but system health check failed"),e(o,"warning"))}catch(r){e(s,`Configuration failed: ${j(r)}`),e(o,"error")}e(m,!1)}async function ye(){if(!t(n).trim()){e(s,"API key is required for testing"),e(o,"error");return}e(m,!0),e(s,""),e(o,"");try{const r={data:{source:"config-test",timestamp:Date.now()},message:`Configuration test at ${new Date().toLocaleTimeString()}`,title:"Configuration Test"};t(g).trim()&&(r.deviceToken=t(g).trim());const a=await fetch("/api/notify",{body:JSON.stringify(r),headers:{Authorization:`Bearer ${t(n)}`,"Content-Type":"application/json"},method:"POST"}),i=await a.json();a.ok?(e(s,"Test notification sent successfully"),e(o,"success")):(e(s,`Test failed: ${i.error||"Unknown error"}`),e(o,"error"))}catch(r){e(s,`Network error: ${j(r)}`),e(o,"error")}e(m,!1)}function _e(){{localStorage.removeItem("shooter_config"),e(p,typeof window<"u"?window.location.origin:"",!0),e(n,""),e(g,""),e(s,"Configuration cleared"),e(o,"success");const r=F();r&&r.saveConfig?.(JSON.stringify({apiKey:"",serverUrl:""}))}}var H=vt();Pe("1gp6n77",r=>{var a=Xe();Qe(()=>{Ne.title="Settings - Shooter"}),d(r,a)});var ae=f(H),ne=h(f(ae),4),W=f(ne),oe=f(W);M(oe,{title:"Server Configuration",description:"Configure server connection and credentials",children:(r,a)=>{var i=et(),S=K(i);X(S,{name:"serverUrl",label:"Server URL",dataType:"text",placeholder:"https://shooter.breezehq.dev",infoMessage:"Base URL of your Shooter server. Apps will reload with this URL on next launch.",get value(){return t(p)},set value(b){e(p,b,!0)}});var I=h(S,2);X(I,{name:"apiKey",label:"API Key",dataType:"password",placeholder:"Enter your API key",infoMessage:"Required for sending notifications",get value(){return t(n)},set value(b){e(n,b,!0)}});var O=h(I,4);{let b=k(()=>t(C)?"Waiting for token...":"64-character hex string"),T=k(()=>t(C)&&t(g)?"Auto-detected from app":"Device token from app registration");X(O,{name:"deviceToken",label:"Device Token",dataType:"text",get placeholder(){return t(b)},get infoMessage(){return t(T)},classes:"input-mono",get value(){return t(g)},set value(A){e(g,A,!0)}})}fe(2),d(r,i)},$$slots:{default:!0}});var se=h(oe,2);{var Se=r=>{const a=k(()=>t(o)==="success"?"check-circle":t(o)==="error"?"x-circle":"alert-triangle");{const i=I=>{pe(I,{get name(){return t(a)},size:16})};let S=k(()=>t(o)||"info");Le(r,{get text(){return t(s)},get classes(){return`banner-${t(S)??""}`},icon:i,$$slots:{icon:!0}})}};B(se,r=>{t(s)&&r(Se)})}var ie=h(se,2),ce=f(ie);{let r=k(()=>t(m)||!t(n).trim());J(ce,{classes:"btn-secondary",onclick:ye,get disabled(){return t(r)},children:(a,i)=>{var S=tt(),I=K(S);{var O=b=>{pe(b,{name:"play",size:14})};B(I,b=>{t(m)||b(O)})}fe(),d(a,S)},$$slots:{default:!0}})}var we=h(ce,2);{let r=k(()=>t(m)||!t(n).trim());J(we,{classes:"btn-primary",onclick:re,get disabled(){return t(r)},get showLoader(){return t(m)},text:"Save Changes"})}v(ie),v(W);var le=h(W,2),de=f(le);M(de,{title:"Setup Guide",children:(r,a)=>{{let i=k(()=>t(n).trim()&&t(g).trim()?2:t(n).trim()?1:0);Ve(r,{steps:[{label:"Get API Key"},{label:"Find Device Token"},{label:"Test Connection"}],get currentStepIndex(){return t(i)},classes:"setup-stepper"})}},$$slots:{default:!0}});var ve=h(de,2);{let r=k(()=>t(q)?"Scan a QR code to connect":"Scan to connect your mobile app");M(ve,{title:"Mobile App Setup",get description(){return t(r)},children:(a,i)=>{var S=lt(),I=f(S);{var O=T=>{var A=rt(),z=h(K(A),2);{let Y=k(()=>t(P)?"Scanning...":"Scan QR Code");J(z,{classes:"btn-secondary btn-sm",onclick:he,get disabled(){return t(P)},get text(){return t(Y)}})}d(T,A)},b=T=>{var A=ct(),z=K(A);{var Y=y=>{var w=nt(),L=K(w),Ue=f(L);v(L);var Ie=h(L,4);{var Te=Z=>{var V=at(),ue=h(f(V)),Re=f(ue,!0);v(ue),v(V),R(()=>E(Re,t(x))),d(Z,V)};B(Ie,Z=>{t(x)&&Z(Te)})}R(()=>Je(Ue,"src",t($))),d(y,w)},ke=y=>{var w=ot();d(y,w)},Ce=y=>{var w=st(),L=f(w,!0);v(w),R(()=>E(L,t(U))),d(y,w)},$e=y=>{var w=it();d(y,w)};B(z,y=>{t($)?y(Y):t(Q)?y(ke,1):t(U)?y(Ce,2):y($e,-1)})}var xe=h(z,2);{let y=k(()=>t(Q)||!t(n).trim()),w=k(()=>t($)?"Regenerate QR Code":"Generate QR Code");J(xe,{classes:"btn-secondary btn-sm",onclick:me,get disabled(){return t(y)},get text(){return t(w)}})}d(T,A)};B(I,T=>{t(q)?T(O):T(b,-1)})}v(S),d(a,S)},$$slots:{default:!0}})}var be=h(ve,2);M(be,{title:"Danger Zone",children:(r,a)=>{var i=dt(),S=h(K(i),2);J(S,{classes:"btn-danger btn-sm",onclick:_e,text:"Clear Configuration"}),d(r,i)},$$slots:{default:!0}}),v(le),v(ne),v(ae),v(H),d(c,H),Be()}export{wt as component};
@@ -0,0 +1 @@
1
+ import{a as u,f as p,s as b}from"../chunks/r0JawsZc.js";import{p as Qe,o as w,q as We,u as Xe,v as Ye,w as et,D as tt,z as e,y as c,$ as at,c as n,s as l,r as o,B as f,f as L,A as Q,t as W}from"../chunks/CZHsSL_X.js";import{i as j}from"../chunks/B8XegpSE.js";import{a as st,e as de,i as rt,B as N,P as D,s as ot}from"../chunks/B5NAKyil.js";import{h as nt}from"../chunks/BOYo8yTr.js";import{g as it}from"../chunks/B-K5Sh65.js";import{p as ct}from"../chunks/C4mLaWWx.js";import{g as lt,s as dt,S as ve,c as vt}from"../chunks/UJOiqIYE.js";import{i as ut}from"../chunks/DSU1n5N_.js";import{E as ue}from"../chunks/CSoRdFvv.js";import{I as ft}from"../chunks/DjsDGxCa.js";import"../chunks/CQjSATpv.js";import{f as pt}from"../chunks/BLszSzTT.js";var mt=p('<meta name="description" content="Project sessions sorted by latest update"/>'),ht=p('<div class="loading-container"><!> <!></div>'),_t=p('<div class="project-back-row svelte-urn6fi"><a href="/" class="back-link"><span class="back-arrow">&larr;</span> Back to Projects</a></div> <!>',1),gt=p("<!> Refresh",1),yt=p('<div class="session-card-subtitle"> </div>'),bt=p('<span class="connect-dot svelte-urn6fi"></span> Connect',1),jt=p('<a class="session-card"><div class="session-card-header"><div><h3 class="session-card-title"> </h3> <!></div> <div class="session-card-actions svelte-urn6fi"><!> <!></div></div> <div class="session-stats"><span><strong> </strong> messages</span> <!> <!></div> <div class="session-meta-row svelte-urn6fi"><span class="session-modified svelte-urn6fi"> </span> <span class="session-duration svelte-urn6fi"> </span></div></a>'),$t=p('<div style="text-align: center; padding: 1rem;"><!></div>'),Pt=p('<div class="sessions-container svelte-urn6fi"></div> <!>',1),xt=p('<div class="chat-session-header"><div class="chat-session-header-top svelte-urn6fi"><a href="/" class="back-link">&#8592; Back to Projects</a> <!></div> <h1 class="chat-session-title"> </h1> <div class="chat-session-meta"><span class="session-card-subtitle"> </span> <span> </span></div></div> <!>',1),St=p('<main class="main"><!> <!></main>');function Mt(fe,pe){Qe(pe,!0);const me=15e3,R=20;let i=w(null),g=w(!0),m=w(null),E=w(null),K=null,k=w(R),X=w(We([])),$=w(null);const P=f(()=>ct.url.searchParams.get("id")||""),he=f(()=>e(i)?e(i).sessions.slice(0,e(k)):[]),_e=f(()=>e(i)?e(k)<e(i).sessions.length:!1),ge=f(()=>new Set(e(X).filter(t=>t.sessionId).map(t=>t.sessionId)));Xe(()=>{ye();const t=lt(`shooter_project_${e(P)}`);t&&(c(i,t,!0),c(g,!1)),setTimeout(()=>{z(),M()},50),K=setInterval(()=>{e(m)?.apiKey&&e(P)&&(z(),M())},me)}),Ye(()=>{K&&(clearInterval(K),K=null)});function ye(){try{const t=localStorage.getItem("shooter_config");if(t){const a=JSON.parse(t);ut(a)?c(m,a,!0):(localStorage.removeItem("shooter_config"),c(m,null))}}catch{}}async function z(t=!1){if(!e(m)?.apiKey||!e(P)){c(g,!1);return}e(i)||c(g,!0);try{const d=await fetch(t?"/api/sessions?refresh=true":"/api/sessions",{headers:{Authorization:`Bearer ${e(m).apiKey}`}});if(!d.ok){c(E,`Failed to load project (HTTP ${d.status})`),c(g,!1);return}c(E,null);const h=(await d.json()).projects.find(C=>C.id===e(P))||null;c(i,h,!0),h&&dt(`shooter_project_${e(P)}`,h)}catch(a){console.error("Failed to fetch project:",a)}finally{c(g,!1)}}async function M(){if(e(m)?.apiKey)try{const t=await fetch("/api/sessions/detect",{headers:{Authorization:`Bearer ${e(m).apiKey}`}});if(t.ok){const a=await t.json();c(X,a.processes,!0)}}catch{}}async function Y(t,a,d){if(t.preventDefault(),t.stopPropagation(),!(!e(m)?.apiKey||!e(i)||e($))){c($,a,!0);try{const v=await fetch("/api/sessions/connect",{body:JSON.stringify({command:d,cwd:e(i).fullPath,sessionId:a}),headers:{Authorization:`Bearer ${e(m).apiKey}`,"Content-Type":"application/json"},method:"POST"});if(v.ok){const h=await v.json();it(`/terminals/${h.terminalId}`)}}catch(v){console.error("Failed to connect to session:",v)}finally{c($,null)}}}async function be(){c(g,!0),c(i,null),c(k,R),vt(`shooter_project_${e(P)}`),await z(!0),await M()}function je(){c(k,e(k)+R)}function ee(t){if(!t)return"";const a=new Date(t);return isNaN(a.getTime())?"":a.toLocaleDateString("en-US",{day:"numeric",hour:"2-digit",minute:"2-digit",month:"short"})}function $e(t,a){return t.length<=a?t:`${t.slice(0,a).trimEnd()}...`}var O=St();nt("urn6fi",t=>{var a=mt();tt(()=>{at.title=`${(e(i)?.name||"Project")??""} - Shooter`}),u(t,a)});var te=n(O);{var Pe=t=>{st(t,{get text(){return e(E)},classes:"banner-error"})};j(te,t=>{e(E)&&t(Pe)})}var xe=l(te,2);{var Se=t=>{var a=ht(),d=n(a);ve(d,{classes:"shimmer-header"});var v=l(d,2);de(v,16,()=>Array(4),rt,(h,C)=>{ve(h,{classes:"shimmer-card"})}),o(a),u(t,a)},we=t=>{var a=_t(),d=l(L(a),2);ue(d,{icon:"alert-triangle",title:"Project Not Found",description:"The requested project could not be found."}),u(t,a)},ke=t=>{var a=xt(),d=L(a),v=n(d),h=l(n(v),2);N(h,{classes:"btn-secondary",onclick:be,get disabled(){return e(g)},children:(y,q)=>{var I=gt(),J=L(I);ft(J,{name:"refresh",size:14}),Q(),u(y,I)},$$slots:{default:!0}}),o(v);var C=l(v,2),Ce=n(C,!0);o(C);var ae=l(C,2),F=n(ae),Ie=n(F,!0);o(F);var se=l(F,2),Be=n(se);o(se),o(ae),o(d);var Te=l(d,2);{var Ae=y=>{ue(y,{icon:"bell",title:"No sessions yet",description:"Sessions for this project will appear here"})},Ee=y=>{var q=Pt(),I=L(q);de(I,21,()=>e(he),x=>x.id,(x,r)=>{var B=jt(),T=n(B),G=n(T),H=n(G),Le=n(H,!0);o(H);var Ne=l(H,2);{var De=s=>{var _=yt(),A=n(_,!0);o(_),W(S=>b(A,S),[()=>$e(e(r).summary,80)]),u(s,_)};j(Ne,s=>{e(r).summary&&s(De)})}o(G);var re=l(G,2),oe=n(re);{let s=f(()=>pt(e(r).modified));D(oe,{get text(){return e(s)},classes:"pill-session-time"})}var Re=l(oe,2);{var ze=s=>{{let _=f(()=>e($)===e(r).id),A=f(()=>e($)===e(r).id);N(s,{classes:"btn-connect btn-xs",onclick:S=>Y(S,e(r).id,e(r).source==="opencode"?"opencode":"claude"),get disabled(){return e(_)},get showLoader(){return e(A)},children:(S,wt)=>{var Ze=bt();Q(),u(S,Ze)},$$slots:{default:!0}})}},Me=f(()=>e(ge).has(e(r).id)),Oe=s=>{{let _=f(()=>e($)===e(r).id),A=f(()=>e($)===e(r).id);N(s,{classes:"btn-resume btn-xs",onclick:S=>Y(S,e(r).id,e(r).source==="opencode"?"opencode":"claude"),get disabled(){return e(_)},get showLoader(){return e(A)},text:"Resume"})}};j(Re,s=>{e(Me)?s(ze):s(Oe,-1)})}o(re),o(T);var U=l(T,2),V=n(U),ne=n(V),Fe=n(ne,!0);o(ne),Q(),o(V);var ie=l(V,2);{var qe=s=>{D(s,{get text(){return`🌿 ${e(r).gitBranch??""}`},classes:"pill-git-branch"})};j(ie,s=>{e(r).gitBranch&&s(qe)})}var Je=l(ie,2);{var Ge=s=>{D(s,{text:"OpenCode",classes:"pill-source-opencode"})},He=s=>{D(s,{text:"Claude Code",classes:"pill-source-claude"})};j(Je,s=>{e(r).source==="opencode"?s(Ge):s(He,-1)})}o(U);var ce=l(U,2),Z=n(ce),Ue=n(Z);o(Z);var le=l(Z,2),Ve=n(le);o(le),o(ce),o(B),W((s,_)=>{ot(B,"href",`/session/${e(r).id??""}?project=${e(P)??""}`),b(Le,e(r).title),b(Fe,e(r).messageCount),b(Ue,`Last updated ${s??""}`),b(Ve,`Created ${_??""}`)},[()=>ee(e(r).modified),()=>ee(e(r).created)]),u(x,B)}),o(I);var J=l(I,2);{var Ke=x=>{var r=$t(),B=n(r);{let T=f(()=>`Load More (${e(i).sessions.length-e(k)} remaining)`);N(B,{classes:"btn-secondary",onclick:je,get text(){return e(T)}})}o(r),u(x,r)};j(J,x=>{e(_e)&&x(Ke)})}u(y,q)};j(Te,y=>{e(i).sessions.length===0?y(Ae):y(Ee,-1)})}W(()=>{b(Ce,e(i).name),b(Ie,e(i).fullPath),b(Be,`${e(i).sessionCount??""} sessions`)}),u(t,a)};j(xe,t=>{e(g)&&!e(i)?t(Se):e(i)?t(ke,-1):t(we,1)})}o(O),u(fe,O),et()}export{Mt as component};
@@ -0,0 +1,4 @@
1
+ import{d as ge,a as w,f as y,s as L,b as we}from"../chunks/r0JawsZc.js";import{p as be,o as b,q as ye,u as _e,w as Se,D as $e,y as a,z as e,$ as ke,c as h,r as v,B as E,s as _,f as Y,t as q}from"../chunks/CZHsSL_X.js";import{i as F}from"../chunks/B8XegpSE.js";import{h as Ie}from"../chunks/BOYo8yTr.js";import{s as Z}from"../chunks/B5NAKyil.js";import{p as G}from"../chunks/C4mLaWWx.js";import{g as je,s as ee,S as D}from"../chunks/UJOiqIYE.js";import"../chunks/CQjSATpv.js";import{C as Ce}from"../chunks/DVkn4r72.js";var Oe=y('<meta name="description" content="Session conversation view" class="svelte-1a2wdfb"/>'),Me=y('<div class="loading-container svelte-1a2wdfb"><!> <div class="chat-container svelte-1a2wdfb"><!> <!> <!> <!></div></div>'),Ne=y('<div class="session-back-row svelte-1a2wdfb"><a class="back-link svelte-1a2wdfb">← Back</a></div> <p class="error-text svelte-1a2wdfb"> </p>',1),Ae=y('<span class="resume-status svelte-1a2wdfb">Connecting...</span>'),Pe=y('<span class="resume-status svelte-1a2wdfb">Resuming session...</span>'),Te=y('<span class="connection-dot connected svelte-1a2wdfb"></span>'),De=y('<span class="connection-dot reconnecting svelte-1a2wdfb"></span>'),Re=y('<div class="load-earlier-row svelte-1a2wdfb"><button class="load-earlier-btn svelte-1a2wdfb"> </button></div>'),We=y('<div class="session-header svelte-1a2wdfb"><div class="session-header-row svelte-1a2wdfb"><a class="back-link svelte-1a2wdfb">← Back</a> <!></div> <h1 class="session-title svelte-1a2wdfb"> </h1></div> <div class="session-chat-container svelte-1a2wdfb"><!> <!></div>',1),Be=y('<main class="main session-page-main svelte-1a2wdfb"><!></main>');function Ge(te,se){be(se,!0);let p=b(null),o=b(ye([])),I=b(!0),N=b(null),R=b(!1),A=b(!1),P=b(200),j=b(null),k=b("idle"),c=b("idle"),S=null,$=null,C=null,O=null,u=!1;const W=E(()=>G.params.id),M=E(()=>G.url.searchParams.get("project")||""),ne=E(()=>e(c)==="connecting"||e(c)==="resuming");function T(){try{const t=localStorage.getItem("shooter_config");return t?JSON.parse(t):null}catch{return null}}async function V(){const t=T();if(!t)return null;try{const s=await fetch("/api/ws-ticket",{headers:{Authorization:`Bearer ${t.apiKey}`},method:"POST"});return s.ok?(await s.json()).ticket:null}catch{return null}}async function J(t,s){if(u||C&&(C.readyState===WebSocket.OPEN||C.readyState===WebSocket.CONNECTING))return;const n=await V();if(!n||u)return;a(k,"connecting");const i=window.location.protocol==="https:"?"wss:":"ws:",r=new WebSocket(`${i}//${window.location.host}${t}?ticket=${n}`);r.onopen=()=>{if(u){r.close();return}a(k,"connected"),r.send(JSON.stringify({sessionId:s,type:"subscribe"}))},r.onmessage=d=>{if(!u)try{ae(JSON.parse(d.data))}catch{}},r.onclose=()=>{u||(a(k,"disconnected"),C=null,e(j)&&(O&&clearTimeout(O),O=setTimeout(()=>{O=null,!u&&e(j)&&J(`/ws/session/${e(j)}`,e(j))},2e3)))},r.onerror=()=>{u||a(k,"disconnected")},C=r}async function H(t){if(u)return;const s=await V();if(!s||u)return;const n=window.location.protocol==="https:"?"wss:":"ws:",i=new WebSocket(`${n}//${window.location.host}${t}?ticket=${s}`);i.onopen=()=>{if(u){i.close();return}$=i,e(c)==="ready"&&S&&(i.send(JSON.stringify({data:`${S}
2
+ `,type:"input"})),S=null)},i.onclose=()=>{$===i&&($=null)}}function ae(t){if(t.type==="history"){const s=t.messages||[];a(o,s.map(n=>({id:n.id,parts:n.content,role:n.role,timestamp:n.timestamp})),!0),a(R,!1),e(c)==="resuming"&&(a(c,"ready"),S&&$?.readyState===WebSocket.OPEN&&($.send(JSON.stringify({data:`${S}
3
+ `,type:"input"})),S=null))}else if(t.type==="message")a(o,[...e(o),{id:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:t.content||[],role:t.role||"assistant",timestamp:t.timestamp||new Date().toISOString()}],!0);else if(t.type==="tool-use"){const s={id:t.id||`tool-${Date.now()}`,input:t.input||{},toolName:t.name,type:"tool_use"},n=e(o).length>0?e(o)[e(o).length-1]:null;n?.role==="assistant"?a(o,[...e(o).slice(0,-1),{...n,parts:[...n.parts,s]}],!0):a(o,[...e(o),{id:`tool-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[s],role:"assistant",timestamp:new Date().toISOString()}],!0)}else if(t.type==="tool-result"){const s={isError:t.isError||!1,output:t.output||"",toolUseId:t.id,type:"tool_result"},n=e(o).length>0?e(o)[e(o).length-1]:null;n?.role==="system"?a(o,[...e(o).slice(0,-1),{...n,parts:[...n.parts,s]}],!0):a(o,[...e(o),{id:`result-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[s],role:"system",timestamp:new Date().toISOString()}],!0)}else if(t.type==="thinking"){const s={content:t.text||"",type:"thinking"},n=e(o).length>0?e(o)[e(o).length-1]:null;n?.role==="assistant"?a(o,[...e(o).slice(0,-1),{...n,parts:[...n.parts,s]}],!0):a(o,[...e(o),{id:`think-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[s],role:"assistant",timestamp:new Date().toISOString()}],!0)}else t.type==="session-end"&&a(c,"idle")}async function oe(){if(!e(p)||u){a(c,"idle");return}const t=T();if(!t){a(c,"idle");return}a(c,"connecting");try{const s=e(p).source==="opencode"?"opencode":"claude",n=await fetch("/api/sessions/connect",{body:JSON.stringify({command:s,cwd:e(p).projectPath,sessionId:e(W)}),headers:{Authorization:`Bearer ${t.apiKey}`,"Content-Type":"application/json"},method:"POST"});if(!n.ok||u){a(c,"idle");return}const i=await n.json();a(j,i.terminalId,!0),a(c,"resuming"),J(i.sessionWs,i.terminalId),H(i.ws)}catch{a(c,"idle")}}function ie(t){if(t.trim()){if(e(c)==="ready"&&$?.readyState===WebSocket.OPEN){$.send(JSON.stringify({data:`${t}
4
+ `,type:"input"}));return}if(e(c)==="connecting"||e(c)==="resuming"){S=t;return}S=t,oe()}}async function re(){e(o).length===0&&a(I,!0);try{const t=T();if(!t){a(N,"No configuration found. Please configure settings first."),a(I,!1);return}const s=e(W)||"",n=e(M)||"",i=n?`id=${encodeURIComponent(s)}&project=${encodeURIComponent(n)}&limit=${e(P)}`:`id=${encodeURIComponent(s)}&limit=${e(P)}`;let r=await fetch(`/api/sessions?${i}`,{headers:{Authorization:`Bearer ${t.apiKey}`}});if(r.status===404&&!n){const g=await fetch("/api/sessions",{headers:{Authorization:`Bearer ${t.apiKey}`}});if(g.ok){const x=await g.json();for(const B of x.projects||[])if((B.sessions||[]).find(U=>U.id===s)){r=await fetch(`/api/sessions?id=${encodeURIComponent(s)}&project=${encodeURIComponent(B.id)}`,{headers:{Authorization:`Bearer ${t.apiKey}`}});break}}}if(!r.ok){a(N,"Session not found"),a(I,!1);return}const d=await r.json();a(p,d.session,!0);const f=Array.isArray(d.messages)?d.messages:[];a(o,f,!0),a(R,f.length>=e(P)),ee(`shooter_session_${s}`,{messages:f,session:d.session})}catch{a(N,"Failed to load session")}a(I,!1)}async function ce(){if(e(A))return;const t=T();if(t){a(A,!0);try{const s=e(P)+200,n=e(W)||"",i=e(M)||"",r=[`id=${encodeURIComponent(n)}`,`limit=${s}`];i&&r.push(`project=${encodeURIComponent(i)}`);const d=await fetch(`/api/sessions?${r.join("&")}`,{headers:{Authorization:`Bearer ${t.apiKey}`}});if(!d.ok)return;const f=await d.json(),g=Array.isArray(f.messages)?f.messages:[];a(o,g,!0),a(P,s),a(R,g.length>=s),ee(`shooter_session_${n}`,{messages:g,session:f.session})}catch{}finally{a(A,!1)}}}_e(()=>{const t=je(`shooter_session_${G.params.id}`);return t&&(a(p,t.session,!0),a(o,Array.isArray(t.messages)?t.messages:[],!0),a(I,!1)),re().then(async()=>{if(!e(p)||u)return;const s=T();if(s)try{const n=e(p).source==="opencode"?"opencode":"claude",i=await fetch("/api/sessions/connect",{body:JSON.stringify({command:n,cwd:e(p).projectPath,noCreate:!0,sessionId:e(W)}),headers:{Authorization:`Bearer ${s.apiKey}`,"Content-Type":"application/json"},method:"POST"});if(i.ok&&!u){const r=await i.json();a(j,r.terminalId,!0),a(c,"resuming"),J(r.sessionWs,r.terminalId),H(r.ws)}}catch{}}),()=>{u=!0,O&&clearTimeout(O),C?.close(),$?.close()}});var K=Be();Ie("1a2wdfb",t=>{var s=Oe();$e(()=>{ke.title=`${(e(p)?.title||"Session")??""} - Shooter`}),w(t,s)});var le=h(K);{var de=t=>{var s=Me(),n=h(s);D(n,{classes:"shimmer-header"});var i=_(n,2),r=h(i);D(r,{classes:"shimmer-bubble shimmer-bubble-user"});var d=_(r,2);D(d,{classes:"shimmer-bubble shimmer-bubble-assistant"});var f=_(d,2);D(f,{classes:"shimmer-bubble shimmer-bubble-user-short"});var g=_(f,2);D(g,{classes:"shimmer-bubble shimmer-bubble-assistant-wide"}),v(i),v(s),w(t,s)},ue=t=>{var s=Ne(),n=Y(s),i=h(n);v(n);var r=_(n,2),d=h(r,!0);v(r),q(()=>{Z(i,"href",e(M)?`/project?id=${e(M)}`:"/"),L(d,e(N))}),w(t,s)},fe=t=>{var s=We(),n=Y(s),i=h(n),r=h(i),d=_(r,2);{var f=l=>{var m=Ae();w(l,m)},g=l=>{var m=Pe();w(l,m)},x=l=>{var m=Te();w(l,m)},B=l=>{var m=De();w(l,m)};F(d,l=>{e(c)==="connecting"?l(f):e(c)==="resuming"?l(g,1):e(k)==="connected"?l(x,2):e(k)==="reconnecting"&&l(B,3)})}v(i);var U=_(i,2),pe=h(U,!0);v(U),v(n);var Q=_(n,2),X=h(Q);{var me=l=>{var m=Re(),z=h(m),ve=h(z,!0);v(z),v(m),q(()=>{z.disabled=e(A),L(ve,e(A)?"Loading...":"Load earlier messages")}),we("click",z,ce),w(l,m)};F(X,l=>{e(R)&&l(me)})}var he=_(X,2);{let l=E(()=>[...e(o)].reverse());Ce(he,{get messages(){return e(l)},newestFirst:!0,get connectionState(){return e(k)},showInput:!0,get sendDisabled(){return e(ne)},onSendInput:ie,sessionEnded:!1})}v(Q),q(()=>{Z(r,"href",e(M)?`/project?id=${e(M)}`:"/"),L(pe,e(p).title)}),w(t,s)};F(le,t=>{e(I)&&e(o).length===0?t(de):e(N)?t(ue,1):e(p)&&t(fe,2)})}v(K),w(te,K),Se()}ge(["click"]);export{Ge as component};
@@ -0,0 +1,2 @@
1
+ import{d as Ve,c as We,i as Ye,a as u,t as Ge,s as A,b as Ue,f as h}from"../chunks/r0JawsZc.js";import{p as je,o as y,q as ze,u as Be,y as i,z as e,a5 as Xe,f as ke,w as De,c as r,s as l,A as pe,t as F,B as S,r as s,v as et,x as tt,$ as at}from"../chunks/CZHsSL_X.js";import{i as K}from"../chunks/B8XegpSE.js";import{e as ue,C as st,S as rt,I as nt,B as Q,a as Me,i as lt,P as Se,T as Ee,s as Ne}from"../chunks/B5NAKyil.js";import{h as it}from"../chunks/BOYo8yTr.js";import{a as ot,c as ct}from"../chunks/CQjSATpv.js";import{g as Oe}from"../chunks/B-K5Sh65.js";import{c as dt,s as Ie,g as vt,S as pt}from"../chunks/UJOiqIYE.js";import{i as ut}from"../chunks/DSU1n5N_.js";import{E as Ke}from"../chunks/CSoRdFvv.js";import{I as mt}from"../chunks/DjsDGxCa.js";import{f as Pe}from"../chunks/BLszSzTT.js";var ft=h('<div class="overlay svelte-plslui" role="presentation"><div class="sheet svelte-plslui" role="dialog" aria-modal="true" aria-label="New Terminal"><div class="handle-bar svelte-plslui"><div class="handle svelte-plslui"></div></div> <h2 class="sheet-title svelte-plslui">New Terminal</h2> <div class="section svelte-plslui"><span class="section-label svelte-plslui">Quick Launch</span> <div class="preset-grid svelte-plslui"></div></div> <div class="section svelte-plslui"><span class="section-label svelte-plslui">Working Directory</span> <!> <div class="custom-cwd-group svelte-plslui"><!></div></div> <!> <!></div></div>');function ht(me,C){je(C,!0);const V=[{args:[],command:"claude",label:"Claude Code"},{args:[],command:"opencode",label:"OpenCode"},{args:[],command:"zsh",label:"Shell / zsh"},{args:[],command:"bash",label:"Bash"}];let P=y(0),k=y(ze([])),L=y(""),m=y(""),_=y(!1),E=y("");Be(()=>{j()});async function j(){try{const c=await fetch("/api/sessions?limit=50&offset=0",{headers:{Authorization:`Bearer ${C.apiKey}`}});if(!c.ok)return;const I=(await c.json()).projects.map(g=>g.fullPath).filter(g=>typeof g=="string"&&g.length>0);i(k,[...new Set(I)],!0),e(k).length>0&&!e(L)&&i(L,e(k)[0],!0)}catch{}}function w(c){i(P,c,!0)}function R(){return V[e(P)].command}function fe(){return V[e(P)].args}function he(){const c=e(m).trim();return c||(e(L)?e(L):"/tmp")}async function ge(){const c=R();if(c){i(_,!0),i(E,"");try{const x=await fetch("/api/terminals",{body:JSON.stringify({args:fe(),command:c,cwd:he()||void 0}),headers:{Authorization:`Bearer ${C.apiKey}`,"Content-Type":"application/json"},method:"POST"});if(!x.ok){const g=await x.json().catch(()=>({}));i(E,g.error||`Failed to launch (${x.status})`,!0);return}const I=await x.json();C.onLaunch(I)}catch{i(E,"Network error — is the server running?")}finally{i(_,!1)}}}function W(c){c.target===c.currentTarget&&C.onClose()}function _e(c){C.open&&c.key==="Escape"&&C.onClose()}var ie=We();Ye("keydown",Xe,_e);var H=ke(ie);{var oe=c=>{var x=ft(),I=r(x),g=l(r(I),4),Y=l(r(g),2);ue(Y,23,()=>V,v=>v.label,(v,q,$)=>{{let xe=S(()=>e(P)===e($));st(v,{mode:"radio",get selected(){return e(xe)},onclick:()=>{w(e($))},classes:"preset-choice",children:(ce,Le)=>{pe();var de=Ge();F(()=>A(de,e(q).label)),u(ce,de)},$$slots:{default:!0}})}}),s(Y),s(g);var G=l(g,2),U=l(r(G),2);{let v=S(()=>e(k).length>0?e(k).map($=>({id:$,label:$})):[{id:"",label:"No recent projects"}]),q=S(()=>e(L)?[e(L)]:e(k).length>0?[e(k)[0]]:[""]);rt(U,{get items(){return e(v)},get value(){return e(q)},placeholder:"Select a project",onchange:$=>{i(L,$[0]||"",!0)},classes:"launch-select"})}var X=l(U,2),we=r(X);nt(we,{label:"Or enter a custom path",dataType:"text",placeholder:"/path/to/project",classes:"input-mono launch-input",get value(){return e(m)},set value(v){i(m,v,!0)}}),s(X),s(G);var ee=l(G,2);{let v=S(()=>e(_)?"Launching...":"Launch Terminal");Q(ee,{classes:"btn-launch",get disabled(){return e(_)},onclick:ge,get showLoader(){return e(_)},get text(){return e(v)}})}var te=l(ee,2);{var ae=v=>{Me(v,{get text(){return e(E)},classes:"banner-error launch-error-banner"})};K(te,v=>{e(E)&&v(ae)})}s(I),s(x),Ue("click",x,W),u(c,x)};K(H,c=>{C.open&&c(oe)})}u(me,ie),De()}Ve(["click"]);var gt=h('<meta name="description" content="Active terminal sessions on this machine" class="svelte-1ewpmn2"/>'),_t=h("<!> Refresh",1),wt=h('<span class="plus-icon svelte-1ewpmn2">+</span> New Terminal',1),xt=h('<div class="loading-container svelte-1ewpmn2"></div>'),bt=h('<span class="plus-icon svelte-1ewpmn2">+</span> New Terminal',1),yt=h('<span class="terminal-cwd svelte-1ewpmn2"> </span>'),Ct=h('<div class="terminal-preview svelte-1ewpmn2"><span class="terminal-preview-text svelte-1ewpmn2"> </span></div>'),$t=h('<a class="terminal-card svelte-1ewpmn2"><div class="terminal-card-header svelte-1ewpmn2"><div class="terminal-card-left svelte-1ewpmn2"><span class="status-indicator status-running svelte-1ewpmn2"><span></span></span> <span class="terminal-command svelte-1ewpmn2"> </span> <!></div> <span class="terminal-time svelte-1ewpmn2"> </span></div> <div class="terminal-card-meta svelte-1ewpmn2"><!> <span class="terminal-pid svelte-1ewpmn2"> </span></div> <!></a>'),Tt=h('<span class="terminal-cwd svelte-1ewpmn2"> </span>'),At=h('<div class="terminal-preview svelte-1ewpmn2"><span class="terminal-preview-text svelte-1ewpmn2"> </span></div>'),St=h('<a class="terminal-card terminal-card-exited svelte-1ewpmn2"><div class="terminal-card-header svelte-1ewpmn2"><div class="terminal-card-left svelte-1ewpmn2"><span class="status-indicator status-exited svelte-1ewpmn2"><span class="status-dot-static svelte-1ewpmn2"></span></span> <span class="terminal-command svelte-1ewpmn2"> </span> <!> <!></div> <div class="terminal-card-right svelte-1ewpmn2"><span class="terminal-time svelte-1ewpmn2"> </span> <!></div></div> <div class="terminal-card-meta svelte-1ewpmn2"><!></div> <!></a>'),Pt=h('<div class="terminals-container svelte-1ewpmn2"><!> <!></div>'),kt=h('<main class="main svelte-1ewpmn2"><div class="page-header svelte-1ewpmn2"><div class="page-header-content svelte-1ewpmn2"><div class="svelte-1ewpmn2"><h1 class="page-title svelte-1ewpmn2">Terminals</h1> <p class="page-description svelte-1ewpmn2">Active terminal sessions on this machine</p></div> <div class="page-actions svelte-1ewpmn2"><!> <!></div></div></div> <!> <!></main> <!>',1);function Rt(me,C){je(C,!0);const V=1e4,P="shooter_terminals",k=["claude","opencode"],L=["zsh","bash","sh","fish"];let m=y(ze([])),_=y(!1),E=!1,j=y(null),w=y(null),R=null;const fe=S(()=>e(m).filter(t=>t.status==="running")),he=S(()=>e(m).filter(t=>t.status==="exited"));Be(()=>{ge();const t=vt(P,1e4);t&&(i(m,t,!0),i(_,!1)),W(),R=setInterval(()=>{e(w)?.apiKey&&W()},V)}),et(()=>{R&&(clearInterval(R),R=null)});function ge(){try{const t=localStorage.getItem("shooter_config");if(t){const a=JSON.parse(t);ut(a)?i(w,a,!0):(localStorage.removeItem("shooter_config"),i(w,null))}}catch{}}async function W(){if(!(!e(w)?.apiKey||E)){E=!0,e(m).length===0&&i(_,!0);try{const a=await fetch("/api/terminals",{headers:{Authorization:`Bearer ${e(w).apiKey}`}});if(!a.ok){i(j,`Failed to load terminals (HTTP ${a.status})`);return}i(j,null);const o=await a.json();i(m,o.terminals.map(f=>({...f,lastOutput:f.lastOutput??null})),!0),Ie(P,e(m))}catch(t){i(j,"Failed to load terminals"),console.error("Failed to fetch terminals:",t)}finally{i(_,!1),E=!1}}}async function _e(){i(_,!0),dt(P),await W()}function ie(){Oe("/config")}let H=y(!1);function oe(){i(H,!0)}function c(){i(H,!1)}function x(t){i(H,!1),Oe(`/terminals/${t.id}`)}function I(t){const a=t.split("/").pop()||t;return k.includes(a)?"ai":(L.includes(a),"shell")}function g(t){return t.status==="exited"?{class:"pill-badge-ended",label:"ENDED"}:I(t.command)==="ai"?{class:"pill-badge-ai",label:"AI"}:{class:"pill-badge-shell",label:"SHELL"}}function Y(t,a=40){if(t.length<=a)return t;const o=t.split("/");return o.length<=3?t:`${o[0]}/.../${o.slice(-2).join("/")}`}function G(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\x1b\[[\?]?[0-9;]*[a-zA-Z]|\x1b/g,"").replace(/[\x00-\x1f]/g,"").trim()}function U(t,a=80){if(!t)return"";const o=t.split(`
2
+ `).map(b=>G(b)).filter(b=>b.trim()),f=o[o.length-1]||"";return f.length<=a?f:`${f.slice(0,a)}...`}function X(t){return t.split("/").pop()||t}async function we(t,a){if(t.preventDefault(),t.stopPropagation(),!!e(w)?.apiKey)try{(await fetch(`/api/terminals/${a}`,{headers:{Authorization:`Bearer ${e(w).apiKey}`},method:"DELETE"})).ok&&(i(m,e(m).filter(f=>f.id!==a),!0),Ie(P,e(m)))}catch(o){console.error("Failed to remove terminal:",o)}}var ee=kt();it("1ewpmn2",t=>{var a=gt();tt(()=>{at.title="Terminals - Shooter"}),u(t,a)});var te=ke(ee),ae=r(te),v=r(ae),q=l(r(v),2),$=r(q);Q($,{classes:"btn-secondary",onclick:_e,get disabled(){return e(_)},children:(t,a)=>{var o=_t(),f=ke(o);mt(f,{name:"refresh",size:14}),pe(),u(t,o)},$$slots:{default:!0}});var xe=l($,2);Q(xe,{classes:"btn-primary",onclick:oe,children:(t,a)=>{var o=wt();pe(),u(t,o)},$$slots:{default:!0}}),s(q),s(v),s(ae);var ce=l(ae,2);{var Le=t=>{Me(t,{get text(){return e(j)},classes:"banner-error"})};K(ce,t=>{e(j)&&t(Le)})}var de=l(ce,2);{var Fe=t=>{var a=xt();ue(a,20,()=>Array(4),lt,(o,f)=>{pt(o,{classes:"shimmer-card"})}),s(a),u(t,a)},Re=t=>{Ke(t,{icon:"settings",title:"Configuration Required",description:"Set up your API credentials to view terminal sessions",children:(a,o)=>{Q(a,{classes:"btn-primary",onclick:ie,text:"Configure Settings"})}})},He=t=>{Ke(t,{icon:"terminal",title:"No terminals",description:"Launch a new terminal session to get started. Terminal sessions will appear here once created.",children:(a,o)=>{Q(a,{classes:"btn-primary",onclick:oe,children:(f,b)=>{var n=bt();pe(),u(f,n)},$$slots:{default:!0}})}})},qe=t=>{var a=Pt(),o=r(a);ue(o,17,()=>e(fe),b=>b.id,(b,n)=>{const se=S(()=>g(e(n)));var N=$t(),z=r(N),B=r(z),D=r(B),be=r(D);s(D);var J=l(D,2),ye=r(J,!0);s(J);var Ce=l(J,2);Se(Ce,{get text(){return e(se).label},get classes(){return e(se).class}}),s(B);var re=l(B,2),ne=r(re,!0);s(re),s(z);var le=l(z,2),ve=r(le);{let d=S(()=>e(n).currentCwd||e(n).cwd);Ee(ve,{get text(){return e(d)},position:"bottom",children:(p,T)=>{var O=yt(),M=r(O,!0);s(O),F(Qe=>A(M,Qe),[()=>Y(e(n).currentCwd||e(n).cwd)]),u(p,O)},$$slots:{default:!0}})}var Z=l(ve,2),$e=r(Z);s(Z),s(le);var Te=l(le,2);{var Ae=d=>{var p=Ct(),T=r(p),O=r(T,!0);s(T),s(p),F(M=>A(O,M),[()=>U(e(n).lastOutput)]),u(d,p)};K(Te,d=>{e(n).lastOutput&&d(Ae)})}s(N),F((d,p)=>{Ne(N,"href",`/terminals/${e(n).id??""}`),ot(be,1,ct(e(n).isActive?"status-dot-active":"status-dot-idle"),"svelte-1ewpmn2"),A(ye,d),A(ne,p),A($e,`PID ${e(n).pid??""}`)},[()=>X(e(n).command),()=>Pe(e(n).createdAt)]),u(b,N)});var f=l(o,2);ue(f,17,()=>e(he),b=>b.id,(b,n)=>{const se=S(()=>g(e(n)));var N=St(),z=r(N),B=r(z),D=l(r(B),2),be=r(D,!0);s(D);var J=l(D,2);Se(J,{get text(){return e(se).label},get classes(){return e(se).class}});var ye=l(J,2);{var Ce=d=>{{let p=S(()=>e(n).exitCode!==0?"pill-exit-error":"pill-exit-ok");Se(d,{get text(){return`exit ${e(n).exitCode??""}`},get classes(){return e(p)}})}};K(ye,d=>{e(n).exitCode!==null&&d(Ce)})}s(B);var re=l(B,2),ne=r(re),le=r(ne,!0);s(ne);var ve=l(ne,2);Q(ve,{classes:"btn-ghost btn-sm btn-remove",onclick:d=>we(d,e(n).id),text:"×"}),s(re),s(z);var Z=l(z,2),$e=r(Z);Ee($e,{get text(){return e(n).cwd},position:"bottom",children:(d,p)=>{var T=Tt(),O=r(T,!0);s(T),F(M=>A(O,M),[()=>Y(e(n).cwd)]),u(d,T)},$$slots:{default:!0}}),s(Z);var Te=l(Z,2);{var Ae=d=>{var p=At(),T=r(p),O=r(T,!0);s(T),s(p),F(M=>A(O,M),[()=>U(e(n).lastOutput)]),u(d,p)};K(Te,d=>{e(n).lastOutput&&d(Ae)})}s(N),F((d,p)=>{Ne(N,"href",`/terminals/${e(n).id??""}`),A(be,d),A(le,p)},[()=>X(e(n).command),()=>e(n).exitedAt?Pe(e(n).exitedAt):Pe(e(n).createdAt)]),u(b,N)}),s(a),u(t,a)};K(de,t=>{e(_)&&e(m).length===0?t(Fe):e(w)?.apiKey?e(m).length===0?t(He,2):t(qe,-1):t(Re,1)})}s(te);var Je=l(te,2);{var Ze=t=>{ht(t,{get open(){return e(H)},get apiKey(){return e(w).apiKey},onClose:c,onLaunch:x})};K(Je,t=>{e(w)?.apiKey&&t(Ze)})}u(me,ee),De()}export{Rt as component};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/B8zoBsv3.js","../chunks/PPVm8Dsz.js"])))=>i.map(i=>d[i]);
2
+ import{_ as _e}from"../chunks/PPVm8Dsz.js";import{s as at,a as S,f as C,c as ke,d as Se,g as xe,h as Ce,b as Ie}from"../chunks/r0JawsZc.js";import{p as rt,w as ot,z as t,B as w,c as k,s as c,r as h,t as H,f as zt,o as m,q as Te,u as je,v as qe,D as Ee,y as n,$ as Ke}from"../chunks/CZHsSL_X.js";import{i as E}from"../chunks/B8XegpSE.js";import{h as De}from"../chunks/BOYo8yTr.js";import{c as $e,s as vt,B as Y,e as Bt,M as Ae,K as Me,P as Ot,d as Rt,T as Lt,f as Pe,I as Ne}from"../chunks/B5NAKyil.js";import{a as ft}from"../chunks/CQjSATpv.js";import{p as Oe,b as Wt}from"../chunks/Bu1aqm5j.js";import{g as Z}from"../chunks/B-K5Sh65.js";import{p as Re}from"../chunks/BYqGCrTe.js";import{E as Le}from"../chunks/CSoRdFvv.js";import{C as We}from"../chunks/DVkn4r72.js";function ze(g,r){rt(r,!0);let b=Oe(r,"open",15,!1);const u=w(()=>r.commands.map((_,s)=>({label:_.label,value:String(s)})));function T(_){const s=parseInt(_.value,10);r.commands[s]&&r.commands[s].action()}$e(g,{get items(){return t(u)},placeholder:"Type a command...",emptyText:"No matching commands",onselect:T,get onclose(){return r.onClose},classes:"command-palette",get open(){return b()},set open(_){b(_)}}),ot()}var Be=C('<div><span></span> <span class="status-label svelte-1cg9pai"> </span> <!></div>');function Fe(g,r){const b=w(()=>r.status==="connected"?"Connected":r.status==="reconnecting"?"Reconnecting...":"Disconnected");var u=Be();let T;var _=k(u),s=c(_,2),N=k(s,!0);h(s);var K=c(s,2);{var j=x=>{Y(x,{classes:"btn-ghost btn-sm btn-retry",get onclick(){return r.onretry},text:"Retry"})};E(K,x=>{r.status==="disconnected"&&r.onretry&&x(j)})}h(u),H(()=>{T=ft(u,1,"connection-status svelte-1cg9pai",null,T,{reconnecting:r.status==="reconnecting",disconnected:r.status==="disconnected",connected:r.status==="connected"}),vt(u,"aria-label",`Connection: ${r.status??""}`),ft(_,1,`status-dot ${r.status??""}`,"svelte-1cg9pai"),at(N,t(b))}),S(g,u)}const Ft=typeof navigator<"u"&&/Mac|iPhone|iPad/.test(navigator.userAgent),pt=Ft?"⌘":"Ctrl";function He(g){function r(b){if((Ft?b.metaKey:b.ctrlKey)&&!Je()&&b.key==="/"){b.preventDefault(),b.stopPropagation(),g.onHelp();return}}return window.addEventListener("keydown",r,!0),{destroy(){window.removeEventListener("keydown",r,!0)}}}function Ue(){return[{description:"Command palette",keys:`${pt}+K`},{description:"Keyboard shortcuts",keys:`${pt}+/`}]}function Je(){const g=document.activeElement;if(!g)return!1;const r=g.tagName;return!!(r==="INPUT"||r==="TEXTAREA"||g.isContentEditable||g.closest(".xterm"))}var Ge=C('<div class="quick-keys svelte-64qat5" role="toolbar" aria-label="Quick terminal keys"></div>');function Ve(g,r){rt(r,!0);const b=[{escape:"",label:"Ctrl+C"},{escape:" ",label:"Tab"},{escape:"\x1B[A",label:"↑"},{escape:"\x1B[B",label:"↓"},{escape:"\x1B",label:"Esc"},{escape:"",label:"Ctrl+D"},{escape:"",label:"Ctrl+Z"}];var u=Ge();Bt(u,21,()=>b,T=>T.label,(T,_)=>{Y(T,{classes:"btn-quick-key",onclick:()=>{r.onKey(t(_).escape)},get text(){return t(_).label}})}),h(u),S(g,u),ot()}var Qe=C('<div class="shortcut-row svelte-1u7lstk"><span class="shortcut-desc svelte-1u7lstk"> </span> <!></div>'),Xe=C('<div class="shortcuts-list svelte-1u7lstk"></div>');function Ze(g,r){rt(r,!0);const b=Ue();var u=ke(),T=zt(u);{var _=s=>{Ae(s,{header:{text:"Keyboard Shortcuts"},get onoverlayClick(){return r.onClose},classes:"shortcuts-modal",content:K=>{var j=Xe();Bt(j,21,()=>b,x=>x.keys,(x,W)=>{var O=Qe(),d=k(O),q=k(d,!0);h(d);var A=c(d,2);Me(A,{get keys(){return t(W).keys},classes:"shortcut-kbd"}),h(O),H(()=>at(q,t(W).description)),S(x,O)}),h(j),S(K,j)},$$slots:{content:!0}})};E(T,s=>{r.open&&s(_)})}S(g,u),ot()}var Ye=C('<meta name="description" content="Interactive terminal session" class="svelte-1tubujq"/>'),tn=C('<div class="term-page svelte-1tubujq"><div class="term-topbar svelte-1tubujq"><div class="skeleton svelte-1tubujq" style="width: 120px; height: 20px;"></div></div> <div class="term-body-loading svelte-1tubujq"><div class="skeleton svelte-1tubujq" style="width: 100%; height: 100%;"></div></div></div>'),en=C('<main class="main svelte-1tubujq"><div class="session-back-row svelte-1tubujq"><a href="/terminals" class="back-link svelte-1tubujq"><span class="back-arrow svelte-1tubujq">&larr;</span> Terminals</a></div> <!></main>'),nn=C("<span></span>"),sn=C('<span class="term-cwd svelte-1tubujq"> </span>'),an=C('<a class="term-session-link svelte-1tubujq" title="View session history">Session</a>'),rn=C('<div class="term-input-area svelte-1tubujq"><!> <div class="term-input-bar svelte-1tubujq"><!> <!></div></div>'),on=C('<div class="term-exited-bar svelte-1tubujq"><span class="svelte-1tubujq">Process exited</span> <!></div>'),ln=C('<div class="term-page svelte-1tubujq"><div class="term-topbar svelte-1tubujq"><div class="term-topbar-left svelte-1tubujq"><a href="/terminals" class="term-back svelte-1tubujq" aria-label="Back to terminals">&larr;</a> <span class="term-command-name svelte-1tubujq"> </span> <!> <!> <!> <!> <!></div> <div class="term-topbar-right svelte-1tubujq"><!> <button class="term-shortcuts-btn svelte-1tubujq" type="button" aria-label="Keyboard shortcuts">?</button> <!></div></div> <div class="term-body svelte-1tubujq"></div> <!> <div class="term-chat-body svelte-1tubujq"><!></div> <!></div>'),cn=C("<!> <!> <!>",1);function kn(g,r){rt(r,!0);const b=()=>Ce(Re,"$page",u),[u,T]=xe(),_=["claude","opencode"];let s=m(null),N=m(!0),K=m(null),j=m(!1),x=m(!1),W=m(!1),O=m(null),d=m("raw"),q=m("disconnected"),A=m("disconnected"),z=m(""),v=m(Te([])),mt=m(!1),U=m(null),it=m(null),M=null,ht=null,R=m(!1),lt=m(!1),f=null,L=null,p=!1;const J=w(()=>b().params.id),G=w(()=>t(s)?_.includes((t(s).command.split("/").pop()||"").toLowerCase()):!1),B=w(()=>t(s)?.status==="running"),gt=w(()=>t(s)?.command.split("/").pop()||"terminal"),Ht=w(()=>t(G)?"AI":"SHELL"),Ut=w(()=>t(G)?"pill-badge-ai":"pill-badge-shell"),Jt=["Raw","Chat"],bt=w(()=>t(d)==="raw"?t(q):t(A)),Gt=w(()=>t(d)==="raw"?0:1),yt=w(()=>Qt(t(O)||t(s)?.cwd||"")),Vt=w(()=>{const e=[{action:()=>{Z("/")},label:"Go to Home"},{action:()=>{Z("/terminals")},label:"Go to Terminals"},{action:()=>{Z("/config")},label:"Go to Settings"},{action:()=>{n(R,!0)},label:"Show keyboard shortcuts"}];return t(B)&&e.push({action:()=>{_t()},label:"Kill terminal"}),e});function Qt(e){if(!e)return"";const a="";let i=e;if(typeof navigator<"u"){const l=e.split("/");l.length>=3&&l[1]==="Users"?i=`~/${l.slice(3).join("/")}`:l.length>=3&&l[1]==="home"&&(i=`~/${l.slice(3).join("/")}`)}if(i.length>30){const l=i.split("/");if(l.length>2)return`.../${l.slice(-2).join("/")}`}return i||a}function V(){try{const e=localStorage.getItem("shooter_config");if(!e)return null;const a=JSON.parse(e);return typeof a?.apiKey=="string"&&a.apiKey?a:null}catch{return null}}async function Xt(){const e=V();if(!e){n(K,"No configuration found. Please configure settings first."),n(N,!1);return}try{const a=await fetch(`/api/terminals/${t(J)}`,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!a.ok){n(K,a.status===404?"Terminal not found":"Failed to load terminal",!0),n(N,!1);return}n(s,await a.json(),!0)}catch{n(K,"Failed to connect to server")}n(N,!1)}async function wt(){const e=V();if(!e)return null;try{const a=await fetch("/api/ws-ticket",{headers:{Authorization:`Bearer ${e.apiKey}`},method:"POST"});return a.ok?(await a.json()).ticket:null}catch{return null}}async function _t(){if(!t(s)||t(j))return;const e=V();if(e){n(j,!0);try{(await fetch(`/api/terminals/${t(J)}`,{headers:{Authorization:`Bearer ${e.apiKey}`},method:"DELETE"})).ok?Z("/terminals"):n(j,!1)}catch{n(j,!1)}}}async function Zt(){if(!t(s)||t(x))return;const e=V();if(e){n(x,!0);try{(await fetch(`/api/terminals/${t(J)}`,{headers:{Authorization:`Bearer ${e.apiKey}`},method:"DELETE"})).ok?Z("/terminals"):n(x,!1)}catch{n(x,!1)}}}async function ct(){if(!t(U)||!t(s)||p)return;const a=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${t(s).ws}`,i=async()=>{const l=await wt();if(!l)throw new Error("Failed to obtain WebSocket ticket");return l};try{const{createTerminal:l}=await _e(async()=>{const{createTerminal:$}=await import("../chunks/B8zoBsv3.js");return{createTerminal:$}},__vite__mapDeps([0,1]),import.meta.url);if(p||!t(U))return;const P=await l({apiKey:V()?.apiKey,container:t(U),fontSize:window.innerWidth<768?12:14,getTicket:i,onActivity:$=>{p||n(W,$,!0)},onCwd:$=>{p||n(O,$,!0)},onDisconnect:()=>{p||n(q,"reconnecting")},onExit:$=>{!p&&t(s)&&(n(s,{...t(s),exitCode:$,exitedAt:new Date().toISOString(),status:"exited"},!0),n(q,"disconnected"))},onReconnect:()=>{p||n(q,"connected")},terminalId:t(J),wsUrl:a});if(p){P.dispose();return}M=P,n(q,"connected")}catch(l){console.error("Failed to initialize terminal:",l),n(q,"disconnected")}}function kt(){M&&(M.dispose(),M=null)}async function tt(){if(!t(s)||p||f&&(f.readyState===WebSocket.OPEN||f.readyState===WebSocket.CONNECTING))return;const e=await wt();if(!e||p||!t(s)){n(A,"disconnected");return}const i=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${t(s).sessionWs}?ticket=${e}`;f=new WebSocket(i),f.onopen=()=>{p||(n(A,"connected"),f?.send(JSON.stringify({sessionId:t(J),type:"subscribe"})))},f.onmessage=l=>{if(!p)try{const P=JSON.parse(l.data);Yt(P)}catch{}},f.onclose=()=>{!p&&t(s)?.status==="running"&&(n(A,"reconnecting"),L&&clearTimeout(L),L=setTimeout(()=>{L=null,!p&&t(s)?.status==="running"&&tt()},2e3))},f.onerror=()=>{p||n(A,"disconnected")}}function Yt(e){if(e.type==="history"){const a=e.messages||[];n(v,a.map(i=>({id:i.id,parts:i.content,role:i.role,timestamp:i.timestamp})),!0)}else if(e.type==="message")n(v,[...t(v),{id:`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:e.content||[],role:e.role||"assistant",timestamp:e.timestamp||new Date().toISOString()}],!0);else if(e.type==="tool-use")n(v,[...t(v),{id:`tool-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[{id:e.id||`tool-${Date.now()}`,input:e.input||{},toolName:e.name,type:"tool_use"}],role:"assistant",timestamp:new Date().toISOString()}],!0);else if(e.type==="tool-result")n(v,[...t(v),{id:`result-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[{isError:e.isError||!1,output:e.output||"",toolUseId:e.id,type:"tool_result"}],role:"system",timestamp:new Date().toISOString()}],!0);else if(e.type==="thinking"){const a={content:e.text||"",type:"thinking"},i=t(v).length>0?t(v)[t(v).length-1]:null;i?.role==="assistant"?n(v,[...t(v).slice(0,-1),{...i,parts:[...i.parts,a]}],!0):n(v,[...t(v),{id:`think-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[a],role:"assistant",timestamp:new Date().toISOString()}],!0)}else e.type==="error"?n(v,[...t(v),{id:`err-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,parts:[{content:e.message||"Unknown error",type:"text"}],role:"system",timestamp:new Date().toISOString()}],!0):e.type==="session-end"&&(n(mt,!0),t(s)&&n(s,{...t(s),status:"exited"},!0))}function St(){L&&(clearTimeout(L),L=null),f&&(f.onclose=null,f.close(),f=null)}function xt(){t(z).trim()&&(M&&t(q)==="connected"&&M.sendInput(`${t(z)}\r`),n(z,""),t(it)?.focus())}function te(e){!e.trim()||f?.readyState!==WebSocket.OPEN||f.send(JSON.stringify({text:e,type:"send-input"}))}function Ct(){f?.readyState===WebSocket.OPEN&&f.send(JSON.stringify({type:"cancel"}))}function ee(e){t(d)==="raw"?M&&t(q)==="connected"&&M.sendInput(e):t(d)==="chat"&&e===""&&Ct()}function ne(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),xt())}let et=!1,nt=!1;function se(e){e!==t(d)&&(n(d,e,!0),e==="raw"&&!et?(requestAnimationFrame(()=>{ct()}),et=!0):e==="chat"&&!nt&&(tt(),nt=!0))}function ae(){t(d)==="raw"?(kt(),n(q,"reconnecting"),ct(),et=!0):(St(),n(A,"reconnecting"),tt(),nt=!0)}je(async()=>{await Xt(),!p&&(ht=He({onHelp:()=>{n(R,!t(R))}}),!(!t(s)||t(K))&&(t(G)&&window.innerWidth<768?n(d,"chat"):n(d,"raw"),t(d)==="raw"?(requestAnimationFrame(()=>{ct()}),et=!0):(tt(),nt=!0)))}),qe(()=>{p=!0,kt(),St(),ht?.destroy()});var It=cn();De("1tubujq",e=>{var a=Ye();Ee(()=>{Ke.title=`${t(gt)??""} - Terminal - Shooter`}),S(e,a)});var Tt=zt(It);{var re=e=>{var a=tn();S(e,a)},oe=e=>{var a=en(),i=c(k(a),2);Le(i,{icon:"alert-triangle",title:"Error",get description(){return t(K)}}),h(a),S(e,a)},ie=e=>{var a=ln(),i=k(a),l=k(i),P=c(k(l),2),$=k(P,!0);h(P);var qt=c(P,2);Ot(qt,{get text(){return t(Ht)},get classes(){return t(Ut)}});var Et=c(qt,2);{var ce=o=>{{let y=w(()=>t(W)?"Active":"Idle");Lt(o,{get text(){return t(y)},position:"bottom",children:(D,F)=>{var I=nn();H(()=>ft(I,1,`activity-dot ${t(W)?"activity-active":"activity-idle"}`,"svelte-1tubujq")),S(D,I)},$$slots:{default:!0}})}};E(Et,o=>{t(B)&&o(ce)})}var Kt=c(Et,2);{var ue=o=>{{let y=w(()=>t(O)||t(s)?.cwd||"");Lt(o,{get text(){return t(y)},position:"bottom",children:(D,F)=>{var I=sn(),Q=k(I,!0);h(I),H(()=>at(Q,t(yt))),S(D,I)},$$slots:{default:!0}})}};E(Kt,o=>{t(yt)&&o(ue)})}var Dt=c(Kt,2);Fe(Dt,{get status(){return t(bt)},onretry:ae});var de=c(Dt,2);{var ve=o=>{var y=an();H(D=>vt(y,"href",`/session/${D??""}`),[()=>t(s).sessionFile.split(/[\\/]/).pop()?.replace(".jsonl","")||""]),S(o,y)};E(de,o=>{t(G)&&t(s)?.sessionFile&&o(ve)})}h(l);var $t=c(l,2),At=k($t);{var fe=o=>{Pe(o,{get items(){return Jt},get activeIndex(){return t(Gt)},onchange:y=>{se(y===0?"raw":"chat")},classes:"term-tabs"})};E(At,o=>{t(G)&&o(fe)})}var ut=c(At,2),pe=c(ut,2);{var me=o=>{Y(o,{classes:"btn-danger btn-sm",onclick:_t,get disabled(){return t(j)},get showLoader(){return t(j)},text:"Kill"})},he=o=>{Y(o,{classes:"btn-secondary btn-sm",onclick:Zt,get disabled(){return t(x)},get showLoader(){return t(x)},text:"Remove"})};E(pe,o=>{t(B)?o(me):o(he,-1)})}h($t),h(i);var dt=c(i,2);let Mt;Wt(dt,o=>n(U,o),()=>t(U));var Pt=c(dt,2);{var ge=o=>{var y=rn(),D=k(y);Ve(D,{onKey:ee});var F=c(D,2),I=k(F);Wt(Ne(I,{dataType:"text",useTextArea:!0,placeholder:"Type command... (Shift+Enter for new line)",classes:"input-mono term-input-field",onKeyDown:ne,get value(){return t(z)},set value(X){n(z,X,!0)}}),X=>n(it,X,!0),()=>t(it));var Q=c(I,2);{let X=w(()=>!t(z).trim());Y(Q,{classes:"btn-primary btn-send",onclick:xt,get disabled(){return t(X)},text:"↵"})}h(F),h(y),S(o,y)};E(Pt,o=>{t(B)&&t(d)==="raw"&&o(ge)})}var st=c(Pt,2);let Nt;var be=k(st);We(be,{get messages(){return t(v)},get connectionState(){return t(bt)},get sessionEnded(){return t(mt)},get showInput(){return t(B)},onSendInput:te,onCancel:Ct}),h(st);var ye=c(st,2);{var we=o=>{var y=on(),D=c(k(y),2);{var F=I=>{{let Q=w(()=>t(s).exitCode!==0?"pill-exit-error":"pill-exit-ok");Ot(I,{get text(){return`code ${t(s).exitCode??""}`},get classes(){return t(Q)}})}};E(D,I=>{t(s).exitCode!==null&&I(F)})}h(y),S(o,y)};E(ye,o=>{t(B)||o(we)})}h(a),H(()=>{at($,t(gt)),vt(ut,"title",`${pt??""}+/ for shortcuts`),Mt=Rt(dt,"",Mt,{display:t(d)==="raw"?"flex":"none"}),Nt=Rt(st,"",Nt,{display:t(d)==="chat"?"flex":"none"})}),Ie("click",ut,()=>{n(R,!t(R))}),S(e,a)};E(Tt,e=>{t(N)?e(re):t(K)?e(oe,1):t(s)&&e(ie,2)})}var jt=c(Tt,2);Ze(jt,{get open(){return t(R)},onClose:()=>{n(R,!1)}});var le=c(jt,2);ze(le,{get commands(){return t(Vt)},onClose:()=>{n(lt,!1)},get open(){return t(lt)},set open(e){n(lt,e,!0)}}),S(g,It),ot(),T()}Se(["click"]);export{kn as component};
@@ -1 +1 @@
1
- {"version":"1774431915522"}
1
+ {"version":"1775074163772"}
Binary file
Binary file
Binary file
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "Shooter",
3
+ "short_name": "Shooter",
4
+ "description": "Remote terminal & notifications for Claude Code",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "background_color": "#0a0a0a",
8
+ "theme_color": "#0a0a0a",
9
+ "icons": [
10
+ { "src": "/pwa-192x192.png", "sizes": "192x192", "type": "image/png" },
11
+ { "src": "/pwa-512x512.png", "sizes": "512x512", "type": "image/png" }
12
+ ]
13
+ }
Binary file
Binary file
@@ -15,7 +15,7 @@ const pty = require('node-pty');
15
15
  // Parse arguments
16
16
  // ---------------------------------------------------------------------------
17
17
 
18
- const [,, id, socketPath, cwd, colsStr, rowsStr, command, ...args] = process.argv;
18
+ const [, , id, socketPath, cwd, colsStr, rowsStr, command, ...args] = process.argv;
19
19
 
20
20
  if (!id || !socketPath || !cwd || !colsStr || !rowsStr || !command) {
21
21
  process.stderr.write('pty-holder: missing required arguments\n');
@@ -31,6 +31,29 @@ const rows = parseInt(rowsStr, 10);
31
31
 
32
32
  const MAX_SCROLLBACK_LINES = 5000;
33
33
  const MAX_INPUT_BYTES = 65_536; // 64 KB — cap per-write to prevent memory abuse
34
+
35
+ /**
36
+ * Truncate a string to at most maxBytes bytes without splitting a multi-byte
37
+ * UTF-8 character. String.prototype.slice() counts UTF-16 code units, not
38
+ * bytes, so a naive slice can produce more bytes than intended or cut a
39
+ * multi-byte character in half. This helper uses Buffer to measure byte length
40
+ * and binary-searches for the right code-unit boundary.
41
+ */
42
+ function truncateUtf8(str, maxBytes) {
43
+ if (Buffer.byteLength(str, 'utf8') <= maxBytes) return str;
44
+ // Binary search for the largest code-unit prefix that fits
45
+ let lo = 0;
46
+ let hi = str.length;
47
+ while (lo < hi) {
48
+ const mid = (lo + hi + 1) >>> 1;
49
+ if (Buffer.byteLength(str.slice(0, mid), 'utf8') <= maxBytes) {
50
+ lo = mid;
51
+ } else {
52
+ hi = mid - 1;
53
+ }
54
+ }
55
+ return str.slice(0, lo);
56
+ }
34
57
  const GRACE_PERIOD_MS = 60_000; // 60 seconds after PTY exit before self-terminating
35
58
  const ACTIVITY_IDLE_MS = 5_000; // 5 seconds of no output → idle
36
59
 
@@ -49,7 +72,7 @@ function pushScrollback(data) {
49
72
  while (scrollbackLineCount > MAX_SCROLLBACK_LINES && scrollbackChunks.length > 1) {
50
73
  const removed = scrollbackChunks.shift();
51
74
  if (removed) {
52
- scrollbackLineCount -= (removed.split('\n').length - 1);
75
+ scrollbackLineCount -= removed.split('\n').length - 1;
53
76
  }
54
77
  }
55
78
  }
@@ -85,7 +108,11 @@ const ptyEnv = { ...process.env };
85
108
 
86
109
  // Clipboard image paste support: per-terminal clipboard directory
87
110
  const clipboardDir = path.join(os.tmpdir(), `shooter-clipboard-${id}`);
88
- try { fs.mkdirSync(clipboardDir, { recursive: true }); } catch { /* best effort */ }
111
+ try {
112
+ fs.mkdirSync(clipboardDir, { recursive: true });
113
+ } catch {
114
+ /* best effort */
115
+ }
89
116
  ptyEnv.SHOOTER_CLIPBOARD_DIR = clipboardDir;
90
117
 
91
118
  // Prepend clipboard shim scripts to PATH so tools find our xclip/wl-paste
@@ -102,7 +129,10 @@ let spawnCommand;
102
129
  let spawnArgs;
103
130
 
104
131
  if (SHELL_COMMANDS.includes(commandBase)) {
105
- if (commandBase === 'zsh' || (commandBase === 'sh' && (process.env.SHELL || '').includes('zsh'))) {
132
+ if (
133
+ commandBase === 'zsh' ||
134
+ (commandBase === 'sh' && (process.env.SHELL || '').includes('zsh'))
135
+ ) {
106
136
  // zsh: use ZDOTDIR with custom .zshrc
107
137
  const zdotdir = path.join(os.tmpdir(), `shooter-zd-${id}`);
108
138
  try {
@@ -208,7 +238,8 @@ function broadcast(msg) {
208
238
  // ---------------------------------------------------------------------------
209
239
 
210
240
  // Matches: \x1b]7;file://hostname/path\x1b\\ or \x1b]7;file://hostname/path\x07
211
- const OSC7_RE = /\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)\x07|\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)\x1b\\/g;
241
+ const OSC7_RE =
242
+ /\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)\x07|\x1b\]7;file:\/\/[^/]*([^\x07\x1b]*)\x1b\\/g;
212
243
 
213
244
  // Buffer for incomplete OSC 7 sequences split across data chunks
214
245
  let osc7PartialBuf = '';
@@ -391,9 +422,7 @@ function handleMessage(msg) {
391
422
  // static-analysis scanners and prevent memory abuse.
392
423
  if (!exited && typeof msg.data === 'string' && msg.data.length > 0) {
393
424
  try {
394
- const input = msg.data.length > MAX_INPUT_BYTES
395
- ? msg.data.slice(0, MAX_INPUT_BYTES)
396
- : msg.data;
425
+ const input = truncateUtf8(msg.data, MAX_INPUT_BYTES);
397
426
  ptyProcess.write(input); // CodeQL[js/code-injection] — intentional PTY stdin
398
427
  } catch {
399
428
  // PTY may have closed between check and write
@@ -0,0 +1,9 @@
1
+ const index = 0;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('./_layout.svelte-CtWmEJwe.js')).default;
4
+ const imports = ["_app/immutable/nodes/0.D2YR8tTD.js","_app/immutable/chunks/r0JawsZc.js","_app/immutable/chunks/CZHsSL_X.js","_app/immutable/chunks/CQjSATpv.js","_app/immutable/chunks/B-K5Sh65.js","_app/immutable/chunks/BYqGCrTe.js"];
5
+ const stylesheets = ["_app/immutable/assets/markdown.Dc-OSJWY.css","_app/immutable/assets/0.BhZOCxO4.css"];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=0-Vk38tI2J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"0-Vk38tI2J.js","sources":["../../../.svelte-kit/adapter-node/nodes/0.js"],"sourcesContent":["\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/0.D2YR8tTD.js\",\"_app/immutable/chunks/r0JawsZc.js\",\"_app/immutable/chunks/CZHsSL_X.js\",\"_app/immutable/chunks/CQjSATpv.js\",\"_app/immutable/chunks/B-K5Sh65.js\",\"_app/immutable/chunks/BYqGCrTe.js\"];\nexport const stylesheets = [\"_app/immutable/assets/markdown.Dc-OSJWY.css\",\"_app/immutable/assets/0.BhZOCxO4.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8BAAoC,CAAC,EAAE;AAClG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AACpO,MAAC,WAAW,GAAG,CAAC,6CAA6C,CAAC,sCAAsC;AACpG,MAAC,KAAK,GAAG;;;;"}