@juspay/shooter 1.19.0 → 1.21.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 (283) hide show
  1. package/build/client/_app/immutable/assets/11.F10lvwyh.css +1 -0
  2. package/build/client/_app/immutable/assets/11.F10lvwyh.css.br +0 -0
  3. package/build/client/_app/immutable/assets/11.F10lvwyh.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/2.BHi6pjT2.css +1 -0
  5. package/build/client/_app/immutable/assets/2.BHi6pjT2.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.BHi6pjT2.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{ZS5XYDx_.js → B1bOvemT.js} +1 -1
  8. package/build/client/_app/immutable/chunks/B1bOvemT.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/{ZS5XYDx_.js.gz → B1bOvemT.js.gz} +0 -0
  10. package/build/client/_app/immutable/chunks/{DCDL_9ys.js → BmfLecb1.js} +1 -1
  11. package/build/client/_app/immutable/chunks/BmfLecb1.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/BmfLecb1.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/C87ZRWX0.js +1 -0
  14. package/build/client/_app/immutable/chunks/C87ZRWX0.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/C87ZRWX0.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{BvmdJful.js → CJulw9ux.js} +1 -1
  17. package/build/client/_app/immutable/chunks/CJulw9ux.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/CJulw9ux.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/DOEXXmsh.js +3 -0
  20. package/build/client/_app/immutable/chunks/DOEXXmsh.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/DOEXXmsh.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{ClIPTXf3.js → DomZZqvG.js} +1 -1
  23. package/build/client/_app/immutable/chunks/DomZZqvG.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/DomZZqvG.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{DA4Zt9Me.js → EqMAkEha.js} +1 -1
  26. package/build/client/_app/immutable/chunks/EqMAkEha.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/EqMAkEha.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/J5-Cr5oR.js +6 -0
  29. package/build/client/_app/immutable/chunks/J5-Cr5oR.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/J5-Cr5oR.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/{BB2l8o4X.js → i5iZvmIH.js} +1 -1
  32. package/build/client/_app/immutable/chunks/i5iZvmIH.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/i5iZvmIH.js.gz +0 -0
  34. package/build/client/_app/immutable/entry/{app.D4TXlu7A.js → app.CeSxgGat.js} +2 -2
  35. package/build/client/_app/immutable/entry/app.CeSxgGat.js.br +0 -0
  36. package/build/client/_app/immutable/entry/app.CeSxgGat.js.gz +0 -0
  37. package/build/client/_app/immutable/entry/start.DrnJFwxA.js +1 -0
  38. package/build/client/_app/immutable/entry/start.DrnJFwxA.js.br +2 -0
  39. package/build/client/_app/immutable/entry/start.DrnJFwxA.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/0.oaPwxh1O.js +10 -0
  41. package/build/client/_app/immutable/nodes/0.oaPwxh1O.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/0.oaPwxh1O.js.gz +0 -0
  43. package/build/client/_app/immutable/nodes/{1.BVnLUSs-.js → 1.DMPyoM-M.js} +1 -1
  44. package/build/client/_app/immutable/nodes/1.DMPyoM-M.js.br +0 -0
  45. package/build/client/_app/immutable/nodes/1.DMPyoM-M.js.gz +0 -0
  46. package/build/client/_app/immutable/nodes/{10.D1wl2wPX.js → 10.Cbm7nQKK.js} +1 -1
  47. package/build/client/_app/immutable/nodes/10.Cbm7nQKK.js.br +0 -0
  48. package/build/client/_app/immutable/nodes/10.Cbm7nQKK.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/11.CKmZjP_a.js +2 -0
  50. package/build/client/_app/immutable/nodes/11.CKmZjP_a.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/11.CKmZjP_a.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/2.zlrdNFtH.js +13 -0
  53. package/build/client/_app/immutable/nodes/2.zlrdNFtH.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/2.zlrdNFtH.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/{3.Wfz3TcJd.js → 3.BgLpGnzb.js} +1 -1
  56. package/build/client/_app/immutable/nodes/3.BgLpGnzb.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/3.BgLpGnzb.js.gz +0 -0
  58. package/build/client/_app/immutable/nodes/{4.CBX9A3ka.js → 4.BFYS2g9C.js} +3 -3
  59. package/build/client/_app/immutable/nodes/4.BFYS2g9C.js.br +0 -0
  60. package/build/client/_app/immutable/nodes/4.BFYS2g9C.js.gz +0 -0
  61. package/build/client/_app/immutable/nodes/{5.DIVKuZc9.js → 5.Avc1-gVb.js} +1 -1
  62. package/build/client/_app/immutable/nodes/5.Avc1-gVb.js.br +0 -0
  63. package/build/client/_app/immutable/nodes/5.Avc1-gVb.js.gz +0 -0
  64. package/build/client/_app/immutable/nodes/{6.DtZAEPXb.js → 6.Dw2wEssJ.js} +1 -1
  65. package/build/client/_app/immutable/nodes/6.Dw2wEssJ.js.br +0 -0
  66. package/build/client/_app/immutable/nodes/6.Dw2wEssJ.js.gz +0 -0
  67. package/build/client/_app/immutable/nodes/{7.MfBRh32I.js → 7.DwKZjoBg.js} +1 -1
  68. package/build/client/_app/immutable/nodes/7.DwKZjoBg.js.br +0 -0
  69. package/build/client/_app/immutable/nodes/7.DwKZjoBg.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/{8.DVE6LnOC.js → 8.ZUAI6g5E.js} +1 -1
  71. package/build/client/_app/immutable/nodes/8.ZUAI6g5E.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/8.ZUAI6g5E.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/{9.BCel5OqI.js → 9.I_KGXPwB.js} +1 -1
  74. package/build/client/_app/immutable/nodes/9.I_KGXPwB.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/9.I_KGXPwB.js.gz +0 -0
  76. package/build/client/_app/version.json +1 -1
  77. package/build/client/_app/version.json.br +0 -0
  78. package/build/client/_app/version.json.gz +0 -0
  79. package/build/server/chunks/{0-DJqyZZTr.js → 0-vrTNAfZB.js} +4 -2
  80. package/build/server/chunks/0-vrTNAfZB.js.map +1 -0
  81. package/build/server/chunks/{1-2YUVen1F.js → 1-nbr-bOoF.js} +2 -2
  82. package/build/server/chunks/{1-2YUVen1F.js.map → 1-nbr-bOoF.js.map} +1 -1
  83. package/build/server/chunks/{10-D1X7LB3v.js → 10-ChyvvJ6w.js} +2 -2
  84. package/build/server/chunks/{10-D1X7LB3v.js.map → 10-ChyvvJ6w.js.map} +1 -1
  85. package/build/server/chunks/{11-qXSPdF5j.js → 11-6ZAjL3uU.js} +4 -4
  86. package/build/server/chunks/11-6ZAjL3uU.js.map +1 -0
  87. package/build/server/chunks/{2-BD7kj1mt.js → 2-DWFRVDWJ.js} +3 -3
  88. package/build/server/chunks/{2-BD7kj1mt.js.map → 2-DWFRVDWJ.js.map} +1 -1
  89. package/build/server/chunks/{3-oNjv-BhZ.js → 3-CKANM_WM.js} +2 -2
  90. package/build/server/chunks/{3-oNjv-BhZ.js.map → 3-CKANM_WM.js.map} +1 -1
  91. package/build/server/chunks/{4-Bb5VFhsO.js → 4-D92KnTmb.js} +3 -3
  92. package/build/server/chunks/{4-Bb5VFhsO.js.map → 4-D92KnTmb.js.map} +1 -1
  93. package/build/server/chunks/{5-oNoWuIsn.js → 5-BxVjs2qi.js} +2 -2
  94. package/build/server/chunks/{5-oNoWuIsn.js.map → 5-BxVjs2qi.js.map} +1 -1
  95. package/build/server/chunks/{6-DRJGUqHG.js → 6-Cbf1AAMQ.js} +2 -2
  96. package/build/server/chunks/{6-DRJGUqHG.js.map → 6-Cbf1AAMQ.js.map} +1 -1
  97. package/build/server/chunks/{7-_giJiu0L.js → 7-CMK2quEf.js} +2 -2
  98. package/build/server/chunks/{7-_giJiu0L.js.map → 7-CMK2quEf.js.map} +1 -1
  99. package/build/server/chunks/{8-zvWAVNT5.js → 8-DhdfkfDM.js} +2 -2
  100. package/build/server/chunks/{8-zvWAVNT5.js.map → 8-DhdfkfDM.js.map} +1 -1
  101. package/build/server/chunks/{9-DVyDL445.js → 9-CPpxtRM5.js} +2 -2
  102. package/build/server/chunks/{9-DVyDL445.js.map → 9-CPpxtRM5.js.map} +1 -1
  103. package/build/server/chunks/Banner-BgaAs1rs.js.map +1 -1
  104. package/build/server/chunks/Button-D0hZ7JYt.js.map +1 -1
  105. package/build/server/chunks/Icon-D0GBnDcs.js.map +1 -1
  106. package/build/server/chunks/Input-OmIiydSx.js.map +1 -1
  107. package/build/server/chunks/Pill-4xJ-VhAA.js.map +1 -1
  108. package/build/server/chunks/Shimmer-Dw2uvTC1.js.map +1 -1
  109. package/build/server/chunks/_error.svelte-CZnkxeLr.js.map +1 -1
  110. package/build/server/chunks/_layout.svelte-DfgNGGiM.js.map +1 -1
  111. package/build/server/chunks/_page.svelte-BTlfUsBp.js.map +1 -1
  112. package/build/server/chunks/_page.svelte-BX2FMgSg.js.map +1 -1
  113. package/build/server/chunks/_page.svelte-C7B0qdrC.js.map +1 -1
  114. package/build/server/chunks/_page.svelte-CE7COWnF.js.map +1 -1
  115. package/build/server/chunks/_page.svelte-CWsjjd4l.js.map +1 -1
  116. package/build/server/chunks/_page.svelte-D5S2hkBk.js.map +1 -1
  117. package/build/server/chunks/_page.svelte-D_Ey8QRG.js.map +1 -1
  118. package/build/server/chunks/{_page.svelte-BLo2v_8E.js → _page.svelte-Gv9p8nlS.js} +3 -4
  119. package/build/server/chunks/_page.svelte-Gv9p8nlS.js.map +1 -0
  120. package/build/server/chunks/{_page.svelte-BUBLUSGo.js → _page.svelte-dabsQl9c.js} +206 -5
  121. package/build/server/chunks/_page.svelte-dabsQl9c.js.map +1 -0
  122. package/build/server/chunks/_page.svelte-tBuIq8Pg.js.map +1 -1
  123. package/build/server/chunks/_server.ts-B-evHL2q.js +13 -0
  124. package/build/server/chunks/_server.ts-B-evHL2q.js.map +1 -0
  125. package/build/server/chunks/_server.ts-BB46Fbqn.js +59 -0
  126. package/build/server/chunks/_server.ts-BB46Fbqn.js.map +1 -0
  127. package/build/server/chunks/{_server.ts-DMm0hBP4.js → _server.ts-BWVlO8iV.js} +8 -5
  128. package/build/server/chunks/_server.ts-BWVlO8iV.js.map +1 -0
  129. package/build/server/chunks/{_server.ts-BRAzC6W1.js → _server.ts-BevnuePu.js} +27 -6
  130. package/build/server/chunks/_server.ts-BevnuePu.js.map +1 -0
  131. package/build/server/chunks/_server.ts-CA5KUENM.js +95 -0
  132. package/build/server/chunks/_server.ts-CA5KUENM.js.map +1 -0
  133. package/build/server/chunks/{_server.ts-DhJx0DLr.js → _server.ts-CC2K8-L2.js} +16 -7
  134. package/build/server/chunks/_server.ts-CC2K8-L2.js.map +1 -0
  135. package/build/server/chunks/{_server.ts-Bi0Oe4PF.js → _server.ts-CD7JP3fz.js} +14 -9
  136. package/build/server/chunks/_server.ts-CD7JP3fz.js.map +1 -0
  137. package/build/server/chunks/{_server.ts-C_OOUqsd.js → _server.ts-D0zRDSx0.js} +2 -2
  138. package/build/server/chunks/{_server.ts-C_OOUqsd.js.map → _server.ts-D0zRDSx0.js.map} +1 -1
  139. package/build/server/chunks/{_server.ts-DxT9IlZF.js → _server.ts-Dp-hXW_I.js} +3 -3
  140. package/build/server/chunks/{_server.ts-DxT9IlZF.js.map → _server.ts-Dp-hXW_I.js.map} +1 -1
  141. package/build/server/chunks/_server.ts-DpRr0Tfh.js +68 -0
  142. package/build/server/chunks/_server.ts-DpRr0Tfh.js.map +1 -0
  143. package/build/server/chunks/{_server.ts-Bjbr7glm.js → _server.ts-QN-Bo5ql.js} +12 -5
  144. package/build/server/chunks/_server.ts-QN-Bo5ql.js.map +1 -0
  145. package/build/server/chunks/_server.ts-VzDcFFgy.js +157 -0
  146. package/build/server/chunks/_server.ts-VzDcFFgy.js.map +1 -0
  147. package/build/server/chunks/{_server.ts-BrqaMMAa.js → _server.ts-W6i3EnGX.js} +29 -6
  148. package/build/server/chunks/_server.ts-W6i3EnGX.js.map +1 -0
  149. package/build/server/chunks/{_server.ts-CRVNEOd2.js → _server.ts-X1R7L_QI.js} +3 -3
  150. package/build/server/chunks/{_server.ts-CRVNEOd2.js.map → _server.ts-X1R7L_QI.js.map} +1 -1
  151. package/build/server/chunks/cache-BlMaDsHi.js.map +1 -1
  152. package/build/server/chunks/guest-registry-Dxvd7p-g.js +48 -0
  153. package/build/server/chunks/guest-registry-Dxvd7p-g.js.map +1 -0
  154. package/build/server/chunks/index-CoYB03g7.js.map +1 -1
  155. package/build/server/chunks/index2-dSGQ9Eaa.js.map +1 -1
  156. package/build/server/chunks/{pty-manager-41h3IK8K.js → pty-manager-ZqXqa-6A.js} +6 -2
  157. package/build/server/chunks/pty-manager-ZqXqa-6A.js.map +1 -0
  158. package/build/server/chunks/root-D4IoFC8F.js.map +1 -1
  159. package/build/server/chunks/share-auth-BS7JuiHf.js +27 -0
  160. package/build/server/chunks/share-auth-BS7JuiHf.js.map +1 -0
  161. package/build/server/chunks/share-store-B9jMpVg0.js +127 -0
  162. package/build/server/chunks/share-store-B9jMpVg0.js.map +1 -0
  163. package/build/server/chunks/state.svelte-CmHqngc_.js.map +1 -1
  164. package/build/server/chunks/stores-CRYxfF0o.js.map +1 -1
  165. package/build/server/index.js +1 -1
  166. package/build/server/index.js.map +1 -1
  167. package/build/server/manifest.js +57 -22
  168. package/build/server/manifest.js.map +1 -1
  169. package/package.json +2 -2
  170. package/server.ts +10 -3
  171. package/src/lib/modules/client/dashboard/AutopilotPanel.svelte +400 -0
  172. package/src/lib/modules/client/dashboard/index.ts +1 -0
  173. package/src/lib/modules/client/neurolink/provider-config.ts +13 -37
  174. package/src/lib/modules/client/terminal/ShareGate.svelte +96 -0
  175. package/src/lib/modules/client/terminal/ShareSheet.svelte +395 -0
  176. package/src/lib/modules/client/terminal/xterm-wrapper.ts +19 -2
  177. package/src/lib/modules/server/sessions/autopilot-engine.ts +346 -0
  178. package/src/lib/modules/server/sessions/litellm-client.ts +115 -0
  179. package/src/lib/modules/server/sessions/next-step-consensus.ts +185 -0
  180. package/src/lib/modules/server/sessions/summary-store.ts +111 -0
  181. package/src/lib/modules/server/terminal/pty-manager.ts +6 -0
  182. package/src/lib/modules/server/terminal/share-auth.ts +37 -0
  183. package/src/lib/modules/server/terminal/share-store.ts +172 -0
  184. package/src/lib/modules/server/ws/events-handler.ts +32 -0
  185. package/src/lib/modules/server/ws/guest-registry.ts +49 -0
  186. package/src/lib/modules/server/ws/server.ts +22 -3
  187. package/src/lib/modules/server/ws/session-handler.ts +18 -4
  188. package/src/lib/modules/server/ws/terminal-handler.ts +21 -2
  189. package/src/lib/modules/server/ws/ticket-store.ts +18 -10
  190. package/src/lib/types/autopilot.ts +73 -0
  191. package/src/lib/types/generated/Client.ts +25 -1
  192. package/src/lib/types/generated/Share.ts +404 -0
  193. package/src/lib/types/generated/WsProtocol.ts +73 -2
  194. package/src/lib/types/generated/index.ts +1 -0
  195. package/src/lib/types/index.ts +1 -0
  196. package/src/lib/types/terminal-client.ts +21 -2
  197. package/src/lib/types/ws.ts +1 -0
  198. package/src/routes/+layout.server.ts +2 -0
  199. package/src/routes/+layout.svelte +19 -4
  200. package/src/routes/+page.svelte +9 -1
  201. package/src/routes/api/autopilot/+server.ts +74 -0
  202. package/src/routes/api/neurolink-proxy/+server.ts +31 -6
  203. package/src/routes/api/notify/+server.ts +20 -3
  204. package/src/routes/api/summaries/+server.ts +99 -0
  205. package/src/routes/api/terminals/[id]/+server.ts +14 -3
  206. package/src/routes/api/terminals/[id]/paste-image/+server.ts +8 -4
  207. package/src/routes/api/terminals/[id]/resize/+server.ts +8 -4
  208. package/src/routes/api/terminals/[id]/share/+server.ts +98 -0
  209. package/src/routes/api/terminals/[id]/share/auth/+server.ts +81 -0
  210. package/src/routes/api/terminals/[id]/share/status/+server.ts +11 -0
  211. package/src/routes/api/ws-ticket/+server.ts +26 -5
  212. package/src/routes/terminals/[id]/+page.svelte +184 -43
  213. package/build/client/_app/immutable/assets/11.v5KA95xm.css +0 -1
  214. package/build/client/_app/immutable/assets/11.v5KA95xm.css.br +0 -0
  215. package/build/client/_app/immutable/assets/11.v5KA95xm.css.gz +0 -0
  216. package/build/client/_app/immutable/assets/2.DjiwkLqE.css +0 -1
  217. package/build/client/_app/immutable/assets/2.DjiwkLqE.css.br +0 -0
  218. package/build/client/_app/immutable/assets/2.DjiwkLqE.css.gz +0 -0
  219. package/build/client/_app/immutable/chunks/BB2l8o4X.js.br +0 -0
  220. package/build/client/_app/immutable/chunks/BB2l8o4X.js.gz +0 -0
  221. package/build/client/_app/immutable/chunks/BcqA7eKM.js +0 -3
  222. package/build/client/_app/immutable/chunks/BcqA7eKM.js.br +0 -0
  223. package/build/client/_app/immutable/chunks/BcqA7eKM.js.gz +0 -0
  224. package/build/client/_app/immutable/chunks/BvmdJful.js.br +0 -0
  225. package/build/client/_app/immutable/chunks/BvmdJful.js.gz +0 -0
  226. package/build/client/_app/immutable/chunks/CR6bkGJW.js +0 -6
  227. package/build/client/_app/immutable/chunks/CR6bkGJW.js.br +0 -0
  228. package/build/client/_app/immutable/chunks/CR6bkGJW.js.gz +0 -0
  229. package/build/client/_app/immutable/chunks/ClIPTXf3.js.br +0 -0
  230. package/build/client/_app/immutable/chunks/ClIPTXf3.js.gz +0 -0
  231. package/build/client/_app/immutable/chunks/DA4Zt9Me.js.br +0 -0
  232. package/build/client/_app/immutable/chunks/DA4Zt9Me.js.gz +0 -0
  233. package/build/client/_app/immutable/chunks/DCDL_9ys.js.br +0 -0
  234. package/build/client/_app/immutable/chunks/DCDL_9ys.js.gz +0 -0
  235. package/build/client/_app/immutable/chunks/ZS5XYDx_.js.br +0 -0
  236. package/build/client/_app/immutable/chunks/pRcLbE0d.js +0 -1
  237. package/build/client/_app/immutable/chunks/pRcLbE0d.js.br +0 -0
  238. package/build/client/_app/immutable/chunks/pRcLbE0d.js.gz +0 -0
  239. package/build/client/_app/immutable/entry/app.D4TXlu7A.js.br +0 -0
  240. package/build/client/_app/immutable/entry/app.D4TXlu7A.js.gz +0 -0
  241. package/build/client/_app/immutable/entry/start.BBQhtURO.js +0 -1
  242. package/build/client/_app/immutable/entry/start.BBQhtURO.js.br +0 -0
  243. package/build/client/_app/immutable/entry/start.BBQhtURO.js.gz +0 -0
  244. package/build/client/_app/immutable/nodes/0.1zylwAPT.js +0 -10
  245. package/build/client/_app/immutable/nodes/0.1zylwAPT.js.br +0 -0
  246. package/build/client/_app/immutable/nodes/0.1zylwAPT.js.gz +0 -0
  247. package/build/client/_app/immutable/nodes/1.BVnLUSs-.js.br +0 -0
  248. package/build/client/_app/immutable/nodes/1.BVnLUSs-.js.gz +0 -0
  249. package/build/client/_app/immutable/nodes/10.D1wl2wPX.js.br +0 -0
  250. package/build/client/_app/immutable/nodes/10.D1wl2wPX.js.gz +0 -0
  251. package/build/client/_app/immutable/nodes/11.C18nMGmp.js +0 -2
  252. package/build/client/_app/immutable/nodes/11.C18nMGmp.js.br +0 -0
  253. package/build/client/_app/immutable/nodes/11.C18nMGmp.js.gz +0 -0
  254. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js +0 -13
  255. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js.br +0 -0
  256. package/build/client/_app/immutable/nodes/2.D1Mm0DUX.js.gz +0 -0
  257. package/build/client/_app/immutable/nodes/3.Wfz3TcJd.js.br +0 -0
  258. package/build/client/_app/immutable/nodes/3.Wfz3TcJd.js.gz +0 -0
  259. package/build/client/_app/immutable/nodes/4.CBX9A3ka.js.br +0 -0
  260. package/build/client/_app/immutable/nodes/4.CBX9A3ka.js.gz +0 -0
  261. package/build/client/_app/immutable/nodes/5.DIVKuZc9.js.br +0 -0
  262. package/build/client/_app/immutable/nodes/5.DIVKuZc9.js.gz +0 -0
  263. package/build/client/_app/immutable/nodes/6.DtZAEPXb.js.br +0 -0
  264. package/build/client/_app/immutable/nodes/6.DtZAEPXb.js.gz +0 -0
  265. package/build/client/_app/immutable/nodes/7.MfBRh32I.js.br +0 -0
  266. package/build/client/_app/immutable/nodes/7.MfBRh32I.js.gz +0 -0
  267. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js.br +0 -0
  268. package/build/client/_app/immutable/nodes/8.DVE6LnOC.js.gz +0 -0
  269. package/build/client/_app/immutable/nodes/9.BCel5OqI.js.br +0 -0
  270. package/build/client/_app/immutable/nodes/9.BCel5OqI.js.gz +0 -0
  271. package/build/server/chunks/0-DJqyZZTr.js.map +0 -1
  272. package/build/server/chunks/11-qXSPdF5j.js.map +0 -1
  273. package/build/server/chunks/_page.svelte-BLo2v_8E.js.map +0 -1
  274. package/build/server/chunks/_page.svelte-BUBLUSGo.js.map +0 -1
  275. package/build/server/chunks/_server.ts-BRAzC6W1.js.map +0 -1
  276. package/build/server/chunks/_server.ts-Bi0Oe4PF.js.map +0 -1
  277. package/build/server/chunks/_server.ts-Bjbr7glm.js.map +0 -1
  278. package/build/server/chunks/_server.ts-BrqaMMAa.js.map +0 -1
  279. package/build/server/chunks/_server.ts-DMm0hBP4.js.map +0 -1
  280. package/build/server/chunks/_server.ts-DhJx0DLr.js.map +0 -1
  281. package/build/server/chunks/events-handler-Dm1mNPQP.js +0 -20
  282. package/build/server/chunks/events-handler-Dm1mNPQP.js.map +0 -1
  283. package/build/server/chunks/pty-manager-41h3IK8K.js.map +0 -1
@@ -8,6 +8,7 @@
8
8
  // Rate limited to 30 requests per minute per API key.
9
9
 
10
10
  import { validateAuth } from '$lib/modules/server/auth';
11
+ import { shareStore } from '$lib/modules/server/terminal/share-store';
11
12
  import { generateTicket } from '$lib/modules/server/ws/ticket-store';
12
13
  import { json } from '@sveltejs/kit';
13
14
 
@@ -63,15 +64,35 @@ setInterval(() => {
63
64
  // ── Endpoint ────────────────────────────────────────────────────────
64
65
 
65
66
  export const POST: RequestHandler = ({ request }) => {
67
+ const bearer = (
68
+ request.headers.get('authorization') ??
69
+ request.headers.get('Authorization') ??
70
+ ''
71
+ )
72
+ .replace(/^Bearer\s+/i, '')
73
+ .trim();
74
+
66
75
  const authError = validateAuth(request);
67
76
  if (authError) {
68
- return authError;
77
+ // Not the API key — maybe a guest share token (issues a scoped ticket).
78
+ const session = bearer ? shareStore.resolveToken(bearer) : null;
79
+ if (!session) {
80
+ return authError;
81
+ }
82
+ if (!checkRateLimit(bearer)) {
83
+ return json(
84
+ { error: 'Rate limit exceeded. Maximum 30 ticket requests per minute.' },
85
+ { status: 429 }
86
+ );
87
+ }
88
+ const ticket = generateTicket({
89
+ readOnly: session.mode === 'view',
90
+ terminalId: session.terminalId,
91
+ });
92
+ return json({ expiresIn: 30, ticket });
69
93
  }
70
94
 
71
- // Extract the API key for rate limiting
72
- const apiKey = (request.headers.get('authorization') ?? '').substring(7).trim();
73
-
74
- if (!checkRateLimit(apiKey)) {
95
+ if (!checkRateLimit(bearer)) {
75
96
  return json(
76
97
  { error: 'Rate limit exceeded. Maximum 30 ticket requests per minute.' },
77
98
  { status: 429 }
@@ -2,6 +2,9 @@
2
2
  import type {
3
3
  ConversationMessage,
4
4
  MessagePart,
5
+ ShareAuthResponse,
6
+ ShareMode,
7
+ ShareStatusResponse,
5
8
  ShooterConfig,
6
9
  TerminalDetailView,
7
10
  ToolUsePart,
@@ -17,6 +20,8 @@
17
20
  import ConnectionStatus from '$lib/modules/client/terminal/ConnectionStatus.svelte';
18
21
  import { createShortcutManager } from '$lib/modules/client/terminal/keyboard-shortcuts';
19
22
  import QuickKeys from '$lib/modules/client/terminal/QuickKeys.svelte';
23
+ import ShareGate from '$lib/modules/client/terminal/ShareGate.svelte';
24
+ import ShareSheet from '$lib/modules/client/terminal/ShareSheet.svelte';
20
25
  import ShortcutsHelp from '$lib/modules/client/terminal/ShortcutsHelp.svelte';
21
26
  import {
22
27
  Button,
@@ -46,6 +51,10 @@
46
51
  let inputText = $state('');
47
52
  let chatMessages = $state<ConversationMessage[]>([]);
48
53
  let chatSessionEnded = $state(false);
54
+ let authMode = $state<'guest' | 'owner' | null>(null);
55
+ let guestMode = $state<null | ShareMode>(null);
56
+ let shareGateVisible = $state(false);
57
+ let shareSheetOpen = $state(false);
49
58
 
50
59
  // DOM references
51
60
  let termContainer = $state<HTMLDivElement | null>(null);
@@ -80,6 +89,11 @@
80
89
  );
81
90
  const tabActiveIndex = $derived(viewMode === 'raw' ? 0 : 1);
82
91
  const displayCwd = $derived(shortenPath(currentCwd || terminal?.cwd || ''));
92
+ const isOwner = $derived(authMode === 'owner');
93
+ const viewOnly = $derived(authMode === 'guest' && guestMode === 'view');
94
+ const shareUrl = $derived(
95
+ typeof window !== 'undefined' ? `${window.location.origin}/terminals/${terminalId}` : ''
96
+ );
83
97
  const paletteCommands = $derived.by((): { action: () => void; label: string }[] => {
84
98
  const cmds: { action: () => void; label: string }[] = [
85
99
  { action: (): void => void goto('/'), label: 'Go to Home' },
@@ -92,7 +106,7 @@
92
106
  label: 'Show keyboard shortcuts',
93
107
  },
94
108
  ];
95
- if (isRunning) {
109
+ if (isRunning && isOwner) {
96
110
  cmds.push({ action: (): void => void killTerminal(), label: 'Kill terminal' });
97
111
  }
98
112
  return cmds;
@@ -142,6 +156,47 @@
142
156
  }
143
157
  }
144
158
 
159
+ // ------- Guest share tokens -------
160
+
161
+ const SHARE_TOKENS_KEY = 'shooter_share_tokens';
162
+
163
+ function getShareToken(): null | string {
164
+ const id = terminalId;
165
+ if (!id) {
166
+ return null;
167
+ }
168
+ try {
169
+ const raw = localStorage.getItem(SHARE_TOKENS_KEY);
170
+ if (!raw) {
171
+ return null;
172
+ }
173
+ const map = JSON.parse(raw) as Record<string, string>;
174
+ return typeof map[id] === 'string' ? map[id] : null;
175
+ } catch {
176
+ return null;
177
+ }
178
+ }
179
+
180
+ function storeShareToken(token: string): void {
181
+ const id = terminalId;
182
+ if (!id) {
183
+ return;
184
+ }
185
+ let map: Record<string, string> = {};
186
+ try {
187
+ map = JSON.parse(localStorage.getItem(SHARE_TOKENS_KEY) ?? '{}') as Record<string, string>;
188
+ } catch {
189
+ // Corrupt entry — start fresh.
190
+ }
191
+ map[id] = token;
192
+ localStorage.setItem(SHARE_TOKENS_KEY, JSON.stringify(map));
193
+ }
194
+
195
+ /** Bearer for API calls: the owner's API key, or this terminal's guest token. */
196
+ function getBearer(): null | string {
197
+ return getConfig()?.apiKey ?? getShareToken();
198
+ }
199
+
145
200
  // ------- API calls -------
146
201
 
147
202
  async function fetchTerminal(): Promise<void> {
@@ -150,36 +205,92 @@
150
205
  }
151
206
 
152
207
  const config = getConfig();
153
- if (!config) {
154
- error = 'No configuration found. Please configure settings first.';
155
- loading = false;
208
+ const bearer = config?.apiKey ?? getShareToken();
209
+ if (!bearer) {
210
+ await checkShareAccess();
156
211
  return;
157
212
  }
158
213
 
159
214
  try {
160
215
  const res = await fetch(`/api/terminals/${terminalId}`, {
161
- headers: { Authorization: `Bearer ${config.apiKey}` },
216
+ headers: { Authorization: `Bearer ${bearer}` },
162
217
  });
218
+ if (res.status === 401 && !config) {
219
+ // Stale/revoked guest token — fall back to the password gate.
220
+ await checkShareAccess();
221
+ return;
222
+ }
163
223
  if (!res.ok) {
164
224
  error = res.status === 404 ? 'Terminal not found' : 'Failed to load terminal';
165
225
  loading = false;
166
226
  return;
167
227
  }
168
228
  terminal = (await res.json()) as TerminalDetailView;
229
+ if (config) {
230
+ authMode = 'owner';
231
+ } else {
232
+ authMode = 'guest';
233
+ guestMode = terminal.shareMode ?? 'view';
234
+ }
169
235
  } catch {
170
236
  error = 'Failed to connect to server';
171
237
  }
172
238
  loading = false;
173
239
  }
174
240
 
241
+ async function checkShareAccess(): Promise<void> {
242
+ try {
243
+ const res = await fetch(`/api/terminals/${terminalId}/share/status`);
244
+ if (res.ok) {
245
+ const data = (await res.json()) as ShareStatusResponse;
246
+ if (data.shared) {
247
+ shareGateVisible = true;
248
+ loading = false;
249
+ return;
250
+ }
251
+ }
252
+ } catch {
253
+ // Fall through to the configuration error.
254
+ }
255
+ error = 'No configuration found. Please configure settings first.';
256
+ loading = false;
257
+ }
258
+
259
+ async function submitSharePassword(password: string): Promise<null | string> {
260
+ try {
261
+ const res = await fetch(`/api/terminals/${terminalId}/share/auth`, {
262
+ body: JSON.stringify({ password }),
263
+ headers: { 'Content-Type': 'application/json' },
264
+ method: 'POST',
265
+ });
266
+ if (res.status === 429) {
267
+ return 'Too many attempts — try again in a minute.';
268
+ }
269
+ if (!res.ok) {
270
+ return 'Incorrect password.';
271
+ }
272
+ const data = (await res.json()) as ShareAuthResponse;
273
+ storeShareToken(data.token);
274
+ shareGateVisible = false;
275
+ loading = true;
276
+ await fetchTerminal();
277
+ if (terminal && !error) {
278
+ initViews();
279
+ }
280
+ return null;
281
+ } catch {
282
+ return 'Failed to reach the server.';
283
+ }
284
+ }
285
+
175
286
  async function getWsTicket(): Promise<null | string> {
176
- const config = getConfig();
177
- if (!config) {
287
+ const bearer = getBearer();
288
+ if (!bearer) {
178
289
  return null;
179
290
  }
180
291
  try {
181
292
  const res = await fetch('/api/ws-ticket', {
182
- headers: { Authorization: `Bearer ${config.apiKey}` },
293
+ headers: { Authorization: `Bearer ${bearer}` },
183
294
  method: 'POST',
184
295
  });
185
296
  if (!res.ok) {
@@ -269,10 +380,12 @@
269
380
  }
270
381
 
271
382
  const instance = await createTerminal({
272
- apiKey: getConfig()?.apiKey,
383
+ apiKey: getBearer() ?? undefined,
273
384
  container: termContainer,
274
385
  fontSize: window.innerWidth < 768 ? 12 : 14,
275
386
  getTicket,
387
+ initialCols: terminal.cols ?? undefined,
388
+ initialRows: terminal.rows ?? undefined,
276
389
  onActivity: (active: boolean) => {
277
390
  if (!disposed) {
278
391
  isActive = active;
@@ -304,6 +417,7 @@
304
417
  rawConnectionStatus = 'connected';
305
418
  }
306
419
  },
420
+ readOnly: viewOnly,
307
421
  terminalId,
308
422
  wsUrl,
309
423
  });
@@ -606,23 +720,7 @@
606
720
 
607
721
  // ------- Lifecycle -------
608
722
 
609
- onMount(async () => {
610
- await fetchTerminal();
611
- if (disposed) {
612
- return;
613
- }
614
-
615
- // Set up keyboard shortcuts
616
- shortcutManager = createShortcutManager({
617
- onHelp: () => {
618
- showShortcutsHelp = !showShortcutsHelp;
619
- },
620
- });
621
-
622
- if (!terminal || error) {
623
- return;
624
- }
625
-
723
+ function initViews(): void {
626
724
  // Default view: Chat on mobile for AI sessions, Raw on desktop
627
725
  if (isAI && window.innerWidth < 768) {
628
726
  viewMode = 'chat';
@@ -640,6 +738,26 @@
640
738
  void connectSessionWs();
641
739
  chatInitialized = true;
642
740
  }
741
+ }
742
+
743
+ onMount(async () => {
744
+ await fetchTerminal();
745
+ if (disposed) {
746
+ return;
747
+ }
748
+
749
+ // Set up keyboard shortcuts
750
+ shortcutManager = createShortcutManager({
751
+ onHelp: () => {
752
+ showShortcutsHelp = !showShortcutsHelp;
753
+ },
754
+ });
755
+
756
+ if (!terminal || error) {
757
+ return;
758
+ }
759
+
760
+ initViews();
643
761
  });
644
762
 
645
763
  onDestroy(() => {
@@ -664,6 +782,10 @@
664
782
  <div class="skeleton" style="width: 100%; height: 100%;"></div>
665
783
  </div>
666
784
  </div>
785
+ {:else if shareGateVisible}
786
+ <div class="term-page">
787
+ <ShareGate onSubmit={submitSharePassword} />
788
+ </div>
667
789
  {:else if error}
668
790
  <main class="main">
669
791
  <div class="session-back-row">
@@ -681,7 +803,9 @@
681
803
  <!-- Top Bar -->
682
804
  <div class="term-topbar">
683
805
  <div class="term-topbar-left">
684
- <a href="/terminals" class="term-back" aria-label="Back to terminals">&larr;</a>
806
+ {#if isOwner}
807
+ <a href="/terminals" class="term-back" aria-label="Back to terminals">&larr;</a>
808
+ {/if}
685
809
  <span class="term-command-name">{commandName}</span>
686
810
  <Pill text={badgeLabel} classes={badgeClass} />
687
811
  {#if isRunning}
@@ -695,7 +819,7 @@
695
819
  </Tooltip>
696
820
  {/if}
697
821
  <ConnectionStatus status={connectionStatus} onretry={handleRetry} />
698
- {#if isAI && (terminal as TerminalDetailView & { sessionFile?: string })?.sessionFile}
822
+ {#if isOwner && isAI && (terminal as TerminalDetailView & { sessionFile?: string })?.sessionFile}
699
823
  {@const sessionFile =
700
824
  (terminal as TerminalDetailView & { sessionFile?: string }).sessionFile ?? ''}
701
825
  <a
@@ -729,22 +853,31 @@
729
853
  ariaLabel="Keyboard shortcuts"
730
854
  />
731
855
 
732
- {#if isRunning}
733
- <Button
734
- classes="btn-danger btn-sm"
735
- onclick={killTerminal}
736
- disabled={killing}
737
- showLoader={killing}
738
- text="Kill"
739
- />
740
- {:else}
856
+ {#if isOwner}
741
857
  <Button
742
858
  classes="btn-secondary btn-sm"
743
- onclick={removeTerminal}
744
- disabled={removing}
745
- showLoader={removing}
746
- text="Remove"
859
+ onclick={(): void => {
860
+ shareSheetOpen = true;
861
+ }}
862
+ text="Share"
747
863
  />
864
+ {#if isRunning}
865
+ <Button
866
+ classes="btn-danger btn-sm"
867
+ onclick={killTerminal}
868
+ disabled={killing}
869
+ showLoader={killing}
870
+ text="Kill"
871
+ />
872
+ {:else}
873
+ <Button
874
+ classes="btn-secondary btn-sm"
875
+ onclick={removeTerminal}
876
+ disabled={removing}
877
+ showLoader={removing}
878
+ text="Remove"
879
+ />
880
+ {/if}
748
881
  {/if}
749
882
  </div>
750
883
  </div>
@@ -759,7 +892,7 @@
759
892
  ></div>
760
893
 
761
894
  <!-- Raw Input Bar + Quick Keys -->
762
- {#if isRunning && viewMode === 'raw'}
895
+ {#if isRunning && viewMode === 'raw' && !viewOnly}
763
896
  <div class="term-input-area">
764
897
  <QuickKeys onKey={handleQuickKey} />
765
898
  <div class="term-input-bar">
@@ -788,7 +921,7 @@
788
921
  messages={chatMessages}
789
922
  connectionState={connectionStatus}
790
923
  sessionEnded={chatSessionEnded}
791
- showInput={isRunning}
924
+ showInput={isRunning && !viewOnly}
792
925
  onSendInput={handleChatSendInput}
793
926
  onCancel={handleChatCancel}
794
927
  />
@@ -815,6 +948,14 @@
815
948
  showShortcutsHelp = false;
816
949
  }}
817
950
  />
951
+ <ShareSheet
952
+ open={shareSheetOpen}
953
+ terminalId={terminalId ?? ''}
954
+ {shareUrl}
955
+ onClose={(): void => {
956
+ shareSheetOpen = false;
957
+ }}
958
+ />
818
959
  <CommandPalette
819
960
  bind:open={showCommandPalette}
820
961
  commands={paletteCommands}
@@ -1 +0,0 @@
1
- .command-palette{--command-menu-overlay-background: rgba(0, 0, 0, .5);--command-menu-background: var(--component-bg);--command-menu-border: 1px solid var(--border);--command-menu-border-radius: var(--radius-lg);--command-menu-width: 500px;--command-menu-max-width: 90vw;--command-menu-input-color: var(--text-primary);--command-menu-input-placeholder-color: var(--text-tertiary);--command-menu-input-font-family: var(--font-mono);--command-menu-separator-color: var(--border);--command-menu-item-color: var(--text-secondary);--command-menu-item-active-background: var(--component-bg-hover);--command-menu-item-active-color: var(--text-primary);--command-menu-empty-color: var(--text-tertiary);--command-menu-z-index: 1001}.connection-status.svelte-1cg9pai{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:500;line-height:1;flex-shrink:0}.connection-status.connected.svelte-1cg9pai{color:var(--ds-green-700)}.connection-status.reconnecting.svelte-1cg9pai{color:var(--ds-amber-900)}.connection-status.disconnected.svelte-1cg9pai{color:var(--ds-red-900)}.conn-dot.svelte-1cg9pai{width:8px;height:8px;border-radius:50%;flex-shrink:0}.conn-dot.connected.svelte-1cg9pai{background:var(--ds-green-700)}.conn-dot.reconnecting.svelte-1cg9pai{background:var(--ds-amber-700);animation:pulse-dot 1.5s ease-in-out infinite}.conn-dot.disconnected.svelte-1cg9pai{background:var(--ds-red-700)}.status-label.svelte-1cg9pai{white-space:nowrap}.btn-retry{--button-height: auto;--button-padding: 2px 8px;--button-font-size: 12px;--button-border: 1px solid currentColor;--button-text-color: inherit;margin-left:2px}@media(max-width:480px){.status-label.svelte-1cg9pai{display:none}}.quick-keys.svelte-64qat5{display:flex;overflow-x:auto;gap:6px;padding:var(--space-2) var(--space-3);scrollbar-width:none;-webkit-overflow-scrolling:touch;flex-shrink:0}.quick-keys.svelte-64qat5::-webkit-scrollbar{display:none}.btn-quick-key{--button-color: var(--ds-gray-200);--button-text-color: var(--ds-gray-700);--button-border: 1px solid var(--ds-gray-400);--button-hover-color: var(--ds-gray-300);--button-hover-text-color: var(--text-primary);--button-hover-border: 1px solid var(--ds-gray-400);--button-height: 44px;--button-padding: 0 var(--space-3);--button-border-radius: var(--radius-md);--button-font-family: var(--font-mono);--button-font-size: var(--text-xs);min-width:52px;flex-shrink:0;white-space:nowrap;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.shortcuts-modal{--modal-content-background-color: var(--component-bg);--modal-border-radius: var(--radius-lg);--modal-header-background-color: var(--component-bg);--modal-header-padding: var(--space-4) var(--space-5);--modal-header-border-bottom: 1px solid var(--border);--header-text-size: var(--text-lg);--modal-header-text-weight: 600;--background-color: rgba(0, 0, 0, .5);--modal-z-index: 1000}.shortcuts-modal .modal-content{max-width:420px;width:90vw;min-width:320px}.shortcuts-list.svelte-1u7lstk{display:flex;flex-direction:column;gap:var(--space-2);padding:var(--space-4) var(--space-5)}.shortcut-row.svelte-1u7lstk{display:flex;justify-content:space-between;align-items:center;padding:var(--space-2) 0}.shortcut-desc.svelte-1u7lstk{font-size:var(--text-sm);color:var(--text-secondary)}.shortcut-kbd{--keyboard-input-key-color: var(--text-primary);--keyboard-input-key-background: var(--ds-gray-200);--keyboard-input-key-border: 1px solid var(--ds-gray-400);--keyboard-input-key-box-shadow: 0 1px 0 var(--ds-gray-400);--keyboard-input-font-family: var(--font-mono);--keyboard-input-font-size: var(--text-xs)}.term-page.svelte-1tubujq{display:flex;flex-direction:column;height:calc(100vh - var(--header-height) - 64px);height:calc(100dvh - var(--header-height) - 64px);overflow:hidden;background:var(--ds-background-200)}.term-topbar.svelte-1tubujq{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-2) var(--space-4);background:var(--ds-background-100);border-bottom:1px solid var(--border);flex-shrink:0;min-height:48px}.term-topbar-left.svelte-1tubujq{display:flex;align-items:center;gap:var(--space-2);min-width:0;overflow:hidden}.term-topbar-right.svelte-1tubujq{display:flex;align-items:center;gap:var(--space-3);flex-shrink:1}.term-back.svelte-1tubujq{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:var(--radius-md);background:transparent;color:var(--text-secondary);text-decoration:none;font-size:18px;transition:background var(--transition-fast),color var(--transition-fast);flex-shrink:0}.term-back.svelte-1tubujq:hover{background:var(--ds-gray-alpha-100);color:var(--text-primary)}.term-command-name.svelte-1tubujq{font-family:var(--font-mono);font-size:var(--text-base);font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.term-tabs{--tabs-bar-border-bottom: none;--tabs-bar-background: var(--ds-gray-200);--tabs-bar-padding: 2px;--tabs-item-padding: 6px 12px;--tabs-item-font-size: var(--text-xs);--tabs-indicator-height: 0;--tabs-active-color: var(--text-primary);--tabs-item-color: var(--text-tertiary);border-radius:var(--radius-md);border:1px solid var(--ds-gray-400);overflow:hidden}.term-shortcuts-btn{--button-height: 28px;--button-width: 28px;--button-padding: 0;--button-border-radius: var(--radius-sm);--button-border: 1px solid var(--border);--button-color: transparent;--button-text-color: var(--text-tertiary);--button-font-size: 14px;--button-font-weight: 600;--button-hover-color: var(--component-bg-hover);--button-hover-text-color: var(--text-primary);flex-shrink:0}.term-cwd.svelte-1tubujq{font-family:var(--font-mono);font-size:11px;color:var(--text-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.term-session-link.svelte-1tubujq{font-size:11px;font-weight:500;color:var(--ds-blue-900);text-decoration:none;white-space:nowrap;padding:2px 8px;border-radius:var(--radius-sm);border:1px solid var(--ds-blue-400);transition:background var(--transition-fast),color var(--transition-fast)}.term-session-link.svelte-1tubujq:hover{background:var(--ds-blue-100);color:var(--ds-blue-1000)}.activity-dot.svelte-1tubujq{width:8px;height:8px;border-radius:50%;flex-shrink:0}.activity-active.svelte-1tubujq{background:var(--ds-green-500);animation:activity-pulse .6s ease-in-out infinite}.activity-idle.svelte-1tubujq{background:var(--ds-gray-600)}.term-body.svelte-1tubujq{flex:1;flex-direction:column;min-height:0;overflow:hidden;padding:var(--space-1);background:var(--ds-background-200, #0a0a0f)}.term-body.svelte-1tubujq .xterm{height:100%}.term-body.svelte-1tubujq .xterm-viewport{overflow-y:auto!important}.term-body-loading.svelte-1tubujq{flex:1;padding:var(--space-4);min-height:200px}.term-chat-body.svelte-1tubujq{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.term-input-area.svelte-1tubujq{flex-shrink:0;background:var(--ds-background-100);border-top:1px solid var(--border);padding-bottom:env(safe-area-inset-bottom,0px)}.term-input-bar.svelte-1tubujq{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3)}.term-input-field{--input-container-margin: 0;--input-height: 44px;flex:1}.btn-send{--button-height: 44px;--button-width: 44px;--button-padding: 0;--button-font-size: 18px;flex-shrink:0}.term-exited-bar.svelte-1tubujq{display:flex;align-items:center;justify-content:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);padding-bottom:calc(var(--space-2) + env(safe-area-inset-bottom,0px));background:var(--ds-gray-200);border-top:1px solid var(--border);font-size:var(--text-sm);color:var(--text-tertiary);flex-shrink:0}@media(max-width:768px){.term-topbar.svelte-1tubujq{padding:var(--space-2) var(--space-3);gap:var(--space-2)}.term-command-name.svelte-1tubujq{font-size:var(--text-sm);max-width:100px}}@media(max-width:480px){.term-topbar.svelte-1tubujq{min-height:44px;padding:var(--space-1) var(--space-2)}.term-command-name.svelte-1tubujq{max-width:80px;text-overflow:ellipsis}.term-topbar-right.svelte-1tubujq{flex-shrink:1}}
@@ -1 +0,0 @@
1
- @keyframes svelte-1qbe2oo-pulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes svelte-1qbe2oo-activity-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.5);opacity:.7}}.card.svelte-1qbe2oo{background:var(--component-bg, #1a1a1a);border:1px solid var(--border, #2e2e2e);border-left:4px solid var(--status-color, #6b7280);border-radius:var(--radius-lg, 8px);padding:var(--space-4, 16px);display:flex;flex-direction:column;gap:var(--space-3, 12px);cursor:pointer;transition:border-color var(--transition-fast, .15s ease),background var(--transition-fast, .15s ease);color:inherit;text-align:left;width:100%}.card.svelte-1qbe2oo:hover{background:var(--component-bg-hover, #1f1f1f);border-color:var(--border-hover, #454545);border-left-color:var(--status-color, #6b7280)}.card.svelte-1qbe2oo:focus-visible{outline:2px solid var(--ds-blue-700, #0070f3);outline-offset:2px}.card-header.svelte-1qbe2oo{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2, 8px);min-width:0}.project-name.svelte-1qbe2oo{font-size:var(--text-base, 14px);font-weight:600;color:var(--text-primary, #ededed);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.status-pill{--pill-font-size: var(--text-xs, 12px);--pill-font-weight: 500;--pill-padding: 3px 10px;--pill-border-radius: var(--radius-full, 9999px);--pill-cursor: default;flex-shrink:0}.status-pill--running-active{--pill-background: var(--ds-green-100);--pill-color: var(--ds-green-700);--pill-hover-background: var(--ds-green-100);--pill-hover-color: var(--ds-green-700);animation:svelte-1qbe2oo-pulse 2s ease-in-out infinite}.status-pill--running{--pill-background: var(--ds-blue-100);--pill-color: var(--ds-blue-700);--pill-hover-background: var(--ds-blue-100);--pill-hover-color: var(--ds-blue-700)}.status-pill--idle{--pill-background: var(--ds-amber-100);--pill-color: var(--ds-amber-700);--pill-hover-background: var(--ds-amber-100);--pill-hover-color: var(--ds-amber-700)}.status-pill--exited{--pill-background: var(--ds-gray-alpha-200);--pill-color: var(--ds-gray-600);--pill-hover-background: var(--ds-gray-alpha-200);--pill-hover-color: var(--ds-gray-600)}.status-pill--error{--pill-background: var(--ds-red-100);--pill-color: var(--ds-red-700);--pill-hover-background: var(--ds-red-100);--pill-hover-color: var(--ds-red-700)}.goal-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-secondary, #a1a1a1);font-style:italic;margin:0;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:var(--leading-normal, 1.5)}.summary-row.svelte-1qbe2oo{min-height:18px}.summary-text.svelte-1qbe2oo{font-size:var(--text-sm, 13px);color:var(--text-primary, #ededed);line-height:var(--leading-normal, 1.5);display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.summarizing.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--ds-amber-700);font-style:italic}.summary-fallback.svelte-1qbe2oo{font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);font-style:italic}.stats-row.svelte-1qbe2oo{display:flex;align-items:center;gap:var(--space-3, 12px);flex-wrap:wrap;min-width:0}.stat.svelte-1qbe2oo{display:inline-flex;align-items:center;gap:var(--space-1, 4px);font-size:var(--text-xs, 12px);color:var(--text-tertiary, #7d7d7d);white-space:nowrap}.stat-error.svelte-1qbe2oo{color:var(--ds-red-700)}.stat-path.svelte-1qbe2oo{font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1;text-align:right}.status-dot-active.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-green-700);animation:svelte-1qbe2oo-activity-pulse .6s ease-in-out infinite;flex-shrink:0}.status-dot-static.svelte-1qbe2oo{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ds-gray-600, #878787);flex-shrink:0}@media(max-width:768px){.card.svelte-1qbe2oo{padding:10px 12px}.stats-row.svelte-1qbe2oo{flex-wrap:wrap;gap:4px}}@media(max-width:480px){.card.svelte-1qbe2oo{padding:8px 10px}.goal-text.svelte-1qbe2oo{-webkit-line-clamp:1;line-clamp:1}}.section.svelte-14sxgtb{display:flex;flex-direction:column;gap:var(--space-3, 12px);margin-bottom:var(--space-6, 24px)}.section-label.svelte-14sxgtb{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary, #a1a1a1);margin:0 0 var(--space-1, 4px) 0}.stats-bar.svelte-1uha8ag{display:flex;gap:10px;margin-top:var(--space-4)}.stat-chip.svelte-1uha8ag{display:flex;align-items:center;gap:6px;background:#ffffff0a;border:1px solid rgba(255,255,255,.06);border-radius:20px;padding:6px 14px}.stat-chip-active.svelte-1uha8ag{background:var(--ds-green-alpha-200);border-color:var(--ds-green-alpha-400)}.stat-value.svelte-1uha8ag{font-weight:700;font-size:.9rem;color:#f0f0f0}.stat-chip-active.svelte-1uha8ag .stat-value:where(.svelte-1uha8ag){color:var(--ds-green-500)}.stat-label.svelte-1uha8ag{font-size:.78rem;color:#a3a3a3cc}.dashboard-section.svelte-1uha8ag{margin-bottom:var(--space-6)}.section-label.svelte-1uha8ag{font-size:var(--text-xs, 12px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-secondary);margin-bottom:var(--space-3)}.projects-container.svelte-1uha8ag{display:flex;flex-direction:column;gap:var(--space-3);animation:fadeIn .2s ease}@media(max-width:768px){.stats-bar.svelte-1uha8ag{flex-wrap:wrap}}
@@ -1,3 +0,0 @@
1
- import{bv as Te,v as Ve,s as P,g as j,b as N,P as oe,bw as At}from"./DWmC0QM7.js";class pe{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class Le{constructor(t,n){this.status=t,this.location=n}}class Pe extends Error{constructor(t,n,r){super(r),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Et(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function kt(e){return e.split("%25").map(decodeURI).join("%25")}function Rt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function ye({href:e}){return e.split("#")[0]}function St(...e){let t=5381;for(const n of e)if(typeof n=="string"){let r=n.length;for(;r;)t=t*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)t=t*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;const It=new TextDecoder;function Ut(e){const t=atob(e),n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}const Tt=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||"GET")!=="GET"&&z.delete(je(e)),Tt(e,t));const z=new Map;function Lt(e,t){const n=je(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:a,...s}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&z.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=Ut(a)),Promise.resolve(new Response(a,s))}return window.fetch(e,t)}function Pt(e,t,n){if(z.size>0){const r=je(e,n),a=z.get(r);if(a){if(performance.now()<a.ttl&&["default","force-cache","only-if-cached",void 0].includes(n?.cache))return new Response(a.body,a.init);z.delete(r)}}return window.fetch(t,n)}function je(e,t){let r=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){const a=[];t.headers&&a.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&a.push(t.body),r+=`[data-hash="${St(...a)}"]`}return r}const jt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Nt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${xt(e).map(r=>{const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return t.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(s)return t.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const o=r.split(/\[(.+?)\](?!\])/);return"/"+o.map((i,l)=>{if(l%2){if(i.startsWith("x+"))return ve(String.fromCharCode(parseInt(i.slice(2),16)));if(i.startsWith("u+"))return ve(String.fromCharCode(...i.slice(2).split("-").map(g=>parseInt(g,16))));const u=jt.exec(i),[,d,p,h,f]=u;return t.push({name:h,matcher:f,optional:!!d,rest:!!p,chained:p?l===1&&o[0]==="":!1}),p?"([^]*?)":d?"([^/]*)?":"([^/]+?)"}return ve(i)}).join("")}).join("")}/?$`),params:t}}function Ot(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function xt(e){return e.slice(1).split("/").filter(Ot)}function Ct(e,t,n){const r={},a=e.slice(1),s=a.filter(c=>c!==void 0);let o=0;for(let c=0;c<t.length;c+=1){const i=t[c];let l=a[c-o];if(i.chained&&i.rest&&o&&(l=a.slice(c-o,c+1).filter(u=>u).join("/"),o=0),l===void 0)if(i.rest)l="";else continue;if(!i.matcher||n[i.matcher](l)){r[i.name]=l;const u=t[c+1],d=a[c+1];u&&!u.rest&&u.optional&&d&&i.chained&&(o=0),!u&&!d&&Object.keys(r).length===s.length&&(o=0);continue}if(i.optional&&i.chained){o++;continue}return}if(!o)return r}function ve(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function Dt({nodes:e,server_loads:t,dictionary:n,matchers:r}){const a=new Set(t);return Object.entries(n).map(([c,[i,l,u]])=>{const{pattern:d,params:p}=Nt(c),h={id:c,exec:f=>{const g=d.exec(f);if(g)return Ct(g,p,r)},errors:[1,...u||[]].map(f=>e[f]),layouts:[0,...l||[]].map(o),leaf:s(i)};return h.errors.length=h.layouts.length=Math.max(h.errors.length,h.layouts.length),h});function s(c){const i=c<0;return i&&(c=~c),[i,e[c]]}function o(c){return c===void 0?c:[a.has(c),e[c]]}}function Qe(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function qe(e,t,n=JSON.stringify){const r=n(t);try{sessionStorage[e]=r}catch{}}const U=globalThis.__sveltekit_1g07lo2?.base??"",$t=globalThis.__sveltekit_1g07lo2?.assets??U??"",Bt="1780945214701",et="sveltekit:snapshot",tt="sveltekit:scroll",nt="sveltekit:states",Ft="sveltekit:pageurl",q="sveltekit:history",Q="sveltekit:navigation",B={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},re=location.origin;function Ne(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function M(){return{x:pageXOffset,y:pageYOffset}}function V(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const Ye={...B,"":B.hover};function rt(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function at(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=rt(e)}}function Ee(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const c=location.hash.split("#")[1]||"/";r.hash=`#${c}${r.hash}`}}catch{}const a=e instanceof SVGAElement?e.target.baseVal:e.target,s=!r||!!a||_e(r,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),o=r?.origin===re&&e.hasAttribute("download");return{url:r,external:s,target:a,download:o}}function se(e){let t=null,n=null,r=null,a=null,s=null,o=null,c=e;for(;c&&c!==document.documentElement;)r===null&&(r=V(c,"preload-code")),a===null&&(a=V(c,"preload-data")),t===null&&(t=V(c,"keepfocus")),n===null&&(n=V(c,"noscroll")),s===null&&(s=V(c,"reload")),o===null&&(o=V(c,"replacestate")),c=rt(c);function i(l){switch(l){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:Ye[r??"off"],preload_data:Ye[a??"off"],keepfocus:i(t),noscroll:i(n),reload:i(s),replace_state:i(o)}}function Ge(e){const t=Te(e);let n=!0;function r(){n=!0,t.update(o=>o)}function a(o){n=!1,t.set(o)}function s(o){let c;return t.subscribe(i=>{(c===void 0||n&&i!==c)&&o(c=i)})}return{notify:r,set:a,subscribe:s}}const ot={v:()=>{}};function Mt(){const{set:e,subscribe:t}=Te(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${$t}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==Bt;return o&&(e(!0),ot.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:t,check:r}}function _e(e,t,n){return e.origin!==re||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function jn(e){}const Vt=-1,qt=-2,Yt=-3,Gt=-4,Kt=-5,Wt=-6,Ht=-7,st=2**32-1,ke=st-1;function Xt(e){return!(!Number.isInteger(e)||e<0||e>ke)}function zt(e){return!(!Number.isInteger(e)||e<0||e>st)}function Jt(e){return Uint8Array.fromBase64(e).buffer}function Zt(e){return Uint8Array.from(Buffer.from(e,"base64")).buffer}function Qt(e){const t=atob(e),n=t.length,r=new Uint8Array(n);for(let a=0;a<n;a++)r[a]=t.charCodeAt(a);return r.buffer}const en=typeof Uint8Array.fromBase64=="function",tn=typeof process=="object"&&process.versions?.node!==void 0,nn=en?Jt:tn?Zt:Qt;function rn(e,t){if(typeof e=="number")return s(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);let a=null;function s(o,c=!1){if(o===Vt)return;if(o===Yt)return NaN;if(o===Gt)return 1/0;if(o===Kt)return-1/0;if(o===Wt)return-0;if(c||typeof o!="number")throw new Error("Invalid input");if(o in r)return r[o];const i=n[o];if(!i||typeof i!="object")r[o]=i;else if(Array.isArray(i))if(typeof i[0]=="string"){const l=i[0],u=t&&Object.hasOwn(t,l)?t[l]:void 0;if(u){let d=i[1];if(typeof d!="number"&&(d=n.push(i[1])-1),a??=new Set,a.has(d))throw new Error("Invalid circular reference");return a.add(d),r[o]=u(s(d)),a.delete(d),r[o]}switch(l){case"Date":r[o]=new Date(i[1]);break;case"Set":const d=new Set;r[o]=d;for(let f=1;f<i.length;f+=1)d.add(s(i[f]));break;case"Map":const p=new Map;r[o]=p;for(let f=1;f<i.length;f+=2)p.set(s(i[f]),s(i[f+1]));break;case"RegExp":r[o]=new RegExp(i[1],i[2]);break;case"Object":{const f=i[1];if(typeof n[f]=="object"&&n[f][0]!=="BigInt")throw new Error("Invalid input");r[o]=Object(s(f));break}case"BigInt":r[o]=BigInt(i[1]);break;case"null":const h=Object.create(null);r[o]=h;for(let f=1;f<i.length;f+=2){if(i[f]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");h[i[f]]=s(i[f+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":case"DataView":{if(n[i[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const f=globalThis[l],g=s(i[1]);r[o]=i[2]!==void 0?new f(g,i[2],i[3]):new f(g);break}case"ArrayBuffer":{const f=i[1];if(typeof f!="string")throw new Error("Invalid ArrayBuffer encoding");const g=nn(f);r[o]=g;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{const f=l.slice(9);r[o]=Temporal[f].from(i[1]);break}case"URL":{const f=new URL(i[1]);r[o]=f;break}case"URLSearchParams":{const f=new URLSearchParams(i[1]);r[o]=f;break}default:throw new Error(`Unknown type ${l}`)}}else if(i[0]===Ht){const l=i[1];if(!zt(l))throw new Error("Invalid input");const u=[];r[o]=u,u[ke]=void 0,delete u[ke];for(let d=2;d<i.length;d+=2){const p=i[d];if(!Xt(p)||p>=l)throw new Error("Invalid input");u[p]=s(i[d+1])}u.length=l}else{const l=new Array(i.length);r[o]=l;for(let u=0;u<i.length;u+=1){const d=i[u];d!==qt&&(l[u]=s(d))}}else{const l={};r[o]=l;for(const u of Object.keys(i)){if(u==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const d=i[u];l[u]=s(d)}}return r[o]}return s(0)}const it=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...it];const an=new Set([...it]);[...an];function on(e){return e.filter(t=>t!=null)}const sn="x-sveltekit-invalidated",cn="x-sveltekit-trailing-slash";function ie(e){return e instanceof pe||e instanceof Pe?e.status:500}function ln(e){return e instanceof Pe?e.text:"Internal Error"}let S,ee,be;const fn=Ve.toString().includes("$$")||/function \w+\(\) \{\}/.test(Ve.toString()),Ke="a:";fn?(S={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Ke)},ee={current:null},be={current:!1}):(S=new class{#e=P({});get data(){return j(this.#e)}set data(t){N(this.#e,t)}#t=P(null);get form(){return j(this.#t)}set form(t){N(this.#t,t)}#n=P(null);get error(){return j(this.#n)}set error(t){N(this.#n,t)}#r=P({});get params(){return j(this.#r)}set params(t){N(this.#r,t)}#a=P({id:null});get route(){return j(this.#a)}set route(t){N(this.#a,t)}#o=P({});get state(){return j(this.#o)}set state(t){N(this.#o,t)}#s=P(-1);get status(){return j(this.#s)}set status(t){N(this.#s,t)}#i=P(new URL(Ke));get url(){return j(this.#i)}set url(t){N(this.#i,t)}},ee=new class{#e=P(null);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},be=new class{#e=P(!1);get current(){return j(this.#e)}set current(t){N(this.#e,t)}},ot.v=()=>be.current=!0);function un(e){Object.assign(S,e)}const dn="/__data.json",hn=".html__data.json";function pn(e){return e.endsWith(".html")?e.replace(/\.html$/,hn):e.replace(/\/$/,"")+dn}const _n=new Set(["icon","shortcut icon","apple-touch-icon"]);let H=null;const D=Qe(tt)??{},te=Qe(et)??{},C={url:Ge({}),page:Ge({}),navigating:Te(null),updated:Mt()};function Oe(e){D[e]=M()}function gn(e,t){let n=e+1;for(;D[n];)delete D[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function K(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(()=>{})}async function ct(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}function We(){}let xe,Re,ce,x,Se,A;const le=[],fe=[];let L=null;function Ie(){L?.fork?.then(e=>e?.discard()),L=null}const ae=new Map,lt=new Set,mn=new Set,J=new Set;let w={branch:[],error:null,url:null},Ce=!1,ue=!1,He=!0,ne=!1,X=!1,ft=!1,De=!1,ut,R,I,F;const Z=new Set,Xe=new Map;async function Cn(e,t,n){globalThis.__sveltekit_1g07lo2?.data&&globalThis.__sveltekit_1g07lo2.data,document.URL!==location.href&&(location.href=location.href),A=e,await e.hooks.init?.(),xe=Dt(e),x=document.documentElement,Se=t,Re=e.nodes[0],ce=e.nodes[1],Re(),ce(),R=history.state?.[q],I=history.state?.[Q],R||(R=I=Date.now(),history.replaceState({...history.state,[q]:R,[Q]:I},""));const r=D[R];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await Un(Se,n)):(await Y({type:"enter",url:Ne(A.hash?Ln(new URL(location.href)):location.href),replace_state:!0}),a()),In()}function wn(){le.length=0,De=!1}function dt(e){fe.some(t=>t?.snapshot)&&(te[e]=fe.map(t=>t?.snapshot?.capture()))}function ht(e){te[e]?.forEach((t,n)=>{fe[n]?.snapshot?.restore(t)})}function ze(){Oe(R),qe(tt,D),dt(I),qe(et,te)}async function pt(e,t,n,r){let a;t.invalidateAll&&Ie(),await Y({type:"goto",url:Ne(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{t.invalidateAll&&(De=!0,a=[...Xe.keys()]),t.invalidate&&t.invalidate.forEach(Sn)}}),t.invalidateAll&&oe().then(oe).then(()=>{Xe.forEach(({resource:s},o)=>{a?.includes(o)&&s.refresh?.()})})}async function yn(e){if(e.id!==L?.id){Ie();const t={};Z.add(t),L={id:e.id,token:t,promise:gt({...e,preload:t}).then(n=>(Z.delete(t),n.type==="loaded"&&n.state.error&&Ie(),n)),fork:null}}return L.promise}async function Ae(e){const t=(await me(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(n=>n[1]()))}async function _t(e,t,n){const r={params:w.params,route:{id:w.route?.id??null},url:new URL(location.href)};w={...e.state,nav:r};const a=document.querySelector("style[data-sveltekit]");if(a&&a.remove(),Object.assign(S,e.props.page),ut=new A.root({target:t,props:{...e.props,stores:C,components:fe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),ht(I),n){const s={from:null,to:{...r,scroll:D[R]??M()},willUnload:!1,type:"enter",complete:Promise.resolve()};J.forEach(o=>o(s))}ue=!0}async function de({url:e,params:t,branch:n,errors:r,status:a,error:s,route:o,form:c}){let i="never";if(U&&(e.pathname===U||e.pathname===U+"/"))i="always";else for(const f of n)f?.slash!==void 0&&(i=f.slash);e.pathname=Et(e.pathname,i),e.search=e.search;const l={type:"loaded",state:{url:e,params:t,branch:n,error:s,route:o},props:{constructors:on(n).map(f=>f.node.component),page:Me(S)}};c!==void 0&&(l.props.form=c);let u={},d=!S,p=0;for(let f=0;f<Math.max(n.length,w.branch.length);f+=1){const g=n[f],b=w.branch[f];g?.data!==b?.data&&(d=!0),g&&(u={...u,...g.data},d&&(l.props[`data_${p}`]=u),p+=1)}return(!w.url||e.href!==w.url.href||w.error!==s||c!==void 0&&c!==S.form||d)&&(l.props.page={error:s,params:t,route:{id:o?.id??null},state:{},status:a,url:new URL(e),form:c??null,data:d?u:S.data}),l}async function $e({loader:e,parent:t,url:n,params:r,route:a,server_data_node:s}){let o=null;const c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},i=await e();return{node:i,loader:e,server:s,universal:i.universal?.load?{type:"data",data:o,uses:c}:null,data:o??s?.data??null,slash:i.universal?.trailingSlash??s?.slash}}function vn(e,t,n){let r=e instanceof Request?e.url:e;const a=new URL(r,n);a.origin===n.origin&&(r=a.href.slice(n.origin.length));const s=ue?Pt(r,a.href,t):Lt(r,t);return{resolved:a,promise:s}}function Je(e,t,n,r,a,s){if(De)return!0;if(!a)return!1;if(a.parent&&e||a.route&&t||a.url&&n)return!0;for(const o of a.search_params)if(r.has(o))return!0;for(const o of a.params)if(s[o]!==w.params[o])return!0;for(const o of a.dependencies)if(le.some(c=>c(new URL(o))))return!0;return!1}function Be(e,t){return e?.type==="data"?e:e?.type==="skip"?t??null:null}function bn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const r of n){const a=e.searchParams.getAll(r),s=t.searchParams.getAll(r);a.every(o=>s.includes(o))&&s.every(o=>a.includes(o))&&n.delete(r)}return n}function Ze({error:e,url:t,route:n,params:r}){return{type:"loaded",state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Me(S),constructors:[]}}}async function gt({id:e,invalidating:t,url:n,params:r,route:a,preload:s}){if(L?.id===e)return Z.delete(L.token),L.promise;const{errors:o,layouts:c,leaf:i}=a,l=[...c,i];o.forEach(m=>m?.().catch(()=>{})),l.forEach(m=>m?.[1]().catch(()=>{}));let u=null;const d=w.url?e!==he(w.url):!1,p=w.route?a.id!==w.route.id:!1,h=bn(w.url,n);let f=!1;{const m=l.map((y,E)=>{const k=w.branch[E],v=!!y?.[0]&&(k?.loader!==y[1]||Je(f,p,d,h,k.server?.uses,r));return v&&(f=!0),v});if(m.some(Boolean)){try{u=await yt(n,m)}catch(y){const E=await G(y,{url:n,params:r,route:{id:e}});return Z.has(s)?Ze({error:E,url:n,params:r,route:a}):ge({status:ie(y),error:E,url:n,route:a})}if(u.type==="redirect")return u}}const g=u?.nodes;let b=!1;const _=l.map(async(m,y)=>{if(!m)return;const E=w.branch[y],k=g?.[y];if((!k||k.type==="skip")&&m[1]===E?.loader&&!Je(b,p,d,h,E.universal?.uses,r))return E;if(b=!0,k?.type==="error")throw k;return $e({loader:m[1],url:n,params:r,route:a,parent:async()=>{const O={};for(let $=0;$<y;$+=1)Object.assign(O,(await _[$])?.data);return O},server_data_node:Be(k===void 0&&m[0]?{type:"skip"}:k??null,m[0]?E?.server:void 0)})});for(const m of _)m.catch(()=>{});const T=[];for(let m=0;m<l.length;m+=1)if(l[m])try{T.push(await _[m])}catch(y){if(y instanceof Le)return{type:"redirect",location:y.location};if(Z.has(s))return Ze({error:await G(y,{params:r,url:n,route:{id:a.id}}),url:n,params:r,route:a});let E=ie(y),k;if(g?.includes(y))E=y.status??E,k=y.error;else if(y instanceof pe)k=y.body;else{if(await C.updated.check())return await ct(),await K(n);k=await G(y,{params:r,url:n,route:{id:a.id}})}const v=await An(m,T,o);return v?de({url:n,params:r,branch:T.slice(0,v.idx).concat(v.node),errors:o,status:E,error:k,route:a}):await wt(n,{id:a.id},k,E)}else T.push(void 0);return de({url:n,params:r,branch:T,errors:o,status:200,error:null,route:a,form:t?void 0:null})}async function An(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)r-=1;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function ge({status:e,error:t,url:n,route:r}){const a={};let s=null;if(A.server_loads[0]===0)try{const c=await yt(n,[!0]);if(c.type!=="data"||c.nodes[0]&&c.nodes[0].type!=="data")throw 0;s=c.nodes[0]??null}catch{(n.origin!==re||n.pathname!==location.pathname||Ce)&&await K(n)}try{const o=await $e({loader:Re,url:n,params:a,route:r,parent:()=>Promise.resolve({}),server_data_node:Be(s)}),c={node:await ce(),loader:ce,universal:null,server:null,data:null};return de({url:n,params:a,branch:[o,c],status:e,error:t,errors:[],route:null})}catch(o){if(o instanceof Le)return pt(new URL(o.location,location.href),{},0);throw o}}async function En(e){const t=e.href;if(ae.has(t))return ae.get(t);let n;try{const r=(async()=>{let a=await A.hooks.reroute({url:new URL(e),fetch:async(s,o)=>vn(s,o,e).promise})??e;if(typeof a=="string"){const s=new URL(e);A.hash?s.hash=a:s.pathname=a,a=s}return a})();ae.set(t,r),n=await r}catch{ae.delete(t);return}return n}async function me(e,t){if(e&&!_e(e,U,A.hash)){const n=await En(e);if(!n)return;const r=kn(n);for(const a of xe){const s=a.exec(r);if(s)return{id:he(e),invalidating:t,route:a,params:Rt(s),url:e}}}}function kn(e){return kt(A.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function he(e){return(A.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function mt({url:e,type:t,intent:n,delta:r,event:a,scroll:s}){let o=!1;const c=Fe(w,n,e,t,s??null);r!==void 0&&(c.navigation.delta=r),a!==void 0&&(c.navigation.event=a);const i={...c.navigation,cancel:()=>{o=!0,c.reject(new Error("navigation cancelled"))}};return ne||lt.forEach(l=>l(i)),o?null:c}async function Y({type:e,url:t,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:c=0,nav_token:i={},accept:l=We,block:u=We,event:d}){const p=F;F=i;const h=await me(t,!1),f=e==="enter"?Fe(w,h,t,e):mt({url:t,type:e,delta:n?.delta,intent:h,scroll:n?.scroll,event:d});if(!f){u(),F===i&&(F=p);return}const g=R,b=I;l(),ne=!0,ue&&f.navigation.type!=="enter"&&C.navigating.set(ee.current=f.navigation);let _=h&&await gt(h);if(!_){if(_e(t,U,A.hash))return await K(t,s);_=await wt(t,{id:null},await G(new Pe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=h?.url||t,F!==i)return f.reject(new Error("navigation aborted")),!1;if(_.type==="redirect"){if(c<20){await Y({type:e,url:new URL(_.location,t),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:c+1,nav_token:i}),f.fulfil(void 0);return}_=await ge({status:500,error:await G(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else _.props.page.status>=400&&await C.updated.check()&&(await ct(),await K(t,s));if(wn(),Oe(g),dt(b),_.props.page.url.pathname!==t.pathname&&(t.pathname=_.props.page.url.pathname),o=n?n.state:o,!n){const v=s?0:1,O={[q]:R+=v,[Q]:I+=v,[nt]:o};(s?history.replaceState:history.pushState).call(history,O,"",t),s||gn(R,I)}const T=h&&L?.id===h.id?L.fork:null;L=null,_.props.page.state=o;let m;if(ue){const v=(await Promise.all(Array.from(mn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(v.length>0){let W=function(){v.forEach(we=>{J.delete(we)})};v.push(W),v.forEach(we=>{J.add(we)})}const O=f.navigation.to;w={..._.state,nav:{params:O.params,route:O.route,url:O.url}},_.props.page&&(_.props.page.url=t);const $=T&&await T;$?m=$.commit():(H=null,ut.$set(_.props),H&&Object.assign(_.props.page,H),un(_.props.page),m=At?.()),ft=!0}else await _t(_,Se,!1);const{activeElement:y}=document;await m,await oe(),await oe();let E=null;if(He){const v=n?n.scroll:a?M():null;v?scrollTo(v.x,v.y):(E=t.hash&&document.getElementById(bt(t)))?E.scrollIntoView():scrollTo(0,0)}const k=document.activeElement!==y&&document.activeElement!==document.body;!r&&!k&&Tn(t,!E),He=!0,_.props.page&&(H&&Object.assign(_.props.page,H),Object.assign(S,_.props.page)),ne=!1,e==="popstate"&&ht(I),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=M()),J.forEach(v=>v(f.navigation)),C.navigating.set(ee.current=null)}async function wt(e,t,n,r,a){return e.origin===re&&e.pathname===location.pathname&&!Ce?await ge({status:r,error:n,url:e,route:t}):await K(e,a)}function Rn(){let e,t={element:void 0,href:void 0},n;x.addEventListener("mousemove",c=>{const i=c.target;clearTimeout(e),e=setTimeout(()=>{s(i,B.hover)},20)});function r(c){c.defaultPrevented||s(c.composedPath()[0],B.tap)}x.addEventListener("mousedown",r),x.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(c=>{for(const i of c)i.isIntersecting&&(Ae(new URL(i.target.href)),a.unobserve(i.target))},{threshold:0});async function s(c,i){const l=at(c,x),u=l===t.element&&l?.href===t.href&&i>=n;if(!l||u)return;const{url:d,external:p,download:h}=Ee(l,U,A.hash);if(p||h)return;const f=se(l),g=d&&he(w.url)===he(d);if(!(f.reload||g))if(i<=f.preload_data){t={element:l,href:l.href},n=B.tap;const b=await me(d,!1);if(!b)return;yn(b)}else i<=f.preload_code&&(t={element:l,href:l.href},n=i,Ae(d))}function o(){a.disconnect();for(const c of x.querySelectorAll("a")){const{url:i,external:l,download:u}=Ee(c,U,A.hash);if(l||u)continue;const d=se(c);d.reload||(d.preload_code===B.viewport&&a.observe(c),d.preload_code===B.eager&&Ae(i))}}J.add(o),o()}function G(e,t){if(e instanceof pe)return e.body;const n=ie(e),r=ln(e);return A.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Dn(e,t={}){return e=new URL(Ne(e)),e.origin!==re?Promise.reject(new Error("goto: invalid URL")):pt(e,t,0)}function Sn(e){if(typeof e=="function")le.push(e);else{const{href:t}=new URL(e,location.href);le.push(n=>n.href===t)}}function In(){history.scrollRestoration="manual",addEventListener("beforeunload",t=>{let n=!1;if(ze(),!ne){const r=Fe(w,void 0,null,"leave"),a={...r.navigation,cancel:()=>{n=!0,r.reject(new Error("navigation cancelled"))}};lt.forEach(s=>s(a))}n?(t.preventDefault(),t.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&ze()}),navigator.connection?.saveData||Rn(),x.addEventListener("click",async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;const n=at(t.composedPath()[0],x);if(!n)return;const{url:r,external:a,target:s,download:o}=Ee(n,U,A.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=se(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[l,u]=(A.hash?r.hash.replace(/^#/,""):r.href).split("#"),d=l===ye(location);if(a||c.reload&&(!d||!u)){mt({url:r,type:"link",event:t})?ne=!0:t.preventDefault();return}if(u!==void 0&&d){const[,p]=w.url.href.split("#");if(p===u){if(t.preventDefault(),u===""||u==="top"&&n.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=n.ownerDocument.getElementById(decodeURIComponent(u));h&&(h.scrollIntoView(),h.focus())}return}if(X=!0,Oe(R),e(r),!c.replace_state)return;X=!1}t.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await Y({type:"link",url:r,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??r.href===location.href,event:t})}),x.addEventListener("submit",t=>{if(t.defaultPrevented)return;const n=HTMLFormElement.prototype.cloneNode.call(t.target),r=t.submitter;if((r?.formTarget||n.target)==="_blank"||(r?.formMethod||n.method)!=="get")return;const o=new URL(r?.hasAttribute("formaction")&&r?.formAction||n.action);if(_e(o,U,!1))return;const c=t.target,i=se(c);if(i.reload)return;t.preventDefault(),t.stopPropagation();const l=new FormData(c,r);o.search=new URLSearchParams(l).toString(),Y({type:"form",url:o,keepfocus:i.keepfocus,noscroll:i.noscroll,replace_state:i.replace_state??o.href===location.href,event:t})}),addEventListener("popstate",async t=>{if(!Ue){if(t.state?.[q]){const n=t.state[q];if(F={},n===R)return;const r=D[n],a=t.state[nt]??{},s=new URL(t.state[Ft]??location.href),o=t.state[Q],c=w.url?ye(location)===ye(w.url):!1;if(o===I&&(ft||c)){a!==S.state&&(S.state=a),e(s),D[R]=M(),r&&scrollTo(r.x,r.y),R=n;return}const l=n-R;await Y({type:"popstate",url:s,popped:{state:a,scroll:r,delta:l},accept:()=>{R=n,I=o},block:()=>{history.go(-l)},nav_token:F,event:t})}else if(!X){const n=new URL(location.href);e(n),A.hash&&location.reload()}}}),addEventListener("hashchange",()=>{X&&(X=!1,history.replaceState({...history.state,[q]:++R,[Q]:I},"",location.href))});for(const t of document.querySelectorAll("link"))_n.has(t.rel)&&(t.href=t.href);addEventListener("pageshow",t=>{t.persisted&&C.navigating.set(ee.current=null)});function e(t){w.url=S.url=t,C.page.set(Me(S)),C.page.notify()}}async function Un(e,{status:t=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:c,form:i}){Ce=!0;const l=new URL(location.href);let u;({params:a={},route:s={id:null}}=await me(l,!1)||{}),u=xe.find(({id:h})=>h===s.id);let d,p=!0;try{const h=r.map(async(g,b)=>{const _=c[b];return _?.uses&&(_.uses=vt(_.uses)),$e({loader:A.nodes[g],url:l,params:a,route:s,parent:async()=>{const T={};for(let m=0;m<b;m+=1)Object.assign(T,(await h[m]).data);return T},server_data_node:Be(_)})}),f=await Promise.all(h);if(u){const g=u.layouts;for(let b=0;b<g.length;b++)g[b]||f.splice(b,0,void 0)}d=await de({url:l,params:a,branch:f,status:t,error:n,errors:u?.errors,form:i,route:u??null})}catch(h){if(h instanceof Le){await K(new URL(h.location,location.href));return}d=await ge({status:ie(h),error:await G(h,{url:l,params:a,route:s}),url:l,route:s}),e.textContent="",p=!1}d.props.page&&(d.props.page.state={}),await _t(d,e,p)}async function yt(e,t){const n=new URL(e);n.pathname=pn(e.pathname),e.pathname.endsWith("/")&&n.searchParams.append(cn,"1"),n.searchParams.append(sn,t.map(s=>s?"1":"0").join(""));const r=window.fetch,a=await r(n.href,{});if(!a.ok){let s;throw a.headers.get("content-type")?.includes("application/json")?s=await a.json():a.status===404?s="Not Found":a.status===500&&(s="Internal Error"),new pe(a.status,s)}return new Promise(async s=>{const o=new Map,c=a.body.getReader();function i(u){return rn(u,{...A.decoders,Promise:d=>new Promise((p,h)=>{o.set(d,{fulfil:p,reject:h})})})}let l="";for(;;){const{done:u,value:d}=await c.read();if(u&&!l)break;for(l+=!d&&l?`
2
- `:It.decode(d,{stream:!0});;){const p=l.indexOf(`
3
- `);if(p===-1)break;const h=JSON.parse(l.slice(0,p));if(l=l.slice(p+1),h.type==="redirect")return s(h);if(h.type==="data")h.nodes?.forEach(f=>{f?.type==="data"&&(f.uses=vt(f.uses),f.data=i(f.data))}),s(h);else if(h.type==="chunk"){const{id:f,data:g,error:b}=h,_=o.get(f);o.delete(f),b?_.reject(i(b)):_.fulfil(i(g))}}}})}function vt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}let Ue=!1;function Tn(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const r=bt(e);if(r&&document.getElementById(r)){const{x:s,y:o}=M();setTimeout(()=>{const c=history.state;Ue=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(c,"",e),t&&scrollTo(s,o),Ue=!1})}else{const s=document.body,o=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),o!==null?s.setAttribute("tabindex",o):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let o=0;o<a.rangeCount;o+=1)s.push(a.getRangeAt(o));setTimeout(()=>{if(a.rangeCount===s.length){for(let o=0;o<a.rangeCount;o+=1){const c=s[o],i=a.getRangeAt(o);if(c.commonAncestorContainer!==i.commonAncestorContainer||c.startContainer!==i.startContainer||c.endContainer!==i.endContainer||c.startOffset!==i.startOffset||c.endOffset!==i.endOffset)return}a.removeAllRanges()}})}}}function Fe(e,t,n,r,a=null){let s,o;const c=new Promise((l,u)=>{s=l,o=u});return c.catch(()=>{}),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:M()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:a},willUnload:!t,type:r,complete:c},fulfil:s,reject:o}}function Me(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Ln(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function bt(e){let t;if(A.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Cn as a,Dn as g,jn as l,S as p,C as s};
@@ -1,6 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/xterm.DFuMZ0ql.css"])))=>i.map(i=>d[i]);
2
- import{_ as u}from"./PPVm8Dsz.js";async function D(e){const{Terminal:m}=await u(async()=>{const{Terminal:t}=await import("./BTGVxaYV.js").then(i=>i.x);return{Terminal:t}},[],import.meta.url),{FitAddon:h}=await u(async()=>{const{FitAddon:t}=await import("./BlxrFPDK.js").then(i=>i.a);return{FitAddon:t}},[],import.meta.url),{WebLinksAddon:S}=await u(async()=>{const{WebLinksAddon:t}=await import("./DLu6yJIZ.js").then(i=>i.a);return{WebLinksAddon:t}},[],import.meta.url);await u(()=>Promise.resolve({}),__vite__mapDeps([0]),import.meta.url);const d=new h,n=new m({allowTransparency:!0,cursorBlink:!0,cursorStyle:"block",fontFamily:"'SF Mono', 'Fira Code', 'Cascadia Code', 'Menlo', monospace",fontSize:e.fontSize||14,theme:{background:"#0a0a0f",black:"#0a0a0f",blue:"#3b82f6",brightBlack:"#64748b",brightBlue:"#60a5fa",brightCyan:"#67e8f9",brightGreen:"#4ade80",brightMagenta:"#c4b5fd",brightRed:"#f87171",brightWhite:"#f8fafc",brightYellow:"#fbbf24",cursor:"#e2e8f0",cursorAccent:"#0a0a0f",cyan:"#38bdf8",foreground:"#e2e8f0",green:"#22c55e",magenta:"#a78bfa",red:"#ef4444",selectionBackground:"rgba(99, 102, 241, 0.3)",white:"#e2e8f0",yellow:"#f59e0b"}});n.loadAddon(d),n.loadAddon(new S),n.open(e.container),d.fit();const _=new Set(["f","g","h","j","n","o","p","q","s","t","u","w"]);n.attachCustomKeyEventHandler(t=>{const i=t.key.toLowerCase();return t.metaKey?i==="c"||i==="v"?!0:!_.has(i):!0});let f=null;if(e.terminalId&&e.apiKey){const t=e.terminalId,i=e.apiKey;f=r=>{(async()=>{try{if(!r.clipboardData)return;const g=Array.from(r.clipboardData.items).find(b=>b.type.startsWith("image/"));if(!g)return;const w=g.getAsFile();if(!w)return;r.preventDefault();const l=new FileReader,O=await new Promise((b,A)=>{l.onload=()=>{b(l.result)},l.onerror=A,l.readAsDataURL(w)});(await fetch(`/api/terminals/${t}/paste-image`,{body:JSON.stringify({image:O}),headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},method:"POST"})).ok&&a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({data:"",type:"input"}))}catch{}})()},e.container.addEventListener("paste",f)}let a=null,c=null,o=1e3,s=!1;async function y(){if(s)return;let t;try{t=await e.getTicket()}catch{s||(e.onDisconnect?.(),c=setTimeout(()=>{o=Math.min(o*2,3e4),y()},o));return}s||(a=new WebSocket(`${e.wsUrl}?ticket=${t}`),a.onopen=()=>{o=1e3,e.onReconnect?.()},a.onmessage=i=>{const r=JSON.parse(i.data);r.type==="output"||r.type==="scrollback"?n.write(r.data??""):r.type==="exit"?(n.write(`\r
3
- \x1B[90m[Process exited with code ${String(r.code)}]\x1B[0m\r
4
- `),s=!0,c&&clearTimeout(c),e.onExit?.(r.code??0)):r.type==="output-dropped"?n.write(`\r
5
- \x1B[33m[${String(r.bytes)} bytes dropped]\x1B[0m\r
6
- `):r.type==="activity"?e.onActivity?.(r.active??!1):r.type==="cwd"&&e.onCwd?.(r.path??"")},a.onclose=()=>{s||(e.onDisconnect?.(),c=setTimeout(()=>{o=Math.min(o*2,3e4),y()},o))})}y(),n.onData(t=>{a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({data:t,type:"input"}))});const p=new ResizeObserver(()=>{!e.container.offsetWidth||!e.container.offsetHeight||(d.fit(),a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({cols:n.cols,rows:n.rows,type:"resize"})))});p.observe(e.container);function k(){s=!0,c&&clearTimeout(c),f&&e.container.removeEventListener("paste",f),p.disconnect(),a?.close(),n.dispose()}function v(t){a?.readyState===WebSocket.OPEN&&a.send(JSON.stringify({data:t,type:"input"}))}return{dispose:k,fitAddon:d,sendInput:v,term:n}}function N(e,m){e.readyState===WebSocket.OPEN&&e.send(JSON.stringify({signal:m,type:"signal"}))}export{D as createTerminal,N as sendSignal};
@@ -1 +0,0 @@
1
- const r=[{cors:"proxy",envKeys:["GOOGLE_AI_API_KEY"],id:"google-ai",label:"Google AI",model:"gemini-3.1-flash-lite-preview"},{cors:"proxy",envKeys:["ANTHROPIC_API_KEY"],id:"anthropic",label:"Anthropic",model:"claude-haiku-4-5-20251001"},{cors:"proxy",envKeys:["OPENAI_API_KEY"],id:"openai",label:"OpenAI",model:"gpt-4o-mini"},{cors:"proxy",envKeys:["MISTRAL_API_KEY"],id:"mistral",label:"Mistral",model:"mistral-small-2506"},{cors:"direct",envKeys:["LITELLM_API_KEY","LITELLM_BASE_URL"],extraEnvKeys:["LITELLM_MODEL"],id:"litellm",label:"LiteLLM",model:"open-large"}];function s(n,d){if(d){const e=r.find(o=>o.id===d);if(e){if(e.cors==="direct"){const o=typeof window<"u"?window.process?.env??{}:{};if(e.envKeys.every(i=>!!o[i]))return{model:e.model,provider:e.id}}else if(n?.[e.id])return{model:e.model,provider:e.id}}}const l=typeof window<"u"?window.process?.env??{}:{};for(const e of r)if(e.cors==="direct"){if(e.envKeys.every(i=>!!l[i]))return{model:e.model,provider:e.id}}else if(n?.[e.id])return{model:e.model,provider:e.id};return null}export{r as P,s as d};
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/BcqA7eKM.js";export{o as load_css,r as start};